AGS: Fix font outlines not drawing correctly

This commit is contained in:
Paul Gilbert 2021-08-25 21:31:40 -07:00
parent e6db9ded56
commit 122acc39b5
5 changed files with 42 additions and 5 deletions

View File

@ -65,14 +65,33 @@ size_t alfont_text_height(ALFONT_FONT *font) {
return font->_size; return font->_size;
} }
void alfont_textout(BITMAP *bmp, ALFONT_FONT *font, const char *text, int x, int y, uint32 color) { void alfont_textout(BITMAP *bmp, ALFONT_FONT *font, ALFONT_FONT *refFont, const char *text, int x, int y, uint32 color) {
// Note: the original does not use antialiasing when drawing on 8 bit bmp // Note: the original does not use antialiasing when drawing on 8 bit bmp
// if (bitmap_color_depth(bmp) > 8) do not use AA in getFont()... // if (bitmap_color_depth(bmp) > 8) do not use AA in getFont()...
// The original alfont changes the y based on the font height and ascent. // The original alfont changes the y based on the font height and ascent.
y += (font->_size - font->getFont()->getFontAscent()); y += (font->_size - font->getFont()->getFontAscent());
Graphics::ManagedSurface &surf = **bmp; Graphics::ManagedSurface &surf = **bmp;
font->getFont()->drawString(&surf, text, x, y, bmp->w - x, Graphics::Font *fnt = font->getFont();
(color == surf.getTransparentColor()) ? color - 1 : color); uint32 col = (color == surf.getTransparentColor()) ? color - 1 : color;
if (!refFont) {
// Standard string draw
fnt->drawString(&surf, text, x, y, bmp->w - x, col);
} else {
// Drawing an outline prior to standard font drawing on top.
// We use the font's character widths to ensure the two match up
refFont->_size = font->_size;
Graphics::Font *srcFnt = refFont->getFont();
for (int w = bmp->w - x; *text && w > 0; ++text) {
fnt->drawChar(&surf, *text, x, y, col);
int charWidth = srcFnt->getCharWidth(*text);
x += charWidth;
w -= charWidth;
}
}
} }
void alfont_set_font_size(ALFONT_FONT *font, int size) { void alfont_set_font_size(ALFONT_FONT *font, int size) {

View File

@ -55,7 +55,7 @@ extern void alfont_destroy_font(ALFONT_FONT *font);
extern size_t alfont_text_length(ALFONT_FONT *font, const char *text); extern size_t alfont_text_length(ALFONT_FONT *font, const char *text);
extern size_t alfont_text_height(ALFONT_FONT *font); extern size_t alfont_text_height(ALFONT_FONT *font);
extern void alfont_textout(BITMAP *bmp, ALFONT_FONT *font, const char *text, int x, int y, uint32 color); extern void alfont_textout(BITMAP *bmp, ALFONT_FONT *font, ALFONT_FONT *refFont, const char *text, int x, int y, uint32 color);
extern const char *alfont_get_name(ALFONT_FONT *font); extern const char *alfont_get_name(ALFONT_FONT *font);
extern void alfont_set_font_size(ALFONT_FONT *font, int size); extern void alfont_set_font_size(ALFONT_FONT *font, int size);

View File

@ -138,6 +138,15 @@ int get_font_outline(size_t font_number) {
return _GP(fonts)[font_number].Info.Outline; return _GP(fonts)[font_number].Info.Outline;
} }
int get_outline_font(size_t font_number) {
for (size_t fontNum = 0; fontNum < _GP(fonts).size(); ++fontNum) {
if (_GP(fonts)[fontNum].Info.Outline == (int)font_number)
return fontNum;
}
return FONT_OUTLINE_NONE;
}
void set_font_outline(size_t font_number, int outline_type) { void set_font_outline(size_t font_number, int outline_type) {
if (font_number >= _GP(fonts).size()) if (font_number >= _GP(fonts).size())
return; return;

View File

@ -84,6 +84,7 @@ int getfontlinespacing(size_t fontNumber);
// Get is font is meant to use default line spacing // Get is font is meant to use default line spacing
bool use_default_linespacing(size_t fontNumber); bool use_default_linespacing(size_t fontNumber);
int get_font_outline(size_t font_number); int get_font_outline(size_t font_number);
int get_outline_font(size_t font_number);
void set_font_outline(size_t font_number, int outline_type); void set_font_outline(size_t font_number, int outline_type);
// Outputs a single line of text on the defined position on bitmap, using defined font, color and parameters // Outputs a single line of text on the defined position on bitmap, using defined font, color and parameters
int getfontlinespacing(size_t fontNumber); int getfontlinespacing(size_t fontNumber);

View File

@ -68,8 +68,16 @@ void TTFFontRenderer::RenderText(const char *text, int fontNumber, BITMAP *desti
if (y > destination->cb) // optimisation if (y > destination->cb) // optimisation
return; return;
int srcFontNum = get_outline_font(fontNumber);
ALFONT_FONT *srcFont = nullptr;
if (srcFontNum != FONT_OUTLINE_NONE) {
srcFont = _fontData[srcFontNum].AlFont;
assert(srcFont);
}
// Y - 1 because it seems to get drawn down a bit // Y - 1 because it seems to get drawn down a bit
alfont_textout(destination, _fontData[fontNumber].AlFont, text, x, y - 1, colour); alfont_textout(destination, _fontData[fontNumber].AlFont,
srcFont, text, x, y - 1, colour);
} }
bool TTFFontRenderer::LoadFromDisk(int fontNumber, int fontSize) { bool TTFFontRenderer::LoadFromDisk(int fontNumber, int fontSize) {