static void srcover_n(const SkXfermode*, uint64_t dst[], const SkPM4f src[], int count, const SkAlpha aa[]) { for (int i = 0; i < count; ++i) { Sk4f s = Sk4f::Load(src+i), d = SkHalfToFloat_finite_ftz(dst[i]), r = s + d*(1.0f - SkNx_shuffle<3,3,3,3>(s)); if (aa) { r = lerp_by_coverage(r, d, aa[i]); } SkFloatToHalf_finite_ftz(r).store(&dst[i]); } }
template <DstType D> void src_1(const SkXfermode::U64State& state, uint64_t dst[], const SkPM4f& src, int count, const SkAlpha aa[]) { const Sk4f s4 = pm_to_rgba_order(unit_to_bias<D>(Sk4f::Load(src.fVec))); if (aa) { for (int i = 0; i < count; ++i) { const Sk4f d4 = load_from_dst<D>(dst[i]); dst[i] = store_to_dst<D>(lerp_by_coverage(s4, d4, aa[i])); } } else { sk_memset64(dst, store_to_dst<D>(s4), count); } }
static void src_1(SkBlendMode, uint64_t dst[], const SkPM4f* src, int count, const SkAlpha aa[]) { const Sk4f s4 = Sk4f::Load(src->fVec); if (aa) { for (int i = 0; i < count; ++i) { const Sk4f d4 = SkHalfToFloat_finite_ftz(dst[i]); SkFloatToHalf_finite_ftz(lerp_by_coverage(s4, d4, aa[i])).store(&dst[i]); } } else { uint64_t s4h; SkFloatToHalf_finite_ftz(s4).store(&s4h); sk_memset64(dst, s4h, count); } }
static void srcover_1(const SkXfermode*, uint64_t dst[], const SkPM4f* src, int count, const SkAlpha aa[]) { const Sk4f s4 = Sk4f::Load(src->fVec); const Sk4f dst_scale = Sk4f(1 - get_alpha(s4)); for (int i = 0; i < count; ++i) { const Sk4f d4 = SkHalfToFloat_finite_ftz(dst[i]); const Sk4f r4 = s4 + d4 * dst_scale; if (aa) { SkFloatToHalf_finite_ftz(lerp_by_coverage(r4, d4, aa[i])).store(&dst[i]); } else { SkFloatToHalf_finite_ftz(r4).store(&dst[i]); } } }
static void src_n(SkBlendMode, uint64_t dst[], const SkPM4f src[], int count, const SkAlpha aa[]) { if (aa) { for (int i = 0; i < count; ++i) { const Sk4f s4 = Sk4f::Load(src[i].fVec); const Sk4f d4 = SkHalfToFloat_finite_ftz(dst[i]); SkFloatToHalf_finite_ftz(lerp_by_coverage(s4, d4, aa[i])).store(&dst[i]); } } else { for (int i = 0; i < count; ++i) { const Sk4f s4 = Sk4f::Load(src[i].fVec); SkFloatToHalf_finite_ftz(s4).store(&dst[i]); } } }
template <DstType D> void srcover_n(const SkXfermode::U64State& state, uint64_t dst[], const SkPM4f src[], int count, const SkAlpha aa[]) { for (int i = 0; i < count; ++i) { const Sk4f s4 = pm_to_rgba_order(Sk4f::Load(src[i].fVec)); const Sk4f dst_scale = Sk4f(1 - get_alpha(s4)); const Sk4f s4bias = unit_to_bias<D>(s4); const Sk4f d4bias = load_from_dst<D>(dst[i]); const Sk4f r4bias = s4bias + d4bias * dst_scale; if (aa) { dst[i] = store_to_dst<D>(lerp_by_coverage(r4bias, d4bias, aa[i])); } else { dst[i] = store_to_dst<D>(r4bias); } } }
static void xfer_n(const SkXfermode* xfer, uint64_t dst[], const SkPM4f src[], int count, const SkAlpha aa[]) { SkXfermodeProc4f proc = xfer->getProc4f(); SkPM4f d; if (aa) { for (int i = 0; i < count; ++i) { Sk4f d4 = SkHalfToFloat_finite_ftz(dst[i]); d4.store(d.fVec); Sk4f r4 = Sk4f::Load(proc(src[i], d).fVec); SkFloatToHalf_finite_ftz(lerp_by_coverage(r4, d4, aa[i])).store(&dst[i]); } } else { for (int i = 0; i < count; ++i) { SkHalfToFloat_finite_ftz(dst[i]).store(d.fVec); Sk4f r4 = Sk4f::Load(proc(src[i], d).fVec); SkFloatToHalf_finite_ftz(r4).store(&dst[i]); } } }
static void xfer_1(SkBlendMode mode, uint64_t dst[], const SkPM4f* src, int count, const SkAlpha aa[]) { SkXfermodeProc4f proc = SkXfermode::GetProc4f(mode); SkPM4f d; if (aa) { for (int i = 0; i < count; ++i) { Sk4f d4 = SkHalfToFloat_finite_ftz(dst[i]); d4.store(d.fVec); Sk4f r4 = Sk4f::Load(proc(*src, d).fVec); SkFloatToHalf_finite_ftz(lerp_by_coverage(r4, d4, aa[i])).store(&dst[i]); } } else { for (int i = 0; i < count; ++i) { SkHalfToFloat_finite_ftz(dst[i]).store(d.fVec); Sk4f r4 = Sk4f::Load(proc(*src, d).fVec); SkFloatToHalf_finite_ftz(r4).store(&dst[i]); } } }
template <DstType D> void xfer_u64_n(const SkXfermode::U64State& state, uint64_t dst[], const SkPM4f src[], int count, const SkAlpha aa[]) { SkXfermodeProc4f proc = state.fXfer->getProc4f(); SkPM4f d; if (aa) { for (int i = 0; i < count; ++i) { Sk4f d4 = bias_to_unit<D>(load_from_dst<D>(dst[i])); d4.store(d.fVec); Sk4f r4 = unit_to_bias<D>(Sk4f::Load(proc(src[i], d).fVec)); dst[i] = store_to_dst<D>(lerp_by_coverage(r4, d4, aa[i])); } } else { for (int i = 0; i < count; ++i) { bias_to_unit<D>(load_from_dst<D>(dst[i])).store(d.fVec); Sk4f r4 = unit_to_bias<D>(Sk4f::Load(proc(src[i], d).fVec)); dst[i] = store_to_dst<D>(r4); } } }