@@ -232,8 +232,71 @@ static PathBuilder::RoundingRadii ToRoundingRadii(const SkRRect& rrect) {
232
232
}
233
233
234
234
static Path ToPath (const SkPath& path) {
235
- UNIMPLEMENTED;
236
- return Path{};
235
+ auto iterator = SkPath::Iter (path, false );
236
+
237
+ struct PathData {
238
+ union {
239
+ SkPoint points[4 ];
240
+ };
241
+ };
242
+
243
+ PathBuilder builder;
244
+ PathData data;
245
+ auto verb = SkPath::Verb::kDone_Verb ;
246
+ do {
247
+ verb = iterator.next (data.points );
248
+ switch (verb) {
249
+ case SkPath::kMove_Verb :
250
+ builder.MoveTo (ToPoint (data.points [0 ]));
251
+ break ;
252
+ case SkPath::kLine_Verb :
253
+ builder.AddLine (ToPoint (data.points [0 ]), ToPoint (data.points [1 ]));
254
+ break ;
255
+ case SkPath::kQuad_Verb :
256
+ builder.AddQuadraticCurve (ToPoint (data.points [0 ]), // p1
257
+ ToPoint (data.points [1 ]), // cp
258
+ ToPoint (data.points [2 ]) // p2
259
+ );
260
+ break ;
261
+ case SkPath::kConic_Verb : {
262
+ constexpr auto kPow2 = 1 ; // Only works for sweeps up to 90 degrees.
263
+ constexpr auto kQuadCount = 1 + (2 * (1 << kPow2 ));
264
+ SkPoint points[kQuadCount ];
265
+ const auto curve_count =
266
+ SkPath::ConvertConicToQuads (data.points [0 ], //
267
+ data.points [1 ], //
268
+ data.points [2 ], //
269
+ iterator.conicWeight (), //
270
+ points, //
271
+ kPow2 //
272
+ );
273
+
274
+ for (int curve_index = 0 , point_index = 0 ; //
275
+ curve_index < curve_count; //
276
+ curve_index++, point_index += 2 //
277
+ ) {
278
+ builder.AddQuadraticCurve (ToPoint (points[point_index + 0 ]), // p1
279
+ ToPoint (points[point_index + 1 ]), // cp
280
+ ToPoint (points[point_index + 2 ]) // p2
281
+ );
282
+ }
283
+ } break ;
284
+ case SkPath::kCubic_Verb :
285
+ builder.AddCubicCurve (ToPoint (data.points [0 ]), // p1
286
+ ToPoint (data.points [1 ]), // cp1
287
+ ToPoint (data.points [2 ]), // cp2
288
+ ToPoint (data.points [3 ]) // p2
289
+ );
290
+ break ;
291
+ case SkPath::kClose_Verb :
292
+ builder.Close ();
293
+ break ;
294
+ case SkPath::kDone_Verb :
295
+ break ;
296
+ }
297
+ } while (verb != SkPath::Verb::kDone_Verb );
298
+ // TODO: Convert fill types.
299
+ return builder.TakePath ();
237
300
}
238
301
239
302
static Path ToPath (const SkRRect& rrect) {
0 commit comments