blob: b3d9caa03c2782a54f72ef68bcc1ba22be6e2ad1 [file] [log] [blame]
bsalomon@google.com8c2fe992011-09-13 15:27:18 +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 */
bungemand3ebb482015-08-05 13:57:49 -07007
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "gm/gm.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -04009#include "include/core/SkCanvas.h"
10#include "include/core/SkColor.h"
11#include "include/core/SkMatrix.h"
12#include "include/core/SkPaint.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050013#include "include/core/SkPath.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040014#include "include/core/SkPoint.h"
15#include "include/core/SkRect.h"
16#include "include/core/SkScalar.h"
17#include "include/core/SkShader.h"
18#include "include/core/SkSize.h"
19#include "include/core/SkString.h"
20#include "include/core/SkTileMode.h"
21#include "include/core/SkTypes.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050022#include "include/effects/SkGradientShader.h"
bsalomon@google.com8c2fe992011-09-13 15:27:18 +000023
24namespace skiagm {
25
26class FillTypePerspGM : public GM {
27 SkPath fPath;
28public:
reed@google.comd42e3f62012-03-30 20:04:21 +000029 FillTypePerspGM() {}
rmistry@google.comd6176b02012-08-23 18:14:13 +000030
reed@google.comd42e3f62012-03-30 20:04:21 +000031 void makePath() {
32 if (fPath.isEmpty()) {
33 const SkScalar radius = SkIntToScalar(45);
34 fPath.addCircle(SkIntToScalar(50), SkIntToScalar(50), radius);
35 fPath.addCircle(SkIntToScalar(100), SkIntToScalar(100), radius);
36 }
bsalomon@google.com8c2fe992011-09-13 15:27:18 +000037 }
rmistry@google.comd6176b02012-08-23 18:14:13 +000038
bsalomon@google.com8c2fe992011-09-13 15:27:18 +000039protected:
commit-bot@chromium.orga90c6802014-04-30 13:20:45 +000040
mtklein36352bf2015-03-25 18:17:31 -070041 SkString onShortName() override {
bsalomon@google.com8c2fe992011-09-13 15:27:18 +000042 return SkString("filltypespersp");
43 }
44
mtklein36352bf2015-03-25 18:17:31 -070045 SkISize onISize() override {
tfarinaf5393182014-06-09 23:59:03 -070046 return SkISize::Make(835, 840);
bsalomon@google.com8c2fe992011-09-13 15:27:18 +000047 }
48
Mike Reed7d34dc72019-11-26 12:17:17 -050049 void showPath(SkCanvas* canvas, int x, int y, SkPathFillType ft,
bsalomon@google.com8c2fe992011-09-13 15:27:18 +000050 SkScalar scale, const SkPaint& paint) {
bsalomon@google.com8c2fe992011-09-13 15:27:18 +000051 const SkRect r = { 0, 0, SkIntToScalar(150), SkIntToScalar(150) };
52
53 canvas->save();
54 canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
55 canvas->clipRect(r);
56 canvas->drawColor(SK_ColorWHITE);
57 fPath.setFillType(ft);
58 canvas->translate(r.centerX(), r.centerY());
59 canvas->scale(scale, scale);
60 canvas->translate(-r.centerX(), -r.centerY());
61 canvas->drawPath(fPath, paint);
62 canvas->restore();
63 }
64
65 void showFour(SkCanvas* canvas, SkScalar scale, bool aa) {
bsalomon@google.com8c2fe992011-09-13 15:27:18 +000066 SkPaint paint;
67 SkPoint center = SkPoint::Make(SkIntToScalar(100), SkIntToScalar(100));
68 SkColor colors[] = {SK_ColorBLUE, SK_ColorRED, SK_ColorGREEN};
69 SkScalar pos[] = {0, SK_ScalarHalf, SK_Scalar1};
reed2ad1aa62016-03-09 09:50:50 -080070 paint.setShader(SkGradientShader::MakeRadial(center,
bsalomon@google.com8c2fe992011-09-13 15:27:18 +000071 SkIntToScalar(100),
72 colors,
73 pos,
74 SK_ARRAY_COUNT(colors),
Mike Reedfae8fce2019-04-03 10:27:45 -040075 SkTileMode::kClamp));
bsalomon@google.com8c2fe992011-09-13 15:27:18 +000076 paint.setAntiAlias(aa);
77
Mike Reed7d34dc72019-11-26 12:17:17 -050078 showPath(canvas, 0, 0, SkPathFillType::kWinding,
bsalomon@google.com8c2fe992011-09-13 15:27:18 +000079 scale, paint);
Mike Reed7d34dc72019-11-26 12:17:17 -050080 showPath(canvas, 200, 0, SkPathFillType::kEvenOdd,
bsalomon@google.com8c2fe992011-09-13 15:27:18 +000081 scale, paint);
Mike Reed7d34dc72019-11-26 12:17:17 -050082 showPath(canvas, 00, 200, SkPathFillType::kInverseWinding,
bsalomon@google.com8c2fe992011-09-13 15:27:18 +000083 scale, paint);
Mike Reed7d34dc72019-11-26 12:17:17 -050084 showPath(canvas, 200, 200, SkPathFillType::kInverseEvenOdd,
bsalomon@google.com8c2fe992011-09-13 15:27:18 +000085 scale, paint);
86 }
87
mtklein36352bf2015-03-25 18:17:31 -070088 void onDraw(SkCanvas* canvas) override {
reed@google.comd42e3f62012-03-30 20:04:21 +000089 this->makePath();
90
bsalomon@google.com8c2fe992011-09-13 15:27:18 +000091 // do perspective drawPaint as the background;
92 SkPaint bkgnrd;
bsalomon@google.comcecd3ac2011-09-13 15:39:00 +000093 SkPoint center = SkPoint::Make(SkIntToScalar(100),
94 SkIntToScalar(100));
95 SkColor colors[] = {SK_ColorBLACK, SK_ColorCYAN,
96 SK_ColorYELLOW, SK_ColorWHITE};
97 SkScalar pos[] = {0, SK_ScalarHalf / 2,
98 3 * SK_ScalarHalf / 2, SK_Scalar1};
reed2ad1aa62016-03-09 09:50:50 -080099 bkgnrd.setShader(SkGradientShader::MakeRadial(center,
100 SkIntToScalar(1000),
101 colors,
102 pos,
103 SK_ARRAY_COUNT(colors),
Mike Reedfae8fce2019-04-03 10:27:45 -0400104 SkTileMode::kClamp));
bsalomon@google.com8c2fe992011-09-13 15:27:18 +0000105 canvas->save();
106 canvas->translate(SkIntToScalar(100), SkIntToScalar(100));
107 SkMatrix mat;
108 mat.reset();
reed3f43f8a2015-01-20 19:58:36 -0800109 mat.setPerspY(SK_Scalar1 / 1000);
bsalomon@google.com8c2fe992011-09-13 15:27:18 +0000110 canvas->concat(mat);
111 canvas->drawPaint(bkgnrd);
112 canvas->restore();
113
114 // draw the paths in perspective
115 SkMatrix persp;
116 persp.reset();
reed3f43f8a2015-01-20 19:58:36 -0800117 persp.setPerspX(-SK_Scalar1 / 1800);
118 persp.setPerspY(SK_Scalar1 / 500);
bsalomon@google.com8c2fe992011-09-13 15:27:18 +0000119 canvas->concat(persp);
120
121 canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
122 const SkScalar scale = SkIntToScalar(5)/4;
123
124 showFour(canvas, SK_Scalar1, false);
125 canvas->translate(SkIntToScalar(450), 0);
bsalomon@google.comcecd3ac2011-09-13 15:39:00 +0000126 showFour(canvas, scale, false);
bsalomon@google.com8c2fe992011-09-13 15:27:18 +0000127
128 canvas->translate(SkIntToScalar(-450), SkIntToScalar(450));
129 showFour(canvas, SK_Scalar1, true);
130 canvas->translate(SkIntToScalar(450), 0);
bsalomon@google.comcecd3ac2011-09-13 15:39:00 +0000131 showFour(canvas, scale, true);
bsalomon@google.com8c2fe992011-09-13 15:27:18 +0000132 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000133
bsalomon@google.com8c2fe992011-09-13 15:27:18 +0000134private:
135 typedef GM INHERITED;
136};
137
138//////////////////////////////////////////////////////////////////////////////
139
Hal Canarye964c182019-01-23 10:22:01 -0500140DEF_GM( return new FillTypePerspGM; )
bsalomon@google.com8c2fe992011-09-13 15:27:18 +0000141
142}