Index: ui/gfx/canvas_skia_linux.cc |
diff --git a/ui/gfx/canvas_skia_linux.cc b/ui/gfx/canvas_skia_linux.cc |
index 8101dfa9ea9e0d15d640b3889799df7c61518b31..4728eee6bbdf7e2c9e0187acee5c9f1f957b2c98 100644 |
--- a/ui/gfx/canvas_skia_linux.cc |
+++ b/ui/gfx/canvas_skia_linux.cc |
@@ -26,18 +26,11 @@ using std::max; |
namespace { |
-// 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 kFadeFinalAlpha = 0.15; |
- |
// Width of the border drawn around haloed text. |
const double kTextHaloWidth = 1.0; |
// A class to encapsulate string drawing params and operations. |
-class DrawStringContext { |
+class DrawStringContext : public gfx::PangoDrawString { |
public: |
DrawStringContext(gfx::CanvasSkia* canvas, |
const string16& text, |
@@ -47,29 +40,10 @@ class DrawStringContext { |
int flags); |
~DrawStringContext(); |
- void Draw(const SkColor& text_color); |
void DrawWithHalo(const SkColor& text_color, const SkColor& halo_color); |
private: |
- // Draw an underline under the text using |cr|, which must already be |
- // initialized with the correct source. |extra_edge_width| is added to the |
- // outer edge of the line. Helper method for Draw() and DrawWithHalo(). |
- void DrawUnderline(cairo_t* cr, double extra_edge_width); |
- |
- const gfx::Rect& bounds_; |
- int flags_; |
- const gfx::Font& font_; |
- |
gfx::CanvasSkia* canvas_; |
- cairo_t* cr_; |
- PangoLayout* layout_; |
- |
- int text_x_; |
- int text_y_; |
- int text_width_; |
- int text_height_; |
- |
- base::i18n::TextDirection text_direction_; |
DISALLOW_COPY_AND_ASSIGN(DrawStringContext); |
}; |
@@ -80,93 +54,17 @@ DrawStringContext::DrawStringContext(gfx::CanvasSkia* canvas, |
const gfx::Rect& bounds, |
const gfx::Rect& clip, |
int flags) |
- : bounds_(bounds), |
- flags_(flags), |
- font_(font), |
- canvas_(canvas), |
- cr_(NULL), |
- layout_(NULL), |
- text_x_(bounds.x()), |
- text_y_(bounds.y()), |
- text_width_(0), |
- text_height_(0), |
- text_direction_(base::i18n::GetFirstStrongCharacterDirection(text)) { |
- DCHECK(!bounds_.IsEmpty()); |
- |
- cr_ = skia::BeginPlatformPaint(canvas_->sk_canvas()); |
- layout_ = pango_cairo_create_layout(cr_); |
- |
- gfx::SetupPangoLayout( |
- layout_, text, font, bounds_.width(), text_direction_, flags_); |
- |
- pango_layout_set_height(layout_, bounds_.height() * PANGO_SCALE); |
- |
- cairo_save(cr_); |
- |
- cairo_rectangle(cr_, clip.x(), clip.y(), clip.width(), clip.height()); |
- cairo_clip(cr_); |
- |
- pango_layout_get_pixel_size(layout_, &text_width_, &text_height_); |
- |
- if (flags_ & gfx::Canvas::TEXT_VALIGN_TOP) { |
- // Cairo should draw from the top left corner already. |
- } else if (flags_ & gfx::Canvas::TEXT_VALIGN_BOTTOM) { |
- text_y_ += (bounds.height() - text_height_); |
- } else { |
- // Vertically centered. |
- text_y_ += ((bounds.height() - text_height_) / 2); |
- } |
+ : PangoDrawString(skia::BeginPlatformPaint(canvas->sk_canvas()), |
+ text, |
+ font, |
+ bounds, |
+ clip, |
+ flags), |
+ canvas_(canvas) { |
} |
DrawStringContext::~DrawStringContext() { |
- cairo_restore(cr_); |
skia::EndPlatformPaint(canvas_->sk_canvas()); |
- g_object_unref(layout_); |
- // NOTE: BeginPlatformPaint returned its surface, we shouldn't destroy it. |
-} |
- |
-void DrawStringContext::Draw(const SkColor& text_color) { |
- 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; |
- |
- cairo_pattern_t* pattern = NULL; |
- |
- cairo_save(cr_); |
- |
- // If we're not eliding, use a fixed color. |
- // Otherwise, create a gradient pattern to use as the source. |
- if (text_direction_ == base::i18n::RIGHT_TO_LEFT || |
- (flags_ & gfx::Canvas::NO_ELLIPSIS) || |
- text_width_ <= bounds_.width()) { |
- cairo_set_source_rgba(cr_, r, g, b, a); |
- } else { |
- // Fade to semi-transparent to elide. |
- 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; |
- |
- 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, kFadeFinalAlpha); |
- cairo_set_source(cr_, pattern); |
- } |
- |
- cairo_move_to(cr_, text_x_, text_y_); |
- pango_cairo_show_layout(cr_, layout_); |
- |
- if (font_.GetStyle() & gfx::Font::UNDERLINED) |
- DrawUnderline(cr_, 0.0); |
- |
- if (pattern) |
- cairo_pattern_destroy(pattern); |
- |
- cairo_restore(cr_); |
} |
void DrawStringContext::DrawWithHalo(const SkColor& text_color, |
@@ -220,19 +118,6 @@ void DrawStringContext::DrawWithHalo(const SkColor& text_color, |
canvas_->DrawBitmapInt(text_bitmap, text_x_ - 1, text_y_ - 1); |
} |
-void DrawStringContext::DrawUnderline(cairo_t* cr, double extra_edge_width) { |
- gfx::PlatformFontPango* platform_font = |
- static_cast<gfx::PlatformFontPango*>(font_.platform_font()); |
- const double underline_y = |
- static_cast<double>(text_y_) + text_height_ + |
- platform_font->underline_position(); |
- cairo_set_line_width( |
- cr, platform_font->underline_thickness() + 2 * extra_edge_width); |
- cairo_move_to(cr, text_x_ - extra_edge_width, underline_y); |
- cairo_line_to(cr, text_x_ + text_width_ + extra_edge_width, underline_y); |
- cairo_stroke(cr); |
-} |
- |
} // namespace |
namespace gfx { |