Index: src/core/SkColorSpaceXform.cpp |
diff --git a/src/core/SkColorSpaceXform.cpp b/src/core/SkColorSpaceXform.cpp |
index 50cd9c11e5f0b1ecaf281480d3e57c26148266f7..5e362464b41d5d9470a9795a2eea9e5e23601bf5 100644 |
--- a/src/core/SkColorSpaceXform.cpp |
+++ b/src/core/SkColorSpaceXform.cpp |
@@ -138,9 +138,7 @@ static uint8_t clamp_normalized_float_to_byte(float v) { |
} |
} |
-static const int kDstGammaTableSize = |
- SkColorSpaceXform_Base<kTable_SrcGamma, kTable_DstGamma, kNone_ColorSpaceMatch> |
- ::kDstGammaTableSize; |
+static const int kDstGammaTableSize = SkColorSpaceXform_Base::kDstGammaTableSize; |
static void build_table_linear_to_gamma(uint8_t* outTable, float exponent) { |
float toGammaExp = 1.0f / exponent; |
@@ -256,7 +254,8 @@ static const GammaFns<uint8_t> kFromLinear { |
// Build tables to transform src gamma to linear. |
template <typename T> |
static void build_gamma_tables(const T* outGammaTables[3], T* gammaTableStorage, int gammaTableSize, |
- SkColorSpace* space, const GammaFns<T>& fns, bool gammasAreMatching) |
+ const SkColorSpace* space, const GammaFns<T>& fns, |
+ bool gammasAreMatching) |
{ |
switch (as_CSB(space)->gammaNamed()) { |
case kSRGB_SkGammaNamed: |
@@ -326,6 +325,13 @@ static void build_gamma_tables(const T* outGammaTables[3], T* gammaTableStorage, |
} |
} |
+void SkColorSpaceXform_Base::BuildDstGammaTables(const uint8_t* dstGammaTables[3], |
+ uint8_t* dstStorage, const SkColorSpace* space, |
+ bool gammasAreMatching) { |
+ build_gamma_tables(dstGammaTables, dstStorage, kDstGammaTableSize, space, kFromLinear, |
+ gammasAreMatching); |
+} |
+ |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
static inline bool is_almost_identity(const SkMatrix44& srcToDst) { |
@@ -368,41 +374,41 @@ std::unique_ptr<SkColorSpaceXform> SkColorSpaceXform::New(SkColorSpace* srcSpace |
switch (as_CSB(dstSpace)->gammaNamed()) { |
case kSRGB_SkGammaNamed: |
if (srcSpace->gammaIsLinear()) { |
- return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_Base |
+ return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ |
<kLinear_SrcGamma, kSRGB_DstGamma, kNone_ColorSpaceMatch> |
(srcSpace, srcToDst, dstSpace)); |
} else { |
- return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_Base |
+ return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ |
<kTable_SrcGamma, kSRGB_DstGamma, kNone_ColorSpaceMatch> |
(srcSpace, srcToDst, dstSpace)); |
} |
case k2Dot2Curve_SkGammaNamed: |
if (srcSpace->gammaIsLinear()) { |
- return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_Base |
+ return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ |
<kLinear_SrcGamma, k2Dot2_DstGamma, kNone_ColorSpaceMatch> |
(srcSpace, srcToDst, dstSpace)); |
} else { |
- return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_Base |
+ return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ |
<kTable_SrcGamma, k2Dot2_DstGamma, kNone_ColorSpaceMatch> |
(srcSpace, srcToDst, dstSpace)); |
} |
case kLinear_SkGammaNamed: |
if (srcSpace->gammaIsLinear()) { |
- return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_Base |
+ return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ |
<kLinear_SrcGamma, kLinear_DstGamma, kNone_ColorSpaceMatch> |
(srcSpace, srcToDst, dstSpace)); |
} else { |
- return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_Base |
+ return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ |
<kTable_SrcGamma, kLinear_DstGamma, kNone_ColorSpaceMatch> |
(srcSpace, srcToDst, dstSpace)); |
} |
default: |
if (srcSpace->gammaIsLinear()) { |
- return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_Base |
+ return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ |
<kLinear_SrcGamma, kTable_DstGamma, kNone_ColorSpaceMatch> |
(srcSpace, srcToDst, dstSpace)); |
} else { |
- return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_Base |
+ return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ |
<kTable_SrcGamma, kTable_DstGamma, kNone_ColorSpaceMatch> |
(srcSpace, srcToDst, dstSpace)); |
} |
@@ -411,41 +417,41 @@ std::unique_ptr<SkColorSpaceXform> SkColorSpaceXform::New(SkColorSpace* srcSpace |
switch (as_CSB(dstSpace)->gammaNamed()) { |
case kSRGB_SkGammaNamed: |
if (srcSpace->gammaIsLinear()) { |
- return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_Base |
+ return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ |
<kLinear_SrcGamma, kSRGB_DstGamma, kGamut_ColorSpaceMatch> |
(srcSpace, srcToDst, dstSpace)); |
} else { |
- return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_Base |
+ return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ |
<kTable_SrcGamma, kSRGB_DstGamma, kGamut_ColorSpaceMatch> |
(srcSpace, srcToDst, dstSpace)); |
} |
case k2Dot2Curve_SkGammaNamed: |
if (srcSpace->gammaIsLinear()) { |
- return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_Base |
+ return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ |
<kLinear_SrcGamma, k2Dot2_DstGamma, kGamut_ColorSpaceMatch> |
(srcSpace, srcToDst, dstSpace)); |
} else { |
- return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_Base |
+ return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ |
<kTable_SrcGamma, k2Dot2_DstGamma, kGamut_ColorSpaceMatch> |
(srcSpace, srcToDst, dstSpace)); |
} |
case kLinear_SkGammaNamed: |
if (srcSpace->gammaIsLinear()) { |
- return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_Base |
+ return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ |
<kLinear_SrcGamma, kLinear_DstGamma, kGamut_ColorSpaceMatch> |
(srcSpace, srcToDst, dstSpace)); |
} else { |
- return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_Base |
+ return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ |
<kTable_SrcGamma, kLinear_DstGamma, kGamut_ColorSpaceMatch> |
(srcSpace, srcToDst, dstSpace)); |
} |
default: |
if (srcSpace->gammaIsLinear()) { |
- return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_Base |
+ return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ |
<kLinear_SrcGamma, kTable_DstGamma, kGamut_ColorSpaceMatch> |
(srcSpace, srcToDst, dstSpace)); |
} else { |
- return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_Base |
+ return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ |
<kTable_SrcGamma, kTable_DstGamma, kGamut_ColorSpaceMatch> |
(srcSpace, srcToDst, dstSpace)); |
} |
@@ -453,19 +459,19 @@ std::unique_ptr<SkColorSpaceXform> SkColorSpaceXform::New(SkColorSpace* srcSpace |
case kFull_ColorSpaceMatch: |
switch (as_CSB(dstSpace)->gammaNamed()) { |
case kSRGB_SkGammaNamed: |
- return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_Base |
+ return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ |
<kTable_SrcGamma, kSRGB_DstGamma, kFull_ColorSpaceMatch> |
(srcSpace, srcToDst, dstSpace)); |
case k2Dot2Curve_SkGammaNamed: |
- return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_Base |
+ return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ |
<kTable_SrcGamma, k2Dot2_DstGamma, kFull_ColorSpaceMatch> |
(srcSpace, srcToDst, dstSpace)); |
case kLinear_SkGammaNamed: |
- return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_Base |
+ return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ |
<kLinear_SrcGamma, kLinear_DstGamma, kFull_ColorSpaceMatch> |
(srcSpace, srcToDst, dstSpace)); |
default: |
- return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_Base |
+ return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ |
<kTable_SrcGamma, kTable_DstGamma, kFull_ColorSpaceMatch> |
(srcSpace, srcToDst, dstSpace)); |
} |
@@ -1243,25 +1249,21 @@ static inline int num_tables(SkColorSpace* space) { |
} |
template <SrcGamma kSrc, DstGamma kDst, ColorSpaceMatch kCSM> |
-SkColorSpaceXform_Base<kSrc, kDst, kCSM> |
-::SkColorSpaceXform_Base(SkColorSpace* srcSpace, const SkMatrix44& srcToDst, SkColorSpace* dstSpace) |
+SkColorSpaceXform_XYZ<kSrc, kDst, kCSM> |
+::SkColorSpaceXform_XYZ(SkColorSpace* srcSpace, const SkMatrix44& srcToDst, SkColorSpace* dstSpace) |
: fColorLUT(sk_ref_sp((SkColorLookUpTable*) as_CSB(srcSpace)->colorLUT())) |
{ |
srcToDst.asColMajorf(fSrcToDst); |
const int numSrcTables = num_tables(srcSpace); |
- const int numDstTables = num_tables(dstSpace); |
- const size_t srcTableBytes = numSrcTables * 256 * sizeof(float); |
- const size_t dstTableBytes = numDstTables * kDstGammaTableSize * sizeof(uint8_t); |
- fStorage.reset(srcTableBytes + dstTableBytes); |
- float* srcStorage = (float*) fStorage.get(); |
- uint8_t* dstStorage = SkTAddOffset<uint8_t>(fStorage.get(), srcTableBytes); |
- |
+ const size_t srcEntries = numSrcTables * 256; |
const bool srcGammasAreMatching = (1 >= numSrcTables); |
- const bool dstGammasAreMatching = (1 >= numDstTables); |
- build_gamma_tables(fSrcGammaTables, srcStorage, 256, srcSpace, kToLinear, srcGammasAreMatching); |
- build_gamma_tables(fDstGammaTables, dstStorage, kDstGammaTableSize, dstSpace, kFromLinear, |
- dstGammasAreMatching); |
+ fSrcStorage.reset(srcEntries); |
+ build_gamma_tables(fSrcGammaTables, fSrcStorage.get(), 256, srcSpace, kToLinear, |
+ srcGammasAreMatching); |
+ |
+ const int numDstTables = num_tables(dstSpace); |
+ as_CSB(dstSpace)->toDstGammaTables(fDstGammaTables, &fDstStorage, numDstTables); |
} |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
@@ -1318,7 +1320,7 @@ static inline bool apply_set_src(void* dst, const void* src, int len, SkAlphaTyp |
} |
template <SrcGamma kSrc, DstGamma kDst, ColorSpaceMatch kCSM> |
-bool SkColorSpaceXform_Base<kSrc, kDst, kCSM> |
+bool SkColorSpaceXform_XYZ<kSrc, kDst, kCSM> |
::onApply(ColorFormat dstColorFormat, void* dst, ColorFormat srcColorFormat, const void* src, |
int len, SkAlphaType alphaType) const |
{ |
@@ -1421,10 +1423,16 @@ bool SkColorSpaceXform_Base<kSrc, kDst, kCSM> |
} |
} |
+bool SkColorSpaceXform::apply(ColorFormat dstColorFormat, void* dst, ColorFormat srcColorFormat, |
+ const void* src, int len, SkAlphaType alphaType) const { |
+ return ((SkColorSpaceXform_Base*) this)->onApply(dstColorFormat, dst, srcColorFormat, src, len, |
+ alphaType); |
+} |
+ |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
std::unique_ptr<SkColorSpaceXform> SlowIdentityXform(SkColorSpace* space) { |
- return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_Base |
+ return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ |
<kTable_SrcGamma, kTable_DstGamma, kNone_ColorSpaceMatch> |
(space, SkMatrix::I(), space)); |
} |