Index: ui/gfx/canvas.cc |
diff --git a/ui/gfx/canvas.cc b/ui/gfx/canvas.cc |
index 80eeda5a61c5f5a2cde2d2b154fdbb78e020b285..f484964975b6f1936890c0b62aa1aebe423b575f 100644 |
--- a/ui/gfx/canvas.cc |
+++ b/ui/gfx/canvas.cc |
@@ -14,6 +14,7 @@ |
#include "third_party/skia/include/core/SkBitmap.h" |
#include "third_party/skia/include/core/SkPath.h" |
#include "third_party/skia/include/core/SkRefCnt.h" |
+#include "third_party/skia/include/effects/SkDashPathEffect.h" |
#include "third_party/skia/include/effects/SkGradientShader.h" |
#include "ui/gfx/font_list.h" |
#include "ui/gfx/geometry/insets_f.h" |
@@ -103,46 +104,32 @@ int Canvas::DefaultCanvasTextAlignment() { |
return base::i18n::IsRTL() ? TEXT_ALIGN_RIGHT : TEXT_ALIGN_LEFT; |
} |
-void Canvas::DrawDashedRect(const RectF& rect, SkColor color) { |
- if (rect.IsEmpty()) |
+void Canvas::DrawDashedRect(const RectF& inrect, SkColor color) { |
+ if (inrect.IsEmpty()) |
return; |
- // Create a 2D bitmap containing alternating on/off pixels - we do this |
- // so that you never get two pixels of the same color around the edges |
- // of the focus rect (this may mean that opposing edges of the rect may |
- // have a dot pattern out of phase to each other). |
- static SkColor last_color; |
- static SkBitmap* dots = NULL; |
- if (!dots || last_color != color) { |
- int col_pixels = 32; |
- int row_pixels = 32; |
- |
- delete dots; |
- last_color = color; |
- dots = new SkBitmap; |
- dots->allocN32Pixels(col_pixels, row_pixels); |
- dots->eraseARGB(0, 0, 0, 0); |
- |
- uint32_t* dot = dots->getAddr32(0, 0); |
- for (int i = 0; i < row_pixels; i++) { |
- for (int u = 0; u < col_pixels; u++) { |
- if ((u % 2 + i % 2) % 2 != 0) { |
- dot[i * row_pixels + u] = color; |
- } |
- } |
- } |
- } |
+ RectF rect = inrect; |
- // Make a shader for the bitmap with an origin of the box we'll draw. |
cc::PaintFlags flags; |
- flags.setShader(cc::WrapSkShader(SkShader::MakeBitmapShader( |
- *dots, SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode))); |
- |
- DrawRect(RectF(rect.x(), rect.y(), rect.width(), 1), flags); |
- DrawRect(RectF(rect.x(), rect.y() + rect.height() - 1, rect.width(), 1), |
- flags); |
- DrawRect(RectF(rect.x(), rect.y(), 1, rect.height()), flags); |
- DrawRect(RectF(rect.x() + rect.width() - 1, rect.y(), 1, rect.height()), |
- flags); |
+ flags.setColor(color); |
+ SkScalar intervals[] = {1.f, 1.f}; |
+ flags.setStrokeWidth(1.f); |
+ flags.setStyle(cc::PaintFlags::kStroke_Style); |
+ rect.Inset(gfx::InsetsF(0.5f)); |
+ |
+ flags.setPathEffect(SkDashPathEffect::Make(intervals, 2, 0)); |
+ |
+ // Top-left to top-right. |
+ canvas_->drawLine(rect.x() - 0.5f, rect.y(), rect.right() + 0.5f, rect.y(), |
+ flags); |
+ // Top-left to bottom-left. |
+ canvas_->drawLine(rect.right() + 0.5f, rect.bottom(), rect.x() - 0.5f, |
+ rect.bottom(), flags); |
+ // Bottom-right to bottom-left. |
+ canvas_->drawLine(rect.x(), rect.y() - 0.5f, rect.x(), rect.bottom() + 0.5f, |
+ flags); |
+ // Bottom-right to top-right. |
+ canvas_->drawLine(rect.right(), rect.bottom() + 0.5f, rect.right(), |
+ rect.y() - 0.5f, flags); |
} |
float Canvas::UndoDeviceScaleFactor() { |