Index: src/core/SkColorSpace.cpp |
diff --git a/src/core/SkColorSpace.cpp b/src/core/SkColorSpace.cpp |
index 90fc96e111ea0eddc2f24a01565aaacb4b36f59c..eba46fc391fcdf69a2e61c2e2855cb6999c8dc45 100644 |
--- a/src/core/SkColorSpace.cpp |
+++ b/src/core/SkColorSpace.cpp |
@@ -113,6 +113,11 @@ sk_sp<SkColorSpace> SkColorSpace_Base::NewRGB(SkGammaNamed gammaNamed, const SkM |
return SkColorSpace::NewNamed(kAdobeRGB_Named); |
} |
break; |
+ case kLinear_SkGammaNamed: |
+ if (xyz_almost_equal(toXYZD50, gSRGB_toXYZD50)) { |
+ return SkColorSpace::NewNamed(kSRGBLinear_Named); |
+ } |
+ break; |
case kNonStandard_SkGammaNamed: |
// This is not allowed. |
return nullptr; |
@@ -136,10 +141,12 @@ sk_sp<SkColorSpace> SkColorSpace::NewRGB(RenderTargetGamma gamma, const SkMatrix |
static SkColorSpace* gAdobeRGB; |
static SkColorSpace* gSRGB; |
+static SkColorSpace* gSRGBLinear; |
sk_sp<SkColorSpace> SkColorSpace::NewNamed(Named named) { |
static SkOnce sRGBOnce; |
static SkOnce adobeRGBOnce; |
+ static SkOnce sRGBLinearOnce; |
switch (named) { |
case kSRGB_Named: { |
@@ -164,6 +171,17 @@ sk_sp<SkColorSpace> SkColorSpace::NewNamed(Named named) { |
}); |
return sk_ref_sp<SkColorSpace>(gAdobeRGB); |
} |
+ case kSRGBLinear_Named: { |
+ sRGBLinearOnce([] { |
+ SkMatrix44 srgbToxyzD50(SkMatrix44::kUninitialized_Constructor); |
+ srgbToxyzD50.set3x3RowMajorf(gSRGB_toXYZD50); |
+ |
+ // Force the mutable type mask to be computed. This avoids races. |
+ (void)srgbToxyzD50.getType(); |
+ gSRGBLinear = new SkColorSpace_Base(kLinear_SkGammaNamed, srgbToxyzD50); |
+ }); |
+ return sk_ref_sp<SkColorSpace>(gSRGBLinear); |
+ } |
default: |
break; |
} |
@@ -273,6 +291,14 @@ size_t SkColorSpace::writeToMemory(void* memory) const { |
ColorSpaceHeader::Pack(k0_Version, kAdobeRGB_Named, |
as_CSB(this)->fGammaNamed, 0); |
} |
+ return sizeof(ColorSpaceHeader); |
Brian Osman
2016/09/27 20:49:49
Unrelated bug fix. (Discovered this while making t
msarett
2016/09/27 20:53:52
+1
|
+ } else if (this == gSRGBLinear) { |
+ if (memory) { |
+ *((ColorSpaceHeader*)memory) = |
+ ColorSpaceHeader::Pack(k0_Version, kSRGBLinear_Named, |
+ as_CSB(this)->fGammaNamed, 0); |
+ } |
+ return sizeof(ColorSpaceHeader); |
} |
// If we have a named gamma, write the enum and the matrix. |