mirror of
https://github.com/libretro/scummvm.git
synced 2025-03-06 18:27:26 +00:00
DIRECTOR: Fixed CenterOut transitions
This commit is contained in:
parent
768f8b8137
commit
069e4232ca
@ -142,31 +142,59 @@ struct {
|
||||
TRANS(kTransDissolveBits, kTransAlgoDissolve, kTransDirBits)
|
||||
};
|
||||
|
||||
struct TransParams {
|
||||
TransitionType type;
|
||||
uint duration;
|
||||
uint chunkSize;
|
||||
|
||||
int steps;
|
||||
int stepDuration;
|
||||
|
||||
int xStepSize;
|
||||
int yStepSize;
|
||||
|
||||
int xpos, ypos;
|
||||
|
||||
TransParams() {
|
||||
type = kTransNone;
|
||||
duration = 250;
|
||||
chunkSize = 1;
|
||||
steps = 0;
|
||||
stepDuration = 0;
|
||||
|
||||
xStepSize = yStepSize = 0;
|
||||
xpos = ypos = 0;
|
||||
}
|
||||
};
|
||||
|
||||
static void initTransParams(TransParams &t, Score *score);
|
||||
|
||||
void Frame::playTransition(Score *score) {
|
||||
uint16 duration = MAX<uint16>(250, _transDuration); // When duration is < 1/4s, make it 1/4
|
||||
TransParams t;
|
||||
|
||||
if (_transChunkSize == 0)
|
||||
_transChunkSize = 1; // equal to 1 step
|
||||
t.type = _transType;
|
||||
t.duration = MAX<uint16>(250, _transDuration); // When duration is < 1/4s, make it 1/4
|
||||
t.chunkSize = MAX<uint>(1, _transChunkSize);
|
||||
|
||||
uint16 stepDuration = duration / _transChunkSize;
|
||||
uint16 steps = duration / stepDuration;
|
||||
initTransParams(t, score);
|
||||
|
||||
switch (_transType) {
|
||||
case kTransCenterOutHorizontal: // 5
|
||||
{
|
||||
uint16 stepSize = score->_movieRect.width() / steps / 2;
|
||||
Common::Rect r = score->_movieRect;
|
||||
|
||||
for (uint16 i = 1; i < steps; i++) {
|
||||
r.setWidth(stepSize * i * 2);
|
||||
r.moveTo(score->_movieRect.width() / 2 - stepSize * i, 0);
|
||||
for (uint16 i = 0; i < t.steps; i++) {
|
||||
t.xpos += t.xStepSize;
|
||||
|
||||
g_system->delayMillis(stepDuration);
|
||||
r.setWidth(t.xpos * 2);
|
||||
r.moveTo(score->_movieRect.width() / 2 - t.xpos, 0);
|
||||
|
||||
g_system->delayMillis(t.stepDuration);
|
||||
processQuitEvent();
|
||||
|
||||
score->_backSurface->copyRectToSurface(*score->_surface, 0, 0, r);
|
||||
|
||||
g_system->copyRectToScreen(score->_backSurface->getPixels(), score->_backSurface->pitch, score->_movieRect.width() / 2 - stepSize * i, 0, r.width(), r.height()); // transition
|
||||
g_system->copyRectToScreen(score->_backSurface->getPixels(), score->_backSurface->pitch, score->_movieRect.width() / 2 - t.xpos, 0, r.width(), r.height()); // transition
|
||||
g_system->updateScreen();
|
||||
}
|
||||
}
|
||||
@ -174,19 +202,20 @@ void Frame::playTransition(Score *score) {
|
||||
|
||||
case kTransCenterOutVertical: // 7
|
||||
{
|
||||
uint16 stepSize = score->_movieRect.height() / steps / 2;
|
||||
Common::Rect r = score->_movieRect;
|
||||
|
||||
for (uint16 i = 1; i < steps; i++) {
|
||||
r.setHeight(stepSize * i * 2);
|
||||
r.moveTo(0, score->_movieRect.height() / 2 - stepSize * i);
|
||||
for (uint16 i = 0; i < t.steps; i++) {
|
||||
t.ypos += t.yStepSize;
|
||||
|
||||
g_system->delayMillis(stepDuration * 20);
|
||||
r.setHeight(t.ypos * 2);
|
||||
r.moveTo(0, score->_movieRect.height() / 2 - t.ypos);
|
||||
|
||||
g_system->delayMillis(t.stepDuration);
|
||||
processQuitEvent();
|
||||
|
||||
score->_backSurface->copyRectToSurface(*score->_surface, 0, 0, r);
|
||||
|
||||
g_system->copyRectToScreen(score->_backSurface->getPixels(), score->_backSurface->pitch, 0, score->_movieRect.height() / 2 - stepSize * i, r.width(), r.height()); // transition
|
||||
g_system->copyRectToScreen(score->_backSurface->getPixels(), score->_backSurface->pitch, 0, score->_movieRect.height() / 2 - t.ypos, r.width(), r.height()); // transition
|
||||
g_system->updateScreen();
|
||||
}
|
||||
}
|
||||
@ -194,13 +223,13 @@ void Frame::playTransition(Score *score) {
|
||||
|
||||
case kTransCoverDown: // 29
|
||||
{
|
||||
uint16 stepSize = score->_movieRect.height() / steps;
|
||||
uint16 stepSize = score->_movieRect.height() / t.steps;
|
||||
Common::Rect r = score->_movieRect;
|
||||
|
||||
for (uint16 i = 1; i < steps; i++) {
|
||||
for (uint16 i = 1; i < t.steps; i++) {
|
||||
r.setHeight(stepSize * i);
|
||||
|
||||
g_system->delayMillis(stepDuration);
|
||||
g_system->delayMillis(t.stepDuration);
|
||||
processQuitEvent();
|
||||
|
||||
g_system->copyRectToScreen(score->_surface->getPixels(), score->_surface->pitch, 0, 0, r.width(), r.height()); // transition
|
||||
@ -211,14 +240,14 @@ void Frame::playTransition(Score *score) {
|
||||
|
||||
case kTransCoverDownLeft: // 30
|
||||
{
|
||||
uint16 stepSize = score->_movieRect.width() / steps;
|
||||
uint16 stepSize = score->_movieRect.width() / t.steps;
|
||||
Common::Rect r = score->_movieRect;
|
||||
|
||||
for (uint16 i = 1; i < steps; i++) {
|
||||
for (uint16 i = 1; i < t.steps; i++) {
|
||||
r.setWidth(stepSize * i);
|
||||
r.setHeight(stepSize * i);
|
||||
|
||||
g_system->delayMillis(stepDuration);
|
||||
g_system->delayMillis(t.stepDuration);
|
||||
processQuitEvent();
|
||||
|
||||
g_system->copyRectToScreen(score->_surface->getPixels(), score->_surface->pitch, score->_movieRect.width() - stepSize * i, 0, r.width(), r.height()); // transition
|
||||
@ -229,14 +258,14 @@ void Frame::playTransition(Score *score) {
|
||||
|
||||
case kTransCoverDownRight: // 31
|
||||
{
|
||||
uint16 stepSize = score->_movieRect.width() / steps;
|
||||
uint16 stepSize = score->_movieRect.width() / t.steps;
|
||||
Common::Rect r = score->_movieRect;
|
||||
|
||||
for (uint16 i = 1; i < steps; i++) {
|
||||
for (uint16 i = 1; i < t.steps; i++) {
|
||||
r.setWidth(stepSize * i);
|
||||
r.setHeight(stepSize * i);
|
||||
|
||||
g_system->delayMillis(stepDuration);
|
||||
g_system->delayMillis(t.stepDuration);
|
||||
processQuitEvent();
|
||||
|
||||
g_system->copyRectToScreen(score->_surface->getPixels(), score->_surface->pitch, 0, 0, r.width(), r.height()); // transition
|
||||
@ -247,13 +276,13 @@ void Frame::playTransition(Score *score) {
|
||||
|
||||
case kTransCoverLeft: // 32
|
||||
{
|
||||
uint16 stepSize = score->_movieRect.width() / steps;
|
||||
uint16 stepSize = score->_movieRect.width() / t.steps;
|
||||
Common::Rect r = score->_movieRect;
|
||||
|
||||
for (uint16 i = 1; i < steps; i++) {
|
||||
for (uint16 i = 1; i < t.steps; i++) {
|
||||
r.setWidth(stepSize * i);
|
||||
|
||||
g_system->delayMillis(stepDuration);
|
||||
g_system->delayMillis(t.stepDuration);
|
||||
processQuitEvent();
|
||||
|
||||
g_system->copyRectToScreen(score->_surface->getPixels(), score->_surface->pitch, score->_movieRect.width() - stepSize * i, 0, r.width(), r.height()); // transition
|
||||
@ -264,13 +293,13 @@ void Frame::playTransition(Score *score) {
|
||||
|
||||
case kTransCoverRight: // 33
|
||||
{
|
||||
uint16 stepSize = score->_movieRect.width() / steps;
|
||||
uint16 stepSize = score->_movieRect.width() / t.steps;
|
||||
Common::Rect r = score->_movieRect;
|
||||
|
||||
for (uint16 i = 1; i < steps; i++) {
|
||||
for (uint16 i = 1; i < t.steps; i++) {
|
||||
r.setWidth(stepSize * i);
|
||||
|
||||
g_system->delayMillis(stepDuration);
|
||||
g_system->delayMillis(t.stepDuration);
|
||||
processQuitEvent();
|
||||
|
||||
g_system->copyRectToScreen(score->_surface->getPixels(), score->_surface->pitch, 0, 0, r.width(), r.height()); // transition
|
||||
@ -281,13 +310,13 @@ void Frame::playTransition(Score *score) {
|
||||
|
||||
case kTransCoverUp: // 34
|
||||
{
|
||||
uint16 stepSize = score->_movieRect.height() / steps;
|
||||
uint16 stepSize = score->_movieRect.height() / t.steps;
|
||||
Common::Rect r = score->_movieRect;
|
||||
|
||||
for (uint16 i = 1; i < steps; i++) {
|
||||
for (uint16 i = 1; i < t.steps; i++) {
|
||||
r.setHeight(stepSize * i);
|
||||
|
||||
g_system->delayMillis(stepDuration);
|
||||
g_system->delayMillis(t.stepDuration);
|
||||
processQuitEvent();
|
||||
|
||||
g_system->copyRectToScreen(score->_surface->getPixels(), score->_surface->pitch, 0, score->_movieRect.height() - stepSize * i, r.width(), r.height()); // transition
|
||||
@ -298,14 +327,14 @@ void Frame::playTransition(Score *score) {
|
||||
|
||||
case kTransCoverUpLeft: // 35
|
||||
{
|
||||
uint16 stepSize = score->_movieRect.width() / steps;
|
||||
uint16 stepSize = score->_movieRect.width() / t.steps;
|
||||
Common::Rect r = score->_movieRect;
|
||||
|
||||
for (uint16 i = 1; i < steps; i++) {
|
||||
for (uint16 i = 1; i < t.steps; i++) {
|
||||
r.setWidth(stepSize * i);
|
||||
r.setHeight(stepSize * i);
|
||||
|
||||
g_system->delayMillis(stepDuration);
|
||||
g_system->delayMillis(t.stepDuration);
|
||||
processQuitEvent();
|
||||
|
||||
g_system->copyRectToScreen(score->_surface->getPixels(), score->_surface->pitch, score->_movieRect.width() - stepSize * i, score->_movieRect.height() - stepSize * i, r.width(), r.height()); // transition
|
||||
@ -316,14 +345,14 @@ void Frame::playTransition(Score *score) {
|
||||
|
||||
case kTransCoverUpRight: // 36
|
||||
{
|
||||
uint16 stepSize = score->_movieRect.width() / steps;
|
||||
uint16 stepSize = score->_movieRect.width() / t.steps;
|
||||
Common::Rect r = score->_movieRect;
|
||||
|
||||
for (uint16 i = 1; i < steps; i++) {
|
||||
for (uint16 i = 1; i < t.steps; i++) {
|
||||
r.setWidth(stepSize * i);
|
||||
r.setHeight(stepSize * i);
|
||||
|
||||
g_system->delayMillis(stepDuration);
|
||||
g_system->delayMillis(t.stepDuration);
|
||||
processQuitEvent();
|
||||
|
||||
g_system->copyRectToScreen(score->_surface->getPixels(), score->_surface->pitch, 0, score->_movieRect.height() - stepSize * i, r.width(), r.height()); // transition
|
||||
@ -334,15 +363,36 @@ void Frame::playTransition(Score *score) {
|
||||
|
||||
case kTransDissolvePixels: // 51
|
||||
{
|
||||
warning("Frame::playTransition(): Unhandled transition type %s %d %d", transProps[_transType].name, duration, _transChunkSize);
|
||||
warning("Frame::playTransition(): Unhandled transition type %s %d %d", transProps[_transType].name, t.duration, _transChunkSize);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
warning("Frame::playTransition(): Unhandled transition type %s %d %d", transProps[_transType].name, duration, _transChunkSize);
|
||||
warning("Frame::playTransition(): Unhandled transition type %s %d %d", transProps[_transType].name, t.duration, _transChunkSize);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static void initTransParams(TransParams &t, Score *score) {
|
||||
if (transProps[t.type].dir == kTransDirHorizontal) {
|
||||
int w = score->_movieRect.width() / 2;
|
||||
|
||||
t.steps = w / t.chunkSize;
|
||||
t.xStepSize = w / t.steps;
|
||||
t.xpos = w % t.steps;
|
||||
} else if (transProps[t.type].dir == kTransDirVertical) {
|
||||
int h = score->_movieRect.height() / 2;
|
||||
|
||||
t.steps = h / t.chunkSize;
|
||||
t.yStepSize = h / t.steps;
|
||||
t.ypos = h % t.steps;
|
||||
} else {
|
||||
t.steps = score->_movieRect.width() / t.chunkSize;
|
||||
}
|
||||
|
||||
t.stepDuration = t.duration / t.steps;
|
||||
}
|
||||
|
||||
|
||||
} // End of namespace Director
|
||||
|
Loading…
x
Reference in New Issue
Block a user