Index: src/core/SkColorSpaceXform.cpp |
diff --git a/src/core/SkColorSpaceXform.cpp b/src/core/SkColorSpaceXform.cpp |
index 57b4fa6ddd41d68e61dfdc44fffc68487e66385b..4fa4746ad6d110487ff44f7a3c6603bbbcbdf8f0 100644 |
--- a/src/core/SkColorSpaceXform.cpp |
+++ b/src/core/SkColorSpaceXform.cpp |
@@ -633,101 +633,76 @@ SkColorSpaceXform_Base<kDst>::SkColorSpaceXform_Base(const sk_sp<SkColorSpace>& |
dstSpace, kFromLinear); |
} |
-template <> |
-void SkColorSpaceXform_Base<SkColorSpace::kSRGB_GammaNamed> |
-::applyToRGBA(RGBA32* dst, const RGBA32* src, int len) const |
-{ |
- if (fColorLUT) { |
- handle_color_lut(dst, src, len, fColorLUT.get()); |
- src = dst; |
- } |
- |
- color_xform_RGBA<SkColorSpace::kSRGB_GammaNamed, false, false> |
- (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); |
-} |
- |
-template <> |
-void SkColorSpaceXform_Base<SkColorSpace::k2Dot2Curve_GammaNamed> |
-::applyToRGBA(RGBA32* dst, const RGBA32* src, int len) const |
-{ |
- if (fColorLUT) { |
- handle_color_lut(dst, src, len, fColorLUT.get()); |
- src = dst; |
- } |
- |
- color_xform_RGBA<SkColorSpace::k2Dot2Curve_GammaNamed, false, false> |
- (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); |
-} |
- |
-template <> |
-void SkColorSpaceXform_Base<SkColorSpace::kNonStandard_GammaNamed> |
-::applyToRGBA(RGBA32* dst, const RGBA32* src, int len) const |
-{ |
- if (fColorLUT) { |
- handle_color_lut(dst, src, len, fColorLUT.get()); |
- src = dst; |
- } |
- |
- color_xform_RGBA<SkColorSpace::kNonStandard_GammaNamed, false, false> |
- (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); |
-} |
- |
-template <> |
-void SkColorSpaceXform_Base<SkColorSpace::kSRGB_GammaNamed> |
-::applyToBGRA(BGRA32* dst, const RGBA32* src, int len) const |
-{ |
- if (fColorLUT) { |
- handle_color_lut(dst, src, len, fColorLUT.get()); |
- src = dst; |
- } |
- |
- color_xform_RGBA<SkColorSpace::kSRGB_GammaNamed, false, true> |
- (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); |
-} |
- |
-template <> |
-void SkColorSpaceXform_Base<SkColorSpace::k2Dot2Curve_GammaNamed> |
-::applyToBGRA(BGRA32* dst, const RGBA32* src, int len) const |
-{ |
- if (fColorLUT) { |
- handle_color_lut(dst, src, len, fColorLUT.get()); |
- src = dst; |
- } |
- |
- color_xform_RGBA<SkColorSpace::k2Dot2Curve_GammaNamed, false, true> |
- (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); |
-} |
- |
-template <> |
-void SkColorSpaceXform_Base<SkColorSpace::kNonStandard_GammaNamed> |
-::applyToBGRA(BGRA32* dst, const RGBA32* src, int len) const |
-{ |
- if (fColorLUT) { |
- handle_color_lut(dst, src, len, fColorLUT.get()); |
- src = dst; |
- } |
- |
- color_xform_RGBA<SkColorSpace::kNonStandard_GammaNamed, false, true> |
- (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); |
-} |
- |
-template <SkColorSpace::GammaNamed T> |
-void SkColorSpaceXform_Base<T> |
-::applyToF16(RGBAF16* dst, const RGBA32* src, int len) const |
+template <SkColorSpace::GammaNamed kDst> |
+void SkColorSpaceXform_Base<kDst> |
+::apply(void* dst, const uint32_t* src, int len, SkColorType dstColorType, SkAlphaType dstAlphaType) |
+const |
{ |
if (fColorLUT) { |
- size_t storageBytes = len * sizeof(RGBA32); |
+ size_t storageBytes = len * sizeof(uint32_t); |
#if defined(GOOGLE3) |
// Stack frame size is limited in GOOGLE3. |
- SkAutoSMalloc<256 * sizeof(RGBA32)> storage(storageBytes); |
+ SkAutoSMalloc<256 * sizeof(uint32_t)> storage(storageBytes); |
#else |
- SkAutoSMalloc<1024 * sizeof(RGBA32)> storage(storageBytes); |
+ SkAutoSMalloc<1024 * sizeof(uint32_t)> storage(storageBytes); |
#endif |
- handle_color_lut((RGBA32*) storage.get(), src, len, fColorLUT.get()); |
- src = (const RGBA32*) storage.get(); |
+ handle_color_lut((uint32_t*) storage.get(), src, len, fColorLUT.get()); |
+ src = (const uint32_t*) storage.get(); |
} |
- color_xform_RGBA<SkColorSpace::kLinear_GammaNamed, false, false> |
- (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); |
+ switch (dstAlphaType) { |
+ case kPremul_SkAlphaType: |
+ switch (dstColorType) { |
+ case kRGBA_8888_SkColorType: |
+ return color_xform_RGBA<kDst, kPremul_SkAlphaType, kNo_SwapRB> |
+ (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); |
+ case kBGRA_8888_SkColorType: |
+ return color_xform_RGBA<kDst, kPremul_SkAlphaType, kYes_SwapRB> |
+ (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); |
+ case kRGBA_F16_SkColorType: |
+ return color_xform_RGBA |
+ <SkColorSpace::kLinear_GammaNamed, kPremul_SkAlphaType, kNo_SwapRB> |
+ (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); |
+ default: |
+ SkASSERT(false); |
+ return; |
+ } |
+ break; |
+ case kUnpremul_SkAlphaType: |
+ switch (dstColorType) { |
+ case kRGBA_8888_SkColorType: |
+ return color_xform_RGBA<kDst, kUnpremul_SkAlphaType, kNo_SwapRB> |
+ (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); |
+ case kBGRA_8888_SkColorType: |
+ return color_xform_RGBA<kDst, kUnpremul_SkAlphaType, kYes_SwapRB> |
+ (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); |
+ case kRGBA_F16_SkColorType: |
+ return color_xform_RGBA |
+ <SkColorSpace::kLinear_GammaNamed, kUnpremul_SkAlphaType, kNo_SwapRB> |
+ (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); |
+ default: |
+ SkASSERT(false); |
+ return; |
+ } |
+ case kOpaque_SkAlphaType: |
+ switch (dstColorType) { |
+ case kRGBA_8888_SkColorType: |
+ return color_xform_RGBA<kDst, kOpaque_SkAlphaType, kNo_SwapRB> |
+ (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); |
+ case kBGRA_8888_SkColorType: |
+ return color_xform_RGBA<kDst, kOpaque_SkAlphaType, kYes_SwapRB> |
+ (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); |
+ case kRGBA_F16_SkColorType: |
+ return color_xform_RGBA |
+ <SkColorSpace::kLinear_GammaNamed, kOpaque_SkAlphaType, kNo_SwapRB> |
+ (dst, src, len, fSrcGammaTables, fSrcToDst, fDstGammaTables); |
+ default: |
+ SkASSERT(false); |
+ return; |
+ } |
+ default: |
+ SkASSERT(false); |
+ return; |
+ } |
} |