aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorstrangerke2011-02-27 01:04:49 +0100
committerstrangerke2011-02-27 01:04:49 +0100
commita99b394836150bef7be8bc79cf656c343d703782 (patch)
tree3c8b151efdb31e33856f581a0c2428760b42bf10
parentda62869baf6900f08452264ddea0a645b37dca17 (diff)
downloadscummvm-rg350-a99b394836150bef7be8bc79cf656c343d703782.tar.gz
scummvm-rg350-a99b394836150bef7be8bc79cf656c343d703782.tar.bz2
scummvm-rg350-a99b394836150bef7be8bc79cf656c343d703782.zip
HUGO: Better fix for graphics glitches in DOS versions, fix H3 ending animation
-rw-r--r--engines/hugo/display.cpp13
-rw-r--r--engines/hugo/hugo.cpp7
2 files changed, 14 insertions, 6 deletions
diff --git a/engines/hugo/display.cpp b/engines/hugo/display.cpp
index 42cde6fd70..f9b892397c 100644
--- a/engines/hugo/display.cpp
+++ b/engines/hugo/display.cpp
@@ -243,7 +243,7 @@ void Screen::displayFrame(const int sx, const int sy, seq_t *seq, const bool for
image_pt subFrontBuffer = &_frontBuffer[sy * kXPix + sx]; // Ptr to offset in _frontBuffer
int16 frontBufferwrap = kXPix - seq->x2 - 1; // Wraps dest_p after each line
int16 imageWrap = seq->bytesPerLine8 - seq->x2 - 1;
- overlayState_t overlayState = kOvlUndef; // Overlay state of object
+ overlayState_t overlayState = (foreFl) ? kOvlForeground : kOvlUndef; // Overlay state of object
for (uint16 y = 0; y < seq->lines; y++) { // Each line in object
for (uint16 x = 0; x <= seq->x2; x++) {
if (*image) { // Non-transparent
@@ -251,7 +251,7 @@ void Screen::displayFrame(const int sx, const int sy, seq_t *seq, const bool for
if (ovlBound & (0x80 >> ((uint16)(subFrontBuffer - _frontBuffer) & 7))) { // Overlay bit is set
if (overlayState == kOvlUndef) // Overlay defined yet?
overlayState = findOvl(seq, subFrontBuffer, y);// No, find it.
- if (foreFl || overlayState == kOvlForeground) // Object foreground
+ if (overlayState == kOvlForeground) // Object foreground
*subFrontBuffer = *image; // Copy pixel
} else { // No overlay
*subFrontBuffer = *image; // Copy pixel
@@ -730,11 +730,12 @@ void Screen_v1d::loadFontArr(Common::ReadStream &in) {
overlayState_t Screen_v1d::findOvl(seq_t *seq_p, image_pt dst_p, uint16 y) {
debugC(4, kDebugDisplay, "findOvl()");
- for (; y < seq_p->lines; y++) { // Each line in object
- byte ovb = _vm->_object->getBaseBoundary((uint16)(dst_p - _frontBuffer) >> 3); // Ptr into overlay bytes
- if (ovb) // If any overlay base byte is non-zero then the object is foreground, else back.
+ uint16 index = (uint16)(dst_p - _frontBuffer) >> 3;
+
+ for (int i = 0; i < seq_p->lines-y; i++) { // Each line in object
+ if (_vm->_object->getBaseBoundary(index)) // If any overlay base byte is non-zero then the object is foreground, else back.
return kOvlForeground;
- dst_p += kXPix;
+ index += kCompLineSize;
}
return kOvlBackground; // No bits set, must be background
diff --git a/engines/hugo/hugo.cpp b/engines/hugo/hugo.cpp
index 8d5fa877c6..226009ec5a 100644
--- a/engines/hugo/hugo.cpp
+++ b/engines/hugo/hugo.cpp
@@ -631,6 +631,13 @@ void HugoEngine::readScreenFiles(const int screenNum) {
_file->readBackground(screenNum); // Scenery file
memcpy(_screen->getBackBuffer(), _screen->getFrontBuffer(), sizeof(_screen->getFrontBuffer())); // Make a copy
+
+ // Workaround for graphic glitches in DOS versions. Cleaning the overlays fix the problem
+ memset(_object->_objBound, '\0', sizeof(overlay_t));
+ memset(_object->_boundary, '\0', sizeof(overlay_t));
+ memset(_object->_overlay, '\0', sizeof(overlay_t));
+ memset(_object->_ovlBase, '\0', sizeof(overlay_t));
+
_file->readOverlay(screenNum, _object->_boundary, kOvlBoundary); // Boundary file
_file->readOverlay(screenNum, _object->_overlay, kOvlOverlay); // Overlay file
_file->readOverlay(screenNum, _object->_ovlBase, kOvlBase); // Overlay base file