Skip to content

Commit 5c9ff28

Browse files
committed
Fix _CGPathParseString
1 parent 8cce154 commit 5c9ff28

File tree

2 files changed

+44
-32
lines changed

2 files changed

+44
-32
lines changed

Sources/OpenSwiftUI_SPI/Overlay/CoreGraphics/CGPath+OpenSwiftUI.m

Lines changed: 42 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -43,64 +43,74 @@ BOOL _CGPathParseString(CGMutablePathRef path, const char *utf8CString) {
4343
break;
4444
case 'm':
4545
if (numCount != 2) return NO;
46-
CGPathMoveToPoint(path, NULL, numbers[0], numbers[1]);
46+
CGPathMoveToPoint(path, NULL,
47+
numbers[0], numbers[1]);
4748
currentX = lastControlX = numbers[0];
4849
currentY = lastControlY = numbers[1];
4950
numCount = 0;
5051
break;
5152
case 'l':
5253
if (numCount != 2) return NO;
53-
CGPathAddLineToPoint(path, NULL, numbers[0], numbers[1]);
54+
CGPathAddLineToPoint(path, NULL,
55+
numbers[0], numbers[1]);
5456
currentX = lastControlX = numbers[0];
5557
currentY = lastControlY = numbers[1];
5658
numCount = 0;
5759
break;
5860
case 'c':
5961
if (numCount != 6) return NO;
60-
CGPathAddCurveToPoint(path, NULL, numbers[0], numbers[1],
61-
numbers[2], numbers[3], numbers[4], numbers[5]);
62-
currentX = numbers[2];
63-
currentY = numbers[3];
64-
lastControlX = numbers[4];
65-
lastControlY = numbers[5];
62+
CGPathAddCurveToPoint(path, NULL,
63+
numbers[0], numbers[1],
64+
numbers[2], numbers[3],
65+
numbers[4], numbers[5]);
66+
lastControlX = numbers[2];
67+
lastControlY = numbers[3];
68+
currentX = numbers[4];
69+
currentY = numbers[5];
6670
numCount = 0;
6771
break;
6872
case 'q':
6973
if (numCount != 4) return NO;
70-
CGPathAddQuadCurveToPoint(path, NULL, numbers[0], numbers[1],
74+
CGPathAddQuadCurveToPoint(path, NULL,
75+
numbers[0], numbers[1],
7176
numbers[2], numbers[3]);
72-
currentX = numbers[0];
73-
currentY = numbers[1];
74-
lastControlX = numbers[2];
75-
lastControlY = numbers[3];
77+
lastControlX = numbers[0];
78+
lastControlY = numbers[1];
79+
currentX = numbers[2];
80+
currentY = numbers[3];
7681
numCount = 0;
7782
break;
7883
case 't':
7984
if (numCount != 2) return NO;
80-
{
81-
CGFloat reflectedX = currentX - 2.0 * lastControlX;
82-
CGFloat reflectedY = currentY - 2.0 * lastControlY;
83-
CGPathAddQuadCurveToPoint(path, NULL, reflectedX, reflectedY,
84-
numbers[0], numbers[1]);
85-
currentX = reflectedX;
86-
currentY = reflectedY;
87-
lastControlX = numbers[0];
88-
lastControlY = numbers[1];
89-
}
85+
CGFloat reflectedX = currentX * 2.0 - lastControlX;
86+
CGFloat reflectedY = currentY * 2.0 - lastControlY;
87+
CGPathAddQuadCurveToPoint(path, NULL,
88+
reflectedX, reflectedY,
89+
numbers[0], numbers[1]);
90+
lastControlX = reflectedX;
91+
lastControlY = reflectedY;
92+
currentX = numbers[0];
93+
currentY = numbers[1];
9094
numCount = 0;
9195
break;
9296
case 'v':
9397
if (numCount != 4) return NO;
94-
CGPathAddCurveToPoint(path, NULL, lastControlX, lastControlY,
95-
numbers[0], numbers[1], numbers[2], numbers[3]);
96-
lastControlX = numbers[2];
97-
lastControlY = numbers[3];
98+
CGPathAddCurveToPoint(path, NULL,
99+
currentX, currentY,
100+
numbers[0], numbers[1],
101+
numbers[2], numbers[3]);
102+
lastControlX = numbers[0];
103+
lastControlY = numbers[1];
104+
currentX = numbers[2];
105+
currentY = numbers[3];
98106
numCount = 0;
99107
break;
100108
case 'y':
101109
if (numCount != 4) return NO;
102-
CGPathAddCurveToPoint(path, NULL, numbers[0], numbers[1],
103-
numbers[2], numbers[3], numbers[2], numbers[3]);
110+
CGPathAddCurveToPoint(path, NULL,
111+
numbers[0], numbers[1],
112+
numbers[2], numbers[3],
113+
numbers[2], numbers[3]);
104114
lastControlX = numbers[2];
105115
lastControlY = numbers[3];
106116
numCount = 0;
@@ -115,8 +125,9 @@ BOOL _CGPathParseString(CGMutablePathRef path, const char *utf8CString) {
115125
case 'r':
116126
if (ptr[1] != 'e') return NO;
117127
if (numCount != 4) return NO;
118-
CGPathAddRect(path, NULL, CGRectMake(numbers[0], numbers[1],
119-
numbers[2], numbers[3]));
128+
CGPathAddRect(path, NULL,
129+
CGRectMake(numbers[0], numbers[1],
130+
numbers[2], numbers[3]));
120131
ptr++;
121132
numCount = 0;
122133
break;

Tests/OpenSwiftUI_SPITests/Overlay/CoreGraphics/CGPath+OpenSwiftUITests.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ struct CGPath_OpenSwiftUITests {
2222
("0 0 m 50 0 100 100 q", true, " 0 0 m 50 0 100 100 q"),
2323
// c - cubic curve
2424
("0 0 m 25 0 75 100 100 100 c", true, " 0 0 m 25 0 75 100 100 100 c"),
25-
// v - smooth cubic (cp1 = last point)
25+
// v - smooth cubic (cp1 = current point)
2626
("0 0 m 50 50 100 100 v", true, " 0 0 m 0 0 50 50 100 100 c"),
2727
// y - shorthand cubic (cp2 = endpoint)
2828
("0 0 m 25 0 100 100 y", true, " 0 0 m 25 0 100 100 100 100 c"),
@@ -56,6 +56,7 @@ struct CGPath_OpenSwiftUITests {
5656

5757
struct CopyDescription {
5858
@Test(arguments: [
59+
(0.0, " 100 0 m 189.5 189.5 l 0 189.5 l h"),
5960
(1.0, " 100 0 m 190 190 l 0 190 l h"),
6061
(2.0, " 100 0 m 190 190 l 0 190 l h"),
6162
(3.0, " 99 0 m 189 189 l 0 189 l h"),

0 commit comments

Comments
 (0)