blob: 169410a9741a4055054d77eb9ca8b62382f0ed60 [file] [log] [blame]
reed499abab2015-08-20 12:30:20 -07001/*
2 * Copyright 2015 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"
9#include "include/core/SkCanvas.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040010#include "include/core/SkColor.h"
11#include "include/core/SkColorSpace.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050012#include "include/core/SkData.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040013#include "include/core/SkEncodedImageFormat.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050014#include "include/core/SkImage.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040015#include "include/core/SkImageInfo.h"
16#include "include/core/SkMatrix.h"
17#include "include/core/SkPaint.h"
18#include "include/core/SkPicture.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050019#include "include/core/SkPictureRecorder.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040020#include "include/core/SkRect.h"
21#include "include/core/SkRefCnt.h"
22#include "include/core/SkShader.h"
23#include "include/core/SkSize.h"
24#include "include/core/SkString.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050025#include "include/core/SkSurface.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040026#include "include/core/SkTileMode.h"
27#include "include/core/SkTypes.h"
28
29#include <utility>
30
reed499abab2015-08-20 12:30:20 -070031static void draw_something(SkCanvas* canvas, const SkRect& bounds) {
32 SkPaint paint;
33 paint.setAntiAlias(true);
34 paint.setColor(SK_ColorRED);
35 paint.setStyle(SkPaint::kStroke_Style);
36 paint.setStrokeWidth(10);
37 canvas->drawRect(bounds, paint);
38 paint.setStyle(SkPaint::kFill_Style);
39 paint.setColor(SK_ColorBLUE);
40 canvas->drawOval(bounds, paint);
41}
42
Robert Phillips16bf7d32020-07-07 10:20:27 -040043typedef sk_sp<SkImage> (*ImageMakerProc)(GrRecordingContext*, SkPicture*, const SkImageInfo&);
reed499abab2015-08-20 12:30:20 -070044
Robert Phillips16bf7d32020-07-07 10:20:27 -040045static sk_sp<SkImage> make_raster(GrRecordingContext*,
46 SkPicture* pic,
47 const SkImageInfo& info) {
reede8f30622016-03-23 18:59:25 -070048 auto surface(SkSurface::MakeRaster(info));
reed499abab2015-08-20 12:30:20 -070049 surface->getCanvas()->clear(0);
50 surface->getCanvas()->drawPicture(pic);
reed9ce9d672016-03-17 10:51:11 -070051 return surface->makeImageSnapshot();
reed499abab2015-08-20 12:30:20 -070052}
53
Robert Phillips16bf7d32020-07-07 10:20:27 -040054static sk_sp<SkImage> make_texture(GrRecordingContext* ctx,
55 SkPicture* pic,
56 const SkImageInfo& info) {
reed499abab2015-08-20 12:30:20 -070057 if (!ctx) {
58 return nullptr;
59 }
reede8f30622016-03-23 18:59:25 -070060 auto surface(SkSurface::MakeRenderTarget(ctx, SkBudgeted::kNo, info));
scroggoa1b28332016-05-12 06:19:37 -070061 if (!surface) {
62 return nullptr;
63 }
reed499abab2015-08-20 12:30:20 -070064 surface->getCanvas()->clear(0);
65 surface->getCanvas()->drawPicture(pic);
reed9ce9d672016-03-17 10:51:11 -070066 return surface->makeImageSnapshot();
reed499abab2015-08-20 12:30:20 -070067}
68
Robert Phillips16bf7d32020-07-07 10:20:27 -040069static sk_sp<SkImage> make_pict_gen(GrRecordingContext*,
70 SkPicture* pic,
71 const SkImageInfo& info) {
Brian Osman138ea972016-12-16 11:55:18 -050072 return SkImage::MakeFromPicture(sk_ref_sp(pic), info.dimensions(), nullptr, nullptr,
Matt Sarette94255d2017-01-09 12:38:59 -050073 SkImage::BitDepth::kU8,
Matt Sarett77a7a1b2017-02-07 13:56:11 -050074 SkColorSpace::MakeSRGB());
reed499abab2015-08-20 12:30:20 -070075}
76
Robert Phillips16bf7d32020-07-07 10:20:27 -040077static sk_sp<SkImage> make_encode_gen(GrRecordingContext* ctx,
78 SkPicture* pic,
79 const SkImageInfo& info) {
reed9ce9d672016-03-17 10:51:11 -070080 sk_sp<SkImage> src(make_raster(ctx, pic, info));
reed499abab2015-08-20 12:30:20 -070081 if (!src) {
82 return nullptr;
83 }
Mike Reed6409f842017-07-11 16:03:13 -040084 sk_sp<SkData> encoded = src->encodeToData(SkEncodedImageFormat::kPNG, 100);
reed499abab2015-08-20 12:30:20 -070085 if (!encoded) {
86 return nullptr;
87 }
reed9ce9d672016-03-17 10:51:11 -070088 return SkImage::MakeFromEncoded(std::move(encoded));
reed499abab2015-08-20 12:30:20 -070089}
90
91const ImageMakerProc gProcs[] = {
92 make_raster,
93 make_texture,
94 make_pict_gen,
95 make_encode_gen,
96};
97
98/*
99 * Exercise drawing pictures inside an image, showing that the image version is pixelated
100 * (correctly) when it is inside an image.
101 */
102class ImageShaderGM : public skiagm::GM {
reedca2622b2016-03-18 07:25:55 -0700103 sk_sp<SkPicture> fPicture;
reed499abab2015-08-20 12:30:20 -0700104
105public:
106 ImageShaderGM() {}
107
108protected:
109 SkString onShortName() override {
110 return SkString("image-shader");
111 }
112
113 SkISize onISize() override {
114 return SkISize::Make(850, 450);
115 }
116
117 void onOnceBeforeDraw() override {
118 const SkRect bounds = SkRect::MakeWH(100, 100);
119 SkPictureRecorder recorder;
120 draw_something(recorder.beginRecording(bounds), bounds);
reedca2622b2016-03-18 07:25:55 -0700121 fPicture = recorder.finishRecordingAsPicture();
reed499abab2015-08-20 12:30:20 -0700122 }
123
124 void testImage(SkCanvas* canvas, SkImage* image) {
125 SkAutoCanvasRestore acr(canvas, true);
126
127 canvas->drawImage(image, 0, 0);
128 canvas->translate(0, 120);
129
Mike Reedfae8fce2019-04-03 10:27:45 -0400130 const SkTileMode tile = SkTileMode::kRepeat;
Mike Reed1f607332020-05-21 12:11:27 -0400131 const SkMatrix localM = SkMatrix::Translate(-50, -50);
reed499abab2015-08-20 12:30:20 -0700132 SkPaint paint;
reed5671c5b2016-03-09 14:47:34 -0800133 paint.setShader(image->makeShader(tile, tile, &localM));
reed499abab2015-08-20 12:30:20 -0700134 paint.setAntiAlias(true);
reed499abab2015-08-20 12:30:20 -0700135 canvas->drawCircle(50, 50, 50, paint);
136 }
137
138 void onDraw(SkCanvas* canvas) override {
139 canvas->translate(20, 20);
140
141 const SkImageInfo info = SkImageInfo::MakeN32Premul(100, 100);
142
143 for (size_t i = 0; i < SK_ARRAY_COUNT(gProcs); ++i) {
Robert Phillips16bf7d32020-07-07 10:20:27 -0400144 sk_sp<SkImage> image(gProcs[i](canvas->recordingContext(), fPicture.get(), info));
reed499abab2015-08-20 12:30:20 -0700145 if (image) {
reed9ce9d672016-03-17 10:51:11 -0700146 this->testImage(canvas, image.get());
reed499abab2015-08-20 12:30:20 -0700147 }
148 canvas->translate(120, 0);
149 }
150 }
151
152private:
153 typedef skiagm::GM INHERITED;
154};
155DEF_GM( return new ImageShaderGM; )