| Index: ui/gfx/render_text_win.cc
|
| diff --git a/ui/gfx/render_text_win.cc b/ui/gfx/render_text_win.cc
|
| index 54e3931abb0c36e56ec3c906be4bcc743a957216..46f46dd85c19b79609bc6299fb36d11b9f2d096f 100644
|
| --- a/ui/gfx/render_text_win.cc
|
| +++ b/ui/gfx/render_text_win.cc
|
| @@ -504,14 +504,19 @@
|
| // static
|
| std::map<std::string, Font> RenderTextWin::successful_substitute_fonts_;
|
|
|
| -RenderTextWin::RenderTextWin() : RenderText(), needs_layout_(false) {
|
| +RenderTextWin::RenderTextWin()
|
| + : RenderText(),
|
| + needs_layout_(false) {
|
| set_truncate_length(kMaxUniscribeTextLength);
|
| +
|
| memset(&script_control_, 0, sizeof(script_control_));
|
| memset(&script_state_, 0, sizeof(script_state_));
|
| +
|
| MoveCursorTo(EdgeSelectionModel(CURSOR_LEFT));
|
| }
|
|
|
| -RenderTextWin::~RenderTextWin() {}
|
| +RenderTextWin::~RenderTextWin() {
|
| +}
|
|
|
| Size RenderTextWin::GetStringSize() {
|
| EnsureLayout();
|
| @@ -711,7 +716,7 @@
|
|
|
| size_t RenderTextWin::TextIndexToLayoutIndex(size_t index) const {
|
| DCHECK_LE(index, text().length());
|
| - ptrdiff_t i = obscured() ? UTF16IndexToOffset(text(), 0, index) : index;
|
| + ptrdiff_t i = obscured() ? gfx::UTF16IndexToOffset(text(), 0, index) : index;
|
| CHECK_GE(i, 0);
|
| // Clamp layout indices to the length of the text actually used for layout.
|
| return std::min<size_t>(GetLayoutText().length(), i);
|
| @@ -722,22 +727,24 @@
|
| return index;
|
|
|
| DCHECK_LE(index, GetLayoutText().length());
|
| - const size_t text_index = UTF16OffsetToIndex(text(), 0, index);
|
| + const size_t text_index = gfx::UTF16OffsetToIndex(text(), 0, index);
|
| DCHECK_LE(text_index, text().length());
|
| return text_index;
|
| }
|
|
|
| -bool RenderTextWin::IsValidCursorIndex(size_t index) {
|
| - if (index == 0 || index == text().length())
|
| +bool RenderTextWin::IsCursorablePosition(size_t position) {
|
| + if (position == 0 || position == text().length())
|
| return true;
|
| - if (!IsValidLogicalIndex(index))
|
| - return false;
|
| EnsureLayout();
|
| - // Disallow indices amid multi-character graphemes by checking glyph bounds.
|
| - // These characters are not surrogate-pairs, but may yield a single glyph:
|
| - // \x0915\x093f - (ki) - one of many Devanagari biconsonantal conjuncts.
|
| - // \x0e08\x0e33 - (cho chan + sara am) - a Thai consonant and vowel pair.
|
| - return GetGlyphBounds(index) != GetGlyphBounds(index - 1);
|
| +
|
| + // Check that the index is at a valid code point (not mid-surrgate-pair),
|
| + // that it is not truncated from layout text (its glyph is shown on screen),
|
| + // and that its glyph has distinct bounds (not mid-multi-character-grapheme).
|
| + // An example of a multi-character-grapheme that is not a surrogate-pair is:
|
| + // \x0915\x093f - (ki) - one of many Devanagari biconsonantal conjuncts.
|
| + return gfx::IsValidCodePointIndex(text(), position) &&
|
| + position < LayoutIndexToTextIndex(GetLayoutText().length()) &&
|
| + GetGlyphBounds(position) != GetGlyphBounds(position - 1);
|
| }
|
|
|
| void RenderTextWin::ResetLayout() {
|
| @@ -853,13 +860,8 @@
|
| const Range intersection =
|
| colors().GetRange(it).Intersect(segment->char_range);
|
| const Range colored_glyphs = CharRangeToGlyphRange(*run, intersection);
|
| - // The range may be empty if a portion of a multi-character grapheme is
|
| - // selected, yielding two colors for a single glyph. For now, this just
|
| - // paints the glyph with a single style, but it should paint it twice,
|
| - // clipped according to selection bounds. See http://crbug.com/366786
|
| - if (colored_glyphs.is_empty())
|
| - continue;
|
| DCHECK(glyph_range.Contains(colored_glyphs));
|
| + DCHECK(!colored_glyphs.is_empty());
|
| const SkPoint& start_pos =
|
| pos[colored_glyphs.start() - glyph_range.start()];
|
| const SkPoint& end_pos =
|
|
|