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

Unified Diff: ui/gfx/canvas_skia_linux.cc

Issue 7105001: Ellide by fading (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 7 months 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 | « chrome/browser/ui/views/tabs/tab.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/gfx/canvas_skia_linux.cc
diff --git a/ui/gfx/canvas_skia_linux.cc b/ui/gfx/canvas_skia_linux.cc
index 1d5d29856a7d091c2073a3727988cce74f3c58df..dd8aaf725edfde51437bca30fd4c7f6097120a68 100644
--- a/ui/gfx/canvas_skia_linux.cc
+++ b/ui/gfx/canvas_skia_linux.cc
@@ -9,7 +9,9 @@
#include <pango/pango.h>
#include <pango/pangocairo.h>
+#include "base/i18n/rtl.h"
#include "base/logging.h"
+#include "base/stringprintf.h"
oshima 2011/05/31 23:56:10 you dont need this anymore? (guessing you added fo
#include "base/utf_string_conversions.h"
#include "ui/gfx/font.h"
#include "ui/gfx/gtk_util.h"
@@ -20,6 +22,13 @@ namespace {
const gunichar kAcceleratorChar = '&';
+// Multiply by the text height to determine how much text should be faded
+// when elliding.
+const double kFadeWidthFactor = 1.5;
+
+// End state of the elliding fade.
+const double kKFadeFinalAlpha = 0.15;
+
// Font settings that we initialize once and then use when drawing text in
// DrawStringInt().
static cairo_font_options_t* cairo_font_options = NULL;
@@ -108,22 +117,26 @@ static void SetupPangoLayout(PangoLayout* layout,
if (width > 0)
pango_layout_set_width(layout, width * PANGO_SCALE);
- if (flags & gfx::Canvas::NO_ELLIPSIS) {
- pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_NONE);
- } else {
- pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END);
- }
-
if (flags & gfx::Canvas::TEXT_ALIGN_CENTER) {
pango_layout_set_alignment(layout, PANGO_ALIGN_CENTER);
} else if (flags & gfx::Canvas::TEXT_ALIGN_RIGHT) {
pango_layout_set_alignment(layout, PANGO_ALIGN_RIGHT);
}
- if (flags & gfx::Canvas::MULTI_LINE) {
- pango_layout_set_wrap(layout,
- (flags & gfx::Canvas::CHARACTER_BREAK) ?
- PANGO_WRAP_WORD_CHAR : PANGO_WRAP_WORD);
+ if (flags & gfx::Canvas::NO_ELLIPSIS) {
+ pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_NONE);
+ if (flags & gfx::Canvas::MULTI_LINE) {
+ pango_layout_set_wrap(layout,
+ (flags & gfx::Canvas::CHARACTER_BREAK) ?
+ PANGO_WRAP_WORD_CHAR : PANGO_WRAP_WORD);
+ }
+ } else if (base::i18n::IsRTL()){
+ pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END);
+ } else {
+ // Fading the text will be handled in the draw operation.
+ // that the text is only on one line.
+ pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_NONE);
+ pango_layout_set_width(layout, -1);
Dmitry Polukhin 2011/06/08 12:50:35 Setting width to -1 breaks TEXT_ALIGN_CENTER. See
Dmitry Polukhin 2011/06/08 13:09:48 It looks like we can't disable wrap without settin
}
// Set the resolution to match that used by Gtk. If we don't set the
@@ -253,13 +266,64 @@ DrawStringContext::~DrawStringContext() {
}
void DrawStringContext::Draw(const SkColor& text_color) {
- cairo_set_source_rgba(cr_,
- SkColorGetR(text_color) / 255.0,
- SkColorGetG(text_color) / 255.0,
- SkColorGetB(text_color) / 255.0,
- SkColorGetA(text_color) / 255.0);
- cairo_move_to(cr_, text_x_, text_y_);
- pango_cairo_show_layout(cr_, layout_);
+ double r = SkColorGetR(text_color) / 255.0,
+ g = SkColorGetG(text_color) / 255.0,
+ b = SkColorGetB(text_color) / 255.0,
+ a = SkColorGetA(text_color) / 255.0;
+
+ if (base::i18n::IsRTL() ||
+ (flags_ & gfx::Canvas::NO_ELLIPSIS) ||
+ text_width_ <= bounds_.width()) {
+ cairo_set_source_rgba(cr_, r, g, b, a);
+ cairo_move_to(cr_, text_x_, text_y_);
+ pango_cairo_show_layout(cr_, layout_);
+ } else {
+ // Fade to gray to ellide.
+ int fade_width = static_cast<double>(text_height_) * kFadeWidthFactor;
+ if (fade_width > (bounds_.width() / 2)) {
+ // Don't fade more than half the text.
+ fade_width = bounds_.width() / 2;
+ }
+ int fade_x = bounds_.x() + bounds_.width() - fade_width;
+
+ // Draw left part of text, clipped at fade_width.
+ cairo_save(cr_);
+ cairo_rectangle(
oshima 2011/05/31 23:56:10 indent at "(" ?
+ cr_,
+ bounds_.x(),
+ bounds_.y(),
+ bounds_.width() - fade_width,
+ bounds_.height());
+ cairo_clip(cr_);
+ cairo_set_source_rgba(cr_, r, g, b, a);
+ cairo_move_to(cr_, text_x_, text_y_);
+ pango_cairo_show_layout(cr_, layout_);
+ cairo_restore(cr_);
+
+ // Clip to the left of fade_width.
+ cairo_save(cr_);
+ cairo_rectangle(cr_, fade_x, bounds_.y(), fade_width, bounds_.height());
+ cairo_clip(cr_);
+
+ // Create clip for text.
+ cairo_move_to(cr_, text_x_, text_y_);
+ pango_cairo_layout_path(cr_, layout_);
+ cairo_clip(cr_);
+
+ // Create alpha fade pattern.
+ cairo_pattern_t* pattern = cairo_pattern_create_linear(
+ fade_x, bounds_.y(), bounds_.x() + bounds_.width(), bounds_.y());
+ cairo_pattern_add_color_stop_rgba(pattern, 0, r, g, b, a);
+ cairo_pattern_add_color_stop_rgba(pattern, 1, r, g, b, kKFadeFinalAlpha);
+
+ // Draw pattern, clipped by text.
+ cairo_set_source(cr_, pattern);
+ cairo_fill(cr_);
+ cairo_paint(cr_);
+ cairo_pattern_destroy(pattern);
+
+ cairo_restore(cr_);
+ }
}
void DrawStringContext::DrawWithHalo(const SkColor& text_color,
« no previous file with comments | « chrome/browser/ui/views/tabs/tab.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698