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