diff options
author | Paul Gilbert | 2011-04-17 19:51:56 +1000 |
---|---|---|
committer | Paul Gilbert | 2011-04-17 19:51:56 +1000 |
commit | f1d890beb7eaee012f5779729e5982dead9c2148 (patch) | |
tree | 7ee4474e7a011b5e50545fc90e232924ba654d6b /engines | |
parent | 2fb7acb0009b3ac60bd6000bf398b743394626b8 (diff) | |
download | scummvm-rg350-f1d890beb7eaee012f5779729e5982dead9c2148.tar.gz scummvm-rg350-f1d890beb7eaee012f5779729e5982dead9c2148.tar.bz2 scummvm-rg350-f1d890beb7eaee012f5779729e5982dead9c2148.zip |
TSAGE: Fix glitches with incorrect pixels on the edges of zoomed objects
Diffstat (limited to 'engines')
-rw-r--r-- | engines/tsage/graphics.cpp | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/engines/tsage/graphics.cpp b/engines/tsage/graphics.cpp index d67810cac2..77316d2d7d 100644 --- a/engines/tsage/graphics.cpp +++ b/engines/tsage/graphics.cpp @@ -410,19 +410,20 @@ void GfxSurface::loadScreenSection(Graphics::Surface &dest, int xHalf, int yHalf * included in a scaled image */ static int *scaleLine(int size, int srcSize) { - int scale = 100 * size / srcSize; + const int PRECISION_FACTOR = 1000; + int scale = PRECISION_FACTOR * size / srcSize; assert(scale >= 0); int *v = new int[size]; - Common::set_to(v, &v[size], 0); + Common::set_to(v, &v[size], -1); int distCtr = 0; int *destP = v; for (int distIndex = 0; distIndex < srcSize; ++distIndex) { distCtr += scale; - while (distCtr >= 100) { + while (distCtr >= PRECISION_FACTOR) { assert(destP < &v[size]); *destP++ = distIndex; - distCtr -= 100; + distCtr -= PRECISION_FACTOR; } } @@ -436,7 +437,7 @@ static int *scaleLine(int size, int srcSize) { * @param NewHeight New height for scaled image * @remarks Caller is responsible for freeing the returned surface */ -static GfxSurface ResizeSurface(GfxSurface &src, int xSize, int ySize) { +static GfxSurface ResizeSurface(GfxSurface &src, int xSize, int ySize, int transIndex) { GfxSurface s; s.create(xSize, ySize); @@ -448,12 +449,22 @@ static GfxSurface ResizeSurface(GfxSurface &src, int xSize, int ySize) { // Loop to create scaled version for (int yp = 0; yp < ySize; ++yp) { - const byte *srcP = (const byte *)srcImage.getBasePtr(0, vertUsage[yp]); byte *destP = (byte *)destImage.getBasePtr(0, yp); - for (int xp = 0; xp < xSize; ++xp) { - const byte *tempSrcP = srcP + horizUsage[xp]; - *destP++ = *tempSrcP++; + if (vertUsage[yp] == -1) { + Common::set_to(destP, destP + xSize, transIndex); + } else { + const byte *srcP = (const byte *)srcImage.getBasePtr(0, vertUsage[yp]); + + for (int xp = 0; xp < xSize; ++xp) { + if (horizUsage[xp] != -1) { + const byte *tempSrcP = srcP + horizUsage[xp]; + *destP++ = *tempSrcP++; + } else { + // Pixel overrun at the end of the line + *destP++ = transIndex; + } + } } } @@ -493,7 +504,7 @@ void GfxSurface::copyFrom(GfxSurface &src, Rect srcBounds, Rect destBounds, Regi } if ((destBounds.width() != srcBounds.width()) || (destBounds.height() != srcBounds.height())) - srcImage = ResizeSurface(srcImage, destBounds.width(), destBounds.height()); + srcImage = ResizeSurface(srcImage, destBounds.width(), destBounds.height(), src._transColor); Graphics::Surface srcSurface = srcImage.lockSurface(); Graphics::Surface destSurface = lockSurface(); |