diff options
author | 2016-08-23 17:53:06 -0700 | |
---|---|---|
committer | 2016-08-23 17:53:06 -0700 | |
commit | 9dc6cf6b8833d36c29a23d2519989b069745fcd5 (patch) | |
tree | fde62a569773a2feaebdf0f26473e9ece9a448f7 /src/core | |
parent | ae6377c08e5c3735c65212ba9ff86fa51af7d68a (diff) |
Fix generic color space xform, ColorSpaceXformTest
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2275563002
Review-Url: https://codereview.chromium.org/2275563002
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/SkColorSpaceXform.cpp | 20 | ||||
-rw-r--r-- | src/core/SkColorSpaceXform.h | 6 |
2 files changed, 22 insertions, 4 deletions
diff --git a/src/core/SkColorSpaceXform.cpp b/src/core/SkColorSpaceXform.cpp index f445939267..909f260d8a 100644 --- a/src/core/SkColorSpaceXform.cpp +++ b/src/core/SkColorSpaceXform.cpp @@ -950,13 +950,21 @@ static inline void store_generic(void* dst, const uint32_t* src, static inline void store_generic_1(void* dst, const uint32_t* src, Sk4f& rgba, const Sk4f&, const uint8_t* const dstTables[3], SwapRB kSwapRB) { + int kRShift = 0; + int kGShift = 8; + int kBShift = 16; + if (kYes_SwapRB == kSwapRB) { + kBShift = 0; + kRShift = 16; + } + rgba = Sk4f::Min(Sk4f::Max(1023.0f * rgba, 0.0f), 1023.0f); Sk4i indices = Sk4f_round(rgba); - *((uint32_t*) dst) = dstTables[0][indices[0]] << 0 - | dstTables[1][indices[1]] << 8 - | dstTables[2][indices[2]] << 16 + *((uint32_t*) dst) = dstTables[0][indices[0]] << kRShift + | dstTables[1][indices[1]] << kGShift + | dstTables[2][indices[2]] << kBShift | (*src & 0xFF000000); } @@ -1197,3 +1205,9 @@ const return; } } + +std::unique_ptr<SkColorSpaceXform> SlowIdentityXform(const sk_sp<SkColorSpace>& space) { + return std::unique_ptr<SkColorSpaceXform>(new SkColorSpaceXform_Base + <SkColorSpace::kNonStandard_GammaNamed, kNone_ColorSpaceMatch> + (space, SkMatrix::I(), space)); +} diff --git a/src/core/SkColorSpaceXform.h b/src/core/SkColorSpaceXform.h index 8f1c24cac1..df056a862e 100644 --- a/src/core/SkColorSpaceXform.h +++ b/src/core/SkColorSpaceXform.h @@ -31,7 +31,7 @@ public: * |dstColorType| and is premultiplied by alpha if |premul| is set. */ virtual void apply(void* dst, const uint32_t* src, int len, SkColorType dstColorType, - SkAlphaType dstAlphaType) const = 0; + SkAlphaType dstAlphaType) const = 0; virtual ~SkColorSpaceXform() {} }; @@ -68,6 +68,10 @@ private: uint8_t fDstGammaTableStorage[3 * kDstGammaTableSize]; friend class SkColorSpaceXform; + friend std::unique_ptr<SkColorSpaceXform> SlowIdentityXform(const sk_sp<SkColorSpace>& space); }; +// For testing. Bypasses opts for when src and dst color spaces are equal. +std::unique_ptr<SkColorSpaceXform> SlowIdentityXform(const sk_sp<SkColorSpace>& space); + #endif |