| Index: ui/gfx/path_mac.mm
|
| diff --git a/ui/gfx/path_mac.mm b/ui/gfx/path_mac.mm
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f1a3529de5b15f13dec0bc43be29a6452cdd9271
|
| --- /dev/null
|
| +++ b/ui/gfx/path_mac.mm
|
| @@ -0,0 +1,116 @@
|
| +// Copyright 2016 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.
|
| +
|
| +#import "ui/gfx/path_mac.h"
|
| +
|
| +#import <Cocoa/Cocoa.h>
|
| +
|
| +#include "third_party/skia/include/core/SkRegion.h"
|
| +#include "ui/gfx/path.h"
|
| +
|
| +namespace {
|
| +
|
| +// Convert an SkPoint to an NSPoint.
|
| +NSPoint GetNSPointFromSkPoint(const SkPoint& point) {
|
| + return NSMakePoint(point.x(), point.y());
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +namespace gfx {
|
| +
|
| +NSBezierPath* CreateNSBezierPathFromSkRegion(const SkRegion& region) {
|
| + NSBezierPath* result = [NSBezierPath bezierPath];
|
| + for (SkRegion::Iterator i(region); !i.done(); i.next()) {
|
| + const SkIRect& rect = i.rect();
|
| + [result appendBezierPathWithRect:NSMakeRect(rect.x(), rect.y(),
|
| + rect.width(), rect.height())];
|
| + }
|
| + return result;
|
| +}
|
| +
|
| +NSBezierPath* CreateNSBezierPathFromSkPath(const SkPath& path) {
|
| + NSBezierPath* result = [NSBezierPath bezierPath];
|
| + SkPath::RawIter iter(path);
|
| + SkPoint points[4];
|
| + SkPath::Verb verb;
|
| + while ((verb = iter.next(points)) != SkPath::kDone_Verb) {
|
| + switch (verb) {
|
| + case SkPath::kMove_Verb: {
|
| + [result moveToPoint:GetNSPointFromSkPoint(points[0])];
|
| + break;
|
| + }
|
| + case SkPath::kLine_Verb: {
|
| + DCHECK(NSEqualPoints([result currentPoint],
|
| + GetNSPointFromSkPoint(points[0])));
|
| + [result lineToPoint:GetNSPointFromSkPoint(points[1])];
|
| + break;
|
| + }
|
| + case SkPath::kQuad_Verb: {
|
| + DCHECK(NSEqualPoints([result currentPoint],
|
| + GetNSPointFromSkPoint(points[0])));
|
| + SkPoint quad[] = {points[0], points[1], points[2]};
|
| + // NSBezierPath does not support quadratic bezier curves. Hence convert
|
| + // to cubic bezier curve.
|
| + SkPath::ConvertQuadToCubic(quad, points);
|
| + [result curveToPoint:GetNSPointFromSkPoint(points[3])
|
| + controlPoint1:GetNSPointFromSkPoint(points[1])
|
| + controlPoint2:GetNSPointFromSkPoint(points[2])];
|
| + break;
|
| + }
|
| + case SkPath::kCubic_Verb: {
|
| + DCHECK(NSEqualPoints([result currentPoint],
|
| + GetNSPointFromSkPoint(points[0])));
|
| + [result curveToPoint:GetNSPointFromSkPoint(points[3])
|
| + controlPoint1:GetNSPointFromSkPoint(points[1])
|
| + controlPoint2:GetNSPointFromSkPoint(points[2])];
|
| + break;
|
| + }
|
| + case SkPath::kConic_Verb: {
|
| + DCHECK(NSEqualPoints([result currentPoint],
|
| + GetNSPointFromSkPoint(points[0])));
|
| + // Approximate with quads. Use two for now, increase if more precision
|
| + // is needed.
|
| + const size_t kPow2 = 1;
|
| + const size_t quadCount = 1 << kPow2;
|
| + SkPoint quads[1 + 2 * quadCount];
|
| + SkPath::ConvertConicToQuads(points[0], points[1], points[2],
|
| + iter.conicWeight(), quads, kPow2);
|
| + for (size_t i = 0; i < quadCount; i++) {
|
| + SkPoint quad[] = {quads[2 * i], quads[2 * i + 1], quads[2 * i + 2]};
|
| + SkPath::ConvertQuadToCubic(quad, points);
|
| + [result curveToPoint:GetNSPointFromSkPoint(points[3])
|
| + controlPoint1:GetNSPointFromSkPoint(points[1])
|
| + controlPoint2:GetNSPointFromSkPoint(points[2])];
|
| + }
|
| + break;
|
| + }
|
| + case SkPath::kClose_Verb: {
|
| + [result closePath];
|
| + break;
|
| + }
|
| + default: { NOTREACHED(); }
|
| + }
|
| + }
|
| +
|
| + // Set up the fill type.
|
| + switch (path.getFillType()) {
|
| + case SkPath::kWinding_FillType:
|
| + [result setWindingRule:NSNonZeroWindingRule];
|
| + break;
|
| + case SkPath::kEvenOdd_FillType:
|
| + [result setWindingRule:NSEvenOddWindingRule];
|
| + break;
|
| + case SkPath::kInverseWinding_FillType:
|
| + case SkPath::kInverseEvenOdd_FillType:
|
| + NOTREACHED() << "NSBezierCurve does not support inverse fill types.";
|
| + break;
|
| + default:
|
| + NOTREACHED();
|
| + }
|
| +
|
| + return result;
|
| +}
|
| +
|
| +} // namespace gfx
|
|
|