1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2015 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/core/SkBitmap.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorSpace.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFont.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFontStyle.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFontTypes.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImage.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImageInfo.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPixmap.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypeface.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "tools/DecodeUtils.h"
26*c8dee2aaSAndroid Build Coastguard Worker #include "tools/Resources.h"
27*c8dee2aaSAndroid Build Coastguard Worker #include "tools/ToolUtils.h"
28*c8dee2aaSAndroid Build Coastguard Worker #include "tools/fonts/FontToolUtils.h"
29*c8dee2aaSAndroid Build Coastguard Worker
30*c8dee2aaSAndroid Build Coastguard Worker #include <string.h>
31*c8dee2aaSAndroid Build Coastguard Worker #include <initializer_list>
32*c8dee2aaSAndroid Build Coastguard Worker
copy_bitmap(const SkBitmap & src,SkColorType colorType)33*c8dee2aaSAndroid Build Coastguard Worker static SkBitmap copy_bitmap(const SkBitmap& src, SkColorType colorType) {
34*c8dee2aaSAndroid Build Coastguard Worker const SkBitmap* srcPtr = &src;
35*c8dee2aaSAndroid Build Coastguard Worker SkBitmap tmp(src);
36*c8dee2aaSAndroid Build Coastguard Worker if (kRGB_565_SkColorType == colorType) {
37*c8dee2aaSAndroid Build Coastguard Worker tmp.setAlphaType(kOpaque_SkAlphaType);
38*c8dee2aaSAndroid Build Coastguard Worker srcPtr = &tmp;
39*c8dee2aaSAndroid Build Coastguard Worker }
40*c8dee2aaSAndroid Build Coastguard Worker
41*c8dee2aaSAndroid Build Coastguard Worker SkBitmap copy;
42*c8dee2aaSAndroid Build Coastguard Worker ToolUtils::copy_to(©, colorType, *srcPtr);
43*c8dee2aaSAndroid Build Coastguard Worker copy.setImmutable();
44*c8dee2aaSAndroid Build Coastguard Worker return copy;
45*c8dee2aaSAndroid Build Coastguard Worker }
46*c8dee2aaSAndroid Build Coastguard Worker
47*c8dee2aaSAndroid Build Coastguard Worker #define SCALE 128
48*c8dee2aaSAndroid Build Coastguard Worker
49*c8dee2aaSAndroid Build Coastguard Worker // Make either A8 or gray8 bitmap.
make_bitmap(SkColorType ct)50*c8dee2aaSAndroid Build Coastguard Worker static SkBitmap make_bitmap(SkColorType ct) {
51*c8dee2aaSAndroid Build Coastguard Worker SkBitmap bm;
52*c8dee2aaSAndroid Build Coastguard Worker switch (ct) {
53*c8dee2aaSAndroid Build Coastguard Worker case kAlpha_8_SkColorType:
54*c8dee2aaSAndroid Build Coastguard Worker bm.allocPixels(SkImageInfo::MakeA8(SCALE, SCALE));
55*c8dee2aaSAndroid Build Coastguard Worker break;
56*c8dee2aaSAndroid Build Coastguard Worker case kGray_8_SkColorType:
57*c8dee2aaSAndroid Build Coastguard Worker bm.allocPixels(
58*c8dee2aaSAndroid Build Coastguard Worker SkImageInfo::Make(SCALE, SCALE, ct, kOpaque_SkAlphaType));
59*c8dee2aaSAndroid Build Coastguard Worker break;
60*c8dee2aaSAndroid Build Coastguard Worker default:
61*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(false);
62*c8dee2aaSAndroid Build Coastguard Worker return bm;
63*c8dee2aaSAndroid Build Coastguard Worker }
64*c8dee2aaSAndroid Build Coastguard Worker uint8_t spectrum[256];
65*c8dee2aaSAndroid Build Coastguard Worker for (int y = 0; y < 256; ++y) {
66*c8dee2aaSAndroid Build Coastguard Worker spectrum[y] = y;
67*c8dee2aaSAndroid Build Coastguard Worker }
68*c8dee2aaSAndroid Build Coastguard Worker for (int y = 0; y < 128; ++y) {
69*c8dee2aaSAndroid Build Coastguard Worker // Shift over one byte each scanline.
70*c8dee2aaSAndroid Build Coastguard Worker memcpy(bm.getAddr8(0, y), &spectrum[y], 128);
71*c8dee2aaSAndroid Build Coastguard Worker }
72*c8dee2aaSAndroid Build Coastguard Worker bm.setImmutable();
73*c8dee2aaSAndroid Build Coastguard Worker return bm;
74*c8dee2aaSAndroid Build Coastguard Worker }
75*c8dee2aaSAndroid Build Coastguard Worker
draw_center_letter(char c,const SkFont & font,SkColor color,SkScalar x,SkScalar y,SkCanvas * canvas)76*c8dee2aaSAndroid Build Coastguard Worker static void draw_center_letter(char c, const SkFont& font, SkColor color,
77*c8dee2aaSAndroid Build Coastguard Worker SkScalar x, SkScalar y, SkCanvas* canvas) {
78*c8dee2aaSAndroid Build Coastguard Worker SkRect bounds;
79*c8dee2aaSAndroid Build Coastguard Worker font.measureText(&c, 1, SkTextEncoding::kUTF8, &bounds);
80*c8dee2aaSAndroid Build Coastguard Worker canvas->drawSimpleText(&c, 1, SkTextEncoding::kUTF8,
81*c8dee2aaSAndroid Build Coastguard Worker x - bounds.centerX(), y - bounds.centerY(),
82*c8dee2aaSAndroid Build Coastguard Worker font, SkPaint(SkColor4f::FromColor(color)));
83*c8dee2aaSAndroid Build Coastguard Worker }
84*c8dee2aaSAndroid Build Coastguard Worker
color_wheel_native(SkCanvas * canvas)85*c8dee2aaSAndroid Build Coastguard Worker static void color_wheel_native(SkCanvas* canvas) {
86*c8dee2aaSAndroid Build Coastguard Worker SkAutoCanvasRestore autoCanvasRestore(canvas, true);
87*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0.5f * SCALE, 0.5f * SCALE);
88*c8dee2aaSAndroid Build Coastguard Worker canvas->drawCircle(0.0f, 0.0f, SCALE * 0.5f, SkPaint(SkColors::kWhite));
89*c8dee2aaSAndroid Build Coastguard Worker
90*c8dee2aaSAndroid Build Coastguard Worker const double sqrt_3_over_2 = 0.8660254037844387;
91*c8dee2aaSAndroid Build Coastguard Worker const SkScalar Z = 0.0f;
92*c8dee2aaSAndroid Build Coastguard Worker const SkScalar D = 0.3f * SkIntToScalar(SCALE);
93*c8dee2aaSAndroid Build Coastguard Worker const SkScalar X = SkDoubleToScalar(D * sqrt_3_over_2);
94*c8dee2aaSAndroid Build Coastguard Worker const SkScalar Y = D * SK_ScalarHalf;
95*c8dee2aaSAndroid Build Coastguard Worker
96*c8dee2aaSAndroid Build Coastguard Worker SkFont font;
97*c8dee2aaSAndroid Build Coastguard Worker font.setEdging(SkFont::Edging::kAlias);
98*c8dee2aaSAndroid Build Coastguard Worker font.setTypeface(ToolUtils::CreatePortableTypeface("Sans", SkFontStyle::Bold()));
99*c8dee2aaSAndroid Build Coastguard Worker font.setSize(0.28125f * SCALE);
100*c8dee2aaSAndroid Build Coastguard Worker draw_center_letter('K', font, SK_ColorBLACK, Z, Z, canvas);
101*c8dee2aaSAndroid Build Coastguard Worker draw_center_letter('R', font, SK_ColorRED, Z, D, canvas);
102*c8dee2aaSAndroid Build Coastguard Worker draw_center_letter('G', font, SK_ColorGREEN, -X, -Y, canvas);
103*c8dee2aaSAndroid Build Coastguard Worker draw_center_letter('B', font, SK_ColorBLUE, X, -Y, canvas);
104*c8dee2aaSAndroid Build Coastguard Worker draw_center_letter('C', font, SK_ColorCYAN, Z, -D, canvas);
105*c8dee2aaSAndroid Build Coastguard Worker draw_center_letter('M', font, SK_ColorMAGENTA, X, Y, canvas);
106*c8dee2aaSAndroid Build Coastguard Worker draw_center_letter('Y', font, SK_ColorYELLOW, -X, Y, canvas);
107*c8dee2aaSAndroid Build Coastguard Worker }
108*c8dee2aaSAndroid Build Coastguard Worker
109*c8dee2aaSAndroid Build Coastguard Worker template <typename T>
find(T * array,int N,T item)110*c8dee2aaSAndroid Build Coastguard Worker int find(T* array, int N, T item) {
111*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < N; ++i) {
112*c8dee2aaSAndroid Build Coastguard Worker if (array[i] == item) {
113*c8dee2aaSAndroid Build Coastguard Worker return i;
114*c8dee2aaSAndroid Build Coastguard Worker }
115*c8dee2aaSAndroid Build Coastguard Worker }
116*c8dee2aaSAndroid Build Coastguard Worker return -1;
117*c8dee2aaSAndroid Build Coastguard Worker }
118*c8dee2aaSAndroid Build Coastguard Worker
draw(SkCanvas * canvas,const SkPaint & p,const SkFont & font,const SkBitmap & src,SkColorType colorType,const char text[])119*c8dee2aaSAndroid Build Coastguard Worker static void draw(SkCanvas* canvas,
120*c8dee2aaSAndroid Build Coastguard Worker const SkPaint& p,
121*c8dee2aaSAndroid Build Coastguard Worker const SkFont& font,
122*c8dee2aaSAndroid Build Coastguard Worker const SkBitmap& src,
123*c8dee2aaSAndroid Build Coastguard Worker SkColorType colorType,
124*c8dee2aaSAndroid Build Coastguard Worker const char text[]) {
125*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(src.colorType() == colorType);
126*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(src.asImage(), 0.0f, 0.0f);
127*c8dee2aaSAndroid Build Coastguard Worker canvas->drawSimpleText(text, strlen(text), SkTextEncoding::kUTF8, 0.0f, 12.0f, font, p);
128*c8dee2aaSAndroid Build Coastguard Worker }
129*c8dee2aaSAndroid Build Coastguard Worker
130*c8dee2aaSAndroid Build Coastguard Worker DEF_SIMPLE_GM(all_bitmap_configs, canvas, SCALE, 6 * SCALE) {
131*c8dee2aaSAndroid Build Coastguard Worker SkAutoCanvasRestore autoCanvasRestore(canvas, true);
132*c8dee2aaSAndroid Build Coastguard Worker SkPaint p(SkColors::kBlack);
133*c8dee2aaSAndroid Build Coastguard Worker p.setAntiAlias(true);
134*c8dee2aaSAndroid Build Coastguard Worker
135*c8dee2aaSAndroid Build Coastguard Worker SkFont font = ToolUtils::DefaultPortableFont();
136*c8dee2aaSAndroid Build Coastguard Worker
137*c8dee2aaSAndroid Build Coastguard Worker ToolUtils::draw_checkerboard(canvas, SK_ColorLTGRAY, SK_ColorWHITE, 8);
138*c8dee2aaSAndroid Build Coastguard Worker
139*c8dee2aaSAndroid Build Coastguard Worker SkBitmap bitmap;
140*c8dee2aaSAndroid Build Coastguard Worker if (ToolUtils::GetResourceAsBitmap("images/color_wheel.png", &bitmap)) {
141*c8dee2aaSAndroid Build Coastguard Worker bitmap.setImmutable();
142*c8dee2aaSAndroid Build Coastguard Worker draw(canvas, p, font, bitmap, kN32_SkColorType, "Native 32");
143*c8dee2aaSAndroid Build Coastguard Worker
144*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0.0f, SkIntToScalar(SCALE));
145*c8dee2aaSAndroid Build Coastguard Worker SkBitmap copy565 = copy_bitmap(bitmap, kRGB_565_SkColorType);
146*c8dee2aaSAndroid Build Coastguard Worker p.setColor(SK_ColorRED);
147*c8dee2aaSAndroid Build Coastguard Worker draw(canvas, p, font, copy565, kRGB_565_SkColorType, "RGB 565");
148*c8dee2aaSAndroid Build Coastguard Worker p.setColor(SK_ColorBLACK);
149*c8dee2aaSAndroid Build Coastguard Worker
150*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0.0f, SkIntToScalar(SCALE));
151*c8dee2aaSAndroid Build Coastguard Worker SkBitmap copy4444 = copy_bitmap(bitmap, kARGB_4444_SkColorType);
152*c8dee2aaSAndroid Build Coastguard Worker draw(canvas, p, font, copy4444, kARGB_4444_SkColorType, "ARGB 4444");
153*c8dee2aaSAndroid Build Coastguard Worker
154*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0.0f, SkIntToScalar(SCALE));
155*c8dee2aaSAndroid Build Coastguard Worker SkBitmap copyF16 = copy_bitmap(bitmap, kRGBA_F16_SkColorType);
156*c8dee2aaSAndroid Build Coastguard Worker draw(canvas, p, font, copyF16, kRGBA_F16_SkColorType, "RGBA F16");
157*c8dee2aaSAndroid Build Coastguard Worker
158*c8dee2aaSAndroid Build Coastguard Worker } else {
159*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0.0f, SkIntToScalar(3 * SCALE));
160*c8dee2aaSAndroid Build Coastguard Worker }
161*c8dee2aaSAndroid Build Coastguard Worker
162*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0.0f, SkIntToScalar(SCALE));
163*c8dee2aaSAndroid Build Coastguard Worker SkBitmap bitmapA8 = make_bitmap(kAlpha_8_SkColorType);
164*c8dee2aaSAndroid Build Coastguard Worker draw(canvas, p, font, bitmapA8, kAlpha_8_SkColorType, "Alpha 8");
165*c8dee2aaSAndroid Build Coastguard Worker
166*c8dee2aaSAndroid Build Coastguard Worker p.setColor(SK_ColorRED);
167*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0.0f, SkIntToScalar(SCALE));
168*c8dee2aaSAndroid Build Coastguard Worker SkBitmap bitmapG8 = make_bitmap(kGray_8_SkColorType);
169*c8dee2aaSAndroid Build Coastguard Worker draw(canvas, p, font, bitmapG8, kGray_8_SkColorType, "Gray 8");
170*c8dee2aaSAndroid Build Coastguard Worker }
171*c8dee2aaSAndroid Build Coastguard Worker
make_not_native32_color_wheel()172*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkImage> make_not_native32_color_wheel() {
173*c8dee2aaSAndroid Build Coastguard Worker SkBitmap n32bitmap, notN32bitmap;
174*c8dee2aaSAndroid Build Coastguard Worker n32bitmap.allocN32Pixels(SCALE, SCALE);
175*c8dee2aaSAndroid Build Coastguard Worker n32bitmap.eraseColor(SK_ColorTRANSPARENT);
176*c8dee2aaSAndroid Build Coastguard Worker SkCanvas n32canvas(n32bitmap);
177*c8dee2aaSAndroid Build Coastguard Worker color_wheel_native(&n32canvas);
178*c8dee2aaSAndroid Build Coastguard Worker #if SK_PMCOLOR_BYTE_ORDER(B,G,R,A)
179*c8dee2aaSAndroid Build Coastguard Worker const SkColorType ct = kRGBA_8888_SkColorType;
180*c8dee2aaSAndroid Build Coastguard Worker #elif SK_PMCOLOR_BYTE_ORDER(R,G,B,A)
181*c8dee2aaSAndroid Build Coastguard Worker const SkColorType ct = kBGRA_8888_SkColorType;
182*c8dee2aaSAndroid Build Coastguard Worker #endif
183*c8dee2aaSAndroid Build Coastguard Worker static_assert(ct != kN32_SkColorType, "BRGA!=RGBA");
184*c8dee2aaSAndroid Build Coastguard Worker SkAssertResult(ToolUtils::copy_to(¬N32bitmap, ct, n32bitmap));
185*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(notN32bitmap.colorType() == ct);
186*c8dee2aaSAndroid Build Coastguard Worker return notN32bitmap.asImage();
187*c8dee2aaSAndroid Build Coastguard Worker }
188*c8dee2aaSAndroid Build Coastguard Worker
DEF_SIMPLE_GM(not_native32_bitmap_config,canvas,SCALE,SCALE)189*c8dee2aaSAndroid Build Coastguard Worker DEF_SIMPLE_GM(not_native32_bitmap_config, canvas, SCALE, SCALE) {
190*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkImage> notN32image(make_not_native32_color_wheel());
191*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(notN32image);
192*c8dee2aaSAndroid Build Coastguard Worker ToolUtils::draw_checkerboard(canvas, SK_ColorLTGRAY, SK_ColorWHITE, 8);
193*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(notN32image.get(), 0.0f, 0.0f);
194*c8dee2aaSAndroid Build Coastguard Worker }
195*c8dee2aaSAndroid Build Coastguard Worker
make_pixel(int x,int y,SkAlphaType alphaType)196*c8dee2aaSAndroid Build Coastguard Worker static uint32_t make_pixel(int x, int y, SkAlphaType alphaType) {
197*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(x >= 0 && x < SCALE);
198*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(y >= 0 && y < SCALE);
199*c8dee2aaSAndroid Build Coastguard Worker
200*c8dee2aaSAndroid Build Coastguard Worker SkScalar R = SCALE / 2.0f;
201*c8dee2aaSAndroid Build Coastguard Worker
202*c8dee2aaSAndroid Build Coastguard Worker uint32_t alpha = 0x00;
203*c8dee2aaSAndroid Build Coastguard Worker
204*c8dee2aaSAndroid Build Coastguard Worker if ((x - R) * (x - R) + (y - R) * (y - R) < R * R) {
205*c8dee2aaSAndroid Build Coastguard Worker alpha = 0xFF;
206*c8dee2aaSAndroid Build Coastguard Worker }
207*c8dee2aaSAndroid Build Coastguard Worker
208*c8dee2aaSAndroid Build Coastguard Worker uint32_t component;
209*c8dee2aaSAndroid Build Coastguard Worker switch (alphaType) {
210*c8dee2aaSAndroid Build Coastguard Worker case kPremul_SkAlphaType:
211*c8dee2aaSAndroid Build Coastguard Worker component = alpha;
212*c8dee2aaSAndroid Build Coastguard Worker break;
213*c8dee2aaSAndroid Build Coastguard Worker case kUnpremul_SkAlphaType:
214*c8dee2aaSAndroid Build Coastguard Worker component = 0xFF;
215*c8dee2aaSAndroid Build Coastguard Worker break;
216*c8dee2aaSAndroid Build Coastguard Worker default:
217*c8dee2aaSAndroid Build Coastguard Worker SK_ABORT("Should not get here - invalid alpha type");
218*c8dee2aaSAndroid Build Coastguard Worker }
219*c8dee2aaSAndroid Build Coastguard Worker return alpha << 24 | component;
220*c8dee2aaSAndroid Build Coastguard Worker }
221*c8dee2aaSAndroid Build Coastguard Worker
make_color_test_bitmap_variant(SkColorType colorType,SkAlphaType alphaType,sk_sp<SkColorSpace> colorSpace,SkBitmap * bm)222*c8dee2aaSAndroid Build Coastguard Worker static void make_color_test_bitmap_variant(
223*c8dee2aaSAndroid Build Coastguard Worker SkColorType colorType,
224*c8dee2aaSAndroid Build Coastguard Worker SkAlphaType alphaType,
225*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace> colorSpace,
226*c8dee2aaSAndroid Build Coastguard Worker SkBitmap* bm)
227*c8dee2aaSAndroid Build Coastguard Worker {
228*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(colorType == kRGBA_8888_SkColorType || colorType == kBGRA_8888_SkColorType);
229*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(alphaType == kPremul_SkAlphaType || alphaType == kUnpremul_SkAlphaType);
230*c8dee2aaSAndroid Build Coastguard Worker bm->allocPixels(
231*c8dee2aaSAndroid Build Coastguard Worker SkImageInfo::Make(SCALE, SCALE, colorType, alphaType, colorSpace));
232*c8dee2aaSAndroid Build Coastguard Worker const SkPixmap& pm = bm->pixmap();
233*c8dee2aaSAndroid Build Coastguard Worker for (int y = 0; y < pm.height(); y++) {
234*c8dee2aaSAndroid Build Coastguard Worker for (int x = 0; x < pm.width(); x++) {
235*c8dee2aaSAndroid Build Coastguard Worker *pm.writable_addr32(x, y) = make_pixel(x, y, alphaType);
236*c8dee2aaSAndroid Build Coastguard Worker }
237*c8dee2aaSAndroid Build Coastguard Worker }
238*c8dee2aaSAndroid Build Coastguard Worker }
239*c8dee2aaSAndroid Build Coastguard Worker
240*c8dee2aaSAndroid Build Coastguard Worker DEF_SIMPLE_GM(all_variants_8888, canvas, 4 * SCALE + 30, 2 * SCALE + 10) {
241*c8dee2aaSAndroid Build Coastguard Worker ToolUtils::draw_checkerboard(canvas, SK_ColorLTGRAY, SK_ColorWHITE, 8);
242*c8dee2aaSAndroid Build Coastguard Worker
243*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace> colorSpaces[] {
244*c8dee2aaSAndroid Build Coastguard Worker SkColorSpace::MakeSRGB(),
245*c8dee2aaSAndroid Build Coastguard Worker nullptr,
246*c8dee2aaSAndroid Build Coastguard Worker };
247*c8dee2aaSAndroid Build Coastguard Worker for (const sk_sp<SkColorSpace>& colorSpace : colorSpaces) {
248*c8dee2aaSAndroid Build Coastguard Worker canvas->save();
249*c8dee2aaSAndroid Build Coastguard Worker for (auto alphaType : {kPremul_SkAlphaType, kUnpremul_SkAlphaType}) {
250*c8dee2aaSAndroid Build Coastguard Worker canvas->save();
251*c8dee2aaSAndroid Build Coastguard Worker for (auto colorType : {kRGBA_8888_SkColorType, kBGRA_8888_SkColorType}) {
252*c8dee2aaSAndroid Build Coastguard Worker SkBitmap bm;
253*c8dee2aaSAndroid Build Coastguard Worker make_color_test_bitmap_variant(colorType, alphaType, colorSpace, &bm);
254*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(bm.asImage(), 0.0f, 0.0f);
255*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(SCALE + 10, 0.0f);
256*c8dee2aaSAndroid Build Coastguard Worker }
257*c8dee2aaSAndroid Build Coastguard Worker canvas->restore();
258*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0.0f, SCALE + 10);
259*c8dee2aaSAndroid Build Coastguard Worker }
260*c8dee2aaSAndroid Build Coastguard Worker canvas->restore();
261*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(2 * (SCALE + 10), 0.0f);
262*c8dee2aaSAndroid Build Coastguard Worker }
263*c8dee2aaSAndroid Build Coastguard Worker }
264