From 0ca949db2af91c3a070e2dc95e46ba6161e6c594 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Mon, 28 Apr 2008 15:21:36 +0000 Subject: Fix Kanji text positioning in DIG. Constants based on disassembly, but it can bring some regressions to subtitles. svn-id: r31757 --- engines/scumm/charset.cpp | 10 ++++++++-- engines/scumm/scumm.h | 1 + engines/scumm/string.cpp | 23 ++++++++++++++++------- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/engines/scumm/charset.cpp b/engines/scumm/charset.cpp index bf3f7ed66e..d0a43dd519 100644 --- a/engines/scumm/charset.cpp +++ b/engines/scumm/charset.cpp @@ -49,6 +49,7 @@ void ScummEngine::loadCJKFont() { Common::File fp; _useCJKMode = false; _textSurfaceMultiplier = 1; + _newLineCharacter = 0xfe; if (_game.version <= 5 && _game.platform == Common::kPlatformFMTowns && _language == Common::JA_JPN) { // FM-TOWNS v3 / v5 Kanji int numChar = 256 * 32; @@ -95,15 +96,17 @@ void ScummEngine::loadCJKFont() { fp.seek(2, SEEK_CUR); _2byteWidth = fp.readByte(); _2byteHeight = fp.readByte(); + _newLineCharacter = 0xff; break; case Common::JA_JPN: _2byteWidth = 16; _2byteHeight = 16; + _newLineCharacter = 0xfe; break; case Common::ZH_TWN: _2byteWidth = 16; _2byteHeight = 15; - // 0xFE -> 0x21. also compared with 0x0d. perhaps a newline + _newLineCharacter = 0x21; break; default: break; @@ -352,7 +355,7 @@ int CharsetRenderer::getStringWidth(int arg, const byte *text) { int code = (_vm->_game.heversion >= 80) ? 127 : 64; while ((chr = text[pos++]) != 0) { - if (chr == '\n' || chr == '\r') + if (chr == '\n' || chr == '\r' || chr == _vm->_newLineCharacter) break; if (_vm->_game.heversion >= 72) { if (chr == code) { @@ -479,6 +482,9 @@ void CharsetRenderer::addLinebreaks(int a, byte *str, int pos, int maxwidth) { if (chr == ' ') lastspace = pos - 1; + if (chr == _vm->_newLineCharacter) + lastspace = pos - 1; + if ((chr & 0x80) && _vm->_useCJKMode) { pos++; curw += _vm->_2byteWidth; diff --git a/engines/scumm/scumm.h b/engines/scumm/scumm.h index 6e0e57c0fe..26b6aa6e2f 100644 --- a/engines/scumm/scumm.h +++ b/engines/scumm/scumm.h @@ -1199,6 +1199,7 @@ public: bool _useCJKMode; int _2byteHeight; int _2byteWidth; + byte _newLineCharacter; byte *get2byteCharPtr(int idx); protected: diff --git a/engines/scumm/string.cpp b/engines/scumm/string.cpp index 61a960b3ed..834896d021 100644 --- a/engines/scumm/string.cpp +++ b/engines/scumm/string.cpp @@ -279,6 +279,12 @@ bool ScummEngine::handleNextCharsetCode(Actor *a, int *code) { break; } c = *buffer++; + + if (c == _newLineCharacter) { + c = 13; + break; + } + switch (c) { case 1: c = 13; // new line @@ -479,13 +485,14 @@ void ScummEngine::CHARSET_1() { _string[0].ypos = _screenHeight - 40; } - if (_string[0].ypos < 1) - _string[0].ypos = 1; + if (_string[0].ypos < 10) + _string[0].ypos = 10; + + if (_string[0].xpos < 5) + _string[0].xpos = 5; + if (_string[0].xpos > _screenWidth - 10) + _string[0].xpos = _screenWidth - 10; - if (_string[0].xpos < 80) - _string[0].xpos = 80; - if (_string[0].xpos > _screenWidth - 80) - _string[0].xpos = _screenWidth - 80; } _charset->_top = _string[0].ypos + _screenTop; @@ -551,7 +558,7 @@ void ScummEngine::CHARSET_1() { if (_charset->_center) { _nextLeft -= _charset->getStringWidth(0, _charsetBuffer + _charsetBufPos) / 2; if (_nextLeft < 0) - _nextLeft = 0; + _nextLeft = _string[0].xpos; } _charset->_disableOffsX = _charset->_firstChar = !_keepText; @@ -576,6 +583,8 @@ void ScummEngine::CHARSET_1() { #endif if (_charset->_center) { _nextLeft -= _charset->getStringWidth(0, _charsetBuffer + _charsetBufPos) / 2; + if (_nextLeft < 0) + _nextLeft = _string[0].xpos; } if (_game.version == 0) { -- cgit v1.2.3