aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core
diff options
context:
space:
mode:
authorGravatar msarett <msarett@google.com>2016-08-23 17:53:06 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-08-23 17:53:06 -0700
commit9dc6cf6b8833d36c29a23d2519989b069745fcd5 (patch)
treefde62a569773a2feaebdf0f26473e9ece9a448f7 /src/core
parentae6377c08e5c3735c65212ba9ff86fa51af7d68a (diff)
Fix generic color space xform, ColorSpaceXformTest
Diffstat (limited to 'src/core')
-rw-r--r--src/core/SkColorSpaceXform.cpp20
-rw-r--r--src/core/SkColorSpaceXform.h6
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