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

Side by Side Diff: ui/gfx/paint_vector_icon.cc

Issue 1270783005: V1 of material design find in page bar (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: mvp Created 5 years, 4 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/paint_vector_icon.h" 5 #include "ui/gfx/paint_vector_icon.h"
6 6
7 #include <map> 7 #include <map>
8 8
9 #include "base/lazy_instance.h" 9 #include "base/lazy_instance.h"
10 #include "base/strings/string_number_conversions.h" 10 #include "base/strings/string_number_conversions.h"
11 #include "base/strings/string_split.h" 11 #include "base/strings/string_split.h"
12 #include "third_party/skia/include/core/SkPath.h" 12 #include "third_party/skia/include/core/SkPath.h"
13 #include "ui/gfx/canvas.h" 13 #include "ui/gfx/canvas.h"
14 #include "ui/gfx/image/canvas_image_source.h" 14 #include "ui/gfx/image/canvas_image_source.h"
15 #include "ui/gfx/vector_icon_types.h" 15 #include "ui/gfx/vector_icon_types.h"
16 #include "ui/gfx/vector_icons2.h" 16 #include "ui/gfx/vector_icons2.h"
17 17
18 namespace gfx { 18 namespace gfx {
19 19
20 namespace { 20 namespace {
21 21
22 // Translates a string such as "MOVE_TO" into a command such as MOVE_TO. 22 // Translates a string such as "MOVE_TO" into a command such as MOVE_TO.
23 CommandType CommandFromString(const std::string& source) { 23 CommandType CommandFromString(const std::string& source) {
24 #define RETURN_IF_IS(command) \ 24 #define RETURN_IF_IS(command) \
25 if (source == #command) \ 25 if (source == #command) \
26 return command; 26 return command;
27 27
28 RETURN_IF_IS(NEW_PATH); 28 RETURN_IF_IS(NEW_PATH);
sky 2015/08/05 00:06:01 Don't you need to update this?
Evan Stade 2015/08/05 19:04:25 only if I want it to keep working!
29 RETURN_IF_IS(PATH_COLOR_ARGB); 29 RETURN_IF_IS(PATH_COLOR_ARGB);
30 RETURN_IF_IS(MOVE_TO); 30 RETURN_IF_IS(MOVE_TO);
31 RETURN_IF_IS(R_MOVE_TO); 31 RETURN_IF_IS(R_MOVE_TO);
32 RETURN_IF_IS(LINE_TO); 32 RETURN_IF_IS(LINE_TO);
33 RETURN_IF_IS(R_LINE_TO); 33 RETURN_IF_IS(R_LINE_TO);
34 RETURN_IF_IS(H_LINE_TO); 34 RETURN_IF_IS(H_LINE_TO);
35 RETURN_IF_IS(R_H_LINE_TO); 35 RETURN_IF_IS(R_H_LINE_TO);
36 RETURN_IF_IS(V_LINE_TO); 36 RETURN_IF_IS(V_LINE_TO);
37 RETURN_IF_IS(R_V_LINE_TO); 37 RETURN_IF_IS(R_V_LINE_TO);
38 RETURN_IF_IS(CUBIC_TO); 38 RETURN_IF_IS(CUBIC_TO);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 70
71 std::vector<SkPath> paths; 71 std::vector<SkPath> paths;
72 paths.push_back(SkPath()); 72 paths.push_back(SkPath());
73 paths.back().setFillType(SkPath::kEvenOdd_FillType); 73 paths.back().setFillType(SkPath::kEvenOdd_FillType);
74 size_t canvas_size = kReferenceSizeDip; 74 size_t canvas_size = kReferenceSizeDip;
75 75
76 std::vector<SkPaint> paints; 76 std::vector<SkPaint> paints;
77 paints.push_back(SkPaint()); 77 paints.push_back(SkPaint());
78 paints.back().setColor(color); 78 paints.back().setColor(color);
79 79
80 SkRect clip_rect = SkRect::MakeEmpty();
81
80 for (size_t i = 0; path_elements[i].type != END; i++) { 82 for (size_t i = 0; path_elements[i].type != END; i++) {
81 SkPath& path = paths.back(); 83 SkPath& path = paths.back();
84 SkPaint& paint = paints.back();
82 switch (path_elements[i].type) { 85 switch (path_elements[i].type) {
83 case NEW_PATH: { 86 case NEW_PATH: {
84 paths.push_back(SkPath()); 87 paths.push_back(SkPath());
85 paints.push_back(SkPaint()); 88 paints.push_back(SkPaint());
86 paints.back().setColor(color); 89 paints.back().setColor(color);
87 break; 90 break;
88 } 91 }
89 92
90 case PATH_COLOR_ARGB: { 93 case PATH_COLOR_ARGB: {
91 int a = SkScalarFloorToInt(path_elements[++i].arg); 94 int a = SkScalarFloorToInt(path_elements[++i].arg);
92 int r = SkScalarFloorToInt(path_elements[++i].arg); 95 int r = SkScalarFloorToInt(path_elements[++i].arg);
93 int g = SkScalarFloorToInt(path_elements[++i].arg); 96 int g = SkScalarFloorToInt(path_elements[++i].arg);
94 int b = SkScalarFloorToInt(path_elements[++i].arg); 97 int b = SkScalarFloorToInt(path_elements[++i].arg);
95 paints.back().setColor(SkColorSetARGB(a, r, g, b)); 98 paint.setColor(SkColorSetARGB(a, r, g, b));
96 break; 99 break;
97 } 100 }
98 101
102 case STROKE: {
103 paint.setStyle(SkPaint::kStroke_Style);
104 SkScalar width = path_elements[++i].arg;
105 paint.setStrokeWidth(width);
106 break;
107 }
108
99 case MOVE_TO: { 109 case MOVE_TO: {
100 SkScalar x = path_elements[++i].arg; 110 SkScalar x = path_elements[++i].arg;
101 SkScalar y = path_elements[++i].arg; 111 SkScalar y = path_elements[++i].arg;
102 path.moveTo(x, y); 112 path.moveTo(x, y);
103 break; 113 break;
104 } 114 }
105 115
106 case R_MOVE_TO: { 116 case R_MOVE_TO: {
107 SkScalar x = path_elements[++i].arg; 117 SkScalar x = path_elements[++i].arg;
108 SkScalar y = path_elements[++i].arg; 118 SkScalar y = path_elements[++i].arg;
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 path.close(); 196 path.close();
187 break; 197 break;
188 } 198 }
189 199
190 case CANVAS_DIMENSIONS: { 200 case CANVAS_DIMENSIONS: {
191 SkScalar width = path_elements[++i].arg; 201 SkScalar width = path_elements[++i].arg;
192 canvas_size = SkScalarTruncToInt(width); 202 canvas_size = SkScalarTruncToInt(width);
193 break; 203 break;
194 } 204 }
195 205
206 case CLIP: {
207 SkScalar x = path_elements[++i].arg;
208 SkScalar y = path_elements[++i].arg;
209 SkScalar w = path_elements[++i].arg;
210 SkScalar h = path_elements[++i].arg;
211 clip_rect = SkRect::MakeXYWH(x, y, w, h);
212 break;
213 }
214
196 case END: 215 case END:
197 NOTREACHED(); 216 NOTREACHED();
198 break; 217 break;
199 } 218 }
200 } 219 }
201 220
202 if (dip_size != canvas_size) { 221 if (dip_size != canvas_size) {
203 SkScalar scale = SkIntToScalar(dip_size) / SkIntToScalar(canvas_size); 222 SkScalar scale = SkIntToScalar(dip_size) / SkIntToScalar(canvas_size);
204 canvas->sk_canvas()->scale(scale, scale); 223 canvas->sk_canvas()->scale(scale, scale);
205 } 224 }
206 225
226 if (!clip_rect.isEmpty())
227 canvas->sk_canvas()->clipRect(clip_rect);
228
207 DCHECK_EQ(paints.size(), paths.size()); 229 DCHECK_EQ(paints.size(), paths.size());
208 for (size_t i = 0; i < paths.size(); ++i) { 230 for (size_t i = 0; i < paths.size(); ++i) {
209 paints[i].setStyle(SkPaint::kFill_Style);
210 paints[i].setAntiAlias(true); 231 paints[i].setAntiAlias(true);
232 paints[i].setStrokeCap(SkPaint::kRound_Cap);
211 paths[i].setFillType(SkPath::kEvenOdd_FillType); 233 paths[i].setFillType(SkPath::kEvenOdd_FillType);
212 canvas->DrawPath(paths[i], paints[i]); 234 canvas->DrawPath(paths[i], paints[i]);
213 } 235 }
214 } 236 }
215 237
216 class VectorIconSource : public CanvasImageSource { 238 class VectorIconSource : public CanvasImageSource {
217 public: 239 public:
218 VectorIconSource(VectorIconId id, size_t dip_size, SkColor color) 240 VectorIconSource(VectorIconId id, size_t dip_size, SkColor color)
219 : CanvasImageSource( 241 : CanvasImageSource(
220 gfx::Size(static_cast<int>(dip_size), static_cast<int>(dip_size)), 242 gfx::Size(static_cast<int>(dip_size), static_cast<int>(dip_size)),
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 static base::LazyInstance<VectorIconCache> g_icon_cache = 319 static base::LazyInstance<VectorIconCache> g_icon_cache =
298 LAZY_INSTANCE_INITIALIZER; 320 LAZY_INSTANCE_INITIALIZER;
299 321
300 } // namespace 322 } // namespace
301 323
302 void PaintVectorIcon(Canvas* canvas, 324 void PaintVectorIcon(Canvas* canvas,
303 VectorIconId id, 325 VectorIconId id,
304 size_t dip_size, 326 size_t dip_size,
305 SkColor color) { 327 SkColor color) {
306 DCHECK(VectorIconId::VECTOR_ICON_NONE != id); 328 DCHECK(VectorIconId::VECTOR_ICON_NONE != id);
307 PaintPath(canvas, GetPathForVectorIcon(id), dip_size, color); 329 const PathElement* path = canvas->image_scale() == 1.f
330 ? GetPathForVectorIconAt1xScale(id)
331 : GetPathForVectorIcon(id);
332 PaintPath(canvas, path, dip_size, color);
308 } 333 }
309 334
310 ImageSkia CreateVectorIcon(VectorIconId id, size_t dip_size, SkColor color) { 335 ImageSkia CreateVectorIcon(VectorIconId id, size_t dip_size, SkColor color) {
311 return g_icon_cache.Get().GetOrCreateIcon(id, dip_size, color); 336 return g_icon_cache.Get().GetOrCreateIcon(id, dip_size, color);
312 } 337 }
313 338
314 ImageSkia CreateVectorIconFromSource(const std::string& source, 339 ImageSkia CreateVectorIconFromSource(const std::string& source,
315 size_t dip_size, 340 size_t dip_size,
316 SkColor color) { 341 SkColor color) {
317 return ImageSkia( 342 return ImageSkia(
318 new VectorIconSource(source, dip_size, color), 343 new VectorIconSource(source, dip_size, color),
319 gfx::Size(static_cast<int>(dip_size), static_cast<int>(dip_size))); 344 gfx::Size(static_cast<int>(dip_size), static_cast<int>(dip_size)));
320 } 345 }
321 346
322 } // namespace gfx 347 } // namespace gfx
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698