diff options
author | Tor Andersson <tor@ghostscript.com> | 2004-09-27 02:15:04 +0200 |
---|---|---|
committer | Tor Andersson <tor@ghostscript.com> | 2004-09-27 02:15:04 +0200 |
commit | 6ddde92a3a45e970b05770633dc6a337d5d013c5 (patch) | |
tree | 1dec4612d7469839478e72d16d30a0da5755243c /render/porterduff.c | |
download | mupdf-6ddde92a3a45e970b05770633dc6a337d5d013c5.tar.xz |
Initial import
Diffstat (limited to 'render/porterduff.c')
-rw-r--r-- | render/porterduff.c | 74 |
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); + } +} + |