summaryrefslogtreecommitdiff
path: root/src/gfx_layout.h
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2013-06-25 20:29:31 +0000
committerrubidium <rubidium@openttd.org>2013-06-25 20:29:31 +0000
commit2446b8ea6031f251e3eede83e9a17e9c1464d471 (patch)
tree587a2bfc8ab6c8098cf835d78dc2ebababb86787 /src/gfx_layout.h
parentbbbecceae1cfd7aed447a30c3e130efbb6997ead (diff)
downloadopenttd-2446b8ea6031f251e3eede83e9a17e9c1464d471.tar.xz
(svn r25465) -Codechange: add the concept of a layouting engine for text
Diffstat (limited to 'src/gfx_layout.h')
-rw-r--r--src/gfx_layout.h109
1 files changed, 109 insertions, 0 deletions
diff --git a/src/gfx_layout.h b/src/gfx_layout.h
new file mode 100644
index 000000000..cf4f1f90a
--- /dev/null
+++ b/src/gfx_layout.h
@@ -0,0 +1,109 @@
+/* $Id$ */
+
+/*
+ * This file is part of OpenTTD.
+ * OpenTTD 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, version 2.
+ * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** @file gfx_layout.h Functions related to laying out the texts. */
+
+#ifndef GFX_LAYOUT_H
+#define GFX_LAYOUT_H
+
+#include "fontcache.h"
+#include "gfx_func.h"
+#include "core/smallmap_type.hpp"
+
+/**
+ * Container with information about a font.
+ */
+class Font {
+public:
+ FontCache *fc; ///< The font we are using.
+ TextColour colour; ///< The colour this font has to be.
+
+ Font(FontSize size, TextColour colour);
+};
+
+/** Mapping from index to font. */
+typedef SmallMap<int, Font *> FontMap;
+
+/**
+ * Class handling the splitting of a paragraph of text into lines and
+ * visual runs.
+ *
+ * One constructs this class with the text that needs to be split into
+ * lines. Then nextLine is called with the maximum with until NULL is
+ * returned. Each nextLine call creates VisualRuns which contain the
+ * length of text that are to be drawn with the same font. In other
+ * words, the result of this class is a list of sub strings with their
+ * font. The sub strings are then already fully laid out, and only
+ * need actual drawing.
+ *
+ * The positions in a visual run are sequential pairs of X,Y of the
+ * begin of each of the glyphs plus an extra pair to mark the end.
+ *
+ * @note This variant does not handle left-to-right properly. This
+ * is supported in the one ParagraphLayout coming from ICU.
+ * @note Does not conform to function naming style as it provides a
+ * fallback for the ICU class.
+ */
+class ParagraphLayout {
+public:
+ /** Visual run contains data about the bit of text with the same font. */
+ class VisualRun {
+ Font *font; ///< The font used to layout these.
+ GlyphID *glyphs; ///< The glyphs we're drawing.
+ float *positions; ///< The positions of the glyphs.
+ int glyph_count; ///< The number of glyphs.
+
+ public:
+ VisualRun(Font *font, const WChar *chars, int glyph_count, int x);
+ ~VisualRun();
+ Font *getFont() const;
+ int getGlyphCount() const;
+ const GlyphID *getGlyphs() const;
+ float *getPositions() const;
+ int getLeading() const;
+ };
+
+ /** A single line worth of VisualRuns. */
+ class Line : public AutoDeleteSmallVector<VisualRun *, 4> {
+ public:
+ int getLeading() const;
+ int getWidth() const;
+ int countRuns() const;
+ VisualRun *getVisualRun(int run) const;
+ };
+
+ const WChar *buffer_begin; ///< Begin of the buffer.
+ WChar *buffer; ///< The current location in the buffer.
+ FontMap &runs; ///< The fonts we have to use for this paragraph.
+
+ ParagraphLayout(WChar *buffer, int length, FontMap &runs);
+ Line *nextLine(int max_width);
+};
+
+/**
+ * The layouter performs all the layout work.
+ *
+ * It also accounts for the memory allocations and frees.
+ */
+class Layouter : public AutoDeleteSmallVector<ParagraphLayout::Line *, 4> {
+ typedef WChar CharType; ///< The type of character used within the layouter.
+
+ size_t AppendToBuffer(CharType *buff, const CharType *buffer_last, WChar c);
+ ParagraphLayout *GetParagraphLayout(CharType *buff);
+
+ CharType buffer[DRAW_STRING_BUFFER]; ///< Buffer for the text that is going to be drawn.
+ FontMap fonts; ///< The fonts needed for drawing.
+
+public:
+ Layouter(const char *str, int maxw = INT32_MAX, TextColour colour = TC_FROMSTRING, FontSize fontsize = FS_NORMAL);
+ ~Layouter();
+ Dimension GetBounds();
+};
+
+#endif /* GFX_LAYOUT_H */