xref: /aosp_15_r20/external/skia/gm/smallcircles.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1 /*
2  * Copyright 2024 Google LLC.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #include "gm/gm.h"
9 #include "include/core/SkCanvas.h"
10 #include "include/core/SkImageInfo.h"
11 #include "include/core/SkPaint.h"
12 #include "include/core/SkSurface.h"
13 
draw_small_circle(SkCanvas * canvas,const SkPaint & p,const float radius)14 static void draw_small_circle(SkCanvas* canvas, const SkPaint& p, const float radius) {
15     SkRect oval = SkRect::MakeLTRB(radius * -1, radius * -1, radius, radius);
16     constexpr bool kUseCenter = false;
17     constexpr float kDegrees = 360;
18     canvas->drawArc(oval, 0, kDegrees, kUseCenter, p);
19 }
20 
21 DEF_SIMPLE_GM(smallcircles, canvas, 425, 425) {
22     auto surface = canvas->makeSurface(SkImageInfo::MakeN32Premul(100, 100));
23     if (!surface) {
24       surface = SkSurfaces::Raster(SkImageInfo::MakeN32Premul(100, 100));
25     }
26     SkCanvas* canv = surface->getCanvas();
27 
28     canv->translate(5, 5);
29     SkPaint p;
30     p.setAntiAlias(true);
31     p.setStyle(SkPaint::kFill_Style);
32 
33     // Draw circles
34     for (int i = 0; i < 11; ++i) {
35       canv->save();
36       for (int j = 0; j < 11; ++j) {
37         draw_small_circle(canv, p, 0.8f);
38         canv->translate(5.1f, 0.f);
39       }
40       canv->restore();
41       canv->translate(0.f, 5.1f);
42     }
43 
44     // Scale up image of small circles
45     canvas->scale(7, 7);
46     auto img = surface->makeImageSnapshot();
47     canvas->drawImage(img, 0, 0);
48 }
49