aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorFlorian Kagerer2010-11-05 00:36:23 +0000
committerFlorian Kagerer2010-11-05 00:36:23 +0000
commit206971d16b56ff37a6a81ff85a1b488fdc60c627 (patch)
tree297c170bace8de89f30a5065f2a3654998ec59a2 /engines
parent8c997e26088481340927a779d16d2eb482c14293 (diff)
downloadscummvm-rg350-206971d16b56ff37a6a81ff85a1b488fdc60c627.tar.gz
scummvm-rg350-206971d16b56ff37a6a81ff85a1b488fdc60c627.tar.bz2
scummvm-rg350-206971d16b56ff37a6a81ff85a1b488fdc60c627.zip
SCUMM/FM-TOWNS JAPANESE: fix out of bounds text drawing
(could cause invalid memory access in MI1) svn-id: r54079
Diffstat (limited to 'engines')
-rw-r--r--engines/scumm/charset.cpp26
-rw-r--r--engines/scumm/charset.h8
-rw-r--r--engines/scumm/gfx.cpp2
3 files changed, 15 insertions, 21 deletions
diff --git a/engines/scumm/charset.cpp b/engines/scumm/charset.cpp
index e75a45212e..8d7f9c9e9f 100644
--- a/engines/scumm/charset.cpp
+++ b/engines/scumm/charset.cpp
@@ -773,13 +773,13 @@ void CharsetRendererV3::printChar(int chr, bool ignoreCharsetMask) {
if (charPtr)
drawBits1(*vs, dst, charPtr, drawTop, origWidth, origHeight, vs->bytesPerPixel);
else if (_vm->_cjkFont)
- _vm->_cjkFont->drawChar(dst, chr, vs->pitch, vs->bytesPerPixel, _color, _shadowColor);
+ _vm->_cjkFont->drawChar(vs, chr, _left, drawTop, _color, _shadowColor);
} else {
dst = (byte *)_vm->_textSurface.getBasePtr(_left * _vm->_textSurfaceMultiplier, _top * _vm->_textSurfaceMultiplier);
if (charPtr)
drawBits1(_vm->_textSurface, dst, charPtr, drawTop, origWidth, origHeight, _vm->_textSurface.bytesPerPixel, (_vm->_textSurfaceMultiplier == 2 && !is2byte));
else if (_vm->_cjkFont)
- _vm->_cjkFont->drawChar(dst, chr, _vm->_textSurface.pitch, vs->bytesPerPixel, _color, _shadowColor);
+ _vm->_cjkFont->drawChar(_vm->_textSurface, chr, _left * _vm->_textSurfaceMultiplier, _top * _vm->_textSurfaceMultiplier, _color, _shadowColor);
if (is2byte)
origWidth /= _vm->_textSurfaceMultiplier;
}
@@ -799,17 +799,14 @@ void CharsetRendererV3::printChar(int chr, bool ignoreCharsetMask) {
_str.bottom = _top + height / _vm->_textSurfaceMultiplier;
}
-void CharsetRendererV3::drawChar(int chr, const Graphics::Surface &s, int x, int y) {
+void CharsetRendererV3::drawChar(int chr, Graphics::Surface &s, int x, int y) {
const byte *charPtr;
byte *dst;
int width, height;
int is2byte = (chr >= 0x80 && _vm->_useCJKMode) ? 1 : 0;
if (is2byte) {
if (_vm->_game.platform == Common::kPlatformFMTowns) {
- width = _vm->_cjkFont->getCharWidth(chr);
- height = _vm->_cjkFont->getFontHeight();
- dst = (byte *)s.pixels + y * s.pitch + x;
- _vm->_cjkFont->drawChar(dst, chr, s.pitch, s.bytesPerPixel, _color, _shadowColor);
+ _vm->_cjkFont->drawChar(s, chr, x * _vm->_textSurfaceMultiplier, y * _vm->_textSurfaceMultiplier, _color, _shadowColor);
return;
} else {
charPtr = _vm->get2byteCharPtr(chr);
@@ -1079,9 +1076,9 @@ void CharsetRendererClassic::printCharIntern(bool is2byte, const byte *charPtr,
drawTop = _top - _vm->_screenTop;
}
- if (!charPtr && _vm->_cjkFont)
- _vm->_cjkFont->drawChar(dstPtr, _vm->_cjkChar, dstSurface.pitch, dstSurface.bytesPerPixel, _vm->_townsCharsetColorMap[1], _shadowColor);
- else if (is2byte) {
+ if (!charPtr && _vm->_cjkFont) {
+ _vm->_cjkFont->drawChar(dstSurface, _vm->_cjkChar, _left * _vm->_textSurfaceMultiplier, (_top - _vm->_screenTop) * _vm->_textSurfaceMultiplier, _vm->_townsCharsetColorMap[1], _shadowColor);
+ } else if (is2byte) {
drawBits1(dstSurface, dstPtr, charPtr, drawTop, origWidth, origHeight, dstSurface.bytesPerPixel);
} else {
drawBitsN(dstSurface, dstPtr, charPtr, *_fontPtr, drawTop, origWidth, origHeight, _vm->_textSurfaceMultiplier == 2);
@@ -1124,7 +1121,7 @@ void CharsetRendererClassic::printCharIntern(bool is2byte, const byte *charPtr,
}
}
-void CharsetRendererClassic::drawChar(int chr, const Graphics::Surface &s, int x, int y) {
+void CharsetRendererClassic::drawChar(int chr, Graphics::Surface &s, int x, int y) {
const byte *charPtr;
byte *dst;
int width, height;
@@ -1133,10 +1130,7 @@ void CharsetRendererClassic::drawChar(int chr, const Graphics::Surface &s, int x
if (is2byte) {
enableShadow(true);
if (_vm->_game.platform == Common::kPlatformFMTowns) {
- width = _vm->_cjkFont->getCharWidth(chr);
- height = _vm->_cjkFont->getFontHeight();
- dst = (byte *)s.pixels + y * s.pitch + x;
- _vm->_cjkFont->drawChar(dst, chr, s.pitch, s.bytesPerPixel, _color, _shadowColor);
+ _vm->_cjkFont->drawChar(s, chr, x * _vm->_textSurfaceMultiplier, y * _vm->_textSurfaceMultiplier, _color, _shadowColor);
return;
} else {
charPtr = _vm->get2byteCharPtr(chr);
@@ -1525,7 +1519,7 @@ void CharsetRendererNES::printChar(int chr, bool ignoreCharsetMask) {
_str.bottom = _top + height;
}
-void CharsetRendererNES::drawChar(int chr, const Graphics::Surface &s, int x, int y) {
+void CharsetRendererNES::drawChar(int chr, Graphics::Surface &s, int x, int y) {
byte *charPtr, *dst;
int width, height;
diff --git a/engines/scumm/charset.h b/engines/scumm/charset.h
index 991ea2c8ad..4b2e053c6d 100644
--- a/engines/scumm/charset.h
+++ b/engines/scumm/charset.h
@@ -75,7 +75,7 @@ public:
virtual ~CharsetRenderer();
virtual void printChar(int chr, bool ignoreCharsetMask) = 0;
- virtual void drawChar(int chr, const Graphics::Surface &s, int x, int y) {}
+ virtual void drawChar(int chr, Graphics::Surface &s, int x, int y) {}
int getStringWidth(int a, const byte *str);
void addLinebreaks(int a, byte *str, int pos, int maxwidth);
@@ -134,7 +134,7 @@ public:
CharsetRendererClassic(ScummEngine *vm) : CharsetRendererCommon(vm) {}
void printChar(int chr, bool ignoreCharsetMask);
- void drawChar(int chr, const Graphics::Surface &s, int x, int y);
+ void drawChar(int chr, Graphics::Surface &s, int x, int y);
int getCharWidth(uint16 chr);
@@ -155,7 +155,7 @@ public:
void setCurID(int32 id) {}
void printChar(int chr, bool ignoreCharsetMask);
- void drawChar(int chr, const Graphics::Surface &s, int x, int y);
+ void drawChar(int chr, Graphics::Surface &s, int x, int y);
int getFontHeight() { return 8; }
int getCharWidth(uint16 chr) { return 8; }
@@ -169,7 +169,7 @@ public:
CharsetRendererV3(ScummEngine *vm) : CharsetRendererCommon(vm) {}
void printChar(int chr, bool ignoreCharsetMask);
- void drawChar(int chr, const Graphics::Surface &s, int x, int y);
+ void drawChar(int chr, Graphics::Surface &s, int x, int y);
void setCurID(int32 id);
void setColor(byte color);
int getCharWidth(uint16 chr);
diff --git a/engines/scumm/gfx.cpp b/engines/scumm/gfx.cpp
index 8daee06a88..313e8b88c0 100644
--- a/engines/scumm/gfx.cpp
+++ b/engines/scumm/gfx.cpp
@@ -1025,7 +1025,7 @@ void ScummEngine::restoreBackground(Common::Rect rect, byte backColor) {
#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE
if (_game.platform == Common::kPlatformFMTowns && _game.id == GID_MONKEY && vs->number == kVerbVirtScreen && rect.bottom <= 154)
- rect.right = 320;
+ rect.right = 319;
#endif
markRectAsDirty(vs->number, rect, USAGE_BIT_RESTORED);