blob: 782fa5d79f0e3f02537001f7fb5a5b209ae62a4e [file] [log] [blame]
fmalitab5f78262014-08-06 13:07:15 -07001/*
2 * Copyright 2014 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 "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"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050012#include "include/core/SkPaint.h"
13#include "include/core/SkPicture.h"
14#include "include/core/SkPictureRecorder.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040015#include "include/core/SkPoint.h"
16#include "include/core/SkRect.h"
17#include "include/core/SkRefCnt.h"
18#include "include/core/SkScalar.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050019#include "include/core/SkShader.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040020#include "include/core/SkSize.h"
21#include "include/core/SkString.h"
22#include "include/core/SkTileMode.h"
23#include "include/core/SkTypes.h"
fmalitab5f78262014-08-06 13:07:15 -070024
mtkleindbfd7ab2016-09-01 11:24:54 -070025constexpr SkScalar kPictureSize = SK_Scalar1;
26constexpr SkScalar kFillSize = 100;
27constexpr unsigned kRowSize = 6;
fmalitab5f78262014-08-06 13:07:15 -070028
mtkleindbfd7ab2016-09-01 11:24:54 -070029constexpr struct {
fmalitab5f78262014-08-06 13:07:15 -070030 SkScalar x, y, w, h;
31 SkScalar offsetX, offsetY;
32} tiles[] = {
33 { 0, 0, 1, 1, 0, 0 },
fmalitab5f78262014-08-06 13:07:15 -070034 { -0.5f, -0.5f, 1, 1, 0, 0 },
fmalitaa2bd24f2014-12-08 11:13:27 -080035 { 0.5f, 0.5f, 1, 1, 0, 0 },
fmalitab5f78262014-08-06 13:07:15 -070036
37 { 0, 0, 1.5f, 1.5f, 0, 0 },
fmalitab5f78262014-08-06 13:07:15 -070038 { -0.5f, -0.5f, 1.5f, 1.5f, 0, 0 },
fmalitaa2bd24f2014-12-08 11:13:27 -080039 { 0.5f, 0.5f, 1.5f, 1.5f, 0, 0 },
fmalitab5f78262014-08-06 13:07:15 -070040
41 { 0, 0, 0.5f, 0.5f, 0, 0 },
fmalitab5f78262014-08-06 13:07:15 -070042 { 0.25f, 0.25f, 0.5f, 0.5f, 0, 0 },
fmalitaa2bd24f2014-12-08 11:13:27 -080043 { -0.25f, -0.25f, 0.5f, 0.5f, 0, 0 },
fmalitab5f78262014-08-06 13:07:15 -070044
45 { 0, 0, 1, 1, 0.5f, 0.5f },
fmalitab5f78262014-08-06 13:07:15 -070046 { -0.5f, -0.5f, 1, 1, 0.5f, 0.5f },
fmalitaa2bd24f2014-12-08 11:13:27 -080047 { 0.5f, 0.5f, 1, 1, 0.5f, 0.5f },
fmalitab5f78262014-08-06 13:07:15 -070048
49 { 0, 0, 1.5f, 1.5f, 0.5f, 0.5f },
fmalitab5f78262014-08-06 13:07:15 -070050 { -0.5f, -0.5f, 1.5f, 1.5f, 0.5f, 0.5f },
fmalitaa2bd24f2014-12-08 11:13:27 -080051 { 0.5f, 0.5f, 1.5f, 1.5f, 0.5f, 0.5f },
fmalitab5f78262014-08-06 13:07:15 -070052
53 { 0, 0, 1.5f, 1, 0, 0 },
fmalitab5f78262014-08-06 13:07:15 -070054 { -0.5f, -0.5f, 1.5f, 1, 0, 0 },
fmalitaa2bd24f2014-12-08 11:13:27 -080055 { 0.5f, 0.5f, 1.5f, 1, 0, 0 },
fmalitab5f78262014-08-06 13:07:15 -070056
57 { 0, 0, 0.5f, 1, 0, 0 },
fmalitab5f78262014-08-06 13:07:15 -070058 { 0.25f, 0.25f, 0.5f, 1, 0, 0 },
fmalitaa2bd24f2014-12-08 11:13:27 -080059 { -0.25f, -0.25f, 0.5f, 1, 0, 0 },
fmalitab5f78262014-08-06 13:07:15 -070060
61 { 0, 0, 1, 1.5f, 0, 0 },
fmalitab5f78262014-08-06 13:07:15 -070062 { -0.5f, -0.5f, 1, 1.5f, 0, 0 },
fmalitaa2bd24f2014-12-08 11:13:27 -080063 { 0.5f, 0.5f, 1, 1.5f, 0, 0 },
fmalitab5f78262014-08-06 13:07:15 -070064
65 { 0, 0, 1, 0.5f, 0, 0 },
fmalitab5f78262014-08-06 13:07:15 -070066 { 0.25f, 0.25f, 1, 0.5f, 0, 0 },
fmalitaa2bd24f2014-12-08 11:13:27 -080067 { -0.25f, -0.25f, 1, 0.5f, 0, 0 },
fmalitab5f78262014-08-06 13:07:15 -070068};
69
fmalita6cd11812014-12-09 05:23:20 -080070static void draw_scene(SkCanvas* canvas, SkScalar pictureSize) {
71 canvas->clear(SK_ColorWHITE);
72
73 SkPaint paint;
fmalita6cd11812014-12-09 05:23:20 -080074 paint.setStyle(SkPaint::kFill_Style);
75 paint.setAntiAlias(true);
76
Robert Phillipsab8faef2022-10-31 14:11:26 -040077 paint.setColor(SK_ColorGREEN);
fmalita6cd11812014-12-09 05:23:20 -080078 canvas->drawCircle(pictureSize / 4, pictureSize / 4, pictureSize / 4, paint);
Robert Phillipsab8faef2022-10-31 14:11:26 -040079 paint.setColor(SK_ColorBLUE);
fmalita6cd11812014-12-09 05:23:20 -080080 canvas->drawRect(SkRect::MakeXYWH(pictureSize / 2, pictureSize / 2,
81 pictureSize / 2, pictureSize / 2), paint);
82
83 paint.setColor(SK_ColorRED);
84 canvas->drawLine(pictureSize / 2, pictureSize * 1 / 3,
85 pictureSize / 2, pictureSize * 2 / 3, paint);
86 canvas->drawLine(pictureSize * 1 / 3, pictureSize / 2,
87 pictureSize * 2 / 3, pictureSize / 2, paint);
88
89 paint.setColor(SK_ColorBLACK);
90 paint.setStyle(SkPaint::kStroke_Style);
91 canvas->drawRect(SkRect::MakeWH(pictureSize, pictureSize), paint);
92}
93
fmalitab5f78262014-08-06 13:07:15 -070094class PictureShaderTileGM : public skiagm::GM {
fmalitab5f78262014-08-06 13:07:15 -070095protected:
Leandro Lovisolo24fa2112023-08-15 19:05:17 +000096 SkString getName() const override { return SkString("pictureshadertile"); }
fmalitab5f78262014-08-06 13:07:15 -070097
Leandro Lovisolo8f023882023-08-15 21:13:52 +000098 SkISize getISize() override { return SkISize::Make(800, 600); }
fmalitab5f78262014-08-06 13:07:15 -070099
mtklein36352bf2015-03-25 18:17:31 -0700100 void onOnceBeforeDraw() override {
fmalitaa2bd24f2014-12-08 11:13:27 -0800101 SkPictureRecorder recorder;
102 SkCanvas* pictureCanvas = recorder.beginRecording(kPictureSize, kPictureSize);
fmalita6cd11812014-12-09 05:23:20 -0800103 draw_scene(pictureCanvas, kPictureSize);
reedca2622b2016-03-18 07:25:55 -0700104 sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
fmalitaa2bd24f2014-12-08 11:13:27 -0800105
106 SkPoint offset = SkPoint::Make(100, 100);
107 pictureCanvas = recorder.beginRecording(SkRect::MakeXYWH(offset.x(), offset.y(),
108 kPictureSize, kPictureSize));
109 pictureCanvas->translate(offset.x(), offset.y());
fmalita6cd11812014-12-09 05:23:20 -0800110 draw_scene(pictureCanvas, kPictureSize);
reedca2622b2016-03-18 07:25:55 -0700111 sk_sp<SkPicture> offsetPicture(recorder.finishRecordingAsPicture());
fmalitaa2bd24f2014-12-08 11:13:27 -0800112
Herb Derbyc37b3862022-06-21 09:49:17 -0400113 for (unsigned i = 0; i < std::size(tiles); ++i) {
fmalitaa2bd24f2014-12-08 11:13:27 -0800114 SkRect tile = SkRect::MakeXYWH(tiles[i].x * kPictureSize,
115 tiles[i].y * kPictureSize,
116 tiles[i].w * kPictureSize,
117 tiles[i].h * kPictureSize);
118 SkMatrix localMatrix;
119 localMatrix.setTranslate(tiles[i].offsetX * kPictureSize,
120 tiles[i].offsetY * kPictureSize);
121 localMatrix.postScale(kFillSize / (2 * kPictureSize),
122 kFillSize / (2 * kPictureSize));
123
reed1a9b9642016-03-13 14:13:58 -0700124 sk_sp<SkPicture> pictureRef = picture;
fmalitaa2bd24f2014-12-08 11:13:27 -0800125 SkRect* tilePtr = &tile;
126
127 if (tile == SkRect::MakeWH(kPictureSize, kPictureSize)) {
128 // When the tile == picture bounds, exercise the picture + offset path.
reed1a9b9642016-03-13 14:13:58 -0700129 pictureRef = offsetPicture;
halcanary96fcdcc2015-08-27 07:41:13 -0700130 tilePtr = nullptr;
fmalitaa2bd24f2014-12-08 11:13:27 -0800131 }
132
Mike Reedfae8fce2019-04-03 10:27:45 -0400133 fShaders[i] = pictureRef->makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat,
Mike Reed10a5ff22021-03-18 17:18:58 -0400134 SkFilterMode::kNearest, &localMatrix, tilePtr);
fmalitaa2bd24f2014-12-08 11:13:27 -0800135 }
136 }
137
mtklein36352bf2015-03-25 18:17:31 -0700138 void onDraw(SkCanvas* canvas) override {
fmalitab5f78262014-08-06 13:07:15 -0700139 canvas->clear(SK_ColorBLACK);
140
141 SkPaint paint;
142 paint.setStyle(SkPaint::kFill_Style);
143
Herb Derbyc37b3862022-06-21 09:49:17 -0400144 for (unsigned i = 0; i < std::size(fShaders); ++i) {
fmalitab5f78262014-08-06 13:07:15 -0700145 paint.setShader(fShaders[i]);
146
147 canvas->save();
148 canvas->translate((i % kRowSize) * kFillSize * 1.1f,
149 (i / kRowSize) * kFillSize * 1.1f);
150 canvas->drawRect(SkRect::MakeWH(kFillSize, kFillSize), paint);
151 canvas->restore();
152 }
153 }
154
155private:
Herb Derbyc37b3862022-06-21 09:49:17 -0400156 sk_sp<SkShader> fShaders[std::size(tiles)];
fmalitab5f78262014-08-06 13:07:15 -0700157
John Stiles7571f9e2020-09-02 22:42:33 -0400158 using INHERITED = GM;
fmalitab5f78262014-08-06 13:07:15 -0700159};
160
halcanary385fe4d2015-08-26 13:07:48 -0700161DEF_GM(return new PictureShaderTileGM;)