summaryrefslogtreecommitdiff
path: root/render/porterduff.c
diff options
context:
space:
mode:
authorTor Andersson <tor@ghostscript.com>2004-09-27 02:15:04 +0200
committerTor Andersson <tor@ghostscript.com>2004-09-27 02:15:04 +0200
commit6ddde92a3a45e970b05770633dc6a337d5d013c5 (patch)
tree1dec4612d7469839478e72d16d30a0da5755243c /render/porterduff.c
downloadmupdf-6ddde92a3a45e970b05770633dc6a337d5d013c5.tar.xz
Initial import
Diffstat (limited to 'render/porterduff.c')
-rw-r--r--render/porterduff.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/render/porterduff.c b/render/porterduff.c
new file mode 100644
index 00000000..1cedbc38
--- /dev/null
+++ b/render/porterduff.c
@@ -0,0 +1,74 @@
+#include <fitz.h>
+
+/* Porter-Duff compositing arithmetic on premultiplied ARGB buffers */
+
+void
+fz_blendover(unsigned char *C, unsigned char *A, unsigned char *B, int n)
+{
+ while (n--)
+ {
+ unsigned char Fa = 255;
+ unsigned char Fb = 255 - A[0];
+ *C++ = fz_mul255(*A++, Fa) + fz_mul255(*B++, Fb);
+ *C++ = fz_mul255(*A++, Fa) + fz_mul255(*B++, Fb);
+ *C++ = fz_mul255(*A++, Fa) + fz_mul255(*B++, Fb);
+ *C++ = fz_mul255(*A++, Fa) + fz_mul255(*B++, Fb);
+ }
+}
+
+void
+fz_blendin(unsigned char *C, unsigned char *A, unsigned char *B, int n)
+{
+ while (n--)
+ {
+ unsigned char Fa = B[0];
+ unsigned char Fb = 0;
+ *C++ = fz_mul255(*A++, Fa) + fz_mul255(*B++, Fb);
+ *C++ = fz_mul255(*A++, Fa) + fz_mul255(*B++, Fb);
+ *C++ = fz_mul255(*A++, Fa) + fz_mul255(*B++, Fb);
+ *C++ = fz_mul255(*A++, Fa) + fz_mul255(*B++, Fb);
+ }
+}
+
+void
+fz_blendout(unsigned char *C, unsigned char *A, unsigned char *B, int n)
+{
+ while (n--)
+ {
+ unsigned char Fa = 255 - B[0];
+ unsigned char Fb = 0;
+ *C++ = fz_mul255(*A++, Fa) + fz_mul255(*B++, Fb);
+ *C++ = fz_mul255(*A++, Fa) + fz_mul255(*B++, Fb);
+ *C++ = fz_mul255(*A++, Fa) + fz_mul255(*B++, Fb);
+ *C++ = fz_mul255(*A++, Fa) + fz_mul255(*B++, Fb);
+ }
+}
+
+void
+fz_blendatop(unsigned char *C, unsigned char *A, unsigned char *B, int n)
+{
+ while (n--)
+ {
+ unsigned char Fa = B[0];
+ unsigned char Fb = 255 - A[0];
+ *C++ = fz_mul255(*A++, Fa) + fz_mul255(*B++, Fb);
+ *C++ = fz_mul255(*A++, Fa) + fz_mul255(*B++, Fb);
+ *C++ = fz_mul255(*A++, Fa) + fz_mul255(*B++, Fb);
+ *C++ = fz_mul255(*A++, Fa) + fz_mul255(*B++, Fb);
+ }
+}
+
+void
+fz_blendxor(unsigned char *C, unsigned char *A, unsigned char *B, int n)
+{
+ while (n--)
+ {
+ unsigned char Fa = 255 - B[0];
+ unsigned char Fb = 255 - A[0];
+ *C++ = fz_mul255(*A++, Fa) + fz_mul255(*B++, Fb);
+ *C++ = fz_mul255(*A++, Fa) + fz_mul255(*B++, Fb);
+ *C++ = fz_mul255(*A++, Fa) + fz_mul255(*B++, Fb);
+ *C++ = fz_mul255(*A++, Fa) + fz_mul255(*B++, Fb);
+ }
+}
+