From d2809573deb7b99e764f7f71fe34a5b5322df0b2 Mon Sep 17 00:00:00 2001 From: msarett Date: Mon, 20 Jun 2016 06:07:45 -0700 Subject: 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 --- src/core/SkColorSpaceXform.cpp | 60 +++++++++++++++++++++++++++++++++--------- src/core/SkColorSpaceXform.h | 18 +++---------- src/core/SkOpts.cpp | 4 +++ src/core/SkOpts.h | 4 +++ 4 files changed, 58 insertions(+), 28 deletions(-) (limited to 'src/core') 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::New(const sk_spgammaNamed() && - 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(new SkSRGBTo2Dot2Xform(srcToDst)); - } else if (SkColorSpace::k2Dot2Curve_GammaNamed == srcSpace->gammaNamed()) { - return std::unique_ptr(new Sk2Dot2To2Dot2Xform(srcToDst)); + switch (srcSpace->gammaNamed()) { + case SkColorSpace::kSRGB_GammaNamed: + if (SkColorSpace::kSRGB_GammaNamed == dstSpace->gammaNamed()) { + return std::unique_ptr( + new SkFastXform(srcToDst)); + } else if (SkColorSpace::k2Dot2Curve_GammaNamed == dstSpace->gammaNamed()) { + return std::unique_ptr( + new SkFastXform(srcToDst)); + } + break; + case SkColorSpace::k2Dot2Curve_GammaNamed: + if (SkColorSpace::kSRGB_GammaNamed == dstSpace->gammaNamed()) { + return std::unique_ptr( + new SkFastXform(srcToDst)); + } else if (SkColorSpace::k2Dot2Curve_GammaNamed == dstSpace->gammaNamed()) { + return std::unique_ptr( + new SkFastXform(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 +SkFastXform::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 +::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 +::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 +::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 +::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 +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 -- cgit v1.2.3