summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormichi_cc <michi_cc@openttd.org>2013-11-17 17:08:20 +0000
committermichi_cc <michi_cc@openttd.org>2013-11-17 17:08:20 +0000
commitb0b20192a95fcb0d02520d6efe11d875d2805b31 (patch)
treeeed2f37423a10da9bba72a4ba1e98b0a83aa1b8f
parent8abbcd3700dd69e59cc7d3bf50ca520c74c6bda3 (diff)
downloadopenttd-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.cpp26
-rw-r--r--src/gfx_layout.h1
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;