based on my findings for guifont, I changed string.cpp to read the char width table for OLD256 games! yippi! some more code cleanup, and marked two struct values as 'to be removed when savegame format changes'

svn-id: r4978
This commit is contained in:
Max Horn 2002-09-19 23:49:38 +00:00
parent f838473c25
commit fcfc72296c
4 changed files with 45 additions and 87 deletions

View File

@ -116,7 +116,7 @@ int main(int argc, char *argv[])
strcat(scummhome, "\\");
strcat(scummhome, DEFAULT_CONFIG_FILE);
#else
strcpy(scummhome,DEFAULT_CONFIG_FILE);
strcpy(scummhome, DEFAULT_CONFIG_FILE);
#endif
#endif

View File

@ -91,7 +91,7 @@ public:
uint speedx, speedy;
byte frame;
byte walkbox;
byte mask; // This field is *NOT* used anymore, only kept around to make saveload.cpp happy
byte mask; // FIXME: This field is *NOT* used - remove next time save game format changes
byte animProgress, animSpeed;
int16 new_1, new_2;
uint16 talk_script, walk_script;

View File

@ -197,7 +197,7 @@ struct CharsetRenderer {
int _bufPos;
byte _unk12, _disableOffsX;
byte *_ptr;
byte *_ptr; // FIXME: This field is *NOT* used - remove next time save game format changes
byte _unk2, _bpp;
byte _invNumBits;
uint32 _charOffs;
@ -220,7 +220,7 @@ struct CharsetRenderer {
void drawBits();
void printChar(int chr);
void printCharOld(int chr);
int getSpacing(char chr);
int getSpacing(char chr, byte *charset);
int getStringWidth(int a, byte *str, int pos);
void addLinebreaks(int a, byte *str, int pos, int maxwidth);
};

View File

@ -28,7 +28,7 @@
int CharsetRenderer::getStringWidth(int arg, byte *text, int pos)
{
byte *ptr;
int width, offs, w;
int width;
byte chr;
width = 1;
@ -69,19 +69,7 @@ int CharsetRenderer::getStringWidth(int arg, byte *text, int pos)
continue;
}
}
if (_vm->_features & GF_OLD256) {
width += getSpacing(chr);
} else {
offs = READ_LE_UINT32(ptr + chr * 4 + 4);
if (offs) {
if (ptr[offs + 2] >= 0x80) {
w = ptr[offs + 2] - 0x100;
} else {
w = ptr[offs + 2];
}
width += ptr[offs] + w;
}
}
width += getSpacing(chr, ptr);
}
return width;
}
@ -90,7 +78,6 @@ void CharsetRenderer::addLinebreaks(int a, byte *str, int pos, int maxwidth)
{
int lastspace = -1;
int curw = 1;
int offs, w;
byte *ptr;
byte chr;
@ -138,19 +125,7 @@ void CharsetRenderer::addLinebreaks(int a, byte *str, int pos, int maxwidth)
if (chr == ' ')
lastspace = pos - 1;
if (_vm->_features & GF_OLD256) {
curw += getSpacing(chr);
} else {
offs = READ_LE_UINT32(ptr + chr * 4 + 4);
if (offs) {
if (ptr[offs + 2] >= 0x80) {
w = ptr[offs + 2] - 0x100;
} else {
w = ptr[offs + 2];
}
curw += w + ptr[offs];
}
}
curw += getSpacing(chr, ptr);
if (lastspace == -1)
continue;
if (curw > maxwidth) {
@ -431,7 +406,11 @@ void Scumm::CHARSET_1()
buffer += 2;
break;
case 14: {
int oldy = getResourceAddress(rtCharset, charset._curId)[30];
int oldy;
if (_features & GF_SMALL_HEADER)
oldy = getResourceAddress(rtCharset, charset._curId)[18];
else
oldy = getResourceAddress(rtCharset, charset._curId)[30];
charset._curId = *buffer++;
buffer += 2;
@ -440,7 +419,10 @@ void Scumm::CHARSET_1()
charset._colorMap[i] = _charsetData[charset._curId][i - 12];
else
charset._colorMap[i] = _charsetData[charset._curId][i];
charset._ypos2 -= getResourceAddress(rtCharset, charset._curId)[30] - oldy;
if (_features & GF_SMALL_HEADER)
charset._ypos2 -= getResourceAddress(rtCharset, charset._curId)[18] - oldy;
else
charset._ypos2 -= getResourceAddress(rtCharset, charset._curId)[30] - oldy;
break;
}
default:
@ -828,6 +810,10 @@ void CharsetRenderer::printCharOld(int chr)
if (chr == '@')
return;
byte *ptr = _vm->getResourceAddress(rtCharset, _curId) + 29;
if (_vm->_features & GF_SMALL_HEADER)
ptr -= 12;
if (_unk12) {
_strLeft = _left;
_strTop = _top;
@ -851,7 +837,8 @@ void CharsetRenderer::printCharOld(int chr)
}
}
_left += getSpacing(chr);
// FIXME
_left += getSpacing(chr, ptr);
if (_left > _strRight)
_strRight = _left;
@ -868,29 +855,30 @@ void CharsetRenderer::printChar(int chr)
VirtScreen *vs;
_vm->checkRange(_vm->_maxCharsets - 1, 1, _curId, "Printing with bad charset %d");
if ((vs = _vm->findVirtScreen(_top)) == NULL)
return;
if (chr == '@')
return;
_ptr = _vm->getResourceAddress(rtCharset, _curId) + 29;
byte *ptr = _vm->getResourceAddress(rtCharset, _curId) + 29;
if (_vm->_features & GF_SMALL_HEADER)
_ptr -= 12;
ptr -= 12;
_bpp = _unk2 = *_ptr;
_bpp = _unk2 = *ptr;
_invNumBits = 8 - _bpp;
_bitMask = 0xFF << _invNumBits;
_colorMap[1] = _color;
_charOffs = READ_LE_UINT32(_ptr + chr * 4 + 4);
_charOffs = READ_LE_UINT32(ptr + chr * 4 + 4);
if (!_charOffs)
return;
assert(_charOffs < 0x10000);
_charPtr = _ptr + _charOffs;
_charPtr = ptr + _charOffs;
_width = _charPtr[0];
_height = _charPtr[1];
@ -950,23 +938,14 @@ void CharsetRenderer::printChar(int chr)
_vm->updateDirtyRect(vs->number, _left, right, _drawTop, _bottom, 0);
#if defined(OLD)
if (vs->number == 0)
_hasMask = true;
#else
if (vs->number != 0)
_blitAlso = false;
if (vs->number == 0 && _blitAlso == 0)
_hasMask = true;
#endif
_dest_ptr = _backbuff_ptr = vs->screenPtr + vs->xstart + _drawTop * _vm->_realWidth + _left;
#if !defined(OLD)
if (_blitAlso) {
#else
if (1) {
#endif
_dest_ptr = _bgbak_ptr = _vm->getResourceAddress(rtBuffer, vs->number + 5)
+ vs->xstart + _drawTop * _vm->_realWidth + _left;
}
@ -979,10 +958,8 @@ void CharsetRenderer::printChar(int chr)
drawBits();
#if !defined(OLD)
if (_blitAlso)
_vm->blit(_backbuff_ptr, _bgbak_ptr, _width, _height);
#endif
_left += _width;
if (_left > _strRight)
@ -1042,44 +1019,25 @@ void CharsetRenderer::drawBits()
}
// do spacing for variable width old-style font
int CharsetRenderer::getSpacing(char chr)
int CharsetRenderer::getSpacing(char chr, byte *ptr)
{
int space;
if (_curId == 1) {
switch (chr) {
case '.':
case ':':
case ';':
case 'i':
case '\'':
case 'I':
case '!':
space = 2;
break;
case 'l':
space = 3;
break;
case ' ':
space = 4;
break;
case '(':
case ')':
space = 5;
break;
case 'W':
case 'w':
case 'N':
case 'M':
case 'm':
space = 8;
break;
default:
space = 6;
int spacing;
if (_vm->_features & GF_OLD256) {
spacing = *(ptr - 11 + chr);
} else {
int offs = READ_LE_UINT32(ptr + chr * 4 + 4);
if (offs) {
spacing = ptr[offs];
if (ptr[offs + 2] >= 0x80) {
spacing += ptr[offs + 2] - 0x100;
} else {
spacing += ptr[offs + 2];
}
}
} else
space = 7;
return space;
}
return spacing;
}
void Scumm::loadLanguageBundle() {