blob: cbc76e96562f83961e45c7652e13af5d04f9a7ad [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"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050015#include "src/core/SkClipOpPriv.h"
reed@google.com3bcf8d32011-10-10 15:42:36 +000016
Ben Wagner8a1036c2016-11-09 15:00:49 -050017constexpr int W = 150;
18constexpr int H = 200;
reed@google.com3bcf8d32011-10-10 15:42:36 +000019
reed@google.com045e62d2011-10-24 12:19:46 +000020static void show_text(SkCanvas* canvas, bool doAA) {
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +000021 SkRandom rand;
reed@google.com3bcf8d32011-10-10 15:42:36 +000022 SkPaint paint;
Hal Canary4484b8f2019-01-08 14:00:08 -050023 SkFont font(nullptr, 20);
24 font.setEdging(doAA ? SkFont::Edging::kSubpixelAntiAlias : SkFont::Edging::kAlias);
rmistry@google.comae933ce2012-08-23 18:19:56 +000025
reed@google.com045e62d2011-10-24 12:19:46 +000026 for (int i = 0; i < 200; ++i) {
reed@google.com3bcf8d32011-10-10 15:42:36 +000027 paint.setColor((SK_A32_MASK << SK_A32_SHIFT) | rand.nextU());
Hal Canary4484b8f2019-01-08 14:00:08 -050028 canvas->drawString("Hamburgefons", rand.nextSScalar1() * W, rand.nextSScalar1() * H + 20,
29 font, paint);
reed@google.com3bcf8d32011-10-10 15:42:36 +000030 }
31}
32
reed@google.com045e62d2011-10-24 12:19:46 +000033static void show_fill(SkCanvas* canvas, bool doAA) {
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +000034 SkRandom rand;
reed@google.com3bcf8d32011-10-10 15:42:36 +000035 SkPaint paint;
reed@google.com045e62d2011-10-24 12:19:46 +000036 paint.setAntiAlias(doAA);
rmistry@google.comae933ce2012-08-23 18:19:56 +000037
reed@google.com045e62d2011-10-24 12:19:46 +000038 for (int i = 0; i < 50; ++i) {
reed@google.com3bcf8d32011-10-10 15:42:36 +000039 SkRect r;
40 SkPath p;
rmistry@google.comae933ce2012-08-23 18:19:56 +000041
reed@google.com3bcf8d32011-10-10 15:42:36 +000042 r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
43 rand.nextUScalar1() * W, rand.nextUScalar1() * H);
reed@google.com3bcf8d32011-10-10 15:42:36 +000044 paint.setColor(rand.nextU());
45 canvas->drawRect(r, paint);
rmistry@google.comae933ce2012-08-23 18:19:56 +000046
reed@google.com3bcf8d32011-10-10 15:42:36 +000047 r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
48 rand.nextUScalar1() * W, rand.nextUScalar1() * H);
reed@google.com3bcf8d32011-10-10 15:42:36 +000049 paint.setColor(rand.nextU());
50 p.addOval(r);
51 canvas->drawPath(p, paint);
52 }
53}
54
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +000055static SkScalar randRange(SkRandom& rand, SkScalar min, SkScalar max) {
reed@google.com045e62d2011-10-24 12:19:46 +000056 SkASSERT(min <= max);
Mike Reeddf85c382017-02-14 10:59:19 -050057 return min + rand.nextUScalar1() * (max - min);
reed@google.com045e62d2011-10-24 12:19:46 +000058}
59
60static void show_stroke(SkCanvas* canvas, bool doAA, SkScalar strokeWidth, int n) {
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +000061 SkRandom rand;
reed@google.com045e62d2011-10-24 12:19:46 +000062 SkPaint paint;
63 paint.setAntiAlias(doAA);
64 paint.setStyle(SkPaint::kStroke_Style);
65 paint.setStrokeWidth(strokeWidth);
rmistry@google.comae933ce2012-08-23 18:19:56 +000066
reed@google.com045e62d2011-10-24 12:19:46 +000067 for (int i = 0; i < n; ++i) {
68 SkRect r;
69 SkPath p;
rmistry@google.comae933ce2012-08-23 18:19:56 +000070
reed@google.com045e62d2011-10-24 12:19:46 +000071 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);
rmistry@google.comae933ce2012-08-23 18:19:56 +000075
reed@google.com045e62d2011-10-24 12:19:46 +000076 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
93static void show_hair(SkCanvas* canvas, bool doAA) {
94 show_stroke(canvas, doAA, 0, 150);
95}
96
97static void show_thick(SkCanvas* canvas, bool doAA) {
98 show_stroke(canvas, doAA, SkIntToScalar(5), 50);
99}
100
101typedef void (*CanvasProc)(SkCanvas*, bool);
102
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400103class ClipView : public Sample {
Hal Canaryd7639af2019-07-17 09:08:11 -0400104 SkString name() override { return SkString("Clip"); }
reed@google.com3bcf8d32011-10-10 15:42:36 +0000105
Hal Canaryd7639af2019-07-17 09:08:11 -0400106 void onDrawContent(SkCanvas* canvas) override {
reed@google.com045e62d2011-10-24 12:19:46 +0000107 canvas->drawColor(SK_ColorWHITE);
reed@google.com3bcf8d32011-10-10 15:42:36 +0000108 canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
109
110 static const CanvasProc gProc[] = {
reed@google.com045e62d2011-10-24 12:19:46 +0000111 show_text, show_thick, show_hair, show_fill
reed@google.com3bcf8d32011-10-10 15:42:36 +0000112 };
rmistry@google.comae933ce2012-08-23 18:19:56 +0000113
reed@google.com3bcf8d32011-10-10 15:42:36 +0000114 SkRect r = { 0, 0, SkIntToScalar(W), SkIntToScalar(H) };
115 SkPath clipPath;
116 r.inset(SK_Scalar1 / 4, SK_Scalar1 / 4);
Mike Reede1af4442019-09-13 15:58:25 -0400117 clipPath.addRRect(SkRRect::MakeRectXY(r, 20, 20));
reed@google.com045e62d2011-10-24 12:19:46 +0000118
119// clipPath.toggleInverseFillType();
reed@google.com3bcf8d32011-10-10 15:42:36 +0000120
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();
Mike Reedc1f77742016-12-09 09:00:50 -0500125 canvas->clipPath(clipPath, kIntersect_SkClipOp, SkToBool(aa));
reed@google.com045e62d2011-10-24 12:19:46 +0000126// canvas->drawColor(SK_ColorWHITE);
127 gProc[i](canvas, SkToBool(aa));
reed@google.com3bcf8d32011-10-10 15:42:36 +0000128 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 }
reed@google.com3bcf8d32011-10-10 15:42:36 +0000135};
136
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400137DEF_SAMPLE( return new ClipView(); )