aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Sandulenko2008-04-28 15:21:36 +0000
committerEugene Sandulenko2008-04-28 15:21:36 +0000
commit0ca949db2af91c3a070e2dc95e46ba6161e6c594 (patch)
tree6b2e0599d3af07664c3695df9a346248fe9a6f90
parentfc6fe46951f999d7fc14bf4bedcce7bfe728a77d (diff)
downloadscummvm-rg350-0ca949db2af91c3a070e2dc95e46ba6161e6c594.tar.gz
scummvm-rg350-0ca949db2af91c3a070e2dc95e46ba6161e6c594.tar.bz2
scummvm-rg350-0ca949db2af91c3a070e2dc95e46ba6161e6c594.zip
Fix Kanji text positioning in DIG. Constants based on disassembly, but
it can bring some regressions to subtitles. svn-id: r31757
-rw-r--r--engines/scumm/charset.cpp10
-rw-r--r--engines/scumm/scumm.h1
-rw-r--r--engines/scumm/string.cpp23
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) {