aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--bench/ColorCodecBench.cpp7
-rw-r--r--include/core/SkColorSpace.h4
-rw-r--r--src/codec/SkPngCodec.cpp23
-rw-r--r--src/core/SkColorSpace.cpp127
-rw-r--r--tests/ColorSpaceTest.cpp18
-rw-r--r--tests/SurfaceTest.cpp5
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);