1 /*
2 * Copyright 2011 Google Inc.
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 "include/core/SkCanvas.h"
9 #include "include/core/SkColorPriv.h"
10 #include "include/core/SkFont.h"
11 #include "include/core/SkPaint.h"
12 #include "include/core/SkPath.h"
13 #include "include/utils/SkRandom.h"
14 #include "samplecode/Sample.h"
15 #include "src/core/SkClipOpPriv.h"
16
17 constexpr int W = 150;
18 constexpr int H = 200;
19
show_text(SkCanvas * canvas,bool doAA)20 static void show_text(SkCanvas* canvas, bool doAA) {
21 SkRandom rand;
22 SkPaint paint;
23 SkFont font(nullptr, 20);
24 font.setEdging(doAA ? SkFont::Edging::kSubpixelAntiAlias : SkFont::Edging::kAlias);
25
26 for (int i = 0; i < 200; ++i) {
27 paint.setColor((SK_A32_MASK << SK_A32_SHIFT) | rand.nextU());
28 canvas->drawString("Hamburgefons", rand.nextSScalar1() * W, rand.nextSScalar1() * H + 20,
29 font, paint);
30 }
31 }
32
show_fill(SkCanvas * canvas,bool doAA)33 static void show_fill(SkCanvas* canvas, bool doAA) {
34 SkRandom rand;
35 SkPaint paint;
36 paint.setAntiAlias(doAA);
37
38 for (int i = 0; i < 50; ++i) {
39 SkRect r;
40 SkPath p;
41
42 r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
43 rand.nextUScalar1() * W, rand.nextUScalar1() * H);
44 paint.setColor(rand.nextU());
45 canvas->drawRect(r, paint);
46
47 r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
48 rand.nextUScalar1() * W, rand.nextUScalar1() * H);
49 paint.setColor(rand.nextU());
50 p.addOval(r);
51 canvas->drawPath(p, paint);
52 }
53 }
54
randRange(SkRandom & rand,SkScalar min,SkScalar max)55 static SkScalar randRange(SkRandom& rand, SkScalar min, SkScalar max) {
56 SkASSERT(min <= max);
57 return min + rand.nextUScalar1() * (max - min);
58 }
59
show_stroke(SkCanvas * canvas,bool doAA,SkScalar strokeWidth,int n)60 static void show_stroke(SkCanvas* canvas, bool doAA, SkScalar strokeWidth, int n) {
61 SkRandom rand;
62 SkPaint paint;
63 paint.setAntiAlias(doAA);
64 paint.setStyle(SkPaint::kStroke_Style);
65 paint.setStrokeWidth(strokeWidth);
66
67 for (int i = 0; i < n; ++i) {
68 SkRect r;
69 SkPath p;
70
71 r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
72 rand.nextUScalar1() * W, rand.nextUScalar1() * H);
73 paint.setColor(rand.nextU());
74 canvas->drawRect(r, paint);
75
76 r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
77 rand.nextUScalar1() * W, rand.nextUScalar1() * H);
78 paint.setColor(rand.nextU());
79 p.addOval(r);
80 canvas->drawPath(p, paint);
81
82 const SkScalar minx = -SkIntToScalar(W)/4;
83 const SkScalar maxx = 5*SkIntToScalar(W)/4;
84 const SkScalar miny = -SkIntToScalar(H)/4;
85 const SkScalar maxy = 5*SkIntToScalar(H)/4;
86 paint.setColor(rand.nextU());
87 canvas->drawLine(randRange(rand, minx, maxx), randRange(rand, miny, maxy),
88 randRange(rand, minx, maxx), randRange(rand, miny, maxy),
89 paint);
90 }
91 }
92
show_hair(SkCanvas * canvas,bool doAA)93 static void show_hair(SkCanvas* canvas, bool doAA) {
94 show_stroke(canvas, doAA, 0, 150);
95 }
96
show_thick(SkCanvas * canvas,bool doAA)97 static void show_thick(SkCanvas* canvas, bool doAA) {
98 show_stroke(canvas, doAA, SkIntToScalar(5), 50);
99 }
100
101 typedef void (*CanvasProc)(SkCanvas*, bool);
102
103 class ClipView : public Sample {
name()104 SkString name() override { return SkString("Clip"); }
105
onDrawContent(SkCanvas * canvas)106 void onDrawContent(SkCanvas* canvas) override {
107 canvas->drawColor(SK_ColorWHITE);
108 canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
109
110 static const CanvasProc gProc[] = {
111 show_text, show_thick, show_hair, show_fill
112 };
113
114 SkRect r = { 0, 0, SkIntToScalar(W), SkIntToScalar(H) };
115 SkPath clipPath;
116 r.inset(SK_Scalar1 / 4, SK_Scalar1 / 4);
117 clipPath.addRoundRect(r, SkIntToScalar(20), SkIntToScalar(20));
118
119 // clipPath.toggleInverseFillType();
120
121 for (int aa = 0; aa <= 1; ++aa) {
122 canvas->save();
123 for (size_t i = 0; i < SK_ARRAY_COUNT(gProc); ++i) {
124 canvas->save();
125 canvas->clipPath(clipPath, kIntersect_SkClipOp, SkToBool(aa));
126 // canvas->drawColor(SK_ColorWHITE);
127 gProc[i](canvas, SkToBool(aa));
128 canvas->restore();
129 canvas->translate(W * SK_Scalar1 * 8 / 7, 0);
130 }
131 canvas->restore();
132 canvas->translate(0, H * SK_Scalar1 * 8 / 7);
133 }
134 }
135 };
136
137 DEF_SAMPLE( return new ClipView(); )
138