diff options
author | 2016-06-20 06:07:45 -0700 | |
---|---|---|
committer | 2016-06-20 06:07:45 -0700 | |
commit | d2809573deb7b99e764f7f71fe34a5b5322df0b2 (patch) | |
tree | a51709dd5e37fe8816a1e14e24d4eff9a839f5e9 /src/core | |
parent | 452ba88066b51931696fc3d0a2a1c0f8809a4143 (diff) |
Support sRGB dsts in opt code
201295.jpg on HP z620 (300x280)
QCMS Xform 0.418 ms
Skia NEW Xform 0.378 ms
Vs QCMS 1.11x
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2078623002
CQ_EXTRA_TRYBOTS=client.skia:Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-SKNX_NO_SIMD-Trybot
Review-Url: https://codereview.chromium.org/2078623002
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/SkColorSpaceXform.cpp | 60 | ||||
-rw-r--r-- | src/core/SkColorSpaceXform.h | 18 | ||||
-rw-r--r-- | src/core/SkOpts.cpp | 4 | ||||
-rw-r--r-- | src/core/SkOpts.h | 4 |
4 files changed, 58 insertions, 28 deletions
diff --git a/src/core/SkColorSpaceXform.cpp b/src/core/SkColorSpaceXform.cpp index 4c67e8d3f0..f42811a549 100644 --- a/src/core/SkColorSpaceXform.cpp +++ b/src/core/SkColorSpaceXform.cpp @@ -37,15 +37,35 @@ std::unique_ptr<SkColorSpaceXform> SkColorSpaceXform::New(const sk_sp<SkColorSpa return nullptr; } - if (SkColorSpace::k2Dot2Curve_GammaNamed == dstSpace->gammaNamed() && - 0.0f == srcToDst.getFloat(3, 0) && + if (0.0f == srcToDst.getFloat(3, 0) && 0.0f == srcToDst.getFloat(3, 1) && 0.0f == srcToDst.getFloat(3, 2)) { - if (SkColorSpace::kSRGB_GammaNamed == srcSpace->gammaNamed()) { - return std::unique_ptr<SkColorSpaceXform>(new SkSRGBTo2Dot2Xform(srcToDst)); - } else if (SkColorSpace::k2Dot2Curve_GammaNamed == srcSpace->gammaNamed()) { - return std::unique_ptr<SkColorSpaceXform>(new Sk2Dot2To2Dot2Xform(srcToDst)); + switch (srcSpace->gammaNamed()) { + case SkColorSpace::kSRGB_GammaNamed: + if (SkColorSpace::kSRGB_GammaNamed == dstSpace->gammaNamed()) { + return std::unique_ptr<SkColorSpaceXform>( + new SkFastXform<SkColorSpace::kSRGB_GammaNamed, + SkColorSpace::kSRGB_GammaNamed>(srcToDst)); + } else if (SkColorSpace::k2Dot2Curve_GammaNamed == dstSpace->gammaNamed()) { + return std::unique_ptr<SkColorSpaceXform>( + new SkFastXform<SkColorSpace::kSRGB_GammaNamed, + SkColorSpace::k2Dot2Curve_GammaNamed>(srcToDst)); + } + break; + case SkColorSpace::k2Dot2Curve_GammaNamed: + if (SkColorSpace::kSRGB_GammaNamed == dstSpace->gammaNamed()) { + return std::unique_ptr<SkColorSpaceXform>( + new SkFastXform<SkColorSpace::k2Dot2Curve_GammaNamed, + SkColorSpace::kSRGB_GammaNamed>(srcToDst)); + } else if (SkColorSpace::k2Dot2Curve_GammaNamed == dstSpace->gammaNamed()) { + return std::unique_ptr<SkColorSpaceXform>( + new SkFastXform<SkColorSpace::k2Dot2Curve_GammaNamed, + SkColorSpace::k2Dot2Curve_GammaNamed>(srcToDst)); + } + break; + default: + break; } } @@ -90,23 +110,37 @@ static void build_src_to_dst(float srcToDstArray[12], const SkMatrix44& srcToDst #endif } -SkSRGBTo2Dot2Xform::SkSRGBTo2Dot2Xform(const SkMatrix44& srcToDst) +template <SkColorSpace::GammaNamed Src, SkColorSpace::GammaNamed Dst> +SkFastXform<Src, Dst>::SkFastXform(const SkMatrix44& srcToDst) { build_src_to_dst(fSrcToDst, srcToDst); } -void SkSRGBTo2Dot2Xform::xform_RGB1_8888(uint32_t* dst, const uint32_t* src, uint32_t len) const { - SkOpts::color_xform_RGB1_srgb_to_2dot2(dst, src, len, fSrcToDst); +template <> +void SkFastXform<SkColorSpace::kSRGB_GammaNamed, SkColorSpace::kSRGB_GammaNamed> +::xform_RGB1_8888(uint32_t* dst, const uint32_t* src, uint32_t len) const +{ + SkOpts::color_xform_RGB1_srgb_to_srgb(dst, src, len, fSrcToDst); } -/////////////////////////////////////////////////////////////////////////////////////////////////// +template <> +void SkFastXform<SkColorSpace::kSRGB_GammaNamed, SkColorSpace::k2Dot2Curve_GammaNamed> +::xform_RGB1_8888(uint32_t* dst, const uint32_t* src, uint32_t len) const +{ + SkOpts::color_xform_RGB1_srgb_to_2dot2(dst, src, len, fSrcToDst); +} -Sk2Dot2To2Dot2Xform::Sk2Dot2To2Dot2Xform(const SkMatrix44& srcToDst) +template <> +void SkFastXform<SkColorSpace::k2Dot2Curve_GammaNamed, SkColorSpace::kSRGB_GammaNamed> +::xform_RGB1_8888(uint32_t* dst, const uint32_t* src, uint32_t len) const { - build_src_to_dst(fSrcToDst, srcToDst); + SkOpts::color_xform_RGB1_2dot2_to_srgb(dst, src, len, fSrcToDst); } -void Sk2Dot2To2Dot2Xform::xform_RGB1_8888(uint32_t* dst, const uint32_t* src, uint32_t len) const { +template <> +void SkFastXform<SkColorSpace::k2Dot2Curve_GammaNamed, SkColorSpace::k2Dot2Curve_GammaNamed> +::xform_RGB1_8888(uint32_t* dst, const uint32_t* src, uint32_t len) const +{ SkOpts::color_xform_RGB1_2dot2_to_2dot2(dst, src, len, fSrcToDst); } diff --git a/src/core/SkColorSpaceXform.h b/src/core/SkColorSpaceXform.h index 1ea608094f..e6abdbb992 100644 --- a/src/core/SkColorSpaceXform.h +++ b/src/core/SkColorSpaceXform.h @@ -34,26 +34,14 @@ public: virtual ~SkColorSpaceXform() {} }; -class SkSRGBTo2Dot2Xform : public SkColorSpaceXform { +template <SkColorSpace::GammaNamed Src, SkColorSpace::GammaNamed Dst> +class SkFastXform : public SkColorSpaceXform { public: void xform_RGB1_8888(uint32_t* dst, const uint32_t* src, uint32_t len) const override; private: - SkSRGBTo2Dot2Xform(const SkMatrix44& srcToDst); - - float fSrcToDst[12]; - - friend class SkColorSpaceXform; -}; - -class Sk2Dot2To2Dot2Xform : public SkColorSpaceXform { -public: - - void xform_RGB1_8888(uint32_t* dst, const uint32_t* src, uint32_t len) const override; - -private: - Sk2Dot2To2Dot2Xform(const SkMatrix44& srcToDst); + SkFastXform(const SkMatrix44& srcToDst); float fSrcToDst[12]; diff --git a/src/core/SkOpts.cpp b/src/core/SkOpts.cpp index b4145acb7a..a2de1f59d2 100644 --- a/src/core/SkOpts.cpp +++ b/src/core/SkOpts.cpp @@ -81,6 +81,10 @@ namespace SkOpts { sk_default::color_xform_RGB1_srgb_to_2dot2; decltype(color_xform_RGB1_2dot2_to_2dot2) color_xform_RGB1_2dot2_to_2dot2 = sk_default::color_xform_RGB1_2dot2_to_2dot2; + decltype(color_xform_RGB1_srgb_to_srgb) color_xform_RGB1_srgb_to_srgb = + sk_default::color_xform_RGB1_srgb_to_srgb; + decltype(color_xform_RGB1_2dot2_to_srgb) color_xform_RGB1_2dot2_to_srgb = + sk_default::color_xform_RGB1_2dot2_to_srgb; // Each Init_foo() is defined in src/opts/SkOpts_foo.cpp. void Init_ssse3(); diff --git a/src/core/SkOpts.h b/src/core/SkOpts.h index 1c33529d52..186fa73d4c 100644 --- a/src/core/SkOpts.h +++ b/src/core/SkOpts.h @@ -74,6 +74,10 @@ namespace SkOpts { const float srcToDstMatrix[16]); extern void (*color_xform_RGB1_2dot2_to_2dot2)(uint32_t* dst, const uint32_t* src, int len, const float srcToDstMatrix[16]); + extern void (*color_xform_RGB1_srgb_to_srgb) (uint32_t* dst, const uint32_t* src, int len, + const float srcToDstMatrix[16]); + extern void (*color_xform_RGB1_2dot2_to_srgb)(uint32_t* dst, const uint32_t* src, int len, + const float srcToDstMatrix[16]); } #endif//SkOpts_DEFINED |