diff options
author | Florian Kagerer | 2010-11-05 01:11:05 +0000 |
---|---|---|
committer | Florian Kagerer | 2010-11-05 01:11:05 +0000 |
commit | 4457d10f8465ec93d2761168a850cfe2574d6d5c (patch) | |
tree | 474b22aa9a7a5ed988b05ff8cf7a4c562e0e9a33 /graphics | |
parent | 206971d16b56ff37a6a81ff85a1b488fdc60c627 (diff) | |
download | scummvm-rg350-4457d10f8465ec93d2761168a850cfe2574d6d5c.tar.gz scummvm-rg350-4457d10f8465ec93d2761168a850cfe2574d6d5c.tar.bz2 scummvm-rg350-4457d10f8465ec93d2761168a850cfe2574d6d5c.zip |
GRAPHICS/SJIS: fix out of bounds shadow mode text drawing
svn-id: r54080
Diffstat (limited to 'graphics')
-rw-r--r-- | graphics/sjis.cpp | 19 | ||||
-rw-r--r-- | graphics/sjis.h | 2 |
2 files changed, 14 insertions, 7 deletions
diff --git a/graphics/sjis.cpp b/graphics/sjis.cpp index 6e758051a3..f4724e0feb 100644 --- a/graphics/sjis.cpp +++ b/graphics/sjis.cpp @@ -53,7 +53,7 @@ FontSJIS *FontSJIS::createFont(const Common::Platform platform) { } template<typename Color> -void FontSJISBase::blitCharacter(const uint8 *glyph, const int w, const int h, uint8 *dst, int pitch, Color c1, Color c2) const { +void FontSJISBase::blitCharacter(const uint8 *glyph, const int w, const int h, uint8 *dst, int pitch, Color c1, Color c2, bool shadowClipRight, bool shadowClipBottom) const { for (int y = 0; y < h; ++y) { Color *d = (Color *)dst; dst += pitch; @@ -65,9 +65,13 @@ void FontSJISBase::blitCharacter(const uint8 *glyph, const int w, const int h, u if (mask & 0x80) { *d = c1; - if (_drawMode == kShadowMode || _drawMode == kFMTownsShadowMode) - d[1] = d[pitch] = c2; - if (_drawMode == kShadowMode) + if (_drawMode == kShadowMode || _drawMode == kFMTownsShadowMode) { + if (!(shadowClipRight && (x == w - 1))) + d[1] = c2; + if (!(shadowClipBottom && (y == h - 1))) + d[pitch] = c2; + } + if (_drawMode == kShadowMode && !(shadowClipRight && (x == w - 1)) && !(shadowClipBottom && (y == h - 1))) d[pitch + 1] = c2; } ++d; @@ -143,6 +147,7 @@ void FontSJISBase::drawChar(void *dst, uint16 ch, int pitch, int bpp, uint32 c1, int width = 0, height = 0; int outlineExtraWidth = 2, outlineExtraHeight = 2; int outlineXOffset = 0, outlineYOffset = 0; + bool shadowClipRight = false, shadowClipBottom = false; if (is8x16(ch)) { glyphSource = getCharData8x16(ch); @@ -158,12 +163,14 @@ void FontSJISBase::drawChar(void *dst, uint16 ch, int pitch, int bpp, uint32 c1, width = maxW; outlineExtraWidth = 0; outlineXOffset = 1; + shadowClipRight = true; } if (maxH != -1 && maxH < height) { height = maxH; outlineExtraHeight = 0; outlineYOffset = 1; + shadowClipBottom = true; } if (width <= 0 || height <= 0) @@ -190,14 +197,14 @@ void FontSJISBase::drawChar(void *dst, uint16 ch, int pitch, int bpp, uint32 c1, blitCharacter<uint8>(outline, width + outlineExtraWidth, height + outlineExtraHeight, (uint8 *)dst, pitch, c2); blitCharacter<uint8>(glyphSource, width - outlineXOffset, height - outlineYOffset, (uint8 *)dst + pitch + 1, pitch, c1); } else { - blitCharacter<uint8>(glyphSource, width, height, (uint8 *)dst, pitch, c1, c2); + blitCharacter<uint8>(glyphSource, width, height, (uint8 *)dst, pitch, c1, c2, shadowClipRight, shadowClipBottom); } } else if (bpp == 2) { if (_drawMode == kOutlineMode) { blitCharacter<uint16>(outline, width + outlineExtraWidth, height + outlineExtraHeight, (uint8 *)dst, pitch, c2); blitCharacter<uint16>(glyphSource, width - outlineXOffset, height - outlineYOffset, (uint8 *)dst + pitch + 2, pitch, c1); } else { - blitCharacter<uint16>(glyphSource, width, height, (uint8 *)dst, pitch, c1, c2); + blitCharacter<uint16>(glyphSource, width, height, (uint8 *)dst, pitch, c1, c2, shadowClipRight, shadowClipBottom); } } else { error("FontSJISBase::drawChar: unsupported bpp: %d", bpp); diff --git a/graphics/sjis.h b/graphics/sjis.h index 3ba07230da..6ac2033a48 100644 --- a/graphics/sjis.h +++ b/graphics/sjis.h @@ -155,7 +155,7 @@ public: void drawChar(void *dst, uint16 ch, int pitch, int bpp, uint32 c1, uint32 c2, int maxW = -1, int maxH = -1) const; private: template<typename Color> - void blitCharacter(const uint8 *glyph, const int w, const int h, uint8 *dst, int pitch, Color c1, Color c2 = 0) const; + void blitCharacter(const uint8 *glyph, const int w, const int h, uint8 *dst, int pitch, Color c1, Color c2 = 0, bool clipShadowRight = false, bool clipShadowBottom = false) const; void createOutline(uint8 *outline, const uint8 *glyph, const int w, const int h) const; #ifndef DISABLE_FLIPPED_MODE |