Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(69)

Unified Diff: src/codec/SkPngCodec.cpp

Issue 2304753002: Add SkColorSpacePrimaries to help with making D50 matrices (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Fix compile bug Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « include/core/SkColorSpace.h ('k') | src/core/SkColorSpace.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/codec/SkPngCodec.cpp
diff --git a/src/codec/SkPngCodec.cpp b/src/codec/SkPngCodec.cpp
index 1f3a8d96a44a8aa347813775cd239fd8e8afb2ed..d69cf0f20580eaf83153bd39ede309660779f89c 100644
--- a/src/codec/SkPngCodec.cpp
+++ b/src/codec/SkPngCodec.cpp
@@ -322,63 +322,6 @@ static constexpr float gSRGB_toXYZD50[] {
0.0139f, 0.0971f, 0.7139f, // Rz, Gz, Bz
};
-static bool convert_to_D50(SkMatrix44* toXYZD50, float toXYZ[9], float whitePoint[2]) {
- float wX = whitePoint[0];
- float wY = whitePoint[1];
- if (wX < 0.0f || wY < 0.0f || (wX + wY > 1.0f)) {
- return false;
- }
-
- // Calculate the XYZ illuminant. Call this the src illuminant.
- float wZ = 1.0f - wX - wY;
- float scale = 1.0f / wY;
- // TODO (msarett):
- // What are common src illuminants? I'm guessing we will almost always see D65. Should
- // we go ahead and save a precomputed D65->D50 Bradford matrix? Should we exit early if
- // if the src illuminant is D50?
- SkVector3 srcXYZ = SkVector3::Make(wX * scale, 1.0f, wZ * scale);
-
- // The D50 illuminant.
- SkVector3 dstXYZ = SkVector3::Make(0.96422f, 1.0f, 0.82521f);
-
- // Calculate the chromatic adaptation matrix. We will use the Bradford method, thus
- // the matrices below. The Bradford method is used by Adobe and is widely considered
- // to be the best.
- // http://www.brucelindbloom.com/index.html?Eqn_ChromAdapt.html
- SkMatrix mA, mAInv;
- mA.setAll(0.8951f, 0.2664f, -0.1614f, -0.7502f, 1.7135f, 0.0367f, 0.0389f, -0.0685f, 1.0296f);
- mAInv.setAll(0.9869929f, -0.1470543f, 0.1599627f, 0.4323053f, 0.5183603f, 0.0492912f,
- -0.0085287f, 0.0400428f, 0.9684867f);
-
- // Map illuminant into cone response domain.
- SkVector3 srcCone;
- srcCone.fX = mA[0] * srcXYZ.fX + mA[1] * srcXYZ.fY + mA[2] * srcXYZ.fZ;
- srcCone.fY = mA[3] * srcXYZ.fX + mA[4] * srcXYZ.fY + mA[5] * srcXYZ.fZ;
- srcCone.fZ = mA[6] * srcXYZ.fX + mA[7] * srcXYZ.fY + mA[8] * srcXYZ.fZ;
- SkVector3 dstCone;
- dstCone.fX = mA[0] * dstXYZ.fX + mA[1] * dstXYZ.fY + mA[2] * dstXYZ.fZ;
- dstCone.fY = mA[3] * dstXYZ.fX + mA[4] * dstXYZ.fY + mA[5] * dstXYZ.fZ;
- dstCone.fZ = mA[6] * dstXYZ.fX + mA[7] * dstXYZ.fY + mA[8] * dstXYZ.fZ;
-
- SkMatrix DXToD50;
- DXToD50.setIdentity();
- DXToD50[0] = dstCone.fX / srcCone.fX;
- DXToD50[4] = dstCone.fY / srcCone.fY;
- DXToD50[8] = dstCone.fZ / srcCone.fZ;
- DXToD50.postConcat(mAInv);
- DXToD50.preConcat(mA);
-
- SkMatrix toXYZ3x3;
- toXYZ3x3.setAll(toXYZ[0], toXYZ[3], toXYZ[6], toXYZ[1], toXYZ[4], toXYZ[7], toXYZ[2], toXYZ[5],
- toXYZ[8]);
- toXYZ3x3.postConcat(DXToD50);
-
- toXYZD50->set3x3(toXYZ3x3[0], toXYZ3x3[3], toXYZ3x3[6],
- toXYZ3x3[1], toXYZ3x3[4], toXYZ3x3[7],
- toXYZ3x3[2], toXYZ3x3[5], toXYZ3x3[8]);
- return true;
-}
-
#endif // LIBPNG >= 1.6
// Returns a colorSpace object that represents any color space information in
@@ -416,26 +359,24 @@ sk_sp<SkColorSpace> read_color_space(png_structp png_ptr, png_infop info_ptr) {
}
// Next, check for chromaticities.
- png_fixed_point toXYZFixed[9];
- float toXYZ[9];
- png_fixed_point whitePointFixed[2];
- float whitePoint[2];
+ png_fixed_point chrm[8];
png_fixed_point gamma;
float gammas[3];
- if (png_get_cHRM_XYZ_fixed(png_ptr, info_ptr, &toXYZFixed[0], &toXYZFixed[1], &toXYZFixed[2],
- &toXYZFixed[3], &toXYZFixed[4], &toXYZFixed[5], &toXYZFixed[6],
- &toXYZFixed[7], &toXYZFixed[8]) &&
- png_get_cHRM_fixed(png_ptr, info_ptr, &whitePointFixed[0], &whitePointFixed[1], nullptr,
- nullptr, nullptr, nullptr, nullptr, nullptr))
+ 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]))
{
- for (int i = 0; i < 9; i++) {
- toXYZ[i] = png_fixed_point_to_float(toXYZFixed[i]);
- }
- whitePoint[0] = png_fixed_point_to_float(whitePointFixed[0]);
- whitePoint[1] = png_fixed_point_to_float(whitePointFixed[1]);
+ SkColorSpacePrimaries primaries;
+ primaries.fRX = png_fixed_point_to_float(chrm[2]);
+ primaries.fRY = png_fixed_point_to_float(chrm[3]);
+ primaries.fGX = png_fixed_point_to_float(chrm[4]);
+ primaries.fGY = png_fixed_point_to_float(chrm[5]);
+ primaries.fBX = png_fixed_point_to_float(chrm[6]);
+ primaries.fBY = png_fixed_point_to_float(chrm[7]);
+ primaries.fWX = png_fixed_point_to_float(chrm[0]);
+ primaries.fWY = png_fixed_point_to_float(chrm[1]);
SkMatrix44 toXYZD50(SkMatrix44::kUninitialized_Constructor);
- if (!convert_to_D50(&toXYZD50, toXYZ, whitePoint)) {
+ if (!primaries.toXYZD50(&toXYZD50)) {
toXYZD50.set3x3RowMajorf(gSRGB_toXYZD50);
}
« no previous file with comments | « include/core/SkColorSpace.h ('k') | src/core/SkColorSpace.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698