Example #1
0
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]);
    }
}
Example #2
0
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);
    }
}
Example #4
0
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]);
        }
    }
}
Example #6
0
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);
        }
    }
}
Example #7
0
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]);
        }
    }
}
Example #9
0
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);
        }
    }
}