xref: /aosp_15_r20/external/skia/tests/NdkDecodeTest.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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