diff options
Diffstat (limited to 'queen/display.cpp')
-rw-r--r-- | queen/display.cpp | 79 |
1 files changed, 43 insertions, 36 deletions
diff --git a/queen/display.cpp b/queen/display.cpp index 9f7d8c51c4..969cd40a44 100644 --- a/queen/display.cpp +++ b/queen/display.cpp @@ -105,15 +105,12 @@ Display::Display(QueenEngine *vm, Language language, OSystem *system) _buffer[RB_BACKDROP] = new uint8[BACKDROP_W * BACKDROP_H]; _buffer[RB_PANEL] = new uint8[PANEL_W * PANEL_H]; _buffer[RB_SCREEN] = new uint8[SCREEN_W * SCREEN_H]; - _buffer[RB_MINI] = new uint8[MINI_W * MINI_H]; memset(_buffer[RB_BACKDROP], 0, BACKDROP_W * BACKDROP_H); memset(_buffer[RB_PANEL], 0, PANEL_W * PANEL_H); memset(_buffer[RB_SCREEN], 0, SCREEN_W * SCREEN_H); - memset(_buffer[RB_MINI], 0, MINI_W * MINI_H); _bufPitch[RB_BACKDROP] = BACKDROP_W; _bufPitch[RB_PANEL] = PANEL_W; _bufPitch[RB_SCREEN] = SCREEN_W; - _bufPitch[RB_MINI] = MINI_W; _pal.room = new uint8[ 256 * 3 ]; _pal.screen = new uint8[ 256 * 3 ]; @@ -129,7 +126,6 @@ Display::~Display() { delete[] _buffer[RB_BACKDROP]; delete[] _buffer[RB_PANEL]; delete[] _buffer[RB_SCREEN]; - delete[] _buffer[RB_MINI]; delete[] _pal.room; delete[] _pal.screen; @@ -764,11 +760,6 @@ void Display::horizontalScrollUpdate(int16 xCamera) { } -void Display::horizontalScroll(int16 scroll) { - _horizontalScroll = scroll; -} - - void Display::handleTimer() { _gotTick = true; } @@ -849,17 +840,24 @@ void Display::blankScreen() { &Display::blankScreenEffect3 }; (this->*effects[_curBlankingEffect])(); - _curBlankingEffect = (_curBlankingEffect + 1) % 3; + _curBlankingEffect = (_curBlankingEffect + 1) % ARRAYSIZE(effects); } 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 - MINI_W - 2) + 1; - uint16 y = _vm->randomizer.getRandomNumber(SCREEN_H - MINI_H - 2) + 1; + uint16 x = _vm->randomizer.getRandomNumber(SCREEN_W - 32 - 2) + 1; + uint16 y = _vm->randomizer.getRandomNumber(SCREEN_H - 32 - 2) + 1; uint8 *p = _buffer[RB_SCREEN] + _bufPitch[RB_SCREEN] * y + x; - blit(RB_MINI, 0, 0, p, MINI_W, MINI_H, _bufPitch[RB_SCREEN], false, false); + uint8 *q = buf; + uint16 h = 32; + while (h--) { + memcpy(q, p, 32); + p += _bufPitch[RB_SCREEN]; + q += 32; + } if (_vm->randomizer.getRandomNumber(1)) { --x; } else { @@ -870,8 +868,9 @@ void Display::blankScreenEffect1() { } else { ++y; } - blit(RB_SCREEN, x, y, _buffer[RB_MINI], MINI_W, MINI_H, _bufPitch[RB_MINI], false, false); - drawScreen(); + _system->copy_rect(buf, 32, x, y, 32, 32); + _system->update_screen(); + waitForTimer(); } } } @@ -881,30 +880,33 @@ 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); + uint8 *p = _buffer[RB_SCREEN] + y * _bufPitch[RB_SCREEN] + x; uint8 c = 0; switch (_vm->randomizer.getRandomNumber(3)) { case 0: - c = *(_buffer[RB_SCREEN] + _bufPitch[RB_SCREEN] * y + x); + c = *p; break; case 1: - c = *(_buffer[RB_SCREEN] + _bufPitch[RB_SCREEN] * y + x + 1); + c = *(p + 1); break; case 2: - c = *(_buffer[RB_SCREEN] + _bufPitch[RB_SCREEN] * (y + 1) + x); + c = *(p + _bufPitch[RB_SCREEN]); break; case 3: - c = *(_buffer[RB_SCREEN] + _bufPitch[RB_SCREEN] * (y + 1) + x + 1); + c = *(p + _bufPitch[RB_SCREEN] + 1); break; default: break; } - uint8 *p = _buffer[RB_SCREEN] + y * _bufPitch[RB_SCREEN] + x; + uint8 *buf = p; int j = 2; while (j--) { memset(p, c, 2); p += _bufPitch[RB_SCREEN]; } - drawScreen(); + _system->copy_rect(buf, _bufPitch[RB_SCREEN], x, y, 2, 2); + _system->update_screen(); + waitForTimer(); } } @@ -912,24 +914,29 @@ void Display::blankScreenEffect2() { void Display::blankScreenEffect3() { uint32 i = 0; while (_vm->input()->idleTime() >= Input::DELAY_SCREEN_BLANKER) { - uint16 x = _vm->randomizer.getRandomNumber(SCREEN_W - 2); - uint16 y = _vm->randomizer.getRandomNumber(SCREEN_H - 2); - uint8 *p = _buffer[RB_SCREEN] + _bufPitch[RB_SCREEN] * y + x; - uint8 p0 = *p; - uint8 p1 = *(p + 1); - uint8 p2 = *(p + _bufPitch[RB_SCREEN]); - uint8 p3 = *(p + _bufPitch[RB_SCREEN] + 1); - uint8 c = (p0 + p1 + p2 + p3) / 4; - int j = 2; - while (j--) { - memset(p, c, 2); - p += _bufPitch[RB_SCREEN]; - } if (i > 4000000) { memset(_buffer[RB_SCREEN], 0, SCREEN_W * SCREEN_H); + _system->copy_rect(_buffer[RB_SCREEN], _bufPitch[RB_SCREEN], 0, 0, SCREEN_W, SCREEN_H); + } else { + uint16 x = _vm->randomizer.getRandomNumber(SCREEN_W - 2); + uint16 y = _vm->randomizer.getRandomNumber(SCREEN_H - 2); + uint8 *p = _buffer[RB_SCREEN] + _bufPitch[RB_SCREEN] * y + x; + uint8 p0 = *p; + uint8 p1 = *(p + 1); + uint8 p2 = *(p + _bufPitch[RB_SCREEN]); + uint8 p3 = *(p + _bufPitch[RB_SCREEN] + 1); + uint8 c = (p0 + p1 + p2 + p3) / 4; + uint8 *buf = p; + int j = 2; + while (j--) { + memset(p, c, 2); + p += _bufPitch[RB_SCREEN]; + } + ++i; + _system->copy_rect(buf, _bufPitch[RB_SCREEN], x, y, 2, 2); } - drawScreen(); - ++i; + _system->update_screen(); + waitForTimer(); } } |