Changeset - r20959:0f876ebd3279
[Not reviewed]
master
0 2 0
michi_cc - 11 years ago 2013-11-17 17:08:20
michi_cc@openttd.org
(svn r26029) -Fix (r26017): The internal index of a character in the layout line depends on the used layouter.
2 files changed with 12 insertions and 15 deletions:
0 comments (0 inline, 0 general)
src/gfx_layout.cpp
Show inline comments
 
@@ -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 ch
 
		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(
 
				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);
 
				}
 
			}
 
		}
src/gfx_layout.h
Show inline comments
 
@@ -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;
0 comments (0 inline, 0 general)