| Index: src/core/SkXfermode4f.cpp
|
| diff --git a/src/core/SkXfermode4f.cpp b/src/core/SkXfermode4f.cpp
|
| index 8aa2ce26a4523d2d8f5d87ccf6f323b0064421ee..46eed05a191914f43d5e64c04fd67d31ac22955d 100644
|
| --- a/src/core/SkXfermode4f.cpp
|
| +++ b/src/core/SkXfermode4f.cpp
|
| @@ -9,11 +9,6 @@
|
| #include "SkUtils.h"
|
| #include "SkXfermode.h"
|
|
|
| -struct XferProcPair {
|
| - SkXfermode::PM4fProc1 fP1;
|
| - SkXfermode::PM4fProcN fPN;
|
| -};
|
| -
|
| enum DstType {
|
| kLinear_Dst,
|
| kSRGB_Dst,
|
| @@ -45,29 +40,29 @@ static Sk4f linear_unit_to_srgb_255f(const Sk4f& l4) {
|
|
|
| ///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
| -template <DstType D> void general_1(const SkXfermode::PM4fState& state, uint32_t dst[],
|
| - const SkPM4f& src, int count, const SkAlpha aa[]) {
|
| - SkXfermodeProc4f proc = state.fXfer->getProc4f();
|
| +template <DstType D> void general_1(const SkXfermode* xfer, uint32_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 = load_dst<D>(dst[i]);
|
| d4.store(d.fVec);
|
| - Sk4f r4 = Sk4f::Load(proc(src, d).fVec);
|
| + Sk4f r4 = Sk4f::Load(proc(*src, d).fVec);
|
| dst[i] = store_dst<D>(lerp(r4, d4, aa[i]));
|
| }
|
| } else {
|
| for (int i = 0; i < count; ++i) {
|
| load_dst<D>(dst[i]).store(d.fVec);
|
| - Sk4f r4 = Sk4f::Load(proc(src, d).fVec);
|
| + Sk4f r4 = Sk4f::Load(proc(*src, d).fVec);
|
| dst[i] = store_dst<D>(r4);
|
| }
|
| }
|
| }
|
|
|
| -template <DstType D> void general_n(const SkXfermode::PM4fState& state, uint32_t dst[],
|
| +template <DstType D> void general_n(const SkXfermode* xfer, uint32_t dst[],
|
| const SkPM4f src[], int count, const SkAlpha aa[]) {
|
| - SkXfermodeProc4f proc = state.fXfer->getProc4f();
|
| + SkXfermodeProc4f proc = xfer->getProc4f();
|
| SkPM4f d;
|
| if (aa) {
|
| for (int i = 0; i < count; ++i) {
|
| @@ -85,16 +80,16 @@ template <DstType D> void general_n(const SkXfermode::PM4fState& state, uint32_t
|
| }
|
| }
|
|
|
| -const XferProcPair gProcs_General[] = {
|
| - { general_1<kLinear_Dst>, general_n<kLinear_Dst> }, // linear alpha
|
| - { general_1<kLinear_Dst>, general_n<kLinear_Dst> }, // linear opaque
|
| - { general_1<kSRGB_Dst>, general_n<kSRGB_Dst> }, // srgb alpha
|
| - { general_1<kSRGB_Dst>, general_n<kSRGB_Dst> }, // srgb opaque
|
| +const SkXfermode::D32Proc gProcs_General[] = {
|
| + general_n<kLinear_Dst>, general_n<kLinear_Dst>,
|
| + general_1<kLinear_Dst>, general_1<kLinear_Dst>,
|
| + general_n<kSRGB_Dst>, general_n<kSRGB_Dst>,
|
| + general_1<kSRGB_Dst>, general_1<kSRGB_Dst>,
|
| };
|
|
|
| ///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
| -static void clear_linear_n(const SkXfermode::PM4fState& state, uint32_t dst[], const SkPM4f[],
|
| +static void clear_linear(const SkXfermode*, uint32_t dst[], const SkPM4f[],
|
| int count, const SkAlpha aa[]) {
|
| if (aa) {
|
| for (int i = 0; i < count; ++i) {
|
| @@ -109,45 +104,34 @@ static void clear_linear_n(const SkXfermode::PM4fState& state, uint32_t dst[], c
|
| }
|
| }
|
| } else {
|
| - sk_bzero(dst, count * sizeof(SkPMColor));
|
| + sk_memset32(dst, 0, count);
|
| }
|
| }
|
|
|
| -static void clear_linear_1(const SkXfermode::PM4fState& state, uint32_t dst[], const SkPM4f&,
|
| - int count, const SkAlpha coverage[]) {
|
| - clear_linear_n(state, dst, nullptr, count, coverage);
|
| -}
|
| -
|
| -static void clear_srgb_n(const SkXfermode::PM4fState& state, uint32_t dst[], const SkPM4f[],
|
| - int count, const SkAlpha aa[]) {
|
| +static void clear_srgb(const SkXfermode*, uint32_t dst[], const SkPM4f[],
|
| + int count, const SkAlpha aa[]) {
|
| if (aa) {
|
| for (int i = 0; i < count; ++i) {
|
| - unsigned a = aa[i];
|
| - if (a) {
|
| - Sk4f d = Sk4f_fromS32(dst[i]) * Sk4f((255 - a) * (1/255.0f));
|
| + if (aa[i]) {
|
| + Sk4f d = Sk4f_fromS32(dst[i]) * Sk4f((255 - aa[i]) * (1/255.0f));
|
| dst[i] = Sk4f_toS32(d);
|
| }
|
| }
|
| } else {
|
| - sk_bzero(dst, count * sizeof(SkPMColor));
|
| + sk_memset32(dst, 0, count);
|
| }
|
| }
|
|
|
| -static void clear_srgb_1(const SkXfermode::PM4fState& state, uint32_t dst[], const SkPM4f&,
|
| - int count, const SkAlpha coverage[]) {
|
| - clear_srgb_n(state, dst, nullptr, count, coverage);
|
| -}
|
| -
|
| -const XferProcPair gProcs_Clear[] = {
|
| - { clear_linear_1, clear_linear_n }, // linear [alpha]
|
| - { clear_linear_1, clear_linear_n }, // linear [opaque]
|
| - { clear_srgb_1, clear_srgb_n }, // srgb [alpha]
|
| - { clear_srgb_1, clear_srgb_n }, // srgb [opaque]
|
| +const SkXfermode::D32Proc gProcs_Clear[] = {
|
| + clear_linear, clear_linear,
|
| + clear_linear, clear_linear,
|
| + clear_srgb, clear_srgb,
|
| + clear_srgb, clear_srgb,
|
| };
|
|
|
| ///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
| -template <DstType D> void src_n(const SkXfermode::PM4fState& state, uint32_t dst[],
|
| +template <DstType D> void src_n(const SkXfermode*, uint32_t dst[],
|
| const SkPM4f src[], int count, const SkAlpha aa[]) {
|
| for (int i = 0; i < count; ++i) {
|
| unsigned a = 0xFF;
|
| @@ -170,9 +154,9 @@ static Sk4f lerp(const Sk4f& src, const Sk4f& dst, const Sk4f& src_scale) {
|
| return dst + (src - dst) * src_scale;
|
| }
|
|
|
| -template <DstType D> void src_1(const SkXfermode::PM4fState& state, uint32_t dst[],
|
| - const SkPM4f& src, int count, const SkAlpha aa[]) {
|
| - const Sk4f s4 = Sk4f::Load(src.fVec);
|
| +template <DstType D> void src_1(const SkXfermode*, uint32_t dst[],
|
| + const SkPM4f* src, int count, const SkAlpha aa[]) {
|
| + const Sk4f s4 = Sk4f::Load(src->fVec);
|
|
|
| if (aa) {
|
| if (D == kLinear_Dst) {
|
| @@ -223,31 +207,24 @@ template <DstType D> void src_1(const SkXfermode::PM4fState& state, uint32_t dst
|
| }
|
| }
|
|
|
| -const XferProcPair gProcs_Src[] = {
|
| - { src_1<kLinear_Dst>, src_n<kLinear_Dst> }, // linear [alpha]
|
| - { src_1<kLinear_Dst>, src_n<kLinear_Dst> }, // linear [opaque]
|
| - { src_1<kSRGB_Dst>, src_n<kSRGB_Dst> }, // srgb [alpha]
|
| - { src_1<kSRGB_Dst>, src_n<kSRGB_Dst> }, // srgb [opaque]
|
| +const SkXfermode::D32Proc gProcs_Src[] = {
|
| + src_n<kLinear_Dst>, src_n<kLinear_Dst>,
|
| + src_1<kLinear_Dst>, src_1<kLinear_Dst>,
|
| + src_n<kSRGB_Dst>, src_n<kSRGB_Dst>,
|
| + src_1<kSRGB_Dst>, src_1<kSRGB_Dst>,
|
| };
|
|
|
| ///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
| -static void dst_n(const SkXfermode::PM4fState& state, uint32_t dst[], const SkPM4f[],
|
| - int count, const SkAlpha aa[]) {}
|
| -
|
| -static void dst_1(const SkXfermode::PM4fState& state, uint32_t dst[], const SkPM4f&,
|
| - int count, const SkAlpha coverage[]) {}
|
| +static void dst(const SkXfermode*, uint32_t dst[], const SkPM4f[], int count, const SkAlpha aa[]) {}
|
|
|
| -const XferProcPair gProcs_Dst[] = {
|
| - { dst_1, dst_n },
|
| - { dst_1, dst_n },
|
| - { dst_1, dst_n },
|
| - { dst_1, dst_n },
|
| +const SkXfermode::D32Proc gProcs_Dst[] = {
|
| + dst, dst, dst, dst, dst, dst, dst, dst,
|
| };
|
|
|
| ///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
| -template <DstType D> void srcover_n(const SkXfermode::PM4fState& state, uint32_t dst[],
|
| +template <DstType D> void srcover_n(const SkXfermode*, uint32_t dst[],
|
| const SkPM4f src[], int count, const SkAlpha aa[]) {
|
| if (aa) {
|
| for (int i = 0; i < count; ++i) {
|
| @@ -273,9 +250,9 @@ template <DstType D> void srcover_n(const SkXfermode::PM4fState& state, uint32_t
|
| }
|
| }
|
|
|
| -static void srcover_linear_dst_1(const SkXfermode::PM4fState& state, uint32_t dst[],
|
| - const SkPM4f& src, int count, const SkAlpha aa[]) {
|
| - const Sk4f s4 = Sk4f::Load(src.fVec);
|
| +static void srcover_linear_dst_1(const SkXfermode*, uint32_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));
|
|
|
| if (aa) {
|
| @@ -316,9 +293,9 @@ static void srcover_linear_dst_1(const SkXfermode::PM4fState& state, uint32_t ds
|
| }
|
| }
|
|
|
| -static void srcover_srgb_dst_1(const SkXfermode::PM4fState& state, uint32_t dst[],
|
| - const SkPM4f& src, int count, const SkAlpha aa[]) {
|
| - Sk4f s4 = Sk4f::Load(src.fVec);
|
| +static void srcover_srgb_dst_1(const SkXfermode*, uint32_t dst[],
|
| + const SkPM4f* src, int count, const SkAlpha aa[]) {
|
| + Sk4f s4 = Sk4f::Load(src->fVec);
|
| Sk4f dst_scale = Sk4f(1 - get_alpha(s4));
|
|
|
| if (aa) {
|
| @@ -358,18 +335,19 @@ static void srcover_srgb_dst_1(const SkXfermode::PM4fState& state, uint32_t dst[
|
| }
|
| }
|
|
|
| -const XferProcPair gProcs_SrcOver[] = {
|
| - { srcover_linear_dst_1, srcover_n<kLinear_Dst> }, // linear alpha
|
| - { src_1<kLinear_Dst>, src_n<kLinear_Dst> }, // linear opaque [ we are src-mode ]
|
| - { srcover_srgb_dst_1, srcover_n<kSRGB_Dst> }, // srgb alpha
|
| - { src_1<kSRGB_Dst>, src_n<kSRGB_Dst> }, // srgb opaque [ we are src-mode ]
|
| +const SkXfermode::D32Proc gProcs_SrcOver[] = {
|
| + srcover_n<kLinear_Dst>, src_n<kLinear_Dst>,
|
| + srcover_linear_dst_1, src_1<kLinear_Dst>,
|
| +
|
| + srcover_n<kSRGB_Dst>, src_n<kSRGB_Dst>,
|
| + srcover_srgb_dst_1, src_1<kSRGB_Dst>,
|
| };
|
|
|
| ///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
| -static XferProcPair find_procs(SkXfermode::Mode mode, uint32_t flags) {
|
| - SkASSERT(0 == (flags & ~3));
|
| - flags &= 3;
|
| +static SkXfermode::D32Proc find_proc(SkXfermode::Mode mode, uint32_t flags) {
|
| + SkASSERT(0 == (flags & ~7));
|
| + flags &= 7;
|
|
|
| switch (mode) {
|
| case SkXfermode::kClear_Mode: return gProcs_Clear[flags];
|
| @@ -382,28 +360,16 @@ static XferProcPair find_procs(SkXfermode::Mode mode, uint32_t flags) {
|
| return gProcs_General[flags];
|
| }
|
|
|
| -SkXfermode::PM4fProc1 SkXfermode::GetPM4fProc1(Mode mode, uint32_t flags) {
|
| - return find_procs(mode, flags).fP1;
|
| -}
|
| -
|
| -SkXfermode::PM4fProcN SkXfermode::GetPM4fProcN(Mode mode, uint32_t flags) {
|
| - return find_procs(mode, flags).fPN;
|
| -}
|
| -
|
| -SkXfermode::PM4fProc1 SkXfermode::getPM4fProc1(uint32_t flags) const {
|
| - SkASSERT(0 == (flags & ~3));
|
| - flags &= 3;
|
| +SkXfermode::D32Proc SkXfermode::onGetD32Proc(uint32_t flags) const {
|
| + SkASSERT(0 == (flags & ~7));
|
| + flags &= 7;
|
|
|
| Mode mode;
|
| - return this->asMode(&mode) ? GetPM4fProc1(mode, flags) : gProcs_General[flags].fP1;
|
| + return this->asMode(&mode) ? find_proc(mode, flags) : gProcs_General[flags];
|
| }
|
|
|
| -SkXfermode::PM4fProcN SkXfermode::getPM4fProcN(uint32_t flags) const {
|
| - SkASSERT(0 == (flags & ~3));
|
| - flags &= 3;
|
| -
|
| - Mode mode;
|
| - return this->asMode(&mode) ? GetPM4fProcN(mode, flags) : gProcs_General[flags].fPN;
|
| +SkXfermode::D32Proc SkXfermode::GetD32Proc(SkXfermode* xfer, uint32_t flags) {
|
| + return xfer ? xfer->onGetD32Proc(flags) : find_proc(SkXfermode::kSrcOver_Mode, flags);
|
| }
|
|
|
| ///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|