aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/core/SkColorSpaceXformSteps.cpp19
-rw-r--r--src/core/SkColorSpaceXformSteps.h2
-rw-r--r--tests/SkColorSpaceXformStepsTest.cpp18
3 files changed, 28 insertions, 11 deletions
diff --git a/src/core/SkColorSpaceXformSteps.cpp b/src/core/SkColorSpaceXformSteps.cpp
index c05bf6304e..08a59fc672 100644
--- a/src/core/SkColorSpaceXformSteps.cpp
+++ b/src/core/SkColorSpaceXformSteps.cpp
@@ -83,4 +83,23 @@ SkColorSpaceXformSteps::SkColorSpaceXformSteps(SkColorSpace* src, SkAlphaType sr
// Step II) if dst has linear blending, encode back using dst transfer function before storing
this->late_encode = !dstNL;
+
+ // Fill out all the transfer functions we'll use:
+ SkColorSpaceTransferFn srcTF, dstTF;
+ SkAssertResult(src->isNumericalTransferFn(&srcTF));
+ SkAssertResult(dst->isNumericalTransferFn(&dstTF));
+ this->srcTFInv = srcTF.invert();
+ this->dstTF = dstTF;
+ this->dstTFInv = dstTF.invert();
+
+ // If we linearize then immediately reencode with the same transfer function, skip both.
+ if ( this->linearize_src &&
+ !this->late_unpremul &&
+ !this->gamut_transform &&
+ this->early_encode &&
+ 0 == memcmp(&srcTF, &dstTF, sizeof(SkColorSpaceTransferFn)))
+ {
+ this->linearize_src = false;
+ this->early_encode = false;
+ }
}
diff --git a/src/core/SkColorSpaceXformSteps.h b/src/core/SkColorSpaceXformSteps.h
index fe382403ea..090d88fe47 100644
--- a/src/core/SkColorSpaceXformSteps.h
+++ b/src/core/SkColorSpaceXformSteps.h
@@ -29,11 +29,9 @@ struct SkColorSpaceXformSteps {
// Post-blend steps.
bool late_encode;
-/* TODO
SkColorSpaceTransferFn srcTFInv, // Apply for linearize_src.
dstTFInv, // Apply for linearize_dst.
dstTF; // Apply for early_encode or late_encode.
-*/
float src_to_dst_matrix[9]; // Apply this 3x3 row-major matrix for gamut_transform.
};
diff --git a/tests/SkColorSpaceXformStepsTest.cpp b/tests/SkColorSpaceXformStepsTest.cpp
index ef53f588cf..b0b9c44afe 100644
--- a/tests/SkColorSpaceXformStepsTest.cpp
+++ b/tests/SkColorSpaceXformStepsTest.cpp
@@ -170,20 +170,20 @@ DEF_TEST(SkColorSpaceXformSteps, r) {
// These four test cases test drawing in the same color space.
// There is lots of room for optimization here.
- { srgb_N, srgb_N, kPremul_SkAlphaType, true,true,false, false,true,true, false,false },
+ { srgb_N, srgb_N, kPremul_SkAlphaType, true,false,false, false,false,true, false,false },
{ srgb_L, srgb_L, kPremul_SkAlphaType, false,true,true, false,false,true, true,true },
{ srgb_L, srgb_N, kPremul_SkAlphaType, false,true,true, false,true,true, false,false },
{ srgb_N, srgb_L, kPremul_SkAlphaType, true,true,false, false,false,true, true,true },
// And the usual variants for opaque + unpremul sources.
- { srgb_N, srgb_N, kOpaque_SkAlphaType, false,true,false, false,true,false, false,false },
- { srgb_N, srgb_N, kUnpremul_SkAlphaType, false,true,false, false,true,true, false,false },
- { srgb_L, srgb_L, kOpaque_SkAlphaType, false,true,false, false,false,false, true,true },
- { srgb_L, srgb_L, kUnpremul_SkAlphaType, false,true,false, false,false,true, true,true },
- { srgb_L, srgb_N, kOpaque_SkAlphaType, false,true,false, false,true,false, false,false },
- { srgb_L, srgb_N, kUnpremul_SkAlphaType, false,true,false, false,true,true, false,false },
- { srgb_N, srgb_L, kOpaque_SkAlphaType, false,true,false, false,false,false, true,true },
- { srgb_N, srgb_L, kUnpremul_SkAlphaType, false,true,false, false,false,true, true,true },
+ { srgb_N, srgb_N, kOpaque_SkAlphaType, false,false,false, false,false,false, false,false},
+ { srgb_N, srgb_N, kUnpremul_SkAlphaType, false,false,false, false,false,true, false,false},
+ { srgb_L, srgb_L, kOpaque_SkAlphaType, false,true,false, false,false,false, true,true },
+ { srgb_L, srgb_L, kUnpremul_SkAlphaType, false,true,false, false,false,true, true,true },
+ { srgb_L, srgb_N, kOpaque_SkAlphaType, false,false,false, false,false,false, false,false},
+ { srgb_L, srgb_N, kUnpremul_SkAlphaType, false,false,false, false,false,true, false,false},
+ { srgb_N, srgb_L, kOpaque_SkAlphaType, false,true,false, false,false,false, true,true },
+ { srgb_N, srgb_L, kUnpremul_SkAlphaType, false,true,false, false,false,true, true,true },
// TODO: versions of above crossing in linear transfer functions
};