diff options
author | Matt Sarett <msarett@google.com> | 2017-03-23 15:32:25 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-03-24 13:19:53 +0000 |
commit | cf3f2347c8933596aeba873d4ece597a9339392f (patch) | |
tree | d340f5802bb11ffe902b5f95ea06c6b75c5ccd74 /src/core/SkColorSpaceXform.cpp | |
parent | a3bdd44aff94974e720ed04b860fbfe24f8f431e (diff) |
Add SkTransferFunctionBehavior flag: Use in codec and encoder
This is a step towards removing the non-linear blending flag from
SkColorSpace. The flag on SkColorSpace used to control the premul
behavior - now it is controlled by this option.
BUG=skia:
Change-Id: Ia29bd8c2b0596a93c6aa14332dcd9bd39e388a90
Reviewed-on: https://skia-review.googlesource.com/10008
Reviewed-by: Mike Reed <reed@google.com>
Reviewed-by: Leon Scroggins <scroggo@google.com>
Commit-Queue: Matt Sarett <msarett@google.com>
Diffstat (limited to 'src/core/SkColorSpaceXform.cpp')
-rw-r--r-- | src/core/SkColorSpaceXform.cpp | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/src/core/SkColorSpaceXform.cpp b/src/core/SkColorSpaceXform.cpp index b81c23c6b7..317992036d 100644 --- a/src/core/SkColorSpaceXform.cpp +++ b/src/core/SkColorSpaceXform.cpp @@ -292,6 +292,12 @@ void SkColorSpaceXform_Base::BuildDstGammaTables(const uint8_t* dstGammaTables[3 std::unique_ptr<SkColorSpaceXform> SkColorSpaceXform::New(SkColorSpace* srcSpace, SkColorSpace* dstSpace) { + return SkColorSpaceXform_Base::New(srcSpace, dstSpace, SkTransferFunctionBehavior::kRespect); +} + +std::unique_ptr<SkColorSpaceXform> SkColorSpaceXform_Base::New(SkColorSpace* srcSpace, + SkColorSpace* dstSpace, SkTransferFunctionBehavior premulBehavior) { + if (!srcSpace || !dstSpace) { // Invalid input return nullptr; @@ -328,13 +334,13 @@ std::unique_ptr<SkColorSpaceXform> SkColorSpaceXform::New(SkColorSpace* srcSpace switch (csm) { case kNone_ColorSpaceMatch: return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ - <kNone_ColorSpaceMatch>(srcSpaceXYZ, srcToDst, dstSpaceXYZ)); + <kNone_ColorSpaceMatch>(srcSpaceXYZ, srcToDst, dstSpaceXYZ, premulBehavior)); case kGamut_ColorSpaceMatch: return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ - <kGamut_ColorSpaceMatch>(srcSpaceXYZ, srcToDst, dstSpaceXYZ)); + <kGamut_ColorSpaceMatch>(srcSpaceXYZ, srcToDst, dstSpaceXYZ, premulBehavior)); case kFull_ColorSpaceMatch: return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ - <kFull_ColorSpaceMatch>(srcSpaceXYZ, srcToDst, dstSpaceXYZ)); + <kFull_ColorSpaceMatch>(srcSpaceXYZ, srcToDst, dstSpaceXYZ, premulBehavior)); default: SkASSERT(false); return nullptr; @@ -931,8 +937,8 @@ static AI int num_tables(SkColorSpace_XYZ* space) { template <ColorSpaceMatch kCSM> SkColorSpaceXform_XYZ<kCSM> ::SkColorSpaceXform_XYZ(SkColorSpace_XYZ* srcSpace, const SkMatrix44& srcToDst, - SkColorSpace_XYZ* dstSpace) - : fLinearBlending(!dstSpace->nonLinearBlending()) + SkColorSpace_XYZ* dstSpace, SkTransferFunctionBehavior premulBehavior) + : fPremulBehavior(premulBehavior) { fSrcToDst[ 0] = srcToDst.get(0, 0); fSrcToDst[ 1] = srcToDst.get(1, 0); @@ -1227,7 +1233,8 @@ bool SkColorSpaceXform_XYZ<kCSM> } } - if (kPremul_SkAlphaType == alphaType && fLinearBlending) { + if (kPremul_SkAlphaType == alphaType && SkTransferFunctionBehavior::kRespect == fPremulBehavior) + { pipeline.append(SkRasterPipeline::premul); } @@ -1249,7 +1256,8 @@ bool SkColorSpaceXform_XYZ<kCSM> break; } - if (kPremul_SkAlphaType == alphaType && !fLinearBlending) { + if (kPremul_SkAlphaType == alphaType && SkTransferFunctionBehavior::kIgnore == fPremulBehavior) + { pipeline.append(SkRasterPipeline::premul); } @@ -1262,13 +1270,13 @@ bool SkColorSpaceXform_XYZ<kCSM> pipeline.append(SkRasterPipeline::store_8888, &dst); break; case kRGBA_F16_ColorFormat: - if (kLinear_DstGamma != fDstGamma || !fLinearBlending) { + if (kLinear_DstGamma != fDstGamma) { return false; } pipeline.append(SkRasterPipeline::store_f16, &dst); break; case kRGBA_F32_ColorFormat: - if (kLinear_DstGamma != fDstGamma || !fLinearBlending) { + if (kLinear_DstGamma != fDstGamma) { return false; } pipeline.append(SkRasterPipeline::store_f32, &dst); @@ -1284,6 +1292,6 @@ bool SkColorSpaceXform_XYZ<kCSM> /////////////////////////////////////////////////////////////////////////////////////////////////// std::unique_ptr<SkColorSpaceXform> SlowIdentityXform(SkColorSpace_XYZ* space) { - return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ - <kNone_ColorSpaceMatch>(space, SkMatrix::I(), space)); + return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_XYZ<kNone_ColorSpaceMatch> + (space, SkMatrix::I(), space, SkTransferFunctionBehavior::kRespect)); } |