xref: /aosp_15_r20/external/skia/docs/examples/count_verbs.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker // Copyright 2020 Google LLC.
2*c8dee2aaSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
3*c8dee2aaSAndroid Build Coastguard Worker #include "tools/fiddle/examples.h"
4*c8dee2aaSAndroid Build Coastguard Worker REG_FIDDLE(count_verbs, 256, 256, false, 0) {
5*c8dee2aaSAndroid Build Coastguard Worker #include "include/utils/SkTextUtils.h"
6*c8dee2aaSAndroid Build Coastguard Worker 
make_path(const SkFont & font)7*c8dee2aaSAndroid Build Coastguard Worker static SkPath make_path(const SkFont& font) {
8*c8dee2aaSAndroid Build Coastguard Worker     SkPath path;
9*c8dee2aaSAndroid Build Coastguard Worker     const char text[] = "SKIA";
10*c8dee2aaSAndroid Build Coastguard Worker     SkTextUtils::GetPath(text, strlen(text), SkTextEncoding::kUTF8, 0, 0, font, &path);
11*c8dee2aaSAndroid Build Coastguard Worker     return path;
12*c8dee2aaSAndroid Build Coastguard Worker }
13*c8dee2aaSAndroid Build Coastguard Worker 
count_verbs(const SkPath & path,int counts[6])14*c8dee2aaSAndroid Build Coastguard Worker static void count_verbs(const SkPath& path, int counts[6]) {
15*c8dee2aaSAndroid Build Coastguard Worker     SkPath::Iter it(path, false);
16*c8dee2aaSAndroid Build Coastguard Worker     for (int i = 0; i < 6; ++i) {
17*c8dee2aaSAndroid Build Coastguard Worker         counts[i] = 0;
18*c8dee2aaSAndroid Build Coastguard Worker     }
19*c8dee2aaSAndroid Build Coastguard Worker     while (true) {
20*c8dee2aaSAndroid Build Coastguard Worker         SkPoint pts[4];
21*c8dee2aaSAndroid Build Coastguard Worker         SkPath::Verb verb = it.next(pts);
22*c8dee2aaSAndroid Build Coastguard Worker         if (verb == SkPath::kDone_Verb) {
23*c8dee2aaSAndroid Build Coastguard Worker             break;
24*c8dee2aaSAndroid Build Coastguard Worker         }
25*c8dee2aaSAndroid Build Coastguard Worker         if ((unsigned)verb < 6) {
26*c8dee2aaSAndroid Build Coastguard Worker             counts[(unsigned)verb]++;
27*c8dee2aaSAndroid Build Coastguard Worker         }
28*c8dee2aaSAndroid Build Coastguard Worker     }
29*c8dee2aaSAndroid Build Coastguard Worker }
30*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)31*c8dee2aaSAndroid Build Coastguard Worker void draw(SkCanvas* canvas) {
32*c8dee2aaSAndroid Build Coastguard Worker     SkFont font(fontMgr->matchFamilyStyle("DejaVu Sans Mono", SkFontStyle()), 30);
33*c8dee2aaSAndroid Build Coastguard Worker     SkPath path = make_path(font);
34*c8dee2aaSAndroid Build Coastguard Worker     int counts[6];
35*c8dee2aaSAndroid Build Coastguard Worker     count_verbs(path, counts);
36*c8dee2aaSAndroid Build Coastguard Worker 
37*c8dee2aaSAndroid Build Coastguard Worker     // output results:
38*c8dee2aaSAndroid Build Coastguard Worker     const char* verbs[6] = {"Move", "Line", "Quad", "Conic", "Cubic", "Close"};
39*c8dee2aaSAndroid Build Coastguard Worker     SkPoint pt = SkPoint::Make(10.0f, 5.0f + font.getSpacing());
40*c8dee2aaSAndroid Build Coastguard Worker     SkPaint p;
41*c8dee2aaSAndroid Build Coastguard Worker     canvas->clear(SK_ColorWHITE);
42*c8dee2aaSAndroid Build Coastguard Worker     for (int i = 0; i < 6; ++i) {
43*c8dee2aaSAndroid Build Coastguard Worker         canvas->drawString(SkStringPrintf("%-5s %3d", verbs[i], counts[i]), pt.fX, pt.fY, font,
44*c8dee2aaSAndroid Build Coastguard Worker                            p);
45*c8dee2aaSAndroid Build Coastguard Worker         pt.fY += font.getSpacing();
46*c8dee2aaSAndroid Build Coastguard Worker     }
47*c8dee2aaSAndroid Build Coastguard Worker }
48*c8dee2aaSAndroid Build Coastguard Worker }  // END FIDDLE
49