From 76ba4bcafba4f8c70c318094650bfa45fd674308 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 16 Jun 2013 09:03:03 -0400 Subject: VOYEUR: Font rendering fixes --- engines/voyeur/files.cpp | 24 ++++++++-- engines/voyeur/files.h | 2 + engines/voyeur/graphics.cpp | 114 ++++++++++++++++++++++++++++++-------------- 3 files changed, 100 insertions(+), 40 deletions(-) (limited to 'engines/voyeur') diff --git a/engines/voyeur/files.cpp b/engines/voyeur/files.cpp index 94a770ae0e..69cfcc2786 100644 --- a/engines/voyeur/files.cpp +++ b/engines/voyeur/files.cpp @@ -670,6 +670,20 @@ PictureResource::PictureResource() { _imgData = NULL; } +PictureResource::PictureResource(int flags, int select, int pick, int onOff, + int depth, const Common::Rect &bounds, int maskData, byte *imgData, + int planeSize) { + _flags = flags; + _select = select; + _pick = pick; + _onOff = onOff; + _depth = depth; + _bounds = bounds; + _maskData = maskData; + _imgData = imgData; + _planeSize = planeSize; +} + PictureResource::~PictureResource() { delete _imgData; } @@ -677,7 +691,7 @@ PictureResource::~PictureResource() { /*------------------------------------------------------------------------*/ ViewPortResource::ViewPortResource(BoltFilesState &state, const byte *src): - _state(state) { + _fontChar(0, 0xff, 0xff, 0, 0, Common::Rect(), 0, NULL, 0), _state(state) { _flags = READ_LE_UINT16(src); _next = state._curLibPtr->getBoltEntryFromLong(READ_LE_UINT32(src + 2))._viewPortResource; _pageCount = READ_LE_UINT16(src + 6); @@ -919,12 +933,12 @@ int ViewPortResource::drawText(const Common::String &msg) { gfxManager._saveBack = false; int count = 0; - if (!(fontInfo._fontFlags & 4)) + if (fontInfo._fontFlags & 4) count = 1; else if (fontInfo._fontFlags & 8) count = 8; - for (int i = 0; i < count; ++i) { + for (int i = count; i >= 0; --i) { xp = pos.x; yp = pos.y; @@ -950,7 +964,7 @@ int ViewPortResource::drawText(const Common::String &msg) { break; } - if (i == 0) { + if (i != 0) { _fontChar._pick = 0; _fontChar._onOff = fontInfo._shadowColor; } else if (fontData.field2 == 1 || (fontInfo._fontFlags & 0x10)) { @@ -969,7 +983,7 @@ int ViewPortResource::drawText(const Common::String &msg) { while ((ch = *msgP++) != '\0') { int charValue = (int)ch - minChar; - if (charValue >= totalChars || fontData._charWidth[charValue] == 0) + if (charValue < 0 || charValue >= totalChars || fontData._charWidth[charValue] == 0) charValue = fontData._maxChar - minChar; int charWidth = fontData._charWidth[charValue]; diff --git a/engines/voyeur/files.h b/engines/voyeur/files.h index f612904b6d..659f29baaf 100644 --- a/engines/voyeur/files.h +++ b/engines/voyeur/files.h @@ -219,6 +219,8 @@ public: byte *_imgData; public: PictureResource(BoltFilesState &state, const byte *src); + PictureResource(int flags, int select, int pick, int onOff, int depth, + const Common::Rect &bounds, int maskData, byte *imgData, int planeSize); PictureResource(); virtual ~PictureResource(); }; diff --git a/engines/voyeur/graphics.cpp b/engines/voyeur/graphics.cpp index 7a6c72c027..99abc11f52 100644 --- a/engines/voyeur/graphics.cpp +++ b/engines/voyeur/graphics.cpp @@ -93,19 +93,9 @@ void GraphicsManager::addRectOptSaveRect(ViewPortResource *viewPort, int idx, co if (viewPort->_rectListCount[idx] == -1) return; + // TODO: Lots of code in original, which I suspect may be overlapping rect merging viewPort->_rectListPtr[idx]->push_back(bounds); - count1 = count2 = viewPort->_rectListCount[idx]; - varE = var24 = 0; - - if (count1 > 0) { - for (idx1 = 0; idx1 < count1; ++idx1) { - // TODO: In progress - - Common::Array &rectList = *viewPort->_rectListPtr[idx]; - } - - viewPort->_rectListCount[idx] = idx1; - } + ++viewPort->_rectListCount[idx]; } void GraphicsManager::restoreMCGASaveRect(ViewPortResource *viewPort) { @@ -148,9 +138,11 @@ void GraphicsManager::sDrawPic(DisplayResource *srcDisplay, DisplayResource *des bool isClipped = false; int var52; int var20, var22; - int var26; + int var26, var2C; + byte *srcImgData, *destImgData; byte *srcP, *destP; + byte byteVal, byteVal2; // Get the picture parameters, or deference viewport pointers to get their pictures PictureResource *srcPic = (PictureResource *)srcDisplay; @@ -292,6 +284,7 @@ void GraphicsManager::sDrawPic(DisplayResource *srcDisplay, DisplayResource *des if (srcFlags & 8) { error("TODO: sDrawPic"); } else { + // loc_258B8 srcP = srcImgData + srcOffset; if (destFlags & 8) { @@ -316,43 +309,94 @@ void GraphicsManager::sDrawPic(DisplayResource *srcDisplay, DisplayResource *des } } } else { + // loc_2615E destP = destImgData + screenOffset; - // loc_2615E if (srcFlags & 2) { - srcP = srcImgData + srcOffset; - - if (destFlags & 8) { - error("TODO: sDrawPic"); - } else { - // loc_25773 - destP = destImgData + screenOffset; - srcP = (byte *)_screenSurface.pixels + srcOffset; + // loc_2617e + if (srcFlags & 0x100) { + // loc_26188 + srcP = srcImgData; + if (isClipped) { + // loc_26199 +error("TODO: var22/var24/var2C not initialised before use?"); + if (var22 < 0) { + var22 = -var22; + } else { + var22 = 0; + } + var26 = var22 + width2; + if (var24 < 0) { + var24 = -var24; + } else { + var24 = 0; + } - if (srcFlags & 2) { - // Copy from screen to surface with transparency + width2 = srcPic->_bounds.width(); + height1 = var24 + height1; + byteVal = 0; + for (int yp = 0; yp < height1; ++yp) { - for (int xp = 0; xp < width2; ++xp, ++destP) { - byte srcPixel = *srcP++; - if (srcPixel) - *destP = srcPixel; + for (int xp = 0; xp < width2; ++xp) { + if (byteVal2 <= 0) { + byteVal = *srcP++; + if (byteVal & 0x80) { + byteVal &= 0x7f; + byteVal2 = *srcP++; + if (!byteVal2) + byteVal2 = width2; + } + } + + if (yp >= var24 && xp >= var22 && xp < var26) { + if (byteVal > 0) + *destP = byteVal; + ++destP; + } } - destP += widthDiff2; - srcP += widthDiff; + if (yp >= var24) + destP += widthDiff2; } } else { - // Copy from screen surface without transparency + // loc_262BE + byteVal = 0; for (int yp = 0; yp < height1; ++yp) { - for (int xp = 0; xp < width2; ++xp, ++destP) { - byte srcPixel = *srcP++; - *destP = srcPixel; + for (int xp = 0; xp < width2; ++xp) { + byteVal2 = 0; + if (!byteVal2) { + byteVal = *++srcP; + if (byteVal & 0x80) { + byteVal &= 0x7f; + byteVal2 = *srcP++; + + if (!byteVal2) + byteVal2 = width2; + } + } + + if (byteVal > 0) + *destP = byteVal; + + ++destP; + --byteVal2; } destP += widthDiff2; - srcP += widthDiff; } } + } else { + // loc_2637F + // Copy with transparency + for (int yp = 0; yp < height1; ++yp) { + for (int xp = 0; xp < width2; ++xp, ++srcP, ++destP) { + if (*srcP != 0) + *destP = *srcP; + } + + destP += widthDiff2; + srcP += widthDiff; + } } } else { if (srcFlags & 0x100) { -- cgit v1.2.3