STAGE_CTX(load_tables_u16_be, const LoadTablesContext*) {
auto ptr = (const uint64_t*)ctx->fSrc + x;
+ const void* src = ptr;
+ SkNx<N, uint64_t> px;
+ if (tail) {
+ px = load(tail, ptr);
+ src = &px;
+ }
SkNh rh, gh, bh, ah;
- SkNh::Load4(ptr, &rh, &gh, &bh, &ah);
+ SkNh::Load4(src, &rh, &gh, &bh, &ah);
// ctx->fSrc is big-endian, so "& 0xff" grabs the 8 most significant bits of each component.
r = gather(tail, ctx->fR, SkNx_cast<int>(rh & 0xff));
}
}
+DEF_TEST(SkColorSpaceXform_LoadTail, r) {
+ uint64_t* srcPixel = new uint64_t[1];
+ srcPixel[0] = 0;
+ uint32_t dstPixel;
+ sk_sp<SkColorSpace> adobe = SkColorSpace::MakeNamed(SkColorSpace::kAdobeRGB_Named);
+ sk_sp<SkColorSpace> srgb = SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named);
+ std::unique_ptr<SkColorSpaceXform> xform = SkColorSpaceXform::New(adobe.get(), srgb.get());
+
+ // ASAN will catch us if we read past the tail.
+ bool success = xform->apply(SkColorSpaceXform::kRGBA_8888_ColorFormat, &dstPixel,
+ SkColorSpaceXform::kRGBA_U16_BE_ColorFormat, srcPixel, 1,
+ kUnpremul_SkAlphaType);
+ REPORTER_ASSERT(r, success);
+}
+