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 "src/ports/SkNDKConversions.h" 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_cinamespace { 11cb93a386Sopenharmony_cistatic const struct { 12cb93a386Sopenharmony_ci SkColorType colorType; 13cb93a386Sopenharmony_ci AndroidBitmapFormat format; 14cb93a386Sopenharmony_ci} gColorTypeTable[] = { 15cb93a386Sopenharmony_ci { kRGBA_8888_SkColorType, ANDROID_BITMAP_FORMAT_RGBA_8888 }, 16cb93a386Sopenharmony_ci { kRGBA_F16_SkColorType, ANDROID_BITMAP_FORMAT_RGBA_F16 }, 17cb93a386Sopenharmony_ci { kRGB_565_SkColorType, ANDROID_BITMAP_FORMAT_RGB_565 }, 18cb93a386Sopenharmony_ci // Android allows using its alpha 8 format to get 8 bit gray pixels. 19cb93a386Sopenharmony_ci { kGray_8_SkColorType, ANDROID_BITMAP_FORMAT_A_8 }, 20cb93a386Sopenharmony_ci}; 21cb93a386Sopenharmony_ci 22cb93a386Sopenharmony_ci} // anonymous namespace 23cb93a386Sopenharmony_ci 24cb93a386Sopenharmony_cinamespace SkNDKConversions { 25cb93a386Sopenharmony_ci AndroidBitmapFormat toAndroidBitmapFormat(SkColorType colorType) { 26cb93a386Sopenharmony_ci for (const auto& entry : gColorTypeTable) { 27cb93a386Sopenharmony_ci if (entry.colorType == colorType) { 28cb93a386Sopenharmony_ci return entry.format; 29cb93a386Sopenharmony_ci } 30cb93a386Sopenharmony_ci } 31cb93a386Sopenharmony_ci return ANDROID_BITMAP_FORMAT_NONE; 32cb93a386Sopenharmony_ci } 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_ci SkColorType toColorType(AndroidBitmapFormat format) { 35cb93a386Sopenharmony_ci for (const auto& entry : gColorTypeTable) { 36cb93a386Sopenharmony_ci if (entry.format == format) { 37cb93a386Sopenharmony_ci return entry.colorType; 38cb93a386Sopenharmony_ci } 39cb93a386Sopenharmony_ci } 40cb93a386Sopenharmony_ci return kUnknown_SkColorType; 41cb93a386Sopenharmony_ci } 42cb93a386Sopenharmony_ci 43cb93a386Sopenharmony_ci} // SkNDKConversions 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_cistatic constexpr skcms_TransferFunction k2Dot6 = {2.6f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}; 46cb93a386Sopenharmony_ci 47cb93a386Sopenharmony_cistatic constexpr skcms_Matrix3x3 kDCIP3 = {{ 48cb93a386Sopenharmony_ci {0.486143, 0.323835, 0.154234}, 49cb93a386Sopenharmony_ci {0.226676, 0.710327, 0.0629966}, 50cb93a386Sopenharmony_ci {0.000800549, 0.0432385, 0.78275}, 51cb93a386Sopenharmony_ci}}; 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_cinamespace { 54cb93a386Sopenharmony_cistatic const struct { 55cb93a386Sopenharmony_ci ADataSpace dataSpace; 56cb93a386Sopenharmony_ci skcms_TransferFunction transferFunction; 57cb93a386Sopenharmony_ci skcms_Matrix3x3 gamut; 58cb93a386Sopenharmony_ci} gColorSpaceTable[] = { 59cb93a386Sopenharmony_ci { ADATASPACE_SRGB, SkNamedTransferFn::kSRGB, SkNamedGamut::kSRGB }, 60cb93a386Sopenharmony_ci { ADATASPACE_SCRGB, SkNamedTransferFn::kSRGB, SkNamedGamut::kSRGB }, 61cb93a386Sopenharmony_ci { ADATASPACE_SCRGB_LINEAR, SkNamedTransferFn::kLinear, SkNamedGamut::kSRGB }, 62cb93a386Sopenharmony_ci { ADATASPACE_SRGB_LINEAR, SkNamedTransferFn::kLinear, SkNamedGamut::kSRGB }, 63cb93a386Sopenharmony_ci { ADATASPACE_ADOBE_RGB, SkNamedTransferFn::k2Dot2, SkNamedGamut::kAdobeRGB }, 64cb93a386Sopenharmony_ci { ADATASPACE_DISPLAY_P3, SkNamedTransferFn::kSRGB, SkNamedGamut::kDisplayP3 }, 65cb93a386Sopenharmony_ci { ADATASPACE_BT2020, SkNamedTransferFn::kRec2020, SkNamedGamut::kRec2020 }, 66cb93a386Sopenharmony_ci { ADATASPACE_BT709, SkNamedTransferFn::kRec2020, SkNamedGamut::kSRGB }, 67cb93a386Sopenharmony_ci { ADATASPACE_DCI_P3, k2Dot6, kDCIP3 }, 68cb93a386Sopenharmony_ci}; 69cb93a386Sopenharmony_ci 70cb93a386Sopenharmony_ci} // anonymous namespace 71cb93a386Sopenharmony_ci 72cb93a386Sopenharmony_cistatic bool nearly_equal(float a, float b) { 73cb93a386Sopenharmony_ci return fabs(a - b) < .002f; 74cb93a386Sopenharmony_ci} 75cb93a386Sopenharmony_ci 76cb93a386Sopenharmony_cistatic bool nearly_equal(const skcms_TransferFunction& x, const skcms_TransferFunction& y) { 77cb93a386Sopenharmony_ci return nearly_equal(x.g, y.g) 78cb93a386Sopenharmony_ci && nearly_equal(x.a, y.a) 79cb93a386Sopenharmony_ci && nearly_equal(x.b, y.b) 80cb93a386Sopenharmony_ci && nearly_equal(x.c, y.c) 81cb93a386Sopenharmony_ci && nearly_equal(x.d, y.d) 82cb93a386Sopenharmony_ci && nearly_equal(x.e, y.e) 83cb93a386Sopenharmony_ci && nearly_equal(x.f, y.f); 84cb93a386Sopenharmony_ci} 85cb93a386Sopenharmony_ci 86cb93a386Sopenharmony_cistatic bool nearly_equal(const skcms_Matrix3x3& a, const skcms_Matrix3x3& b) { 87cb93a386Sopenharmony_ci for (int i = 0; i < 3; i++) 88cb93a386Sopenharmony_ci for (int j = 0; j < 3; j++) { 89cb93a386Sopenharmony_ci if (!nearly_equal(a.vals[i][j], b.vals[i][j])) return false; 90cb93a386Sopenharmony_ci } 91cb93a386Sopenharmony_ci return true; 92cb93a386Sopenharmony_ci} 93cb93a386Sopenharmony_ci 94cb93a386Sopenharmony_cinamespace SkNDKConversions { 95cb93a386Sopenharmony_ci ADataSpace toDataSpace(SkColorSpace* cs) { 96cb93a386Sopenharmony_ci if (!cs) return ADATASPACE_SRGB; 97cb93a386Sopenharmony_ci 98cb93a386Sopenharmony_ci skcms_TransferFunction fn; 99cb93a386Sopenharmony_ci skcms_Matrix3x3 gamut; 100cb93a386Sopenharmony_ci if (cs->isNumericalTransferFn(&fn) && cs->toXYZD50(&gamut)) { 101cb93a386Sopenharmony_ci for (const auto& entry : gColorSpaceTable) { 102cb93a386Sopenharmony_ci if (nearly_equal(gamut, entry.gamut) && nearly_equal(fn, entry.transferFunction)) { 103cb93a386Sopenharmony_ci return entry.dataSpace; 104cb93a386Sopenharmony_ci } 105cb93a386Sopenharmony_ci } 106cb93a386Sopenharmony_ci } 107cb93a386Sopenharmony_ci return ADATASPACE_UNKNOWN; 108cb93a386Sopenharmony_ci } 109cb93a386Sopenharmony_ci 110cb93a386Sopenharmony_ci sk_sp<SkColorSpace> toColorSpace(ADataSpace dataSpace) { 111cb93a386Sopenharmony_ci for (const auto& entry : gColorSpaceTable) { 112cb93a386Sopenharmony_ci if (entry.dataSpace == dataSpace) { 113cb93a386Sopenharmony_ci return SkColorSpace::MakeRGB(entry.transferFunction, entry.gamut); 114cb93a386Sopenharmony_ci } 115cb93a386Sopenharmony_ci } 116cb93a386Sopenharmony_ci return nullptr; 117cb93a386Sopenharmony_ci } 118cb93a386Sopenharmony_ci} 119cb93a386Sopenharmony_ci 120