1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2020 Google LLC
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 "include/core/SkTypes.h"
9*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_ENABLE_NDK_IMAGES
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/codec/SkEncodedImageFormat.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkBitmap.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorSpace.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkStream.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/encode/SkJpegEncoder.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/encode/SkPngEncoder.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/encode/SkWebpEncoder.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/ports/SkImageGeneratorNDK.h"
18*c8dee2aaSAndroid Build Coastguard Worker
19*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "tools/Resources.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "tools/ToolUtils.h"
22*c8dee2aaSAndroid Build Coastguard Worker
23*c8dee2aaSAndroid Build Coastguard Worker #include <vector>
24*c8dee2aaSAndroid Build Coastguard Worker
make_generator(const char * path,skiatest::Reporter * r)25*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<SkImageGenerator> make_generator(const char* path, skiatest::Reporter* r) {
26*c8dee2aaSAndroid Build Coastguard Worker auto data = GetResourceAsData(path);
27*c8dee2aaSAndroid Build Coastguard Worker if (data) {
28*c8dee2aaSAndroid Build Coastguard Worker auto gen = SkImageGeneratorNDK::MakeFromEncodedNDK(std::move(data));
29*c8dee2aaSAndroid Build Coastguard Worker if (gen) {
30*c8dee2aaSAndroid Build Coastguard Worker return gen;
31*c8dee2aaSAndroid Build Coastguard Worker }
32*c8dee2aaSAndroid Build Coastguard Worker ERRORF(r, "Failed to create NDK generator from %s\n", path);
33*c8dee2aaSAndroid Build Coastguard Worker } else {
34*c8dee2aaSAndroid Build Coastguard Worker // Silently fail so developers can skip using --resources
35*c8dee2aaSAndroid Build Coastguard Worker }
36*c8dee2aaSAndroid Build Coastguard Worker return nullptr;
37*c8dee2aaSAndroid Build Coastguard Worker }
38*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(NdkDecode,r)39*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(NdkDecode, r) {
40*c8dee2aaSAndroid Build Coastguard Worker static const struct {
41*c8dee2aaSAndroid Build Coastguard Worker const char* fPath;
42*c8dee2aaSAndroid Build Coastguard Worker SkISize fSize;
43*c8dee2aaSAndroid Build Coastguard Worker } recs[] = {
44*c8dee2aaSAndroid Build Coastguard Worker {"images/CMYK.jpg", {642, 516}},
45*c8dee2aaSAndroid Build Coastguard Worker {"images/arrow.png", {187, 312}},
46*c8dee2aaSAndroid Build Coastguard Worker {"images/baby_tux.webp", {386, 395}},
47*c8dee2aaSAndroid Build Coastguard Worker {"images/color_wheel.gif", {128, 128}},
48*c8dee2aaSAndroid Build Coastguard Worker {"images/rle.bmp", {320, 240}},
49*c8dee2aaSAndroid Build Coastguard Worker {"images/color_wheel.ico", {128, 128}},
50*c8dee2aaSAndroid Build Coastguard Worker {"images/google_chrome.ico", {256, 256}},
51*c8dee2aaSAndroid Build Coastguard Worker {"images/mandrill.wbmp", {512, 512}},
52*c8dee2aaSAndroid Build Coastguard Worker };
53*c8dee2aaSAndroid Build Coastguard Worker for (auto& rec : recs) {
54*c8dee2aaSAndroid Build Coastguard Worker auto gen = make_generator(rec.fPath, r);
55*c8dee2aaSAndroid Build Coastguard Worker if (!gen) continue;
56*c8dee2aaSAndroid Build Coastguard Worker
57*c8dee2aaSAndroid Build Coastguard Worker const auto& info = gen->getInfo();
58*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, info.dimensions() == rec.fSize);
59*c8dee2aaSAndroid Build Coastguard Worker
60*c8dee2aaSAndroid Build Coastguard Worker SkBitmap bm;
61*c8dee2aaSAndroid Build Coastguard Worker bm.allocPixels(info);
62*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, gen->getPixels(bm.pixmap()));
63*c8dee2aaSAndroid Build Coastguard Worker
64*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, info.alphaType() != kUnpremul_SkAlphaType);
65*c8dee2aaSAndroid Build Coastguard Worker auto unpremulInfo = info.makeAlphaType(kUnpremul_SkAlphaType);
66*c8dee2aaSAndroid Build Coastguard Worker bm.allocPixels(unpremulInfo);
67*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, gen->getPixels(bm.pixmap()));
68*c8dee2aaSAndroid Build Coastguard Worker }
69*c8dee2aaSAndroid Build Coastguard Worker }
70*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(NdkDecode_nullData,r)71*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(NdkDecode_nullData, r) {
72*c8dee2aaSAndroid Build Coastguard Worker auto gen = SkImageGeneratorNDK::MakeFromEncodedNDK(nullptr);
73*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, !gen);
74*c8dee2aaSAndroid Build Coastguard Worker }
75*c8dee2aaSAndroid Build Coastguard Worker
76*c8dee2aaSAndroid Build Coastguard Worker static constexpr skcms_TransferFunction k2Dot6 = {2.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
77*c8dee2aaSAndroid Build Coastguard Worker
78*c8dee2aaSAndroid Build Coastguard Worker static constexpr skcms_Matrix3x3 kDCIP3 = {{
79*c8dee2aaSAndroid Build Coastguard Worker {0.486143, 0.323835, 0.154234},
80*c8dee2aaSAndroid Build Coastguard Worker {0.226676, 0.710327, 0.0629966},
81*c8dee2aaSAndroid Build Coastguard Worker {0.000800549, 0.0432385, 0.78275},
82*c8dee2aaSAndroid Build Coastguard Worker }};
83*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(NdkDecode_reportedColorSpace,r)84*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(NdkDecode_reportedColorSpace, r) {
85*c8dee2aaSAndroid Build Coastguard Worker for (sk_sp<SkColorSpace> cs : {
86*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace>(nullptr),
87*c8dee2aaSAndroid Build Coastguard Worker SkColorSpace::MakeSRGB(),
88*c8dee2aaSAndroid Build Coastguard Worker SkColorSpace::MakeSRGBLinear(),
89*c8dee2aaSAndroid Build Coastguard Worker SkColorSpace::MakeRGB(SkNamedTransferFn::kRec2020, SkNamedGamut::kSRGB),
90*c8dee2aaSAndroid Build Coastguard Worker SkColorSpace::MakeRGB(SkNamedTransferFn::kRec2020, SkNamedGamut::kRec2020),
91*c8dee2aaSAndroid Build Coastguard Worker SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB, SkNamedGamut::kDisplayP3),
92*c8dee2aaSAndroid Build Coastguard Worker SkColorSpace::MakeRGB(SkNamedTransferFn::k2Dot2, SkNamedGamut::kAdobeRGB),
93*c8dee2aaSAndroid Build Coastguard Worker SkColorSpace::MakeRGB(k2Dot6, kDCIP3),
94*c8dee2aaSAndroid Build Coastguard Worker }) {
95*c8dee2aaSAndroid Build Coastguard Worker SkBitmap bm;
96*c8dee2aaSAndroid Build Coastguard Worker bm.allocPixels(SkImageInfo::Make(10, 10, kRGBA_F16_SkColorType, kOpaque_SkAlphaType, cs));
97*c8dee2aaSAndroid Build Coastguard Worker bm.eraseColor(SK_ColorBLUE);
98*c8dee2aaSAndroid Build Coastguard Worker
99*c8dee2aaSAndroid Build Coastguard Worker for (auto format : { SkEncodedImageFormat::kPNG,
100*c8dee2aaSAndroid Build Coastguard Worker SkEncodedImageFormat::kJPEG,
101*c8dee2aaSAndroid Build Coastguard Worker SkEncodedImageFormat::kWEBP }) {
102*c8dee2aaSAndroid Build Coastguard Worker SkDynamicMemoryWStream stream;
103*c8dee2aaSAndroid Build Coastguard Worker if (format == SkEncodedImageFormat::kJPEG) {
104*c8dee2aaSAndroid Build Coastguard Worker SkJpegEncoder::Options opts;
105*c8dee2aaSAndroid Build Coastguard Worker opts.fQuality = 80;
106*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, SkJpegEncoder::Encode(&stream, bm.pixmap(), opts));
107*c8dee2aaSAndroid Build Coastguard Worker } else if (format == SkEncodedImageFormat::kPNG) {
108*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, SkPngEncoder::Encode(&stream, bm.pixmap(), {}));
109*c8dee2aaSAndroid Build Coastguard Worker } else {
110*c8dee2aaSAndroid Build Coastguard Worker SkWebpEncoder::Options opts;
111*c8dee2aaSAndroid Build Coastguard Worker opts.fQuality = 80;
112*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, SkWebpEncoder::Encode(&stream, bm.pixmap(), opts));
113*c8dee2aaSAndroid Build Coastguard Worker }
114*c8dee2aaSAndroid Build Coastguard Worker
115*c8dee2aaSAndroid Build Coastguard Worker auto gen = SkImageGeneratorNDK::MakeFromEncodedNDK(stream.detachAsData());
116*c8dee2aaSAndroid Build Coastguard Worker if (!gen) {
117*c8dee2aaSAndroid Build Coastguard Worker ERRORF(r, "Failed to encode!");
118*c8dee2aaSAndroid Build Coastguard Worker return;
119*c8dee2aaSAndroid Build Coastguard Worker }
120*c8dee2aaSAndroid Build Coastguard Worker
121*c8dee2aaSAndroid Build Coastguard Worker if (!cs) cs = SkColorSpace::MakeSRGB();
122*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, SkColorSpace::Equals(gen->getInfo().colorSpace(), cs.get()));
123*c8dee2aaSAndroid Build Coastguard Worker }
124*c8dee2aaSAndroid Build Coastguard Worker }
125*c8dee2aaSAndroid Build Coastguard Worker }
126*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(NdkDecode_ColorSpace,r)127*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(NdkDecode_ColorSpace, r) {
128*c8dee2aaSAndroid Build Coastguard Worker for (const char* path: {
129*c8dee2aaSAndroid Build Coastguard Worker "images/CMYK.jpg",
130*c8dee2aaSAndroid Build Coastguard Worker "images/arrow.png",
131*c8dee2aaSAndroid Build Coastguard Worker "images/baby_tux.webp",
132*c8dee2aaSAndroid Build Coastguard Worker "images/color_wheel.gif",
133*c8dee2aaSAndroid Build Coastguard Worker "images/rle.bmp",
134*c8dee2aaSAndroid Build Coastguard Worker "images/color_wheel.ico",
135*c8dee2aaSAndroid Build Coastguard Worker "images/google_chrome.ico",
136*c8dee2aaSAndroid Build Coastguard Worker "images/mandrill.wbmp",
137*c8dee2aaSAndroid Build Coastguard Worker }) {
138*c8dee2aaSAndroid Build Coastguard Worker auto gen = make_generator(path, r);
139*c8dee2aaSAndroid Build Coastguard Worker if (!gen) continue;
140*c8dee2aaSAndroid Build Coastguard Worker
141*c8dee2aaSAndroid Build Coastguard Worker for (sk_sp<SkColorSpace> cs : {
142*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace>(nullptr),
143*c8dee2aaSAndroid Build Coastguard Worker SkColorSpace::MakeSRGB(),
144*c8dee2aaSAndroid Build Coastguard Worker SkColorSpace::MakeSRGBLinear(),
145*c8dee2aaSAndroid Build Coastguard Worker SkColorSpace::MakeRGB(SkNamedTransferFn::kRec2020, SkNamedGamut::kSRGB),
146*c8dee2aaSAndroid Build Coastguard Worker SkColorSpace::MakeRGB(SkNamedTransferFn::kRec2020, SkNamedGamut::kRec2020),
147*c8dee2aaSAndroid Build Coastguard Worker SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB, SkNamedGamut::kDisplayP3),
148*c8dee2aaSAndroid Build Coastguard Worker SkColorSpace::MakeRGB(SkNamedTransferFn::k2Dot2, SkNamedGamut::kAdobeRGB),
149*c8dee2aaSAndroid Build Coastguard Worker SkColorSpace::MakeRGB(k2Dot6, kDCIP3),
150*c8dee2aaSAndroid Build Coastguard Worker }) {
151*c8dee2aaSAndroid Build Coastguard Worker auto info = gen->getInfo().makeColorSpace(cs);
152*c8dee2aaSAndroid Build Coastguard Worker
153*c8dee2aaSAndroid Build Coastguard Worker SkBitmap bm;
154*c8dee2aaSAndroid Build Coastguard Worker bm.allocPixels(info);
155*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, gen->getPixels(bm.pixmap()));
156*c8dee2aaSAndroid Build Coastguard Worker }
157*c8dee2aaSAndroid Build Coastguard Worker
158*c8dee2aaSAndroid Build Coastguard Worker std::vector<sk_sp<SkColorSpace>> unsupportedCs;
159*c8dee2aaSAndroid Build Coastguard Worker for (auto gamut : { SkNamedGamut::kSRGB, SkNamedGamut::kAdobeRGB, SkNamedGamut::kDisplayP3,
160*c8dee2aaSAndroid Build Coastguard Worker SkNamedGamut::kRec2020, SkNamedGamut::kXYZ }) {
161*c8dee2aaSAndroid Build Coastguard Worker unsupportedCs.push_back(SkColorSpace::MakeRGB(SkNamedTransferFn::kPQ, gamut));
162*c8dee2aaSAndroid Build Coastguard Worker unsupportedCs.push_back(SkColorSpace::MakeRGB(SkNamedTransferFn::kHLG, gamut));
163*c8dee2aaSAndroid Build Coastguard Worker unsupportedCs.push_back(SkColorSpace::MakeRGB(k2Dot6, gamut));
164*c8dee2aaSAndroid Build Coastguard Worker }
165*c8dee2aaSAndroid Build Coastguard Worker
166*c8dee2aaSAndroid Build Coastguard Worker for (auto gamut : { SkNamedGamut::kSRGB, SkNamedGamut::kDisplayP3,
167*c8dee2aaSAndroid Build Coastguard Worker SkNamedGamut::kRec2020, SkNamedGamut::kXYZ }) {
168*c8dee2aaSAndroid Build Coastguard Worker unsupportedCs.push_back(SkColorSpace::MakeRGB(SkNamedTransferFn::k2Dot2, gamut));
169*c8dee2aaSAndroid Build Coastguard Worker }
170*c8dee2aaSAndroid Build Coastguard Worker
171*c8dee2aaSAndroid Build Coastguard Worker for (auto gamut : { SkNamedGamut::kAdobeRGB, SkNamedGamut::kDisplayP3,
172*c8dee2aaSAndroid Build Coastguard Worker SkNamedGamut::kXYZ }) {
173*c8dee2aaSAndroid Build Coastguard Worker unsupportedCs.push_back(SkColorSpace::MakeRGB(SkNamedTransferFn::kRec2020, gamut));
174*c8dee2aaSAndroid Build Coastguard Worker }
175*c8dee2aaSAndroid Build Coastguard Worker
176*c8dee2aaSAndroid Build Coastguard Worker for (auto gamut : { SkNamedGamut::kAdobeRGB, SkNamedGamut::kDisplayP3,
177*c8dee2aaSAndroid Build Coastguard Worker SkNamedGamut::kRec2020, SkNamedGamut::kXYZ }) {
178*c8dee2aaSAndroid Build Coastguard Worker unsupportedCs.push_back(SkColorSpace::MakeRGB(SkNamedTransferFn::kLinear, gamut));
179*c8dee2aaSAndroid Build Coastguard Worker }
180*c8dee2aaSAndroid Build Coastguard Worker
181*c8dee2aaSAndroid Build Coastguard Worker for (auto gamut : { SkNamedGamut::kAdobeRGB,
182*c8dee2aaSAndroid Build Coastguard Worker SkNamedGamut::kRec2020, SkNamedGamut::kXYZ }) {
183*c8dee2aaSAndroid Build Coastguard Worker unsupportedCs.push_back(SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB, gamut));
184*c8dee2aaSAndroid Build Coastguard Worker }
185*c8dee2aaSAndroid Build Coastguard Worker
186*c8dee2aaSAndroid Build Coastguard Worker for (auto fn : { SkNamedTransferFn::kSRGB, SkNamedTransferFn::k2Dot2,
187*c8dee2aaSAndroid Build Coastguard Worker SkNamedTransferFn::kLinear, SkNamedTransferFn::kRec2020 }) {
188*c8dee2aaSAndroid Build Coastguard Worker unsupportedCs.push_back(SkColorSpace::MakeRGB(fn, kDCIP3));
189*c8dee2aaSAndroid Build Coastguard Worker }
190*c8dee2aaSAndroid Build Coastguard Worker
191*c8dee2aaSAndroid Build Coastguard Worker for (auto unsupported : unsupportedCs) {
192*c8dee2aaSAndroid Build Coastguard Worker auto info = gen->getInfo().makeColorSpace(unsupported);
193*c8dee2aaSAndroid Build Coastguard Worker
194*c8dee2aaSAndroid Build Coastguard Worker SkBitmap bm;
195*c8dee2aaSAndroid Build Coastguard Worker bm.allocPixels(info);
196*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, !gen->getPixels(bm.pixmap()));
197*c8dee2aaSAndroid Build Coastguard Worker }
198*c8dee2aaSAndroid Build Coastguard Worker }
199*c8dee2aaSAndroid Build Coastguard Worker }
200*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(NdkDecode_reuseNoColorSpace,r)201*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(NdkDecode_reuseNoColorSpace, r) {
202*c8dee2aaSAndroid Build Coastguard Worker static const struct {
203*c8dee2aaSAndroid Build Coastguard Worker const char* fPath;
204*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkColorSpace> fCorrectedColorSpace;
205*c8dee2aaSAndroid Build Coastguard Worker bool fIsOpaque;
206*c8dee2aaSAndroid Build Coastguard Worker } recs[] = {
207*c8dee2aaSAndroid Build Coastguard Worker // AImageDecoder defaults to ADATASPACE_UNKNOWN for this image.
208*c8dee2aaSAndroid Build Coastguard Worker {"images/wide_gamut_yellow_224_224_64.jpeg", SkColorSpace::MakeSRGB(), true},
209*c8dee2aaSAndroid Build Coastguard Worker // This image is SRGB, so convert to a different color space.
210*c8dee2aaSAndroid Build Coastguard Worker {"images/example_1.png", SkColorSpace::MakeRGB(SkNamedTransferFn::k2Dot2,
211*c8dee2aaSAndroid Build Coastguard Worker SkNamedGamut::kAdobeRGB), false},
212*c8dee2aaSAndroid Build Coastguard Worker };
213*c8dee2aaSAndroid Build Coastguard Worker for (auto& rec : recs) {
214*c8dee2aaSAndroid Build Coastguard Worker auto gen = make_generator(rec.fPath, r);
215*c8dee2aaSAndroid Build Coastguard Worker if (!gen) continue;
216*c8dee2aaSAndroid Build Coastguard Worker
217*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, gen->getInfo().colorSpace()->isSRGB());
218*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, gen->getInfo().isOpaque() == rec.fIsOpaque);
219*c8dee2aaSAndroid Build Coastguard Worker
220*c8dee2aaSAndroid Build Coastguard Worker auto noColorCorrection = gen->getInfo().makeColorSpace(nullptr);
221*c8dee2aaSAndroid Build Coastguard Worker if (rec.fIsOpaque) {
222*c8dee2aaSAndroid Build Coastguard Worker // Use something other than the default color type to verify that the modified color
223*c8dee2aaSAndroid Build Coastguard Worker // type is used even when the color space is reset.
224*c8dee2aaSAndroid Build Coastguard Worker noColorCorrection = noColorCorrection.makeColorType(kRGB_565_SkColorType);
225*c8dee2aaSAndroid Build Coastguard Worker }
226*c8dee2aaSAndroid Build Coastguard Worker
227*c8dee2aaSAndroid Build Coastguard Worker SkBitmap orig;
228*c8dee2aaSAndroid Build Coastguard Worker orig.allocPixels(noColorCorrection);
229*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, gen->getPixels(orig.pixmap()));
230*c8dee2aaSAndroid Build Coastguard Worker
231*c8dee2aaSAndroid Build Coastguard Worker SkBitmap corrected;
232*c8dee2aaSAndroid Build Coastguard Worker corrected.allocPixels(noColorCorrection.makeColorSpace(rec.fCorrectedColorSpace));
233*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, gen->getPixels(corrected.pixmap()));
234*c8dee2aaSAndroid Build Coastguard Worker
235*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, !ToolUtils::equal_pixels(orig, corrected));
236*c8dee2aaSAndroid Build Coastguard Worker
237*c8dee2aaSAndroid Build Coastguard Worker SkBitmap reuse;
238*c8dee2aaSAndroid Build Coastguard Worker reuse.allocPixels(noColorCorrection);
239*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, gen->getPixels(reuse.pixmap()));
240*c8dee2aaSAndroid Build Coastguard Worker
241*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, ToolUtils::equal_pixels(orig, reuse));
242*c8dee2aaSAndroid Build Coastguard Worker }
243*c8dee2aaSAndroid Build Coastguard Worker }
244*c8dee2aaSAndroid Build Coastguard Worker
245*c8dee2aaSAndroid Build Coastguard Worker // The NDK supports scaling up to arbitrary dimensions. Skia forces clients to do this in a
246*c8dee2aaSAndroid Build Coastguard Worker // separate step, so the client is in charge of how to do the upscale.
DEF_TEST(NdkDecode_noUpscale,r)247*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(NdkDecode_noUpscale, r) {
248*c8dee2aaSAndroid Build Coastguard Worker for (const char* path: {
249*c8dee2aaSAndroid Build Coastguard Worker "images/CMYK.jpg",
250*c8dee2aaSAndroid Build Coastguard Worker "images/arrow.png",
251*c8dee2aaSAndroid Build Coastguard Worker "images/baby_tux.webp",
252*c8dee2aaSAndroid Build Coastguard Worker "images/color_wheel.gif",
253*c8dee2aaSAndroid Build Coastguard Worker "images/rle.bmp",
254*c8dee2aaSAndroid Build Coastguard Worker "images/color_wheel.ico",
255*c8dee2aaSAndroid Build Coastguard Worker "images/google_chrome.ico",
256*c8dee2aaSAndroid Build Coastguard Worker "images/mandrill.wbmp",
257*c8dee2aaSAndroid Build Coastguard Worker }) {
258*c8dee2aaSAndroid Build Coastguard Worker auto gen = make_generator(path, r);
259*c8dee2aaSAndroid Build Coastguard Worker if (!gen) continue;
260*c8dee2aaSAndroid Build Coastguard Worker
261*c8dee2aaSAndroid Build Coastguard Worker const auto actualDimensions = gen->getInfo().dimensions();
262*c8dee2aaSAndroid Build Coastguard Worker const int width = actualDimensions.width();
263*c8dee2aaSAndroid Build Coastguard Worker const int height = actualDimensions.height();
264*c8dee2aaSAndroid Build Coastguard Worker for (SkISize dims : {
265*c8dee2aaSAndroid Build Coastguard Worker SkISize{width*2, height*2},
266*c8dee2aaSAndroid Build Coastguard Worker SkISize{width + 1, height + 1},
267*c8dee2aaSAndroid Build Coastguard Worker }) {
268*c8dee2aaSAndroid Build Coastguard Worker auto info = gen->getInfo().makeDimensions(dims);
269*c8dee2aaSAndroid Build Coastguard Worker SkBitmap bm;
270*c8dee2aaSAndroid Build Coastguard Worker bm.allocPixels(info);
271*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, !gen->getPixels(bm.pixmap()));
272*c8dee2aaSAndroid Build Coastguard Worker }
273*c8dee2aaSAndroid Build Coastguard Worker }
274*c8dee2aaSAndroid Build Coastguard Worker }
275*c8dee2aaSAndroid Build Coastguard Worker
276*c8dee2aaSAndroid Build Coastguard Worker // libwebp supports downscaling to an arbitrary scale factor, and this is supported by the NDK.
DEF_TEST(NdkDecode_webpArbitraryDownscale,r)277*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(NdkDecode_webpArbitraryDownscale, r) {
278*c8dee2aaSAndroid Build Coastguard Worker for (const char* path: {
279*c8dee2aaSAndroid Build Coastguard Worker "images/baby_tux.webp",
280*c8dee2aaSAndroid Build Coastguard Worker "images/yellow_rose.webp",
281*c8dee2aaSAndroid Build Coastguard Worker "images/webp-color-profile-lossless.webp",
282*c8dee2aaSAndroid Build Coastguard Worker }) {
283*c8dee2aaSAndroid Build Coastguard Worker auto gen = make_generator(path, r);
284*c8dee2aaSAndroid Build Coastguard Worker if (!gen) continue;
285*c8dee2aaSAndroid Build Coastguard Worker
286*c8dee2aaSAndroid Build Coastguard Worker const auto actualDimensions = gen->getInfo().dimensions();
287*c8dee2aaSAndroid Build Coastguard Worker const int width = actualDimensions.width();
288*c8dee2aaSAndroid Build Coastguard Worker const int height = actualDimensions.height();
289*c8dee2aaSAndroid Build Coastguard Worker for (SkISize dims : {
290*c8dee2aaSAndroid Build Coastguard Worker SkISize{width/2, height/2},
291*c8dee2aaSAndroid Build Coastguard Worker SkISize{width/4, height/4},
292*c8dee2aaSAndroid Build Coastguard Worker SkISize{width/7, height/7},
293*c8dee2aaSAndroid Build Coastguard Worker SkISize{width - 1, height - 1},
294*c8dee2aaSAndroid Build Coastguard Worker SkISize{1, 1},
295*c8dee2aaSAndroid Build Coastguard Worker SkISize{5, 20}
296*c8dee2aaSAndroid Build Coastguard Worker }) {
297*c8dee2aaSAndroid Build Coastguard Worker auto info = gen->getInfo().makeDimensions(dims);
298*c8dee2aaSAndroid Build Coastguard Worker SkBitmap bm;
299*c8dee2aaSAndroid Build Coastguard Worker bm.allocPixels(info);
300*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, gen->getPixels(bm.pixmap()));
301*c8dee2aaSAndroid Build Coastguard Worker
302*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, info.alphaType() != kUnpremul_SkAlphaType);
303*c8dee2aaSAndroid Build Coastguard Worker auto unpremulInfo = info.makeAlphaType(kUnpremul_SkAlphaType);
304*c8dee2aaSAndroid Build Coastguard Worker bm.allocPixels(unpremulInfo);
305*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, gen->getPixels(bm.pixmap()));
306*c8dee2aaSAndroid Build Coastguard Worker }
307*c8dee2aaSAndroid Build Coastguard Worker }
308*c8dee2aaSAndroid Build Coastguard Worker }
309*c8dee2aaSAndroid Build Coastguard Worker
310*c8dee2aaSAndroid Build Coastguard Worker // libjpeg-turbo supports downscaling to some scale factors.
DEF_TEST(NdkDecode_jpegDownscale,r)311*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(NdkDecode_jpegDownscale, r) {
312*c8dee2aaSAndroid Build Coastguard Worker static const struct {
313*c8dee2aaSAndroid Build Coastguard Worker const char* fPath;
314*c8dee2aaSAndroid Build Coastguard Worker SkISize fSupportedSizes[4];
315*c8dee2aaSAndroid Build Coastguard Worker } recs[] = {
316*c8dee2aaSAndroid Build Coastguard Worker {"images/CMYK.jpg", {{642,516},{321,258},{161,129},{81,65}}},
317*c8dee2aaSAndroid Build Coastguard Worker {"images/dog.jpg", {{180,180},{90,90},{45,45},{23,23}}},
318*c8dee2aaSAndroid Build Coastguard Worker {"images/grayscale.jpg", {{128,128},{64,64},{32,32},{16,16}}},
319*c8dee2aaSAndroid Build Coastguard Worker {"images/brickwork-texture.jpg", {{512,512},{256,256},{128,128},{64,64}}},
320*c8dee2aaSAndroid Build Coastguard Worker {"images/mandrill_h2v1.jpg", {{512,512},{256,256},{128,128},{64,64}}},
321*c8dee2aaSAndroid Build Coastguard Worker {"images/ducky.jpg", {{489,537},{245,269},{123,135},{62,68}}},
322*c8dee2aaSAndroid Build Coastguard Worker };
323*c8dee2aaSAndroid Build Coastguard Worker for (auto& rec : recs) {
324*c8dee2aaSAndroid Build Coastguard Worker auto gen = make_generator(rec.fPath, r);
325*c8dee2aaSAndroid Build Coastguard Worker if (!gen) continue;
326*c8dee2aaSAndroid Build Coastguard Worker
327*c8dee2aaSAndroid Build Coastguard Worker for (SkISize dims : rec.fSupportedSizes) {
328*c8dee2aaSAndroid Build Coastguard Worker auto info = gen->getInfo().makeDimensions(dims);
329*c8dee2aaSAndroid Build Coastguard Worker SkBitmap bm;
330*c8dee2aaSAndroid Build Coastguard Worker bm.allocPixels(info);
331*c8dee2aaSAndroid Build Coastguard Worker if (!gen->getPixels(bm.pixmap())) {
332*c8dee2aaSAndroid Build Coastguard Worker ERRORF(r, "failed to decode %s to {%i,%i}\n", rec.fPath, dims.width(),
333*c8dee2aaSAndroid Build Coastguard Worker dims.height());
334*c8dee2aaSAndroid Build Coastguard Worker }
335*c8dee2aaSAndroid Build Coastguard Worker
336*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, info.alphaType() != kUnpremul_SkAlphaType);
337*c8dee2aaSAndroid Build Coastguard Worker auto unpremulInfo = info.makeAlphaType(kUnpremul_SkAlphaType);
338*c8dee2aaSAndroid Build Coastguard Worker bm.allocPixels(unpremulInfo);
339*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, gen->getPixels(bm.pixmap()));
340*c8dee2aaSAndroid Build Coastguard Worker }
341*c8dee2aaSAndroid Build Coastguard Worker }
342*c8dee2aaSAndroid Build Coastguard Worker }
343*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(NdkDecode_reuseJpeg,r)344*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(NdkDecode_reuseJpeg, r) {
345*c8dee2aaSAndroid Build Coastguard Worker auto gen = make_generator("images/CMYK.jpg", r);
346*c8dee2aaSAndroid Build Coastguard Worker if (!gen) return;
347*c8dee2aaSAndroid Build Coastguard Worker
348*c8dee2aaSAndroid Build Coastguard Worker SkImageInfo info = gen->getInfo();
349*c8dee2aaSAndroid Build Coastguard Worker SkBitmap orig;
350*c8dee2aaSAndroid Build Coastguard Worker orig.allocPixels(info);
351*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, gen->getPixels(orig.pixmap()));
352*c8dee2aaSAndroid Build Coastguard Worker
353*c8dee2aaSAndroid Build Coastguard Worker info = info.makeWH(321, 258);
354*c8dee2aaSAndroid Build Coastguard Worker SkBitmap downscaled;
355*c8dee2aaSAndroid Build Coastguard Worker downscaled.allocPixels(info);
356*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, gen->getPixels(downscaled.pixmap()));
357*c8dee2aaSAndroid Build Coastguard Worker
358*c8dee2aaSAndroid Build Coastguard Worker SkBitmap reuse;
359*c8dee2aaSAndroid Build Coastguard Worker reuse.allocPixels(gen->getInfo());
360*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, gen->getPixels(reuse.pixmap()));
361*c8dee2aaSAndroid Build Coastguard Worker
362*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, ToolUtils::equal_pixels(orig, reuse));
363*c8dee2aaSAndroid Build Coastguard Worker }
364*c8dee2aaSAndroid Build Coastguard Worker
365*c8dee2aaSAndroid Build Coastguard Worker // The NDK supports scaling down to arbitrary dimensions. Skia forces clients to do this in a
366*c8dee2aaSAndroid Build Coastguard Worker // separate step, so the client is in charge of how to do the downscale.
DEF_TEST(NdkDecode_noDownscale,r)367*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(NdkDecode_noDownscale, r) {
368*c8dee2aaSAndroid Build Coastguard Worker for (const char* path: {
369*c8dee2aaSAndroid Build Coastguard Worker "images/arrow.png",
370*c8dee2aaSAndroid Build Coastguard Worker "images/color_wheel.gif",
371*c8dee2aaSAndroid Build Coastguard Worker "images/rle.bmp",
372*c8dee2aaSAndroid Build Coastguard Worker "images/color_wheel.ico",
373*c8dee2aaSAndroid Build Coastguard Worker "images/google_chrome.ico",
374*c8dee2aaSAndroid Build Coastguard Worker "images/mandrill.wbmp",
375*c8dee2aaSAndroid Build Coastguard Worker }) {
376*c8dee2aaSAndroid Build Coastguard Worker auto gen = make_generator(path, r);
377*c8dee2aaSAndroid Build Coastguard Worker if (!gen) continue;
378*c8dee2aaSAndroid Build Coastguard Worker
379*c8dee2aaSAndroid Build Coastguard Worker const auto actualDimensions = gen->getInfo().dimensions();
380*c8dee2aaSAndroid Build Coastguard Worker const int width = actualDimensions.width();
381*c8dee2aaSAndroid Build Coastguard Worker const int height = actualDimensions.height();
382*c8dee2aaSAndroid Build Coastguard Worker for (SkISize dims : {
383*c8dee2aaSAndroid Build Coastguard Worker SkISize{width/2, height/2},
384*c8dee2aaSAndroid Build Coastguard Worker SkISize{width/3, height/3},
385*c8dee2aaSAndroid Build Coastguard Worker SkISize{width/4, height/4},
386*c8dee2aaSAndroid Build Coastguard Worker SkISize{width/8, height/8},
387*c8dee2aaSAndroid Build Coastguard Worker SkISize{width - 1, height - 1},
388*c8dee2aaSAndroid Build Coastguard Worker }) {
389*c8dee2aaSAndroid Build Coastguard Worker auto info = gen->getInfo().makeDimensions(dims);
390*c8dee2aaSAndroid Build Coastguard Worker SkBitmap bm;
391*c8dee2aaSAndroid Build Coastguard Worker bm.allocPixels(info);
392*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, !gen->getPixels(bm.pixmap()));
393*c8dee2aaSAndroid Build Coastguard Worker }
394*c8dee2aaSAndroid Build Coastguard Worker }
395*c8dee2aaSAndroid Build Coastguard Worker }
396*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(NdkDecode_Gray8,r)397*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(NdkDecode_Gray8, r) {
398*c8dee2aaSAndroid Build Coastguard Worker static const struct {
399*c8dee2aaSAndroid Build Coastguard Worker const char* fPath;
400*c8dee2aaSAndroid Build Coastguard Worker bool fGrayscale;
401*c8dee2aaSAndroid Build Coastguard Worker } recs[] = {
402*c8dee2aaSAndroid Build Coastguard Worker {"images/CMYK.jpg", false},
403*c8dee2aaSAndroid Build Coastguard Worker {"images/arrow.png", false},
404*c8dee2aaSAndroid Build Coastguard Worker {"images/baby_tux.webp", false},
405*c8dee2aaSAndroid Build Coastguard Worker {"images/color_wheel.gif", false},
406*c8dee2aaSAndroid Build Coastguard Worker {"images/rle.bmp", false},
407*c8dee2aaSAndroid Build Coastguard Worker {"images/color_wheel.ico", false},
408*c8dee2aaSAndroid Build Coastguard Worker {"images/google_chrome.ico", false},
409*c8dee2aaSAndroid Build Coastguard Worker {"images/mandrill.wbmp", true},
410*c8dee2aaSAndroid Build Coastguard Worker {"images/grayscale.jpg", true},
411*c8dee2aaSAndroid Build Coastguard Worker {"images/grayscale.png", true},
412*c8dee2aaSAndroid Build Coastguard Worker };
413*c8dee2aaSAndroid Build Coastguard Worker for (auto& rec : recs) {
414*c8dee2aaSAndroid Build Coastguard Worker auto gen = make_generator(rec.fPath, r);
415*c8dee2aaSAndroid Build Coastguard Worker if (!gen) continue;
416*c8dee2aaSAndroid Build Coastguard Worker
417*c8dee2aaSAndroid Build Coastguard Worker SkImageInfo info = gen->getInfo();
418*c8dee2aaSAndroid Build Coastguard Worker if (rec.fGrayscale) {
419*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, info.colorType() == kGray_8_SkColorType);
420*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, info.alphaType() == kOpaque_SkAlphaType);
421*c8dee2aaSAndroid Build Coastguard Worker } else {
422*c8dee2aaSAndroid Build Coastguard Worker info = info.makeColorType(kGray_8_SkColorType);
423*c8dee2aaSAndroid Build Coastguard Worker }
424*c8dee2aaSAndroid Build Coastguard Worker SkBitmap bm;
425*c8dee2aaSAndroid Build Coastguard Worker bm.allocPixels(info);
426*c8dee2aaSAndroid Build Coastguard Worker bool success = gen->getPixels(bm.pixmap());
427*c8dee2aaSAndroid Build Coastguard Worker if (success != rec.fGrayscale) {
428*c8dee2aaSAndroid Build Coastguard Worker ERRORF(r, "Expected decoding %s to Gray8 to %s. Actual: %s\n", rec.fPath,
429*c8dee2aaSAndroid Build Coastguard Worker (rec.fGrayscale ? "succeed" : "fail"), (success ? "succeed" : "fail"));
430*c8dee2aaSAndroid Build Coastguard Worker }
431*c8dee2aaSAndroid Build Coastguard Worker }
432*c8dee2aaSAndroid Build Coastguard Worker }
433*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(NdkDecode_Opaque_and_565,r)434*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(NdkDecode_Opaque_and_565, r) {
435*c8dee2aaSAndroid Build Coastguard Worker for (const char* path: {
436*c8dee2aaSAndroid Build Coastguard Worker "images/CMYK.jpg",
437*c8dee2aaSAndroid Build Coastguard Worker "images/dog.jpg",
438*c8dee2aaSAndroid Build Coastguard Worker "images/ducky.jpg",
439*c8dee2aaSAndroid Build Coastguard Worker "images/arrow.png",
440*c8dee2aaSAndroid Build Coastguard Worker "images/example_1.png",
441*c8dee2aaSAndroid Build Coastguard Worker "images/explosion_sprites.png",
442*c8dee2aaSAndroid Build Coastguard Worker "images/lut_identity.png",
443*c8dee2aaSAndroid Build Coastguard Worker "images/grayscale.png",
444*c8dee2aaSAndroid Build Coastguard Worker "images/baby_tux.webp",
445*c8dee2aaSAndroid Build Coastguard Worker "images/yellow_rose.webp",
446*c8dee2aaSAndroid Build Coastguard Worker "images/webp-color-profile-lossless.webp",
447*c8dee2aaSAndroid Build Coastguard Worker "images/colorTables.gif",
448*c8dee2aaSAndroid Build Coastguard Worker "images/color_wheel.gif",
449*c8dee2aaSAndroid Build Coastguard Worker "images/flightAnim.gif",
450*c8dee2aaSAndroid Build Coastguard Worker "images/randPixels.gif",
451*c8dee2aaSAndroid Build Coastguard Worker "images/rle.bmp",
452*c8dee2aaSAndroid Build Coastguard Worker "images/color_wheel.ico",
453*c8dee2aaSAndroid Build Coastguard Worker "images/google_chrome.ico",
454*c8dee2aaSAndroid Build Coastguard Worker "images/mandrill.wbmp",
455*c8dee2aaSAndroid Build Coastguard Worker }) {
456*c8dee2aaSAndroid Build Coastguard Worker auto gen = make_generator(path, r);
457*c8dee2aaSAndroid Build Coastguard Worker if (!gen) continue;
458*c8dee2aaSAndroid Build Coastguard Worker
459*c8dee2aaSAndroid Build Coastguard Worker auto info = gen->getInfo().makeAlphaType(kOpaque_SkAlphaType);
460*c8dee2aaSAndroid Build Coastguard Worker SkBitmap bm;
461*c8dee2aaSAndroid Build Coastguard Worker bm.allocPixels(info);
462*c8dee2aaSAndroid Build Coastguard Worker bool success = gen->getPixels(bm.pixmap());
463*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, success == gen->getInfo().isOpaque());
464*c8dee2aaSAndroid Build Coastguard Worker
465*c8dee2aaSAndroid Build Coastguard Worker info = info.makeColorType(kRGB_565_SkColorType);
466*c8dee2aaSAndroid Build Coastguard Worker bm.allocPixels(info);
467*c8dee2aaSAndroid Build Coastguard Worker success = gen->getPixels(bm.pixmap());
468*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, success == gen->getInfo().isOpaque());
469*c8dee2aaSAndroid Build Coastguard Worker }
470*c8dee2aaSAndroid Build Coastguard Worker }
471*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(NdkDecode_AlwaysSupportedColorTypes,r)472*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(NdkDecode_AlwaysSupportedColorTypes, r) {
473*c8dee2aaSAndroid Build Coastguard Worker for (const char* path: {
474*c8dee2aaSAndroid Build Coastguard Worker "images/CMYK.jpg",
475*c8dee2aaSAndroid Build Coastguard Worker "images/dog.jpg",
476*c8dee2aaSAndroid Build Coastguard Worker "images/ducky.jpg",
477*c8dee2aaSAndroid Build Coastguard Worker "images/arrow.png",
478*c8dee2aaSAndroid Build Coastguard Worker "images/example_1.png",
479*c8dee2aaSAndroid Build Coastguard Worker "images/explosion_sprites.png",
480*c8dee2aaSAndroid Build Coastguard Worker "images/lut_identity.png",
481*c8dee2aaSAndroid Build Coastguard Worker "images/grayscale.png",
482*c8dee2aaSAndroid Build Coastguard Worker "images/baby_tux.webp",
483*c8dee2aaSAndroid Build Coastguard Worker "images/yellow_rose.webp",
484*c8dee2aaSAndroid Build Coastguard Worker "images/webp-color-profile-lossless.webp",
485*c8dee2aaSAndroid Build Coastguard Worker "images/colorTables.gif",
486*c8dee2aaSAndroid Build Coastguard Worker "images/color_wheel.gif",
487*c8dee2aaSAndroid Build Coastguard Worker "images/flightAnim.gif",
488*c8dee2aaSAndroid Build Coastguard Worker "images/randPixels.gif",
489*c8dee2aaSAndroid Build Coastguard Worker "images/rle.bmp",
490*c8dee2aaSAndroid Build Coastguard Worker "images/color_wheel.ico",
491*c8dee2aaSAndroid Build Coastguard Worker "images/google_chrome.ico",
492*c8dee2aaSAndroid Build Coastguard Worker "images/mandrill.wbmp",
493*c8dee2aaSAndroid Build Coastguard Worker }) {
494*c8dee2aaSAndroid Build Coastguard Worker auto gen = make_generator(path, r);
495*c8dee2aaSAndroid Build Coastguard Worker if (!gen) continue;
496*c8dee2aaSAndroid Build Coastguard Worker
497*c8dee2aaSAndroid Build Coastguard Worker auto info = gen->getInfo().makeColorType(kRGBA_F16_SkColorType);
498*c8dee2aaSAndroid Build Coastguard Worker SkBitmap bm;
499*c8dee2aaSAndroid Build Coastguard Worker bm.allocPixels(info);
500*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, gen->getPixels(bm.pixmap()));
501*c8dee2aaSAndroid Build Coastguard Worker
502*c8dee2aaSAndroid Build Coastguard Worker // This also tests that we can reuse the same generator for a different
503*c8dee2aaSAndroid Build Coastguard Worker // color type.
504*c8dee2aaSAndroid Build Coastguard Worker info = info.makeColorType(kRGBA_8888_SkColorType);
505*c8dee2aaSAndroid Build Coastguard Worker bm.allocPixels(info);
506*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, gen->getPixels(bm.pixmap()));
507*c8dee2aaSAndroid Build Coastguard Worker }
508*c8dee2aaSAndroid Build Coastguard Worker }
509*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(NdkDecode_UnsupportedColorTypes,r)510*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(NdkDecode_UnsupportedColorTypes, r) {
511*c8dee2aaSAndroid Build Coastguard Worker for (const char* path: {
512*c8dee2aaSAndroid Build Coastguard Worker "images/CMYK.jpg",
513*c8dee2aaSAndroid Build Coastguard Worker "images/dog.jpg",
514*c8dee2aaSAndroid Build Coastguard Worker "images/ducky.jpg",
515*c8dee2aaSAndroid Build Coastguard Worker "images/arrow.png",
516*c8dee2aaSAndroid Build Coastguard Worker "images/example_1.png",
517*c8dee2aaSAndroid Build Coastguard Worker "images/explosion_sprites.png",
518*c8dee2aaSAndroid Build Coastguard Worker "images/lut_identity.png",
519*c8dee2aaSAndroid Build Coastguard Worker "images/grayscale.png",
520*c8dee2aaSAndroid Build Coastguard Worker "images/baby_tux.webp",
521*c8dee2aaSAndroid Build Coastguard Worker "images/yellow_rose.webp",
522*c8dee2aaSAndroid Build Coastguard Worker "images/webp-color-profile-lossless.webp",
523*c8dee2aaSAndroid Build Coastguard Worker "images/colorTables.gif",
524*c8dee2aaSAndroid Build Coastguard Worker "images/color_wheel.gif",
525*c8dee2aaSAndroid Build Coastguard Worker "images/flightAnim.gif",
526*c8dee2aaSAndroid Build Coastguard Worker "images/randPixels.gif",
527*c8dee2aaSAndroid Build Coastguard Worker "images/rle.bmp",
528*c8dee2aaSAndroid Build Coastguard Worker "images/color_wheel.ico",
529*c8dee2aaSAndroid Build Coastguard Worker "images/google_chrome.ico",
530*c8dee2aaSAndroid Build Coastguard Worker "images/mandrill.wbmp",
531*c8dee2aaSAndroid Build Coastguard Worker }) {
532*c8dee2aaSAndroid Build Coastguard Worker auto gen = make_generator(path, r);
533*c8dee2aaSAndroid Build Coastguard Worker if (!gen) continue;
534*c8dee2aaSAndroid Build Coastguard Worker
535*c8dee2aaSAndroid Build Coastguard Worker for (SkColorType ct : {
536*c8dee2aaSAndroid Build Coastguard Worker kUnknown_SkColorType,
537*c8dee2aaSAndroid Build Coastguard Worker kAlpha_8_SkColorType,
538*c8dee2aaSAndroid Build Coastguard Worker kARGB_4444_SkColorType,
539*c8dee2aaSAndroid Build Coastguard Worker kRGB_888x_SkColorType,
540*c8dee2aaSAndroid Build Coastguard Worker kBGRA_8888_SkColorType,
541*c8dee2aaSAndroid Build Coastguard Worker kRGBA_1010102_SkColorType,
542*c8dee2aaSAndroid Build Coastguard Worker kBGRA_1010102_SkColorType,
543*c8dee2aaSAndroid Build Coastguard Worker kRGB_101010x_SkColorType,
544*c8dee2aaSAndroid Build Coastguard Worker kBGR_101010x_SkColorType,
545*c8dee2aaSAndroid Build Coastguard Worker kRGBA_F16Norm_SkColorType,
546*c8dee2aaSAndroid Build Coastguard Worker kRGB_F16F16F16x_SkColorType,
547*c8dee2aaSAndroid Build Coastguard Worker kRGBA_F32_SkColorType,
548*c8dee2aaSAndroid Build Coastguard Worker kR8G8_unorm_SkColorType,
549*c8dee2aaSAndroid Build Coastguard Worker kA16_float_SkColorType,
550*c8dee2aaSAndroid Build Coastguard Worker kR16G16_float_SkColorType,
551*c8dee2aaSAndroid Build Coastguard Worker kA16_unorm_SkColorType,
552*c8dee2aaSAndroid Build Coastguard Worker kR16G16_unorm_SkColorType,
553*c8dee2aaSAndroid Build Coastguard Worker kR16G16B16A16_unorm_SkColorType,
554*c8dee2aaSAndroid Build Coastguard Worker }) {
555*c8dee2aaSAndroid Build Coastguard Worker auto info = gen->getInfo().makeColorType(ct);
556*c8dee2aaSAndroid Build Coastguard Worker SkBitmap bm;
557*c8dee2aaSAndroid Build Coastguard Worker bm.allocPixels(info);
558*c8dee2aaSAndroid Build Coastguard Worker if (gen->getPixels(bm.pixmap())) {
559*c8dee2aaSAndroid Build Coastguard Worker ERRORF(r, "Expected decoding %s to %i to fail!", path, ct);
560*c8dee2aaSAndroid Build Coastguard Worker }
561*c8dee2aaSAndroid Build Coastguard Worker }
562*c8dee2aaSAndroid Build Coastguard Worker }
563*c8dee2aaSAndroid Build Coastguard Worker }
564*c8dee2aaSAndroid Build Coastguard Worker #endif // SK_ENABLE_NDK_IMAGES
565