mirror of https://github.com/OpenRCT2/OpenRCT2.git
Combine text paint functions
This commit is contained in:
parent
c01bcea391
commit
d596c0139f
|
@ -0,0 +1,262 @@
|
||||||
|
#pragma region Copyright (c) 2014-2017 OpenRCT2 Developers
|
||||||
|
/*****************************************************************************
|
||||||
|
* OpenRCT2, an open source clone of Roller Coaster Tycoon 2.
|
||||||
|
*
|
||||||
|
* OpenRCT2 is the work of many authors, a full list can be found in contributors.md
|
||||||
|
* For more information, visit https://github.com/OpenRCT2/OpenRCT2
|
||||||
|
*
|
||||||
|
* OpenRCT2 is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* A full copy of the GNU General Public License can be found in licence.txt
|
||||||
|
*****************************************************************************/
|
||||||
|
#pragma endregion
|
||||||
|
|
||||||
|
#include "Text.h"
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#include "../localisation/localisation.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
static TextPaint _legacyPaint;
|
||||||
|
|
||||||
|
void drawText(rct_drawpixelinfo *dpi, float x, float y, TextPaint *paint, utf8string text);
|
||||||
|
void drawText(rct_drawpixelinfo *dpi, float x, float y, TextPaint *paint, rct_string_id format, void *args);
|
||||||
|
|
||||||
|
StaticLayout::StaticLayout(utf8string source, TextPaint paint, sint32 width)
|
||||||
|
{
|
||||||
|
_buffer = source;
|
||||||
|
_paint = paint;
|
||||||
|
|
||||||
|
sint32 fontSpriteBase;
|
||||||
|
|
||||||
|
gCurrentFontSpriteBase = paint.spriteBase;
|
||||||
|
_maxWidth = gfx_wrap_string(_buffer, width, &_lineCount, &fontSpriteBase);
|
||||||
|
_lineCount += 1;
|
||||||
|
_lineHeight = font_get_line_height(fontSpriteBase);
|
||||||
|
}
|
||||||
|
|
||||||
|
void StaticLayout::Draw(rct_drawpixelinfo *dpi, float x, float y)
|
||||||
|
{
|
||||||
|
gCurrentFontFlags = 0;
|
||||||
|
gCurrentFontSpriteBase = _paint.spriteBase;
|
||||||
|
|
||||||
|
TextPaint tempPaint = _paint;
|
||||||
|
|
||||||
|
gCurrentFontFlags = 0;
|
||||||
|
sint32 lineY = y;
|
||||||
|
sint32 lineX = x;
|
||||||
|
switch (_paint.alignment) {
|
||||||
|
case TextAlignment::LEFT:
|
||||||
|
lineX = x;
|
||||||
|
break;
|
||||||
|
case TextAlignment::CENTRE:
|
||||||
|
lineX = x + _maxWidth / 2;
|
||||||
|
break;
|
||||||
|
case TextAlignment::RIGHT:
|
||||||
|
lineX = x + _maxWidth;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
utf8 *buffer = _buffer;
|
||||||
|
for (sint32 line = 0; line < _lineCount; ++line) {
|
||||||
|
drawText(dpi, lineX, lineY, &tempPaint, buffer);
|
||||||
|
tempPaint.colour = TEXT_COLOUR_254;
|
||||||
|
buffer = get_string_end(buffer) + 1;
|
||||||
|
lineY += _lineHeight;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sint32 StaticLayout::GetHeight()
|
||||||
|
{
|
||||||
|
return _lineHeight * _lineCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
sint32 StaticLayout::GetWidth()
|
||||||
|
{
|
||||||
|
return _maxWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
sint32 StaticLayout::GetLineCount()
|
||||||
|
{
|
||||||
|
return _lineCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void drawText(rct_drawpixelinfo *dpi, float x, float y, TextPaint *paint, utf8string text)
|
||||||
|
{
|
||||||
|
|
||||||
|
sint32 width = gfx_get_string_width(text);
|
||||||
|
|
||||||
|
switch (paint->alignment) {
|
||||||
|
case TextAlignment::LEFT:
|
||||||
|
break;
|
||||||
|
case TextAlignment::CENTRE:
|
||||||
|
x -= width / 2;
|
||||||
|
break;
|
||||||
|
case TextAlignment::RIGHT:
|
||||||
|
x -= width;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ttf_draw_string(dpi, text, paint->colour, x, y);
|
||||||
|
|
||||||
|
if (paint->underlineText) {
|
||||||
|
gfx_fill_rect(dpi, x, y + 11, x + width, y + 11, text_palette[1]);
|
||||||
|
if (text_palette[2] != 0)
|
||||||
|
gfx_fill_rect(dpi, x + 1, y + 12, x + width + 1, y + 12, text_palette[2]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawText(rct_drawpixelinfo *dpi, float x, float y, TextPaint *paint, rct_string_id format, void *args)
|
||||||
|
{
|
||||||
|
|
||||||
|
utf8 buffer[256];
|
||||||
|
|
||||||
|
format_string(buffer, sizeof(buffer), format, args);
|
||||||
|
drawText(dpi, x, y, paint, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
drawTextCompat(rct_drawpixelinfo *dpi, sint32 x, sint32 y, rct_string_id format, void *args, uint8 colour,
|
||||||
|
TextAlignment alignment, bool underline = false)
|
||||||
|
{
|
||||||
|
_legacyPaint.underlineText = underline;
|
||||||
|
_legacyPaint.colour = colour;
|
||||||
|
_legacyPaint.alignment = alignment;
|
||||||
|
_legacyPaint.spriteBase = FONT_SPRITE_BASE_MEDIUM;
|
||||||
|
gCurrentFontSpriteBase = FONT_SPRITE_BASE_MEDIUM;
|
||||||
|
drawText(dpi, x, y, &_legacyPaint, format, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
drawTextEllipsisedCompat(rct_drawpixelinfo *dpi, sint32 x, sint32 y, sint32 width, rct_string_id format, void *args,
|
||||||
|
uint8 colour,
|
||||||
|
TextAlignment alignment, bool underline = false)
|
||||||
|
{
|
||||||
|
_legacyPaint.underlineText = underline;
|
||||||
|
_legacyPaint.colour = colour;
|
||||||
|
_legacyPaint.alignment = alignment;
|
||||||
|
_legacyPaint.spriteBase = FONT_SPRITE_BASE_MEDIUM;
|
||||||
|
gCurrentFontSpriteBase = FONT_SPRITE_BASE_MEDIUM;
|
||||||
|
|
||||||
|
utf8 buffer[256];
|
||||||
|
format_string(buffer, sizeof(buffer), format, args);
|
||||||
|
gfx_clip_string(buffer, width);
|
||||||
|
|
||||||
|
drawText(dpi, x, y, &_legacyPaint, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, uint8 colour, sint32 x, sint32 y)
|
||||||
|
{
|
||||||
|
_legacyPaint.underlineText = false;
|
||||||
|
_legacyPaint.colour = colour;
|
||||||
|
_legacyPaint.alignment = TextAlignment::LEFT;
|
||||||
|
_legacyPaint.spriteBase = gCurrentFontSpriteBase;
|
||||||
|
drawText(dpi, x, y, &_legacyPaint, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Basic
|
||||||
|
|
||||||
|
void gfx_draw_string_left(rct_drawpixelinfo *dpi, rct_string_id format, void *args, uint8 colour, sint32 x, sint32 y)
|
||||||
|
{
|
||||||
|
drawTextCompat(dpi, x, y, format, args, colour, TextAlignment::LEFT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gfx_draw_string_centred(rct_drawpixelinfo *dpi, rct_string_id format, sint32 x, sint32 y, uint8 colour, void *args)
|
||||||
|
{
|
||||||
|
drawTextCompat(dpi, x, y, format, args, colour, TextAlignment::CENTRE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gfx_draw_string_right(rct_drawpixelinfo *dpi, rct_string_id format, void *args, uint8 colour, sint32 x, sint32 y)
|
||||||
|
{
|
||||||
|
drawTextCompat(dpi, x, y, format, args, colour, TextAlignment::RIGHT);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Underline
|
||||||
|
|
||||||
|
void draw_string_left_underline(rct_drawpixelinfo *dpi, rct_string_id format, void *args, uint8 colour, sint32 x,
|
||||||
|
sint32 y)
|
||||||
|
{
|
||||||
|
drawTextCompat(dpi, x, y, format, args, colour, TextAlignment::LEFT, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void draw_string_centred_underline(rct_drawpixelinfo *dpi, rct_string_id format, void *args, uint8 colour, sint32 x,
|
||||||
|
sint32 y)
|
||||||
|
{
|
||||||
|
drawTextCompat(dpi, x, y, format, args, colour, TextAlignment::CENTRE, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void draw_string_right_underline(rct_drawpixelinfo *dpi, rct_string_id format, void *args, uint8 colour, sint32 x,
|
||||||
|
sint32 y)
|
||||||
|
{
|
||||||
|
drawTextCompat(dpi, x, y, format, args, colour, TextAlignment::RIGHT, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ellipsised
|
||||||
|
|
||||||
|
void gfx_draw_string_left_clipped(rct_drawpixelinfo *dpi, rct_string_id format, void *args, uint8 colour, sint32 x,
|
||||||
|
sint32 y, sint32 width)
|
||||||
|
{
|
||||||
|
drawTextEllipsisedCompat(dpi, x, y, width, format, args, colour, TextAlignment::LEFT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void gfx_draw_string_centred_clipped(rct_drawpixelinfo *dpi, rct_string_id format, void *args, uint8 colour, sint32 x,
|
||||||
|
sint32 y, sint32 width)
|
||||||
|
{
|
||||||
|
drawTextEllipsisedCompat(dpi, x, y, width, format, args, colour, TextAlignment::CENTRE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wrapping
|
||||||
|
|
||||||
|
sint32
|
||||||
|
gfx_draw_string_left_wrapped(rct_drawpixelinfo *dpi, void *args, sint32 x, sint32 y, sint32 width, rct_string_id format,
|
||||||
|
uint8 colour)
|
||||||
|
{
|
||||||
|
utf8 buffer[256];
|
||||||
|
format_string(buffer, sizeof(buffer), format, args);
|
||||||
|
|
||||||
|
_legacyPaint.underlineText = false;
|
||||||
|
_legacyPaint.colour = colour;
|
||||||
|
_legacyPaint.alignment = TextAlignment::LEFT;
|
||||||
|
_legacyPaint.spriteBase = gCurrentFontSpriteBase;
|
||||||
|
|
||||||
|
auto layout = StaticLayout(buffer, _legacyPaint, width);
|
||||||
|
layout.Draw(dpi, x, y);
|
||||||
|
|
||||||
|
return layout.GetHeight();
|
||||||
|
}
|
||||||
|
|
||||||
|
sint32 gfx_draw_string_centred_wrapped(rct_drawpixelinfo *dpi, void *args, sint32 x, sint32 y, sint32 width,
|
||||||
|
rct_string_id format, uint8 colour)
|
||||||
|
{
|
||||||
|
utf8 buffer[256];
|
||||||
|
format_string(buffer, sizeof(buffer), format, args);
|
||||||
|
|
||||||
|
if (gCurrentFontSpriteBase >= 0) {
|
||||||
|
gCurrentFontSpriteBase = FONT_SPRITE_BASE_MEDIUM;
|
||||||
|
}
|
||||||
|
|
||||||
|
_legacyPaint.underlineText = false;
|
||||||
|
_legacyPaint.colour = colour;
|
||||||
|
_legacyPaint.alignment = TextAlignment::CENTRE;
|
||||||
|
_legacyPaint.spriteBase = gCurrentFontSpriteBase;
|
||||||
|
|
||||||
|
auto layout = StaticLayout(buffer, _legacyPaint, width);
|
||||||
|
|
||||||
|
// The original tried to vertically centre the text, but used line count - 1
|
||||||
|
sint32 lineCount = layout.GetLineCount();
|
||||||
|
sint32 lineHeight = layout.GetHeight() / lineCount;
|
||||||
|
sint32 yOffset = (lineCount - 1) * lineHeight / 2;
|
||||||
|
|
||||||
|
layout.Draw(dpi, x - layout.GetWidth() / 2, y - yOffset);
|
||||||
|
|
||||||
|
return layout.GetHeight();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,55 @@
|
||||||
|
#pragma region Copyright (c) 2014-2017 OpenRCT2 Developers
|
||||||
|
/*****************************************************************************
|
||||||
|
* OpenRCT2, an open source clone of Roller Coaster Tycoon 2.
|
||||||
|
*
|
||||||
|
* OpenRCT2 is the work of many authors, a full list can be found in contributors.md
|
||||||
|
* For more information, visit https://github.com/OpenRCT2/OpenRCT2
|
||||||
|
*
|
||||||
|
* OpenRCT2 is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* A full copy of the GNU General Public License can be found in licence.txt
|
||||||
|
*****************************************************************************/
|
||||||
|
#pragma endregion
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "../common.h"
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#include "drawing.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
enum class TextAlignment
|
||||||
|
{
|
||||||
|
LEFT,
|
||||||
|
CENTRE,
|
||||||
|
RIGHT
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TextPaint
|
||||||
|
{
|
||||||
|
uint8 colour;
|
||||||
|
sint16 spriteBase;
|
||||||
|
bool underlineText;
|
||||||
|
TextAlignment alignment;
|
||||||
|
};
|
||||||
|
|
||||||
|
class StaticLayout
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
utf8string _buffer;
|
||||||
|
TextPaint _paint;
|
||||||
|
sint32 _lineCount;
|
||||||
|
sint32 _lineHeight;
|
||||||
|
sint32 _maxWidth;
|
||||||
|
|
||||||
|
public:
|
||||||
|
StaticLayout(utf8string source, TextPaint paint, sint32 width);
|
||||||
|
void Draw(rct_drawpixelinfo *dpi, float x, float y);
|
||||||
|
sint32 GetHeight();
|
||||||
|
sint32 GetWidth();
|
||||||
|
sint32 GetLineCount();
|
||||||
|
};
|
|
@ -343,28 +343,34 @@ void FASTCALL gfx_draw_sprite_palette_set_software(rct_drawpixelinfo *dpi, sint3
|
||||||
void FASTCALL gfx_draw_sprite_raw_masked_software(rct_drawpixelinfo *dpi, sint32 x, sint32 y, sint32 maskImage, sint32 colourImage);
|
void FASTCALL gfx_draw_sprite_raw_masked_software(rct_drawpixelinfo *dpi, sint32 x, sint32 y, sint32 maskImage, sint32 colourImage);
|
||||||
|
|
||||||
// string
|
// string
|
||||||
sint32 clip_text(char *buffer, sint32 width);
|
void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, uint8 colour, sint32 x, sint32 y);
|
||||||
|
|
||||||
|
void gfx_draw_string_left(rct_drawpixelinfo *dpi, rct_string_id format, void *args, uint8 colour, sint32 x, sint32 y);
|
||||||
|
void gfx_draw_string_centred(rct_drawpixelinfo *dpi, rct_string_id format, sint32 x, sint32 y, uint8 colour, void *args);
|
||||||
|
void gfx_draw_string_right(rct_drawpixelinfo *dpi, rct_string_id format, void *args, uint8 colour, sint32 x, sint32 y);
|
||||||
|
|
||||||
|
void draw_string_left_underline(rct_drawpixelinfo *dpi, rct_string_id format, void *args, uint8 colour, sint32 x, sint32 y);
|
||||||
|
void draw_string_centred_underline(rct_drawpixelinfo *dpi, rct_string_id format, void *args, uint8 colour, sint32 x, sint32 y);
|
||||||
|
void draw_string_right_underline(rct_drawpixelinfo *dpi, rct_string_id format, void *args, uint8 colour, sint32 x, sint32 y);
|
||||||
|
|
||||||
|
void gfx_draw_string_left_clipped(rct_drawpixelinfo *dpi, rct_string_id format, void *args, uint8 colour, sint32 x, sint32 y, sint32 width);
|
||||||
|
void gfx_draw_string_centred_clipped(rct_drawpixelinfo *dpi, rct_string_id format, void *args, uint8 colour, sint32 x, sint32 y, sint32 width);
|
||||||
|
|
||||||
|
sint32 gfx_draw_string_left_wrapped(rct_drawpixelinfo *dpi, void *args, sint32 x, sint32 y, sint32 width, rct_string_id format, uint8 colour);
|
||||||
|
sint32 gfx_draw_string_centred_wrapped(rct_drawpixelinfo *dpi, void *args, sint32 x, sint32 y, sint32 width, rct_string_id format, uint8 colour);
|
||||||
|
|
||||||
|
void gfx_draw_string_left_centred(rct_drawpixelinfo *dpi, rct_string_id format, void *args, sint32 colour, sint32 x, sint32 y);
|
||||||
|
void draw_string_centred_raw(rct_drawpixelinfo *dpi, sint32 x, sint32 y, sint32 numLines, char *text);
|
||||||
|
void gfx_draw_string_centred_wrapped_partial(rct_drawpixelinfo *dpi, sint32 x, sint32 y, sint32 width, sint32 colour, rct_string_id format, void *args, sint32 ticks);
|
||||||
|
void gfx_draw_string_with_y_offsets(rct_drawpixelinfo *dpi, const utf8 *text, sint32 colour, sint32 x, sint32 y, const sint8 *yOffsets, bool forceSpriteFont);
|
||||||
|
|
||||||
sint32 gfx_wrap_string(char* buffer, sint32 width, sint32* num_lines, sint32* font_height);
|
sint32 gfx_wrap_string(char* buffer, sint32 width, sint32* num_lines, sint32* font_height);
|
||||||
sint32 gfx_get_string_width(const utf8 * buffer);
|
sint32 gfx_get_string_width(const utf8 * buffer);
|
||||||
sint32 gfx_get_string_width_new_lined(char* buffer);
|
sint32 gfx_get_string_width_new_lined(char* buffer);
|
||||||
void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, sint32 colour, sint32 x, sint32 y);
|
|
||||||
void gfx_draw_string_left(rct_drawpixelinfo *dpi, rct_string_id format, void *args, sint32 colour, sint32 x, sint32 y);
|
|
||||||
void gfx_draw_string_left_clipped(rct_drawpixelinfo *dpi, rct_string_id format, void *args, sint32 colour, sint32 x, sint32 y, sint32 width);
|
|
||||||
sint32 gfx_draw_string_left_wrapped(rct_drawpixelinfo *dpi, void *args, sint32 x, sint32 y, sint32 width, rct_string_id format, sint32 colour);
|
|
||||||
void draw_string_left_underline(rct_drawpixelinfo *dpi, rct_string_id format, void *args, sint32 colour, sint32 x, sint32 y);
|
|
||||||
void gfx_draw_string_left_centred(rct_drawpixelinfo *dpi, rct_string_id format, void *args, sint32 colour, sint32 x, sint32 y);
|
|
||||||
void gfx_draw_string_centred(rct_drawpixelinfo *dpi, rct_string_id format, sint32 x, sint32 y, sint32 colour, void *args);
|
|
||||||
void gfx_draw_string_centred_clipped(rct_drawpixelinfo *dpi, rct_string_id format, void *args, sint32 colour, sint32 x, sint32 y, sint32 width);
|
|
||||||
void draw_string_centred_underline(rct_drawpixelinfo *dpi, rct_string_id format, void *args, sint32 colour, sint32 x, sint32 y);
|
|
||||||
sint32 gfx_draw_string_centred_wrapped(rct_drawpixelinfo *dpi, void *args, sint32 x, sint32 y, sint32 width, rct_string_id format, sint32 colour);
|
|
||||||
void draw_string_centred_raw(rct_drawpixelinfo *dpi, sint32 x, sint32 y, sint32 numLines, char *text);
|
|
||||||
void gfx_draw_string_right(rct_drawpixelinfo *dpi, rct_string_id format, void *args, sint32 colour, sint32 x, sint32 y);
|
|
||||||
void draw_string_right_underline(rct_drawpixelinfo *dpi, rct_string_id format, void *args, sint32 colour, sint32 x, sint32 y);
|
|
||||||
sint32 string_get_height_raw(char *buffer);
|
sint32 string_get_height_raw(char *buffer);
|
||||||
void gfx_draw_string_centred_wrapped_partial(rct_drawpixelinfo *dpi, sint32 x, sint32 y, sint32 width, sint32 colour, rct_string_id format, void *args, sint32 ticks);
|
|
||||||
void gfx_draw_string_with_y_offsets(rct_drawpixelinfo *dpi, const utf8 *text, sint32 colour, sint32 x, sint32 y, const sint8 *yOffsets, bool forceSpriteFont);
|
|
||||||
sint32 gfx_clip_string(char* buffer, sint32 width);
|
sint32 gfx_clip_string(char* buffer, sint32 width);
|
||||||
void shorten_path(utf8 *buffer, size_t bufferSize, const utf8 *path, sint32 availableWidth);
|
void shorten_path(utf8 *buffer, size_t bufferSize, const utf8 *path, sint32 availableWidth);
|
||||||
|
void ttf_draw_string(rct_drawpixelinfo *dpi, char *text, sint32 colour, sint32 x, sint32 y);
|
||||||
|
|
||||||
typedef struct paint_session paint_session;
|
typedef struct paint_session paint_session;
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,6 @@ enum {
|
||||||
};
|
};
|
||||||
|
|
||||||
static sint32 ttf_get_string_width(const utf8 *text);
|
static sint32 ttf_get_string_width(const utf8 *text);
|
||||||
static void ttf_draw_string(rct_drawpixelinfo *dpi, char *buffer, sint32 colour, sint32 x, sint32 y);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -211,202 +210,6 @@ sint32 gfx_wrap_string(utf8 *text, sint32 width, sint32 *outNumLines, sint32 *ou
|
||||||
return maxWidth == 0 ? lineWidth : maxWidth;
|
return maxWidth == 0 ? lineWidth : maxWidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Draws i formatted text string left aligned at i specified position but clips
|
|
||||||
* the text with an ellipsis if the text width exceeds the specified width.
|
|
||||||
* rct2: 0x006C1B83
|
|
||||||
* dpi (edi)
|
|
||||||
* format (bx)
|
|
||||||
* args (esi)
|
|
||||||
* colour (al)
|
|
||||||
* x (cx)
|
|
||||||
* y (dx)
|
|
||||||
* width (bp)
|
|
||||||
*/
|
|
||||||
void gfx_draw_string_left_clipped(rct_drawpixelinfo* dpi, rct_string_id format, void* args, sint32 colour, sint32 x, sint32 y, sint32 width)
|
|
||||||
{
|
|
||||||
char* buffer = gCommonStringFormatBuffer;
|
|
||||||
format_string(buffer, 256, format, args);
|
|
||||||
|
|
||||||
gCurrentFontSpriteBase = FONT_SPRITE_BASE_MEDIUM;
|
|
||||||
|
|
||||||
// Clip text - return value is not needed
|
|
||||||
gfx_clip_string(buffer, width);
|
|
||||||
|
|
||||||
gfx_draw_string(dpi, buffer, colour, x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Draws i formatted text string centred at i specified position but clips the
|
|
||||||
* text with an ellipsis if the text width exceeds the specified width.
|
|
||||||
* rct2: 0x006C1BBA
|
|
||||||
* dpi (edi)
|
|
||||||
* format (bx)
|
|
||||||
* args (esi)
|
|
||||||
* colour (al)
|
|
||||||
* x (cx)
|
|
||||||
* y (dx)
|
|
||||||
* width (bp)
|
|
||||||
*/
|
|
||||||
void gfx_draw_string_centred_clipped(rct_drawpixelinfo *dpi, rct_string_id format, void *args, sint32 colour, sint32 x, sint32 y, sint32 width)
|
|
||||||
{
|
|
||||||
char* buffer = gCommonStringFormatBuffer;
|
|
||||||
format_string(buffer, 256, format, args);
|
|
||||||
|
|
||||||
gCurrentFontSpriteBase = FONT_SPRITE_BASE_MEDIUM;
|
|
||||||
|
|
||||||
// Clip text
|
|
||||||
sint32 text_width = gfx_clip_string(buffer, width);
|
|
||||||
|
|
||||||
// Draw the text centred
|
|
||||||
if (text_width <= 0xFFFF && text_width >= 0) {
|
|
||||||
x -= (text_width - 1) / 2;
|
|
||||||
gfx_draw_string(dpi, buffer, colour, x, y);
|
|
||||||
} else {
|
|
||||||
log_warning("improper text width %d for string %s", text_width, buffer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Draws i formatted text string right aligned.
|
|
||||||
* rct2: 0x006C1BFC
|
|
||||||
* dpi (edi)
|
|
||||||
* format (bx)
|
|
||||||
* args (esi)
|
|
||||||
* colour (al)
|
|
||||||
* x (cx)
|
|
||||||
* y (dx)
|
|
||||||
*/
|
|
||||||
void gfx_draw_string_right(rct_drawpixelinfo* dpi, rct_string_id format, void* args, sint32 colour, sint32 x, sint32 y)
|
|
||||||
{
|
|
||||||
char* buffer = gCommonStringFormatBuffer;
|
|
||||||
format_string(buffer, 256, format, args);
|
|
||||||
|
|
||||||
// Measure text width
|
|
||||||
sint16 text_width = gfx_get_string_width(buffer);
|
|
||||||
|
|
||||||
// Draw the text right aligned
|
|
||||||
x -= text_width;
|
|
||||||
gfx_draw_string(dpi, buffer, colour, x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Draws i formatted text string centred at i specified position.
|
|
||||||
* rct2: 0x006C1D6C
|
|
||||||
* dpi (edi)
|
|
||||||
* format (bx)
|
|
||||||
* x (cx)
|
|
||||||
* y (dx)
|
|
||||||
* colour (al)
|
|
||||||
* args (esi)
|
|
||||||
*/
|
|
||||||
void gfx_draw_string_centred(rct_drawpixelinfo *dpi, rct_string_id format, sint32 x, sint32 y, sint32 colour, void *args)
|
|
||||||
{
|
|
||||||
gfx_draw_string_centred_wrapped(dpi, args, x, y, INT32_MAX, format, colour);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* rct2: 0x006C1E53
|
|
||||||
* dpi (edi)
|
|
||||||
* args (esi)
|
|
||||||
* x (cx)
|
|
||||||
* y (dx)
|
|
||||||
* width (bp)
|
|
||||||
* colour (al)
|
|
||||||
* format (ebx)
|
|
||||||
*/
|
|
||||||
sint32 gfx_draw_string_centred_wrapped(rct_drawpixelinfo *dpi, void *args, sint32 x, sint32 y, sint32 width, rct_string_id format, sint32 colour)
|
|
||||||
{
|
|
||||||
sint32 font_height, line_height, line_y, num_lines;
|
|
||||||
|
|
||||||
if (gCurrentFontSpriteBase >= 0) {
|
|
||||||
gCurrentFontSpriteBase = FONT_SPRITE_BASE_MEDIUM;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *buffer = gCommonStringFormatBuffer;
|
|
||||||
gfx_draw_string(dpi, "", colour, dpi->x, dpi->y);
|
|
||||||
format_string(buffer, 256, format, args);
|
|
||||||
|
|
||||||
gCurrentFontSpriteBase = FONT_SPRITE_BASE_MEDIUM;
|
|
||||||
|
|
||||||
gfx_wrap_string(buffer, width, &num_lines, &font_height);
|
|
||||||
line_height = font_get_line_height(font_height);
|
|
||||||
|
|
||||||
if (*buffer == FORMAT_OUTLINE) {
|
|
||||||
line_height = line_height + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
font_height = (line_height / 2) * num_lines;
|
|
||||||
line_y = y - font_height;
|
|
||||||
|
|
||||||
gCurrentFontFlags = 0;
|
|
||||||
|
|
||||||
for (sint32 line = 0; line <= num_lines; ++line) {
|
|
||||||
sint32 half_width = gfx_get_string_width(buffer) / 2;
|
|
||||||
gfx_draw_string(dpi, buffer, TEXT_COLOUR_254, x - half_width, line_y);
|
|
||||||
|
|
||||||
buffer = get_string_end(buffer) + 1;
|
|
||||||
line_y += line_height;
|
|
||||||
}
|
|
||||||
|
|
||||||
return line_y - y;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* rct2: 0x006C2105
|
|
||||||
* dpi (edi)
|
|
||||||
* args (esi)
|
|
||||||
* x (cx)
|
|
||||||
* y (dx)
|
|
||||||
* width (bp)
|
|
||||||
* format (bx)
|
|
||||||
* colour (al)
|
|
||||||
*/
|
|
||||||
sint32 gfx_draw_string_left_wrapped(rct_drawpixelinfo *dpi, void *args, sint32 x, sint32 y, sint32 width, rct_string_id format, sint32 colour)
|
|
||||||
{
|
|
||||||
// font height might actually be something else
|
|
||||||
sint32 fontSpriteBase, lineHeight, lineY, numLines;
|
|
||||||
|
|
||||||
gCurrentFontSpriteBase = FONT_SPRITE_BASE_MEDIUM;
|
|
||||||
|
|
||||||
char *buffer = gCommonStringFormatBuffer;
|
|
||||||
gfx_draw_string(dpi, "", colour, dpi->x, dpi->y);
|
|
||||||
format_string(buffer, 256, format, args);
|
|
||||||
|
|
||||||
gCurrentFontSpriteBase = FONT_SPRITE_BASE_MEDIUM;
|
|
||||||
gfx_wrap_string(buffer, width, &numLines, &fontSpriteBase);
|
|
||||||
lineHeight = font_get_line_height(fontSpriteBase);
|
|
||||||
|
|
||||||
gCurrentFontFlags = 0;
|
|
||||||
lineY = y;
|
|
||||||
for (sint32 line = 0; line <= numLines; ++line) {
|
|
||||||
gfx_draw_string(dpi, buffer, TEXT_COLOUR_254, x, lineY);
|
|
||||||
buffer = get_string_end(buffer) + 1;
|
|
||||||
lineY += lineHeight;
|
|
||||||
}
|
|
||||||
return lineY - y;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Draws i formatted text string.
|
|
||||||
* rct2: 0x006C1B2F
|
|
||||||
* dpi (edi)
|
|
||||||
* format (bx)
|
|
||||||
* args (esi)
|
|
||||||
* colour (al)
|
|
||||||
* x (cx)
|
|
||||||
* y (dx)
|
|
||||||
*/
|
|
||||||
void gfx_draw_string_left(rct_drawpixelinfo *dpi, rct_string_id format, void *args, sint32 colour, sint32 x, sint32 y)
|
|
||||||
{
|
|
||||||
char* buffer = gCommonStringFormatBuffer;
|
|
||||||
format_string(buffer, 256, format, args);
|
|
||||||
gCurrentFontSpriteBase = FONT_SPRITE_BASE_MEDIUM;
|
|
||||||
gfx_draw_string(dpi, buffer, colour, x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draws text that is left aligned and vertically centred.
|
* Draws text that is left aligned and vertically centred.
|
||||||
*/
|
*/
|
||||||
|
@ -459,64 +262,6 @@ static void colour_char_window(uint8 colour, uint16* current_font_flags,uint8* p
|
||||||
palette_pointer[4] = (eax >> 24) & 0xFF;
|
palette_pointer[4] = (eax >> 24) & 0xFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* rct2: 0x00682702
|
|
||||||
* dpi (edi)
|
|
||||||
* buffer (esi)
|
|
||||||
* colour (al)
|
|
||||||
* x (cx)
|
|
||||||
* y (dx)
|
|
||||||
*/
|
|
||||||
void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, sint32 colour, sint32 x, sint32 y)
|
|
||||||
{
|
|
||||||
ttf_draw_string(dpi, buffer, colour, x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
void draw_string_left_underline(rct_drawpixelinfo *dpi, rct_string_id format, void *args, sint32 colour, sint32 x, sint32 y)
|
|
||||||
{
|
|
||||||
char buffer[128];
|
|
||||||
sint32 width;
|
|
||||||
|
|
||||||
format_string(buffer, 128, format, args);
|
|
||||||
gCurrentFontSpriteBase = FONT_SPRITE_BASE_MEDIUM;
|
|
||||||
width = gfx_get_string_width(buffer);
|
|
||||||
gfx_draw_string(dpi, buffer, colour, x, y);
|
|
||||||
gfx_fill_rect(dpi, x, y + 11, x + width, y + 11, text_palette[1]);
|
|
||||||
if (text_palette[2] != 0)
|
|
||||||
gfx_fill_rect(dpi, x + 1, y + 12, x + width + 1, y + 12, text_palette[2]);
|
|
||||||
}
|
|
||||||
|
|
||||||
void draw_string_right_underline(rct_drawpixelinfo *dpi, rct_string_id format, void *args, sint32 colour, sint32 x, sint32 y)
|
|
||||||
{
|
|
||||||
char buffer[128];
|
|
||||||
sint32 width;
|
|
||||||
|
|
||||||
format_string(buffer, 128, format, args);
|
|
||||||
gCurrentFontSpriteBase = FONT_SPRITE_BASE_MEDIUM;
|
|
||||||
width = gfx_get_string_width(buffer);
|
|
||||||
x -= width;
|
|
||||||
gfx_draw_string(dpi, buffer, colour, x, y);
|
|
||||||
gfx_fill_rect(dpi, x, y + 11, x + width, y + 11, text_palette[1]);
|
|
||||||
if (text_palette[2] != 0)
|
|
||||||
gfx_fill_rect(dpi, x + 1, y + 12, x + width + 1, y + 12, text_palette[2]);
|
|
||||||
}
|
|
||||||
|
|
||||||
void draw_string_centred_underline(rct_drawpixelinfo *dpi, rct_string_id format, void *args, sint32 colour, sint32 x, sint32 y)
|
|
||||||
{
|
|
||||||
char buffer[128];
|
|
||||||
sint32 width;
|
|
||||||
|
|
||||||
format_string(buffer, 128, format, args);
|
|
||||||
gCurrentFontSpriteBase = FONT_SPRITE_BASE_MEDIUM;
|
|
||||||
width = gfx_get_string_width(buffer);
|
|
||||||
x -= width / 2;
|
|
||||||
gfx_draw_string(dpi, buffer, colour, x, y);
|
|
||||||
gfx_fill_rect(dpi, x, y + 11, x + width, y + 11, text_palette[1]);
|
|
||||||
if (text_palette[2] != 0)
|
|
||||||
gfx_fill_rect(dpi, x + 1, y + 12, x + width + 1, y + 12, text_palette[2]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* rct2: 0x006C1DB7
|
* rct2: 0x006C1DB7
|
||||||
|
@ -1033,7 +778,7 @@ static void ttf_process_initial_colour(sint32 colour, text_draw_info *info)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ttf_draw_string(rct_drawpixelinfo *dpi, char *text, sint32 colour, sint32 x, sint32 y)
|
void ttf_draw_string(rct_drawpixelinfo *dpi, char *text, sint32 colour, sint32 x, sint32 y)
|
||||||
{
|
{
|
||||||
if (text == NULL) return;
|
if (text == NULL) return;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue