32 auto operator<=>(
const FontState &)
const =
default;
42 if ((this->cur_colour &
TC_FORCED) == 0) this->cur_colour = c;
73template <
typename T>
struct std::hash<std::vector<T>> {
74 size_t operator()(
const std::vector<T> &vec)
const
77 return std::transform_reduce(std::begin(vec), std::end(vec),
78 std::hash<size_t>{}(std::size(vec)),
79 [](
const size_t &a,
const size_t &b) ->
size_t {
return a ^ b; },
80 [](
const T &x) ->
size_t {
return std::hash<T>{}(x); });
73template <
typename T>
struct std::hash<std::vector<T>> {
…};
85 std::size_t operator()(
const FontState &state)
const noexcept
87 size_t h1 = std::hash<FontSize>{}(state.
fontsize);
88 size_t h2 = std::hash<TextColour>{}(state.
cur_colour);
89 size_t h3 = std::hash<std::vector<TextColour>>{}(state.
colour_stack);
90 return h1 ^ (h2 << 1) ^ (h3 << 2);
106using FontMap = std::vector<std::pair<int, Font *>>;
132 virtual const Font *GetFont()
const = 0;
133 virtual int GetGlyphCount()
const = 0;
134 virtual std::span<const GlyphID> GetGlyphs()
const = 0;
135 virtual std::span<const Position> GetPositions()
const = 0;
136 virtual int GetLeading()
const = 0;
137 virtual std::span<const int> GetGlyphToCharMap()
const = 0;
143 virtual ~Line() =
default;
144 virtual int GetLeading()
const = 0;
145 virtual int GetWidth()
const = 0;
146 virtual int CountRuns()
const = 0;
147 virtual const VisualRun &GetVisualRun(
int run)
const = 0;
148 virtual int GetInternalCharLength(
char32_t c)
const = 0;
151 virtual void Reflow() = 0;
152 virtual std::unique_ptr<const Line> NextLine(
int max_width) = 0;
160class Layouter :
public std::vector<const ParagraphLayouter::Line *> {
178 using is_transparent = void;
180 template <
typename Tlhs,
typename Trhs>
181 bool operator()(
const Tlhs &lhs,
const Trhs &rhs)
const
183 return lhs.state_before == rhs.state_before && lhs.str == rhs.str;
191 using Buffer = std::unique_ptr<void, void(*)(
void *)>;
197 std::unique_ptr<ParagraphLayouter>
layout =
nullptr;
199 std::vector<std::unique_ptr<const ParagraphLayouter::Line>>
cached_layout{};
208 using FontColourMap = std::map<TextColour, std::unique_ptr<Font>>;
160class Layouter :
public std::vector<const ParagraphLayouter::Line *> {
…};
226template <>
struct std::hash<
Layouter::LineCacheQuery> {
229 size_t h1 = std::hash<std::string_view>{}(state.
str);
231 return h1 ^ (h2 << 1);
226template <>
struct std::hash<
Layouter::LineCacheQuery> {
…};
236 using is_transparent = void;
239 std::size_t operator()(
const Layouter::LineCacheQuery &query)
const {
return std::hash<Layouter::LineCacheQuery>{}(query); }
Font cache for basic fonts.
Container with information about a font.
FontCache * fc
The font we are using.
TextColour colour
The colour this font has to be.
Size limited cache with a least recently used eviction strategy.
The layouter performs all the layout work.
static void Initialize()
Perform initialization of layout engine.
static FontColourMap fonts[FS_END]
Cache of Font instances.
ptrdiff_t GetCharAtPosition(int x, size_t line_index) const
Get the character that is at a pixel position in the first line of the layouted text.
static void ResetFontCache(FontSize size)
Reset cached font information.
ParagraphLayouter::Position GetCharPosition(std::string_view::const_iterator ch) const
Get the position of a character in the layout.
static std::unique_ptr< LineCache > linecache
Cache of ParagraphLayout lines.
static Font * GetFont(FontSize size, TextColour colour)
Get a static font instance.
std::string_view string
Pointer to the original string.
static void ResetLineCache()
Clear line cache.
Dimension GetBounds()
Get the boundaries of this paragraph.
static LineCacheItem & GetCachedParagraphLayout(std::string_view str, const FontState &state)
Get reference to cache item.
A single line worth of VisualRuns.
Position of a glyph within a VisualRun.
int16_t right
Right-most position of glyph.
constexpr Position(const Point &pt)
Conversion from a single point to a Position.
int16_t left
Left-most position of glyph.
int16_t top
Top-most position of glyph.
Visual run contains data about the bit of text with the same font.
Interface to glue fallback and normal layouter into one.
Functions to read fonts from files and cache them.
Functions related to the gfx engine.
ParagraphLayouter::Position GetCharPosInString(std::string_view str, size_t pos, FontSize start_fontsize=FS_NORMAL)
Get the leading corner of a character in a single-line string relative to the start of the string.
ptrdiff_t GetCharAtPosition(std::string_view str, int x, FontSize start_fontsize=FS_NORMAL)
Get the character from a string that is drawn at a specific position.
std::vector< std::pair< int, Font * > > FontMap
Mapping from index to font.
FontSize
Available font sizes.
@ FS_NORMAL
Index of the normal font in the font tables.
TextColour
Colour of the strings, see _string_colourmap in table/string_colours.h or docs/ottd-colourtext-palett...
@ TC_FORCED
Ignore colour changes from strings.
@ TC_FLAGS_MASK
Mask to test if TextColour (with flags) is within limits.
@ TC_COLOUR_MASK
Mask to test if TextColour (without flags) is within limits.
Size limited cache map with a least recently used eviction strategy.
Dimensions (a width and height) of a rectangle in 2D.
Text drawing parameters, which can change while drawing a line, but are kept between multiple parts o...
void PushColour()
Push the current colour on to the stack.
void SetColour(TextColour c)
Switch to new colour c.
void PopColour()
Switch to and pop the last saved colour on the stack.
void SetFontSize(FontSize f)
Switch to using a new font f.
FontSize fontsize
Current font size.
std::vector< TextColour > colour_stack
Stack of colours to assist with colour switching.
TextColour cur_colour
Current text colour.
FontMap runs
Accessed by our ParagraphLayout::nextLine.
Buffer buffer
Accessed by our ParagraphLayout::nextLine.
int cached_width
Width used for the cached layout.
std::vector< std::unique_ptr< const ParagraphLayouter::Line > > cached_layout
Cached results of line layouting.
FontState state_after
Font state after the line.
std::unique_ptr< ParagraphLayouter > layout
Layout of the line.
FontState state_before
Font state at the beginning of the line.
std::string str
Source string of the line (including colour and font size codes).
const FontState & state_before
Font state at the beginning of the line.
std::string_view str
Source string of the line (including colour and font size codes).
Coordinates of a point in 2D.