1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2016 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker
8*c8dee2aaSAndroid Build Coastguard Worker #include "gm/gm.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/codec/SkCodec.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkBitmap.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorSpace.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkData.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImage.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImageInfo.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPicture.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPictureRecorder.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkStream.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrDirectContext.h"
26*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/SkImageGanesh.h"
27*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skcms/skcms.h"
28*c8dee2aaSAndroid Build Coastguard Worker #include "tools/Resources.h"
29*c8dee2aaSAndroid Build Coastguard Worker
30*c8dee2aaSAndroid Build Coastguard Worker #include <string.h>
31*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
32*c8dee2aaSAndroid Build Coastguard Worker #include <utility>
33*c8dee2aaSAndroid Build Coastguard Worker
34*c8dee2aaSAndroid Build Coastguard Worker static const int kWidth = 64;
35*c8dee2aaSAndroid Build Coastguard Worker static const int kHeight = 64;
36*c8dee2aaSAndroid Build Coastguard Worker
make_raster_image(SkColorType colorType)37*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<SkImage> make_raster_image(SkColorType colorType) {
38*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkStream> stream(GetResourceAsStream("images/google_chrome.ico"));
39*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkCodec> codec = SkCodec::MakeFromStream(std::move(stream));
40*c8dee2aaSAndroid Build Coastguard Worker if (!codec) {
41*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
42*c8dee2aaSAndroid Build Coastguard Worker }
43*c8dee2aaSAndroid Build Coastguard Worker
44*c8dee2aaSAndroid Build Coastguard Worker SkImageInfo info = codec->getInfo().makeWH(kWidth, kHeight)
45*c8dee2aaSAndroid Build Coastguard Worker .makeColorType(colorType)
46*c8dee2aaSAndroid Build Coastguard Worker .makeAlphaType(kPremul_SkAlphaType);
47*c8dee2aaSAndroid Build Coastguard Worker return std::get<0>(codec->getImage(info));
48*c8dee2aaSAndroid Build Coastguard Worker }
49*c8dee2aaSAndroid Build Coastguard Worker
make_codec_image()50*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<SkImage> make_codec_image() {
51*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkData> encoded = GetResourceAsData("images/randPixels.png");
52*c8dee2aaSAndroid Build Coastguard Worker return SkImages::DeferredFromEncodedData(encoded);
53*c8dee2aaSAndroid Build Coastguard Worker }
54*c8dee2aaSAndroid Build Coastguard Worker
draw_contents(SkCanvas * canvas)55*c8dee2aaSAndroid Build Coastguard Worker static void draw_contents(SkCanvas* canvas) {
56*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint;
57*c8dee2aaSAndroid Build Coastguard Worker paint.setStyle(SkPaint::kStroke_Style);
58*c8dee2aaSAndroid Build Coastguard Worker paint.setStrokeWidth(20);
59*c8dee2aaSAndroid Build Coastguard Worker paint.setColor(0xFF800000);
60*c8dee2aaSAndroid Build Coastguard Worker canvas->drawCircle(40, 40, 35, paint);
61*c8dee2aaSAndroid Build Coastguard Worker paint.setColor(0xFF008000);
62*c8dee2aaSAndroid Build Coastguard Worker canvas->drawCircle(50, 50, 35, paint);
63*c8dee2aaSAndroid Build Coastguard Worker paint.setColor(0xFF000080);
64*c8dee2aaSAndroid Build Coastguard Worker canvas->drawCircle(60, 60, 35, paint);
65*c8dee2aaSAndroid Build Coastguard Worker }
66*c8dee2aaSAndroid Build Coastguard Worker
make_picture_image()67*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<SkImage> make_picture_image() {
68*c8dee2aaSAndroid Build Coastguard Worker SkPictureRecorder recorder;
69*c8dee2aaSAndroid Build Coastguard Worker draw_contents(recorder.beginRecording(SkRect::MakeIWH(kWidth, kHeight)));
70*c8dee2aaSAndroid Build Coastguard Worker return SkImages::DeferredFromPicture(recorder.finishRecordingAsPicture(),
71*c8dee2aaSAndroid Build Coastguard Worker SkISize::Make(kWidth, kHeight),
72*c8dee2aaSAndroid Build Coastguard Worker nullptr,
73*c8dee2aaSAndroid Build Coastguard Worker nullptr,
74*c8dee2aaSAndroid Build Coastguard Worker SkImages::BitDepth::kU8,
75*c8dee2aaSAndroid Build Coastguard Worker SkColorSpace::MakeSRGB());
76*c8dee2aaSAndroid Build Coastguard Worker }
77*c8dee2aaSAndroid Build Coastguard Worker
make_parametric_transfer_fn(const SkColorSpacePrimaries & primaries)78*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<SkColorSpace> make_parametric_transfer_fn(const SkColorSpacePrimaries& primaries) {
79*c8dee2aaSAndroid Build Coastguard Worker skcms_Matrix3x3 toXYZD50;
80*c8dee2aaSAndroid Build Coastguard Worker SkAssertResult(primaries.toXYZD50(&toXYZD50));
81*c8dee2aaSAndroid Build Coastguard Worker skcms_TransferFunction fn = { 1.8f, 1.f, 0.f, 0.f, 0.f, 0.f, 0.f };
82*c8dee2aaSAndroid Build Coastguard Worker return SkColorSpace::MakeRGB(fn, toXYZD50);
83*c8dee2aaSAndroid Build Coastguard Worker }
84*c8dee2aaSAndroid Build Coastguard Worker
make_wide_gamut()85*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<SkColorSpace> make_wide_gamut() {
86*c8dee2aaSAndroid Build Coastguard Worker // ProPhoto
87*c8dee2aaSAndroid Build Coastguard Worker SkColorSpacePrimaries primaries;
88*c8dee2aaSAndroid Build Coastguard Worker primaries.fRX = 0.7347f;
89*c8dee2aaSAndroid Build Coastguard Worker primaries.fRY = 0.2653f;
90*c8dee2aaSAndroid Build Coastguard Worker primaries.fGX = 0.1596f;
91*c8dee2aaSAndroid Build Coastguard Worker primaries.fGY = 0.8404f;
92*c8dee2aaSAndroid Build Coastguard Worker primaries.fBX = 0.0366f;
93*c8dee2aaSAndroid Build Coastguard Worker primaries.fBY = 0.0001f;
94*c8dee2aaSAndroid Build Coastguard Worker primaries.fWX = 0.34567f;
95*c8dee2aaSAndroid Build Coastguard Worker primaries.fWY = 0.35850f;
96*c8dee2aaSAndroid Build Coastguard Worker return make_parametric_transfer_fn(primaries);
97*c8dee2aaSAndroid Build Coastguard Worker }
98*c8dee2aaSAndroid Build Coastguard Worker
make_small_gamut()99*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<SkColorSpace> make_small_gamut() {
100*c8dee2aaSAndroid Build Coastguard Worker SkColorSpacePrimaries primaries;
101*c8dee2aaSAndroid Build Coastguard Worker primaries.fRX = 0.50f;
102*c8dee2aaSAndroid Build Coastguard Worker primaries.fRY = 0.33f;
103*c8dee2aaSAndroid Build Coastguard Worker primaries.fGX = 0.30f;
104*c8dee2aaSAndroid Build Coastguard Worker primaries.fGY = 0.50f;
105*c8dee2aaSAndroid Build Coastguard Worker primaries.fBX = 0.25f;
106*c8dee2aaSAndroid Build Coastguard Worker primaries.fBY = 0.16f;
107*c8dee2aaSAndroid Build Coastguard Worker primaries.fWX = 0.3127f;
108*c8dee2aaSAndroid Build Coastguard Worker primaries.fWY = 0.3290f;
109*c8dee2aaSAndroid Build Coastguard Worker return make_parametric_transfer_fn(primaries);
110*c8dee2aaSAndroid Build Coastguard Worker }
111*c8dee2aaSAndroid Build Coastguard Worker
draw_image(GrDirectContext * dContext,SkCanvas * canvas,SkImage * image,SkColorType dstColorType,SkAlphaType dstAlphaType,sk_sp<SkColorSpace> dstColorSpace,SkImage::CachingHint hint)112*c8dee2aaSAndroid Build Coastguard Worker static void draw_image(GrDirectContext* dContext, SkCanvas* canvas, SkImage* image,
113*c8dee2aaSAndroid Build Coastguard Worker SkColorType dstColorType, SkAlphaType dstAlphaType,
114*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace> dstColorSpace, SkImage::CachingHint hint) {
115*c8dee2aaSAndroid Build Coastguard Worker size_t rowBytes = image->width() * SkColorTypeBytesPerPixel(dstColorType);
116*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkData> data = SkData::MakeUninitialized(rowBytes * image->height());
117*c8dee2aaSAndroid Build Coastguard Worker SkImageInfo dstInfo = SkImageInfo::Make(image->width(), image->height(), dstColorType,
118*c8dee2aaSAndroid Build Coastguard Worker dstAlphaType, dstColorSpace);
119*c8dee2aaSAndroid Build Coastguard Worker if (!image->readPixels(dContext, dstInfo, data->writable_data(), rowBytes, 0, 0, hint)) {
120*c8dee2aaSAndroid Build Coastguard Worker memset(data->writable_data(), 0, rowBytes * image->height());
121*c8dee2aaSAndroid Build Coastguard Worker }
122*c8dee2aaSAndroid Build Coastguard Worker
123*c8dee2aaSAndroid Build Coastguard Worker // Now that we have called readPixels(), dump the raw pixels into an srgb image.
124*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace> srgb = SkColorSpace::MakeSRGB();
125*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkImage> raw = SkImages::RasterFromData(dstInfo.makeColorSpace(srgb), data, rowBytes);
126*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(raw.get(), 0.0f, 0.0f);
127*c8dee2aaSAndroid Build Coastguard Worker }
128*c8dee2aaSAndroid Build Coastguard Worker
129*c8dee2aaSAndroid Build Coastguard Worker class ReadPixelsGM : public skiagm::GM {
130*c8dee2aaSAndroid Build Coastguard Worker public:
ReadPixelsGM()131*c8dee2aaSAndroid Build Coastguard Worker ReadPixelsGM() {}
132*c8dee2aaSAndroid Build Coastguard Worker
133*c8dee2aaSAndroid Build Coastguard Worker protected:
getName() const134*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { return SkString("readpixels"); }
135*c8dee2aaSAndroid Build Coastguard Worker
getISize()136*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return SkISize::Make(6 * kWidth, 9 * kHeight); }
137*c8dee2aaSAndroid Build Coastguard Worker
onDraw(SkCanvas * canvas)138*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas* canvas) override {
139*c8dee2aaSAndroid Build Coastguard Worker const SkAlphaType alphaTypes[] = {
140*c8dee2aaSAndroid Build Coastguard Worker kUnpremul_SkAlphaType,
141*c8dee2aaSAndroid Build Coastguard Worker kPremul_SkAlphaType,
142*c8dee2aaSAndroid Build Coastguard Worker };
143*c8dee2aaSAndroid Build Coastguard Worker const SkColorType colorTypes[] = {
144*c8dee2aaSAndroid Build Coastguard Worker kRGBA_8888_SkColorType,
145*c8dee2aaSAndroid Build Coastguard Worker kBGRA_8888_SkColorType,
146*c8dee2aaSAndroid Build Coastguard Worker kRGBA_F16_SkColorType,
147*c8dee2aaSAndroid Build Coastguard Worker };
148*c8dee2aaSAndroid Build Coastguard Worker const sk_sp<SkColorSpace> colorSpaces[] = {
149*c8dee2aaSAndroid Build Coastguard Worker make_wide_gamut(),
150*c8dee2aaSAndroid Build Coastguard Worker SkColorSpace::MakeSRGB(),
151*c8dee2aaSAndroid Build Coastguard Worker make_small_gamut(),
152*c8dee2aaSAndroid Build Coastguard Worker };
153*c8dee2aaSAndroid Build Coastguard Worker
154*c8dee2aaSAndroid Build Coastguard Worker for (const sk_sp<SkColorSpace>& dstColorSpace : colorSpaces) {
155*c8dee2aaSAndroid Build Coastguard Worker for (SkColorType srcColorType : colorTypes) {
156*c8dee2aaSAndroid Build Coastguard Worker canvas->save();
157*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkImage> image = make_raster_image(srcColorType);
158*c8dee2aaSAndroid Build Coastguard Worker if (!image) {
159*c8dee2aaSAndroid Build Coastguard Worker continue;
160*c8dee2aaSAndroid Build Coastguard Worker }
161*c8dee2aaSAndroid Build Coastguard Worker auto dContext = GrAsDirectContext(canvas->recordingContext());
162*c8dee2aaSAndroid Build Coastguard Worker if (dContext) {
163*c8dee2aaSAndroid Build Coastguard Worker image = SkImages::TextureFromImage(dContext, image);
164*c8dee2aaSAndroid Build Coastguard Worker }
165*c8dee2aaSAndroid Build Coastguard Worker if (image) {
166*c8dee2aaSAndroid Build Coastguard Worker for (SkColorType dstColorType : colorTypes) {
167*c8dee2aaSAndroid Build Coastguard Worker for (SkAlphaType dstAlphaType : alphaTypes) {
168*c8dee2aaSAndroid Build Coastguard Worker draw_image(dContext, canvas, image.get(), dstColorType, dstAlphaType,
169*c8dee2aaSAndroid Build Coastguard Worker dstColorSpace, SkImage::kAllow_CachingHint);
170*c8dee2aaSAndroid Build Coastguard Worker canvas->translate((float)kWidth, 0.0f);
171*c8dee2aaSAndroid Build Coastguard Worker }
172*c8dee2aaSAndroid Build Coastguard Worker }
173*c8dee2aaSAndroid Build Coastguard Worker }
174*c8dee2aaSAndroid Build Coastguard Worker canvas->restore();
175*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0.0f, (float) kHeight);
176*c8dee2aaSAndroid Build Coastguard Worker }
177*c8dee2aaSAndroid Build Coastguard Worker }
178*c8dee2aaSAndroid Build Coastguard Worker }
179*c8dee2aaSAndroid Build Coastguard Worker
180*c8dee2aaSAndroid Build Coastguard Worker private:
181*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = skiagm::GM;
182*c8dee2aaSAndroid Build Coastguard Worker };
183*c8dee2aaSAndroid Build Coastguard Worker DEF_GM( return new ReadPixelsGM; )
184*c8dee2aaSAndroid Build Coastguard Worker
185*c8dee2aaSAndroid Build Coastguard Worker class ReadPixelsCodecGM : public skiagm::GM {
186*c8dee2aaSAndroid Build Coastguard Worker public:
ReadPixelsCodecGM()187*c8dee2aaSAndroid Build Coastguard Worker ReadPixelsCodecGM() {}
188*c8dee2aaSAndroid Build Coastguard Worker
189*c8dee2aaSAndroid Build Coastguard Worker protected:
getName() const190*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { return SkString("readpixelscodec"); }
191*c8dee2aaSAndroid Build Coastguard Worker
getISize()192*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override {
193*c8dee2aaSAndroid Build Coastguard Worker return SkISize::Make(3 * (kEncodedWidth + 1), 12 * (kEncodedHeight + 1));
194*c8dee2aaSAndroid Build Coastguard Worker }
195*c8dee2aaSAndroid Build Coastguard Worker
onDraw(SkCanvas * canvas,SkString * errorMsg)196*c8dee2aaSAndroid Build Coastguard Worker DrawResult onDraw(SkCanvas* canvas, SkString* errorMsg) override {
197*c8dee2aaSAndroid Build Coastguard Worker if (!canvas->imageInfo().colorSpace()) {
198*c8dee2aaSAndroid Build Coastguard Worker *errorMsg = "This gm is only interesting in color correct modes.";
199*c8dee2aaSAndroid Build Coastguard Worker return DrawResult::kSkip;
200*c8dee2aaSAndroid Build Coastguard Worker }
201*c8dee2aaSAndroid Build Coastguard Worker
202*c8dee2aaSAndroid Build Coastguard Worker const SkAlphaType alphaTypes[] = {
203*c8dee2aaSAndroid Build Coastguard Worker kUnpremul_SkAlphaType,
204*c8dee2aaSAndroid Build Coastguard Worker kPremul_SkAlphaType,
205*c8dee2aaSAndroid Build Coastguard Worker };
206*c8dee2aaSAndroid Build Coastguard Worker const SkColorType colorTypes[] = {
207*c8dee2aaSAndroid Build Coastguard Worker kRGBA_8888_SkColorType,
208*c8dee2aaSAndroid Build Coastguard Worker kBGRA_8888_SkColorType,
209*c8dee2aaSAndroid Build Coastguard Worker kRGBA_F16_SkColorType,
210*c8dee2aaSAndroid Build Coastguard Worker };
211*c8dee2aaSAndroid Build Coastguard Worker const sk_sp<SkColorSpace> colorSpaces[] = {
212*c8dee2aaSAndroid Build Coastguard Worker make_wide_gamut(),
213*c8dee2aaSAndroid Build Coastguard Worker SkColorSpace::MakeSRGB(),
214*c8dee2aaSAndroid Build Coastguard Worker make_small_gamut(),
215*c8dee2aaSAndroid Build Coastguard Worker };
216*c8dee2aaSAndroid Build Coastguard Worker const SkImage::CachingHint hints[] = {
217*c8dee2aaSAndroid Build Coastguard Worker SkImage::kAllow_CachingHint,
218*c8dee2aaSAndroid Build Coastguard Worker SkImage::kDisallow_CachingHint,
219*c8dee2aaSAndroid Build Coastguard Worker };
220*c8dee2aaSAndroid Build Coastguard Worker
221*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkImage> image = make_codec_image();
222*c8dee2aaSAndroid Build Coastguard Worker for (const sk_sp<SkColorSpace>& dstColorSpace : colorSpaces) {
223*c8dee2aaSAndroid Build Coastguard Worker canvas->save();
224*c8dee2aaSAndroid Build Coastguard Worker for (SkColorType dstColorType : colorTypes) {
225*c8dee2aaSAndroid Build Coastguard Worker for (SkAlphaType dstAlphaType : alphaTypes) {
226*c8dee2aaSAndroid Build Coastguard Worker for (SkImage::CachingHint hint : hints) {
227*c8dee2aaSAndroid Build Coastguard Worker draw_image(nullptr, canvas, image.get(), dstColorType, dstAlphaType,
228*c8dee2aaSAndroid Build Coastguard Worker dstColorSpace, hint);
229*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0.0f, (float) kEncodedHeight + 1);
230*c8dee2aaSAndroid Build Coastguard Worker }
231*c8dee2aaSAndroid Build Coastguard Worker }
232*c8dee2aaSAndroid Build Coastguard Worker }
233*c8dee2aaSAndroid Build Coastguard Worker canvas->restore();
234*c8dee2aaSAndroid Build Coastguard Worker canvas->translate((float) kEncodedWidth + 1, 0.0f);
235*c8dee2aaSAndroid Build Coastguard Worker }
236*c8dee2aaSAndroid Build Coastguard Worker return DrawResult::kOk;
237*c8dee2aaSAndroid Build Coastguard Worker }
238*c8dee2aaSAndroid Build Coastguard Worker
239*c8dee2aaSAndroid Build Coastguard Worker private:
240*c8dee2aaSAndroid Build Coastguard Worker static const int kEncodedWidth = 8;
241*c8dee2aaSAndroid Build Coastguard Worker static const int kEncodedHeight = 8;
242*c8dee2aaSAndroid Build Coastguard Worker
243*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = skiagm::GM;
244*c8dee2aaSAndroid Build Coastguard Worker };
245*c8dee2aaSAndroid Build Coastguard Worker DEF_GM( return new ReadPixelsCodecGM; )
246*c8dee2aaSAndroid Build Coastguard Worker
247*c8dee2aaSAndroid Build Coastguard Worker class ReadPixelsPictureGM : public skiagm::GM {
248*c8dee2aaSAndroid Build Coastguard Worker public:
ReadPixelsPictureGM()249*c8dee2aaSAndroid Build Coastguard Worker ReadPixelsPictureGM() {}
250*c8dee2aaSAndroid Build Coastguard Worker
251*c8dee2aaSAndroid Build Coastguard Worker protected:
getName() const252*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { return SkString("readpixelspicture"); }
253*c8dee2aaSAndroid Build Coastguard Worker
getISize()254*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return SkISize::Make(3 * kWidth, 12 * kHeight); }
255*c8dee2aaSAndroid Build Coastguard Worker
onDraw(SkCanvas * canvas,SkString * errorMsg)256*c8dee2aaSAndroid Build Coastguard Worker DrawResult onDraw(SkCanvas* canvas, SkString* errorMsg) override {
257*c8dee2aaSAndroid Build Coastguard Worker if (!canvas->imageInfo().colorSpace()) {
258*c8dee2aaSAndroid Build Coastguard Worker *errorMsg = "This gm is only interesting in color correct modes.";
259*c8dee2aaSAndroid Build Coastguard Worker return DrawResult::kSkip;
260*c8dee2aaSAndroid Build Coastguard Worker }
261*c8dee2aaSAndroid Build Coastguard Worker
262*c8dee2aaSAndroid Build Coastguard Worker const sk_sp<SkImage> images[] = {
263*c8dee2aaSAndroid Build Coastguard Worker make_picture_image(),
264*c8dee2aaSAndroid Build Coastguard Worker };
265*c8dee2aaSAndroid Build Coastguard Worker const SkAlphaType alphaTypes[] = {
266*c8dee2aaSAndroid Build Coastguard Worker kUnpremul_SkAlphaType,
267*c8dee2aaSAndroid Build Coastguard Worker kPremul_SkAlphaType,
268*c8dee2aaSAndroid Build Coastguard Worker };
269*c8dee2aaSAndroid Build Coastguard Worker const SkColorType colorTypes[] = {
270*c8dee2aaSAndroid Build Coastguard Worker kRGBA_8888_SkColorType,
271*c8dee2aaSAndroid Build Coastguard Worker kBGRA_8888_SkColorType,
272*c8dee2aaSAndroid Build Coastguard Worker kRGBA_F16_SkColorType,
273*c8dee2aaSAndroid Build Coastguard Worker };
274*c8dee2aaSAndroid Build Coastguard Worker const sk_sp<SkColorSpace> colorSpaces[] = {
275*c8dee2aaSAndroid Build Coastguard Worker make_wide_gamut(),
276*c8dee2aaSAndroid Build Coastguard Worker SkColorSpace::MakeSRGB(),
277*c8dee2aaSAndroid Build Coastguard Worker make_small_gamut(),
278*c8dee2aaSAndroid Build Coastguard Worker };
279*c8dee2aaSAndroid Build Coastguard Worker const SkImage::CachingHint hints[] = {
280*c8dee2aaSAndroid Build Coastguard Worker SkImage::kAllow_CachingHint,
281*c8dee2aaSAndroid Build Coastguard Worker SkImage::kDisallow_CachingHint,
282*c8dee2aaSAndroid Build Coastguard Worker };
283*c8dee2aaSAndroid Build Coastguard Worker
284*c8dee2aaSAndroid Build Coastguard Worker for (const sk_sp<SkImage>& image : images) {
285*c8dee2aaSAndroid Build Coastguard Worker for (const sk_sp<SkColorSpace>& dstColorSpace : colorSpaces) {
286*c8dee2aaSAndroid Build Coastguard Worker canvas->save();
287*c8dee2aaSAndroid Build Coastguard Worker for (SkColorType dstColorType : colorTypes) {
288*c8dee2aaSAndroid Build Coastguard Worker for (SkAlphaType dstAlphaType : alphaTypes) {
289*c8dee2aaSAndroid Build Coastguard Worker for (SkImage::CachingHint hint : hints) {
290*c8dee2aaSAndroid Build Coastguard Worker draw_image(nullptr, canvas, image.get(), dstColorType, dstAlphaType,
291*c8dee2aaSAndroid Build Coastguard Worker dstColorSpace, hint);
292*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0.0f, (float) kHeight);
293*c8dee2aaSAndroid Build Coastguard Worker }
294*c8dee2aaSAndroid Build Coastguard Worker }
295*c8dee2aaSAndroid Build Coastguard Worker }
296*c8dee2aaSAndroid Build Coastguard Worker canvas->restore();
297*c8dee2aaSAndroid Build Coastguard Worker canvas->translate((float) kWidth, 0.0f);
298*c8dee2aaSAndroid Build Coastguard Worker }
299*c8dee2aaSAndroid Build Coastguard Worker }
300*c8dee2aaSAndroid Build Coastguard Worker return DrawResult::kOk;
301*c8dee2aaSAndroid Build Coastguard Worker }
302*c8dee2aaSAndroid Build Coastguard Worker
303*c8dee2aaSAndroid Build Coastguard Worker private:
304*c8dee2aaSAndroid Build Coastguard Worker
305*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = skiagm::GM;
306*c8dee2aaSAndroid Build Coastguard Worker };
307*c8dee2aaSAndroid Build Coastguard Worker DEF_GM( return new ReadPixelsPictureGM; )
308