blob: e3badd801deeed640a784f2c77566a0a794ea7e3 [file] [log] [blame]
Matt Sarette71db442017-04-21 15:06:51 -04001/*
2 * Copyright 2017 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 "SkPaint.h"
11#include "SkPicture.h"
12#include "SkPictureRecorder.h"
13#include "SkShader.h"
14#include "SkSurface.h"
15
16class PictureShaderCacheGM : public skiagm::GM {
17public:
18 PictureShaderCacheGM(SkScalar tileSize)
19 : fTileSize(tileSize) {
20 }
21
22 protected:
23 void drawTile(SkCanvas* canvas) {
24 SkPaint paint;
25 paint.setColor(SK_ColorGREEN);
26 paint.setStyle(SkPaint::kFill_Style);
27 paint.setAntiAlias(true);
28
29 canvas->drawCircle(fTileSize / 4, fTileSize / 4, fTileSize / 4, paint);
30 canvas->drawRect(SkRect::MakeXYWH(fTileSize / 2, fTileSize / 2,
31 fTileSize / 2, fTileSize / 2), paint);
32
33 paint.setColor(SK_ColorRED);
34 canvas->drawLine(fTileSize / 2, fTileSize * 1 / 3,
35 fTileSize / 2, fTileSize * 2 / 3, paint);
36 canvas->drawLine(fTileSize * 1 / 3, fTileSize / 2,
37 fTileSize * 2 / 3, fTileSize / 2, paint);
38 }
39
40 void onOnceBeforeDraw() override {
41 SkPictureRecorder recorder;
42 SkCanvas* pictureCanvas = recorder.beginRecording(fTileSize, fTileSize, nullptr, 0);
43 this->drawTile(pictureCanvas);
44 fPicture = recorder.finishRecordingAsPicture();
45 }
46
47 SkString onShortName() override {
48 return SkString("pictureshadercache");
49 }
50
51 SkISize onISize() override {
52 return SkISize::Make(100, 100);
53 }
54
55 void onDraw(SkCanvas* canvas) override {
56 SkPaint paint;
57 paint.setShader(SkShader::MakePictureShader(fPicture, SkShader::kRepeat_TileMode,
58 SkShader::kRepeat_TileMode, nullptr,
59 nullptr));
60
61 {
62 // Render in a funny color space that converts green to yellow.
Brian Osman82ebe042019-01-04 17:03:00 -050063 skcms_Matrix3x3 greenToYellow = {{
64 { 1, 1, 0 },
65 { 0, 1, 0 },
66 { 0, 0, 1 },
67 }};
68 sk_sp<SkColorSpace> gty = SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB,
Matt Sarette71db442017-04-21 15:06:51 -040069 greenToYellow);
70 SkImageInfo info = SkImageInfo::MakeN32Premul(100, 100, std::move(gty));
71 sk_sp<SkSurface> surface(SkSurface::MakeRaster(info));
72 surface->getCanvas()->drawRect(SkRect::MakeWH(fTileSize, fTileSize), paint);
73 }
74
75 // When we draw to the canvas, we should see green because we should *not* reuse the
76 // cached picture shader.
77 canvas->drawRect(SkRect::MakeWH(fTileSize, fTileSize), paint);
78 }
79
80private:
81 SkScalar fTileSize;
82 sk_sp<SkPicture> fPicture;
83 SkBitmap fBitmap;
84
85 typedef GM INHERITED;
86};
87
88DEF_GM(return new PictureShaderCacheGM(100);)