diff options
Diffstat (limited to 'scumm/gfx.cpp')
-rw-r--r-- | scumm/gfx.cpp | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/scumm/gfx.cpp b/scumm/gfx.cpp index 5ee02201b1..31872e83e1 100644 --- a/scumm/gfx.cpp +++ b/scumm/gfx.cpp @@ -322,6 +322,14 @@ void ScummEngine::markRectAsDirty(VirtScreenNumber virt, int left, int right, in bottom = vs->h; if (virt == kMainVirtScreen && dirtybit) { +#ifdef V7_SMOOTH_SCROLLING_HACK + if (_version >= 7) { + // FIXME / HACK: This is a hack to fix an actor redraw glitch + // in V7_SMOOTH_SCROLLING_HACK mode. Right now I have no idea + // why this hack is needed, but for now it works well enough. + lp = left / 8 + _screenStartStrip - 1; + } else +#endif lp = left / 8 + _screenStartStrip; if (lp < 0) lp = 0; @@ -410,14 +418,19 @@ void Gdi::updateDirtyScreen(VirtScreen *vs) { int i; int w = 8; int start = 0; +#ifdef V7_SMOOTH_SCROLLING_HACK + const int numStrips = MIN(_vm->_screenStartStrip + _numStrips, _vm->_roomWidth / 8) - _vm->_screenStartStrip; +#else + const int numStrips = _numStrips; +#endif - for (i = 0; i < _numStrips; i++) { + for (i = 0; i < numStrips; i++) { if (vs->bdirty[i]) { const int top = vs->tdirty[i]; const int bottom = vs->bdirty[i]; vs->tdirty[i] = vs->h; vs->bdirty[i] = 0; - if (i != (_numStrips - 1) && vs->bdirty[i + 1] == bottom && vs->tdirty[i + 1] == top) { + if (i != (numStrips - 1) && vs->bdirty[i + 1] == bottom && vs->tdirty[i + 1] == top) { // Simple optimizations: if two or more neighbouring strips // form one bigger rectangle, coalesce them. w += 8; |