SCUMM: Implement correct behavior for old style text overflow
This commit is contained in:
parent
d3f756eedc
commit
47270487b6
2 changed files with 32 additions and 16 deletions
|
@ -1986,16 +1986,44 @@ int CharsetRendererV7::draw2byte(byte *buffer, Common::Rect &clipRect, int x, in
|
|||
}
|
||||
|
||||
int CharsetRendererV7::drawChar(byte *buffer, Common::Rect &clipRect, int x, int y, int pitch, int16 col, TextStyleFlags flags, byte chr) {
|
||||
// I am aware of not doing anything with the clipRect here, but I currently see no need to upgrade the old rendering with that.
|
||||
if (!prepareDraw(chr))
|
||||
return 0;
|
||||
|
||||
_width = getCharWidth(chr);
|
||||
|
||||
if (_direction < 0)
|
||||
x -= _width;
|
||||
|
||||
int width = MIN(_origWidth, clipRect.right - x);
|
||||
int height = MIN(_origHeight, clipRect.bottom - y);
|
||||
|
||||
_vm->_charsetColorMap[1] = col;
|
||||
VirtScreen &vs = _vm->_virtscr[kMainVirtScreen];
|
||||
drawBitsN(vs, buffer + (y + _offsY) * vs.pitch + x, _charPtr, *_fontPtr, y, _origWidth, _origHeight);
|
||||
return _direction * _width;
|
||||
byte *cmap = _vm->_charsetColorMap;
|
||||
const byte *src = _charPtr;
|
||||
byte *dst = buffer + (y + _offsY) * pitch + x;
|
||||
uint8 bpp = *_fontPtr;
|
||||
byte bits = *src++;
|
||||
byte numbits = 8;
|
||||
pitch -= _origWidth;
|
||||
|
||||
while (height--) {
|
||||
for (int dx = x; dx < x + _origWidth; ++dx) {
|
||||
byte color = (bits >> (8 - bpp)) & 0xFF;
|
||||
if (color && dx >= 0 && dx < x + width && y >= 0)
|
||||
*dst = cmap[color];
|
||||
dst++;
|
||||
bits <<= bpp;
|
||||
numbits -= bpp;
|
||||
if (numbits == 0) {
|
||||
bits = *src++;
|
||||
numbits = 8;
|
||||
}
|
||||
}
|
||||
dst += pitch;
|
||||
++y;
|
||||
}
|
||||
|
||||
return _direction * width;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -217,18 +217,6 @@ void TextRenderer_v7::drawString(const char *str, byte *buffer, Common::Rect &cl
|
|||
// with kStyleAlignLeft flag).
|
||||
xpos = x - _direction * width;
|
||||
|
||||
if (!_newStyle) {
|
||||
int amax = _screenWidth - width;
|
||||
int amin = (_direction == 1) ? clipRect.left : clipRect.left + width;
|
||||
// Full Throttle has several lines which can fail the amin <= amax assertion in our CLIP()
|
||||
// function; this is because said lines have a width higher than _screenWidth.
|
||||
// Doing this restores the correct and accurate behaviour for those lines.
|
||||
if (amin > amax) {
|
||||
amax = amin;
|
||||
}
|
||||
xpos = CLIP<int>(xpos, amin, amax);
|
||||
}
|
||||
|
||||
drawSubstring(str + lineStart, len, buffer, clipRect, xpos, y, pitch, col, flags);
|
||||
y += height;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue