Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(236)

Unified Diff: ui/gfx/render_text.cc

Issue 1493713002: Adjust text fade width and alpha (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Apply more review suggestions Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/gfx/render_text.cc
diff --git a/ui/gfx/render_text.cc b/ui/gfx/render_text.cc
index 27c9e5ada81279d215723897c8cafe6b79820023..07d0fb30e6d60b1d8366859c8a1b7f5cb9f7961a 100644
--- a/ui/gfx/render_text.cc
+++ b/ui/gfx/render_text.cc
@@ -93,16 +93,18 @@ SkTypeface::Style ConvertFontStyleToSkiaTypefaceStyle(int font_style) {
return static_cast<SkTypeface::Style>(skia_style);
}
+int round(float value) {
+ return static_cast<int>(floor(value + 0.5f));
+}
+
// Given |font| and |display_width|, returns the width of the fade gradient.
int CalculateFadeGradientWidth(const FontList& font_list, int display_width) {
- // Fade in/out about 2.5 characters of the beginning/end of the string.
- // The .5 here is helpful if one of the characters is a space.
- // Use a quarter of the display width if the display width is very short.
- const int average_character_width = font_list.GetExpectedTextWidth(1);
- const double gradient_width = std::min(average_character_width * 2.5,
- display_width / 4.0);
- DCHECK_GE(gradient_width, 0.0);
- return static_cast<int>(floor(gradient_width + 0.5));
+ // Fade in/out about 3 characters of the beginning/end of the string.
+ // Use a 1/3 of the display width if the display width is very short.
+ const int narrow_width = font_list.GetExpectedTextWidth(3);
+ const int gradient_width = std::min(narrow_width, round(display_width / 3.f));
+ DCHECK_GE(gradient_width, 0);
+ return gradient_width;
}
// Appends to |positions| and |colors| values corresponding to the fade over
@@ -130,12 +132,22 @@ void AddFadeEffect(const Rect& text_rect,
// Creates a SkShader to fade the text, with |left_part| specifying the left
// fade effect, if any, and |right_part| specifying the right fade effect.
-skia::RefPtr<SkShader> CreateFadeShader(const Rect& text_rect,
+skia::RefPtr<SkShader> CreateFadeShader(const FontList& font_list,
+ const Rect& text_rect,
const Rect& left_part,
const Rect& right_part,
SkColor color) {
- // Fade alpha of 51/255 corresponds to a fade of 0.2 of the original color.
- const SkColor fade_color = SkColorSetA(color, 51);
+ // In general, fade down to 0 alpha. But when the available width is less
+ // than four characters, linearly ramp up the fade target alpha to as high as
+ // 20% at zero width. This allows the user to see the last faded characters a
+ // little better when there are only a few characters shown.
+ const float width_fraction =
+ text_rect.width() / static_cast<float>(font_list.GetExpectedTextWidth(4));
+ const SkAlpha kAlphaAtZeroWidth = 51;
+ const SkAlpha alpha = (width_fraction < 1) ?
+ static_cast<SkAlpha>(round((1 - width_fraction) * kAlphaAtZeroWidth)) : 0;
+ const SkColor fade_color = SkColorSetA(color, alpha);
+
std::vector<SkScalar> positions;
std::vector<SkColor> colors;
@@ -1209,8 +1221,9 @@ void RenderText::ApplyFadeEffects(internal::SkiaTextRenderer* renderer) {
text_rect.Inset(GetAlignmentOffset(0).x(), 0, 0, 0);
// TODO(msw): Use the actual text colors corresponding to each faded part.
- skia::RefPtr<SkShader> shader = CreateFadeShader(
- text_rect, left_part, right_part, colors_.breaks().front().second);
+ skia::RefPtr<SkShader> shader =
+ CreateFadeShader(font_list(), text_rect, left_part, right_part,
+ colors_.breaks().front().second);
if (shader)
renderer->SetShader(shader.get());
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698