blob: 44db338fc203bf38fd6ec698e26757bfcd9a3fda [file] [log] [blame]
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +00001/*
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
8#include "gm.h"
9
10#include "SkBitmap.h"
11#include "SkPaint.h"
12#include "SkPicture.h"
robertphillips@google.com770963f2014-04-18 18:04:41 +000013#include "SkPictureRecorder.h"
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +000014#include "SkShader.h"
15
16namespace skiagm {
17
18static struct {
19 SkShader::TileMode tmx;
20 SkShader::TileMode tmy;
21} kTileConfigs[] = {
22 { SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode },
23 { SkShader::kRepeat_TileMode, SkShader::kClamp_TileMode },
24 { SkShader::kMirror_TileMode, SkShader::kRepeat_TileMode },
25};
26
27class PictureShaderGM : public GM {
28public:
29
30 PictureShaderGM(SkScalar tileSize, SkScalar sceneSize)
31 : fTileSize(tileSize)
32 , fSceneSize(sceneSize) {
33
34 // Build the picture.
robertphillips@google.com84b18c72014-04-13 19:09:42 +000035 SkPictureRecorder recorder;
36 SkCanvas* pictureCanvas = recorder.beginRecording(SkScalarRoundToInt(tileSize),
commit-bot@chromium.org5fb2ce32014-04-17 23:35:06 +000037 SkScalarRoundToInt(tileSize),
38 NULL, 0);
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +000039 this->drawTile(pictureCanvas);
robertphillips@google.com84b18c72014-04-13 19:09:42 +000040 SkAutoTUnref<SkPicture> p(recorder.endRecording());
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +000041
42 // Build a reference bitmap.
43 SkBitmap bm;
44 bm.allocN32Pixels(SkScalarRoundToInt(tileSize), SkScalarRoundToInt(tileSize));
45 bm.eraseColor(SK_ColorTRANSPARENT);
46 SkCanvas bitmapCanvas(bm);
47 this->drawTile(&bitmapCanvas);
48
49 for (unsigned i = 0; i < SK_ARRAY_COUNT(kTileConfigs); ++i) {
50 fPictureShaders[i].reset(SkShader::CreatePictureShader(p,
51 kTileConfigs[i].tmx,
52 kTileConfigs[i].tmy));
53
54 fBitmapShaders[i].reset(SkShader::CreateBitmapShader(bm,
55 kTileConfigs[i].tmx,
56 kTileConfigs[i].tmy));
57 }
58 }
59
60protected:
commit-bot@chromium.orga90c6802014-04-30 13:20:45 +000061 virtual uint32_t onGetFlags() const SK_OVERRIDE {
62 return kSkipTiled_Flag;
63 }
64
commit-bot@chromium.orgc5d9bb02014-04-08 15:19:34 +000065 virtual SkString onShortName() SK_OVERRIDE {
66 return SkString("pictureshader");
67 }
68
69 virtual SkISize onISize() SK_OVERRIDE {
70 return SkISize::Make(1400, 1250);
71 }
72
73 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
74 this->drawSceneColumn(canvas, SkPoint::Make(0, 0), 1, 1, 0);
75 this->drawSceneColumn(canvas, SkPoint::Make(0, fSceneSize * 6.4f), 1, 2, 0);
76 this->drawSceneColumn(canvas, SkPoint::Make(fSceneSize * 2.4f, 0), 1, 1, 1);
77 this->drawSceneColumn(canvas, SkPoint::Make(fSceneSize * 2.4f, fSceneSize * 6.4f), 1, 1, 2);
78 this->drawSceneColumn(canvas, SkPoint::Make(fSceneSize * 4.8f, 0), 2, 1, 0);
79 this->drawSceneColumn(canvas, SkPoint::Make(fSceneSize * 9.6f, 0), 2, 2, 0);
80 }
81
82private:
83 void drawSceneColumn(SkCanvas* canvas, const SkPoint& pos, SkScalar scale, SkScalar localScale,
84 unsigned tileMode) {
85 SkMatrix ctm, localMatrix;
86
87 ctm.setTranslate(pos.x(), pos.y());
88 ctm.preScale(scale, scale);
89 localMatrix.setScale(localScale, localScale);
90 this->drawScene(canvas, ctm, localMatrix, tileMode);
91
92 ctm.setTranslate(pos.x(), pos.y() + fSceneSize * 1.2f * scale);
93 ctm.preScale(scale, scale);
94 localMatrix.setTranslate(fTileSize / 4, fTileSize / 4);
95 localMatrix.preScale(localScale, localScale);
96 this->drawScene(canvas, ctm, localMatrix, tileMode);
97
98 ctm.setTranslate(pos.x(), pos.y() + fSceneSize * 2.4f * scale);
99 ctm.preScale(scale, scale);
100 localMatrix.setRotate(45);
101 localMatrix.preScale(localScale, localScale);
102 this->drawScene(canvas, ctm, localMatrix, tileMode);
103
104 ctm.setTranslate(pos.x(), pos.y() + fSceneSize * 3.6f * scale);
105 ctm.preScale(scale, scale);
106 localMatrix.setSkew(1, 0);
107 localMatrix.preScale(localScale, localScale);
108 this->drawScene(canvas, ctm, localMatrix, tileMode);
109
110 ctm.setTranslate(pos.x(), pos.y() + fSceneSize * 4.8f * scale);
111 ctm.preScale(scale, scale);
112 localMatrix.setTranslate(fTileSize / 4, fTileSize / 4);
113 localMatrix.preRotate(45);
114 localMatrix.preScale(localScale, localScale);
115 this->drawScene(canvas, ctm, localMatrix, tileMode);
116 }
117
118 void drawTile(SkCanvas* canvas) {
119 SkPaint paint;
120 paint.setColor(SK_ColorGREEN);
121 paint.setStyle(SkPaint::kFill_Style);
122 paint.setAntiAlias(true);
123
124 canvas->drawCircle(fTileSize / 4, fTileSize / 4, fTileSize / 4, paint);
125 canvas->drawRect(SkRect::MakeXYWH(fTileSize / 2, fTileSize / 2,
126 fTileSize / 2, fTileSize / 2), paint);
127
128 paint.setColor(SK_ColorRED);
129 canvas->drawLine(fTileSize / 2, fTileSize * 1 / 3,
130 fTileSize / 2, fTileSize * 2 / 3, paint);
131 canvas->drawLine(fTileSize * 1 / 3, fTileSize / 2,
132 fTileSize * 2 / 3, fTileSize / 2, paint);
133 }
134
135 void drawScene(SkCanvas* canvas, const SkMatrix& matrix, const SkMatrix& localMatrix,
136 unsigned tileMode) {
137 SkASSERT(tileMode < SK_ARRAY_COUNT(kTileConfigs));
138
139 SkPaint paint;
140 paint.setStyle(SkPaint::kFill_Style);
141 paint.setColor(SK_ColorLTGRAY);
142
143 canvas->save();
144 canvas->concat(matrix);
145 canvas->drawRect(SkRect::MakeWH(fSceneSize, fSceneSize), paint);
146 canvas->drawRect(SkRect::MakeXYWH(fSceneSize * 1.1f, 0, fSceneSize, fSceneSize), paint);
147
148 fPictureShaders[tileMode]->setLocalMatrix(localMatrix);
149 paint.setShader(fPictureShaders[tileMode].get());
150 canvas->drawRect(SkRect::MakeWH(fSceneSize, fSceneSize), paint);
151
152 canvas->translate(fSceneSize * 1.1f, 0);
153
154 fBitmapShaders[tileMode]->setLocalMatrix(localMatrix);
155 paint.setShader(fBitmapShaders[tileMode].get());
156 canvas->drawRect(SkRect::MakeWH(fSceneSize, fSceneSize), paint);
157
158 canvas->restore();
159 }
160
161 SkScalar fTileSize;
162 SkScalar fSceneSize;
163
164 SkAutoTUnref<SkShader> fPictureShaders[SK_ARRAY_COUNT(kTileConfigs)];
165 SkAutoTUnref<SkShader> fBitmapShaders[SK_ARRAY_COUNT(kTileConfigs)];
166
167 typedef GM INHERITED;
168};
169
170DEF_GM( return SkNEW_ARGS(PictureShaderGM, (50, 100)); )
171}