diff options
-rw-r--r-- | bench/ColorCodecBench.cpp | 7 | ||||
-rw-r--r-- | include/core/SkColorSpace.h | 4 | ||||
-rw-r--r-- | src/codec/SkPngCodec.cpp | 23 | ||||
-rw-r--r-- | src/core/SkColorSpace.cpp | 127 | ||||
-rw-r--r-- | tests/ColorSpaceTest.cpp | 18 | ||||
-rw-r--r-- | tests/SurfaceTest.cpp | 5 |
6 files changed, 52 insertions, 132 deletions
diff --git a/bench/ColorCodecBench.cpp b/bench/ColorCodecBench.cpp index 11343dc334..b0ae7e3730 100644 --- a/bench/ColorCodecBench.cpp +++ b/bench/ColorCodecBench.cpp @@ -175,10 +175,13 @@ void ColorCodecBench::onDelayedSetup() { } if (FLAGS_nonstd) { - float gammas[3] = { 1.8f, 2.0f, 2.5f, }; + SkColorSpaceTransferFn gamma; + gamma.fA = 1.0f; + gamma.fB = gamma.fC = gamma.fD = gamma.fE = gamma.fF = 0.0f; + gamma.fG = 4.0f; SkMatrix44 matrix = SkMatrix44(SkMatrix44::kUninitialized_Constructor); matrix.set3x3(0.30f, 0.31f, 0.28f, 0.32f, 0.33f, 0.29f, 0.27f, 0.30f, 0.30f); - fDstSpace = SkColorSpace::MakeRGB(gammas, matrix); + fDstSpace = SkColorSpace::MakeRGB(gamma, matrix); } fDstInfo = fDstInfo.makeColorSpace(fDstSpace); diff --git a/include/core/SkColorSpace.h b/include/core/SkColorSpace.h index 8d5705d455..1ea43e41d3 100644 --- a/include/core/SkColorSpace.h +++ b/include/core/SkColorSpace.h @@ -96,7 +96,6 @@ public: static sk_sp<SkColorSpace> MakeRGB(RenderTargetGamma gamma, const SkMatrix44& toXYZD50); static sk_sp<SkColorSpace> MakeRGB(const SkColorSpaceTransferFn& coeffs, const SkMatrix44& toXYZD50); - static sk_sp<SkColorSpace> MakeRGB(const float exponents[3], const SkMatrix44& toXYZD50); /** * Create a common, named SkColorSpace. @@ -116,9 +115,6 @@ public: const SkMatrix44& toXYZD50) { return MakeRGB(coeffs, toXYZD50); } - static sk_sp<SkColorSpace> NewRGB(const float exponents[3], const SkMatrix44& toXYZD50) { - return MakeRGB(exponents, toXYZD50); - } static sk_sp<SkColorSpace> NewNamed(Named named) { return MakeNamed(named); } static sk_sp<SkColorSpace> NewICC(const void* input, size_t len) { return MakeICC(input, len); } #endif diff --git a/src/codec/SkPngCodec.cpp b/src/codec/SkPngCodec.cpp index 09efd10227..ae110485ea 100644 --- a/src/codec/SkPngCodec.cpp +++ b/src/codec/SkPngCodec.cpp @@ -361,7 +361,6 @@ sk_sp<SkColorSpace> read_color_space(png_structp png_ptr, png_infop info_ptr) { // Next, check for chromaticities. png_fixed_point chrm[8]; png_fixed_point gamma; - float gammas[3]; if (png_get_cHRM_fixed(png_ptr, info_ptr, &chrm[0], &chrm[1], &chrm[2], &chrm[3], &chrm[4], &chrm[5], &chrm[6], &chrm[7])) { @@ -381,12 +380,12 @@ sk_sp<SkColorSpace> read_color_space(png_structp png_ptr, png_infop info_ptr) { } if (PNG_INFO_gAMA == png_get_gAMA_fixed(png_ptr, info_ptr, &gamma)) { - float value = png_inverted_fixed_point_to_float(gamma); - gammas[0] = value; - gammas[1] = value; - gammas[2] = value; + SkColorSpaceTransferFn fn; + fn.fA = 1.0f; + fn.fB = fn.fC = fn.fD = fn.fE = fn.fF = 0.0f; + fn.fG = png_inverted_fixed_point_to_float(gamma); - return SkColorSpace::MakeRGB(gammas, toXYZD50); + return SkColorSpace::MakeRGB(fn, toXYZD50); } // Default to sRGB gamma if the image has color space information, @@ -396,18 +395,16 @@ sk_sp<SkColorSpace> read_color_space(png_structp png_ptr, png_infop info_ptr) { // Last, check for gamma. if (PNG_INFO_gAMA == png_get_gAMA_fixed(png_ptr, info_ptr, &gamma)) { - - // Set the gammas. - float value = png_inverted_fixed_point_to_float(gamma); - gammas[0] = value; - gammas[1] = value; - gammas[2] = value; + SkColorSpaceTransferFn fn; + fn.fA = 1.0f; + fn.fB = fn.fC = fn.fD = fn.fE = fn.fF = 0.0f; + fn.fG = png_inverted_fixed_point_to_float(gamma); // Since there is no cHRM, we will guess sRGB gamut. SkMatrix44 toXYZD50(SkMatrix44::kUninitialized_Constructor); toXYZD50.set3x3RowMajorf(gSRGB_toXYZD50); - return SkColorSpace::MakeRGB(gammas, toXYZD50); + return SkColorSpace::MakeRGB(fn, toXYZD50); } #endif // LIBPNG >= 1.6 diff --git a/src/core/SkColorSpace.cpp b/src/core/SkColorSpace.cpp index b6d8afee44..c09387bbad 100644 --- a/src/core/SkColorSpace.cpp +++ b/src/core/SkColorSpace.cpp @@ -124,38 +124,8 @@ static bool xyz_almost_equal(const SkMatrix44& toXYZD50, const float* standard) color_space_almost_equal(toXYZD50.getFloat(3, 3), 1.0f); } -sk_sp<SkColorSpace> SkColorSpace::MakeRGB(const float values[3], const SkMatrix44& toXYZD50) { - if (0.0f > values[0] || 0.0f > values[1] || 0.0f > values[2]) { - return nullptr; - } - - SkGammaNamed gammaNamed = kNonStandard_SkGammaNamed; - if (color_space_almost_equal(2.2f, values[0]) && - color_space_almost_equal(2.2f, values[1]) && - color_space_almost_equal(2.2f, values[2])) { - gammaNamed = k2Dot2Curve_SkGammaNamed; - } else if (color_space_almost_equal(1.0f, values[0]) && - color_space_almost_equal(1.0f, values[1]) && - color_space_almost_equal(1.0f, values[2])) { - gammaNamed = kLinear_SkGammaNamed; - } - - if (kNonStandard_SkGammaNamed == gammaNamed) { - sk_sp<SkGammas> gammas = sk_sp<SkGammas>(new SkGammas()); - gammas->fRedType = SkGammas::Type::kValue_Type; - gammas->fGreenType = SkGammas::Type::kValue_Type; - gammas->fBlueType = SkGammas::Type::kValue_Type; - gammas->fRedData.fValue = values[0]; - gammas->fGreenData.fValue = values[1]; - gammas->fBlueData.fValue = values[2]; - return sk_sp<SkColorSpace>(new SkColorSpace_XYZ(kNonStandard_SkGammaNamed, - gammas, toXYZD50, nullptr)); - } - - return SkColorSpace_Base::MakeRGB(gammaNamed, toXYZD50); -} - -sk_sp<SkColorSpace> SkColorSpace_Base::MakeRGB(SkGammaNamed gammaNamed, const SkMatrix44& toXYZD50) { +sk_sp<SkColorSpace> SkColorSpace_Base::MakeRGB(SkGammaNamed gammaNamed, const SkMatrix44& toXYZD50) +{ switch (gammaNamed) { case kSRGB_SkGammaNamed: if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) { @@ -194,7 +164,7 @@ sk_sp<SkColorSpace> SkColorSpace::MakeRGB(RenderTargetGamma gamma, const SkMatri } sk_sp<SkColorSpace> SkColorSpace::MakeRGB(const SkColorSpaceTransferFn& coeffs, - const SkMatrix44& toXYZD50) { + const SkMatrix44& toXYZD50) { if (!is_valid_transfer_fn(coeffs)) { return nullptr; } @@ -308,13 +278,6 @@ struct ColorSpaceHeader { static constexpr uint8_t kICC_Flag = 1 << 1; /** - * If kFloatGamma_Flag is set, we will write 15 floats after the header. - * The first three are the gamma values, and the next twelve are the - * matrix. - */ - static constexpr uint8_t kFloatGamma_Flag = 1 << 2; - - /** * If kTransferFn_Flag is set, we will write 19 floats after the header. * The first seven represent the transfer fn, and the next twelve are the * matrix. @@ -388,52 +351,35 @@ size_t SkColorSpace::writeToMemory(void* memory) const { } return sizeof(ColorSpaceHeader) + 12 * sizeof(float); } - default: + default: { const SkGammas* gammas = thisXYZ->gammas(); SkASSERT(gammas); - if (gammas->isValue(0) && gammas->isValue(1) && gammas->isValue(2)) { - if (memory) { - *((ColorSpaceHeader*) memory) = - ColorSpaceHeader::Pack(k0_Version, 0, thisXYZ->fGammaNamed, - ColorSpaceHeader::kFloatGamma_Flag); - memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader)); - - *(((float*) memory) + 0) = gammas->fRedData.fValue; - *(((float*) memory) + 1) = gammas->fGreenData.fValue; - *(((float*) memory) + 2) = gammas->fBlueData.fValue; - memory = SkTAddOffset<void>(memory, 3 * sizeof(float)); - - thisXYZ->fToXYZD50.as3x4RowMajorf((float*) memory); - } - - return sizeof(ColorSpaceHeader) + 15 * sizeof(float); - } else { - SkASSERT(gammas->isParametric(0)); - SkASSERT(gammas->isParametric(1)); - SkASSERT(gammas->isParametric(2)); - SkASSERT(gammas->data(0) == gammas->data(1)); - SkASSERT(gammas->data(0) == gammas->data(2)); - - if (memory) { - *((ColorSpaceHeader*) memory) = - ColorSpaceHeader::Pack(k0_Version, 0, thisXYZ->fGammaNamed, - ColorSpaceHeader::kTransferFn_Flag); - memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader)); - - *(((float*) memory) + 0) = gammas->params(0).fA; - *(((float*) memory) + 1) = gammas->params(0).fB; - *(((float*) memory) + 2) = gammas->params(0).fC; - *(((float*) memory) + 3) = gammas->params(0).fD; - *(((float*) memory) + 4) = gammas->params(0).fE; - *(((float*) memory) + 5) = gammas->params(0).fF; - *(((float*) memory) + 6) = gammas->params(0).fG; - memory = SkTAddOffset<void>(memory, 7 * sizeof(float)); - - thisXYZ->fToXYZD50.as3x4RowMajorf((float*) memory); - } - - return sizeof(ColorSpaceHeader) + 19 * sizeof(float); + SkASSERT(gammas->isParametric(0)); + SkASSERT(gammas->isParametric(1)); + SkASSERT(gammas->isParametric(2)); + SkASSERT(gammas->data(0) == gammas->data(1)); + SkASSERT(gammas->data(0) == gammas->data(2)); + + if (memory) { + *((ColorSpaceHeader*) memory) = + ColorSpaceHeader::Pack(k0_Version, 0, thisXYZ->fGammaNamed, + ColorSpaceHeader::kTransferFn_Flag); + memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader)); + + *(((float*) memory) + 0) = gammas->params(0).fA; + *(((float*) memory) + 1) = gammas->params(0).fB; + *(((float*) memory) + 2) = gammas->params(0).fC; + *(((float*) memory) + 3) = gammas->params(0).fD; + *(((float*) memory) + 4) = gammas->params(0).fE; + *(((float*) memory) + 5) = gammas->params(0).fF; + *(((float*) memory) + 6) = gammas->params(0).fG; + memory = SkTAddOffset<void>(memory, 7 * sizeof(float)); + + thisXYZ->fToXYZD50.as3x4RowMajorf((float*) memory); } + + return sizeof(ColorSpaceHeader) + 19 * sizeof(float); + } } } @@ -512,21 +458,6 @@ sk_sp<SkColorSpace> SkColorSpace::Deserialize(const void* data, size_t length) { return MakeICC(data, profileSize); } - case ColorSpaceHeader::kFloatGamma_Flag: { - if (length < 15 * sizeof(float)) { - return nullptr; - } - - float gammas[3]; - gammas[0] = *(((const float*) data) + 0); - gammas[1] = *(((const float*) data) + 1); - gammas[2] = *(((const float*) data) + 2); - data = SkTAddOffset<const void>(data, 3 * sizeof(float)); - - SkMatrix44 toXYZ(SkMatrix44::kUninitialized_Constructor); - toXYZ.set3x4RowMajorf((const float*) data); - return SkColorSpace::MakeRGB(gammas, toXYZ); - } case ColorSpaceHeader::kTransferFn_Flag: { if (length < 19 * sizeof(float)) { return nullptr; diff --git a/tests/ColorSpaceTest.cpp b/tests/ColorSpaceTest.cpp index 76cb36deb6..7d86ae6d63 100644 --- a/tests/ColorSpaceTest.cpp +++ b/tests/ColorSpaceTest.cpp @@ -237,10 +237,6 @@ DEF_TEST(ColorSpace_Serialize, r) { monitorData = SkData::MakeFromFileName(GetResourcePath("icc_profiles/upperRight.icc").c_str()); test_serialize(r, SkColorSpace::MakeICC(monitorData->data(), monitorData->size()).get(), false); - const float gammas[] = { 1.1f, 1.2f, 1.7f, }; - SkMatrix44 toXYZ(SkMatrix44::kIdentity_Constructor); - test_serialize(r, SkColorSpace::MakeRGB(gammas, toXYZ).get(), false); - SkColorSpaceTransferFn fn; fn.fA = 1.0f; fn.fB = 0.0f; @@ -249,6 +245,7 @@ DEF_TEST(ColorSpace_Serialize, r) { fn.fE = 1.0f; fn.fF = 0.0f; fn.fG = 1.0f; + SkMatrix44 toXYZ(SkMatrix44::kIdentity_Constructor); test_serialize(r, SkColorSpace::MakeRGB(fn, toXYZ).get(), false); } @@ -264,12 +261,6 @@ DEF_TEST(ColorSpace_Equals, r) { sk_sp<SkColorSpace> upperLeft = SkColorSpace::MakeICC(data->data(), data->size()); data = SkData::MakeFromFileName(GetResourcePath("icc_profiles/upperRight.icc").c_str()); sk_sp<SkColorSpace> upperRight = SkColorSpace::MakeICC(data->data(), data->size()); - const float gammas1[] = { 1.1f, 1.2f, 1.3f, }; - const float gammas2[] = { 1.1f, 1.2f, 1.7f, }; - SkMatrix44 toXYZ(SkMatrix44::kIdentity_Constructor); - sk_sp<SkColorSpace> rgb1 = SkColorSpace::MakeRGB(gammas1, toXYZ); - sk_sp<SkColorSpace> rgb2 = SkColorSpace::MakeRGB(gammas2, toXYZ); - sk_sp<SkColorSpace> rgb3 = SkColorSpace::MakeRGB(gammas1, toXYZ); SkColorSpaceTransferFn fn; fn.fA = 1.0f; @@ -279,6 +270,7 @@ DEF_TEST(ColorSpace_Equals, r) { fn.fE = 1.0f; fn.fF = 0.0f; fn.fG = 1.0f; + SkMatrix44 toXYZ(SkMatrix44::kIdentity_Constructor); sk_sp<SkColorSpace> rgb4 = SkColorSpace::MakeRGB(fn, toXYZ); REPORTER_ASSERT(r, SkColorSpace::Equals(nullptr, nullptr)); @@ -288,8 +280,6 @@ DEF_TEST(ColorSpace_Equals, r) { REPORTER_ASSERT(r, SkColorSpace::Equals(z32.get(), z32.get())); REPORTER_ASSERT(r, SkColorSpace::Equals(upperLeft.get(), upperLeft.get())); REPORTER_ASSERT(r, SkColorSpace::Equals(upperRight.get(), upperRight.get())); - REPORTER_ASSERT(r, SkColorSpace::Equals(rgb1.get(), rgb1.get())); - REPORTER_ASSERT(r, SkColorSpace::Equals(rgb1.get(), rgb3.get())); REPORTER_ASSERT(r, SkColorSpace::Equals(rgb4.get(), rgb4.get())); REPORTER_ASSERT(r, !SkColorSpace::Equals(nullptr, srgb.get())); @@ -301,8 +291,8 @@ DEF_TEST(ColorSpace_Equals, r) { REPORTER_ASSERT(r, !SkColorSpace::Equals(upperLeft.get(), upperRight.get())); REPORTER_ASSERT(r, !SkColorSpace::Equals(z30.get(), upperRight.get())); REPORTER_ASSERT(r, !SkColorSpace::Equals(upperRight.get(), adobe.get())); - REPORTER_ASSERT(r, !SkColorSpace::Equals(rgb1.get(), rgb2.get())); - REPORTER_ASSERT(r, !SkColorSpace::Equals(rgb1.get(), rgb4.get())); + REPORTER_ASSERT(r, !SkColorSpace::Equals(z30.get(), rgb4.get())); + REPORTER_ASSERT(r, !SkColorSpace::Equals(srgb.get(), rgb4.get())); } static inline bool matrix_almost_equal(const SkMatrix44& a, const SkMatrix44& b) { diff --git a/tests/SurfaceTest.cpp b/tests/SurfaceTest.cpp index a12630389e..483a115d13 100644 --- a/tests/SurfaceTest.cpp +++ b/tests/SurfaceTest.cpp @@ -926,7 +926,10 @@ static void test_surface_creation_and_snapshot_with_color_space( auto adobeColorSpace = SkColorSpace::MakeNamed(SkColorSpace::kAdobeRGB_Named); const SkMatrix44* srgbMatrix = as_CSB(srgbColorSpace)->toXYZD50(); SkASSERT(srgbMatrix); - const float oddGamma[] = { 2.4f, 2.4f, 2.4f }; + SkColorSpaceTransferFn oddGamma; + oddGamma.fA = 1.0f; + oddGamma.fB = oddGamma.fC = oddGamma.fD = oddGamma.fE = oddGamma.fF = 0.0f; + oddGamma.fG = 4.0f; auto oddColorSpace = SkColorSpace::MakeRGB(oddGamma, *srgbMatrix); auto linearColorSpace = SkColorSpace::MakeNamed(SkColorSpace::kSRGBLinear_Named); |