diff options
author | michi_cc <michi_cc@openttd.org> | 2013-11-17 17:08:20 +0000 |
---|---|---|
committer | michi_cc <michi_cc@openttd.org> | 2013-11-17 17:08:20 +0000 |
commit | b0b20192a95fcb0d02520d6efe11d875d2805b31 (patch) | |
tree | eed2f37423a10da9bba72a4ba1e98b0a83aa1b8f | |
parent | 8abbcd3700dd69e59cc7d3bf50ca520c74c6bda3 (diff) | |
download | openttd-b0b20192a95fcb0d02520d6efe11d875d2805b31.tar.xz |
(svn r26029) -Fix (r26017): The internal index of a character in the layout line depends on the used layouter.
-rw-r--r-- | src/gfx_layout.cpp | 26 | ||||
-rw-r--r-- | src/gfx_layout.h | 1 |
2 files changed, 12 insertions, 15 deletions
diff --git a/src/gfx_layout.cpp b/src/gfx_layout.cpp index 7471c672e..a47e3c8ac 100644 --- a/src/gfx_layout.cpp +++ b/src/gfx_layout.cpp @@ -163,6 +163,12 @@ public: int GetWidth() const { return l->getWidth(); } int CountRuns() const { return l->countRuns(); } const ParagraphLayouter::VisualRun *GetVisualRun(int run) const { return *this->Get(run); } + + int GetInternalCharLength(WChar c) const + { + /* ICU uses UTF-16 internally which means we need to account for surrogate pairs. */ + return Utf8CharLen(c) < 4 ? 1 : 2; + } }; ICUParagraphLayout(ParagraphLayout *p) : p(p) { } @@ -259,6 +265,8 @@ public: int GetWidth() const; int CountRuns() const; const ParagraphLayouter::VisualRun *GetVisualRun(int run) const; + + int GetInternalCharLength(WChar c) const { return 1; } }; const WChar *buffer_begin; ///< Begin of the buffer. @@ -699,12 +707,7 @@ Point Layouter::GetCharPosition(const char *ch) const size_t len = Utf8Decode(&c, str); if (c == '\0' || c == '\n') break; str += len; -#ifdef WITH_ICU - /* ICU uses UTF-16 internally which means we need to account for surrogate pairs. */ - index += len < 4 ? 1 : 2; -#else - index++; -#endif + index += (*this->Begin())->GetInternalCharLength(c); } if (str == ch) { @@ -762,15 +765,8 @@ const char *Layouter::GetCharAtPosition(int x) const for (const char *str = this->string; *str != '\0'; ) { if (cur_idx == index) return str; - WChar c; - size_t len = Utf8Decode(&c, str); -#ifdef WITH_ICU - /* ICU uses UTF-16 internally which means we need to account for surrogate pairs. */ - cur_idx += len < 4 ? 1 : 2; -#else - cur_idx++; -#endif - str += len; + WChar c = Utf8Consume(&str); + cur_idx += line->GetInternalCharLength(c); } } } diff --git a/src/gfx_layout.h b/src/gfx_layout.h index 4d85cb5a2..7cd70ce28 100644 --- a/src/gfx_layout.h +++ b/src/gfx_layout.h @@ -124,6 +124,7 @@ public: virtual int GetWidth() const = 0; virtual int CountRuns() const = 0; virtual const VisualRun *GetVisualRun(int run) const = 0; + virtual int GetInternalCharLength(WChar c) const = 0; }; virtual void Reflow() = 0; |