@@ -263,6 +263,45 @@ void BM_DrawRRect(benchmark::State& state,
263263 canvas_provider->Snapshot (filename);
264264}
265265
266+ void BM_DrawArc (benchmark::State& state,
267+ std::unique_ptr<CanvasProvider> canvas_provider) {
268+ DisplayListBuilder builder;
269+ size_t length = state.range (0 );
270+ canvas_provider->InitializeSurface (length, length);
271+ auto canvas = canvas_provider->GetSurface ()->getCanvas ();
272+
273+ SkScalar startingAngle = 0 .0f ;
274+ SkScalar scalarLength = length;
275+
276+ // Just some random sweeps that will mostly circumnavigate the circle
277+ std::vector<SkScalar> segmentSweeps = {5 .5f , -10 .0f , 42 .0f , 71 .7f , 90 .0f ,
278+ 37 .5f , 17 .9f , 32 .0f , 379 .4f };
279+
280+ SkRect bounds = SkRect::MakeLTRB (0 , 0 , length, length);
281+
282+ for (size_t i = 0 ; i < 1000 ; i++) {
283+ SkScalar inset = std::fmod (i * 0.5 , scalarLength);
284+ bounds.setLTRB (0 , inset, scalarLength, scalarLength - inset);
285+ for (SkScalar sweep : segmentSweeps) {
286+ builder.drawArc (bounds, startingAngle, sweep, false );
287+ startingAngle += sweep + 5 .0f ;
288+ }
289+ }
290+
291+ auto displaylist = builder.Build ();
292+
293+ // We only want to time the actual rasterization.
294+ for (auto _ : state) {
295+ canvas->discard ();
296+ displaylist->RenderTo (canvas);
297+ canvas_provider->GetSurface ()->flushAndSubmit (true );
298+ }
299+
300+ auto filename = canvas_provider->BackendName () + " -DrawArc-" +
301+ std::to_string (state.range (0 )) + " .png" ;
302+ canvas_provider->Snapshot (filename);
303+ }
304+
266305std::vector<SkPoint> GetPolygonPoints (size_t n, SkPoint center, SkScalar r) {
267306 std::vector<SkPoint> points;
268307 SkScalar x, y;
@@ -421,8 +460,6 @@ sk_sp<SkVertices> GetTestVertices(SkPoint center,
421460 size_t outerVertexCount = vertexCount / 2 ;
422461 std::vector<SkPoint> outerPoints =
423462 GetPolygonPoints (outerVertexCount, center, radius * 1 .5f );
424- std::vector<SkPoint> innerPoints =
425- GetPolygonPoints (outerVertexCount * 2 , center, radius * 0 .75f );
426463
427464 std::vector<SkPoint> vertices;
428465 std::vector<SkColor> colors;
@@ -446,7 +483,7 @@ sk_sp<SkVertices> GetTestVertices(SkPoint center,
446483 for (size_t i = 0 ; i <= outerVertexCount; i++) {
447484 vertices.push_back (outerPoints[i % outerPoints.size ()]);
448485 colors.push_back (i % 2 ? SK_ColorRED : SK_ColorGREEN);
449- vertices.push_back (innerPoints[( 2 * i + 1 ) % innerPoints. size ()] );
486+ vertices.push_back (center );
450487 colors.push_back (i % 2 ? SK_ColorBLUE : SK_ColorCYAN);
451488 }
452489 break ;
@@ -511,6 +548,10 @@ void BM_DrawVertices(benchmark::State& state,
511548 canvas_provider->Snapshot (filename);
512549}
513550
551+ void BM_DrawPoints (benchmark::State& state,
552+ std::unique_ptr<CanvasProvider> canvas_provider,
553+ SkCanvas::PointMode mode) {}
554+
514555// clang-format off
515556
516557BENCHMARK_CAPTURE (BM_DrawLine,
@@ -541,6 +582,13 @@ BENCHMARK_CAPTURE(BM_DrawCircle,
541582 ->Range(16 , 2048 )
542583 ->Unit(benchmark::kMillisecond );
543584
585+ BENCHMARK_CAPTURE (BM_DrawArc,
586+ Software,
587+ std::make_unique<SoftwareCanvasProvider>())
588+ ->RangeMultiplier (2 )
589+ ->Range(128 , 2048 )
590+ ->Unit(benchmark::kMillisecond );
591+
544592BENCHMARK_CAPTURE (BM_DrawRRect,
545593 Symmetric/Software,
546594 std::make_unique<SoftwareCanvasProvider>(),
0 commit comments