Index: ui/views/controls/label.cc |
diff --git a/ui/views/controls/label.cc b/ui/views/controls/label.cc |
index 05aaaab13fe9796c968b6b1e15e766976b4838ae..bc8128f4bd3bb69d620e1315119e17568c7eb92f 100644 |
--- a/ui/views/controls/label.cc |
+++ b/ui/views/controls/label.cc |
@@ -56,7 +56,7 @@ Label::~Label() { |
void Label::SetFontList(const gfx::FontList& font_list) { |
is_first_paint_text_ = true; |
font_list_ = font_list; |
- ResetCachedSize(); |
+ ResetLayoutCache(); |
PreferredSizeChanged(); |
SchedulePaint(); |
} |
@@ -78,7 +78,7 @@ void Label::SetTextInternal(const base::string16& text) { |
layout_text_ = text_; |
} |
- ResetCachedSize(); |
+ ResetLayoutCache(); |
PreferredSizeChanged(); |
SchedulePaint(); |
} |
@@ -113,7 +113,7 @@ void Label::SetBackgroundColor(SkColor color) { |
void Label::SetShadows(const gfx::ShadowValues& shadows) { |
is_first_paint_text_ = true; |
shadows_ = shadows; |
- text_size_valid_ = false; |
+ ResetLayoutCache(); |
} |
void Label::SetSubpixelRenderingEnabled(bool subpixel_rendering_enabled) { |
@@ -148,7 +148,7 @@ void Label::SetLineHeight(int height) { |
is_first_paint_text_ = true; |
if (height != line_height_) { |
line_height_ = height; |
- ResetCachedSize(); |
+ ResetLayoutCache(); |
PreferredSizeChanged(); |
SchedulePaint(); |
} |
@@ -160,7 +160,7 @@ void Label::SetMultiLine(bool multi_line) { |
elide_behavior_ == gfx::NO_ELIDE)); |
if (multi_line != multi_line_) { |
multi_line_ = multi_line; |
- ResetCachedSize(); |
+ ResetLayoutCache(); |
PreferredSizeChanged(); |
SchedulePaint(); |
} |
@@ -178,7 +178,7 @@ void Label::SetAllowCharacterBreak(bool allow_character_break) { |
is_first_paint_text_ = true; |
if (allow_character_break != allow_character_break_) { |
allow_character_break_ = allow_character_break; |
- ResetCachedSize(); |
+ ResetLayoutCache(); |
PreferredSizeChanged(); |
SchedulePaint(); |
} |
@@ -190,7 +190,7 @@ void Label::SetElideBehavior(gfx::ElideBehavior elide_behavior) { |
elide_behavior_ == gfx::NO_ELIDE)); |
if (elide_behavior != elide_behavior_) { |
elide_behavior_ = elide_behavior; |
- ResetCachedSize(); |
+ ResetLayoutCache(); |
PreferredSizeChanged(); |
SchedulePaint(); |
} |
@@ -396,6 +396,7 @@ gfx::Size Label::GetTextSize() const { |
void Label::OnBoundsChanged(const gfx::Rect& previous_bounds) { |
text_size_valid_ &= !multi_line_; |
+ cached_draw_params_.text.clear(); |
} |
void Label::OnPaint(gfx::Canvas* canvas) { |
@@ -404,24 +405,23 @@ void Label::OnPaint(gfx::Canvas* canvas) { |
// some subclasses of Label. We do not want View's focus border painting to |
// interfere with that. |
OnPaintBorder(canvas); |
+ if (layout_text_.empty()) |
+ return; |
- base::string16 paint_text; |
- gfx::Rect text_bounds; |
- int flags = 0; |
- CalculateDrawStringParams(&paint_text, &text_bounds, &flags); |
+ const DrawStringParams* params = CalculateDrawStringParams(); |
if (is_first_paint_text_) { |
// TODO(vadimt): Remove ScopedTracker below once crbug.com/431326 is fixed. |
tracked_objects::ScopedTracker tracking_profile( |
FROM_HERE_WITH_EXPLICIT_FUNCTION("431326 Label::PaintText first")); |
is_first_paint_text_ = false; |
- PaintText(canvas, paint_text, text_bounds, flags); |
+ PaintText(canvas, params->text, params->bounds, params->flags); |
} else { |
// TODO(vadimt): Remove ScopedTracker below once crbug.com/431326 is fixed. |
tracked_objects::ScopedTracker tracking_profile( |
FROM_HERE_WITH_EXPLICIT_FUNCTION("431326 Label::PaintText not first")); |
- PaintText(canvas, paint_text, text_bounds, flags); |
+ PaintText(canvas, params->text, params->bounds, params->flags); |
} |
} |
@@ -444,7 +444,7 @@ void Label::Init(const base::string16& text, const gfx::FontList& font_list) { |
handles_tooltips_ = true; |
collapse_when_hidden_ = false; |
cached_heights_.resize(kCachedSizeLimit); |
- ResetCachedSize(); |
+ ResetLayoutCache(); |
is_first_paint_text_ = true; |
SetText(text); |
@@ -541,25 +541,25 @@ gfx::Rect Label::GetAvailableRect() const { |
return bounds; |
} |
-void Label::CalculateDrawStringParams(base::string16* paint_text, |
- gfx::Rect* text_bounds, |
- int* flags) const { |
- DCHECK(paint_text && text_bounds && flags); |
+const Label::DrawStringParams* Label::CalculateDrawStringParams() const { |
+ if (cached_draw_params_.text.empty()) { |
+ const bool forbid_ellipsis = elide_behavior_ == gfx::NO_ELIDE || |
+ elide_behavior_ == gfx::FADE_TAIL; |
+ if (multi_line_ || forbid_ellipsis) { |
+ cached_draw_params_.text = layout_text_; |
+ } else { |
+ cached_draw_params_.text = gfx::ElideText(layout_text_, font_list_, |
+ GetAvailableRect().width(), elide_behavior_); |
+ } |
- const bool forbid_ellipsis = elide_behavior_ == gfx::NO_ELIDE || |
- elide_behavior_ == gfx::FADE_TAIL; |
- if (multi_line_ || forbid_ellipsis) { |
- *paint_text = layout_text_; |
- } else { |
- *paint_text = gfx::ElideText(layout_text_, font_list_, |
- GetAvailableRect().width(), elide_behavior_); |
+ cached_draw_params_.bounds = GetTextBounds(); |
+ cached_draw_params_.flags = ComputeDrawStringFlags(); |
+ // TODO(msw): Elide multi-line text with ElideRectangleText instead. |
+ if (!multi_line_ || forbid_ellipsis) |
+ cached_draw_params_.flags |= gfx::Canvas::NO_ELLIPSIS; |
} |
- *text_bounds = GetTextBounds(); |
- *flags = ComputeDrawStringFlags(); |
- // TODO(msw): Elide multi-line text with ElideRectangleText instead. |
- if (!multi_line_ || forbid_ellipsis) |
- *flags |= gfx::Canvas::NO_ELLIPSIS; |
+ return &cached_draw_params_; |
} |
void Label::UpdateColorsFromTheme(const ui::NativeTheme* theme) { |
@@ -578,7 +578,8 @@ void Label::UpdateColorsFromTheme(const ui::NativeTheme* theme) { |
RecalculateColors(); |
} |
-void Label::ResetCachedSize() { |
+void Label::ResetLayoutCache() { |
+ cached_draw_params_.text.clear(); |
text_size_valid_ = false; |
cached_heights_cursor_ = 0; |
for (int i = 0; i < kCachedSizeLimit; ++i) |