| Index: ui/gfx/vector_icons.cc
|
| diff --git a/ui/gfx/vector_icons.cc b/ui/gfx/vector_icons.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0706fe7a4bb312dbc9ee10e9767b3b8acfd09d5b
|
| --- /dev/null
|
| +++ b/ui/gfx/vector_icons.cc
|
| @@ -0,0 +1,199 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "ui/gfx/vector_icons.h"
|
| +
|
| +#include "ui/gfx/canvas.h"
|
| +
|
| +namespace gfx {
|
| +
|
| +namespace {
|
| +
|
| +const int kReferenceSizeDip = 48;
|
| +
|
| +enum CommandType {
|
| + MOVE_TO,
|
| + R_MOVE_TO,
|
| + LINE_TO,
|
| + R_LINE_TO,
|
| + H_LINE_TO,
|
| + R_H_LINE_TO,
|
| + V_LINE_TO,
|
| + R_V_LINE_TO,
|
| + R_CUBIC_TO,
|
| + CIRCLE,
|
| + CLOSE,
|
| + END
|
| +};
|
| +
|
| +struct PathElement {
|
| + PathElement(CommandType value) : type(value) {}
|
| + PathElement(SkScalar value) : arg(value) {}
|
| +
|
| + union {
|
| + CommandType type;
|
| + SkScalar arg;
|
| + };
|
| +};
|
| +
|
| +const PathElement* GetPathForVectorIcon(VectorIconId id) {
|
| + switch (id) {
|
| + case VectorIconId::VECTOR_ICON_NONE:
|
| + NOTREACHED();
|
| + return nullptr;
|
| +
|
| + case VectorIconId::CHECK_CIRCLE: {
|
| + static PathElement path[] = {
|
| + CIRCLE, 24, 24, 20,
|
| + MOVE_TO, 20, 34,
|
| + LINE_TO, 10, 24,
|
| + R_LINE_TO, 2.83f, -2.83f,
|
| + LINE_TO, 20, 28.34f,
|
| + R_LINE_TO, 15.17f, -15.17f,
|
| + LINE_TO, 38, 16,
|
| + LINE_TO, 20, 34,
|
| + END
|
| + };
|
| + return path;
|
| + }
|
| +
|
| + case VectorIconId::PHOTO_CAMERA: {
|
| + static PathElement path[] = {
|
| + CIRCLE, 24, 24, 6.4f,
|
| + MOVE_TO, 18, 4,
|
| + R_LINE_TO, -3.66f, 4,
|
| + H_LINE_TO, 8,
|
| + R_CUBIC_TO, -2.21f, 0, -4, 1.79f, -4, 4,
|
| + R_V_LINE_TO, 24,
|
| + R_CUBIC_TO, 0, 2.21f, 1.79f, 4, 4, 4,
|
| + R_H_LINE_TO, 32,
|
| + R_CUBIC_TO, 2.21f, 0, 4, -1.79f, 4, -4,
|
| + V_LINE_TO, 12,
|
| + R_CUBIC_TO, 0, -2.21f, -1.79f, -4, -4, -4,
|
| + R_H_LINE_TO, -6.34f,
|
| + LINE_TO, 30, 4,
|
| + H_LINE_TO, 18,
|
| + CLOSE,
|
| + CIRCLE, 24, 24, 10,
|
| + END
|
| + };
|
| + return path;
|
| + }
|
| + }
|
| +
|
| + NOTREACHED();
|
| + return nullptr;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +void PaintVectorIcon(Canvas* canvas,
|
| + VectorIconId id,
|
| + size_t dip_size,
|
| + SkColor color) {
|
| + DCHECK(VectorIconId::VECTOR_ICON_NONE != id);
|
| + const PathElement* path_elements = GetPathForVectorIcon(id);
|
| + SkPath path;
|
| + path.setFillType(SkPath::kEvenOdd_FillType);
|
| + if (dip_size != kReferenceSizeDip) {
|
| + SkScalar scale = SkIntToScalar(dip_size) / SkIntToScalar(kReferenceSizeDip);
|
| + canvas->sk_canvas()->scale(scale, scale);
|
| + }
|
| +
|
| + for (size_t i = 0; path_elements[i].type != END;) {
|
| + switch (path_elements[i++].type) {
|
| + case MOVE_TO: {
|
| + SkScalar x = path_elements[i++].arg;
|
| + SkScalar y = path_elements[i++].arg;
|
| + path.moveTo(x, y);
|
| + break;
|
| + }
|
| +
|
| + case R_MOVE_TO: {
|
| + SkScalar x = path_elements[i++].arg;
|
| + SkScalar y = path_elements[i++].arg;
|
| + path.rMoveTo(x, y);
|
| + break;
|
| + }
|
| +
|
| + case LINE_TO: {
|
| + SkScalar x = path_elements[i++].arg;
|
| + SkScalar y = path_elements[i++].arg;
|
| + path.lineTo(x, y);
|
| + break;
|
| + }
|
| +
|
| + case R_LINE_TO: {
|
| + SkScalar x = path_elements[i++].arg;
|
| + SkScalar y = path_elements[i++].arg;
|
| + path.rLineTo(x, y);
|
| + break;
|
| + }
|
| +
|
| + case H_LINE_TO: {
|
| + SkPoint last_point;
|
| + path.getLastPt(&last_point);
|
| + SkScalar x = path_elements[i++].arg;
|
| + path.lineTo(x, last_point.fY);
|
| + break;
|
| + }
|
| +
|
| + case R_H_LINE_TO: {
|
| + SkScalar x = path_elements[i++].arg;
|
| + path.rLineTo(x, 0);
|
| + break;
|
| + }
|
| +
|
| + case V_LINE_TO: {
|
| + SkPoint last_point;
|
| + path.getLastPt(&last_point);
|
| + SkScalar y = path_elements[i++].arg;
|
| + path.lineTo(last_point.fX, y);
|
| + break;
|
| + }
|
| +
|
| + case R_V_LINE_TO: {
|
| + SkScalar y = path_elements[i++].arg;
|
| + path.rLineTo(0, y);
|
| + break;
|
| + }
|
| +
|
| + case R_CUBIC_TO: {
|
| + SkScalar x1 = path_elements[i++].arg;
|
| + SkScalar y1 = path_elements[i++].arg;
|
| + SkScalar x2 = path_elements[i++].arg;
|
| + SkScalar y2 = path_elements[i++].arg;
|
| + SkScalar x3 = path_elements[i++].arg;
|
| + SkScalar y3 = path_elements[i++].arg;
|
| + path.rCubicTo(x1, y1, x2, y2, x3, y3);
|
| + break;
|
| + }
|
| +
|
| + case CLOSE: {
|
| + path.close();
|
| + break;
|
| + }
|
| +
|
| + case CIRCLE: {
|
| + SkScalar x = path_elements[i++].arg;
|
| + SkScalar y = path_elements[i++].arg;
|
| + SkScalar r = path_elements[i++].arg;
|
| + path.addCircle(x, y, r);
|
| + break;
|
| + }
|
| +
|
| + case END:
|
| + NOTREACHED();
|
| + break;
|
| + }
|
| + }
|
| +
|
| + SkPaint paint;
|
| + paint.setStyle(SkPaint::kFill_Style);
|
| + paint.setAntiAlias(true);
|
| + paint.setColor(color);
|
| + canvas->DrawPath(path, paint);
|
| +}
|
| +
|
| +} // namespace gfx
|
|
|