blob: 05162a8f92456e6f0c41f4b7fc87724d7b1b9671 [file] [log] [blame]
reed@google.com3bcf8d32011-10-10 15:42:36 +00001/*
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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#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/SkAAClip.h"
16#include "src/core/SkClipOpPriv.h"
reed@google.com3bcf8d32011-10-10 15:42:36 +000017
Ben Wagner8a1036c2016-11-09 15:00:49 -050018constexpr int W = 150;
19constexpr int H = 200;
reed@google.com3bcf8d32011-10-10 15:42:36 +000020
reed@google.com045e62d2011-10-24 12:19:46 +000021static void show_text(SkCanvas* canvas, bool doAA) {
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +000022 SkRandom rand;
reed@google.com3bcf8d32011-10-10 15:42:36 +000023 SkPaint paint;
Hal Canary4484b8f2019-01-08 14:00:08 -050024 SkFont font(nullptr, 20);
25 font.setEdging(doAA ? SkFont::Edging::kSubpixelAntiAlias : SkFont::Edging::kAlias);
rmistry@google.comae933ce2012-08-23 18:19:56 +000026
reed@google.com045e62d2011-10-24 12:19:46 +000027 for (int i = 0; i < 200; ++i) {
reed@google.com3bcf8d32011-10-10 15:42:36 +000028 paint.setColor((SK_A32_MASK << SK_A32_SHIFT) | rand.nextU());
Hal Canary4484b8f2019-01-08 14:00:08 -050029 canvas->drawString("Hamburgefons", rand.nextSScalar1() * W, rand.nextSScalar1() * H + 20,
30 font, paint);
reed@google.com3bcf8d32011-10-10 15:42:36 +000031 }
32}
33
reed@google.com045e62d2011-10-24 12:19:46 +000034static void show_fill(SkCanvas* canvas, bool doAA) {
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +000035 SkRandom rand;
reed@google.com3bcf8d32011-10-10 15:42:36 +000036 SkPaint paint;
reed@google.com045e62d2011-10-24 12:19:46 +000037 paint.setAntiAlias(doAA);
rmistry@google.comae933ce2012-08-23 18:19:56 +000038
reed@google.com045e62d2011-10-24 12:19:46 +000039 for (int i = 0; i < 50; ++i) {
reed@google.com3bcf8d32011-10-10 15:42:36 +000040 SkRect r;
41 SkPath p;
rmistry@google.comae933ce2012-08-23 18:19:56 +000042
reed@google.com3bcf8d32011-10-10 15:42:36 +000043 r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
44 rand.nextUScalar1() * W, rand.nextUScalar1() * H);
reed@google.com3bcf8d32011-10-10 15:42:36 +000045 paint.setColor(rand.nextU());
46 canvas->drawRect(r, paint);
rmistry@google.comae933ce2012-08-23 18:19:56 +000047
reed@google.com3bcf8d32011-10-10 15:42:36 +000048 r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
49 rand.nextUScalar1() * W, rand.nextUScalar1() * H);
reed@google.com3bcf8d32011-10-10 15:42:36 +000050 paint.setColor(rand.nextU());
51 p.addOval(r);
52 canvas->drawPath(p, paint);
53 }
54}
55
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +000056static SkScalar randRange(SkRandom& rand, SkScalar min, SkScalar max) {
reed@google.com045e62d2011-10-24 12:19:46 +000057 SkASSERT(min <= max);
Mike Reeddf85c382017-02-14 10:59:19 -050058 return min + rand.nextUScalar1() * (max - min);
reed@google.com045e62d2011-10-24 12:19:46 +000059}
60
61static void show_stroke(SkCanvas* canvas, bool doAA, SkScalar strokeWidth, int n) {
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +000062 SkRandom rand;
reed@google.com045e62d2011-10-24 12:19:46 +000063 SkPaint paint;
64 paint.setAntiAlias(doAA);
65 paint.setStyle(SkPaint::kStroke_Style);
66 paint.setStrokeWidth(strokeWidth);
rmistry@google.comae933ce2012-08-23 18:19:56 +000067
reed@google.com045e62d2011-10-24 12:19:46 +000068 for (int i = 0; i < n; ++i) {
69 SkRect r;
70 SkPath p;
rmistry@google.comae933ce2012-08-23 18:19:56 +000071
reed@google.com045e62d2011-10-24 12:19:46 +000072 r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
73 rand.nextUScalar1() * W, rand.nextUScalar1() * H);
74 paint.setColor(rand.nextU());
75 canvas->drawRect(r, paint);
rmistry@google.comae933ce2012-08-23 18:19:56 +000076
reed@google.com045e62d2011-10-24 12:19:46 +000077 r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
78 rand.nextUScalar1() * W, rand.nextUScalar1() * H);
79 paint.setColor(rand.nextU());
80 p.addOval(r);
81 canvas->drawPath(p, paint);
82
83 const SkScalar minx = -SkIntToScalar(W)/4;
84 const SkScalar maxx = 5*SkIntToScalar(W)/4;
85 const SkScalar miny = -SkIntToScalar(H)/4;
86 const SkScalar maxy = 5*SkIntToScalar(H)/4;
87 paint.setColor(rand.nextU());
88 canvas->drawLine(randRange(rand, minx, maxx), randRange(rand, miny, maxy),
89 randRange(rand, minx, maxx), randRange(rand, miny, maxy),
90 paint);
91 }
92}
93
94static void show_hair(SkCanvas* canvas, bool doAA) {
95 show_stroke(canvas, doAA, 0, 150);
96}
97
98static void show_thick(SkCanvas* canvas, bool doAA) {
99 show_stroke(canvas, doAA, SkIntToScalar(5), 50);
100}
101
102typedef void (*CanvasProc)(SkCanvas*, bool);
103
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400104class ClipView : public Sample {
reed@google.com3bcf8d32011-10-10 15:42:36 +0000105public:
106 ClipView() {
reed@google.com045e62d2011-10-24 12:19:46 +0000107 SkAAClip clip;
108 SkIRect r = { -2, -3, 842, 18 };
109 clip.setRect(r);
reed@google.com3bcf8d32011-10-10 15:42:36 +0000110 }
111
112 virtual ~ClipView() {
113 }
114
115protected:
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400116 virtual bool onQuery(Sample::Event* evt) {
117 if (Sample::TitleQ(*evt)) {
118 Sample::TitleR(evt, "Clip");
reed@google.com3bcf8d32011-10-10 15:42:36 +0000119 return true;
120 }
121 return this->INHERITED::onQuery(evt);
122 }
123
124 virtual void onDrawContent(SkCanvas* canvas) {
reed@google.com045e62d2011-10-24 12:19:46 +0000125 canvas->drawColor(SK_ColorWHITE);
reed@google.com3bcf8d32011-10-10 15:42:36 +0000126 canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
127
128 static const CanvasProc gProc[] = {
reed@google.com045e62d2011-10-24 12:19:46 +0000129 show_text, show_thick, show_hair, show_fill
reed@google.com3bcf8d32011-10-10 15:42:36 +0000130 };
rmistry@google.comae933ce2012-08-23 18:19:56 +0000131
reed@google.com3bcf8d32011-10-10 15:42:36 +0000132 SkRect r = { 0, 0, SkIntToScalar(W), SkIntToScalar(H) };
133 SkPath clipPath;
134 r.inset(SK_Scalar1 / 4, SK_Scalar1 / 4);
reed@google.com045e62d2011-10-24 12:19:46 +0000135 clipPath.addRoundRect(r, SkIntToScalar(20), SkIntToScalar(20));
136
137// clipPath.toggleInverseFillType();
reed@google.com3bcf8d32011-10-10 15:42:36 +0000138
139 for (int aa = 0; aa <= 1; ++aa) {
140 canvas->save();
141 for (size_t i = 0; i < SK_ARRAY_COUNT(gProc); ++i) {
142 canvas->save();
Mike Reedc1f77742016-12-09 09:00:50 -0500143 canvas->clipPath(clipPath, kIntersect_SkClipOp, SkToBool(aa));
reed@google.com045e62d2011-10-24 12:19:46 +0000144// canvas->drawColor(SK_ColorWHITE);
145 gProc[i](canvas, SkToBool(aa));
reed@google.com3bcf8d32011-10-10 15:42:36 +0000146 canvas->restore();
147 canvas->translate(W * SK_Scalar1 * 8 / 7, 0);
148 }
149 canvas->restore();
150 canvas->translate(0, H * SK_Scalar1 * 8 / 7);
151 }
152 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000153
reed@google.com3bcf8d32011-10-10 15:42:36 +0000154private:
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400155 typedef Sample INHERITED;
reed@google.com3bcf8d32011-10-10 15:42:36 +0000156};
157
158//////////////////////////////////////////////////////////////////////////////
159
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400160DEF_SAMPLE( return new ClipView(); )