OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #import "ui/gfx/path_mac.h" | |
6 | |
7 #import <Cocoa/Cocoa.h> | |
8 | |
9 #include "third_party/skia/include/core/SkRegion.h" | |
10 #include "ui/gfx/path.h" | |
11 | |
12 namespace { | |
13 | |
14 // Convert an SkPoint to an NSPoint. | |
15 NSPoint GetNSPointFromSkPoint(const SkPoint& point) { | |
16 return NSMakePoint(point.x(), point.y()); | |
17 } | |
18 | |
19 } // namespace | |
20 | |
21 namespace gfx { | |
22 | |
23 NSBezierPath* CreateNSBezierPathFromSkRegion(const SkRegion& region) { | |
tapted
2016/02/05 04:51:06
do we need stuff for SkRegion yet, or just SkPath?
karandeepb
2016/02/08 07:47:08
Just SkPath. Should I remove it?
| |
24 NSBezierPath* result = [NSBezierPath bezierPath]; | |
25 for (SkRegion::Iterator i(region); !i.done(); i.next()) { | |
26 const SkIRect& rect = i.rect(); | |
27 [result appendBezierPathWithRect:NSMakeRect(rect.x(), rect.y(), | |
28 rect.width(), rect.height())]; | |
29 } | |
30 return result; | |
31 } | |
32 | |
33 NSBezierPath* CreateNSBezierPathFromSkPath(const SkPath& path) { | |
34 NSBezierPath* result = [NSBezierPath bezierPath]; | |
35 SkPath::RawIter iter(path); | |
36 SkPoint points[4]; | |
37 SkPath::Verb verb; | |
38 while ((verb = iter.next(points)) != SkPath::kDone_Verb) { | |
39 switch (verb) { | |
40 case SkPath::kMove_Verb: { | |
41 [result moveToPoint:GetNSPointFromSkPoint(points[0])]; | |
42 break; | |
43 } | |
44 case SkPath::kLine_Verb: { | |
45 DCHECK(NSEqualPoints([result currentPoint], | |
46 GetNSPointFromSkPoint(points[0]))); | |
47 [result lineToPoint:GetNSPointFromSkPoint(points[1])]; | |
48 break; | |
49 } | |
50 case SkPath::kQuad_Verb: { | |
51 DCHECK(NSEqualPoints([result currentPoint], | |
52 GetNSPointFromSkPoint(points[0]))); | |
53 SkPoint quad[] = {points[0], points[1], points[2]}; | |
54 // NSBezierPath does not support quadratic bezier curves. Hence convert | |
55 // to cubic bezier curve. | |
56 SkPath::ConvertQuadToCubic(quad, points); | |
57 [result curveToPoint:GetNSPointFromSkPoint(points[3]) | |
58 controlPoint1:GetNSPointFromSkPoint(points[1]) | |
59 controlPoint2:GetNSPointFromSkPoint(points[2])]; | |
60 break; | |
61 } | |
62 case SkPath::kCubic_Verb: { | |
63 DCHECK(NSEqualPoints([result currentPoint], | |
64 GetNSPointFromSkPoint(points[0]))); | |
65 [result curveToPoint:GetNSPointFromSkPoint(points[3]) | |
66 controlPoint1:GetNSPointFromSkPoint(points[1]) | |
67 controlPoint2:GetNSPointFromSkPoint(points[2])]; | |
68 break; | |
69 } | |
70 case SkPath::kConic_Verb: { | |
71 DCHECK(NSEqualPoints([result currentPoint], | |
72 GetNSPointFromSkPoint(points[0]))); | |
73 // Approximate with quads. Use two for now, increase if more precision | |
74 // is needed. | |
75 const size_t kPow2 = 1; | |
tapted
2016/02/05 04:51:06
I guess this comes from SkAutoConicToQuads. kPow2
karandeepb
2016/02/08 07:47:08
Done.
| |
76 const size_t quadCount = 1 << kPow2; | |
tapted
2016/02/05 04:51:06
nit: quadCount -> kQuadCount
karandeepb
2016/02/08 07:47:08
Done.
| |
77 SkPoint quads[1 + 2 * quadCount]; | |
tapted
2016/02/05 04:51:06
perhaps a comment like,
// The quads will share e
karandeepb
2016/02/08 07:47:08
Done.
| |
78 SkPath::ConvertConicToQuads(points[0], points[1], points[2], | |
79 iter.conicWeight(), quads, kPow2); | |
80 for (size_t i = 0; i < quadCount; i++) { | |
81 SkPoint quad[] = {quads[2 * i], quads[2 * i + 1], quads[2 * i + 2]}; | |
82 SkPath::ConvertQuadToCubic(quad, points); | |
83 [result curveToPoint:GetNSPointFromSkPoint(points[3]) | |
84 controlPoint1:GetNSPointFromSkPoint(points[1]) | |
85 controlPoint2:GetNSPointFromSkPoint(points[2])]; | |
86 } | |
87 break; | |
88 } | |
89 case SkPath::kClose_Verb: { | |
90 [result closePath]; | |
91 break; | |
92 } | |
93 default: { NOTREACHED(); } | |
tapted
2016/02/05 04:51:06
NOTREACHED() on a new line?
karandeepb
2016/02/08 07:47:08
This is caused by formatting done by git cl format
| |
94 } | |
95 } | |
96 | |
97 // Set up the fill type. | |
98 switch (path.getFillType()) { | |
99 case SkPath::kWinding_FillType: | |
100 [result setWindingRule:NSNonZeroWindingRule]; | |
101 break; | |
102 case SkPath::kEvenOdd_FillType: | |
103 [result setWindingRule:NSEvenOddWindingRule]; | |
104 break; | |
105 case SkPath::kInverseWinding_FillType: | |
106 case SkPath::kInverseEvenOdd_FillType: | |
107 NOTREACHED() << "NSBezierCurve does not support inverse fill types."; | |
108 break; | |
109 default: | |
110 NOTREACHED(); | |
111 } | |
112 | |
113 return result; | |
114 } | |
115 | |
116 } // namespace gfx | |
OLD | NEW |