Index: src/core/Sk4pxXfermode.h |
diff --git a/src/core/Sk4pxXfermode.h b/src/core/Sk4pxXfermode.h |
index fc0b643be1454de4893fc8f9c1caa8311eef4abd..ad822edb8b609f32d7db0e29e0e7ef796258af1e 100644 |
--- a/src/core/Sk4pxXfermode.h |
+++ b/src/core/Sk4pxXfermode.h |
@@ -222,6 +222,19 @@ public: |
} |
} |
+ void xfer16(uint16_t dst[], const SkPMColor src[], int n, const SkAlpha aa[]) const override { |
+ if (NULL == aa) { |
+ Sk4px::MapDstSrc(n, dst, src, [&](const Sk4px& dst4, const Sk4px& src4) { |
+ return fProc4(src4, dst4); |
+ }); |
+ } else { |
+ Sk4px::MapDstSrcAlpha(n, dst, src, aa, |
+ [&](const Sk4px& dst4, const Sk4px& src4, const Sk4px& alpha) { |
+ return fAAProc4(src4, dst4, alpha); |
+ }); |
+ } |
+ } |
+ |
private: |
Proc4 fProc4; |
AAProc4 fAAProc4; |
@@ -237,19 +250,35 @@ public: |
void xfer32(SkPMColor dst[], const SkPMColor src[], int n, const SkAlpha aa[]) const override { |
for (int i = 0; i < n; i++) { |
- SkPMFloat s(src[i]), |
- d(dst[i]), |
- b(fProcF(s,d)); |
- if (aa) { |
- // We do aa in full float precision before going back down to bytes, because we can! |
- SkPMFloat a = Sk4f(aa[i]) * Sk4f(1.0f/255); |
- b = b*a + d*(Sk4f(1)-a); |
- } |
- dst[i] = b.round(); |
+ dst[i] = aa ? this->xfer32(dst[i], src[i], aa[i]) |
+ : this->xfer32(dst[i], src[i]); |
+ } |
+ } |
+ |
+ void xfer16(uint16_t dst[], const SkPMColor src[], int n, const SkAlpha aa[]) const override { |
+ for (int i = 0; i < n; i++) { |
+ SkPMColor dst32 = SkPixel16ToPixel32(dst[i]); |
+ dst32 = aa ? this->xfer32(dst32, src[i], aa[i]) |
+ : this->xfer32(dst32, src[i]); |
+ dst[i] = SkPixel32ToPixel16(dst32); |
} |
} |
private: |
+ inline SkPMColor xfer32(SkPMColor dst, SkPMColor src) const { |
+ return fProcF(SkPMFloat(src), SkPMFloat(dst)).round(); |
+ } |
+ |
+ inline SkPMColor xfer32(SkPMColor dst, SkPMColor src, SkAlpha aa) const { |
+ SkPMFloat s(src), |
+ d(dst), |
+ b(fProcF(s,d)); |
+ // We do aa in full float precision before going back down to bytes, because we can! |
+ SkPMFloat a = Sk4f(aa) * Sk4f(1.0f/255); |
+ b = b*a + d*(Sk4f(1)-a); |
+ return b.round(); |
+ } |
+ |
ProcF fProcF; |
typedef SkProcCoeffXfermode INHERITED; |
}; |