| Index: src/core/SkXfermode4f.cpp
|
| diff --git a/src/core/SkXfermode4f.cpp b/src/core/SkXfermode4f.cpp
|
| index 46eed05a191914f43d5e64c04fd67d31ac22955d..05d0f80cea1a1f86b59d13735523d142ddc2a18d 100644
|
| --- a/src/core/SkXfermode4f.cpp
|
| +++ b/src/core/SkXfermode4f.cpp
|
| @@ -42,19 +42,20 @@ static Sk4f linear_unit_to_srgb_255f(const Sk4f& l4) {
|
|
|
| template <DstType D> void general_1(const SkXfermode* xfer, uint32_t dst[],
|
| const SkPM4f* src, int count, const SkAlpha aa[]) {
|
| + const SkPM4f s = src->pmorder();
|
| 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(s, 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(s, d).fVec);
|
| dst[i] = store_dst<D>(r4);
|
| }
|
| }
|
| @@ -68,7 +69,7 @@ template <DstType D> void general_n(const SkXfermode* xfer, uint32_t dst[],
|
| for (int i = 0; i < count; ++i) {
|
| Sk4f d4 = load_dst<D>(dst[i]);
|
| d4.store(d.fVec);
|
| - Sk4f r4 = Sk4f::Load(proc(src[i], d).fVec);
|
| + Sk4f r4 = Sk4f::Load(proc(src[i].pmorder(), d).fVec);
|
| dst[i] = store_dst<D>(lerp(r4, d4, aa[i]));
|
| }
|
| } else {
|
| @@ -141,7 +142,7 @@ template <DstType D> void src_n(const SkXfermode*, uint32_t dst[],
|
| continue;
|
| }
|
| }
|
| - Sk4f r4 = Sk4f::Load(src[i].fVec); // src always overrides dst
|
| + Sk4f r4 = src[i].to4f_pmorder();
|
| if (a != 0xFF) {
|
| Sk4f d4 = load_dst<D>(dst[i]);
|
| r4 = lerp(r4, d4, a);
|
| @@ -156,7 +157,7 @@ static Sk4f lerp(const Sk4f& src, const Sk4f& dst, const Sk4f& src_scale) {
|
|
|
| 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);
|
| + const Sk4f s4 = src->to4f_pmorder();
|
|
|
| if (aa) {
|
| if (D == kLinear_Dst) {
|
| @@ -232,7 +233,7 @@ template <DstType D> void srcover_n(const SkXfermode*, uint32_t dst[],
|
| if (0 == a) {
|
| continue;
|
| }
|
| - Sk4f s4 = Sk4f::Load(src[i].fVec);
|
| + Sk4f s4 = src[i].to4f_pmorder();
|
| Sk4f d4 = load_dst<D>(dst[i]);
|
| if (a != 0xFF) {
|
| s4 = scale_by_coverage(s4, a);
|
| @@ -242,7 +243,7 @@ template <DstType D> void srcover_n(const SkXfermode*, uint32_t dst[],
|
| }
|
| } else {
|
| for (int i = 0; i < count; ++i) {
|
| - Sk4f s4 = Sk4f::Load(src[i].fVec);
|
| + Sk4f s4 = src[i].to4f_pmorder();
|
| Sk4f d4 = load_dst<D>(dst[i]);
|
| Sk4f r4 = s4 + d4 * Sk4f(1 - get_alpha(s4));
|
| dst[i] = store_dst<D>(r4);
|
| @@ -252,7 +253,7 @@ template <DstType D> void srcover_n(const SkXfermode*, uint32_t dst[],
|
|
|
| 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 s4 = src->to4f_pmorder();
|
| const Sk4f dst_scale = Sk4f(1 - get_alpha(s4));
|
|
|
| if (aa) {
|
| @@ -295,7 +296,7 @@ static void srcover_linear_dst_1(const SkXfermode*, uint32_t dst[],
|
|
|
| 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 s4 = src->to4f_pmorder();
|
| Sk4f dst_scale = Sk4f(1 - get_alpha(s4));
|
|
|
| if (aa) {
|
|
|