From e1e299d0b8d1ebc229036a6796c5f1dab2c3b66e Mon Sep 17 00:00:00 2001 From: Sven Hesse Date: Sat, 22 Jan 2011 07:20:16 +0000 Subject: VIDEO: Correctly correct the _blitMode 1/2 coordinate differences This fixes the figure lights position in the Secret Room, while still leaving the flow rate gauge position in the Labyrinth correct svn-id: r55409 --- graphics/video/coktel_decoder.cpp | 137 +++++++++++++++++++------------------- graphics/video/coktel_decoder.h | 2 + 2 files changed, 71 insertions(+), 68 deletions(-) (limited to 'graphics/video') diff --git a/graphics/video/coktel_decoder.cpp b/graphics/video/coktel_decoder.cpp index 1590db920b..7fba516d5b 100644 --- a/graphics/video/coktel_decoder.cpp +++ b/graphics/video/coktel_decoder.cpp @@ -1570,16 +1570,21 @@ bool VMDDecoder::seek(int32 frame, int whence, bool restart) { } void VMDDecoder::setXY(uint16 x, uint16 y) { - if ((_blitMode == 1) || (_blitMode == 3)) - x *= _bytesPerPixel; + uint16 curX = _x; + uint16 setX = x; + + if ((x != 0xFFFF) && (_blitMode == 1)) { + curX *= _bytesPerPixel; + setX *= _bytesPerPixel; + } for (uint32 i = 0; i < _frameCount; i++) { for (int j = 0; j < _partsPerFrame; j++) { if (_frames[i].parts[j].type == kPartTypeVideo) { if (x != 0xFFFF) { - _frames[i].parts[j].left = _frames[i].parts[j].left - _x + x; - _frames[i].parts[j].right = _frames[i].parts[j].right - _x + x; + _frames[i].parts[j].left = _frames[i].parts[j].left - curX + setX; + _frames[i].parts[j].right = _frames[i].parts[j].right - curX + setX; } if (y != 0xFFFF) { _frames[i].parts[j].top = _frames[i].parts[j].top - _y + y; @@ -1766,14 +1771,14 @@ bool VMDDecoder::assessVideoProperties() { _blitMode = _bytesPerPixel - 1; _bytesPerPixel = n; - if ((_blitMode == 1) && !(_flags & 0x1000)) - _blitMode = 3; - _isPaletted = false; } - if ((_blitMode == 1) || (_blitMode == 3)) - _width /= _bytesPerPixel; + if (_blitMode == 1) { + _width /= _bytesPerPixel; + _defaultX /= _bytesPerPixel; + _x /= _bytesPerPixel; + } if (_hasVideo) { uint32 suggestedVideoBufferSize = _videoBufferSize; @@ -2169,47 +2174,8 @@ void VMDDecoder::processFrame() { } bool VMDDecoder::renderFrame(Common::Rect &rect) { - Common::Rect realRect = rect; - Common::Rect fakeRect = rect; - - if (_blitMode == 0) { - - realRect = Common::Rect(realRect.left - _x, realRect.top - _y, - realRect.right - _x, realRect.bottom - _y); - - fakeRect = Common::Rect(fakeRect.left - _x, fakeRect.top - _y, - fakeRect.right - _x, fakeRect.bottom - _y); - - } else if ((_blitMode == 1) || (_blitMode == 3)) { - - realRect = Common::Rect(rect.left / _bytesPerPixel, rect.top, - rect.right / _bytesPerPixel, rect.bottom); - - realRect = Common::Rect(realRect.left - _x / _bytesPerPixel, realRect.top - _y, - realRect.right - _x / _bytesPerPixel, realRect.bottom - _y); - - fakeRect = Common::Rect(fakeRect.left - _x, fakeRect.top - _y, - fakeRect.right - _x, fakeRect.bottom - _y); - - } else if (_blitMode == 2) { - - fakeRect = Common::Rect(rect.left * _bytesPerPixel, rect.top, - rect.right * _bytesPerPixel, rect.bottom); - - realRect = Common::Rect(realRect.left - _x, realRect.top - _y, - realRect.right - _x, realRect.bottom - _y); - - fakeRect = Common::Rect(fakeRect.left - _x * _bytesPerPixel, fakeRect.top - _y, - fakeRect.right - _x * _bytesPerPixel, fakeRect.bottom - _y); - - } - - realRect.clip(Common::Rect(_surface.w, _surface.h)); - fakeRect.clip(Common::Rect(_surface.w * _bytesPerPixel, _surface.h)); - - if (!realRect.isValidRect() || realRect.isEmpty()) - return false; - if (!fakeRect.isValidRect() || realRect.isEmpty()) + Common::Rect realRect, fakeRect; + if (!getRenderRects(rect, realRect, fakeRect)) return false; if (_externalCodec) { @@ -2283,18 +2249,63 @@ bool VMDDecoder::renderFrame(Common::Rect &rect) { else if (_bytesPerPixel == 3) blit24(*surface, *blockRect); - if ((_blitMode == 1) || (_blitMode == 3)) - *blockRect = Common::Rect(blockRect->left + _x / _bytesPerPixel, blockRect->top + _y, - blockRect->right + _x / _bytesPerPixel, blockRect->bottom + _y); - else - *blockRect = Common::Rect(blockRect->left + _x, blockRect->top + _y, - blockRect->right + _x, blockRect->bottom + _y); + *blockRect = Common::Rect(blockRect->left + _x, blockRect->top + _y, + blockRect->right + _x, blockRect->bottom + _y); } rect = *blockRect; return true; } +bool VMDDecoder::getRenderRects(const Common::Rect &rect, + Common::Rect &realRect, Common::Rect &fakeRect) { + + realRect = rect; + fakeRect = rect; + + if (_blitMode == 0) { + + realRect = Common::Rect(realRect.left - _x, realRect.top - _y, + realRect.right - _x, realRect.bottom - _y); + + fakeRect = Common::Rect(fakeRect.left - _x, fakeRect.top - _y, + fakeRect.right - _x, fakeRect.bottom - _y); + + } else if (_blitMode == 1) { + + realRect = Common::Rect(rect.left / _bytesPerPixel, rect.top, + rect.right / _bytesPerPixel, rect.bottom); + + realRect = Common::Rect(realRect.left - _x, realRect.top - _y, + realRect.right - _x, realRect.bottom - _y); + + fakeRect = Common::Rect(fakeRect.left - _x * _bytesPerPixel, fakeRect.top - _y, + fakeRect.right - _x * _bytesPerPixel, fakeRect.bottom - _y); + + } else if (_blitMode == 2) { + + fakeRect = Common::Rect(rect.left * _bytesPerPixel, rect.top, + rect.right * _bytesPerPixel, rect.bottom); + + realRect = Common::Rect(realRect.left - _x, realRect.top - _y, + realRect.right - _x, realRect.bottom - _y); + + fakeRect = Common::Rect(fakeRect.left - _x * _bytesPerPixel, fakeRect.top - _y, + fakeRect.right - _x * _bytesPerPixel, fakeRect.bottom - _y); + + } + + realRect.clip(Common::Rect(_surface.w, _surface.h)); + fakeRect.clip(Common::Rect(_surface.w * _bytesPerPixel, _surface.h)); + + if (!realRect.isValidRect() || realRect.isEmpty()) + return false; + if (!fakeRect.isValidRect() || realRect.isEmpty()) + return false; + + return true; +} + void VMDDecoder::blit16(const Surface &srcSurf, Common::Rect &rect) { rect = Common::Rect(rect.left / 2, rect.top, rect.right / 2, rect.bottom); @@ -2304,16 +2315,10 @@ void VMDDecoder::blit16(const Surface &srcSurf, Common::Rect &rect) { PixelFormat pixelFormat = getPixelFormat(); - uint16 x = _x; - if (_blitMode == 1) - x /= 4; - else if (_blitMode == 3) - x /= 2; - const byte *src = (byte *)srcSurf.pixels + (srcRect.top * srcSurf.pitch) + srcRect.left * _bytesPerPixel; byte *dst = (byte *)_surface.pixels + - ((_y + rect.top) * _surface.pitch) + (x + rect.left) * _surface.bytesPerPixel; + ((_y + rect.top) * _surface.pitch) + (_x + rect.left) * _surface.bytesPerPixel; for (int i = 0; i < rect.height(); i++) { const byte *srcRow = src; @@ -2348,14 +2353,10 @@ void VMDDecoder::blit24(const Surface &srcSurf, Common::Rect &rect) { PixelFormat pixelFormat = getPixelFormat(); - uint16 x = _x; - if ((_blitMode == 1) || (_blitMode == 3)) - x /= 9; - const byte *src = (byte *)srcSurf.pixels + (srcRect.top * srcSurf.pitch) + srcRect.left * _bytesPerPixel; byte *dst = (byte *)_surface.pixels + - ((_y + rect.top) * _surface.pitch) + (x + rect.left) * _surface.bytesPerPixel; + ((_y + rect.top) * _surface.pitch) + (_x + rect.left) * _surface.bytesPerPixel; for (int i = 0; i < rect.height(); i++) { const byte *srcRow = src; diff --git a/graphics/video/coktel_decoder.h b/graphics/video/coktel_decoder.h index 9d99215ab5..08e3535fc7 100644 --- a/graphics/video/coktel_decoder.h +++ b/graphics/video/coktel_decoder.h @@ -481,6 +481,8 @@ private: // Video bool renderFrame(Common::Rect &rect); + bool getRenderRects(const Common::Rect &rect, + Common::Rect &realRect, Common::Rect &fakeRect); void blit16(const Surface &srcSurf, Common::Rect &rect); void blit24(const Surface &srcSurf, Common::Rect &rect); -- cgit v1.2.3