| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "gfx/canvas_skia.h" | 5 #include "gfx/canvas_skia.h" |
| 6 | 6 |
| 7 #include <cairo/cairo.h> | 7 #include <cairo/cairo.h> |
| 8 #include <gtk/gtk.h> | 8 #include <gtk/gtk.h> |
| 9 #include <pango/pango.h> | 9 #include <pango/pango.h> |
| 10 #include <pango/pangocairo.h> | 10 #include <pango/pangocairo.h> |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 pango_layout_set_text(layout, utf8.data(), utf8.size()); | 155 pango_layout_set_text(layout, utf8.data(), utf8.size()); |
| 156 } else { | 156 } else { |
| 157 pango_layout_set_text(layout, utf8.data(), utf8.size()); | 157 pango_layout_set_text(layout, utf8.data(), utf8.size()); |
| 158 } | 158 } |
| 159 } | 159 } |
| 160 | 160 |
| 161 // A class to encapsulate string drawing params and operations. | 161 // A class to encapsulate string drawing params and operations. |
| 162 class DrawStringContext { | 162 class DrawStringContext { |
| 163 public: | 163 public: |
| 164 DrawStringContext(gfx::CanvasSkia* canvas, | 164 DrawStringContext(gfx::CanvasSkia* canvas, |
| 165 const std::wstring& text, | 165 const string16& text, |
| 166 const gfx::Font& font, | 166 const gfx::Font& font, |
| 167 const gfx::Rect& bounds, | 167 const gfx::Rect& bounds, |
| 168 const gfx::Rect& clip, | 168 const gfx::Rect& clip, |
| 169 int flags); | 169 int flags); |
| 170 ~DrawStringContext(); | 170 ~DrawStringContext(); |
| 171 | 171 |
| 172 void Draw(const SkColor& text_color); | 172 void Draw(const SkColor& text_color); |
| 173 void DrawWithHalo(const SkColor& text_color, | 173 void DrawWithHalo(const SkColor& text_color, |
| 174 const SkColor& halo_color); | 174 const SkColor& halo_color); |
| 175 | 175 |
| 176 private: | 176 private: |
| 177 const gfx::Rect& bounds_; | 177 const gfx::Rect& bounds_; |
| 178 int flags_; | 178 int flags_; |
| 179 const gfx::Font& font_; | 179 const gfx::Font& font_; |
| 180 | 180 |
| 181 gfx::CanvasSkia* canvas_; | 181 gfx::CanvasSkia* canvas_; |
| 182 cairo_t* cr_; | 182 cairo_t* cr_; |
| 183 PangoLayout* layout_; | 183 PangoLayout* layout_; |
| 184 | 184 |
| 185 int text_x_; | 185 int text_x_; |
| 186 int text_y_; | 186 int text_y_; |
| 187 int text_width_; | 187 int text_width_; |
| 188 int text_height_; | 188 int text_height_; |
| 189 | 189 |
| 190 DISALLOW_COPY_AND_ASSIGN(DrawStringContext); | 190 DISALLOW_COPY_AND_ASSIGN(DrawStringContext); |
| 191 }; | 191 }; |
| 192 | 192 |
| 193 DrawStringContext::DrawStringContext(gfx::CanvasSkia* canvas, | 193 DrawStringContext::DrawStringContext(gfx::CanvasSkia* canvas, |
| 194 const std::wstring& text, | 194 const string16& text, |
| 195 const gfx::Font& font, | 195 const gfx::Font& font, |
| 196 const gfx::Rect& bounds, | 196 const gfx::Rect& bounds, |
| 197 const gfx::Rect& clip, | 197 const gfx::Rect& clip, |
| 198 int flags) | 198 int flags) |
| 199 : bounds_(bounds), | 199 : bounds_(bounds), |
| 200 flags_(flags), | 200 flags_(flags), |
| 201 font_(font), | 201 font_(font), |
| 202 canvas_(canvas), | 202 canvas_(canvas), |
| 203 cr_(NULL), | 203 cr_(NULL), |
| 204 layout_(NULL), | 204 layout_(NULL), |
| 205 text_x_(bounds.x()), | 205 text_x_(bounds.x()), |
| 206 text_y_(bounds.y()), | 206 text_y_(bounds.y()), |
| 207 text_width_(0), | 207 text_width_(0), |
| 208 text_height_(0) { | 208 text_height_(0) { |
| 209 DCHECK(!bounds_.IsEmpty()); | 209 DCHECK(!bounds_.IsEmpty()); |
| 210 | 210 |
| 211 cr_ = canvas_->beginPlatformPaint(); | 211 cr_ = canvas_->beginPlatformPaint(); |
| 212 layout_ = pango_cairo_create_layout(cr_); | 212 layout_ = pango_cairo_create_layout(cr_); |
| 213 | 213 |
| 214 SetupPangoLayout(layout_, WideToUTF16Hack(text), font, bounds_.width(), | 214 SetupPangoLayout(layout_, text, font, bounds_.width(), flags_); |
| 215 flags_); | |
| 216 | 215 |
| 217 pango_layout_set_height(layout_, bounds_.height() * PANGO_SCALE); | 216 pango_layout_set_height(layout_, bounds_.height() * PANGO_SCALE); |
| 218 | 217 |
| 219 cairo_save(cr_); | 218 cairo_save(cr_); |
| 220 | 219 |
| 221 cairo_rectangle(cr_, clip.x(), clip.y(), clip.width(), clip.height()); | 220 cairo_rectangle(cr_, clip.x(), clip.y(), clip.width(), clip.height()); |
| 222 cairo_clip(cr_); | 221 cairo_clip(cr_); |
| 223 | 222 |
| 224 pango_layout_get_pixel_size(layout_, &text_width_, &text_height_); | 223 pango_layout_get_pixel_size(layout_, &text_width_, &text_height_); |
| 225 | 224 |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 339 // asked for. See the loop in pango-layout.c process_item that determines | 338 // asked for. See the loop in pango-layout.c process_item that determines |
| 340 // where to wrap. | 339 // where to wrap. |
| 341 *width = org_width; | 340 *width = org_width; |
| 342 } | 341 } |
| 343 | 342 |
| 344 g_object_unref(layout); | 343 g_object_unref(layout); |
| 345 cairo_destroy(cr); | 344 cairo_destroy(cr); |
| 346 cairo_surface_destroy(surface); | 345 cairo_surface_destroy(surface); |
| 347 } | 346 } |
| 348 | 347 |
| 349 void CanvasSkia::DrawStringWithHalo(const std::wstring& text, | 348 void CanvasSkia::DrawStringWithHalo(const string16& text, |
| 350 const gfx::Font& font, | 349 const gfx::Font& font, |
| 351 const SkColor& text_color, | 350 const SkColor& text_color, |
| 352 const SkColor& halo_color, | 351 const SkColor& halo_color, |
| 353 int x, int y, int w, int h, | 352 int x, int y, int w, int h, |
| 354 int flags) { | 353 int flags) { |
| 355 if (w <= 0 || h <= 0) | 354 if (w <= 0 || h <= 0) |
| 356 return; | 355 return; |
| 357 | 356 |
| 358 gfx::Rect bounds(x, y, w, h); | 357 gfx::Rect bounds(x, y, w, h); |
| 359 gfx::Rect clip(x - 1, y - 1, w + 2, h + 2); // Bigger clip for halo | 358 gfx::Rect clip(x - 1, y - 1, w + 2, h + 2); // Bigger clip for halo |
| 360 DrawStringContext context(this, text, font, bounds, clip,flags); | 359 DrawStringContext context(this, text, font, bounds, clip,flags); |
| 361 context.DrawWithHalo(text_color, halo_color); | 360 context.DrawWithHalo(text_color, halo_color); |
| 362 } | 361 } |
| 363 | 362 |
| 364 void CanvasSkia::DrawStringInt(const std::wstring& text, | 363 void CanvasSkia::DrawStringInt(const string16& text, |
| 365 const gfx::Font& font, | 364 const gfx::Font& font, |
| 366 const SkColor& color, | 365 const SkColor& color, |
| 367 int x, int y, int w, int h, | 366 int x, int y, int w, int h, |
| 368 int flags) { | 367 int flags) { |
| 369 if (w <= 0 || h <= 0) | 368 if (w <= 0 || h <= 0) |
| 370 return; | 369 return; |
| 371 | 370 |
| 372 gfx::Rect bounds(x, y, w, h); | 371 gfx::Rect bounds(x, y, w, h); |
| 373 DrawStringContext context(this, text, font, bounds, bounds, flags); | 372 DrawStringContext context(this, text, font, bounds, bounds, flags); |
| 374 context.Draw(color); | 373 context.Draw(color); |
| 375 } | 374 } |
| 376 | 375 |
| 377 void CanvasSkia::DrawGdkPixbuf(GdkPixbuf* pixbuf, int x, int y) { | 376 void CanvasSkia::DrawGdkPixbuf(GdkPixbuf* pixbuf, int x, int y) { |
| 378 if (!pixbuf) { | 377 if (!pixbuf) { |
| 379 NOTREACHED(); | 378 NOTREACHED(); |
| 380 return; | 379 return; |
| 381 } | 380 } |
| 382 | 381 |
| 383 cairo_t* cr = beginPlatformPaint(); | 382 cairo_t* cr = beginPlatformPaint(); |
| 384 gdk_cairo_set_source_pixbuf(cr, pixbuf, x, y); | 383 gdk_cairo_set_source_pixbuf(cr, pixbuf, x, y); |
| 385 cairo_paint(cr); | 384 cairo_paint(cr); |
| 386 } | 385 } |
| 387 | 386 |
| 388 } // namespace gfx | 387 } // namespace gfx |
| OLD | NEW |