mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-23 12:44:02 +00:00
TOON: Fix the bottom pixels of text being cut off
It's a dirty rect problem. The computeSize() function needs to take into consideration that the glyph may be offset, so it's not enough to just look at its size. For now, I'm assuming that this is only a problem with characters that stick out below the base line, so that's all this patch tries to fix. Let's see if that's enough.
This commit is contained in:
parent
bce549f42a
commit
e8c704a025
@ -271,6 +271,18 @@ void Animation::applyPalette(int32 offset, int32 srcOffset, int32 numEntries) {
|
||||
_vm->setPaletteEntries(_palette + srcOffset, offset, numEntries);
|
||||
}
|
||||
|
||||
Common::Rect Animation::getFrameRect(int32 frame) {
|
||||
debugC(4, kDebugAnim, "getFrameRect(%d)", frame);
|
||||
if ((frame < 0) || (frame >= _numFrames)) {
|
||||
return Common::Rect();
|
||||
}
|
||||
|
||||
if (_frames[frame]._ref != -1)
|
||||
frame = _frames[frame]._ref;
|
||||
|
||||
return Common::Rect(_frames[frame]._x1, _frames[frame]._y1, _frames[frame]._x2, _frames[frame]._y2);
|
||||
}
|
||||
|
||||
int32 Animation::getFrameWidth(int32 frame) {
|
||||
debugC(4, kDebugAnim, "getFrameWidth(%d)", frame);
|
||||
if ((frame < 0) || (frame >= _numFrames))
|
||||
|
@ -68,6 +68,7 @@ public:
|
||||
void drawFrameWithMaskAndScale(Graphics::Surface &surface, int32 frame, int32 xx, int32 yy, int32 zz, Picture *mask, int32 scale);
|
||||
void drawStrip(int32 offset = 0);
|
||||
void applyPalette(int32 offset, int32 srcOffset, int32 numEntries);
|
||||
Common::Rect getFrameRect(int32 frame);
|
||||
int32 getFrameWidth(int32 frame);
|
||||
int32 getFrameHeight(int32 frame);
|
||||
int32 getWidth() const;
|
||||
|
@ -21,6 +21,7 @@
|
||||
*/
|
||||
|
||||
#include "common/debug.h"
|
||||
#include "common/rect.h"
|
||||
|
||||
#include "toon/font.h"
|
||||
|
||||
@ -80,7 +81,7 @@ void FontRenderer::renderText(int32 x, int32 y, Common::String origText, int32 m
|
||||
x -= xx / 2;
|
||||
}
|
||||
|
||||
_vm->addDirtyRect(x, y, x + xx + 2, y + yy);
|
||||
_vm->addDirtyRect(x, y, x + xx, y + yy);
|
||||
|
||||
int32 curX = x;
|
||||
int32 curY = y;
|
||||
@ -110,6 +111,7 @@ void FontRenderer::computeSize(Common::String origText, int32 *retX, int32 *retY
|
||||
int32 lineHeight = 0;
|
||||
int32 totalHeight = 0;
|
||||
int32 totalWidth = 0;
|
||||
int32 lastLineHeight = 0;
|
||||
|
||||
const byte *text = (const byte *)origText.c_str();
|
||||
while (*text) {
|
||||
@ -122,17 +124,25 @@ void FontRenderer::computeSize(Common::String origText, int32 *retX, int32 *retY
|
||||
totalHeight += lineHeight;
|
||||
lineHeight = 0;
|
||||
lineWidth = 0;
|
||||
lastLineHeight = 0;
|
||||
} else {
|
||||
curChar = textToFont(curChar);
|
||||
int32 charWidth = _currentFont->getFrameWidth(curChar) - 1;
|
||||
int32 charHeight = _currentFont->getFrameHeight(curChar);
|
||||
lineWidth += charWidth;
|
||||
lineHeight = MAX(lineHeight, charHeight);
|
||||
|
||||
// The character may be offset, so the height doesn't
|
||||
// really tell how far it will stick out. For now,
|
||||
// assume we only need to take the lower bound into
|
||||
// consideration.
|
||||
Common::Rect charRect = _currentFont->getFrameRect(curChar);
|
||||
lastLineHeight = MAX<int32>(lastLineHeight, charRect.bottom);
|
||||
}
|
||||
text++;
|
||||
}
|
||||
|
||||
totalHeight += lineHeight;
|
||||
totalHeight += lastLineHeight;
|
||||
totalWidth = MAX(totalWidth, lineWidth);
|
||||
|
||||
*retX = totalWidth;
|
||||
|
Loading…
x
Reference in New Issue
Block a user