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

Unified Diff: src/core/SkColorSpace.cpp

Issue 2067833003: Differentiate between sRGBGamma and 2Dot2Gamma (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Fix DefaultXform Created 4 years, 6 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 | « src/codec/SkPngCodec.cpp ('k') | src/core/SkColorSpaceXform.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/core/SkColorSpace.cpp
diff --git a/src/core/SkColorSpace.cpp b/src/core/SkColorSpace.cpp
index 69fada23dfe8ba0a171b7c29ab870c9ae2ed6167..ec8de725c129fdf79c400a1784771a2ab45eed81 100644
--- a/src/core/SkColorSpace.cpp
+++ b/src/core/SkColorSpace.cpp
@@ -10,6 +10,8 @@
#include "SkEndian.h"
#include "SkOnce.h"
+#define SkColorSpacePrintf(...)
+
static bool color_space_almost_equal(float a, float b) {
return SkTAbs(a - b) < 0.01f;
}
@@ -22,18 +24,10 @@ SkColorSpace::SkColorSpace(GammaNamed gammaNamed, const SkMatrix44& toXYZD50, Na
, fNamed(named)
{}
-SkColorSpace_Base::SkColorSpace_Base(sk_sp<SkGammas> gammas, const SkMatrix44& toXYZD50,
- Named named, sk_sp<SkData> profileData)
- : INHERITED(kNonStandard_GammaNamed, toXYZD50, named)
- , fGammas(std::move(gammas))
- , fProfileData(std::move(profileData))
-{}
-
-SkColorSpace_Base::SkColorSpace_Base(sk_sp<SkGammas> gammas, GammaNamed gammaNamed,
- const SkMatrix44& toXYZD50, Named named,
+SkColorSpace_Base::SkColorSpace_Base(GammaNamed gammaNamed, const SkMatrix44& toXYZD50, Named named,
sk_sp<SkData> profileData)
: INHERITED(gammaNamed, toXYZD50, named)
- , fGammas(std::move(gammas))
+ , fGammas(nullptr)
, fProfileData(std::move(profileData))
{}
@@ -82,52 +76,61 @@ static bool xyz_almost_equal(const SkMatrix44& toXYZD50, const float* standard)
color_space_almost_equal(toXYZD50.getFloat(3, 3), 1.0f);
}
-static SkOnce g2Dot2CurveGammasOnce;
-static SkGammas* g2Dot2CurveGammas;
-static SkOnce gLinearGammasOnce;
-static SkGammas* gLinearGammas;
+static void set_gamma_value(SkGammaCurve* gamma, float value) {
+ if (color_space_almost_equal(2.2f, value)) {
+ gamma->fNamed = SkColorSpace::k2Dot2Curve_GammaNamed;
+ } else if (color_space_almost_equal(1.0f, value)) {
+ gamma->fNamed = SkColorSpace::kLinear_GammaNamed;
+ } else if (color_space_almost_equal(0.0f, value)) {
+ SkColorSpacePrintf("Treating invalid zero gamma as linear.");
+ gamma->fNamed = SkColorSpace::kLinear_GammaNamed;
+ } else {
+ gamma->fValue = value;
+ }
+}
+
+sk_sp<SkColorSpace> SkColorSpace_Base::NewRGB(float values[3], const SkMatrix44& toXYZD50) {
+ SkGammaCurve curves[3];
+ set_gamma_value(&curves[0], values[0]);
+ set_gamma_value(&curves[1], values[1]);
+ set_gamma_value(&curves[2], values[2]);
+
+ GammaNamed gammaNamed = SkGammas::Named(curves);
+ if (kNonStandard_GammaNamed == gammaNamed) {
+ sk_sp<SkGammas> gammas(new SkGammas(std::move(curves[0]), std::move(curves[1]),
+ std::move(curves[2])));
+ return sk_sp<SkColorSpace>(new SkColorSpace_Base(nullptr, gammas, toXYZD50, nullptr));
+ }
-sk_sp<SkColorSpace> SkColorSpace::NewRGB(const float gammaVals[3], const SkMatrix44& toXYZD50) {
- return SkColorSpace_Base::NewRGB(gammaVals, toXYZD50, nullptr);
+ return SkColorSpace_Base::NewRGB(gammaNamed, toXYZD50, nullptr);
}
-sk_sp<SkColorSpace> SkColorSpace_Base::NewRGB(const float gammaVals[3], const SkMatrix44& toXYZD50,
+sk_sp<SkColorSpace> SkColorSpace_Base::NewRGB(GammaNamed gammaNamed, const SkMatrix44& toXYZD50,
sk_sp<SkData> profileData) {
- sk_sp<SkGammas> gammas = nullptr;
- GammaNamed gammaNamed = kNonStandard_GammaNamed;
-
- // Check if we really have sRGB or Adobe RGB
- if (color_space_almost_equal(2.2f, gammaVals[0]) &&
- color_space_almost_equal(2.2f, gammaVals[1]) &&
- color_space_almost_equal(2.2f, gammaVals[2]))
- {
- g2Dot2CurveGammasOnce([] {
- g2Dot2CurveGammas = new SkGammas(2.2f, 2.2f, 2.2f);
- });
- gammas = sk_ref_sp(g2Dot2CurveGammas);
- gammaNamed = k2Dot2Curve_GammaNamed;
-
- if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) {
- return SkColorSpace::NewNamed(kSRGB_Named);
- } else if (xyz_almost_equal(toXYZD50, gAdobeRGB_toXYZD50)) {
- return SkColorSpace::NewNamed(kAdobeRGB_Named);
- }
- } else if (color_space_almost_equal(1.0f, gammaVals[0]) &&
- color_space_almost_equal(1.0f, gammaVals[1]) &&
- color_space_almost_equal(1.0f, gammaVals[2]))
- {
- gLinearGammasOnce([] {
- gLinearGammas = new SkGammas(1.0f, 1.0f, 1.0f);
- });
- gammas = sk_ref_sp(gLinearGammas);
- gammaNamed = kLinear_GammaNamed;
+ switch (gammaNamed) {
+ case kSRGB_GammaNamed:
+ if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) {
+ return SkColorSpace::NewNamed(kSRGB_Named);
+ }
+ break;
+ case k2Dot2Curve_GammaNamed:
+ if (xyz_almost_equal(toXYZD50, gAdobeRGB_toXYZD50)) {
+ return SkColorSpace::NewNamed(kAdobeRGB_Named);
+ }
+ break;
+ case kNonStandard_GammaNamed:
+ // This is not allowed.
+ return nullptr;
+ default:
+ break;
}
- if (!gammas) {
- gammas = sk_sp<SkGammas>(new SkGammas(gammaVals[0], gammaVals[1], gammaVals[2]));
- }
- return sk_sp<SkColorSpace>(new SkColorSpace_Base(gammas, gammaNamed, toXYZD50, kUnknown_Named,
- std::move(profileData)));
+ return sk_sp<SkColorSpace>(new SkColorSpace_Base(gammaNamed, toXYZD50, kUnknown_Named,
+ profileData));
+}
+
+sk_sp<SkColorSpace> SkColorSpace::NewRGB(GammaNamed gammaNamed, const SkMatrix44& toXYZD50) {
+ return SkColorSpace_Base::NewRGB(gammaNamed, toXYZD50, nullptr);
}
sk_sp<SkColorSpace> SkColorSpace::NewNamed(Named named) {
@@ -138,28 +141,18 @@ sk_sp<SkColorSpace> SkColorSpace::NewNamed(Named named) {
switch (named) {
case kSRGB_Named: {
- g2Dot2CurveGammasOnce([] {
- g2Dot2CurveGammas = new SkGammas(2.2f, 2.2f, 2.2f);
- });
-
sRGBOnce([] {
SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor);
srgbToxyzD50.set3x3ColMajorf(gSRGB_toXYZD50);
- sRGB = new SkColorSpace_Base(sk_ref_sp(g2Dot2CurveGammas), k2Dot2Curve_GammaNamed,
- srgbToxyzD50, kSRGB_Named, nullptr);
+ sRGB = new SkColorSpace_Base(kSRGB_GammaNamed, srgbToxyzD50, kSRGB_Named, nullptr);
});
return sk_ref_sp(sRGB);
}
case kAdobeRGB_Named: {
- g2Dot2CurveGammasOnce([] {
- g2Dot2CurveGammas = new SkGammas(2.2f, 2.2f, 2.2f);
- });
-
adobeRGBOnce([] {
SkMatrix44 adobergbToxyzD50(SkMatrix44::kUninitialized_Constructor);
adobergbToxyzD50.set3x3ColMajorf(gAdobeRGB_toXYZD50);
- adobeRGB = new SkColorSpace_Base(sk_ref_sp(g2Dot2CurveGammas),
- k2Dot2Curve_GammaNamed, adobergbToxyzD50,
+ adobeRGB = new SkColorSpace_Base(k2Dot2Curve_GammaNamed, adobergbToxyzD50,
kAdobeRGB_Named, nullptr);
});
return sk_ref_sp(adobeRGB);
@@ -175,8 +168,6 @@ sk_sp<SkColorSpace> SkColorSpace::NewNamed(Named named) {
#include "SkFixed.h"
#include "SkTemplates.h"
-#define SkColorSpacePrintf(...)
-
#define return_if_false(pred, msg) \
do { \
if (!(pred)) { \
@@ -370,7 +361,7 @@ static constexpr uint32_t kTAG_gTRC = SkSetFourByteTag('g', 'T', 'R', 'C');
static constexpr uint32_t kTAG_bTRC = SkSetFourByteTag('b', 'T', 'R', 'C');
static constexpr uint32_t kTAG_A2B0 = SkSetFourByteTag('A', '2', 'B', '0');
-bool load_xyz(float dst[3], const uint8_t* src, size_t len) {
+static bool load_xyz(float dst[3], const uint8_t* src, size_t len) {
if (len < 20) {
SkColorSpacePrintf("XYZ tag is too small (%d bytes)", len);
return false;
@@ -386,7 +377,7 @@ bool load_xyz(float dst[3], const uint8_t* src, size_t len) {
static constexpr uint32_t kTAG_CurveType = SkSetFourByteTag('c', 'u', 'r', 'v');
static constexpr uint32_t kTAG_ParaCurveType = SkSetFourByteTag('p', 'a', 'r', 'a');
-bool load_gammas(SkGammaCurve* gammas, uint32_t numGammas, const uint8_t* src, size_t len) {
+static bool load_gammas(SkGammaCurve* gammas, uint32_t numGammas, const uint8_t* src, size_t len) {
for (uint32_t i = 0; i < numGammas; i++) {
if (len < 12) {
// FIXME (msarett):
@@ -418,7 +409,7 @@ bool load_gammas(SkGammaCurve* gammas, uint32_t numGammas, const uint8_t* src, s
// Some tags require a gamma curve, but the author doesn't actually want
// to transform the data. In this case, it is common to see a curve with
// a count of 0.
- gammas[i].fValue = 1.0f;
+ gammas[i].fNamed = SkColorSpace::kLinear_GammaNamed;
break;
} else if (len < tagBytes) {
SkColorSpacePrintf("gamma tag is too small (%d bytes)", len);
@@ -428,20 +419,16 @@ bool load_gammas(SkGammaCurve* gammas, uint32_t numGammas, const uint8_t* src, s
const uint16_t* table = (const uint16_t*) (src + 12);
if (1 == count) {
// The table entry is the gamma (with a bias of 256).
- uint16_t value = read_big_endian_short((const uint8_t*) table);
- gammas[i].fValue = value / 256.0f;
- if (0.0f == gammas[i].fValue) {
- SkColorSpacePrintf("Cannot have zero gamma value");
- return false;
- }
- SkColorSpacePrintf("gamma %d %g\n", value, gammas[i].fValue);
+ float value = (read_big_endian_short((const uint8_t*) table)) / 256.0f;
+ set_gamma_value(&gammas[i], value);
+ SkColorSpacePrintf("gamma %g\n", value);
break;
}
- // Check for frequently occurring curves and use a fast approximation.
+ // Check for frequently occurring sRGB curves.
// We do this by sampling a few values and see if they match our expectation.
// A more robust solution would be to compare each value in this curve against
- // a 2.2f curve see if we remain below an error threshold. At this time,
+ // an sRGB curve to see if we remain below an error threshold. At this time,
// we haven't seen any images in the wild that make this kind of
// calculation necessary. We encounter identical gamma curves over and
// over again, but relatively few variations.
@@ -454,7 +441,7 @@ bool load_gammas(SkGammaCurve* gammas, uint32_t numGammas, const uint8_t* src, s
14116 == read_big_endian_short((const uint8_t*) &table[513]) &&
34318 == read_big_endian_short((const uint8_t*) &table[768]) &&
65535 == read_big_endian_short((const uint8_t*) &table[1023])) {
- gammas[i].fValue = 2.2f;
+ gammas[i].fNamed = SkColorSpace::kSRGB_GammaNamed;
break;
}
} else if (26 == count) {
@@ -465,7 +452,7 @@ bool load_gammas(SkGammaCurve* gammas, uint32_t numGammas, const uint8_t* src, s
12824 == read_big_endian_short((const uint8_t*) &table[12]) &&
31237 == read_big_endian_short((const uint8_t*) &table[18]) &&
65535 == read_big_endian_short((const uint8_t*) &table[25])) {
- gammas[i].fValue = 2.2f;
+ gammas[i].fNamed = SkColorSpace::kSRGB_GammaNamed;
break;
}
} else if (4096 == count) {
@@ -476,7 +463,7 @@ bool load_gammas(SkGammaCurve* gammas, uint32_t numGammas, const uint8_t* src, s
3342 == read_big_endian_short((const uint8_t*) &table[1025]) &&
14079 == read_big_endian_short((const uint8_t*) &table[2051]) &&
65535 == read_big_endian_short((const uint8_t*) &table[4095])) {
- gammas[i].fValue = 2.2f;
+ gammas[i].fNamed = SkColorSpace::kSRGB_GammaNamed;
break;
}
}
@@ -510,7 +497,7 @@ bool load_gammas(SkGammaCurve* gammas, uint32_t numGammas, const uint8_t* src, s
// Y = X^g
int32_t g = read_big_endian_int(src + 12);
- gammas[i].fValue = SkFixedToFloat(g);
+ set_gamma_value(&gammas[i], SkFixedToFloat(g));
} else {
// Here's where the real parametric gammas start. There are many
// permutations of the same equations.
@@ -607,7 +594,7 @@ bool load_gammas(SkGammaCurve* gammas, uint32_t numGammas, const uint8_t* src, s
color_space_almost_equal(0.0774f, e) &&
color_space_almost_equal(0.0000f, f) &&
color_space_almost_equal(2.4000f, g)) {
- gammas[i].fValue = 2.2f;
+ gammas[i].fNamed = SkColorSpace::kSRGB_GammaNamed;
} else {
// Fail on invalid gammas.
if (d <= 0.0f) {
@@ -648,7 +635,8 @@ bool load_gammas(SkGammaCurve* gammas, uint32_t numGammas, const uint8_t* src, s
}
// Ensure that we have successfully read a gamma representation.
- SkASSERT(gammas[i].isValue() || gammas[i].isTable() || gammas[i].isParametric());
+ SkASSERT(gammas[i].isNamed() || gammas[i].isValue() || gammas[i].isTable() ||
+ gammas[i].isParametric());
// Adjust src and len if there is another gamma curve to load.
if (i != numGammas - 1) {
@@ -796,7 +784,10 @@ bool load_a2b0(SkColorLookUpTable* colorLUT, SkGammaCurve* gammas, SkMatrix44* t
uint32_t offsetToMCurves = read_big_endian_int(src + 20);
if (0 != offsetToMCurves && offsetToMCurves < len) {
if (!load_gammas(gammas, outputChannels, src + offsetToMCurves, len - offsetToMCurves)) {
- SkColorSpacePrintf("Failed to read M curves from A to B tag.\n");
+ SkColorSpacePrintf("Failed to read M curves from A to B tag. Using linear gamma.\n");
+ gammas[0].fNamed = SkColorSpace::kLinear_GammaNamed;
+ gammas[1].fNamed = SkColorSpace::kLinear_GammaNamed;
+ gammas[2].fNamed = SkColorSpace::kLinear_GammaNamed;
}
}
@@ -804,6 +795,7 @@ bool load_a2b0(SkColorLookUpTable* colorLUT, SkGammaCurve* gammas, SkMatrix44* t
if (0 != offsetToMatrix && offsetToMatrix < len) {
if (!load_matrix(toXYZ, src + offsetToMatrix, len - offsetToMatrix)) {
SkColorSpacePrintf("Failed to read matrix from A to B tag.\n");
+ toXYZ->setIdentity();
}
}
@@ -872,6 +864,8 @@ 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.set3x3ColMajorf(toXYZ);
// It is not uncommon to see missing or empty gamma tags. This indicates
// that we should use unit gamma.
@@ -882,32 +876,28 @@ sk_sp<SkColorSpace> SkColorSpace::NewICC(const void* input, size_t len) {
if (!r || !load_gammas(&curves[0], 1, r->addr((const uint8_t*) base), r->fLength))
{
SkColorSpacePrintf("Failed to read R gamma tag.\n");
+ curves[0].fNamed = SkColorSpace::kLinear_GammaNamed;
}
if (!g || !load_gammas(&curves[1], 1, g->addr((const uint8_t*) base), g->fLength))
{
SkColorSpacePrintf("Failed to read G gamma tag.\n");
+ curves[1].fNamed = SkColorSpace::kLinear_GammaNamed;
}
if (!b || !load_gammas(&curves[2], 1, b->addr((const uint8_t*) base), b->fLength))
{
SkColorSpacePrintf("Failed to read B gamma tag.\n");
+ curves[2].fNamed = SkColorSpace::kLinear_GammaNamed;
}
- sk_sp<SkGammas> gammas(new SkGammas(std::move(curves[0]), std::move(curves[1]),
- std::move(curves[2])));
- SkMatrix44 mat(SkMatrix44::kUninitialized_Constructor);
- mat.set3x3ColMajorf(toXYZ);
- if (gammas->isValues()) {
- // When we have values, take advantage of the NewFromRGB initializer.
- // This allows us to check for canonical sRGB and Adobe RGB.
- float gammaVals[3];
- gammaVals[0] = gammas->fRed.fValue;
- gammaVals[1] = gammas->fGreen.fValue;
- gammaVals[2] = gammas->fBlue.fValue;
- return SkColorSpace_Base::NewRGB(gammaVals, mat, std::move(data));
+ GammaNamed gammaNamed = SkGammas::Named(curves);
+ if (kNonStandard_GammaNamed == gammaNamed) {
+ sk_sp<SkGammas> gammas = sk_make_sp<SkGammas>(std::move(curves[0]),
+ std::move(curves[1]),
+ std::move(curves[2]));
+ return sk_sp<SkColorSpace>(new SkColorSpace_Base(nullptr, std::move(gammas),
+ mat, std::move(data)));
} else {
- return sk_sp<SkColorSpace>(new SkColorSpace_Base(std::move(gammas), mat,
- kUnknown_Named,
- std::move(data)));
+ return SkColorSpace_Base::NewRGB(gammaNamed, mat, std::move(data));
}
}
@@ -922,24 +912,17 @@ sk_sp<SkColorSpace> SkColorSpace::NewICC(const void* input, size_t len) {
return_null("Failed to parse A2B0 tag");
}
- sk_sp<SkGammas> gammas(new SkGammas(std::move(curves[0]), std::move(curves[1]),
- std::move(curves[2])));
- if (colorLUT->fTable) {
+ GammaNamed gammaNamed = SkGammas::Named(curves);
+ if (colorLUT->fTable || kNonStandard_GammaNamed == gammaNamed) {
+ sk_sp<SkGammas> gammas = sk_make_sp<SkGammas>(std::move(curves[0]),
+ std::move(curves[1]),
+ std::move(curves[2]));
+
return sk_sp<SkColorSpace>(new SkColorSpace_Base(colorLUT.release(),
std::move(gammas), toXYZ,
std::move(data)));
- } else if (gammas->isValues()) {
- // When we have values, take advantage of the NewFromRGB initializer.
- // This allows us to check for canonical sRGB and Adobe RGB.
- float gammaVals[3];
- gammaVals[0] = gammas->fRed.fValue;
- gammaVals[1] = gammas->fGreen.fValue;
- gammaVals[2] = gammas->fBlue.fValue;
- return SkColorSpace_Base::NewRGB(gammaVals, toXYZ, std::move(data));
} else {
- return sk_sp<SkColorSpace>(new SkColorSpace_Base(std::move(gammas), toXYZ,
- kUnknown_Named,
- std::move(data)));
+ return SkColorSpace_Base::NewRGB(gammaNamed, toXYZ, std::move(data));
}
}
}
@@ -1079,6 +1062,23 @@ static void write_trc_tag(uint32_t* ptr, float value) {
ptr16[1] = 0;
}
+static float get_gamma_value(const SkGammaCurve* curve) {
+ switch (curve->fNamed) {
+ case SkColorSpace::kSRGB_GammaNamed:
+ // FIXME (msarett):
+ // kSRGB cannot be represented by a value. Here we fall through to 2.2f,
+ // which is a close guess. To be more accurate, we need to represent sRGB
+ // gamma with a parametric curve.
+ case SkColorSpace::k2Dot2Curve_GammaNamed:
+ return 2.2f;
+ case SkColorSpace::kLinear_GammaNamed:
+ return 1.0f;
+ default:
+ SkASSERT(curve->isValue());
+ return curve->fValue;
+ }
+}
+
sk_sp<SkData> SkColorSpace_Base::writeToICC() const {
// Return if this object was created from a profile, or if we have already serialized
// the profile.
@@ -1120,15 +1120,42 @@ sk_sp<SkData> SkColorSpace_Base::writeToICC() const {
ptr += kTAG_XYZ_Bytes;
// Write TRC tags
- SkASSERT(as_CSB(this)->fGammas->fRed.isValue());
- write_trc_tag((uint32_t*) ptr, as_CSB(this)->fGammas->fRed.fValue);
- ptr += SkAlign4(kTAG_TRC_Bytes);
- SkASSERT(as_CSB(this)->fGammas->fGreen.isValue());
- write_trc_tag((uint32_t*) ptr, as_CSB(this)->fGammas->fGreen.fValue);
- ptr += SkAlign4(kTAG_TRC_Bytes);
- SkASSERT(as_CSB(this)->fGammas->fBlue.isValue());
- write_trc_tag((uint32_t*) ptr, as_CSB(this)->fGammas->fBlue.fValue);
- ptr += SkAlign4(kTAG_TRC_Bytes);
+ GammaNamed gammaNamed = this->gammaNamed();
+ if (kNonStandard_GammaNamed == gammaNamed) {
+ write_trc_tag((uint32_t*) ptr, get_gamma_value(&as_CSB(this)->fGammas->fRed));
+ ptr += SkAlign4(kTAG_TRC_Bytes);
+ write_trc_tag((uint32_t*) ptr, get_gamma_value(&as_CSB(this)->fGammas->fGreen));
+ ptr += SkAlign4(kTAG_TRC_Bytes);
+ write_trc_tag((uint32_t*) ptr, get_gamma_value(&as_CSB(this)->fGammas->fBlue));
+ ptr += SkAlign4(kTAG_TRC_Bytes);
+ } else {
+ switch (gammaNamed) {
+ case SkColorSpace::kSRGB_GammaNamed:
+ // FIXME (msarett):
+ // kSRGB cannot be represented by a value. Here we fall through to 2.2f,
+ // which is a close guess. To be more accurate, we need to represent sRGB
+ // gamma with a parametric curve.
+ case SkColorSpace::k2Dot2Curve_GammaNamed:
+ write_trc_tag((uint32_t*) ptr, 2.2f);
+ ptr += SkAlign4(kTAG_TRC_Bytes);
+ write_trc_tag((uint32_t*) ptr, 2.2f);
+ ptr += SkAlign4(kTAG_TRC_Bytes);
+ write_trc_tag((uint32_t*) ptr, 2.2f);
+ ptr += SkAlign4(kTAG_TRC_Bytes);
+ break;
+ case SkColorSpace::kLinear_GammaNamed:
+ write_trc_tag((uint32_t*) ptr, 1.0f);
+ ptr += SkAlign4(kTAG_TRC_Bytes);
+ write_trc_tag((uint32_t*) ptr, 1.0f);
+ ptr += SkAlign4(kTAG_TRC_Bytes);
+ write_trc_tag((uint32_t*) ptr, 1.0f);
+ ptr += SkAlign4(kTAG_TRC_Bytes);
+ break;
+ default:
+ SkASSERT(false);
+ break;
+ }
+ }
// Write white point tag
uint32_t* ptr32 = (uint32_t*) ptr;
« no previous file with comments | « src/codec/SkPngCodec.cpp ('k') | src/core/SkColorSpaceXform.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698