diff options
Diffstat (limited to 'pixman/src/iccompose.c')
-rw-r--r-- | pixman/src/iccompose.c | 2713 |
1 files changed, 0 insertions, 2713 deletions
diff --git a/pixman/src/iccompose.c b/pixman/src/iccompose.c deleted file mode 100644 index 7d9a63c65..000000000 --- a/pixman/src/iccompose.c +++ /dev/null @@ -1,2713 +0,0 @@ -/* - * Copyright © 2000 Keith Packard - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the name of Keith Packard not be used in - * advertising or publicity pertaining to distribution of the software without - * specific, written prior permission. Keith Packard makes no - * representations about the suitability of this software for any purpose. It - * is provided "as is" without express or implied warranty. - * - * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - - -#include "icint.h" - -/* - * General purpose compositing code optimized for minimal memory - * references - * - * All work is done on canonical ARGB values, functions for fetching - * and storing these exist for each format. - */ - -/* - * Combine src and mask using IN - */ - -static uint32_t -IcCombineMaskU (IcCompositeOperand *src, - IcCompositeOperand *msk) -{ - uint32_t x; - uint16_t a; - uint16_t t; - uint32_t m,n,o,p; - - if (!msk) - return (*src->fetch) (src); - - a = (*msk->fetch) (msk) >> 24; - if (!a) - return 0; - - x = (*src->fetch) (src); - if (a == 0xff) - return x; - - m = IcInU(x,0,a,t); - n = IcInU(x,8,a,t); - o = IcInU(x,16,a,t); - p = IcInU(x,24,a,t); - return m|n|o|p; -} - -static IcCompSrc -IcCombineMaskC (IcCompositeOperand *src, - IcCompositeOperand *msk) -{ - IcCompSrc s; - uint32_t x; - uint32_t a; - uint16_t xa; - uint16_t t; - uint32_t m,n,o,p; - - if (!msk) - { - x = (*src->fetch) (src); - s.value = x; - x = x >> 24; - x |= x << 8; - x |= x << 16; - s.alpha = x; - return s; - } - - a = (*msk->fetcha) (msk); - if (!a) - { - s.value = 0; - s.alpha = 0; - return s; - } - - x = (*src->fetch) (src); - if (a == 0xffffffff) - { - s.value = x; - x = x >> 24; - x |= x << 8; - x |= x << 16; - s.alpha = x; - return s; - } - - m = IcInC(x,0,a,t); - n = IcInC(x,8,a,t); - o = IcInC(x,16,a,t); - p = IcInC(x,24,a,t); - s.value = m|n|o|p; - xa = x >> 24; - m = IcInU(a,0,xa,t); - n = IcInU(a,8,xa,t); - o = IcInU(a,16,xa,t); - p = IcInU(a,24,xa,t); - s.alpha = m|n|o|p; - return s; -} - -static uint32_t -IcCombineMaskValueC (IcCompositeOperand *src, - IcCompositeOperand *msk) -{ - uint32_t x; - uint32_t a; - uint16_t t; - uint32_t m,n,o,p; - - if (!msk) - { - return (*src->fetch) (src); - } - - a = (*msk->fetcha) (msk); - if (!a) - return a; - - x = (*src->fetch) (src); - if (a == 0xffffffff) - return x; - - m = IcInC(x,0,a,t); - n = IcInC(x,8,a,t); - o = IcInC(x,16,a,t); - p = IcInC(x,24,a,t); - return m|n|o|p; -} - -/* - * Combine src and mask using IN, generating only the alpha component - */ -static uint32_t -IcCombineMaskAlphaU (IcCompositeOperand *src, - IcCompositeOperand *msk) -{ - uint32_t x; - uint16_t a; - uint16_t t; - - if (!msk) - return (*src->fetch) (src); - - a = (*msk->fetch) (msk) >> 24; - if (!a) - return 0; - - x = (*src->fetch) (src); - if (a == 0xff) - return x; - - return IcInU(x,24,a,t); -} - -static uint32_t -IcCombineMaskAlphaC (IcCompositeOperand *src, - IcCompositeOperand *msk) -{ - uint32_t x; - uint32_t a; - uint16_t t; - uint32_t m,n,o,p; - - if (!msk) - return (*src->fetch) (src); - - a = (*msk->fetcha) (msk); - if (!a) - return 0; - - x = (*src->fetcha) (src); - if (a == 0xffffffff) - return x; - - m = IcInC(x,0,a,t); - n = IcInC(x,8,a,t); - o = IcInC(x,16,a,t); - p = IcInC(x,24,a,t); - return m|n|o|p; -} - -/* - * All of the composing functions - */ -static void -IcCombineClear (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - (*dst->store) (dst, 0); -} - -static void -IcCombineSrcU (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - (*dst->store) (dst, IcCombineMaskU (src, msk)); -} - -static void -IcCombineSrcC (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - (*dst->store) (dst, IcCombineMaskValueC (src, msk)); -} - -static void -IcCombineDst (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - /* noop */ -} - -static void -IcCombineOverU (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - uint32_t s, d; - uint16_t a; - uint16_t t; - uint32_t m,n,o,p; - - s = IcCombineMaskU (src, msk); - a = ~s >> 24; - if (a != 0xff) - { - if (a) - { - d = (*dst->fetch) (dst); - m = IcOverU(s,d,0,a,t); - n = IcOverU(s,d,8,a,t); - o = IcOverU(s,d,16,a,t); - p = IcOverU(s,d,24,a,t); - s = m|n|o|p; - } - (*dst->store) (dst, s); - } -} - -static void -IcCombineOverC (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCompSrc cs; - uint32_t s, d; - uint32_t a; - uint16_t t; - uint32_t m,n,o,p; - - cs = IcCombineMaskC (src, msk); - s = cs.value; - a = ~cs.alpha; - if (a != 0xffffffff) - { - if (a) - { - d = (*dst->fetch) (dst); - m = IcOverC(s,d,0,a,t); - n = IcOverC(s,d,8,a,t); - o = IcOverC(s,d,16,a,t); - p = IcOverC(s,d,24,a,t); - s = m|n|o|p; - } - (*dst->store) (dst, s); - } -} - -static void -IcCombineOverReverseU (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - uint32_t s, d; - uint16_t a; - uint16_t t; - uint32_t m,n,o,p; - - d = (*dst->fetch) (dst); - a = ~d >> 24; - if (a) - { - s = IcCombineMaskU (src, msk); - if (a != 0xff) - { - m = IcOverU(d,s,0,a,t); - n = IcOverU(d,s,8,a,t); - o = IcOverU(d,s,16,a,t); - p = IcOverU(d,s,24,a,t); - s = m|n|o|p; - } - (*dst->store) (dst, s); - } -} - -static void -IcCombineOverReverseC (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - uint32_t s, d; - uint32_t a; - uint16_t t; - uint32_t m,n,o,p; - - d = (*dst->fetch) (dst); - a = ~d >> 24; - if (a) - { - s = IcCombineMaskValueC (src, msk); - if (a != 0xff) - { - m = IcOverU(d,s,0,a,t); - n = IcOverU(d,s,8,a,t); - o = IcOverU(d,s,16,a,t); - p = IcOverU(d,s,24,a,t); - s = m|n|o|p; - } - (*dst->store) (dst, s); - } -} - -static void -IcCombineInU (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - uint32_t s, d; - uint16_t a; - uint16_t t; - uint32_t m,n,o,p; - - d = (*dst->fetch) (dst); - a = d >> 24; - s = 0; - if (a) - { - s = IcCombineMaskU (src, msk); - if (a != 0xff) - { - m = IcInU(s,0,a,t); - n = IcInU(s,8,a,t); - o = IcInU(s,16,a,t); - p = IcInU(s,24,a,t); - s = m|n|o|p; - } - } - (*dst->store) (dst, s); -} - -static void -IcCombineInC (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - uint32_t s, d; - uint16_t a; - uint16_t t; - uint32_t m,n,o,p; - - d = (*dst->fetch) (dst); - a = d >> 24; - s = 0; - if (a) - { - s = IcCombineMaskValueC (src, msk); - if (a != 0xff) - { - m = IcInU(s,0,a,t); - n = IcInU(s,8,a,t); - o = IcInU(s,16,a,t); - p = IcInU(s,24,a,t); - s = m|n|o|p; - } - } - (*dst->store) (dst, s); -} - -static void -IcCombineInReverseU (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - uint32_t s, d; - uint16_t a; - uint16_t t; - uint32_t m,n,o,p; - - s = IcCombineMaskAlphaU (src, msk); - a = s >> 24; - if (a != 0xff) - { - d = 0; - if (a) - { - d = (*dst->fetch) (dst); - m = IcInU(d,0,a,t); - n = IcInU(d,8,a,t); - o = IcInU(d,16,a,t); - p = IcInU(d,24,a,t); - d = m|n|o|p; - } - (*dst->store) (dst, d); - } -} - -static void -IcCombineInReverseC (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - uint32_t s, d; - uint32_t a; - uint16_t t; - uint32_t m,n,o,p; - - s = IcCombineMaskAlphaC (src, msk); - a = s; - if (a != 0xffffffff) - { - d = 0; - if (a) - { - d = (*dst->fetch) (dst); - m = IcInC(d,0,a,t); - n = IcInC(d,8,a,t); - o = IcInC(d,16,a,t); - p = IcInC(d,24,a,t); - d = m|n|o|p; - } - (*dst->store) (dst, d); - } -} - -static void -IcCombineOutU (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - uint32_t s, d; - uint16_t a; - uint16_t t; - uint32_t m,n,o,p; - - d = (*dst->fetch) (dst); - a = ~d >> 24; - s = 0; - if (a) - { - s = IcCombineMaskU (src, msk); - if (a != 0xff) - { - m = IcInU(s,0,a,t); - n = IcInU(s,8,a,t); - o = IcInU(s,16,a,t); - p = IcInU(s,24,a,t); - s = m|n|o|p; - } - } - (*dst->store) (dst, s); -} - -static void -IcCombineOutC (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - uint32_t s, d; - uint16_t a; - uint16_t t; - uint32_t m,n,o,p; - - d = (*dst->fetch) (dst); - a = ~d >> 24; - s = 0; - if (a) - { - s = IcCombineMaskValueC (src, msk); - if (a != 0xff) - { - m = IcInU(s,0,a,t); - n = IcInU(s,8,a,t); - o = IcInU(s,16,a,t); - p = IcInU(s,24,a,t); - s = m|n|o|p; - } - } - (*dst->store) (dst, s); -} - -static void -IcCombineOutReverseU (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - uint32_t s, d; - uint16_t a; - uint16_t t; - uint32_t m,n,o,p; - - s = IcCombineMaskAlphaU (src, msk); - a = ~s >> 24; - if (a != 0xff) - { - d = 0; - if (a) - { - d = (*dst->fetch) (dst); - m = IcInU(d,0,a,t); - n = IcInU(d,8,a,t); - o = IcInU(d,16,a,t); - p = IcInU(d,24,a,t); - d = m|n|o|p; - } - (*dst->store) (dst, d); - } -} - -static void -IcCombineOutReverseC (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - uint32_t s, d; - uint32_t a; - uint16_t t; - uint32_t m,n,o,p; - - s = IcCombineMaskAlphaC (src, msk); - a = ~s; - if (a != 0xffffffff) - { - d = 0; - if (a) - { - d = (*dst->fetch) (dst); - m = IcInC(d,0,a,t); - n = IcInC(d,8,a,t); - o = IcInC(d,16,a,t); - p = IcInC(d,24,a,t); - d = m|n|o|p; - } - (*dst->store) (dst, d); - } -} - -static void -IcCombineAtopU (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - uint32_t s, d; - uint16_t ad, as; - uint16_t t,u,v; - uint32_t m,n,o,p; - - s = IcCombineMaskU (src, msk); - d = (*dst->fetch) (dst); - ad = ~s >> 24; - as = d >> 24; - m = IcGen(s,d,0,as,ad,t,u,v); - n = IcGen(s,d,8,as,ad,t,u,v); - o = IcGen(s,d,16,as,ad,t,u,v); - p = IcGen(s,d,24,as,ad,t,u,v); - (*dst->store) (dst, m|n|o|p); -} - -static void -IcCombineAtopC (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCompSrc cs; - uint32_t s, d; - uint32_t ad; - uint16_t as; - uint16_t t, u, v; - uint32_t m,n,o,p; - - cs = IcCombineMaskC (src, msk); - d = (*dst->fetch) (dst); - s = cs.value; - ad = cs.alpha; - as = d >> 24; - m = IcGen(s,d,0,as,IcGet8(ad,0),t,u,v); - n = IcGen(s,d,8,as,IcGet8(ad,8),t,u,v); - o = IcGen(s,d,16,as,IcGet8(ad,16),t,u,v); - p = IcGen(s,d,24,as,IcGet8(ad,24),t,u,v); - (*dst->store) (dst, m|n|o|p); -} - -static void -IcCombineAtopReverseU (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - uint32_t s, d; - uint16_t ad, as; - uint16_t t, u, v; - uint32_t m,n,o,p; - - s = IcCombineMaskU (src, msk); - d = (*dst->fetch) (dst); - ad = s >> 24; - as = ~d >> 24; - m = IcGen(s,d,0,as,ad,t,u,v); - n = IcGen(s,d,8,as,ad,t,u,v); - o = IcGen(s,d,16,as,ad,t,u,v); - p = IcGen(s,d,24,as,ad,t,u,v); - (*dst->store) (dst, m|n|o|p); -} - -static void -IcCombineAtopReverseC (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCompSrc cs; - uint32_t s, d, ad; - uint16_t as; - uint16_t t, u, v; - uint32_t m,n,o,p; - - cs = IcCombineMaskC (src, msk); - d = (*dst->fetch) (dst); - s = cs.value; - ad = cs.alpha; - as = ~d >> 24; - m = IcGen(s,d,0,as,IcGet8(ad,0),t,u,v); - n = IcGen(s,d,8,as,IcGet8(ad,8),t,u,v); - o = IcGen(s,d,16,as,IcGet8(ad,16),t,u,v); - p = IcGen(s,d,24,as,IcGet8(ad,24),t,u,v); - (*dst->store) (dst, m|n|o|p); -} - -static void -IcCombineXorU (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - uint32_t s, d; - uint16_t ad, as; - uint16_t t, u, v; - uint32_t m,n,o,p; - - s = IcCombineMaskU (src, msk); - d = (*dst->fetch) (dst); - ad = ~s >> 24; - as = ~d >> 24; - m = IcGen(s,d,0,as,ad,t,u,v); - n = IcGen(s,d,8,as,ad,t,u,v); - o = IcGen(s,d,16,as,ad,t,u,v); - p = IcGen(s,d,24,as,ad,t,u,v); - (*dst->store) (dst, m|n|o|p); -} - -static void -IcCombineXorC (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCompSrc cs; - uint32_t s, d, ad; - uint16_t as; - uint16_t t, u, v; - uint32_t m,n,o,p; - - cs = IcCombineMaskC (src, msk); - d = (*dst->fetch) (dst); - s = cs.value; - ad = ~cs.alpha; - as = ~d >> 24; - m = IcGen(s,d,0,as,ad,t,u,v); - n = IcGen(s,d,8,as,ad,t,u,v); - o = IcGen(s,d,16,as,ad,t,u,v); - p = IcGen(s,d,24,as,ad,t,u,v); - (*dst->store) (dst, m|n|o|p); -} - -static void -IcCombineAddU (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - uint32_t s, d; - uint16_t t; - uint32_t m,n,o,p; - - s = IcCombineMaskU (src, msk); - if (s == ~0) - (*dst->store) (dst, s); - else - { - d = (*dst->fetch) (dst); - if (s && d != ~0) - { - m = IcAdd(s,d,0,t); - n = IcAdd(s,d,8,t); - o = IcAdd(s,d,16,t); - p = IcAdd(s,d,24,t); - (*dst->store) (dst, m|n|o|p); - } - } -} - -static void -IcCombineAddC (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - uint32_t s, d; - uint16_t t; - uint32_t m,n,o,p; - - s = IcCombineMaskValueC (src, msk); - if (s == ~0) - (*dst->store) (dst, s); - else - { - d = (*dst->fetch) (dst); - if (s && d != ~0) - { - m = IcAdd(s,d,0,t); - n = IcAdd(s,d,8,t); - o = IcAdd(s,d,16,t); - p = IcAdd(s,d,24,t); - (*dst->store) (dst, m|n|o|p); - } - } -} - -/* - * All of the disjoint composing functions - - The four entries in the first column indicate what source contributions - come from each of the four areas of the picture -- areas covered by neither - A nor B, areas covered only by A, areas covered only by B and finally - areas covered by both A and B. - - Disjoint Conjoint - Fa Fb Fa Fb -(0,0,0,0) 0 0 0 0 -(0,A,0,A) 1 0 1 0 -(0,0,B,B) 0 1 0 1 -(0,A,B,A) 1 min((1-a)/b,1) 1 max(1-a/b,0) -(0,A,B,B) min((1-b)/a,1) 1 max(1-b/a,0) 1 -(0,0,0,A) max(1-(1-b)/a,0) 0 min(1,b/a) 0 -(0,0,0,B) 0 max(1-(1-a)/b,0) 0 min(a/b,1) -(0,A,0,0) min(1,(1-b)/a) 0 max(1-b/a,0) 0 -(0,0,B,0) 0 min(1,(1-a)/b) 0 max(1-a/b,0) -(0,0,B,A) max(1-(1-b)/a,0) min(1,(1-a)/b) min(1,b/a) max(1-a/b,0) -(0,A,0,B) min(1,(1-b)/a) max(1-(1-a)/b,0) max(1-b/a,0) min(1,a/b) -(0,A,B,0) min(1,(1-b)/a) min(1,(1-a)/b) max(1-b/a,0) max(1-a/b,0) - - */ - -#define CombineAOut 1 -#define CombineAIn 2 -#define CombineBOut 4 -#define CombineBIn 8 - -#define CombineClear 0 -#define CombineA (CombineAOut|CombineAIn) -#define CombineB (CombineBOut|CombineBIn) -#define CombineAOver (CombineAOut|CombineBOut|CombineAIn) -#define CombineBOver (CombineAOut|CombineBOut|CombineBIn) -#define CombineAAtop (CombineBOut|CombineAIn) -#define CombineBAtop (CombineAOut|CombineBIn) -#define CombineXor (CombineAOut|CombineBOut) - -/* portion covered by a but not b */ -static uint8_t -IcCombineDisjointOutPart (uint8_t a, uint8_t b) -{ - /* min (1, (1-b) / a) */ - - b = ~b; /* 1 - b */ - if (b >= a) /* 1 - b >= a -> (1-b)/a >= 1 */ - return 0xff; /* 1 */ - return IcIntDiv(b,a); /* (1-b) / a */ -} - -/* portion covered by both a and b */ -static uint8_t -IcCombineDisjointInPart (uint8_t a, uint8_t b) -{ - /* max (1-(1-b)/a,0) */ - /* = - min ((1-b)/a - 1, 0) */ - /* = 1 - min (1, (1-b)/a) */ - - b = ~b; /* 1 - b */ - if (b >= a) /* 1 - b >= a -> (1-b)/a >= 1 */ - return 0; /* 1 - 1 */ - return ~IcIntDiv(b,a); /* 1 - (1-b) / a */ -} - -static void -IcCombineDisjointGeneralU (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst, - uint8_t combine) -{ - uint32_t s, d; - uint32_t m,n,o,p; - uint16_t Fa, Fb, t, u, v; - uint8_t sa, da; - - s = IcCombineMaskU (src, msk); - sa = s >> 24; - - d = (*dst->fetch) (dst); - da = d >> 24; - - switch (combine & CombineA) { - default: - Fa = 0; - break; - case CombineAOut: - Fa = IcCombineDisjointOutPart (sa, da); - break; - case CombineAIn: - Fa = IcCombineDisjointInPart (sa, da); - break; - case CombineA: - Fa = 0xff; - break; - } - - switch (combine & CombineB) { - default: - Fb = 0; - break; - case CombineBOut: - Fb = IcCombineDisjointOutPart (da, sa); - break; - case CombineBIn: - Fb = IcCombineDisjointInPart (da, sa); - break; - case CombineB: - Fb = 0xff; - break; - } - m = IcGen (s,d,0,Fa,Fb,t,u,v); - n = IcGen (s,d,8,Fa,Fb,t,u,v); - o = IcGen (s,d,16,Fa,Fb,t,u,v); - p = IcGen (s,d,24,Fa,Fb,t,u,v); - s = m|n|o|p; - (*dst->store) (dst, s); -} - -static void -IcCombineDisjointGeneralC (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst, - uint8_t combine) -{ - IcCompSrc cs; - uint32_t s, d; - uint32_t m,n,o,p; - uint32_t Fa; - uint16_t Fb, t, u, v; - uint32_t sa; - uint8_t da; - - cs = IcCombineMaskC (src, msk); - s = cs.value; - sa = cs.alpha; - - d = (*dst->fetch) (dst); - da = d >> 24; - - switch (combine & CombineA) { - default: - Fa = 0; - break; - case CombineAOut: - m = IcCombineDisjointOutPart ((uint8_t) (sa >> 0), da); - n = IcCombineDisjointOutPart ((uint8_t) (sa >> 8), da) << 8; - o = IcCombineDisjointOutPart ((uint8_t) (sa >> 16), da) << 16; - p = IcCombineDisjointOutPart ((uint8_t) (sa >> 24), da) << 24; - Fa = m|n|o|p; - break; - case CombineAIn: - m = IcCombineDisjointOutPart ((uint8_t) (sa >> 0), da); - n = IcCombineDisjointOutPart ((uint8_t) (sa >> 8), da) << 8; - o = IcCombineDisjointOutPart ((uint8_t) (sa >> 16), da) << 16; - p = IcCombineDisjointOutPart ((uint8_t) (sa >> 24), da) << 24; - Fa = m|n|o|p; - break; - case CombineA: - Fa = 0xffffffff; - break; - } - - switch (combine & CombineB) { - default: - Fb = 0; - break; - case CombineBOut: - Fb = IcCombineDisjointOutPart (da, sa); - break; - case CombineBIn: - Fb = IcCombineDisjointInPart (da, sa); - break; - case CombineB: - Fb = 0xff; - break; - } - m = IcGen (s,d,0,IcGet8(Fa,0),Fb,t,u,v); - n = IcGen (s,d,8,IcGet8(Fa,8),Fb,t,u,v); - o = IcGen (s,d,16,IcGet8(Fa,16),Fb,t,u,v); - p = IcGen (s,d,24,IcGet8(Fa,24),Fb,t,u,v); - s = m|n|o|p; - (*dst->store) (dst, s); -} - -static void -IcCombineDisjointOverU (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - uint32_t s, d; - uint16_t a; - uint16_t t; - uint32_t m,n,o,p; - - s = IcCombineMaskU (src, msk); - a = s >> 24; - if (a != 0x00) - { - if (a != 0xff) - { - d = (*dst->fetch) (dst); - a = IcCombineDisjointOutPart (d >> 24, a); - m = IcOverU(s,d,0,a,t); - n = IcOverU(s,d,8,a,t); - o = IcOverU(s,d,16,a,t); - p = IcOverU(s,d,24,a,t); - s = m|n|o|p; - } - (*dst->store) (dst, s); - } -} - -static void -IcCombineDisjointOverC (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineDisjointGeneralC (src, msk, dst, CombineAOver); -} - -static void -IcCombineDisjointOverReverseU (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineDisjointGeneralU (src, msk, dst, CombineBOver); -} - -static void -IcCombineDisjointOverReverseC (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineDisjointGeneralC (src, msk, dst, CombineBOver); -} - -static void -IcCombineDisjointInU (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineDisjointGeneralU (src, msk, dst, CombineAIn); -} - -static void -IcCombineDisjointInC (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineDisjointGeneralC (src, msk, dst, CombineAIn); -} - -static void -IcCombineDisjointInReverseU (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineDisjointGeneralU (src, msk, dst, CombineBIn); -} - -static void -IcCombineDisjointInReverseC (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineDisjointGeneralC (src, msk, dst, CombineBIn); -} - -static void -IcCombineDisjointOutU (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineDisjointGeneralU (src, msk, dst, CombineAOut); -} - -static void -IcCombineDisjointOutC (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineDisjointGeneralC (src, msk, dst, CombineAOut); -} - -static void -IcCombineDisjointOutReverseU (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineDisjointGeneralU (src, msk, dst, CombineBOut); -} - -static void -IcCombineDisjointOutReverseC (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineDisjointGeneralC (src, msk, dst, CombineBOut); -} - -static void -IcCombineDisjointAtopU (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineDisjointGeneralU (src, msk, dst, CombineAAtop); -} - -static void -IcCombineDisjointAtopC (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineDisjointGeneralC (src, msk, dst, CombineAAtop); -} - -static void -IcCombineDisjointAtopReverseU (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineDisjointGeneralU (src, msk, dst, CombineBAtop); -} - -static void -IcCombineDisjointAtopReverseC (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineDisjointGeneralC (src, msk, dst, CombineBAtop); -} - -static void -IcCombineDisjointXorU (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineDisjointGeneralU (src, msk, dst, CombineXor); -} - -static void -IcCombineDisjointXorC (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineDisjointGeneralC (src, msk, dst, CombineXor); -} - -/* portion covered by a but not b */ -static uint8_t -IcCombineConjointOutPart (uint8_t a, uint8_t b) -{ - /* max (1-b/a,0) */ - /* = 1-min(b/a,1) */ - - /* min (1, (1-b) / a) */ - - if (b >= a) /* b >= a -> b/a >= 1 */ - return 0x00; /* 0 */ - return ~IcIntDiv(b,a); /* 1 - b/a */ -} - -/* portion covered by both a and b */ -static uint8_t -IcCombineConjointInPart (uint8_t a, uint8_t b) -{ - /* min (1,b/a) */ - - if (b >= a) /* b >= a -> b/a >= 1 */ - return 0xff; /* 1 */ - return IcIntDiv(b,a); /* b/a */ -} - -static void -IcCombineConjointGeneralU (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst, - uint8_t combine) -{ - uint32_t s, d; - uint32_t m,n,o,p; - uint16_t Fa, Fb, t, u, v; - uint8_t sa, da; - - s = IcCombineMaskU (src, msk); - sa = s >> 24; - - d = (*dst->fetch) (dst); - da = d >> 24; - - switch (combine & CombineA) { - default: - Fa = 0; - break; - case CombineAOut: - Fa = IcCombineConjointOutPart (sa, da); - break; - case CombineAIn: - Fa = IcCombineConjointInPart (sa, da); - break; - case CombineA: - Fa = 0xff; - break; - } - - switch (combine & CombineB) { - default: - Fb = 0; - break; - case CombineBOut: - Fb = IcCombineConjointOutPart (da, sa); - break; - case CombineBIn: - Fb = IcCombineConjointInPart (da, sa); - break; - case CombineB: - Fb = 0xff; - break; - } - m = IcGen (s,d,0,Fa,Fb,t,u,v); - n = IcGen (s,d,8,Fa,Fb,t,u,v); - o = IcGen (s,d,16,Fa,Fb,t,u,v); - p = IcGen (s,d,24,Fa,Fb,t,u,v); - s = m|n|o|p; - (*dst->store) (dst, s); -} - -static void -IcCombineConjointGeneralC (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst, - uint8_t combine) -{ - IcCompSrc cs; - uint32_t s, d; - uint32_t m,n,o,p; - uint32_t Fa; - uint16_t Fb, t, u, v; - uint32_t sa; - uint8_t da; - - cs = IcCombineMaskC (src, msk); - s = cs.value; - sa = cs.alpha; - - d = (*dst->fetch) (dst); - da = d >> 24; - - switch (combine & CombineA) { - default: - Fa = 0; - break; - case CombineAOut: - m = IcCombineConjointOutPart ((uint8_t) (sa >> 0), da); - n = IcCombineConjointOutPart ((uint8_t) (sa >> 8), da) << 8; - o = IcCombineConjointOutPart ((uint8_t) (sa >> 16), da) << 16; - p = IcCombineConjointOutPart ((uint8_t) (sa >> 24), da) << 24; - Fa = m|n|o|p; - break; - case CombineAIn: - m = IcCombineConjointOutPart ((uint8_t) (sa >> 0), da); - n = IcCombineConjointOutPart ((uint8_t) (sa >> 8), da) << 8; - o = IcCombineConjointOutPart ((uint8_t) (sa >> 16), da) << 16; - p = IcCombineConjointOutPart ((uint8_t) (sa >> 24), da) << 24; - Fa = m|n|o|p; - break; - case CombineA: - Fa = 0xffffffff; - break; - } - - switch (combine & CombineB) { - default: - Fb = 0; - break; - case CombineBOut: - Fb = IcCombineConjointOutPart (da, sa); - break; - case CombineBIn: - Fb = IcCombineConjointInPart (da, sa); - break; - case CombineB: - Fb = 0xff; - break; - } - m = IcGen (s,d,0,IcGet8(Fa,0),Fb,t,u,v); - n = IcGen (s,d,8,IcGet8(Fa,8),Fb,t,u,v); - o = IcGen (s,d,16,IcGet8(Fa,16),Fb,t,u,v); - p = IcGen (s,d,24,IcGet8(Fa,24),Fb,t,u,v); - s = m|n|o|p; - (*dst->store) (dst, s); -} - -static void -IcCombineConjointOverU (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineConjointGeneralU (src, msk, dst, CombineAOver); -/* - uint32_t s, d; - uint16_t a; - uint16_t t; - uint32_t m,n,o,p; - - s = IcCombineMaskU (src, msk); - a = s >> 24; - if (a != 0x00) - { - if (a != 0xff) - { - d = (*dst->fetch) (dst); - a = IcCombineConjointOutPart (d >> 24, a); - m = IcOverU(s,d,0,a,t); - n = IcOverU(s,d,8,a,t); - o = IcOverU(s,d,16,a,t); - p = IcOverU(s,d,24,a,t); - s = m|n|o|p; - } - (*dst->store) (dst, s); - } - */ -} - -static void -IcCombineConjointOverC (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineConjointGeneralC (src, msk, dst, CombineAOver); -} - -static void -IcCombineConjointOverReverseU (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineConjointGeneralU (src, msk, dst, CombineBOver); -} - -static void -IcCombineConjointOverReverseC (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineConjointGeneralC (src, msk, dst, CombineBOver); -} - -static void -IcCombineConjointInU (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineConjointGeneralU (src, msk, dst, CombineAIn); -} - -static void -IcCombineConjointInC (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineConjointGeneralC (src, msk, dst, CombineAIn); -} - -static void -IcCombineConjointInReverseU (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineConjointGeneralU (src, msk, dst, CombineBIn); -} - -static void -IcCombineConjointInReverseC (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineConjointGeneralC (src, msk, dst, CombineBIn); -} - -static void -IcCombineConjointOutU (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineConjointGeneralU (src, msk, dst, CombineAOut); -} - -static void -IcCombineConjointOutC (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineConjointGeneralC (src, msk, dst, CombineAOut); -} - -static void -IcCombineConjointOutReverseU (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineConjointGeneralU (src, msk, dst, CombineBOut); -} - -static void -IcCombineConjointOutReverseC (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineConjointGeneralC (src, msk, dst, CombineBOut); -} - -static void -IcCombineConjointAtopU (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineConjointGeneralU (src, msk, dst, CombineAAtop); -} - -static void -IcCombineConjointAtopC (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineConjointGeneralC (src, msk, dst, CombineAAtop); -} - -static void -IcCombineConjointAtopReverseU (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineConjointGeneralU (src, msk, dst, CombineBAtop); -} - -static void -IcCombineConjointAtopReverseC (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineConjointGeneralC (src, msk, dst, CombineBAtop); -} - -static void -IcCombineConjointXorU (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineConjointGeneralU (src, msk, dst, CombineXor); -} - -static void -IcCombineConjointXorC (IcCompositeOperand *src, - IcCompositeOperand *msk, - IcCompositeOperand *dst) -{ - IcCombineConjointGeneralC (src, msk, dst, CombineXor); -} - -static IcCombineFunc const IcCombineFuncU[] = { - IcCombineClear, - IcCombineSrcU, - IcCombineDst, - IcCombineOverU, - IcCombineOverReverseU, - IcCombineInU, - IcCombineInReverseU, - IcCombineOutU, - IcCombineOutReverseU, - IcCombineAtopU, - IcCombineAtopReverseU, - IcCombineXorU, - IcCombineAddU, - IcCombineDisjointOverU, /* Saturate */ - 0, - 0, - IcCombineClear, - IcCombineSrcU, - IcCombineDst, - IcCombineDisjointOverU, - IcCombineDisjointOverReverseU, - IcCombineDisjointInU, - IcCombineDisjointInReverseU, - IcCombineDisjointOutU, - IcCombineDisjointOutReverseU, - IcCombineDisjointAtopU, - IcCombineDisjointAtopReverseU, - IcCombineDisjointXorU, - 0, - 0, - 0, - 0, - IcCombineClear, - IcCombineSrcU, - IcCombineDst, - IcCombineConjointOverU, - IcCombineConjointOverReverseU, - IcCombineConjointInU, - IcCombineConjointInReverseU, - IcCombineConjointOutU, - IcCombineConjointOutReverseU, - IcCombineConjointAtopU, - IcCombineConjointAtopReverseU, - IcCombineConjointXorU, -}; - -static IcCombineFunc const IcCombineFuncC[] = { - IcCombineClear, - IcCombineSrcC, - IcCombineDst, - IcCombineOverC, - IcCombineOverReverseC, - IcCombineInC, - IcCombineInReverseC, - IcCombineOutC, - IcCombineOutReverseC, - IcCombineAtopC, - IcCombineAtopReverseC, - IcCombineXorC, - IcCombineAddC, - IcCombineDisjointOverC, /* Saturate */ - 0, - 0, - IcCombineClear, /* 0x10 */ - IcCombineSrcC, - IcCombineDst, - IcCombineDisjointOverC, - IcCombineDisjointOverReverseC, - IcCombineDisjointInC, - IcCombineDisjointInReverseC, - IcCombineDisjointOutC, - IcCombineDisjointOutReverseC, - IcCombineDisjointAtopC, - IcCombineDisjointAtopReverseC, - IcCombineDisjointXorC, /* 0x1b */ - 0, - 0, - 0, - 0, - IcCombineClear, - IcCombineSrcC, - IcCombineDst, - IcCombineConjointOverC, - IcCombineConjointOverReverseC, - IcCombineConjointInC, - IcCombineConjointInReverseC, - IcCombineConjointOutC, - IcCombineConjointOutReverseC, - IcCombineConjointAtopC, - IcCombineConjointAtopReverseC, - IcCombineConjointXorC, -}; - -/* - * All of the fetch functions - */ - -static uint32_t -IcFetch_a8r8g8b8 (IcCompositeOperand *op) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - return ((uint32_t *)line)[offset >> 5]; -} - -static uint32_t -IcFetch_x8r8g8b8 (IcCompositeOperand *op) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - return ((uint32_t *)line)[offset >> 5] | 0xff000000; -} - -static uint32_t -IcFetch_a8b8g8r8 (IcCompositeOperand *op) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint32_t pixel = ((uint32_t *)line)[offset >> 5]; - - return ((pixel & 0xff000000) | - ((pixel >> 16) & 0xff) | - (pixel & 0x0000ff00) | - ((pixel & 0xff) << 16)); -} - -static uint32_t -IcFetch_x8b8g8r8 (IcCompositeOperand *op) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint32_t pixel = ((uint32_t *)line)[offset >> 5]; - - return ((0xff000000) | - ((pixel >> 16) & 0xff) | - (pixel & 0x0000ff00) | - ((pixel & 0xff) << 16)); -} - -static uint32_t -IcFetch_r8g8b8 (IcCompositeOperand *op) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint8_t *pixel = ((uint8_t *) line) + (offset >> 3); -#if IMAGE_BYTE_ORDER == MSBFirst - return (0xff000000 | - (pixel[0] << 16) | - (pixel[1] << 8) | - (pixel[2])); -#else - return (0xff000000 | - (pixel[2] << 16) | - (pixel[1] << 8) | - (pixel[0])); -#endif -} - -static uint32_t -IcFetch_b8g8r8 (IcCompositeOperand *op) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint8_t *pixel = ((uint8_t *) line) + (offset >> 3); -#if IMAGE_BYTE_ORDER == MSBFirst - return (0xff000000 | - (pixel[2] << 16) | - (pixel[1] << 8) | - (pixel[0])); -#else - return (0xff000000 | - (pixel[0] << 16) | - (pixel[1] << 8) | - (pixel[2])); -#endif -} - -static uint32_t -IcFetch_r5g6b5 (IcCompositeOperand *op) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint32_t pixel = ((uint16_t *) line)[offset >> 4]; - uint32_t r,g,b; - - r = ((pixel & 0xf800) | ((pixel & 0xe000) >> 5)) << 8; - g = ((pixel & 0x07e0) | ((pixel & 0x0600) >> 6)) << 5; - b = ((pixel & 0x001c) | ((pixel & 0x001f) << 5)) >> 2; - return (0xff000000 | r | g | b); -} - -static uint32_t -IcFetch_b5g6r5 (IcCompositeOperand *op) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint32_t pixel = ((uint16_t *) line)[offset >> 4]; - uint32_t r,g,b; - - b = ((pixel & 0xf800) | ((pixel & 0xe000) >> 5)) >> 8; - g = ((pixel & 0x07e0) | ((pixel & 0x0600) >> 6)) << 5; - r = ((pixel & 0x001c) | ((pixel & 0x001f) << 5)) << 14; - return (0xff000000 | r | g | b); -} - -static uint32_t -IcFetch_a1r5g5b5 (IcCompositeOperand *op) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint32_t pixel = ((uint16_t *) line)[offset >> 4]; - uint32_t a,r,g,b; - - a = (uint32_t) ((uint8_t) (0 - ((pixel & 0x8000) >> 15))) << 24; - r = ((pixel & 0x7c00) | ((pixel & 0x7000) >> 5)) << 9; - g = ((pixel & 0x03e0) | ((pixel & 0x0380) >> 5)) << 6; - b = ((pixel & 0x001c) | ((pixel & 0x001f) << 5)) >> 2; - return (a | r | g | b); -} - -static uint32_t -IcFetch_x1r5g5b5 (IcCompositeOperand *op) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint32_t pixel = ((uint16_t *) line)[offset >> 4]; - uint32_t r,g,b; - - r = ((pixel & 0x7c00) | ((pixel & 0x7000) >> 5)) << 9; - g = ((pixel & 0x03e0) | ((pixel & 0x0380) >> 5)) << 6; - b = ((pixel & 0x001c) | ((pixel & 0x001f) << 5)) >> 2; - return (0xff000000 | r | g | b); -} - -static uint32_t -IcFetch_a1b5g5r5 (IcCompositeOperand *op) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint32_t pixel = ((uint16_t *) line)[offset >> 4]; - uint32_t a,r,g,b; - - a = (uint32_t) ((uint8_t) (0 - ((pixel & 0x8000) >> 15))) << 24; - b = ((pixel & 0x7c00) | ((pixel & 0x7000) >> 5)) >> 7; - g = ((pixel & 0x03e0) | ((pixel & 0x0380) >> 5)) << 6; - r = ((pixel & 0x001c) | ((pixel & 0x001f) << 5)) << 14; - return (a | r | g | b); -} - -static uint32_t -IcFetch_x1b5g5r5 (IcCompositeOperand *op) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint32_t pixel = ((uint16_t *) line)[offset >> 4]; - uint32_t r,g,b; - - b = ((pixel & 0x7c00) | ((pixel & 0x7000) >> 5)) >> 7; - g = ((pixel & 0x03e0) | ((pixel & 0x0380) >> 5)) << 6; - r = ((pixel & 0x001c) | ((pixel & 0x001f) << 5)) << 14; - return (0xff000000 | r | g | b); -} - -static uint32_t -IcFetch_a4r4g4b4 (IcCompositeOperand *op) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint32_t pixel = ((uint16_t *) line)[offset >> 4]; - uint32_t a,r,g,b; - - a = ((pixel & 0xf000) | ((pixel & 0xf000) >> 4)) << 16; - r = ((pixel & 0x0f00) | ((pixel & 0x0f00) >> 4)) << 12; - g = ((pixel & 0x00f0) | ((pixel & 0x00f0) >> 4)) << 8; - b = ((pixel & 0x000f) | ((pixel & 0x000f) << 4)); - return (a | r | g | b); -} - -static uint32_t -IcFetch_x4r4g4b4 (IcCompositeOperand *op) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint32_t pixel = ((uint16_t *) line)[offset >> 4]; - uint32_t r,g,b; - - r = ((pixel & 0x0f00) | ((pixel & 0x0f00) >> 4)) << 12; - g = ((pixel & 0x00f0) | ((pixel & 0x00f0) >> 4)) << 8; - b = ((pixel & 0x000f) | ((pixel & 0x000f) << 4)); - return (0xff000000 | r | g | b); -} - -static uint32_t -IcFetch_a4b4g4r4 (IcCompositeOperand *op) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint32_t pixel = ((uint16_t *) line)[offset >> 4]; - uint32_t a,r,g,b; - - a = ((pixel & 0xf000) | ((pixel & 0xf000) >> 4)) << 16; - b = ((pixel & 0x0f00) | ((pixel & 0x0f00) >> 4)) << 12; - g = ((pixel & 0x00f0) | ((pixel & 0x00f0) >> 4)) << 8; - r = ((pixel & 0x000f) | ((pixel & 0x000f) << 4)); - return (a | r | g | b); -} - -static uint32_t -IcFetch_x4b4g4r4 (IcCompositeOperand *op) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint32_t pixel = ((uint16_t *) line)[offset >> 4]; - uint32_t r,g,b; - - b = ((pixel & 0x0f00) | ((pixel & 0x0f00) >> 4)) << 12; - g = ((pixel & 0x00f0) | ((pixel & 0x00f0) >> 4)) << 8; - r = ((pixel & 0x000f) | ((pixel & 0x000f) << 4)); - return (0xff000000 | r | g | b); -} - -static uint32_t -IcFetch_a8 (IcCompositeOperand *op) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint32_t pixel = ((uint8_t *) line)[offset>>3]; - - return pixel << 24; -} - -static uint32_t -IcFetcha_a8 (IcCompositeOperand *op) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint32_t pixel = ((uint8_t *) line)[offset>>3]; - - pixel |= pixel << 8; - pixel |= pixel << 16; - return pixel; -} - -static uint32_t -IcFetch_r3g3b2 (IcCompositeOperand *op) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint32_t pixel = ((uint8_t *) line)[offset>>3]; - uint32_t r,g,b; - - r = ((pixel & 0xe0) | ((pixel & 0xe0) >> 3) | ((pixel & 0xc0) >> 6)) << 16; - g = ((pixel & 0x1c) | ((pixel & 0x18) >> 3) | ((pixel & 0x1c) << 3)) << 8; - b = (((pixel & 0x03) ) | - ((pixel & 0x03) << 2) | - ((pixel & 0x03) << 4) | - ((pixel & 0x03) << 6)); - return (0xff000000 | r | g | b); -} - -static uint32_t -IcFetch_b2g3r3 (IcCompositeOperand *op) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint32_t pixel = ((uint8_t *) line)[offset>>3]; - uint32_t r,g,b; - - b = (((pixel & 0xc0) ) | - ((pixel & 0xc0) >> 2) | - ((pixel & 0xc0) >> 4) | - ((pixel & 0xc0) >> 6)); - g = ((pixel & 0x38) | ((pixel & 0x38) >> 3) | ((pixel & 0x30) << 2)) << 8; - r = (((pixel & 0x07) ) | - ((pixel & 0x07) << 3) | - ((pixel & 0x06) << 6)) << 16; - return (0xff000000 | r | g | b); -} - -static uint32_t -IcFetch_a2r2g2b2 (IcCompositeOperand *op) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint32_t pixel = ((uint8_t *) line)[offset>>3]; - uint32_t a,r,g,b; - - a = ((pixel & 0xc0) * 0x55) << 18; - r = ((pixel & 0x30) * 0x55) << 12; - g = ((pixel & 0x0c) * 0x55) << 6; - b = ((pixel & 0x03) * 0x55); - return a|r|g|b; -} - -#define Fetch8(l,o) (((uint8_t *) (l))[(o) >> 3]) -#if IMAGE_BYTE_ORDER == MSBFirst -#define Fetch4(l,o) ((o) & 2 ? Fetch8(l,o) & 0xf : Fetch8(l,o) >> 4) -#else -#define Fetch4(l,o) ((o) & 2 ? Fetch8(l,o) >> 4 : Fetch8(l,o) & 0xf) -#endif - -static uint32_t -IcFetch_a4 (IcCompositeOperand *op) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint32_t pixel = Fetch4(line, offset); - - pixel |= pixel << 4; - return pixel << 24; -} - -static uint32_t -IcFetcha_a4 (IcCompositeOperand *op) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint32_t pixel = Fetch4(line, offset); - - pixel |= pixel << 4; - pixel |= pixel << 8; - pixel |= pixel << 16; - return pixel; -} - -static uint32_t -IcFetch_r1g2b1 (IcCompositeOperand *op) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint32_t pixel = Fetch4(line, offset); - uint32_t r,g,b; - - r = ((pixel & 0x8) * 0xff) << 13; - g = ((pixel & 0x6) * 0x55) << 7; - b = ((pixel & 0x1) * 0xff); - return 0xff000000|r|g|b; -} - -static uint32_t -IcFetch_b1g2r1 (IcCompositeOperand *op) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint32_t pixel = Fetch4(line, offset); - uint32_t r,g,b; - - b = ((pixel & 0x8) * 0xff) >> 3; - g = ((pixel & 0x6) * 0x55) << 7; - r = ((pixel & 0x1) * 0xff) << 16; - return 0xff000000|r|g|b; -} - -static uint32_t -IcFetch_a1r1g1b1 (IcCompositeOperand *op) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint32_t pixel = Fetch4(line, offset); - uint32_t a,r,g,b; - - a = ((pixel & 0x8) * 0xff) << 21; - r = ((pixel & 0x4) * 0xff) << 14; - g = ((pixel & 0x2) * 0xff) << 7; - b = ((pixel & 0x1) * 0xff); - return a|r|g|b; -} - -static uint32_t -IcFetch_a1b1g1r1 (IcCompositeOperand *op) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint32_t pixel = Fetch4(line, offset); - uint32_t a,r,g,b; - - a = ((pixel & 0x8) * 0xff) << 21; - r = ((pixel & 0x4) * 0xff) >> 3; - g = ((pixel & 0x2) * 0xff) << 7; - b = ((pixel & 0x1) * 0xff) << 16; - return a|r|g|b; -} - -static uint32_t -IcFetcha_a1 (IcCompositeOperand *op) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint32_t pixel = ((uint32_t *)line)[offset >> 5]; - uint32_t a; -#if BITMAP_BIT_ORDER == MSBFirst - a = pixel >> (0x1f - (offset & 0x1f)); -#else - a = pixel >> (offset & 0x1f); -#endif - a = a & 1; - a |= a << 1; - a |= a << 2; - a |= a << 4; - a |= a << 8; - a |= a << 16; - return a; -} - -static uint32_t -IcFetch_a1 (IcCompositeOperand *op) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint32_t pixel = ((uint32_t *)line)[offset >> 5]; - uint32_t a; -#if BITMAP_BIT_ORDER == MSBFirst - a = pixel >> (0x1f - (offset & 0x1f)); -#else - a = pixel >> (offset & 0x1f); -#endif - a = a & 1; - a |= a << 1; - a |= a << 2; - a |= a << 4; - return a << 24; -} - -/* - * All the store functions - */ - -#define Splita(v) uint32_t a = ((v) >> 24), r = ((v) >> 16) & 0xff, g = ((v) >> 8) & 0xff, b = (v) & 0xff -#define Split(v) uint32_t r = ((v) >> 16) & 0xff, g = ((v) >> 8) & 0xff, b = (v) & 0xff - -static void -IcStore_a8r8g8b8 (IcCompositeOperand *op, uint32_t value) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - ((uint32_t *)line)[offset >> 5] = value; -} - -static void -IcStore_x8r8g8b8 (IcCompositeOperand *op, uint32_t value) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - ((uint32_t *)line)[offset >> 5] = value & 0xffffff; -} - -static void -IcStore_a8b8g8r8 (IcCompositeOperand *op, uint32_t value) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - Splita(value); - ((uint32_t *)line)[offset >> 5] = a << 24 | b << 16 | g << 8 | r; -} - -static void -IcStore_x8b8g8r8 (IcCompositeOperand *op, uint32_t value) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - Split(value); - ((uint32_t *)line)[offset >> 5] = b << 16 | g << 8 | r; -} - -static void -IcStore_r8g8b8 (IcCompositeOperand *op, uint32_t value) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint8_t *pixel = ((uint8_t *) line) + (offset >> 3); - Split(value); -#if IMAGE_BYTE_ORDER == MSBFirst - pixel[0] = r; - pixel[1] = g; - pixel[2] = b; -#else - pixel[0] = b; - pixel[1] = g; - pixel[2] = r; -#endif -} - -static void -IcStore_b8g8r8 (IcCompositeOperand *op, uint32_t value) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint8_t *pixel = ((uint8_t *) line) + (offset >> 3); - Split(value); -#if IMAGE_BYTE_ORDER == MSBFirst - pixel[0] = b; - pixel[1] = g; - pixel[2] = r; -#else - pixel[0] = r; - pixel[1] = g; - pixel[2] = b; -#endif -} - -static void -IcStore_r5g6b5 (IcCompositeOperand *op, uint32_t value) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint16_t *pixel = ((uint16_t *) line) + (offset >> 4); - Split(value); - *pixel = (((r << 8) & 0xf800) | - ((g << 3) & 0x07e0) | - ((b >> 3) )); -} - -static void -IcStore_b5g6r5 (IcCompositeOperand *op, uint32_t value) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint16_t *pixel = ((uint16_t *) line) + (offset >> 4); - Split(value); - *pixel = (((b << 8) & 0xf800) | - ((g << 3) & 0x07e0) | - ((r >> 3) )); -} - -static void -IcStore_a1r5g5b5 (IcCompositeOperand *op, uint32_t value) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint16_t *pixel = ((uint16_t *) line) + (offset >> 4); - Splita(value); - *pixel = (((a << 8) & 0x8000) | - ((r << 7) & 0x7c00) | - ((g << 2) & 0x03e0) | - ((b >> 3) )); -} - -static void -IcStore_x1r5g5b5 (IcCompositeOperand *op, uint32_t value) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint16_t *pixel = ((uint16_t *) line) + (offset >> 4); - Split(value); - *pixel = (((r << 7) & 0x7c00) | - ((g << 2) & 0x03e0) | - ((b >> 3) )); -} - -static void -IcStore_a1b5g5r5 (IcCompositeOperand *op, uint32_t value) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint16_t *pixel = ((uint16_t *) line) + (offset >> 4); - Splita(value); - *pixel = (((a << 8) & 0x8000) | - ((b << 7) & 0x7c00) | - ((g << 2) & 0x03e0) | - ((r >> 3) )); -} - -static void -IcStore_x1b5g5r5 (IcCompositeOperand *op, uint32_t value) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint16_t *pixel = ((uint16_t *) line) + (offset >> 4); - Split(value); - *pixel = (((b << 7) & 0x7c00) | - ((g << 2) & 0x03e0) | - ((r >> 3) )); -} - -static void -IcStore_a4r4g4b4 (IcCompositeOperand *op, uint32_t value) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint16_t *pixel = ((uint16_t *) line) + (offset >> 4); - Splita(value); - *pixel = (((a << 8) & 0xf000) | - ((r << 4) & 0x0f00) | - ((g ) & 0x00f0) | - ((b >> 4) )); -} - -static void -IcStore_x4r4g4b4 (IcCompositeOperand *op, uint32_t value) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint16_t *pixel = ((uint16_t *) line) + (offset >> 4); - Split(value); - *pixel = (((r << 4) & 0x0f00) | - ((g ) & 0x00f0) | - ((b >> 4) )); -} - -static void -IcStore_a4b4g4r4 (IcCompositeOperand *op, uint32_t value) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint16_t *pixel = ((uint16_t *) line) + (offset >> 4); - Splita(value); - *pixel = (((a << 8) & 0xf000) | - ((b << 4) & 0x0f00) | - ((g ) & 0x00f0) | - ((r >> 4) )); -} - -static void -IcStore_x4b4g4r4 (IcCompositeOperand *op, uint32_t value) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint16_t *pixel = ((uint16_t *) line) + (offset >> 4); - Split(value); - *pixel = (((b << 4) & 0x0f00) | - ((g ) & 0x00f0) | - ((r >> 4) )); -} - -static void -IcStore_a8 (IcCompositeOperand *op, uint32_t value) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint8_t *pixel = ((uint8_t *) line) + (offset >> 3); - *pixel = value >> 24; -} - -static void -IcStore_r3g3b2 (IcCompositeOperand *op, uint32_t value) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint8_t *pixel = ((uint8_t *) line) + (offset >> 3); - Split(value); - *pixel = (((r ) & 0xe0) | - ((g >> 3) & 0x1c) | - ((b >> 6) )); -} - -static void -IcStore_b2g3r3 (IcCompositeOperand *op, uint32_t value) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint8_t *pixel = ((uint8_t *) line) + (offset >> 3); - Split(value); - *pixel = (((b ) & 0xe0) | - ((g >> 3) & 0x1c) | - ((r >> 6) )); -} - -static void -IcStore_a2r2g2b2 (IcCompositeOperand *op, uint32_t value) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint8_t *pixel = ((uint8_t *) line) + (offset >> 3); - Splita(value); - *pixel = (((a ) & 0xc0) | - ((r >> 2) & 0x30) | - ((g >> 4) & 0x0c) | - ((b >> 6) )); -} - -#define Store8(l,o,v) (((uint8_t *) l)[(o) >> 3] = (v)) -#if IMAGE_BYTE_ORDER == MSBFirst -#define Store4(l,o,v) Store8(l,o,((o) & 4 ? \ - (Fetch8(l,o) & 0xf0) | (v) : \ - (Fetch8(l,o) & 0x0f) | ((v) << 4))) -#else -#define Store4(l,o,v) Store8(l,o,((o) & 4 ? \ - (Fetch8(l,o) & 0x0f) | ((v) << 4) : \ - (Fetch8(l,o) & 0xf0) | (v))) -#endif - -static void -IcStore_a4 (IcCompositeOperand *op, uint32_t value) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - Store4(line,offset,value>>28); -} - -static void -IcStore_r1g2b1 (IcCompositeOperand *op, uint32_t value) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint32_t pixel; - - Split(value); - pixel = (((r >> 4) & 0x8) | - ((g >> 5) & 0x6) | - ((b >> 7) )); - Store4(line,offset,pixel); -} - -static void -IcStore_b1g2r1 (IcCompositeOperand *op, uint32_t value) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint32_t pixel; - - Split(value); - pixel = (((b >> 4) & 0x8) | - ((g >> 5) & 0x6) | - ((r >> 7) )); - Store4(line,offset,pixel); -} - -static void -IcStore_a1r1g1b1 (IcCompositeOperand *op, uint32_t value) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint32_t pixel; - Splita(value); - pixel = (((a >> 4) & 0x8) | - ((r >> 5) & 0x4) | - ((g >> 6) & 0x2) | - ((b >> 7) )); - Store4(line,offset,pixel); -} - -static void -IcStore_a1b1g1r1 (IcCompositeOperand *op, uint32_t value) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint32_t pixel; - Splita(value); - pixel = (((a >> 4) & 0x8) | - ((b >> 5) & 0x4) | - ((g >> 6) & 0x2) | - ((r >> 7) )); - Store4(line,offset,pixel); -} - -static void -IcStore_a1 (IcCompositeOperand *op, uint32_t value) -{ - IcBits *line = op->u.drawable.line; uint32_t offset = op->u.drawable.offset; - uint32_t *pixel = ((uint32_t *) line) + (offset >> 5); - uint32_t mask = IcStipMask(offset & 0x1f, 1); - - value = value & 0x80000000 ? mask : 0; - *pixel = (*pixel & ~mask) | value; -} - -static uint32_t -IcFetch_external (IcCompositeOperand *op) -{ - uint32_t rgb = (*op[1].fetch) (&op[1]); - uint32_t a = (*op[2].fetch) (&op[2]); - - return (rgb & 0xffffff) | (a & 0xff000000); -} - - -static uint32_t -IcFetcha_external (IcCompositeOperand *op) -{ - return (*op[2].fetch) (&op[2]); -} - -static void -IcStore_external (IcCompositeOperand *op, uint32_t value) -{ - (*op[1].store) (&op[1], value | 0xff000000); - (*op[2].store) (&op[2], value & 0xff000000); -} - -static uint32_t -IcFetch_transform (IcCompositeOperand *op) -{ - IcVector v; - int x, y; - int minx, maxx, miny, maxy; - int n; - uint32_t rtot, gtot, btot, atot; - uint32_t xerr, yerr; - uint32_t bits; - PixRegionBox box; - - v.vector[0] = IntToxFixed(op->u.transform.x); - v.vector[1] = IntToxFixed(op->u.transform.y); - v.vector[2] = xFixed1; - if (!IcTransformPoint (op->u.transform.transform, &v)) - return 0; - switch (op->u.transform.filter) { - case IcFilterFast: - case IcFilterNearest: - y = xFixedToInt (v.vector[1]) + op->u.transform.top_y; - x = xFixedToInt (v.vector[0]) + op->u.transform.left_x; - if (PixRegionPointInRegion (op->clip, x, y, &box)) - { - (*op[1].set) (&op[1], x, y); - bits = (*op[1].fetch) (&op[1]); - } - else - bits = 0; - break; - case IcFilterGood: - case IcFilterBest: - case IcFilterBilinear: - rtot = gtot = btot = atot = 0; - miny = xFixedToInt (v.vector[1]) + op->u.transform.top_y; - maxy = xFixedToInt (xFixedCeil (v.vector[1])) + op->u.transform.top_y; - - minx = xFixedToInt (v.vector[0]) + op->u.transform.left_x; - maxx = xFixedToInt (xFixedCeil (v.vector[0])) + op->u.transform.left_x; - - yerr = xFixed1 - xFixedFrac (v.vector[1]); - for (y = miny; y <= maxy; y++) - { - uint32_t lrtot = 0, lgtot = 0, lbtot = 0, latot = 0; - - xerr = xFixed1 - xFixedFrac (v.vector[0]); - for (x = minx; x <= maxx; x++) - { - if (PixRegionPointInRegion (op->clip, x, y, &box)) - { - (*op[1].set) (&op[1], x, y); - bits = (*op[1].fetch) (&op[1]); - { - Splita(bits); - lrtot += r * xerr; - lgtot += g * xerr; - lbtot += b * xerr; - latot += a * xerr; - n++; - } - } - xerr = xFixed1 - xerr; - } - rtot += (lrtot >> 10) * yerr; - gtot += (lgtot >> 10) * yerr; - btot += (lbtot >> 10) * yerr; - atot += (latot >> 10) * yerr; - yerr = xFixed1 - yerr; - } - if ((atot >>= 22) > 0xff) atot = 0xff; - if ((rtot >>= 22) > 0xff) rtot = 0xff; - if ((gtot >>= 22) > 0xff) gtot = 0xff; - if ((btot >>= 22) > 0xff) btot = 0xff; - bits = ((atot << 24) | - (rtot << 16) | - (gtot << 8) | - (btot )); - break; - default: - bits = 0; - break; - } - return bits; -} - -static uint32_t -IcFetcha_transform (IcCompositeOperand *op) -{ - IcVector v; - int x, y; - int minx, maxx, miny, maxy; - int n; - uint32_t rtot, gtot, btot, atot; - uint32_t xerr, yerr; - uint32_t bits; - PixRegionBox box; - - v.vector[0] = IntToxFixed(op->u.transform.x); - v.vector[1] = IntToxFixed(op->u.transform.y); - v.vector[2] = xFixed1; - if (!IcTransformPoint (op->u.transform.transform, &v)) - return 0; - switch (op->u.transform.filter) { - case IcFilterFast: - case IcFilterNearest: - y = xFixedToInt (v.vector[1]) + op->u.transform.left_x; - x = xFixedToInt (v.vector[0]) + op->u.transform.top_y; - if (PixRegionPointInRegion (op->clip, x, y, &box)) - { - (*op[1].set) (&op[1], x, y); - bits = (*op[1].fetcha) (&op[1]); - } - else - bits = 0; - break; - case IcFilterGood: - case IcFilterBest: - case IcFilterBilinear: - rtot = gtot = btot = atot = 0; - - miny = xFixedToInt (v.vector[1]) + op->u.transform.top_y; - maxy = xFixedToInt (xFixedCeil (v.vector[1])) + op->u.transform.top_y; - - minx = xFixedToInt (v.vector[0]) + op->u.transform.left_x; - maxx = xFixedToInt (xFixedCeil (v.vector[0])) + op->u.transform.left_x; - - yerr = xFixed1 - xFixedFrac (v.vector[1]); - for (y = miny; y <= maxy; y++) - { - uint32_t lrtot = 0, lgtot = 0, lbtot = 0, latot = 0; - xerr = xFixed1 - xFixedFrac (v.vector[0]); - for (x = minx; x <= maxx; x++) - { - if (PixRegionPointInRegion (op->clip, x, y, &box)) - { - (*op[1].set) (&op[1], x, y); - bits = (*op[1].fetcha) (&op[1]); - { - Splita(bits); - lrtot += r * xerr; - lgtot += g * xerr; - lbtot += b * xerr; - latot += a * xerr; - n++; - } - } - x++; - xerr = xFixed1 - xerr; - } - rtot += (lrtot >> 10) * yerr; - gtot += (lgtot >> 10) * yerr; - btot += (lbtot >> 10) * yerr; - atot += (latot >> 10) * yerr; - y++; - yerr = xFixed1 - yerr; - } - if ((atot >>= 22) > 0xff) atot = 0xff; - if ((rtot >>= 22) > 0xff) rtot = 0xff; - if ((gtot >>= 22) > 0xff) gtot = 0xff; - if ((btot >>= 22) > 0xff) btot = 0xff; - bits = ((atot << 24) | - (rtot << 16) | - (gtot << 8) | - (btot )); - break; - default: - bits = 0; - break; - } - return bits; -} - -static IcAccessMap const icAccessMap[] = { - /* 32bpp formats */ - { PICT_a8r8g8b8, IcFetch_a8r8g8b8, IcFetch_a8r8g8b8, IcStore_a8r8g8b8 }, - { PICT_x8r8g8b8, IcFetch_x8r8g8b8, IcFetch_x8r8g8b8, IcStore_x8r8g8b8 }, - { PICT_a8b8g8r8, IcFetch_a8b8g8r8, IcFetch_a8b8g8r8, IcStore_a8b8g8r8 }, - { PICT_x8b8g8r8, IcFetch_x8b8g8r8, IcFetch_x8b8g8r8, IcStore_x8b8g8r8 }, - - /* 24bpp formats */ - { PICT_r8g8b8, IcFetch_r8g8b8, IcFetch_r8g8b8, IcStore_r8g8b8 }, - { PICT_b8g8r8, IcFetch_b8g8r8, IcFetch_b8g8r8, IcStore_b8g8r8 }, - - /* 16bpp formats */ - { PICT_r5g6b5, IcFetch_r5g6b5, IcFetch_r5g6b5, IcStore_r5g6b5 }, - { PICT_b5g6r5, IcFetch_b5g6r5, IcFetch_b5g6r5, IcStore_b5g6r5 }, - - { PICT_a1r5g5b5, IcFetch_a1r5g5b5, IcFetch_a1r5g5b5, IcStore_a1r5g5b5 }, - { PICT_x1r5g5b5, IcFetch_x1r5g5b5, IcFetch_x1r5g5b5, IcStore_x1r5g5b5 }, - { PICT_a1b5g5r5, IcFetch_a1b5g5r5, IcFetch_a1b5g5r5, IcStore_a1b5g5r5 }, - { PICT_x1b5g5r5, IcFetch_x1b5g5r5, IcFetch_x1b5g5r5, IcStore_x1b5g5r5 }, - { PICT_a4r4g4b4, IcFetch_a4r4g4b4, IcFetch_a4r4g4b4, IcStore_a4r4g4b4 }, - { PICT_x4r4g4b4, IcFetch_x4r4g4b4, IcFetch_x4r4g4b4, IcStore_x4r4g4b4 }, - { PICT_a4b4g4r4, IcFetch_a4b4g4r4, IcFetch_a4b4g4r4, IcStore_a4b4g4r4 }, - { PICT_x4b4g4r4, IcFetch_x4b4g4r4, IcFetch_x4b4g4r4, IcStore_x4b4g4r4 }, - - /* 8bpp formats */ - { PICT_a8, IcFetch_a8, IcFetcha_a8, IcStore_a8 }, - { PICT_r3g3b2, IcFetch_r3g3b2, IcFetch_r3g3b2, IcStore_r3g3b2 }, - { PICT_b2g3r3, IcFetch_b2g3r3, IcFetch_b2g3r3, IcStore_b2g3r3 }, - { PICT_a2r2g2b2, IcFetch_a2r2g2b2, IcFetch_a2r2g2b2, IcStore_a2r2g2b2 }, - - /* 4bpp formats */ - { PICT_a4, IcFetch_a4, IcFetcha_a4, IcStore_a4 }, - { PICT_r1g2b1, IcFetch_r1g2b1, IcFetch_r1g2b1, IcStore_r1g2b1 }, - { PICT_b1g2r1, IcFetch_b1g2r1, IcFetch_b1g2r1, IcStore_b1g2r1 }, - { PICT_a1r1g1b1, IcFetch_a1r1g1b1, IcFetch_a1r1g1b1, IcStore_a1r1g1b1 }, - { PICT_a1b1g1r1, IcFetch_a1b1g1r1, IcFetch_a1b1g1r1, IcStore_a1b1g1r1 }, - - /* 1bpp formats */ - { PICT_a1, IcFetch_a1, IcFetcha_a1, IcStore_a1 }, -}; -#define NumAccessMap (sizeof icAccessMap / sizeof icAccessMap[0]) - -static void -IcStepOver (IcCompositeOperand *op) -{ - op->u.drawable.offset += op->u.drawable.bpp; -} - -static void -IcStepDown (IcCompositeOperand *op) -{ - op->u.drawable.line += op->u.drawable.stride; - op->u.drawable.offset = op->u.drawable.start_offset; -} - -static void -IcSet (IcCompositeOperand *op, int x, int y) -{ - op->u.drawable.line = op->u.drawable.top_line + y * op->u.drawable.stride; - op->u.drawable.offset = op->u.drawable.left_offset + x * op->u.drawable.bpp; -} - -static void -IcStepOver_external (IcCompositeOperand *op) -{ - (*op[1].over) (&op[1]); - (*op[2].over) (&op[2]); -} - -static void -IcStepDown_external (IcCompositeOperand *op) -{ - (*op[1].down) (&op[1]); - (*op[2].down) (&op[2]); -} - -static void -IcSet_external (IcCompositeOperand *op, int x, int y) -{ - (*op[1].set) (&op[1], x, y); - (*op[2].set) (&op[2], - x - op->u.external.alpha_dx, - y - op->u.external.alpha_dy); -} - -static void -IcStepOver_transform (IcCompositeOperand *op) -{ - op->u.transform.x++; -} - -static void -IcStepDown_transform (IcCompositeOperand *op) -{ - op->u.transform.y++; - op->u.transform.x = op->u.transform.start_x; -} - -static void -IcSet_transform (IcCompositeOperand *op, int x, int y) -{ - op->u.transform.x = x - op->u.transform.left_x; - op->u.transform.y = y - op->u.transform.top_y; -} - - -int -IcBuildCompositeOperand (IcImage *image, - IcCompositeOperand op[4], - int16_t x, - int16_t y, - int transform, - int alpha) -{ - /* Check for transform */ - if (transform && image->transform) - { - if (!IcBuildCompositeOperand (image, &op[1], 0, 0, 0, alpha)) - return 0; - - op->u.transform.top_y = image->pixels->y; - op->u.transform.left_x = image->pixels->x; - - op->u.transform.start_x = x - op->u.transform.left_x; - op->u.transform.x = op->u.transform.start_x; - op->u.transform.y = y - op->u.transform.top_y; - op->u.transform.transform = image->transform; - op->u.transform.filter = image->filter; - - op->fetch = IcFetch_transform; - op->fetcha = IcFetcha_transform; - op->store = 0; - op->over = IcStepOver_transform; - op->down = IcStepDown_transform; - op->set = IcSet_transform; - - op->clip = op[1].clip; - - return 1; - } - /* Check for external alpha */ - else if (alpha && image->alphaMap) - { - if (!IcBuildCompositeOperand (image, &op[1], x, y, 0, 0)) - return 0; - if (!IcBuildCompositeOperand (image->alphaMap, &op[2], - x - image->alphaOrigin.x, - y - image->alphaOrigin.y, - 0, 0)) - return 0; - op->u.external.alpha_dx = image->alphaOrigin.x; - op->u.external.alpha_dy = image->alphaOrigin.y; - - op->fetch = IcFetch_external; - op->fetcha = IcFetcha_external; - op->store = IcStore_external; - op->over = IcStepOver_external; - op->down = IcStepDown_external; - op->set = IcSet_external; - - op->clip = op[1].clip; - - return 1; - } - /* Build simple operand */ - else - { - int i; - int xoff, yoff; - - for (i = 0; i < NumAccessMap; i++) - if (icAccessMap[i].format_code == image->format_code) - { - IcBits *bits; - IcStride stride; - int bpp; - - op->fetch = icAccessMap[i].fetch; - op->fetcha = icAccessMap[i].fetcha; - op->store = icAccessMap[i].store; - op->over = IcStepOver; - op->down = IcStepDown; - op->set = IcSet; - - op->clip = image->pCompositeClip; - - IcGetPixels (image->pixels, bits, stride, bpp, - xoff, yoff); - if (image->repeat && image->pixels->width == 1 && - image->pixels->height == 1) - { - bpp = 0; - stride = 0; - } - /* - * Coordinates of upper left corner of drawable - */ - op->u.drawable.top_line = bits + yoff * stride; - op->u.drawable.left_offset = xoff * bpp; - - /* - * Starting position within drawable - */ - op->u.drawable.start_offset = op->u.drawable.left_offset + x * bpp; - op->u.drawable.line = op->u.drawable.top_line + y * stride; - op->u.drawable.offset = op->u.drawable.start_offset; - - op->u.drawable.stride = stride; - op->u.drawable.bpp = bpp; - return 1; - } - return 0; - } -} - -void -IcCompositeGeneral (IcOperator op, - IcImage *iSrc, - IcImage *iMask, - IcImage *iDst, - int16_t xSrc, - int16_t ySrc, - int16_t xMask, - int16_t yMask, - int16_t xDst, - int16_t yDst, - uint16_t width, - uint16_t height) -{ - IcCompositeOperand src[4],msk[4],dst[4],*pmsk; - IcCompositeOperand *srcPict, *srcAlpha; - IcCompositeOperand *dstPict, *dstAlpha; - IcCompositeOperand *mskPict = 0, *mskAlpha = 0; - IcCombineFunc f; - int w; - - if (!IcBuildCompositeOperand (iSrc, src, xSrc, ySrc, 1, 1)) - return; - if (!IcBuildCompositeOperand (iDst, dst, xDst, yDst, 0, 1)) - return; - if (iSrc->alphaMap) - { - srcPict = &src[1]; - srcAlpha = &src[2]; - } - else - { - srcPict = &src[0]; - srcAlpha = 0; - } - if (iDst->alphaMap) - { - dstPict = &dst[1]; - dstAlpha = &dst[2]; - } - else - { - dstPict = &dst[0]; - dstAlpha = 0; - } - f = IcCombineFuncU[op]; - if (iMask) - { - if (!IcBuildCompositeOperand (iMask, msk, xMask, yMask, 1, 1)) - return; - pmsk = msk; - if (iMask->componentAlpha) - f = IcCombineFuncC[op]; - if (iMask->alphaMap) - { - mskPict = &msk[1]; - mskAlpha = &msk[2]; - } - else - { - mskPict = &msk[0]; - mskAlpha = 0; - } - } - else - pmsk = 0; - while (height--) - { - w = width; - - while (w--) - { - (*f) (src, pmsk, dst); - (*src->over) (src); - (*dst->over) (dst); - if (pmsk) - (*pmsk->over) (pmsk); - } - (*src->down) (src); - (*dst->down) (dst); - if (pmsk) - (*pmsk->down) (pmsk); - } -} - |