summaryrefslogtreecommitdiff
path: root/src/gfx_layout.cpp
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2013-06-25 20:40:58 +0000
committerrubidium <rubidium@openttd.org>2013-06-25 20:40:58 +0000
commit48c1e4f87ee264dd66b665e4ae3a3f299ae2f85b (patch)
tree298c5104beafad7e68999c6fc2d8916a08456906 /src/gfx_layout.cpp
parent7b10e39bf104e9983548ee1b6d94e9dbb57fdb27 (diff)
downloadopenttd-48c1e4f87ee264dd66b665e4ae3a3f299ae2f85b.tar.xz
(svn r25470) -Feature-ish: use ICU's layout engine when that's available
Diffstat (limited to 'src/gfx_layout.cpp')
-rw-r--r--src/gfx_layout.cpp103
1 files changed, 103 insertions, 0 deletions
diff --git a/src/gfx_layout.cpp b/src/gfx_layout.cpp
index caa06fc29..861f390a9 100644
--- a/src/gfx_layout.cpp
+++ b/src/gfx_layout.cpp
@@ -12,9 +12,14 @@
#include "stdafx.h"
#include "gfx_layout.h"
#include "string_func.h"
+#include "strings_func.h"
#include "table/control_codes.h"
+#ifdef WITH_ICU
+#include <unicode/ustring.h>
+#endif /* WITH_ICU */
+
/**
* Construct a new font.
* @param size The font size to use for this font.
@@ -26,6 +31,103 @@ Font::Font(FontSize size, TextColour colour) :
assert(size < FS_END);
}
+#ifdef WITH_ICU
+/* Implementation details of LEFontInstance */
+
+le_int32 Font::getUnitsPerEM() const
+{
+ return this->fc->GetUnitsPerEM();
+}
+
+le_int32 Font::getAscent() const
+{
+ return this->fc->GetAscender();
+}
+
+le_int32 Font::getDescent() const
+{
+ return -this->fc->GetDescender();
+}
+
+le_int32 Font::getLeading() const
+{
+ return this->fc->GetHeight();
+}
+
+float Font::getXPixelsPerEm() const
+{
+ return (float)this->fc->GetHeight();
+}
+
+float Font::getYPixelsPerEm() const
+{
+ return (float)this->fc->GetHeight();
+}
+
+float Font::getScaleFactorX() const
+{
+ return 1.0f;
+}
+
+float Font::getScaleFactorY() const
+{
+ return 1.0f;
+}
+
+const void *Font::getFontTable(LETag tableTag) const
+{
+ return this->fc->GetFontTable(tableTag);
+}
+
+LEGlyphID Font::mapCharToGlyph(LEUnicode32 ch) const
+{
+ if (IsTextDirectionChar(ch)) return 0;
+ return this->fc->MapCharToGlyph(ch);
+}
+
+void Font::getGlyphAdvance(LEGlyphID glyph, LEPoint &advance) const
+{
+ advance.fX = glyph == 0xFFFF ? 0 : this->fc->GetGlyphWidth(glyph);
+ advance.fY = 0;
+}
+
+le_bool Font::getGlyphPoint(LEGlyphID glyph, le_int32 pointNumber, LEPoint &point) const
+{
+ return FALSE;
+}
+
+size_t Layouter::AppendToBuffer(UChar *buff, const UChar *buffer_last, WChar c)
+{
+ /* Transform from UTF-32 to internal ICU format of UTF-16. */
+ int32 length = 0;
+ UErrorCode err = U_ZERO_ERROR;
+ u_strFromUTF32(buff, buffer_last - buff, &length, (UChar32*)&c, 1, &err);
+ return length;
+}
+
+ParagraphLayout *Layouter::GetParagraphLayout(UChar *buff)
+{
+ int32 length = buff - this->buffer;
+
+ if (length == 0) {
+ /* ICU's ParagraphLayout cannot handle empty strings, so fake one. */
+ this->buffer[0] = ' ';
+ length = 1;
+ this->fonts.End()[-1].first++;
+ }
+
+ /* Fill ICU's FontRuns with the right data. */
+ FontRuns runs(this->fonts.Length());
+ for (FontMap::iterator iter = this->fonts.Begin(); iter != this->fonts.End(); iter++) {
+ runs.add(iter->second, iter->first);
+ }
+
+ LEErrorCode status = LE_NO_ERROR;
+ return new ParagraphLayout(this->buffer, length, &runs, NULL, NULL, NULL, _current_text_dir == TD_RTL ? UBIDI_DEFAULT_RTL : UBIDI_DEFAULT_LTR, false, status);
+}
+
+#else /* WITH_ICU */
+
/*** Paragraph layout ***/
/**
@@ -276,6 +378,7 @@ ParagraphLayout *Layouter::GetParagraphLayout(WChar *buff_end)
{
return new ParagraphLayout(this->buffer, buff_end - this->buffer, this->fonts);
}
+#endif /* !WITH_ICU */
/**
* Create a new layouter.