OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "ui/gfx/canvas.h" | 5 #include "ui/gfx/canvas.h" |
6 | 6 |
7 #include <cmath> | 7 #include <cmath> |
8 #include <limits> | 8 #include <limits> |
9 | 9 |
10 #include "base/i18n/rtl.h" | 10 #include "base/i18n/rtl.h" |
11 #include "base/logging.h" | 11 #include "base/logging.h" |
12 #include "cc/paint/paint_flags.h" | 12 #include "cc/paint/paint_flags.h" |
13 #include "cc/paint/paint_shader.h" | 13 #include "cc/paint/paint_shader.h" |
14 #include "third_party/skia/include/core/SkBitmap.h" | 14 #include "third_party/skia/include/core/SkBitmap.h" |
15 #include "third_party/skia/include/core/SkPath.h" | 15 #include "third_party/skia/include/core/SkPath.h" |
16 #include "third_party/skia/include/core/SkRefCnt.h" | 16 #include "third_party/skia/include/core/SkRefCnt.h" |
| 17 #include "third_party/skia/include/effects/SkDashPathEffect.h" |
17 #include "third_party/skia/include/effects/SkGradientShader.h" | 18 #include "third_party/skia/include/effects/SkGradientShader.h" |
18 #include "ui/gfx/font_list.h" | 19 #include "ui/gfx/font_list.h" |
19 #include "ui/gfx/geometry/insets_f.h" | 20 #include "ui/gfx/geometry/insets_f.h" |
20 #include "ui/gfx/geometry/rect.h" | 21 #include "ui/gfx/geometry/rect.h" |
21 #include "ui/gfx/geometry/rect_conversions.h" | 22 #include "ui/gfx/geometry/rect_conversions.h" |
22 #include "ui/gfx/geometry/rect_f.h" | 23 #include "ui/gfx/geometry/rect_f.h" |
23 #include "ui/gfx/geometry/safe_integer_conversions.h" | 24 #include "ui/gfx/geometry/safe_integer_conversions.h" |
24 #include "ui/gfx/geometry/size_conversions.h" | 25 #include "ui/gfx/geometry/size_conversions.h" |
25 #include "ui/gfx/scoped_canvas.h" | 26 #include "ui/gfx/scoped_canvas.h" |
26 #include "ui/gfx/skia_paint_util.h" | 27 #include "ui/gfx/skia_paint_util.h" |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
96 float width = 0, height = 0; | 97 float width = 0, height = 0; |
97 SizeStringFloat(text, font_list, &width, &height, 0, NO_ELLIPSIS); | 98 SizeStringFloat(text, font_list, &width, &height, 0, NO_ELLIPSIS); |
98 return width; | 99 return width; |
99 } | 100 } |
100 | 101 |
101 // static | 102 // static |
102 int Canvas::DefaultCanvasTextAlignment() { | 103 int Canvas::DefaultCanvasTextAlignment() { |
103 return base::i18n::IsRTL() ? TEXT_ALIGN_RIGHT : TEXT_ALIGN_LEFT; | 104 return base::i18n::IsRTL() ? TEXT_ALIGN_RIGHT : TEXT_ALIGN_LEFT; |
104 } | 105 } |
105 | 106 |
106 void Canvas::DrawDashedRect(const RectF& rect, SkColor color) { | 107 void Canvas::DrawDashedRect(const RectF& inrect, SkColor color) { |
107 if (rect.IsEmpty()) | 108 if (inrect.IsEmpty()) |
108 return; | 109 return; |
109 // Create a 2D bitmap containing alternating on/off pixels - we do this | 110 RectF rect = inrect; |
110 // so that you never get two pixels of the same color around the edges | |
111 // of the focus rect (this may mean that opposing edges of the rect may | |
112 // have a dot pattern out of phase to each other). | |
113 static SkColor last_color; | |
114 static SkBitmap* dots = NULL; | |
115 if (!dots || last_color != color) { | |
116 int col_pixels = 32; | |
117 int row_pixels = 32; | |
118 | 111 |
119 delete dots; | 112 cc::PaintFlags flags; |
120 last_color = color; | 113 flags.setColor(color); |
121 dots = new SkBitmap; | 114 SkScalar intervals[] = {1.f, 1.f}; |
122 dots->allocN32Pixels(col_pixels, row_pixels); | 115 flags.setStrokeWidth(1.f); |
123 dots->eraseARGB(0, 0, 0, 0); | 116 flags.setStyle(cc::PaintFlags::kStroke_Style); |
| 117 rect.Inset(gfx::InsetsF(0.5f)); |
124 | 118 |
125 uint32_t* dot = dots->getAddr32(0, 0); | 119 flags.setPathEffect(SkDashPathEffect::Make(intervals, 2, 0)); |
126 for (int i = 0; i < row_pixels; i++) { | |
127 for (int u = 0; u < col_pixels; u++) { | |
128 if ((u % 2 + i % 2) % 2 != 0) { | |
129 dot[i * row_pixels + u] = color; | |
130 } | |
131 } | |
132 } | |
133 } | |
134 | 120 |
135 // Make a shader for the bitmap with an origin of the box we'll draw. | 121 // Top-left to top-right. |
136 cc::PaintFlags flags; | 122 canvas_->drawLine(rect.x() - 0.5f, rect.y(), rect.right() + 0.5f, rect.y(), |
137 flags.setShader(cc::WrapSkShader(SkShader::MakeBitmapShader( | 123 flags); |
138 *dots, SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode))); | 124 // Top-left to bottom-left. |
139 | 125 canvas_->drawLine(rect.right() + 0.5f, rect.bottom(), rect.x() - 0.5f, |
140 DrawRect(RectF(rect.x(), rect.y(), rect.width(), 1), flags); | 126 rect.bottom(), flags); |
141 DrawRect(RectF(rect.x(), rect.y() + rect.height() - 1, rect.width(), 1), | 127 // Bottom-right to bottom-left. |
142 flags); | 128 canvas_->drawLine(rect.x(), rect.y() - 0.5f, rect.x(), rect.bottom() + 0.5f, |
143 DrawRect(RectF(rect.x(), rect.y(), 1, rect.height()), flags); | 129 flags); |
144 DrawRect(RectF(rect.x() + rect.width() - 1, rect.y(), 1, rect.height()), | 130 // Bottom-right to top-right. |
145 flags); | 131 canvas_->drawLine(rect.right(), rect.bottom() + 0.5f, rect.right(), |
| 132 rect.y() - 0.5f, flags); |
146 } | 133 } |
147 | 134 |
148 float Canvas::UndoDeviceScaleFactor() { | 135 float Canvas::UndoDeviceScaleFactor() { |
149 SkScalar scale_factor = 1.0f / image_scale_; | 136 SkScalar scale_factor = 1.0f / image_scale_; |
150 canvas_->scale(scale_factor, scale_factor); | 137 canvas_->scale(scale_factor, scale_factor); |
151 return image_scale_; | 138 return image_scale_; |
152 } | 139 } |
153 | 140 |
154 void Canvas::Save() { | 141 void Canvas::Save() { |
155 canvas_->save(); | 142 canvas_->save(); |
(...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
582 bitmap_.emplace(); | 569 bitmap_.emplace(); |
583 bitmap_->allocPixels(info); | 570 bitmap_->allocPixels(info); |
584 // Ensure that the bitmap is zeroed, since the code expects that. | 571 // Ensure that the bitmap is zeroed, since the code expects that. |
585 memset(bitmap_->getPixels(), 0, bitmap_->getSafeSize()); | 572 memset(bitmap_->getPixels(), 0, bitmap_->getSafeSize()); |
586 | 573 |
587 owned_canvas_.emplace(bitmap_.value()); | 574 owned_canvas_.emplace(bitmap_.value()); |
588 return &owned_canvas_.value(); | 575 return &owned_canvas_.value(); |
589 } | 576 } |
590 | 577 |
591 } // namespace gfx | 578 } // namespace gfx |
OLD | NEW |