aboutsummaryrefslogtreecommitdiff
path: root/graphics/sjis.cpp
diff options
context:
space:
mode:
authorFlorian Kagerer2010-11-05 01:11:05 +0000
committerFlorian Kagerer2010-11-05 01:11:05 +0000
commit4457d10f8465ec93d2761168a850cfe2574d6d5c (patch)
tree474b22aa9a7a5ed988b05ff8cf7a4c562e0e9a33 /graphics/sjis.cpp
parent206971d16b56ff37a6a81ff85a1b488fdc60c627 (diff)
downloadscummvm-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/sjis.cpp')
-rw-r--r--graphics/sjis.cpp19
1 files changed, 13 insertions, 6 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);