aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkColorSpaceXform.cpp
diff options
context:
space:
mode:
authorGravatar Matt Sarett <msarett@google.com>2017-03-23 15:32:25 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-03-24 13:19:53 +0000
commitcf3f2347c8933596aeba873d4ece597a9339392f (patch)
treed340f5802bb11ffe902b5f95ea06c6b75c5ccd74 /src/core/SkColorSpaceXform.cpp
parenta3bdd44aff94974e720ed04b860fbfe24f8f431e (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.cpp30
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));
}