diff options
author | jar@chromium.org <jar@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-05 06:29:06 +0000 |
---|---|---|
committer | jar@chromium.org <jar@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-05 06:29:06 +0000 |
commit | 81bdfdaa02ebb910b551d5eff01e00c9a8a50fdf (patch) | |
tree | 9c5fef71f476b6edc69e60eef8df02bfcc5cde8d | |
parent | 4038d2dcf68d300f44032f98f9323c341cef4333 (diff) | |
download | chromium_src-81bdfdaa02ebb910b551d5eff01e00c9a8a50fdf.zip chromium_src-81bdfdaa02ebb910b551d5eff01e00c9a8a50fdf.tar.gz chromium_src-81bdfdaa02ebb910b551d5eff01e00c9a8a50fdf.tar.bz2 |
Revert 80416 - Fade tab titles
This change fades tab titles instead of truncating them with a "...".
I tried to copy the Mac implemenation from here:
http://code.google.com/p/google-toolbox-for-mac/source/browse/trunk/AppKit/GTMFadeTruncatingTextFieldCell.m
but my version is not as good since I couldn't figure out how to draw text on a transparent background.
BUG=69301
TEST=Ran Chromium and verified that things looked ok.
Review URL: http://codereview.chromium.org/6695043
TBR=sail@chromium.org
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@80418 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/ui/views/tabs/base_tab.cc | 19 | ||||
-rw-r--r-- | ui/gfx/canvas_skia.h | 19 | ||||
-rw-r--r-- | ui/gfx/canvas_skia_win.cc | 277 |
3 files changed, 9 insertions, 306 deletions
diff --git a/chrome/browser/ui/views/tabs/base_tab.cc b/chrome/browser/ui/views/tabs/base_tab.cc index f954081..81a7262 100644 --- a/chrome/browser/ui/views/tabs/base_tab.cc +++ b/chrome/browser/ui/views/tabs/base_tab.cc @@ -471,7 +471,6 @@ void BaseTab::PaintTitle(gfx::Canvas* canvas, SkColor title_color) { // Paint the Title. const gfx::Rect& title_bounds = GetTitleBounds(); string16 title = data().title; - bool should_truncate = false; if (title.empty()) { title = data().loading ? l10n_util::GetStringUTF16(IDS_TAB_LOADING_TITLE) : @@ -481,23 +480,15 @@ void BaseTab::PaintTitle(gfx::Canvas* canvas, SkColor title_color) { // If we'll need to truncate, check if we should also truncate // a common prefix, but only if there is enough room for it. // We arbitrarily choose to request enough room for 10 average chars. - should_truncate = data().common_prefix_length > 0 && - font_->GetExpectedTextWidth(10) < title_bounds.width() && - font_->GetStringWidth(title) > title_bounds.width(); + if (data().common_prefix_length > 0 && + font_->GetExpectedTextWidth(10) < title_bounds.width() && + font_->GetStringWidth(title) > title_bounds.width()) { + title.replace(0, data().common_prefix_length, UTF8ToUTF16(ui::kEllipsis)); + } } - -#if defined(OS_WIN) - canvas->AsCanvasSkia()->DrawFadeTruncatingString(title, - should_truncate ? gfx::CanvasSkia::TruncateFadeHeadAndTail : - gfx::CanvasSkia::TruncateFadeTail, - data().common_prefix_length, *font_, title_color, title_bounds); -#else - if (should_truncate) - title.replace(0, data().common_prefix_length, UTF8ToUTF16(ui::kEllipsis)); canvas->DrawStringInt(title, *font_, title_color, title_bounds.x(), title_bounds.y(), title_bounds.width(), title_bounds.height()); -#endif } void BaseTab::AnimationProgressed(const ui::Animation* animation) { diff --git a/ui/gfx/canvas_skia.h b/ui/gfx/canvas_skia.h index 4811a81..9516e8a3 100644 --- a/ui/gfx/canvas_skia.h +++ b/ui/gfx/canvas_skia.h @@ -37,12 +37,6 @@ class Canvas; class CanvasSkia : public skia::PlatformCanvas, public Canvas { public: - enum TruncateFadeMode { - TruncateFadeTail, - TruncateFadeHead, - TruncateFadeHeadAndTail, - }; - // Creates an empty Canvas. Callers must use initialize before using the // canvas. CanvasSkia(); @@ -138,19 +132,6 @@ class CanvasSkia : public skia::PlatformCanvas, const SkColor& color, int x, int y, int w, int h, int flags); -#if defined(OS_WIN) - // Draws the given string with the beginning and/or the end using a fade - // gradient. When truncating the head - // |desired_characters_to_truncate_from_head| specifies the maximum number of - // characters that can be truncated. - virtual void DrawFadeTruncatingString( - const string16& text, - TruncateFadeMode truncate_mode, - size_t desired_characters_to_truncate_from_head, - const gfx::Font& font, - const SkColor& color, - const gfx::Rect& display_rect); -#endif virtual void DrawFocusRect(int x, int y, int width, int height); virtual void TileImageInt(const SkBitmap& bitmap, int x, int y, int w, int h); virtual void TileImageInt(const SkBitmap& bitmap, diff --git a/ui/gfx/canvas_skia_win.cc b/ui/gfx/canvas_skia_win.cc index c498bb6..b343234 100644 --- a/ui/gfx/canvas_skia_win.cc +++ b/ui/gfx/canvas_skia_win.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -7,21 +7,12 @@ #include <limits> #include "base/i18n/rtl.h" -#include "base/logging.h" -#include "base/scoped_ptr.h" -#include "skia/ext/bitmap_platform_device.h" -#include "skia/ext/skia_utils_win.h" #include "third_party/skia/include/core/SkShader.h" #include "ui/gfx/font.h" #include "ui/gfx/rect.h" namespace { -static inline int Round(double x) { - // Why oh why is this not in a standard header? - return static_cast<int>(floor(x + 0.5)); -} - // We make sure that LTR text we draw in an RTL context is modified // appropriately to make sure it maintains it LTR orientation. void DoDrawText(HDC hdc, @@ -133,136 +124,6 @@ int ComputeFormatFlags(int flags, const string16& text) { return f; } -// Changes the alpha of the given bitmap. -// If |fade_to_right| is true then the rect fades from opaque to clear, -// otherwise the rect fades from clear to opaque. -void FadeBitmapRect(skia::BitmapPlatformDevice& bmp_device, - const gfx::Rect& rect, - bool fade_to_right) { - SkBitmap bmp = bmp_device.accessBitmap(true); - DCHECK_EQ(SkBitmap::kARGB_8888_Config, bmp.config()); - SkAutoLockPixels lock(bmp); - float total_width = static_cast<float>(rect.width()); - - for (int x = rect.x(); x < rect.right(); x++) { - float cur_width = static_cast<float>(fade_to_right ? - rect.right() - x : x - rect.x()); - // We want the fade effect to go from 0.2 to 1.0. - float alpha_percent = ((cur_width / total_width) * 0.8f) + 0.2f; - - for (int y = rect.y(); y < rect.bottom(); y++) { - SkColor color = bmp.getColor(x, y); - SkAlpha alpha = static_cast<SkAlpha>(SkColorGetA(color) * alpha_percent); - *bmp.getAddr32(x, y) = SkPreMultiplyColor(SkColorSetA(color, alpha)); - } - } -} - -// DrawText() doesn't support alpha channels. To create a transparent background -// this function draws black on white. It then uses the intensity of black -// to determine how much alpha to use. The text is drawn in |gfx_text_rect| and -// clipped to |gfx_draw_rect|. -void DrawTextAndClearBackground(skia::BitmapPlatformDevice& bmp_device, - HFONT font, - COLORREF text_color, - const string16& text, - int flags, - const gfx::Rect& gfx_text_rect, - const gfx::Rect& gfx_draw_rect) { - // Clear the background by filling with white. - HBRUSH fill_brush = static_cast<HBRUSH>(GetStockObject(WHITE_BRUSH)); - HANDLE old_brush = SelectObject(bmp_device.getBitmapDC(), fill_brush); - RECT draw_rect = gfx_draw_rect.ToRECT(); - FillRect(bmp_device.getBitmapDC(), &draw_rect, fill_brush); - SelectObject(bmp_device.getBitmapDC(), old_brush); - - // Set black text with trasparent background. - SetBkMode(bmp_device.getBitmapDC(), TRANSPARENT); - SetTextColor(bmp_device.getBitmapDC(), 0); - - // Draw the text. - int save_dc_id = SaveDC(bmp_device.getBitmapDC()); - // Clip the text to the draw destination. - IntersectClipRect(bmp_device.getBitmapDC(), draw_rect.left, draw_rect.top, - draw_rect.right, draw_rect.bottom); - SelectObject(bmp_device.getBitmapDC(), font); - RECT text_rect = gfx_text_rect.ToRECT(); - DoDrawText(bmp_device.getBitmapDC(), text, &text_rect, - ComputeFormatFlags(flags, text)); - RestoreDC(bmp_device.getBitmapDC(), save_dc_id); - - BYTE text_color_r = GetRValue(text_color); - BYTE text_color_g = GetGValue(text_color); - BYTE text_color_b = GetBValue(text_color); - - SkBitmap bmp = bmp_device.accessBitmap(true); - DCHECK_EQ(SkBitmap::kARGB_8888_Config, bmp.config()); - SkAutoLockPixels lock(bmp); - - // At this point the bitmap has black text on white. - // The intensity of black tells us the alpha value of the text. - for (int y = draw_rect.top; y < draw_rect.bottom; y++) { - for (int x = draw_rect.left; x < draw_rect.right; x++) { - // Gets the color directly. DrawText doesn't premultiply alpha so - // using SkBitmap::getColor() won't work here. - SkColor color = *bmp.getAddr32(x, y); - // Use any of the color channels as alpha. - BYTE alpha = 0xFF - SkColorGetB(color); - *bmp.getAddr32(x, y) = SkPreMultiplyColor( - SkColorSetARGB(alpha, text_color_r, text_color_b, text_color_g)); - } - } -} - -// Draws the given text with a fade out gradient. |bmp_device| is a bitmap -// that is used to temporary drawing. The text is drawn in |text_rect| and -// clipped to |draw_rect|. -void DrawTextGradientPart(HDC hdc, - skia::BitmapPlatformDevice& bmp_device, - const string16& text, - const SkColor& color, - HFONT font, - const gfx::Rect& text_rect, - const gfx::Rect& draw_rect, - bool fade_to_right, - int flags) { - DrawTextAndClearBackground(bmp_device, font, skia::SkColorToCOLORREF(color), - text, flags, text_rect, draw_rect); - FadeBitmapRect(bmp_device, draw_rect, fade_to_right); - BLENDFUNCTION blend = {AC_SRC_OVER, 0, 255, AC_SRC_ALPHA}; - AlphaBlend(hdc, draw_rect.x(), draw_rect.y(), draw_rect.width(), - draw_rect.height(), bmp_device.getBitmapDC(), draw_rect.x(), - draw_rect.y(), draw_rect.width(), draw_rect.height(), blend); -} - -enum PrimarySide { - PrimaryOnLeft, - PrimaryOnRight, -}; - -// Divides |rect| horizontally into a |primary| of width |primary_width| and a -// |secondary| taking up the remainder. -void DivideRect(const gfx::Rect& rect, - PrimarySide primary_side, - int primary_width, - gfx::Rect* primary, - gfx::Rect* secondary) { - *primary = rect; - *secondary = rect; - int remainder = rect.width() - primary_width; - - switch (primary_side) { - case PrimaryOnLeft: - primary->Inset(0, 0, remainder, 0); - secondary->Inset(primary_width, 0, 0, 0); - break; - case PrimaryOnRight: - primary->Inset(remainder, 0, 0, 0); - secondary->Inset(0, 0, primary_width, 0); - break; - } -} - } // anonymous namespace namespace gfx { @@ -321,13 +182,7 @@ void CanvasSkia::DrawStringInt(const string16& text, const SkColor& color, int x, int y, int w, int h, int flags) { - SkRect fclip; - if (!getClipBounds(&fclip)) - return; - RECT text_bounds = { x, y, x + w, y + h }; - SkIRect clip; - fclip.round(&clip); - if (!clip.intersect(skia::RECTToSkIRect(text_bounds))) + if (!IntersectsClipRectInt(x, y, w, h)) return; // Clamp the max amount of text we'll draw to 32K. There seem to be bugs in @@ -337,6 +192,7 @@ void CanvasSkia::DrawStringInt(const string16& text, const int kMaxStringLength = 32768 - 1; // So the trailing \0 fits in 32K. string16 clamped_string(text.substr(0, kMaxStringLength)); + RECT text_bounds = { x, y, x + w, y + h }; HDC dc = beginPlatformPaint(); SetBkMode(dc, TRANSPARENT); HFONT old_font = (HFONT)SelectObject(dc, font); @@ -355,8 +211,7 @@ void CanvasSkia::DrawStringInt(const string16& text, // Windows will have cleared the alpha channel of the text we drew. Assume // we're drawing to an opaque surface, or at least the text rect area is // opaque. - getTopPlatformDevice().makeOpaque(clip.fLeft, clip.fTop, - clip.width(), clip.height()); + getTopPlatformDevice().makeOpaque(x, y, w, h); } void CanvasSkia::DrawStringInt(const string16& text, @@ -448,128 +303,4 @@ ui::TextureID CanvasSkia::GetTextureID() { return 0; } -void CanvasSkia::DrawFadeTruncatingString( - const string16& text, - CanvasSkia::TruncateFadeMode truncate_mode, - size_t desired_characters_to_truncate_from_head, - const gfx::Font& font, - const SkColor& color, - const gfx::Rect& display_rect) { - int flags = NO_ELLIPSIS; - - // If the whole string fits in the destination then just draw it directly. - int total_string_width; - int total_string_height; - SizeStringInt(text, font, &total_string_width, &total_string_height, - flags | TEXT_VALIGN_TOP); - if (total_string_width <= display_rect.width()) { - DrawStringInt(text, font, color, display_rect.x(), display_rect.y(), - display_rect.width(), display_rect.height(), flags); - return; - } - - int average_character_width = font.GetAverageCharacterWidth(); - int clipped_string_width = total_string_width - display_rect.width(); - - // Clip the string by drawing it to the left by |offset_x|. - int offset_x = 0; - switch (truncate_mode) { - case TruncateFadeHead: - offset_x = clipped_string_width; - break; - case TruncateFadeHeadAndTail: - DCHECK_GT(desired_characters_to_truncate_from_head, 0u); - // Get the width of the beginning of the string we're clipping. - string16 clipped_head_string = - text.substr(0, desired_characters_to_truncate_from_head); - int clipped_width; - int clipped_height; - SizeStringInt(clipped_head_string, font, - &clipped_width, &clipped_height, flags); - - // This is the offset at which we start drawing. This causes the - // beginning of the string to get clipped. - offset_x = clipped_width; - - // Due to the fade effect the first character is hard to see. - // We want to make sure that the first character starting at - // |desired_characters_to_truncate_from_head| is readable so we reduce - // the offset by a little bit. - offset_x = std::max(0, Round(offset_x - average_character_width * 2)); - - // If the offset is so large that there's empty space at the tail - // then reduce the offset so we can use up the empty space. - offset_x = std::min(offset_x, clipped_string_width); - break; - } - bool is_truncating_head = offset_x > 0; - bool is_truncating_tail = clipped_string_width > offset_x; - - bool is_rtl = (ComputeFormatFlags(flags, text) & DT_RTLREADING) != 0; - // |is_rtl| tells us if the given text is right to left or not. |is_rtl| can - // be false even if the UI is set to a right to left language. - // Now, normally, we right align all text if the UI is set to a right to - // left language. In this case though we don't want that because we render - // the ends of the string ourselves. - if (!is_rtl) - flags |= TEXT_ALIGN_LEFT; - - // 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 string is very short. - int gradient_width = Round(std::min(average_character_width * 2.5, - display_rect.width() / 4.0)); - - // Move the origin to |display_rect.origin()|. This simplifies all the - // drawing so that both the source and destination can be (0,0). - save(kMatrix_SaveFlag); - TranslateInt(display_rect.x(), display_rect.y()); - - gfx::Rect solid_part(gfx::Point(), display_rect.size()); - gfx::Rect head_part; - gfx::Rect tail_part; - if (is_truncating_head) - DivideRect(solid_part, is_rtl ? PrimaryOnRight : PrimaryOnLeft, - gradient_width, &head_part, &solid_part); - if (is_truncating_tail) - DivideRect(solid_part, is_rtl ? PrimaryOnLeft : PrimaryOnRight, - gradient_width, &tail_part, &solid_part); - - // Grow |display_rect| by |offset_x|. - gfx::Rect text_rect(gfx::Point(), display_rect.size()); - if (!is_rtl) - text_rect.set_x(text_rect.x() - offset_x); - text_rect.set_width(text_rect.width() + offset_x); - - // Disable clear type. This makes the text render in gray scale which - // makes it easier to compute the alpha value. - LOGFONT font_info; - GetObject(font.GetNativeFont(), sizeof(font_info), &font_info); - font_info.lfQuality = ANTIALIASED_QUALITY; - HFONT gray_scale_font = CreateFontIndirect(&font_info); - - HDC hdc = beginPlatformPaint(); - scoped_ptr<skia::BitmapPlatformDevice> gradient_bitmap( - skia::BitmapPlatformDevice::create(NULL, display_rect.width(), - display_rect.height(), false, NULL)); - if (is_truncating_head) - DrawTextGradientPart(hdc, *gradient_bitmap, text, color, gray_scale_font, - text_rect, head_part, is_rtl, flags); - if (is_truncating_tail) - DrawTextGradientPart(hdc, *gradient_bitmap, text, color, gray_scale_font, - text_rect, tail_part, !is_rtl, flags); - endPlatformPaint(); - - // Draw the solid part. - save(kClip_SaveFlag); - ClipRectInt(solid_part.x(), solid_part.y(), - solid_part.width(), solid_part.height()); - DrawStringInt(text, font, color, - text_rect.x(), text_rect.y(), - text_rect.width(), text_rect.height(), - flags); - restore(); - restore(); -} - } // namespace gfx |