static void srcover_linear_dst_1(const SkXfermode*, uint32_t dst[], const SkPM4f* src, int count, const SkAlpha aa[]) { const Sk4f s4 = src->to4f_pmorder(); const Sk4f dst_scale = Sk4f(1 - get_alpha(s4)); if (aa) { for (int i = 0; i < count; ++i) { unsigned a = aa[i]; if (0 == a) { continue; } Sk4f d4 = Sk4f_fromL32(dst[i]); Sk4f r4; if (a != 0xFF) { Sk4f s4_aa = scale_by_coverage(s4, a); r4 = s4_aa + d4 * Sk4f(1 - get_alpha(s4_aa)); } else { r4 = s4 + d4 * dst_scale; } dst[i] = Sk4f_toL32(r4); } } else { const Sk4f s4_255 = s4 * Sk4f(255) + Sk4f(0.5f); // +0.5 to pre-bias for rounding while (count >= 4) { Sk4f d0 = to_4f(dst[0]); Sk4f d1 = to_4f(dst[1]); Sk4f d2 = to_4f(dst[2]); Sk4f d3 = to_4f(dst[3]); Sk4f_ToBytes((uint8_t*)dst, s4_255 + d0 * dst_scale, s4_255 + d1 * dst_scale, s4_255 + d2 * dst_scale, s4_255 + d3 * dst_scale); dst += 4; count -= 4; } for (int i = 0; i < count; ++i) { Sk4f d4 = to_4f(dst[i]); dst[i] = to_4b(s4_255 + d4 * dst_scale); } } }
SkPM4f SkPM4f::FromPMColor(SkPMColor c) { return From4f(swizzle_rb_if_bgra(Sk4f_fromL32(c))); }
static Sk4f To4f(SkPMColor c) { return Sk4f_fromL32(c); }
template <DstType D> Sk4f load_dst(SkPMColor dstC) { return (D == kSRGB_Dst) ? Sk4f_fromS32(dstC) : Sk4f_fromL32(dstC); }