From 206971d16b56ff37a6a81ff85a1b488fdc60c627 Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Fri, 5 Nov 2010 00:36:23 +0000 Subject: SCUMM/FM-TOWNS JAPANESE: fix out of bounds text drawing (could cause invalid memory access in MI1) svn-id: r54079 --- graphics/sjis.cpp | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) (limited to 'graphics/sjis.cpp') diff --git a/graphics/sjis.cpp b/graphics/sjis.cpp index b9d0d8332f..6e758051a3 100644 --- a/graphics/sjis.cpp +++ b/graphics/sjis.cpp @@ -138,9 +138,12 @@ const uint8 *FontSJISBase::flipCharacter(const uint8 *glyph, const int w) const } #endif -void FontSJISBase::drawChar(void *dst, uint16 ch, int pitch, int bpp, uint32 c1, uint32 c2) const { +void FontSJISBase::drawChar(void *dst, uint16 ch, int pitch, int bpp, uint32 c1, uint32 c2, int maxW, int maxH) const { const uint8 *glyphSource = 0; int width = 0, height = 0; + int outlineExtraWidth = 2, outlineExtraHeight = 2; + int outlineXOffset = 0, outlineYOffset = 0; + if (is8x16(ch)) { glyphSource = getCharData8x16(ch); width = 8; @@ -151,6 +154,21 @@ void FontSJISBase::drawChar(void *dst, uint16 ch, int pitch, int bpp, uint32 c1, height = 16; } + if (maxW != -1 && maxW < width) { + width = maxW; + outlineExtraWidth = 0; + outlineXOffset = 1; + } + + if (maxH != -1 && maxH < height) { + height = maxH; + outlineExtraHeight = 0; + outlineYOffset = 1; + } + + if (width <= 0 || height <= 0) + return; + if (!glyphSource) { warning("FontSJISBase::drawChar: Font does not offer data for %02X %02X", ch & 0xFF, ch >> 8); return; @@ -169,15 +187,15 @@ void FontSJISBase::drawChar(void *dst, uint16 ch, int pitch, int bpp, uint32 c1, if (bpp == 1) { if (_drawMode == kOutlineMode) { - blitCharacter(outline, width + 2, height + 2, (uint8 *)dst, pitch, c2); - blitCharacter(glyphSource, width, height, (uint8 *)dst + pitch + 1, pitch, c1); + blitCharacter(outline, width + outlineExtraWidth, height + outlineExtraHeight, (uint8 *)dst, pitch, c2); + blitCharacter(glyphSource, width - outlineXOffset, height - outlineYOffset, (uint8 *)dst + pitch + 1, pitch, c1); } else { blitCharacter(glyphSource, width, height, (uint8 *)dst, pitch, c1, c2); } } else if (bpp == 2) { if (_drawMode == kOutlineMode) { - blitCharacter(outline, width + 2, height + 2, (uint8 *)dst, pitch, c2); - blitCharacter(glyphSource, width, height, (uint8 *)dst + pitch + 2, pitch, c1); + blitCharacter(outline, width + outlineExtraWidth, height + outlineExtraHeight, (uint8 *)dst, pitch, c2); + blitCharacter(glyphSource, width - outlineXOffset, height - outlineYOffset, (uint8 *)dst + pitch + 2, pitch, c1); } else { blitCharacter(glyphSource, width, height, (uint8 *)dst, pitch, c1, c2); } -- cgit v1.2.3