aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core
diff options
context:
space:
mode:
authorGravatar msarett <msarett@google.com>2016-06-20 06:07:45 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-06-20 06:07:45 -0700
commitd2809573deb7b99e764f7f71fe34a5b5322df0b2 (patch)
treea51709dd5e37fe8816a1e14e24d4eff9a839f5e9 /src/core
parent452ba88066b51931696fc3d0a2a1c0f8809a4143 (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.cpp60
-rw-r--r--src/core/SkColorSpaceXform.h18
-rw-r--r--src/core/SkOpts.cpp4
-rw-r--r--src/core/SkOpts.h4
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