diff options
author | 2016-10-19 14:56:07 -0400 | |
---|---|---|
committer | 2016-10-20 20:21:35 +0000 | |
commit | bbf251bf225489a0939fff6df938035a290f4d16 (patch) | |
tree | 4fbf67858e195d7b307248f4507c9506ece8316d /src/core/SkColorSpaceXform.cpp | |
parent | 8ffb26051f16a2ec4fbd1f8b0737d6d86c0ad819 (diff) |
Hash the gamut of XYZ color spaces, to speed up comparison
Also going to use this to allow caching of GrColorSpaceXforms
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=3670
Change-Id: I56ed2dcbdddc22046263f56d68f2d6aea55547c8
Reviewed-on: https://skia-review.googlesource.com/3670
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: Matt Sarett <msarett@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
Diffstat (limited to 'src/core/SkColorSpaceXform.cpp')
-rw-r--r-- | src/core/SkColorSpaceXform.cpp | 21 |
1 files changed, 4 insertions, 17 deletions
diff --git a/src/core/SkColorSpaceXform.cpp b/src/core/SkColorSpaceXform.cpp index cacb38878c..fbd5972ffc 100644 --- a/src/core/SkColorSpaceXform.cpp +++ b/src/core/SkColorSpaceXform.cpp @@ -337,20 +337,6 @@ void SkColorSpaceXform_Base::BuildDstGammaTables(const uint8_t* dstGammaTables[3 /////////////////////////////////////////////////////////////////////////////////////////////////// -static inline bool is_almost_identity(const SkMatrix44& srcToDst) { - for (int i = 0; i < 4; i++) { - for (int j = 0; j < 4; j++) { - float expected = (i == j) ? 1.0f : 0.0f; - if (!color_space_almost_equal(srcToDst.getFloat(i,j), expected)) { - return false; - } - } - } - return true; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////// - std::unique_ptr<SkColorSpaceXform> SkColorSpaceXform::New(SkColorSpace* srcSpace, SkColorSpace* dstSpace) { if (!srcSpace || !dstSpace) { @@ -381,11 +367,12 @@ std::unique_ptr<SkColorSpaceXform> SkColorSpaceXform::New(SkColorSpace* srcSpace srcToDst.setIdentity(); csm = kFull_ColorSpaceMatch; } else { - srcToDst.setConcat(*dstSpaceXYZ->fromXYZD50(), *srcSpaceXYZ->toXYZD50()); - - if (is_almost_identity(srcToDst)) { + if (srcSpaceXYZ->toXYZD50Hash() == dstSpaceXYZ->toXYZD50Hash()) { + SkASSERT(*srcSpaceXYZ->toXYZD50() == *dstSpaceXYZ->toXYZD50() && "Hash collision"); srcToDst.setIdentity(); csm = kGamut_ColorSpaceMatch; + } else { + srcToDst.setConcat(*dstSpaceXYZ->fromXYZD50(), *srcSpaceXYZ->toXYZD50()); } } |