Chromium Code Reviews

Unified Diff: ui/gfx/render_text_win.cc

Issue 371413002: Don't split text runs on underline style change (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
« no previous file with comments | « ui/gfx/render_text_win.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/gfx/render_text_win.cc
diff --git a/ui/gfx/render_text_win.cc b/ui/gfx/render_text_win.cc
index f79577fde0aa9314cd61ddd7b5f209ee71ae1ae4..3950ff37e44a4c0c1009fee6ec365c7fcef9d51c 100644
--- a/ui/gfx/render_text_win.cc
+++ b/ui/gfx/render_text_win.cc
@@ -292,7 +292,6 @@ TextRun::TextRun()
: font_style(0),
strike(false),
diagonal_strike(false),
- underline(false),
width(0),
preceding_run_widths(0),
glyph_count(0),
@@ -889,10 +888,33 @@ void RenderTextWin::DrawVisualText(Canvas* canvas) {
renderer.SetForegroundColor(it->second);
renderer.DrawPosText(&start_pos, &run->glyphs[colored_glyphs.start()],
colored_glyphs.length());
- renderer.DrawDecorations(start_pos.x(), text_offset.y(),
- SkScalarCeilToInt(end_pos.x() - start_pos.x()),
- run->underline, run->strike,
- run->diagonal_strike);
+
+ const BreakList<bool>& underline_breaks = styles()[UNDERLINE];
+ for (size_t position = intersection.start();
+ position < intersection.end(); ) {
msw 2014/07/08 17:20:53 nit: the indent here should match the inside of th
Tomasz Moniuszko 2014/07/16 10:35:45 Done.
+ const BreakList<bool>::const_iterator underline =
+ underline_breaks.GetBreak(position);
+ const Range underline_range =
+ underline_breaks.GetRange(underline).Intersect(intersection);
+ Range decorated_glyphs = CharRangeToGlyphRange(*run, underline_range);
+ if (decorated_glyphs.is_empty())
msw 2014/07/08 17:20:53 nit: add {}
msw 2014/07/08 17:20:53 Why do we get an empty glyph range for something t
Tomasz Moniuszko 2014/07/16 10:35:45 Done.
Tomasz Moniuszko 2014/07/16 10:35:45 We can get empty glyph range for non-empty charact
msw 2014/07/16 19:52:38 I suspect that RenderTextWin::CharRangeToGlyphRang
+ if (run->script_analysis.fRTL)
+ decorated_glyphs.set_start(decorated_glyphs.end() - 1);
msw 2014/07/08 17:20:53 Hmm, adjusting the range by one glyph seems odd, w
Tomasz Moniuszko 2014/07/16 10:35:45 Yes, I agree. The issue is that BreakList contains
+ else
+ decorated_glyphs.set_end(decorated_glyphs.start() + 1);
+ const SkPoint& decorations_start_pos =
+ pos[decorated_glyphs.start() - glyph_range.start()];
+ const SkPoint& decorations_end_pos =
+ pos[decorated_glyphs.end() - glyph_range.start()];
+ const int decorations_width = SkScalarCeilToInt(
+ decorations_end_pos.x() - decorations_start_pos.x());
+ renderer.DrawDecorations(decorations_start_pos.x(), text_offset.y(),
+ decorations_width,
+ underline->second,
+ run->strike,
+ run->diagonal_strike);
+ position = underline_range.end();
+ }
}
preceding_segment_widths += segment_width;
@@ -943,7 +965,11 @@ void RenderTextWin::ItemizeLogicalText() {
// empty color BreakList to avoid breaking runs at color boundaries.
BreakList<SkColor> empty_colors;
empty_colors.SetMax(layout_text_length);
- internal::StyleIterator style(empty_colors, styles());
+ std::vector<BreakList<bool> > breaking_styles = styles();
msw 2014/07/08 17:20:53 nit: add a comment like the one above for colors (
+ size_t underline_max = breaking_styles[UNDERLINE].max();
+ breaking_styles[UNDERLINE].SetValue(false);
+ breaking_styles[UNDERLINE].SetMax(underline_max);
+ internal::StyleIterator style(empty_colors, breaking_styles);
SCRIPT_ITEM* script_item = &script_items[0];
const size_t max_run_length = kMaxGlyphs / 2;
for (size_t run_break = 0; run_break < layout_text_length;) {
@@ -956,7 +982,6 @@ void RenderTextWin::ItemizeLogicalText() {
run->font_style, &run->font);
run->strike = style.style(STRIKE);
run->diagonal_strike = style.style(DIAGONAL_STRIKE);
- run->underline = style.style(UNDERLINE);
run->script_analysis = script_item->a;
// Find the next break and advance the iterators as needed.
« no previous file with comments | « ui/gfx/render_text_win.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine