aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--gm/color4f.cpp2
-rw-r--r--gm/gamut.cpp6
-rw-r--r--include/core/SkMatrix44.h4
-rw-r--r--src/codec/SkPngCodec.cpp11
-rw-r--r--src/core/SkColorSpace.cpp20
-rw-r--r--src/core/SkColorSpaceXform.cpp10
-rwxr-xr-xsrc/core/SkColorSpace_ICC.cpp14
-rw-r--r--src/core/SkMatrix44.cpp23
-rw-r--r--src/gpu/GrColorSpaceXform.cpp7
-rw-r--r--tests/ColorSpaceTest.cpp26
-rw-r--r--tools/visualize_color_gamut.cpp22
11 files changed, 72 insertions, 73 deletions
diff --git a/gm/color4f.cpp b/gm/color4f.cpp
index 2f8684293d..8414659db9 100644
--- a/gm/color4f.cpp
+++ b/gm/color4f.cpp
@@ -96,7 +96,7 @@ DEF_SIMPLE_GM(color4shader, canvas, 1024, 260) {
SkMatrix44 mat(SkMatrix44::kUninitialized_Constructor);
// red -> blue, green -> red, blue -> green
- mat.set3x3(0, 1, 0, 0, 0, 1, 1, 0, 0);
+ mat.set3x3(0, 0, 1, 1, 0, 0, 0, 1, 0);
const SkColor4f colors[] {
{ 1, 0, 0, 1 },
diff --git a/gm/gamut.cpp b/gm/gamut.cpp
index a1bea3c54f..595e36b7d2 100644
--- a/gm/gamut.cpp
+++ b/gm/gamut.cpp
@@ -106,9 +106,9 @@ static void draw_gamut_grid(SkCanvas* canvas, SkTArray<SkAutoTDelete<CellRendere
// We want our colors in our wide gamut to be obviously visibly distorted from sRGB, so we use
// Wide Gamut RGB (with sRGB gamma, for HW acceleration) as the working space for this test:
const float gWideGamutRGB_toXYZD50[]{
- 0.7161046f, 0.2581874f, 0.0000000f, // * R
- 0.1009296f, 0.7249378f, 0.0517813f, // * G
- 0.1471858f, 0.0168748f, 0.7734287f, // * B
+ 0.7161046f, 0.1009296f, 0.1471858f, // -> X
+ 0.2581874f, 0.7249378f, 0.0168748f, // -> Y
+ 0.0000000f, 0.0517813f, 0.7734287f, // -> Z
};
SkMatrix44 wideGamutRGB_toXYZD50(SkMatrix44::kUninitialized_Constructor);
diff --git a/include/core/SkMatrix44.h b/include/core/SkMatrix44.h
index 6b5e65d072..9820ee58cd 100644
--- a/include/core/SkMatrix44.h
+++ b/include/core/SkMatrix44.h
@@ -457,8 +457,8 @@ private:
kAllPublic_Masks = 0xF
};
- void as4x3ColMajorf(float[]) const;
- void set4x3ColMajorf(const float[]);
+ void as3x4RowMajorf(float[]) const;
+ void set3x4RowMajorf(const float[]);
SkMScalar transX() const { return fMat[3][0]; }
SkMScalar transY() const { return fMat[3][1]; }
diff --git a/src/codec/SkPngCodec.cpp b/src/codec/SkPngCodec.cpp
index 36ec21f0b8..46da29e559 100644
--- a/src/codec/SkPngCodec.cpp
+++ b/src/codec/SkPngCodec.cpp
@@ -195,9 +195,9 @@ static float png_inverted_fixed_point_to_float(png_fixed_point x) {
}
static constexpr float gSRGB_toXYZD50[] {
- 0.4358f, 0.2224f, 0.0139f, // * R
- 0.3853f, 0.7170f, 0.0971f, // * G
- 0.1430f, 0.0606f, 0.7139f, // * B
+ 0.4358f, 0.3853f, 0.1430f, // Rx, Gx, Bx
+ 0.2224f, 0.7170f, 0.0606f, // Ry, Gy, Gz
+ 0.0139f, 0.0971f, 0.7139f, // Rz, Gz, Bz
};
static bool convert_to_D50(SkMatrix44* toXYZD50, float toXYZ[9], float whitePoint[2]) {
@@ -251,8 +251,9 @@ static bool convert_to_D50(SkMatrix44* toXYZD50, float toXYZ[9], float whitePoin
toXYZ[8]);
toXYZ3x3.postConcat(DXToD50);
- toXYZD50->set3x3(toXYZ3x3[0], toXYZ3x3[1], toXYZ3x3[2], toXYZ3x3[3], toXYZ3x3[4], toXYZ3x3[5],
- toXYZ3x3[6], toXYZ3x3[7], toXYZ3x3[8]);
+ toXYZD50->set3x3(toXYZ3x3[0], toXYZ3x3[3], toXYZ3x3[6],
+ toXYZ3x3[1], toXYZ3x3[4], toXYZ3x3[7],
+ toXYZ3x3[2], toXYZ3x3[5], toXYZ3x3[8]);
return true;
}
diff --git a/src/core/SkColorSpace.cpp b/src/core/SkColorSpace.cpp
index 9f04de0537..02f03cee4b 100644
--- a/src/core/SkColorSpace.cpp
+++ b/src/core/SkColorSpace.cpp
@@ -34,15 +34,15 @@ SkColorSpace_Base::SkColorSpace_Base(sk_sp<SkColorLookUpTable> colorLUT, SkGamma
{}
static constexpr float gSRGB_toXYZD50[] {
- 0.4358f, 0.2224f, 0.0139f, // * R
- 0.3853f, 0.7170f, 0.0971f, // * G
- 0.1430f, 0.0606f, 0.7139f, // * B
+ 0.4358f, 0.3853f, 0.1430f, // Rx, Gx, Bx
+ 0.2224f, 0.7170f, 0.0606f, // Ry, Gy, Gz
+ 0.0139f, 0.0971f, 0.7139f, // Rz, Gz, Bz
};
static constexpr float gAdobeRGB_toXYZD50[] {
- 0.6098f, 0.3111f, 0.0195f, // * R
- 0.2052f, 0.6257f, 0.0609f, // * G
- 0.1492f, 0.0632f, 0.7448f, // * B
+ 0.6098f, 0.2052f, 0.1492f, // Rx, Gx, Bx
+ 0.3111f, 0.6257f, 0.0632f, // Ry, Gy, By
+ 0.0195f, 0.0609f, 0.7448f, // Rz, Gz, Bz
};
/**
@@ -281,7 +281,7 @@ size_t SkColorSpace::writeToMemory(void* memory) const {
ColorSpaceHeader::Pack(k0_Version, 0, as_CSB(this)->fGammaNamed,
ColorSpaceHeader::kMatrix_Flag);
memory = SkTAddOffset<void>(memory, sizeof(ColorSpaceHeader));
- fToXYZD50.as4x3ColMajorf((float*) memory);
+ fToXYZD50.as3x4RowMajorf((float*) memory);
}
return sizeof(ColorSpaceHeader) + 12 * sizeof(float);
}
@@ -303,7 +303,7 @@ size_t SkColorSpace::writeToMemory(void* memory) const {
*(((float*) memory) + 2) = gammas->fBlueData.fValue;
memory = SkTAddOffset<void>(memory, 3 * sizeof(float));
- fToXYZD50.as4x3ColMajorf((float*) memory);
+ fToXYZD50.as3x4RowMajorf((float*) memory);
}
return sizeof(ColorSpaceHeader) + 15 * sizeof(float);
}
@@ -362,7 +362,7 @@ sk_sp<SkColorSpace> SkColorSpace::Deserialize(const void* data, size_t length) {
}
SkMatrix44 toXYZ(SkMatrix44::kUninitialized_Constructor);
- toXYZ.set4x3ColMajorf((const float*) data);
+ toXYZ.set3x4RowMajorf((const float*) data);
return SkColorSpace_Base::NewRGB((SkGammaNamed) header.fGammaNamed, toXYZ);
}
default:
@@ -396,7 +396,7 @@ sk_sp<SkColorSpace> SkColorSpace::Deserialize(const void* data, size_t length) {
data = SkTAddOffset<const void>(data, 3 * sizeof(float));
SkMatrix44 toXYZ(SkMatrix44::kUninitialized_Constructor);
- toXYZ.set4x3ColMajorf((const float*) data);
+ toXYZ.set3x4RowMajorf((const float*) data);
return SkColorSpace_Base::NewRGB(gammas, toXYZ);
}
default:
diff --git a/src/core/SkColorSpaceXform.cpp b/src/core/SkColorSpaceXform.cpp
index d43cb56adc..697169f3f8 100644
--- a/src/core/SkColorSpaceXform.cpp
+++ b/src/core/SkColorSpaceXform.cpp
@@ -328,12 +328,6 @@ static void build_gamma_tables(const T* outGammaTables[3], T* gammaTableStorage,
///////////////////////////////////////////////////////////////////////////////////////////////////
-static inline void compute_gamut_xform(SkMatrix44* srcToDst, const SkColorSpace* src,
- const SkColorSpace* dst) {
- *srcToDst = as_CSB(dst)->fromXYZD50();
- srcToDst->postConcat(src->toXYZD50());
-}
-
static inline bool is_almost_identity(const SkMatrix44& srcToDst) {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
@@ -361,7 +355,7 @@ std::unique_ptr<SkColorSpaceXform> SkColorSpaceXform::New(const sk_sp<SkColorSpa
srcToDst.setIdentity();
csm = kFull_ColorSpaceMatch;
} else {
- compute_gamut_xform(&srcToDst, srcSpace.get(), dstSpace.get());
+ srcToDst.setConcat(as_CSB(dstSpace)->fromXYZD50(), srcSpace->toXYZD50());
if (is_almost_identity(srcToDst)) {
srcToDst.setIdentity();
@@ -984,7 +978,7 @@ SkColorSpaceXform_Base<kDst, kCSM>::SkColorSpaceXform_Base(const sk_sp<SkColorSp
const sk_sp<SkColorSpace>& dstSpace)
: fColorLUT(sk_ref_sp((SkColorLookUpTable*) as_CSB(srcSpace)->colorLUT()))
{
- srcToDst.asRowMajorf(fSrcToDst);
+ srcToDst.asColMajorf(fSrcToDst);
build_gamma_tables(fSrcGammaTables, fSrcGammaTableStorage, 256, srcSpace, kToLinear);
build_gamma_tables(fDstGammaTables, fDstGammaTableStorage, kDstGammaTableSize, dstSpace,
kFromLinear);
diff --git a/src/core/SkColorSpace_ICC.cpp b/src/core/SkColorSpace_ICC.cpp
index 27d947b54b..4ef9f2b0a8 100755
--- a/src/core/SkColorSpace_ICC.cpp
+++ b/src/core/SkColorSpace_ICC.cpp
@@ -714,7 +714,7 @@ static bool load_matrix(SkMatrix44* toXYZ, const uint8_t* src, size_t len) {
array[13] = 0.0f;
array[14] = 0.0f;
array[15] = 1.0f;
- toXYZ->setColMajorf(array);
+ toXYZ->setRowMajorf(array);
return true;
}
@@ -962,7 +962,9 @@ sk_sp<SkColorSpace> SkColorSpace::NewICC(const void* input, size_t len) {
return_null("Need valid rgb tags for XYZ space");
}
SkMatrix44 mat(SkMatrix44::kUninitialized_Constructor);
- mat.set3x3RowMajorf(toXYZ);
+ mat.set3x3(toXYZ[0], toXYZ[1], toXYZ[2],
+ toXYZ[3], toXYZ[4], toXYZ[5],
+ toXYZ[6], toXYZ[7], toXYZ[8]);
r = ICCTag::Find(tags.get(), tagCount, kTAG_rTRC);
g = ICCTag::Find(tags.get(), tagCount, kTAG_gTRC);
@@ -1213,12 +1215,12 @@ static constexpr uint32_t gEmptyTextTag[3] {
0, // Zero records
};
-static void write_xyz_tag(uint32_t* ptr, const SkMatrix44& toXYZ, int row) {
+static void write_xyz_tag(uint32_t* ptr, const SkMatrix44& toXYZ, int col) {
ptr[0] = SkEndian_SwapBE32(kXYZ_PCSSpace);
ptr[1] = 0;
- ptr[2] = SkEndian_SwapBE32(SkFloatToFixed(toXYZ.getFloat(row, 0)));
- ptr[3] = SkEndian_SwapBE32(SkFloatToFixed(toXYZ.getFloat(row, 1)));
- ptr[4] = SkEndian_SwapBE32(SkFloatToFixed(toXYZ.getFloat(row, 2)));
+ ptr[2] = SkEndian_SwapBE32(SkFloatToFixed(toXYZ.getFloat(0, col)));
+ ptr[3] = SkEndian_SwapBE32(SkFloatToFixed(toXYZ.getFloat(1, col)));
+ ptr[4] = SkEndian_SwapBE32(SkFloatToFixed(toXYZ.getFloat(2, col)));
}
static void write_trc_tag(uint32_t* ptr, float value) {
diff --git a/src/core/SkMatrix44.cpp b/src/core/SkMatrix44.cpp
index 83c1adc673..818f23af5a 100644
--- a/src/core/SkMatrix44.cpp
+++ b/src/core/SkMatrix44.cpp
@@ -85,15 +85,10 @@ void SkMatrix44::asColMajorf(float dst[]) const {
#endif
}
-void SkMatrix44::as4x3ColMajorf(float dst[]) const {
- const SkMScalar* src = &fMat[0][0];
-#ifdef SK_MSCALAR_IS_DOUBLE
- for (int i = 0; i < 12; ++i) {
- dst[i] = SkMScalarToFloat(src[i]);
- }
-#elif defined SK_MSCALAR_IS_FLOAT
- memcpy(dst, src, 12 * sizeof(float));
-#endif
+void SkMatrix44::as3x4RowMajorf(float dst[]) const {
+ dst[0] = fMat[0][0]; dst[1] = fMat[1][0]; dst[2] = fMat[2][0]; dst[3] = fMat[3][0];
+ dst[4] = fMat[0][1]; dst[5] = fMat[1][1]; dst[6] = fMat[2][1]; dst[7] = fMat[3][1];
+ dst[8] = fMat[0][2]; dst[9] = fMat[1][2]; dst[10] = fMat[2][2]; dst[11] = fMat[3][2];
}
void SkMatrix44::asColMajord(double dst[]) const {
@@ -228,11 +223,11 @@ void SkMatrix44::set3x3RowMajorf(const float src[]) {
this->dirtyTypeMask();
}
-void SkMatrix44::set4x3ColMajorf(const float src[]) {
- fMat[0][0] = src[0]; fMat[0][1] = src[1]; fMat[0][2] = src[2]; fMat[0][3] = src[3];
- fMat[1][0] = src[4]; fMat[1][1] = src[5]; fMat[1][2] = src[6]; fMat[1][3] = src[7];
- fMat[2][0] = src[8]; fMat[2][1] = src[9]; fMat[2][2] = src[10]; fMat[2][3] = src[11];
- fMat[3][0] = 0; fMat[3][1] = 0; fMat[3][2] = 0; fMat[3][3] = 1;
+void SkMatrix44::set3x4RowMajorf(const float src[]) {
+ fMat[0][0] = src[0]; fMat[1][0] = src[1]; fMat[2][0] = src[2]; fMat[3][0] = src[3];
+ fMat[0][1] = src[4]; fMat[1][1] = src[5]; fMat[2][1] = src[6]; fMat[3][1] = src[7];
+ fMat[0][2] = src[8]; fMat[1][2] = src[9]; fMat[2][2] = src[10]; fMat[3][2] = src[11];
+ fMat[0][3] = 0; fMat[1][3] = 0; fMat[2][3] = 0; fMat[3][3] = 1;
this->dirtyTypeMask();
}
diff --git a/src/gpu/GrColorSpaceXform.cpp b/src/gpu/GrColorSpaceXform.cpp
index 8ff6fda0cb..1eb7328356 100644
--- a/src/gpu/GrColorSpaceXform.cpp
+++ b/src/gpu/GrColorSpaceXform.cpp
@@ -37,7 +37,8 @@ static inline bool matrix_is_almost_identity(const SkMatrix44& m,
GrColorSpaceXform::GrColorSpaceXform(const SkMatrix44& srcToDst, SkAlphaType srcAlphaType)
: fSrcAlphaType(srcAlphaType) {
- srcToDst.asColMajorf(fSrcToDst);
+ // TODO: Fix this, and store things as column major!
+ srcToDst.asRowMajorf(fSrcToDst);
}
sk_sp<GrColorSpaceXform> GrColorSpaceXform::Make(SkColorSpace* src, SkColorSpace* dst,
@@ -52,8 +53,8 @@ sk_sp<GrColorSpaceXform> GrColorSpaceXform::Make(SkColorSpace* src, SkColorSpace
return nullptr;
}
- SkMatrix44 srcToDst = as_CSB(dst)->fromXYZD50();
- srcToDst.postConcat(src->toXYZD50());
+ SkMatrix44 srcToDst(SkMatrix44::kUninitialized_Constructor);
+ srcToDst.setConcat(as_CSB(dst)->fromXYZD50(), src->toXYZD50());
if (matrix_is_almost_identity(srcToDst)) {
return nullptr;
diff --git a/tests/ColorSpaceTest.cpp b/tests/ColorSpaceTest.cpp
index 969e0929a4..4a64460370 100644
--- a/tests/ColorSpaceTest.cpp
+++ b/tests/ColorSpaceTest.cpp
@@ -30,12 +30,13 @@ static void test_space(skiatest::Reporter* r, SkColorSpace* space,
0, 1, 0, 1,
0, 0, 1, 1,
};
+ const float* ref[3] = { red, green, blue };
float dst[4];
for (int i = 0; i < 3; ++i) {
mat.mapScalars(&src[i*4], dst);
- REPORTER_ASSERT(r, almost_equal(red[i], dst[0]));
- REPORTER_ASSERT(r, almost_equal(green[i], dst[1]));
- REPORTER_ASSERT(r, almost_equal(blue[i], dst[2]));
+ REPORTER_ASSERT(r, almost_equal(ref[i][0], dst[0]));
+ REPORTER_ASSERT(r, almost_equal(ref[i][1], dst[1]));
+ REPORTER_ASSERT(r, almost_equal(ref[i][2], dst[2]));
}
}
@@ -63,20 +64,26 @@ static void test_path(skiatest::Reporter* r, const char* path,
test_space(r, colorSpace, red, green, blue, expectedGamma);
}
-const float g_sRGB_XYZ[] = { 0.4358f, 0.2224f, 0.0139f, // R
- 0.3853f, 0.7170f, 0.0971f, // G
- 0.1430f, 0.0606f, 0.7139f }; // B
+static constexpr float g_sRGB_XYZ[]{
+ 0.4358f, 0.3853f, 0.1430f, // Rx, Gx, Bx
+ 0.2224f, 0.7170f, 0.0606f, // Ry, Gy, Gz
+ 0.0139f, 0.0971f, 0.7139f, // Rz, Gz, Bz
+};
+
+static constexpr float g_sRGB_R[]{ 0.4358f, 0.2224f, 0.0139f };
+static constexpr float g_sRGB_G[]{ 0.3853f, 0.7170f, 0.0971f };
+static constexpr float g_sRGB_B[]{ 0.1430f, 0.0606f, 0.7139f };
DEF_TEST(ColorSpace_sRGB, r) {
test_space(r, SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named).get(),
- g_sRGB_XYZ, &g_sRGB_XYZ[3], &g_sRGB_XYZ[6], kSRGB_SkGammaNamed);
+ g_sRGB_R, g_sRGB_G, g_sRGB_B, kSRGB_SkGammaNamed);
}
DEF_TEST(ColorSpaceParseICCProfiles, r) {
#if (PNG_LIBPNG_VER_MAJOR > 1) || (PNG_LIBPNG_VER_MAJOR == 1 && PNG_LIBPNG_VER_MINOR >= 6)
- test_path(r, "color_wheel_with_profile.png", &g_sRGB_XYZ[0], &g_sRGB_XYZ[3], &g_sRGB_XYZ[6],
+ test_path(r, "color_wheel_with_profile.png", g_sRGB_R, g_sRGB_G, g_sRGB_B,
kSRGB_SkGammaNamed);
#endif
@@ -125,8 +132,7 @@ DEF_TEST(ColorSpaceWriteICC, r) {
sk_sp<SkColorSpace> namedColorSpace = SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named);
sk_sp<SkData> namedData = ColorSpaceTest::WriteToICC(namedColorSpace.get());
sk_sp<SkColorSpace> iccColorSpace = SkColorSpace::NewICC(namedData->data(), namedData->size());
- test_space(r, iccColorSpace.get(), g_sRGB_XYZ, &g_sRGB_XYZ[3], &g_sRGB_XYZ[6],
- k2Dot2Curve_SkGammaNamed);
+ test_space(r, iccColorSpace.get(), g_sRGB_R, g_sRGB_G, g_sRGB_B, k2Dot2Curve_SkGammaNamed);
// FIXME (msarett): Test disabled. sRGB profiles are written approximately as 2.2f curves.
// REPORTER_ASSERT(r, iccColorSpace == namedColorSpace);
diff --git a/tools/visualize_color_gamut.cpp b/tools/visualize_color_gamut.cpp
index a0b8b82c65..cc15601b7d 100644
--- a/tools/visualize_color_gamut.cpp
+++ b/tools/visualize_color_gamut.cpp
@@ -32,15 +32,15 @@ static void load_gamut(SkPoint rgb[], const SkMatrix44& xyz) {
// rx = rX / (rX + rY + rZ)
// ry = rX / (rX + rY + rZ)
// gx, gy, bx, and gy are calulcated similarly.
- float rSum = xyz.get(0, 0) + xyz.get(0, 1) + xyz.get(0, 2);
- float gSum = xyz.get(1, 0) + xyz.get(1, 1) + xyz.get(1, 2);
- float bSum = xyz.get(2, 0) + xyz.get(2, 1) + xyz.get(2, 2);
+ float rSum = xyz.get(0, 0) + xyz.get(1, 0) + xyz.get(2, 0);
+ float gSum = xyz.get(0, 1) + xyz.get(1, 1) + xyz.get(2, 1);
+ float bSum = xyz.get(0, 2) + xyz.get(1, 2) + xyz.get(2, 2);
rgb[0].fX = xyz.get(0, 0) / rSum;
- rgb[0].fY = xyz.get(0, 1) / rSum;
- rgb[1].fX = xyz.get(1, 0) / gSum;
+ rgb[0].fY = xyz.get(1, 0) / rSum;
+ rgb[1].fX = xyz.get(0, 1) / gSum;
rgb[1].fY = xyz.get(1, 1) / gSum;
- rgb[2].fX = xyz.get(2, 0) / bSum;
- rgb[2].fY = xyz.get(2, 1) / bSum;
+ rgb[2].fX = xyz.get(0, 2) / bSum;
+ rgb[2].fY = xyz.get(1, 2) / bSum;
}
/**
@@ -57,10 +57,10 @@ static void draw_gamut(SkCanvas* canvas, const SkMatrix44& xyz, const char* name
bool label) {
// Report the XYZ values.
SkDebugf("%s\n", name);
- SkDebugf(" X Y Z\n");
- SkDebugf("Red %.3f %.3f %.3f\n", xyz.get(0, 0), xyz.get(0, 1), xyz.get(0, 2));
- SkDebugf("Green %.3f %.3f %.3f\n", xyz.get(1, 0), xyz.get(1, 1), xyz.get(1, 2));
- SkDebugf("Blue %.3f %.3f %.3f\n", xyz.get(2, 0), xyz.get(2, 1), xyz.get(2, 2));
+ SkDebugf(" R G B\n");
+ SkDebugf("X %.3f %.3f %.3f\n", xyz.get(0, 0), xyz.get(0, 1), xyz.get(0, 2));
+ SkDebugf("Y %.3f %.3f %.3f\n", xyz.get(1, 0), xyz.get(1, 1), xyz.get(1, 2));
+ SkDebugf("Z %.3f %.3f %.3f\n", xyz.get(2, 0), xyz.get(2, 1), xyz.get(2, 2));
// Calculate the points in the gamut from the XYZ values.
SkPoint rgb[4];