diff options
author | wonst719 | 2014-07-23 13:43:20 +0900 |
---|---|---|
committer | wonst719 | 2014-07-23 13:43:20 +0900 |
commit | 4fc58ff7ee2aa2a46a6c48c64556f916774dbfee (patch) | |
tree | f7ec2484737f2484dff5acc9a22c081e54469536 | |
parent | 50940f13ae8563e4ec4cd811267d393122c0a956 (diff) | |
download | scummvm-rg350-4fc58ff7ee2aa2a46a6c48c64556f916774dbfee.tar.gz scummvm-rg350-4fc58ff7ee2aa2a46a6c48c64556f916774dbfee.tar.bz2 scummvm-rg350-4fc58ff7ee2aa2a46a6c48c64556f916774dbfee.zip |
SCUMM: Fix non-Towns CJK text rendering
-rw-r--r-- | engines/scumm/charset.cpp | 34 | ||||
-rw-r--r-- | engines/scumm/charset.h | 19 |
2 files changed, 43 insertions, 10 deletions
diff --git a/engines/scumm/charset.cpp b/engines/scumm/charset.cpp index 185ebbce6e..e76f0761e8 100644 --- a/engines/scumm/charset.cpp +++ b/engines/scumm/charset.cpp @@ -507,12 +507,12 @@ int CharsetRendererV3::getCharWidth(uint16 chr) { return spacing; } -void CharsetRendererV3::enableShadow(bool enable) { +void CharsetRendererPC::enableShadow(bool enable) { _shadowColor = 0; _shadowMode = enable; } -void CharsetRendererV3::drawBits1(Graphics::Surface &dest, int x, int y, const byte *src, int drawTop, int width, int height) { +void CharsetRendererPC::drawBits1(Graphics::Surface &dest, int x, int y, const byte *src, int drawTop, int width, int height) { byte *dst = (byte *)dest.getBasePtr(x, y); byte bits = 0; @@ -844,7 +844,10 @@ void CharsetRendererClassic::printCharIntern(bool is2byte, const byte *charPtr, drawTop = _top - _vm->_screenTop; } - drawBitsN(dstSurface, dstPtr, charPtr, *_fontPtr, drawTop, origWidth, origHeight); + if (is2byte && _vm->_game.platform != Common::kPlatformFMTowns) + drawBits1(dstSurface, _left, drawTop, charPtr, drawTop, origWidth, origHeight); + else + drawBitsN(dstSurface, dstPtr, charPtr, *_fontPtr, drawTop, origWidth, origHeight); if (_blitAlso && vs->hasTwoBuffers) { // FIXME: Revisiting this code, I think the _blitAlso mode is likely broken @@ -884,6 +887,23 @@ void CharsetRendererClassic::printCharIntern(bool is2byte, const byte *charPtr, } bool CharsetRendererClassic::prepareDraw(uint16 chr) { + bool is2byte = (chr >= 256 && _vm->_useCJKMode); + if (is2byte) { + enableShadow(true); + + _charPtr = _vm->get2byteCharPtr(chr); + _width = _origWidth = _vm->_2byteWidth; + _height = _origHeight = _vm->_2byteHeight; + _offsX = _offsY = 0; + + if (_shadowMode) { + _width++; + _height++; + } + + return true; + } + uint32 charOffs = READ_LE_UINT32(_fontPtr + chr * 4 + 4); assert(charOffs < 0x14000); if (!charOffs) @@ -908,8 +928,14 @@ bool CharsetRendererClassic::prepareDraw(uint16 chr) { void CharsetRendererClassic::drawChar(int chr, Graphics::Surface &s, int x, int y) { if (!prepareDraw(chr)) return; + byte *dst = (byte *)s.getBasePtr(x, y); - drawBitsN(s, dst, _charPtr, *_fontPtr, y, _width, _height); + + bool is2byte = (_vm->_useCJKMode && chr >= 256); + if (is2byte) + drawBits1(s, x, y, _charPtr, y, _width, _height); + else + drawBitsN(s, dst, _charPtr, *_fontPtr, y, _width, _height); } void CharsetRendererClassic::drawBitsN(const Graphics::Surface &s, byte *dst, const byte *src, byte bpp, int drawTop, int width, int height) { diff --git a/engines/scumm/charset.h b/engines/scumm/charset.h index 5a9977b7d6..1edab6ee0b 100644 --- a/engines/scumm/charset.h +++ b/engines/scumm/charset.h @@ -110,7 +110,16 @@ public: virtual int getFontHeight(); }; -class CharsetRendererClassic : public CharsetRendererCommon { +class CharsetRendererPC : public CharsetRendererCommon { +protected: + virtual void enableShadow(bool enable); + virtual void drawBits1(Graphics::Surface &dest, int x, int y, const byte *src, int drawTop, int width, int height); + +public: + CharsetRendererPC(ScummEngine *vm) : CharsetRendererCommon(vm) { } +}; + +class CharsetRendererClassic : public CharsetRendererPC { protected: virtual void drawBitsN(const Graphics::Surface &s, byte *dst, const byte *src, byte bpp, int drawTop, int width, int height); void printCharIntern(bool is2byte, const byte *charPtr, int origWidth, int origHeight, int width, int height, VirtScreen *vs, bool ignoreCharsetMask); @@ -124,7 +133,7 @@ protected: VirtScreenNumber _drawScreen; public: - CharsetRendererClassic(ScummEngine *vm) : CharsetRendererCommon(vm) {} + CharsetRendererClassic(ScummEngine *vm) : CharsetRendererPC(vm) {} void printChar(int chr, bool ignoreCharsetMask); void drawChar(int chr, Graphics::Surface &s, int x, int y); @@ -170,10 +179,8 @@ public: int getCharWidth(uint16 chr) { return 8; } }; -class CharsetRendererV3 : public CharsetRendererCommon { +class CharsetRendererV3 : public CharsetRendererPC { protected: - virtual void enableShadow(bool enable); - virtual void drawBits1(Graphics::Surface &dest, int x, int y, const byte *src, int drawTop, int width, int height); virtual int getDrawWidthIntern(uint16 chr); virtual int getDrawHeightIntern(uint16 chr); virtual void setDrawCharIntern(uint16 chr) {} @@ -181,7 +188,7 @@ protected: const byte *_widthTable; public: - CharsetRendererV3(ScummEngine *vm) : CharsetRendererCommon(vm) {} + CharsetRendererV3(ScummEngine *vm) : CharsetRendererPC(vm) {} void printChar(int chr, bool ignoreCharsetMask); void drawChar(int chr, Graphics::Surface &s, int x, int y); |