diff options
-rw-r--r-- | queen/display.cpp | 34 | ||||
-rw-r--r-- | queen/display.h | 1 | ||||
-rw-r--r-- | queen/graphics.cpp | 36 |
3 files changed, 22 insertions, 49 deletions
diff --git a/queen/display.cpp b/queen/display.cpp index eb2dcc400f..49599acd3a 100644 --- a/queen/display.cpp +++ b/queen/display.cpp @@ -134,10 +134,7 @@ void Display::dynalumUpdate(int16 x, int16 y) { } uint offset = (y / 4) * 160 + (x / 4); - if (offset >= sizeof(_dynalum.msk)) { - debug(6, "Graphics::dynalumUpdate(%d, %d) - invalid offset: %08x", x, y, offset); - return; - } + assert(offset < sizeof(_dynalum.msk)); uint8 colMask = _dynalum.msk[offset]; debug(9, "Display::dynalumUpdate(%d, %d) - colMask = %d", x, y, colMask); @@ -350,7 +347,7 @@ void Display::palCustomScroll(uint16 roomNum) { j += jdir; if(j <= 0 || j >= 14) { jdir = -jdir; - if (_vm->randomizer.getRandomNumber(1)) { + if (_rnd.getRandomNumber(1)) { if (ABS(jdir) == 1) { jdir *= 2; } else { @@ -956,8 +953,8 @@ void Display::blankScreenEffect1() { uint8 buf[32 * 32]; while (_vm->input()->idleTime() >= Input::DELAY_SCREEN_BLANKER) { for(int i = 0; i < 2; ++i) { - uint16 x = _vm->randomizer.getRandomNumber(SCREEN_W - 32 - 2) + 1; - uint16 y = _vm->randomizer.getRandomNumber(SCREEN_H - 32 - 2) + 1; + uint16 x = _rnd.getRandomNumber(SCREEN_W - 32 - 2) + 1; + uint16 y = _rnd.getRandomNumber(SCREEN_H - 32 - 2) + 1; uint8 *p = _screenBuf + SCREEN_W * y + x; uint8 *q = buf; uint16 h = 32; @@ -966,16 +963,9 @@ void Display::blankScreenEffect1() { p += SCREEN_W; q += 32; } - if (_vm->randomizer.getRandomNumber(1)) { - --x; - } else { - ++x; - } - if (_vm->randomizer.getRandomNumber(1)) { - --y; - } else { - ++y; - } + const int inc[] = { -1, 1 }; + x += inc[_rnd.getRandomNumber(1)]; + y += inc[_rnd.getRandomNumber(1)]; _system->copy_rect(buf, 32, x, y, 32, 32); _system->updateScreen(); _vm->input()->delay(10); @@ -985,11 +975,11 @@ void Display::blankScreenEffect1() { void Display::blankScreenEffect2() { while (_vm->input()->idleTime() >= Input::DELAY_SCREEN_BLANKER) { - uint16 x = _vm->randomizer.getRandomNumber(SCREEN_W - 2); - uint16 y = _vm->randomizer.getRandomNumber(SCREEN_H - 2); + uint16 x = _rnd.getRandomNumber(SCREEN_W - 2); + uint16 y = _rnd.getRandomNumber(SCREEN_H - 2); uint8 *p = _screenBuf + y * SCREEN_W + x; uint8 c = 0; - switch (_vm->randomizer.getRandomNumber(3)) { + switch (_rnd.getRandomNumber(3)) { case 0: c = *p; break; @@ -1022,8 +1012,8 @@ void Display::blankScreenEffect3() { memset(_screenBuf, 0, SCREEN_W * SCREEN_H); _system->copy_rect(_screenBuf, SCREEN_W, 0, 0, SCREEN_W, SCREEN_H); } else { - uint16 x = _vm->randomizer.getRandomNumber(SCREEN_W - 2); - uint16 y = _vm->randomizer.getRandomNumber(SCREEN_H - 2); + uint16 x = _rnd.getRandomNumber(SCREEN_W - 2); + uint16 y = _rnd.getRandomNumber(SCREEN_H - 2); uint8 *p = _screenBuf + SCREEN_W * y + x; uint8 p0 = *p; uint8 p1 = *(p + 1); diff --git a/queen/display.h b/queen/display.h index ff15a877a4..212afde1e1 100644 --- a/queen/display.h +++ b/queen/display.h @@ -170,6 +170,7 @@ private: bool _gotTick; + Common::RandomSource _rnd; Dynalum _dynalum; OSystem *_system; QueenEngine *_vm; diff --git a/queen/graphics.cpp b/queen/graphics.cpp index 1c4681e8d2..22ebf7de3f 100644 --- a/queen/graphics.cpp +++ b/queen/graphics.cpp @@ -310,37 +310,19 @@ void Graphics::shrinkFrame(const BobFrame *bf, uint16 percentage) { assert(new_w * new_h < BOB_SHRINK_BUF_SIZE); if (new_w != 0 && new_h != 0) { - _shrinkBuffer.width = new_w; _shrinkBuffer.height = new_h; - uint32 shrinker = (100 << 0x10) / percentage; - uint16 x_scale = shrinker >> 0x10; - uint16 y_scale = x_scale * bf->width; - shrinker &= 0xFFFF; - - uint8* src = bf->data; + uint16 x, y; + uint16 sh[GAME_SCREEN_WIDTH]; + for (x = 0; x < MAX(new_h, new_w); ++x) { + sh[x] = x * 100 / percentage; + } uint8* dst = _shrinkBuffer.data; - - uint32 y_count = 0; - while (new_h--) { - uint16 i; - uint32 x_count = 0; - uint8 *p = src; - for(i = 0; i < new_w; ++i) { - *dst++ = *p; - p += x_scale; - x_count += shrinker; - if (x_count > 0xFFFF) { - ++p; - x_count &= 0xFFFF; - } - } - src += y_scale; - y_count += shrinker; - if (y_count > 0xFFFF) { - src += bf->width; - y_count &= 0xFFFF; + for (y = 0; y < new_h; ++y) { + uint8 *p = bf->data + sh[y] * bf->width; + for(x = 0; x < new_w; ++x) { + *dst++ = *(p + sh[x]); } } } |