Index: src/core/SkColorSpace.cpp |
diff --git a/src/core/SkColorSpace.cpp b/src/core/SkColorSpace.cpp |
index 43c424f1dca8b0cf9b004f29b22ffd1b4d1585a0..3ee186d0136df13261191d7b00140fc6bf16bfc0 100644 |
--- a/src/core/SkColorSpace.cpp |
+++ b/src/core/SkColorSpace.cpp |
@@ -12,50 +12,44 @@ void SkFloat3::dump() const { |
SkDebugf("[%7.4f %7.4f %7.4f]\n", fVec[0], fVec[1], fVec[2]); |
} |
-void SkFloat3x3::dump() const { |
- SkDebugf("[%7.4f %7.4f %7.4f] [%7.4f %7.4f %7.4f] [%7.4f %7.4f %7.4f]\n", |
- fMat[0], fMat[1], fMat[2], |
- fMat[3], fMat[4], fMat[5], |
- fMat[6], fMat[7], fMat[8]); |
-} |
- |
////////////////////////////////////////////////////////////////////////////////////////////////// |
static int32_t gUniqueColorSpaceID; |
-SkColorSpace::SkColorSpace(const SkFloat3& gamma, const SkFloat3x3& toXYZD50, Named named) |
+SkColorSpace::SkColorSpace(const SkFloat3& gamma, const SkMatrix44& toXYZD50, Named named) |
: fGamma(gamma) |
, fToXYZD50(toXYZD50) |
- , fToXYZOffset({{ 0.0f, 0.0f, 0.0f }}) |
, fUniqueID(sk_atomic_inc(&gUniqueColorSpaceID)) |
, fNamed(named) |
{} |
SkColorSpace::SkColorSpace(SkColorLookUpTable colorLUT, const SkFloat3& gamma, |
- const SkFloat3x3& toXYZD50, const SkFloat3& toXYZOffset) |
+ const SkMatrix44& toXYZD50) |
: fColorLUT(std::move(colorLUT)) |
, fGamma(gamma) |
, fToXYZD50(toXYZD50) |
- , fToXYZOffset(toXYZOffset) |
, fUniqueID(sk_atomic_inc(&gUniqueColorSpaceID)) |
, fNamed(kUnknown_Named) |
{} |
-sk_sp<SkColorSpace> SkColorSpace::NewRGB(const SkFloat3x3& toXYZD50, const SkFloat3& gamma) { |
+sk_sp<SkColorSpace> SkColorSpace::NewRGB(const SkMatrix44& toXYZD50, const SkFloat3& gamma) { |
return sk_sp<SkColorSpace>(new SkColorSpace(gamma, toXYZD50, kUnknown_Named)); |
} |
const SkFloat3 gSRGB_gamma {{ 2.2f, 2.2f, 2.2f }}; |
-const SkFloat3x3 gSRGB_toXYZD50 {{ |
+const float gSRGB_toXYZD50[9] { |
0.4358f, 0.2224f, 0.0139f, // * R |
0.3853f, 0.7170f, 0.0971f, // * G |
0.1430f, 0.0606f, 0.7139f, // * B |
-}}; |
+}; |
sk_sp<SkColorSpace> SkColorSpace::NewNamed(Named named) { |
switch (named) { |
- case kSRGB_Named: |
- return sk_sp<SkColorSpace>(new SkColorSpace(gSRGB_gamma, gSRGB_toXYZD50, kSRGB_Named)); |
+ case kSRGB_Named: { |
+ SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor); |
+ srgbToxyzD50.set3x3ColMajorf(gSRGB_toXYZD50); |
+ return sk_sp<SkColorSpace>(new SkColorSpace(gSRGB_gamma, srgbToxyzD50, kSRGB_Named)); |
+ } |
default: |
break; |
} |
@@ -420,29 +414,35 @@ bool load_color_lut(SkColorLookUpTable* colorLUT, uint32_t inputChannels, uint32 |
return true; |
} |
-bool load_matrix(SkFloat3x3* toXYZ, SkFloat3* toXYZOffset, const uint8_t* src, size_t len) { |
+bool load_matrix(SkMatrix44* toXYZ, const uint8_t* src, size_t len) { |
if (len < 48) { |
SkColorSpacePrintf("Matrix tag is too small (%d bytes).", len); |
return false; |
} |
- toXYZ->fMat[0] = SkFixedToFloat(read_big_endian_int(src)); |
- toXYZ->fMat[3] = SkFixedToFloat(read_big_endian_int(src + 4)); |
- toXYZ->fMat[6] = SkFixedToFloat(read_big_endian_int(src + 8)); |
- toXYZ->fMat[1] = SkFixedToFloat(read_big_endian_int(src + 12)); |
- toXYZ->fMat[4] = SkFixedToFloat(read_big_endian_int(src + 16)); |
- toXYZ->fMat[7] = SkFixedToFloat(read_big_endian_int(src + 20)); |
- toXYZ->fMat[2] = SkFixedToFloat(read_big_endian_int(src + 24)); |
- toXYZ->fMat[5] = SkFixedToFloat(read_big_endian_int(src + 28)); |
- toXYZ->fMat[8] = SkFixedToFloat(read_big_endian_int(src + 32)); |
- toXYZOffset->fVec[0] = SkFixedToFloat(read_big_endian_int(src + 36)); |
- toXYZOffset->fVec[1] = SkFixedToFloat(read_big_endian_int(src + 40)); |
- toXYZOffset->fVec[2] = SkFixedToFloat(read_big_endian_int(src + 44)); |
+ float array[16]; |
+ array[ 0] = SkFixedToFloat(read_big_endian_int(src)); |
+ array[ 1] = SkFixedToFloat(read_big_endian_int(src + 4)); |
+ array[ 2] = SkFixedToFloat(read_big_endian_int(src + 8)); |
+ array[ 3] = 0; |
+ array[ 4] = SkFixedToFloat(read_big_endian_int(src + 12)); |
+ array[ 5] = SkFixedToFloat(read_big_endian_int(src + 16)); |
+ array[ 6] = SkFixedToFloat(read_big_endian_int(src + 20)); |
+ array[ 7] = 0; |
+ array[ 8] = SkFixedToFloat(read_big_endian_int(src + 24)); |
+ array[ 9] = SkFixedToFloat(read_big_endian_int(src + 28)); |
+ array[10] = SkFixedToFloat(read_big_endian_int(src + 32)); |
+ array[11] = 0; |
+ array[12] = SkFixedToFloat(read_big_endian_int(src + 36)); // translate R |
+ array[13] = SkFixedToFloat(read_big_endian_int(src + 40)); // translate G |
+ array[14] = SkFixedToFloat(read_big_endian_int(src + 44)); |
+ array[15] = 1; |
+ toXYZ->setColMajorf(array); |
return true; |
} |
-bool load_a2b0(SkColorLookUpTable* colorLUT, SkFloat3* gamma, SkFloat3x3* toXYZ, |
- SkFloat3* toXYZOffset, const uint8_t* src, size_t len) { |
+bool load_a2b0(SkColorLookUpTable* colorLUT, SkFloat3* gamma, SkMatrix44* toXYZ, |
+ const uint8_t* src, size_t len) { |
if (len < 32) { |
SkColorSpacePrintf("A to B tag is too small (%d bytes).", len); |
return false; |
@@ -499,7 +499,7 @@ bool load_a2b0(SkColorLookUpTable* colorLUT, SkFloat3* gamma, SkFloat3x3* toXYZ, |
uint32_t offsetToMatrix = read_big_endian_int(src + 16); |
if (0 != offsetToMatrix && offsetToMatrix < len) { |
- if (!load_matrix(toXYZ, toXYZOffset, src + offsetToMatrix, len - offsetToMatrix)) { |
+ if (!load_matrix(toXYZ, src + offsetToMatrix, len - offsetToMatrix)) { |
SkColorSpacePrintf("Failed to read matrix from A to B tag.\n"); |
} |
} |
@@ -557,10 +557,10 @@ sk_sp<SkColorSpace> SkColorSpace::NewICC(const void* base, size_t len) { |
const ICCTag* g = ICCTag::Find(tags.get(), tagCount, kTAG_gXYZ); |
const ICCTag* b = ICCTag::Find(tags.get(), tagCount, kTAG_bXYZ); |
if (r && g && b) { |
- SkFloat3x3 toXYZ; |
- if (!load_xyz(&toXYZ.fMat[0], r->addr((const uint8_t*) base), r->fLength) || |
- !load_xyz(&toXYZ.fMat[3], g->addr((const uint8_t*) base), g->fLength) || |
- !load_xyz(&toXYZ.fMat[6], b->addr((const uint8_t*) base), b->fLength)) |
+ float toXYZ[9]; |
+ if (!load_xyz(&toXYZ[0], r->addr((const uint8_t*) base), r->fLength) || |
+ !load_xyz(&toXYZ[3], g->addr((const uint8_t*) base), g->fLength) || |
+ !load_xyz(&toXYZ[6], b->addr((const uint8_t*) base), b->fLength)) |
{ |
return_null("Need valid rgb tags for XYZ space"); |
} |
@@ -586,7 +586,10 @@ sk_sp<SkColorSpace> SkColorSpace::NewICC(const void* base, size_t len) { |
{ |
SkColorSpacePrintf("Failed to read B gamma tag.\n"); |
} |
- return SkColorSpace::NewRGB(toXYZ, gamma); |
+ |
+ SkMatrix44 mat(SkMatrix44::kUninitialized_Constructor); |
+ mat.set3x3ColMajorf(toXYZ); |
+ return SkColorSpace::NewRGB(mat, gamma); |
} |
// Recognize color profile specified by A2B0 tag. |
@@ -594,15 +597,13 @@ sk_sp<SkColorSpace> SkColorSpace::NewICC(const void* base, size_t len) { |
if (a2b0) { |
SkColorLookUpTable colorLUT; |
SkFloat3 gamma; |
- SkFloat3x3 toXYZ; |
- SkFloat3 toXYZOffset; |
- if (!load_a2b0(&colorLUT, &gamma, &toXYZ, &toXYZOffset, |
- a2b0->addr((const uint8_t*) base), a2b0->fLength)) { |
+ SkMatrix44 toXYZ(SkMatrix44::kUninitialized_Constructor); |
+ if (!load_a2b0(&colorLUT, &gamma, &toXYZ, a2b0->addr((const uint8_t*) base), |
+ a2b0->fLength)) { |
return_null("Failed to parse A2B0 tag"); |
} |
- return sk_sp<SkColorSpace>(new SkColorSpace(std::move(colorLUT), gamma, toXYZ, |
- toXYZOffset)); |
+ return sk_sp<SkColorSpace>(new SkColorSpace(std::move(colorLUT), gamma, toXYZ)); |
} |
} |