// N.B. scratch_matrix_3x4 must live at least as long as p.
static inline void append_gamut_transform(SkRasterPipeline* p, float scratch_matrix_3x4[12],
- SkColorSpace* src, SkColorSpace* dst) {
+ SkColorSpace* src, SkColorSpace* dst,
+ SkAlphaType alphaType) {
if (src == dst) { return; } // That was easy.
if (!dst) { return; } // Legacy modes intentionally ignore color gamut.
if (!src) { return; } // A null src color space means linear gamma, dst gamut.
*ptr++ = m44.get(0,2); *ptr++ = m44.get(1,2); *ptr++ = m44.get(2,2);
*ptr++ = m44.get(0,3); *ptr++ = m44.get(1,3); *ptr++ = m44.get(2,3);
- bool needs_clamp_0, needs_clamp_a;
- analyze_3x4_matrix(scratch_matrix_3x4, &needs_clamp_0, &needs_clamp_a);
+ bool needs_clamp_0, needs_clamp_1;
+ analyze_3x4_matrix(scratch_matrix_3x4, &needs_clamp_0, &needs_clamp_1);
p->append(SkRasterPipeline::matrix_3x4, scratch_matrix_3x4);
if (needs_clamp_0) { p->append(SkRasterPipeline::clamp_0); }
- if (needs_clamp_a) { p->append(SkRasterPipeline::clamp_a); }
+ if (needs_clamp_1) {
+ (kPremul_SkAlphaType == alphaType) ? p->append(SkRasterPipeline::clamp_a)
+ : p->append(SkRasterPipeline::clamp_1);
+ }
}
static inline void append_gamut_transform(SkRasterPipeline* p, SkArenaAlloc* scratch,
- SkColorSpace* src, SkColorSpace* dst) {
- append_gamut_transform(p, scratch->makeArrayDefault<float>(12), src, dst);
+ SkColorSpace* src, SkColorSpace* dst,
+ SkAlphaType alphaType) {
+ append_gamut_transform(p, scratch->makeArrayDefault<float>(12), src, dst, alphaType);
}
static inline SkColor4f to_colorspace(const SkColor4f& c, SkColorSpace* src, SkColorSpace* dst) {
SkRasterPipeline p;
p.append(SkRasterPipeline::constant_color, color4f_ptr);
- append_gamut_transform(&p, scratch_matrix_3x4, src, dst);
+ append_gamut_transform(&p, scratch_matrix_3x4, src, dst, kUnpremul_SkAlphaType);
p.append(SkRasterPipeline::store_f32, &color4f_ptr);
p.run(0,1);