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
diff --git a/src/core/SkColorSpaceXform.cpp b/src/core/SkColorSpaceXform.cpp
index f445939..909f260 100644
--- a/src/core/SkColorSpaceXform.cpp
+++ b/src/core/SkColorSpaceXform.cpp
@@ -950,13 +950,21 @@
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 @@
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 8f1c24c..df056a8 100644
--- a/src/core/SkColorSpaceXform.h
+++ b/src/core/SkColorSpaceXform.h
@@ -31,7 +31,7 @@
* |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 @@
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
diff --git a/tests/ColorSpaceXformTest.cpp b/tests/ColorSpaceXformTest.cpp
index 464801a..415063d 100644
--- a/tests/ColorSpaceXformTest.cpp
+++ b/tests/ColorSpaceXformTest.cpp
@@ -19,7 +19,9 @@
// Logically we can pass any matrix here. For simplicty, pass I(), i.e. D50 XYZ gamut.
sk_sp<SkColorSpace> space(new SkColorSpace_Base(
nullptr, SkColorSpace::kNonStandard_GammaNamed, gammas, SkMatrix::I(), nullptr));
- return SkColorSpaceXform::New(space, space);
+
+ // Use special testing entry point, so we don't skip the xform, even though src == dst.
+ return SlowIdentityXform(space);
}
};
@@ -37,19 +39,19 @@
// Create and perform an identity xform.
std::unique_ptr<SkColorSpaceXform> xform = ColorSpaceXformTest::CreateIdentityXform(gammas);
- xform->apply(dstPixels, srcPixels, width, kRGBA_8888_SkColorType, kOpaque_SkAlphaType);
+ xform->apply(dstPixels, srcPixels, width, kN32_SkColorType, kOpaque_SkAlphaType);
// Since the src->dst matrix is the identity, and the gamma curves match,
// the pixels should be unchanged.
for (int i = 0; i < width; i++) {
REPORTER_ASSERT(r, almost_equal(((srcPixels[i] >> 0) & 0xFF),
- ((dstPixels[i] >> 0) & 0xFF)));
+ SkGetPackedR32(dstPixels[i])));
REPORTER_ASSERT(r, almost_equal(((srcPixels[i] >> 8) & 0xFF),
- ((dstPixels[i] >> 8) & 0xFF)));
+ SkGetPackedG32(dstPixels[i])));
REPORTER_ASSERT(r, almost_equal(((srcPixels[i] >> 16) & 0xFF),
- ((dstPixels[i] >> 16) & 0xFF)));
+ SkGetPackedB32(dstPixels[i])));
REPORTER_ASSERT(r, almost_equal(((srcPixels[i] >> 24) & 0xFF),
- ((dstPixels[i] >> 24) & 0xFF)));
+ SkGetPackedA32(dstPixels[i])));
}
}