xref: /third_party/skia/tests/NdkEncodeTest.cpp (revision cb93a386)
1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2020 Google LLC
3cb93a386Sopenharmony_ci *
4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be
5cb93a386Sopenharmony_ci * found in the LICENSE file.
6cb93a386Sopenharmony_ci */
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci#include "include/core/SkTypes.h"
9cb93a386Sopenharmony_ci#ifdef SK_ENABLE_NDK_IMAGES
10cb93a386Sopenharmony_ci#include "include/core/SkColor.h"
11cb93a386Sopenharmony_ci#include "include/core/SkImageEncoder.h"
12cb93a386Sopenharmony_ci#include "include/core/SkImageGenerator.h"
13cb93a386Sopenharmony_ci#include "include/private/SkMalloc.h"
14cb93a386Sopenharmony_ci#include "src/images/SkImageEncoderPriv.h"
15cb93a386Sopenharmony_ci#include "tests/Test.h"
16cb93a386Sopenharmony_ci#include "tools/Resources.h"
17cb93a386Sopenharmony_ci#include "tools/ToolUtils.h"
18cb93a386Sopenharmony_ci
19cb93a386Sopenharmony_ci#include <stdint.h>
20cb93a386Sopenharmony_ci#include <vector>
21cb93a386Sopenharmony_ci
22cb93a386Sopenharmony_cistatic const char* kPng          = "png";
23cb93a386Sopenharmony_cistatic const char* kJpeg         = "jpeg";
24cb93a386Sopenharmony_cistatic const char* kWebpLossless = "webp_lossless";
25cb93a386Sopenharmony_cistatic const char* kWebpLossy    = "webp_lossy";
26cb93a386Sopenharmony_ci
27cb93a386Sopenharmony_cinamespace {
28cb93a386Sopenharmony_cistatic const struct {
29cb93a386Sopenharmony_ci    SkEncodedImageFormat format;
30cb93a386Sopenharmony_ci    int                  quality;
31cb93a386Sopenharmony_ci    const char*          name;
32cb93a386Sopenharmony_ci} gRecs[] = {
33cb93a386Sopenharmony_ci    { SkEncodedImageFormat::kPNG,  100, kPng},
34cb93a386Sopenharmony_ci    { SkEncodedImageFormat::kJPEG, 100, kJpeg},
35cb93a386Sopenharmony_ci    { SkEncodedImageFormat::kWEBP, 100, kWebpLossless},
36cb93a386Sopenharmony_ci    { SkEncodedImageFormat::kWEBP,  80, kWebpLossy},
37cb93a386Sopenharmony_ci};
38cb93a386Sopenharmony_ci}
39cb93a386Sopenharmony_ci
40cb93a386Sopenharmony_cistatic sk_sp<SkData> encode_ndk(const SkPixmap& pmap, SkEncodedImageFormat format, int quality) {
41cb93a386Sopenharmony_ci    SkDynamicMemoryWStream stream;
42cb93a386Sopenharmony_ci    return SkEncodeImageWithNDK(&stream, pmap, format, quality) ? stream.detachAsData() : nullptr;
43cb93a386Sopenharmony_ci}
44cb93a386Sopenharmony_ci
45cb93a386Sopenharmony_ciDEF_TEST(NdkEncode, r) {
46cb93a386Sopenharmony_ci    for (auto ct : { kRGBA_8888_SkColorType,
47cb93a386Sopenharmony_ci                     kRGB_565_SkColorType,
48cb93a386Sopenharmony_ci                     kRGBA_F16_SkColorType }) {
49cb93a386Sopenharmony_ci        SkBitmap bm;
50cb93a386Sopenharmony_ci        bm.allocPixels(SkImageInfo::Make(10, 10, ct, kOpaque_SkAlphaType));
51cb93a386Sopenharmony_ci        bm.eraseColor(SK_ColorBLUE);
52cb93a386Sopenharmony_ci        for (const auto& rec : gRecs) {
53cb93a386Sopenharmony_ci            auto encoded = encode_ndk(bm.pixmap(), rec.format, rec.quality);
54cb93a386Sopenharmony_ci            if (!encoded) {
55cb93a386Sopenharmony_ci                ERRORF(r, "Failed to encode %s to %s\n", ToolUtils::colortype_name(ct), rec.name);
56cb93a386Sopenharmony_ci                continue;
57cb93a386Sopenharmony_ci            }
58cb93a386Sopenharmony_ci            auto gen = SkImageGenerator::MakeFromEncoded(std::move(encoded));
59cb93a386Sopenharmony_ci            if (!gen) {
60cb93a386Sopenharmony_ci                ERRORF(r, "Failed to decode from %s as %s\n", ToolUtils::colortype_name(ct),
61cb93a386Sopenharmony_ci                       rec.name);
62cb93a386Sopenharmony_ci                continue;
63cb93a386Sopenharmony_ci            }
64cb93a386Sopenharmony_ci
65cb93a386Sopenharmony_ci            if (rec.name == kPng && bm.colorType() == kRGB_565_SkColorType) {
66cb93a386Sopenharmony_ci                REPORTER_ASSERT(r, gen->getInfo().colorType() == kRGB_565_SkColorType);
67cb93a386Sopenharmony_ci            } else {
68cb93a386Sopenharmony_ci                REPORTER_ASSERT(r, gen->getInfo().colorType() == kN32_SkColorType);
69cb93a386Sopenharmony_ci            }
70cb93a386Sopenharmony_ci
71cb93a386Sopenharmony_ci            SkBitmap bm2;
72cb93a386Sopenharmony_ci            bm2.allocPixels(bm.info());
73cb93a386Sopenharmony_ci            REPORTER_ASSERT(r, gen->getPixels(bm2.pixmap()));
74cb93a386Sopenharmony_ci
75cb93a386Sopenharmony_ci            for (int x = 0; x < bm.width();  x++)
76cb93a386Sopenharmony_ci            for (int y = 0; y < bm.height(); y++) {
77cb93a386Sopenharmony_ci                SkColor orig   = bm .getColor(x, y);
78cb93a386Sopenharmony_ci                SkColor actual = bm2.getColor(x, y);
79cb93a386Sopenharmony_ci
80cb93a386Sopenharmony_ci                REPORTER_ASSERT(r, SkColorGetA(orig) == SkColorGetA(actual));
81cb93a386Sopenharmony_ci                REPORTER_ASSERT(r, SkColorGetA(orig) == 0xFF);
82cb93a386Sopenharmony_ci
83cb93a386Sopenharmony_ci                if (rec.name == kPng || rec.name == kWebpLossless) {
84cb93a386Sopenharmony_ci                    REPORTER_ASSERT(r, orig == actual);
85cb93a386Sopenharmony_ci                } else {
86cb93a386Sopenharmony_ci                    int diffR = std::abs((int) SkColorGetR(orig) - (int) SkColorGetR(actual));
87cb93a386Sopenharmony_ci                    int diffG = std::abs((int) SkColorGetG(orig) - (int) SkColorGetG(actual));
88cb93a386Sopenharmony_ci                    int diffB = std::abs((int) SkColorGetB(orig) - (int) SkColorGetB(actual));
89cb93a386Sopenharmony_ci                    REPORTER_ASSERT(r, diffR <= 2 && diffG <= 1 && diffB <= 1);
90cb93a386Sopenharmony_ci                }
91cb93a386Sopenharmony_ci            }
92cb93a386Sopenharmony_ci        }
93cb93a386Sopenharmony_ci    }
94cb93a386Sopenharmony_ci}
95cb93a386Sopenharmony_ci
96cb93a386Sopenharmony_ciDEF_TEST(NdkEncode_unsupportedFormats, r) {
97cb93a386Sopenharmony_ci    for (auto ct : { kRGBA_8888_SkColorType,
98cb93a386Sopenharmony_ci                     kRGB_565_SkColorType,
99cb93a386Sopenharmony_ci                     kRGBA_F16_SkColorType }) {
100cb93a386Sopenharmony_ci        SkBitmap bm;
101cb93a386Sopenharmony_ci        bm.allocPixels(SkImageInfo::Make(10, 10, ct, kOpaque_SkAlphaType));
102cb93a386Sopenharmony_ci        bm.eraseColor(SK_ColorBLUE);
103cb93a386Sopenharmony_ci        for (auto format : { SkEncodedImageFormat::kBMP,
104cb93a386Sopenharmony_ci                             SkEncodedImageFormat::kGIF,
105cb93a386Sopenharmony_ci                             SkEncodedImageFormat::kICO,
106cb93a386Sopenharmony_ci                             SkEncodedImageFormat::kWBMP,
107cb93a386Sopenharmony_ci                             SkEncodedImageFormat::kPKM,
108cb93a386Sopenharmony_ci                             SkEncodedImageFormat::kKTX,
109cb93a386Sopenharmony_ci                             SkEncodedImageFormat::kASTC,
110cb93a386Sopenharmony_ci                             SkEncodedImageFormat::kDNG,
111cb93a386Sopenharmony_ci                             SkEncodedImageFormat::kHEIF }) {
112cb93a386Sopenharmony_ci            REPORTER_ASSERT(r, !encode_ndk(bm.pixmap(), format, 100));
113cb93a386Sopenharmony_ci        }
114cb93a386Sopenharmony_ci    }
115cb93a386Sopenharmony_ci}
116cb93a386Sopenharmony_ci
117cb93a386Sopenharmony_ciDEF_TEST(NdkEncode_badQuality, r) {
118cb93a386Sopenharmony_ci    for (auto ct : { kRGBA_8888_SkColorType,
119cb93a386Sopenharmony_ci                     kRGB_565_SkColorType,
120cb93a386Sopenharmony_ci                     kRGBA_F16_SkColorType }) {
121cb93a386Sopenharmony_ci        SkBitmap bm;
122cb93a386Sopenharmony_ci        bm.allocPixels(SkImageInfo::Make(10, 10, ct, kOpaque_SkAlphaType));
123cb93a386Sopenharmony_ci        bm.eraseColor(SK_ColorBLUE);
124cb93a386Sopenharmony_ci        for (auto format : { SkEncodedImageFormat::kJPEG,
125cb93a386Sopenharmony_ci                             SkEncodedImageFormat::kPNG,
126cb93a386Sopenharmony_ci                             SkEncodedImageFormat::kWEBP }) {
127cb93a386Sopenharmony_ci            for (int quality : {-1, -100, 101, 200}) {
128cb93a386Sopenharmony_ci                REPORTER_ASSERT(r, !encode_ndk(bm.pixmap(), format, quality));
129cb93a386Sopenharmony_ci            }
130cb93a386Sopenharmony_ci        }
131cb93a386Sopenharmony_ci    }
132cb93a386Sopenharmony_ci}
133cb93a386Sopenharmony_ci
134cb93a386Sopenharmony_ciDEF_TEST(NdkEncode_nullPixels, r) {
135cb93a386Sopenharmony_ci    for (auto info : { SkImageInfo::MakeUnknown(),
136cb93a386Sopenharmony_ci                       SkImageInfo::MakeN32Premul(10, 10),
137cb93a386Sopenharmony_ci                       SkImageInfo::MakeN32Premul(0, 0)}) {
138cb93a386Sopenharmony_ci        SkPixmap pm(info, nullptr, info.minRowBytes());
139cb93a386Sopenharmony_ci        for (const auto& rec : gRecs) {
140cb93a386Sopenharmony_ci            REPORTER_ASSERT(r, !encode_ndk(pm, rec.format, rec.quality));
141cb93a386Sopenharmony_ci        }
142cb93a386Sopenharmony_ci    }
143cb93a386Sopenharmony_ci}
144cb93a386Sopenharmony_ci
145cb93a386Sopenharmony_ciDEF_TEST(NdkEncode_badInfo, r) {
146cb93a386Sopenharmony_ci    // Allocate an arbitrary amount of memory. These infos don't have a natural
147cb93a386Sopenharmony_ci    // amount to allocate, and the encoder shouldn't touch the memory anyway.
148cb93a386Sopenharmony_ci    // But this allows us to verify that the bad info fails, even when the pixel
149cb93a386Sopenharmony_ci    // pointer is not null.
150cb93a386Sopenharmony_ci    void* pixels = sk_malloc_throw(1024);
151cb93a386Sopenharmony_ci    std::vector<SkPixmap> pixmaps{ SkPixmap(SkImageInfo::MakeN32Premul(-10, 10), pixels, 1000),
152cb93a386Sopenharmony_ci                                   SkPixmap(SkImageInfo::MakeN32Premul(10, -10), pixels, 200),
153cb93a386Sopenharmony_ci                                   SkPixmap(SkImageInfo::MakeN32Premul(10,  10), pixels, 20),
154cb93a386Sopenharmony_ci                                   SkPixmap(SkImageInfo::MakeN32Premul(10,  10), pixels, 41),
155cb93a386Sopenharmony_ci                                   SkPixmap(SkImageInfo::MakeN32Premul(10,  10), pixels, 0),
156cb93a386Sopenharmony_ci                                   SkPixmap(SkImageInfo::MakeN32Premul( 0,   0), pixels, 40)};
157cb93a386Sopenharmony_ci    if (sizeof(size_t) > sizeof(uint32_t)) {
158cb93a386Sopenharmony_ci        pixmaps.emplace_back(SkImageInfo::MakeN32Premul(10, 10),  pixels,
159cb93a386Sopenharmony_ci                             static_cast<size_t>(UINT32_MAX) + 1);
160cb93a386Sopenharmony_ci    }
161cb93a386Sopenharmony_ci    for (const auto& pm : pixmaps) {
162cb93a386Sopenharmony_ci        for (const auto& rec : gRecs) {
163cb93a386Sopenharmony_ci            REPORTER_ASSERT(r, !encode_ndk(pm, rec.format, rec.quality));
164cb93a386Sopenharmony_ci        }
165cb93a386Sopenharmony_ci    }
166cb93a386Sopenharmony_ci    free(pixels);
167cb93a386Sopenharmony_ci}
168cb93a386Sopenharmony_ci
169cb93a386Sopenharmony_ciDEF_TEST(NdkEncode_unsupportedColorTypes, r) {
170cb93a386Sopenharmony_ci    for (SkColorType ct : {
171cb93a386Sopenharmony_ci        kUnknown_SkColorType,
172cb93a386Sopenharmony_ci        kAlpha_8_SkColorType,
173cb93a386Sopenharmony_ci        kARGB_4444_SkColorType,
174cb93a386Sopenharmony_ci        kRGB_888x_SkColorType,
175cb93a386Sopenharmony_ci        kBGRA_8888_SkColorType,
176cb93a386Sopenharmony_ci        kRGBA_1010102_SkColorType,
177cb93a386Sopenharmony_ci        kBGRA_1010102_SkColorType,
178cb93a386Sopenharmony_ci        kRGB_101010x_SkColorType,
179cb93a386Sopenharmony_ci        kBGR_101010x_SkColorType,
180cb93a386Sopenharmony_ci        kGray_8_SkColorType,
181cb93a386Sopenharmony_ci        kRGBA_F16Norm_SkColorType,
182cb93a386Sopenharmony_ci        kRGBA_F32_SkColorType,
183cb93a386Sopenharmony_ci        kR8G8_unorm_SkColorType,
184cb93a386Sopenharmony_ci        kA16_float_SkColorType,
185cb93a386Sopenharmony_ci        kR16G16_float_SkColorType,
186cb93a386Sopenharmony_ci        kA16_unorm_SkColorType,
187cb93a386Sopenharmony_ci        kR16G16_unorm_SkColorType,
188cb93a386Sopenharmony_ci        kR16G16B16A16_unorm_SkColorType,
189cb93a386Sopenharmony_ci    }) {
190cb93a386Sopenharmony_ci        auto info = SkImageInfo::Make(7, 13, ct, kOpaque_SkAlphaType, SkColorSpace::MakeSRGB());
191cb93a386Sopenharmony_ci        SkBitmap bm;
192cb93a386Sopenharmony_ci        bm.allocPixels(info);
193cb93a386Sopenharmony_ci        bm.eraseColor(SK_ColorGREEN);
194cb93a386Sopenharmony_ci        for (const auto& rec : gRecs) {
195cb93a386Sopenharmony_ci            REPORTER_ASSERT(r, !encode_ndk(bm.pixmap(), rec.format, rec.quality));
196cb93a386Sopenharmony_ci        }
197cb93a386Sopenharmony_ci        if (!SkColorTypeIsAlwaysOpaque(ct)) {
198cb93a386Sopenharmony_ci            for (auto at : { kPremul_SkAlphaType, kUnpremul_SkAlphaType}) {
199cb93a386Sopenharmony_ci                info = info.makeAlphaType(at);
200cb93a386Sopenharmony_ci                bm.allocPixels(info);
201cb93a386Sopenharmony_ci                bm.eraseARGB(0x7F, 0xFF, 0xFF, 0xFF);
202cb93a386Sopenharmony_ci            }
203cb93a386Sopenharmony_ci            for (const auto& rec : gRecs) {
204cb93a386Sopenharmony_ci                REPORTER_ASSERT(r, !encode_ndk(bm.pixmap(), rec.format, rec.quality));
205cb93a386Sopenharmony_ci            }
206cb93a386Sopenharmony_ci        }
207cb93a386Sopenharmony_ci    }
208cb93a386Sopenharmony_ci}
209cb93a386Sopenharmony_ci
210cb93a386Sopenharmony_ciDEF_TEST(NdkEncode_unsupportedAlphaTypes, r) {
211cb93a386Sopenharmony_ci    for (auto ct : { kRGBA_8888_SkColorType,
212cb93a386Sopenharmony_ci                     kRGB_565_SkColorType,
213cb93a386Sopenharmony_ci                     kRGBA_F16_SkColorType }) {
214cb93a386Sopenharmony_ci        for (auto at : { kUnknown_SkAlphaType, (SkAlphaType) -1}) {
215cb93a386Sopenharmony_ci            auto info = SkImageInfo::Make(10, 10, ct, at);
216cb93a386Sopenharmony_ci            size_t rowBytes = info.minRowBytes();
217cb93a386Sopenharmony_ci            void* pixels = sk_malloc_throw(info.computeByteSize(rowBytes));
218cb93a386Sopenharmony_ci            SkPixmap pm(info, pixels, rowBytes);
219cb93a386Sopenharmony_ci            for (const auto& rec : gRecs) {
220cb93a386Sopenharmony_ci                REPORTER_ASSERT(r, !encode_ndk(pm, rec.format, rec.quality));
221cb93a386Sopenharmony_ci            }
222cb93a386Sopenharmony_ci            free(pixels);
223cb93a386Sopenharmony_ci        }
224cb93a386Sopenharmony_ci    }
225cb93a386Sopenharmony_ci}
226cb93a386Sopenharmony_ci
227cb93a386Sopenharmony_cistatic constexpr skcms_TransferFunction k2Dot6 = {2.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
228cb93a386Sopenharmony_ci
229cb93a386Sopenharmony_cistatic constexpr skcms_Matrix3x3 kDCIP3 = {{
230cb93a386Sopenharmony_ci        {0.486143, 0.323835, 0.154234},
231cb93a386Sopenharmony_ci        {0.226676, 0.710327, 0.0629966},
232cb93a386Sopenharmony_ci        {0.000800549, 0.0432385, 0.78275},
233cb93a386Sopenharmony_ci}};
234cb93a386Sopenharmony_ci
235cb93a386Sopenharmony_ci
236cb93a386Sopenharmony_cistatic bool nearly_equal(float a, float b) {
237cb93a386Sopenharmony_ci    return fabs(a - b) < .002f;
238cb93a386Sopenharmony_ci}
239cb93a386Sopenharmony_ci
240cb93a386Sopenharmony_cistatic bool nearly_equal(const skcms_TransferFunction& x, const skcms_TransferFunction& y) {
241cb93a386Sopenharmony_ci    return nearly_equal(x.g, y.g)
242cb93a386Sopenharmony_ci        && nearly_equal(x.a, y.a)
243cb93a386Sopenharmony_ci        && nearly_equal(x.b, y.b)
244cb93a386Sopenharmony_ci        && nearly_equal(x.c, y.c)
245cb93a386Sopenharmony_ci        && nearly_equal(x.d, y.d)
246cb93a386Sopenharmony_ci        && nearly_equal(x.e, y.e)
247cb93a386Sopenharmony_ci        && nearly_equal(x.f, y.f);
248cb93a386Sopenharmony_ci}
249cb93a386Sopenharmony_ci
250cb93a386Sopenharmony_cistatic bool nearly_equal(const skcms_Matrix3x3& a, const skcms_Matrix3x3& b) {
251cb93a386Sopenharmony_ci    for (int i = 0; i < 3; i++)
252cb93a386Sopenharmony_ci    for (int j = 0; j < 3; j++) {
253cb93a386Sopenharmony_ci        if (!nearly_equal(a.vals[i][j], b.vals[i][j])) return false;
254cb93a386Sopenharmony_ci    }
255cb93a386Sopenharmony_ci    return true;
256cb93a386Sopenharmony_ci}
257cb93a386Sopenharmony_ci
258cb93a386Sopenharmony_cistatic bool nearly_equal(SkColorSpace* a, SkColorSpace* b) {
259cb93a386Sopenharmony_ci    skcms_TransferFunction fnA,     fnB;
260cb93a386Sopenharmony_ci    skcms_Matrix3x3        gamutA,  gamutB;
261cb93a386Sopenharmony_ci    return a && b && a->isNumericalTransferFn(&fnA) && a->toXYZD50(&gamutA)
262cb93a386Sopenharmony_ci                  && b->isNumericalTransferFn(&fnB) && b->toXYZD50(&gamutB)
263cb93a386Sopenharmony_ci             && nearly_equal(fnA, fnB) && nearly_equal(gamutA, gamutB);
264cb93a386Sopenharmony_ci}
265cb93a386Sopenharmony_ci
266cb93a386Sopenharmony_ciDEF_TEST(NdkEncode_ColorSpace, r) {
267cb93a386Sopenharmony_ci    const struct {
268cb93a386Sopenharmony_ci        sk_sp<SkColorSpace> cs;
269cb93a386Sopenharmony_ci        const char*         name;
270cb93a386Sopenharmony_ci    } colorSpaces[] = {
271cb93a386Sopenharmony_ci        { sk_sp<SkColorSpace>(nullptr),                                                 "null"    },
272cb93a386Sopenharmony_ci        { SkColorSpace::MakeSRGB(),                                                     "srgb"    },
273cb93a386Sopenharmony_ci        { SkColorSpace::MakeSRGBLinear(),                                            "srgb-linear"},
274cb93a386Sopenharmony_ci        { SkColorSpace::MakeRGB(SkNamedTransferFn::kRec2020, SkNamedGamut::kSRGB),      "bt709"   },
275cb93a386Sopenharmony_ci        { SkColorSpace::MakeRGB(SkNamedTransferFn::kRec2020, SkNamedGamut::kRec2020),   "rec2020" },
276cb93a386Sopenharmony_ci        { SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB,    SkNamedGamut::kDisplayP3), "p3"      },
277cb93a386Sopenharmony_ci        { SkColorSpace::MakeRGB(SkNamedTransferFn::k2Dot2,   SkNamedGamut::kAdobeRGB),  "adobeRGB"},
278cb93a386Sopenharmony_ci        { SkColorSpace::MakeRGB(k2Dot6,                      kDCIP3),                   "dci-p3"  },
279cb93a386Sopenharmony_ci    };
280cb93a386Sopenharmony_ci    for (const auto& colorSpace : colorSpaces) {
281cb93a386Sopenharmony_ci        for (auto ct : { kRGBA_8888_SkColorType, kRGB_565_SkColorType, kRGBA_F16_SkColorType }) {
282cb93a386Sopenharmony_ci            SkBitmap bm;
283cb93a386Sopenharmony_ci            bm.allocPixels(SkImageInfo::Make(10, 10, ct, kOpaque_SkAlphaType, colorSpace.cs));
284cb93a386Sopenharmony_ci            bm.eraseColor(SK_ColorRED);
285cb93a386Sopenharmony_ci
286cb93a386Sopenharmony_ci            for (const auto& rec : gRecs) {
287cb93a386Sopenharmony_ci                auto encoded = encode_ndk(bm.pixmap(), rec.format, rec.quality);
288cb93a386Sopenharmony_ci                REPORTER_ASSERT(r, encoded);
289cb93a386Sopenharmony_ci                auto gen = SkImageGenerator::MakeFromEncoded(std::move(encoded));
290cb93a386Sopenharmony_ci                REPORTER_ASSERT(r, gen);
291cb93a386Sopenharmony_ci
292cb93a386Sopenharmony_ci                auto  expected = colorSpace.cs ? colorSpace.cs : SkColorSpace::MakeSRGB();
293cb93a386Sopenharmony_ci                auto* actual   = gen->getInfo().colorSpace();
294cb93a386Sopenharmony_ci                if (!nearly_equal(actual, expected.get())) {
295cb93a386Sopenharmony_ci                    const char* name = "unknown";
296cb93a386Sopenharmony_ci                    for (auto named : colorSpaces) {
297cb93a386Sopenharmony_ci                        if (nearly_equal(actual, named.cs.get())) {
298cb93a386Sopenharmony_ci                            name = named.name;
299cb93a386Sopenharmony_ci                            break;
300cb93a386Sopenharmony_ci                        }
301cb93a386Sopenharmony_ci                    }
302cb93a386Sopenharmony_ci
303cb93a386Sopenharmony_ci                    ERRORF(r, "Mismatch: expected: %s\tactual:%s", colorSpace.name, name);
304cb93a386Sopenharmony_ci                }
305cb93a386Sopenharmony_ci            }
306cb93a386Sopenharmony_ci        }
307cb93a386Sopenharmony_ci    }
308cb93a386Sopenharmony_ci}
309cb93a386Sopenharmony_ci
310cb93a386Sopenharmony_ciDEF_TEST(NdkEncode_unsupportedColorSpace, r) {
311cb93a386Sopenharmony_ci    std::vector<sk_sp<SkColorSpace>> unsupportedCs;
312cb93a386Sopenharmony_ci    for (auto gamut : { SkNamedGamut::kSRGB, SkNamedGamut::kAdobeRGB, SkNamedGamut::kDisplayP3,
313cb93a386Sopenharmony_ci                        SkNamedGamut::kRec2020, SkNamedGamut::kXYZ }) {
314cb93a386Sopenharmony_ci        unsupportedCs.push_back(SkColorSpace::MakeRGB(SkNamedTransferFn::kPQ, gamut));
315cb93a386Sopenharmony_ci        unsupportedCs.push_back(SkColorSpace::MakeRGB(SkNamedTransferFn::kHLG, gamut));
316cb93a386Sopenharmony_ci        unsupportedCs.push_back(SkColorSpace::MakeRGB(k2Dot6, gamut));
317cb93a386Sopenharmony_ci    }
318cb93a386Sopenharmony_ci
319cb93a386Sopenharmony_ci    for (auto gamut : { SkNamedGamut::kSRGB, SkNamedGamut::kDisplayP3,
320cb93a386Sopenharmony_ci                        SkNamedGamut::kRec2020, SkNamedGamut::kXYZ }) {
321cb93a386Sopenharmony_ci        unsupportedCs.push_back(SkColorSpace::MakeRGB(SkNamedTransferFn::k2Dot2, gamut));
322cb93a386Sopenharmony_ci    }
323cb93a386Sopenharmony_ci
324cb93a386Sopenharmony_ci    for (auto gamut : { SkNamedGamut::kAdobeRGB, SkNamedGamut::kDisplayP3,
325cb93a386Sopenharmony_ci                        SkNamedGamut::kXYZ }) {
326cb93a386Sopenharmony_ci        unsupportedCs.push_back(SkColorSpace::MakeRGB(SkNamedTransferFn::kRec2020, gamut));
327cb93a386Sopenharmony_ci    }
328cb93a386Sopenharmony_ci
329cb93a386Sopenharmony_ci    for (auto gamut : { SkNamedGamut::kAdobeRGB, SkNamedGamut::kDisplayP3,
330cb93a386Sopenharmony_ci                        SkNamedGamut::kRec2020, SkNamedGamut::kXYZ }) {
331cb93a386Sopenharmony_ci        unsupportedCs.push_back(SkColorSpace::MakeRGB(SkNamedTransferFn::kLinear, gamut));
332cb93a386Sopenharmony_ci    }
333cb93a386Sopenharmony_ci
334cb93a386Sopenharmony_ci    for (auto gamut : { SkNamedGamut::kAdobeRGB,
335cb93a386Sopenharmony_ci                        SkNamedGamut::kRec2020, SkNamedGamut::kXYZ }) {
336cb93a386Sopenharmony_ci        unsupportedCs.push_back(SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB, gamut));
337cb93a386Sopenharmony_ci    }
338cb93a386Sopenharmony_ci
339cb93a386Sopenharmony_ci    for (auto fn : { SkNamedTransferFn::kSRGB, SkNamedTransferFn::k2Dot2,
340cb93a386Sopenharmony_ci                     SkNamedTransferFn::kLinear, SkNamedTransferFn::kRec2020 }) {
341cb93a386Sopenharmony_ci        unsupportedCs.push_back(SkColorSpace::MakeRGB(fn, kDCIP3));
342cb93a386Sopenharmony_ci    }
343cb93a386Sopenharmony_ci
344cb93a386Sopenharmony_ci    for (auto unsupported : unsupportedCs) {
345cb93a386Sopenharmony_ci        for (auto ct : { kRGBA_8888_SkColorType, kRGB_565_SkColorType, kRGBA_F16_SkColorType }) {
346cb93a386Sopenharmony_ci            SkBitmap bm;
347cb93a386Sopenharmony_ci            bm.allocPixels(SkImageInfo::Make(10, 10, ct, kOpaque_SkAlphaType, unsupported));
348cb93a386Sopenharmony_ci            bm.eraseColor(SK_ColorBLUE);
349cb93a386Sopenharmony_ci
350cb93a386Sopenharmony_ci            for (const auto& rec : gRecs) {
351cb93a386Sopenharmony_ci                REPORTER_ASSERT(r, !encode_ndk(bm.pixmap(), rec.format, rec.quality));
352cb93a386Sopenharmony_ci            }
353cb93a386Sopenharmony_ci        }
354cb93a386Sopenharmony_ci    }
355cb93a386Sopenharmony_ci}
356cb93a386Sopenharmony_ci
357cb93a386Sopenharmony_ci#endif // SK_ENABLE_NDK_IMAGES
358