summaryrefslogtreecommitdiff
path: root/xc/programs/Xserver/fb/fbcompose.c
diff options
context:
space:
mode:
Diffstat (limited to 'xc/programs/Xserver/fb/fbcompose.c')
-rw-r--r--xc/programs/Xserver/fb/fbcompose.c1352
1 files changed, 1161 insertions, 191 deletions
diff --git a/xc/programs/Xserver/fb/fbcompose.c b/xc/programs/Xserver/fb/fbcompose.c
index 74d0062ac..840cf62d8 100644
--- a/xc/programs/Xserver/fb/fbcompose.c
+++ b/xc/programs/Xserver/fb/fbcompose.c
@@ -1,5 +1,5 @@
/*
- * $XFree86: xc/programs/Xserver/fb/fbcompose.c,v 1.5 2000/11/20 07:13:07 keithp Exp $
+ * $XFree86: xc/programs/Xserver/fb/fbcompose.c,v 1.11 2001/08/16 08:03:25 keithp Exp $
*
* Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
*
@@ -35,11 +35,6 @@
* and storing these exist for each format.
*/
-typedef struct _fbCompSrc {
- CARD32 value;
- CARD32 alpha;
-} FbCompSrc;
-
/*
* Combine src and mask using IN
*/
@@ -54,13 +49,13 @@ fbCombineMaskU (FbCompositeOperand *src,
CARD32 m,n,o,p;
if (!msk)
- return (*src->fetch) (src->line, src->offset);
+ return (*src->fetch) (src);
- a = (*msk->fetch) (msk->line, msk->offset) >> 24;
+ a = (*msk->fetch) (msk) >> 24;
if (!a)
return 0;
- x = (*src->fetch) (src->line, src->offset);
+ x = (*src->fetch) (src);
if (a == 0xff)
return x;
@@ -84,7 +79,7 @@ fbCombineMaskC (FbCompositeOperand *src,
if (!msk)
{
- x = (*src->fetch) (src->line, src->offset);
+ x = (*src->fetch) (src);
s.value = x;
x = x >> 24;
x |= x << 8;
@@ -93,7 +88,7 @@ fbCombineMaskC (FbCompositeOperand *src,
return s;
}
- a = (*msk->fetcha) (msk->line, msk->offset);
+ a = (*msk->fetcha) (msk);
if (!a)
{
s.value = 0;
@@ -101,7 +96,7 @@ fbCombineMaskC (FbCompositeOperand *src,
return s;
}
- x = (*src->fetch) (src->line, src->offset);
+ x = (*src->fetch) (src);
if (a == 0xffffffff)
{
s.value = x;
@@ -132,20 +127,19 @@ fbCombineMaskValueC (FbCompositeOperand *src,
{
CARD32 x;
CARD32 a;
- CARD16 xa;
CARD16 t;
CARD32 m,n,o,p;
if (!msk)
{
- return (*src->fetch) (src->line, src->offset);
+ return (*src->fetch) (src);
}
- a = (*msk->fetcha) (msk->line, msk->offset);
+ a = (*msk->fetcha) (msk);
if (!a)
return a;
- x = (*src->fetch) (src->line, src->offset);
+ x = (*src->fetch) (src);
if (a == 0xffffffff)
return x;
@@ -168,13 +162,13 @@ fbCombineMaskAlphaU (FbCompositeOperand *src,
CARD16 t;
if (!msk)
- return (*src->fetch) (src->line, src->offset);
+ return (*src->fetch) (src);
- a = (*msk->fetch) (msk->line, msk->offset) >> 24;
+ a = (*msk->fetch) (msk) >> 24;
if (!a)
return 0;
- x = (*src->fetch) (src->line, src->offset);
+ x = (*src->fetch) (src);
if (a == 0xff)
return x;
@@ -187,18 +181,17 @@ fbCombineMaskAlphaC (FbCompositeOperand *src,
{
CARD32 x;
CARD32 a;
- CARD16 xa;
CARD16 t;
CARD32 m,n,o,p;
if (!msk)
- return (*src->fetch) (src->line, src->offset);
+ return (*src->fetch) (src);
- a = (*msk->fetcha) (msk->line, msk->offset);
+ a = (*msk->fetcha) (msk);
if (!a)
return 0;
- x = (*src->fetcha) (src->line, src->offset);
+ x = (*src->fetcha) (src);
if (a == 0xffffffff)
return x;
@@ -217,7 +210,7 @@ fbCombineClear (FbCompositeOperand *src,
FbCompositeOperand *msk,
FbCompositeOperand *dst)
{
- (*dst->store) (dst->line, dst->offset, 0);
+ (*dst->store) (dst, 0);
}
void
@@ -225,7 +218,7 @@ fbCombineSrcU (FbCompositeOperand *src,
FbCompositeOperand *msk,
FbCompositeOperand *dst)
{
- (*dst->store) (dst->line, dst->offset, fbCombineMaskU (src, msk));
+ (*dst->store) (dst, fbCombineMaskU (src, msk));
}
void
@@ -233,7 +226,7 @@ fbCombineSrcC (FbCompositeOperand *src,
FbCompositeOperand *msk,
FbCompositeOperand *dst)
{
- (*dst->store) (dst->line, dst->offset, fbCombineMaskValueC (src, msk));
+ (*dst->store) (dst, fbCombineMaskValueC (src, msk));
}
void
@@ -260,14 +253,14 @@ fbCombineOverU (FbCompositeOperand *src,
{
if (a)
{
- d = (*dst->fetch) (dst->line, dst->offset);
+ d = (*dst->fetch) (dst);
m = FbOverU(s,d,0,a,t);
n = FbOverU(s,d,8,a,t);
o = FbOverU(s,d,16,a,t);
p = FbOverU(s,d,24,a,t);
s = m|n|o|p;
}
- (*dst->store) (dst->line, dst->offset, s);
+ (*dst->store) (dst, s);
}
}
@@ -289,14 +282,14 @@ fbCombineOverC (FbCompositeOperand *src,
{
if (a)
{
- d = (*dst->fetch) (dst->line, dst->offset);
+ d = (*dst->fetch) (dst);
m = FbOverC(s,d,0,a,t);
n = FbOverC(s,d,8,a,t);
o = FbOverC(s,d,16,a,t);
p = FbOverC(s,d,24,a,t);
s = m|n|o|p;
}
- (*dst->store) (dst->line, dst->offset, s);
+ (*dst->store) (dst, s);
}
}
@@ -310,7 +303,7 @@ fbCombineOverReverseU (FbCompositeOperand *src,
CARD16 t;
CARD32 m,n,o,p;
- d = (*dst->fetch) (dst->line, dst->offset);
+ d = (*dst->fetch) (dst);
a = ~d >> 24;
if (a)
{
@@ -323,7 +316,7 @@ fbCombineOverReverseU (FbCompositeOperand *src,
p = FbOverU(d,s,24,a,t);
s = m|n|o|p;
}
- (*dst->store) (dst->line, dst->offset, s);
+ (*dst->store) (dst, s);
}
}
@@ -337,7 +330,7 @@ fbCombineOverReverseC (FbCompositeOperand *src,
CARD16 t;
CARD32 m,n,o,p;
- d = (*dst->fetch) (dst->line, dst->offset);
+ d = (*dst->fetch) (dst);
a = ~d >> 24;
if (a)
{
@@ -350,7 +343,7 @@ fbCombineOverReverseC (FbCompositeOperand *src,
p = FbOverU(d,s,24,a,t);
s = m|n|o|p;
}
- (*dst->store) (dst->line, dst->offset, s);
+ (*dst->store) (dst, s);
}
}
@@ -364,7 +357,7 @@ fbCombineInU (FbCompositeOperand *src,
CARD16 t;
CARD32 m,n,o,p;
- d = (*dst->fetch) (dst->line, dst->offset);
+ d = (*dst->fetch) (dst);
a = d >> 24;
s = 0;
if (a)
@@ -379,7 +372,7 @@ fbCombineInU (FbCompositeOperand *src,
s = m|n|o|p;
}
}
- (*dst->store) (dst->line, dst->offset, s);
+ (*dst->store) (dst, s);
}
void
@@ -392,7 +385,7 @@ fbCombineInC (FbCompositeOperand *src,
CARD16 t;
CARD32 m,n,o,p;
- d = (*dst->fetch) (dst->line, dst->offset);
+ d = (*dst->fetch) (dst);
a = d >> 24;
s = 0;
if (a)
@@ -407,7 +400,7 @@ fbCombineInC (FbCompositeOperand *src,
s = m|n|o|p;
}
}
- (*dst->store) (dst->line, dst->offset, s);
+ (*dst->store) (dst, s);
}
void
@@ -427,14 +420,14 @@ fbCombineInReverseU (FbCompositeOperand *src,
d = 0;
if (a)
{
- d = (*dst->fetch) (dst->line, dst->offset);
+ d = (*dst->fetch) (dst);
m = FbInU(d,0,a,t);
n = FbInU(d,8,a,t);
o = FbInU(d,16,a,t);
p = FbInU(d,24,a,t);
d = m|n|o|p;
}
- (*dst->store) (dst->line, dst->offset, d);
+ (*dst->store) (dst, d);
}
}
@@ -455,14 +448,14 @@ fbCombineInReverseC (FbCompositeOperand *src,
d = 0;
if (a)
{
- d = (*dst->fetch) (dst->line, dst->offset);
+ d = (*dst->fetch) (dst);
m = FbInC(d,0,a,t);
n = FbInC(d,8,a,t);
o = FbInC(d,16,a,t);
p = FbInC(d,24,a,t);
d = m|n|o|p;
}
- (*dst->store) (dst->line, dst->offset, d);
+ (*dst->store) (dst, d);
}
}
@@ -476,7 +469,7 @@ fbCombineOutU (FbCompositeOperand *src,
CARD16 t;
CARD32 m,n,o,p;
- d = (*dst->fetch) (dst->line, dst->offset);
+ d = (*dst->fetch) (dst);
a = ~d >> 24;
s = 0;
if (a)
@@ -491,7 +484,7 @@ fbCombineOutU (FbCompositeOperand *src,
s = m|n|o|p;
}
}
- (*dst->store) (dst->line, dst->offset, s);
+ (*dst->store) (dst, s);
}
void
@@ -504,7 +497,7 @@ fbCombineOutC (FbCompositeOperand *src,
CARD16 t;
CARD32 m,n,o,p;
- d = (*dst->fetch) (dst->line, dst->offset);
+ d = (*dst->fetch) (dst);
a = ~d >> 24;
s = 0;
if (a)
@@ -519,7 +512,7 @@ fbCombineOutC (FbCompositeOperand *src,
s = m|n|o|p;
}
}
- (*dst->store) (dst->line, dst->offset, s);
+ (*dst->store) (dst, s);
}
void
@@ -539,14 +532,14 @@ fbCombineOutReverseU (FbCompositeOperand *src,
d = 0;
if (a)
{
- d = (*dst->fetch) (dst->line, dst->offset);
+ d = (*dst->fetch) (dst);
m = FbInU(d,0,a,t);
n = FbInU(d,8,a,t);
o = FbInU(d,16,a,t);
p = FbInU(d,24,a,t);
d = m|n|o|p;
}
- (*dst->store) (dst->line, dst->offset, d);
+ (*dst->store) (dst, d);
}
}
@@ -567,14 +560,14 @@ fbCombineOutReverseC (FbCompositeOperand *src,
d = 0;
if (a)
{
- d = (*dst->fetch) (dst->line, dst->offset);
+ d = (*dst->fetch) (dst);
m = FbInC(d,0,a,t);
n = FbInC(d,8,a,t);
o = FbInC(d,16,a,t);
p = FbInC(d,24,a,t);
d = m|n|o|p;
}
- (*dst->store) (dst->line, dst->offset, d);
+ (*dst->store) (dst, d);
}
}
@@ -585,18 +578,18 @@ fbCombineAtopU (FbCompositeOperand *src,
{
CARD32 s, d;
CARD16 ad, as;
- CARD16 t;
+ CARD16 t,u,v;
CARD32 m,n,o,p;
s = fbCombineMaskU (src, msk);
- d = (*dst->fetch) (dst->line, dst->offset);
+ d = (*dst->fetch) (dst);
ad = ~s >> 24;
as = d >> 24;
- m = FbGen(s,d,0,as,ad,t);
- n = FbGen(s,d,8,as,ad,t);
- o = FbGen(s,d,16,as,ad,t);
- p = FbGen(s,d,24,as,ad,t);
- (*dst->store) (dst->line, dst->offset, m|n|o|p);
+ m = FbGen(s,d,0,as,ad,t,u,v);
+ n = FbGen(s,d,8,as,ad,t,u,v);
+ o = FbGen(s,d,16,as,ad,t,u,v);
+ p = FbGen(s,d,24,as,ad,t,u,v);
+ (*dst->store) (dst, m|n|o|p);
}
void
@@ -608,19 +601,19 @@ fbCombineAtopC (FbCompositeOperand *src,
CARD32 s, d;
CARD32 ad;
CARD16 as;
- CARD16 t;
+ CARD16 t, u, v;
CARD32 m,n,o,p;
cs = fbCombineMaskC (src, msk);
- d = (*dst->fetch) (dst->line, dst->offset);
+ d = (*dst->fetch) (dst);
s = cs.value;
ad = cs.alpha;
as = d >> 24;
- m = FbGen(s,d,0,as,FbGet8(ad,0),t);
- n = FbGen(s,d,8,as,FbGet8(ad,8),t);
- o = FbGen(s,d,16,as,FbGet8(ad,16),t);
- p = FbGen(s,d,24,as,FbGet8(ad,24),t);
- (*dst->store) (dst->line, dst->offset, m|n|o|p);
+ m = FbGen(s,d,0,as,FbGet8(ad,0),t,u,v);
+ n = FbGen(s,d,8,as,FbGet8(ad,8),t,u,v);
+ o = FbGen(s,d,16,as,FbGet8(ad,16),t,u,v);
+ p = FbGen(s,d,24,as,FbGet8(ad,24),t,u,v);
+ (*dst->store) (dst, m|n|o|p);
}
void
@@ -630,18 +623,18 @@ fbCombineAtopReverseU (FbCompositeOperand *src,
{
CARD32 s, d;
CARD16 ad, as;
- CARD16 t;
+ CARD16 t, u, v;
CARD32 m,n,o,p;
s = fbCombineMaskU (src, msk);
- d = (*dst->fetch) (dst->line, dst->offset);
+ d = (*dst->fetch) (dst);
ad = s >> 24;
as = ~d >> 24;
- m = FbGen(s,d,0,as,ad,t);
- n = FbGen(s,d,8,as,ad,t);
- o = FbGen(s,d,16,as,ad,t);
- p = FbGen(s,d,24,as,ad,t);
- (*dst->store) (dst->line, dst->offset, m|n|o|p);
+ m = FbGen(s,d,0,as,ad,t,u,v);
+ n = FbGen(s,d,8,as,ad,t,u,v);
+ o = FbGen(s,d,16,as,ad,t,u,v);
+ p = FbGen(s,d,24,as,ad,t,u,v);
+ (*dst->store) (dst, m|n|o|p);
}
void
@@ -652,19 +645,19 @@ fbCombineAtopReverseC (FbCompositeOperand *src,
FbCompSrc cs;
CARD32 s, d, ad;
CARD16 as;
- CARD16 t;
+ CARD16 t, u, v;
CARD32 m,n,o,p;
cs = fbCombineMaskC (src, msk);
- d = (*dst->fetch) (dst->line, dst->offset);
+ d = (*dst->fetch) (dst);
s = cs.value;
ad = cs.alpha;
as = ~d >> 24;
- m = FbGen(s,d,0,as,FbGet8(ad,0),t);
- n = FbGen(s,d,8,as,FbGet8(ad,8),t);
- o = FbGen(s,d,16,as,FbGet8(ad,16),t);
- p = FbGen(s,d,24,as,FbGet8(ad,24),t);
- (*dst->store) (dst->line, dst->offset, m|n|o|p);
+ m = FbGen(s,d,0,as,FbGet8(ad,0),t,u,v);
+ n = FbGen(s,d,8,as,FbGet8(ad,8),t,u,v);
+ o = FbGen(s,d,16,as,FbGet8(ad,16),t,u,v);
+ p = FbGen(s,d,24,as,FbGet8(ad,24),t,u,v);
+ (*dst->store) (dst, m|n|o|p);
}
void
@@ -674,18 +667,18 @@ fbCombineXorU (FbCompositeOperand *src,
{
CARD32 s, d;
CARD16 ad, as;
- CARD16 t;
+ CARD16 t, u, v;
CARD32 m,n,o,p;
s = fbCombineMaskU (src, msk);
- d = (*dst->fetch) (dst->line, dst->offset);
+ d = (*dst->fetch) (dst);
ad = ~s >> 24;
as = ~d >> 24;
- m = FbGen(s,d,0,as,ad,t);
- n = FbGen(s,d,8,as,ad,t);
- o = FbGen(s,d,16,as,ad,t);
- p = FbGen(s,d,24,as,ad,t);
- (*dst->store) (dst->line, dst->offset, m|n|o|p);
+ m = FbGen(s,d,0,as,ad,t,u,v);
+ n = FbGen(s,d,8,as,ad,t,u,v);
+ o = FbGen(s,d,16,as,ad,t,u,v);
+ p = FbGen(s,d,24,as,ad,t,u,v);
+ (*dst->store) (dst, m|n|o|p);
}
void
@@ -696,19 +689,19 @@ fbCombineXorC (FbCompositeOperand *src,
FbCompSrc cs;
CARD32 s, d, ad;
CARD16 as;
- CARD16 t;
+ CARD16 t, u, v;
CARD32 m,n,o,p;
cs = fbCombineMaskC (src, msk);
- d = (*dst->fetch) (dst->line, dst->offset);
+ d = (*dst->fetch) (dst);
s = cs.value;
ad = ~cs.alpha;
as = ~d >> 24;
- m = FbGen(s,d,0,as,ad,t);
- n = FbGen(s,d,8,as,ad,t);
- o = FbGen(s,d,16,as,ad,t);
- p = FbGen(s,d,24,as,ad,t);
- (*dst->store) (dst->line, dst->offset, m|n|o|p);
+ m = FbGen(s,d,0,as,ad,t,u,v);
+ n = FbGen(s,d,8,as,ad,t,u,v);
+ o = FbGen(s,d,16,as,ad,t,u,v);
+ p = FbGen(s,d,24,as,ad,t,u,v);
+ (*dst->store) (dst, m|n|o|p);
}
void
@@ -722,17 +715,17 @@ fbCombineAddU (FbCompositeOperand *src,
s = fbCombineMaskU (src, msk);
if (s == ~0)
- (*dst->store) (dst->line, dst->offset, s);
+ (*dst->store) (dst, s);
else
{
- d = (*dst->fetch) (dst->line, dst->offset);
+ d = (*dst->fetch) (dst);
if (s && d != ~0)
{
m = FbAdd(s,d,0,t);
n = FbAdd(s,d,8,t);
o = FbAdd(s,d,16,t);
p = FbAdd(s,d,24,t);
- (*dst->store) (dst->line, dst->offset, m|n|o|p);
+ (*dst->store) (dst, m|n|o|p);
}
}
}
@@ -748,17 +741,17 @@ fbCombineAddC (FbCompositeOperand *src,
s = fbCombineMaskValueC (src, msk);
if (s == ~0)
- (*dst->store) (dst->line, dst->offset, s);
+ (*dst->store) (dst, s);
else
{
- d = (*dst->fetch) (dst->line, dst->offset);
+ d = (*dst->fetch) (dst);
if (s && d != ~0)
{
m = FbAdd(s,d,0,t);
n = FbAdd(s,d,8,t);
o = FbAdd(s,d,16,t);
p = FbAdd(s,d,24,t);
- (*dst->store) (dst->line, dst->offset, m|n|o|p);
+ (*dst->store) (dst, m|n|o|p);
}
}
}
@@ -775,7 +768,8 @@ fbCombineSaturateU (FbCompositeOperand *src,
CARD32 m,n,o,p;
s = fbCombineMaskU (src, msk);
- d = (*dst->fetch) (dst->line, dst->offset);
+#if 0
+ d = (*dst->fetch) (dst);
sa = s >> 24;
da = ~d >> 24;
if (sa <= da)
@@ -789,12 +783,22 @@ fbCombineSaturateU (FbCompositeOperand *src,
{
as = (da << 8) / sa;
ad = 0xff;
- m = FbGen(s,d,0,as,ad,t);
- n = FbGen(s,d,8,as,ad,t);
- o = FbGen(s,d,16,as,ad,t);
- p = FbGen(s,d,24,as,ad,t);
+ m = FbGen(s,d,0,as,ad,t,u,v);
+ n = FbGen(s,d,8,as,ad,t,u,v);
+ o = FbGen(s,d,16,as,ad,t,u,v);
+ p = FbGen(s,d,24,as,ad,t,u,v);
+ }
+ (*dst->store) (dst, m|n|o|p);
+#else
+ if ((s >> 24) == 0xff)
+ (*dst->store) (dst, s);
+ else
+ {
+ d = (*dst->fetch) (dst);
+ if ((s >> 24) > (d >> 24))
+ (*dst->store) (dst, s);
}
- (*dst->store) (dst->line, dst->offset, m|n|o|p);
+#endif
}
void
@@ -805,12 +809,11 @@ fbCombineSaturateC (FbCompositeOperand *src,
FbCompSrc cs;
CARD32 s, d;
CARD16 sa, sr, sg, sb, da;
- CARD16 ad, as;
- CARD16 t;
+ CARD16 t, u, v;
CARD32 m,n,o,p;
cs = fbCombineMaskC (src, msk);
- d = (*dst->fetch) (dst->line, dst->offset);
+ d = (*dst->fetch) (dst);
s = cs.value;
sa = (cs.alpha >> 24) & 0xff;
sr = (cs.alpha >> 16) & 0xff;
@@ -821,24 +824,686 @@ fbCombineSaturateC (FbCompositeOperand *src,
if (sb <= da)
m = FbAdd(s,d,0,t);
else
- m = FbGen (s, d, 0, (da << 8) / sb, 0xff, t);
+ m = FbGen (s, d, 0, (da << 8) / sb, 0xff, t, u, v);
if (sg <= da)
n = FbAdd(s,d,8,t);
else
- n = FbGen (s, d, 8, (da << 8) / sg, 0xff, t);
+ n = FbGen (s, d, 8, (da << 8) / sg, 0xff, t, u, v);
if (sr < da)
o = FbAdd(s,d,16,t);
else
- o = FbGen (s, d, 16, (da << 8) / sr, 0xff, t);
+ o = FbGen (s, d, 16, (da << 8) / sr, 0xff, t, u, v);
if (sa <= da)
p = FbAdd(s,d,24,t);
else
- p = FbGen (s, d, 24, (da << 8) / sa, 0xff, t);
+ p = FbGen (s, d, 24, (da << 8) / sa, 0xff, t, u, v);
+
+ (*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 */
+CARD8
+fbCombineDisjointOutPart (CARD8 a, CARD8 b)
+{
+ /* min (1, (1-b) / a) */
+
+ b = ~b; /* 1 - b */
+ if (b >= a) /* 1 - b >= a -> (1-b)/a >= 1 */
+ return 0xff; /* 1 */
+ return FbIntDiv(b,a); /* (1-b) / a */
+}
+
+/* portion covered by both a and b */
+CARD8
+fbCombineDisjointInPart (CARD8 a, CARD8 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 ~FbIntDiv(b,a); /* 1 - (1-b) / a */
+}
+
+void
+fbCombineDisjointGeneralU (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst,
+ CARD8 combine)
+{
+ CARD32 s, d;
+ CARD32 m,n,o,p;
+ CARD16 Fa, Fb, t, u, v;
+ CARD8 sa, da;
+
+ s = fbCombineMaskU (src, msk);
+ sa = s >> 24;
+
+ d = (*dst->fetch) (dst);
+ da = d >> 24;
+
+ switch (combine & CombineA) {
+ case 0:
+ Fa = 0;
+ break;
+ case CombineAOut:
+ Fa = fbCombineDisjointOutPart (sa, da);
+ break;
+ case CombineAIn:
+ Fa = fbCombineDisjointInPart (sa, da);
+ break;
+ case CombineA:
+ Fa = 0xff;
+ break;
+ }
+
+ switch (combine & CombineB) {
+ case 0:
+ Fb = 0;
+ break;
+ case CombineBOut:
+ Fb = fbCombineDisjointOutPart (da, sa);
+ break;
+ case CombineBIn:
+ Fb = fbCombineDisjointInPart (da, sa);
+ break;
+ case CombineB:
+ Fb = 0xff;
+ break;
+ }
+ m = FbGen (s,d,0,Fa,Fb,t,u,v);
+ n = FbGen (s,d,8,Fa,Fb,t,u,v);
+ o = FbGen (s,d,16,Fa,Fb,t,u,v);
+ p = FbGen (s,d,24,Fa,Fb,t,u,v);
+ s = m|n|o|p;
+ (*dst->store) (dst, s);
+}
+
+void
+fbCombineDisjointGeneralC (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst,
+ CARD8 combine)
+{
+ FbCompSrc cs;
+ CARD32 s, d;
+ CARD32 m,n,o,p;
+ CARD32 Fa;
+ CARD16 Fb, t, u, v;
+ CARD32 sa;
+ CARD8 da;
+
+ cs = fbCombineMaskC (src, msk);
+ s = cs.value;
+ sa = cs.alpha;
+
+ d = (*dst->fetch) (dst);
+ da = d >> 24;
+
+ switch (combine & CombineA) {
+ case 0:
+ Fa = 0;
+ break;
+ case CombineAOut:
+ m = fbCombineDisjointOutPart ((CARD8) (sa >> 0), da);
+ n = fbCombineDisjointOutPart ((CARD8) (sa >> 8), da) << 8;
+ o = fbCombineDisjointOutPart ((CARD8) (sa >> 16), da) << 16;
+ p = fbCombineDisjointOutPart ((CARD8) (sa >> 24), da) << 24;
+ Fa = m|n|o|p;
+ break;
+ case CombineAIn:
+ m = fbCombineDisjointOutPart ((CARD8) (sa >> 0), da);
+ n = fbCombineDisjointOutPart ((CARD8) (sa >> 8), da) << 8;
+ o = fbCombineDisjointOutPart ((CARD8) (sa >> 16), da) << 16;
+ p = fbCombineDisjointOutPart ((CARD8) (sa >> 24), da) << 24;
+ Fa = m|n|o|p;
+ break;
+ case CombineA:
+ Fa = 0xffffffff;
+ break;
+ }
+
+ switch (combine & CombineB) {
+ case 0:
+ Fb = 0;
+ break;
+ case CombineBOut:
+ Fb = fbCombineDisjointOutPart (da, sa);
+ break;
+ case CombineBIn:
+ Fb = fbCombineDisjointInPart (da, sa);
+ break;
+ case CombineB:
+ Fb = 0xff;
+ break;
+ }
+ m = FbGen (s,d,0,FbGet8(Fa,0),Fb,t,u,v);
+ n = FbGen (s,d,8,FbGet8(Fa,8),Fb,t,u,v);
+ o = FbGen (s,d,16,FbGet8(Fa,16),Fb,t,u,v);
+ p = FbGen (s,d,24,FbGet8(Fa,24),Fb,t,u,v);
+ s = m|n|o|p;
+ (*dst->store) (dst, s);
+}
+
+void
+fbCombineDisjointOverU (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ CARD32 s, d;
+ CARD16 a;
+ CARD16 t;
+ CARD32 m,n,o,p;
+
+ s = fbCombineMaskU (src, msk);
+ a = s >> 24;
+ if (a != 0x00)
+ {
+ if (a != 0xff)
+ {
+ d = (*dst->fetch) (dst);
+ a = fbCombineDisjointOutPart (d >> 24, a);
+ m = FbOverU(s,d,0,a,t);
+ n = FbOverU(s,d,8,a,t);
+ o = FbOverU(s,d,16,a,t);
+ p = FbOverU(s,d,24,a,t);
+ s = m|n|o|p;
+ }
+ (*dst->store) (dst, s);
+ }
+}
+
+void
+fbCombineDisjointOverC (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineDisjointGeneralC (src, msk, dst, CombineAOver);
+}
+
+void
+fbCombineDisjointOverReverseU (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineDisjointGeneralU (src, msk, dst, CombineBOver);
+}
+
+void
+fbCombineDisjointOverReverseC (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineDisjointGeneralC (src, msk, dst, CombineBOver);
+}
+
+void
+fbCombineDisjointInU (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineDisjointGeneralU (src, msk, dst, CombineAIn);
+}
+
+void
+fbCombineDisjointInC (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineDisjointGeneralC (src, msk, dst, CombineAIn);
+}
+
+void
+fbCombineDisjointInReverseU (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineDisjointGeneralU (src, msk, dst, CombineBIn);
+}
+
+void
+fbCombineDisjointInReverseC (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineDisjointGeneralC (src, msk, dst, CombineBIn);
+}
+
+void
+fbCombineDisjointOutU (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineDisjointGeneralU (src, msk, dst, CombineAOut);
+}
+
+void
+fbCombineDisjointOutC (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineDisjointGeneralC (src, msk, dst, CombineAOut);
+}
+
+void
+fbCombineDisjointOutReverseU (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineDisjointGeneralU (src, msk, dst, CombineBOut);
+}
+
+void
+fbCombineDisjointOutReverseC (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineDisjointGeneralC (src, msk, dst, CombineBOut);
+}
+
+void
+fbCombineDisjointAtopU (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineDisjointGeneralU (src, msk, dst, CombineAAtop);
+}
+
+void
+fbCombineDisjointAtopC (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineDisjointGeneralC (src, msk, dst, CombineAAtop);
+}
+
+void
+fbCombineDisjointAtopReverseU (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineDisjointGeneralU (src, msk, dst, CombineBAtop);
+}
+
+void
+fbCombineDisjointAtopReverseC (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineDisjointGeneralC (src, msk, dst, CombineBAtop);
+}
+
+void
+fbCombineDisjointXorU (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineDisjointGeneralU (src, msk, dst, CombineXor);
+}
+
+void
+fbCombineDisjointXorC (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineDisjointGeneralC (src, msk, dst, CombineXor);
+}
+
+/* portion covered by a but not b */
+CARD8
+fbCombineConjointOutPart (CARD8 a, CARD8 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 ~FbIntDiv(b,a); /* 1 - b/a */
+}
+
+/* portion covered by both a and b */
+CARD8
+fbCombineConjointInPart (CARD8 a, CARD8 b)
+{
+ /* min (1,b/a) */
+
+ if (b >= a) /* b >= a -> b/a >= 1 */
+ return 0xff; /* 1 */
+ return FbIntDiv(b,a); /* b/a */
+}
+
+void
+fbCombineConjointGeneralU (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst,
+ CARD8 combine)
+{
+ CARD32 s, d;
+ CARD32 m,n,o,p;
+ CARD16 Fa, Fb, t, u, v;
+ CARD8 sa, da;
+ CARD32 rp;
+
+ s = fbCombineMaskU (src, msk);
+ sa = s >> 24;
+
+ d = (*dst->fetch) (dst);
+ da = d >> 24;
- (*dst->store) (dst->line, dst->offset, m|n|o|p);
+ switch (combine & CombineA) {
+ case 0:
+ Fa = 0;
+ break;
+ case CombineAOut:
+ Fa = fbCombineConjointOutPart (sa, da);
+ break;
+ case CombineAIn:
+ Fa = fbCombineConjointInPart (sa, da);
+ break;
+ case CombineA:
+ Fa = 0xff;
+ break;
+ }
+
+ switch (combine & CombineB) {
+ case 0:
+ Fb = 0;
+ break;
+ case CombineBOut:
+ Fb = fbCombineConjointOutPart (da, sa);
+ break;
+ case CombineBIn:
+ Fb = fbCombineConjointInPart (da, sa);
+ break;
+ case CombineB:
+ Fb = 0xff;
+ break;
+ }
+ m = FbGen (s,d,0,Fa,Fb,t,u,v);
+ n = FbGen (s,d,8,Fa,Fb,t,u,v);
+ o = FbGen (s,d,16,Fa,Fb,t,u,v);
+ p = FbGen (s,d,24,Fa,Fb,t,u,v);
+ s = m|n|o|p;
+ (*dst->store) (dst, s);
+}
+
+void
+fbCombineConjointGeneralC (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst,
+ CARD8 combine)
+{
+ FbCompSrc cs;
+ CARD32 s, d;
+ CARD32 m,n,o,p;
+ CARD32 Fa;
+ CARD16 Fb, t, u, v;
+ CARD32 sa;
+ CARD8 da;
+
+ cs = fbCombineMaskC (src, msk);
+ s = cs.value;
+ sa = cs.alpha;
+
+ d = (*dst->fetch) (dst);
+ da = d >> 24;
+
+ switch (combine & CombineA) {
+ case 0:
+ Fa = 0;
+ break;
+ case CombineAOut:
+ m = fbCombineConjointOutPart ((CARD8) (sa >> 0), da);
+ n = fbCombineConjointOutPart ((CARD8) (sa >> 8), da) << 8;
+ o = fbCombineConjointOutPart ((CARD8) (sa >> 16), da) << 16;
+ p = fbCombineConjointOutPart ((CARD8) (sa >> 24), da) << 24;
+ Fa = m|n|o|p;
+ break;
+ case CombineAIn:
+ m = fbCombineConjointOutPart ((CARD8) (sa >> 0), da);
+ n = fbCombineConjointOutPart ((CARD8) (sa >> 8), da) << 8;
+ o = fbCombineConjointOutPart ((CARD8) (sa >> 16), da) << 16;
+ p = fbCombineConjointOutPart ((CARD8) (sa >> 24), da) << 24;
+ Fa = m|n|o|p;
+ break;
+ case CombineA:
+ Fa = 0xffffffff;
+ break;
+ }
+
+ switch (combine & CombineB) {
+ case 0:
+ Fb = 0;
+ break;
+ case CombineBOut:
+ Fb = fbCombineConjointOutPart (da, sa);
+ break;
+ case CombineBIn:
+ Fb = fbCombineConjointInPart (da, sa);
+ break;
+ case CombineB:
+ Fb = 0xff;
+ break;
+ }
+ m = FbGen (s,d,0,FbGet8(Fa,0),Fb,t,u,v);
+ n = FbGen (s,d,8,FbGet8(Fa,8),Fb,t,u,v);
+ o = FbGen (s,d,16,FbGet8(Fa,16),Fb,t,u,v);
+ p = FbGen (s,d,24,FbGet8(Fa,24),Fb,t,u,v);
+ s = m|n|o|p;
+ (*dst->store) (dst, s);
+}
+
+void
+fbCombineConjointOverU (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineConjointGeneralU (src, msk, dst, CombineAOver);
+/*
+ CARD32 s, d;
+ CARD16 a;
+ CARD16 t;
+ CARD32 m,n,o,p;
+
+ s = fbCombineMaskU (src, msk);
+ a = s >> 24;
+ if (a != 0x00)
+ {
+ if (a != 0xff)
+ {
+ d = (*dst->fetch) (dst);
+ a = fbCombineConjointOutPart (d >> 24, a);
+ m = FbOverU(s,d,0,a,t);
+ n = FbOverU(s,d,8,a,t);
+ o = FbOverU(s,d,16,a,t);
+ p = FbOverU(s,d,24,a,t);
+ s = m|n|o|p;
+ }
+ (*dst->store) (dst, s);
+ }
+ */
+}
+
+void
+fbCombineConjointOverC (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineConjointGeneralC (src, msk, dst, CombineAOver);
+}
+
+void
+fbCombineConjointOverReverseU (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineConjointGeneralU (src, msk, dst, CombineBOver);
+}
+
+void
+fbCombineConjointOverReverseC (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineConjointGeneralC (src, msk, dst, CombineBOver);
+}
+
+void
+fbCombineConjointInU (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineConjointGeneralU (src, msk, dst, CombineAIn);
+}
+
+void
+fbCombineConjointInC (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineConjointGeneralC (src, msk, dst, CombineAIn);
+}
+
+void
+fbCombineConjointInReverseU (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineConjointGeneralU (src, msk, dst, CombineBIn);
+}
+
+void
+fbCombineConjointInReverseC (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineConjointGeneralC (src, msk, dst, CombineBIn);
+}
+
+void
+fbCombineConjointOutU (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineConjointGeneralU (src, msk, dst, CombineAOut);
+}
+
+void
+fbCombineConjointOutC (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineConjointGeneralC (src, msk, dst, CombineAOut);
+}
+
+void
+fbCombineConjointOutReverseU (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineConjointGeneralU (src, msk, dst, CombineBOut);
+}
+
+void
+fbCombineConjointOutReverseC (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineConjointGeneralC (src, msk, dst, CombineBOut);
+}
+
+void
+fbCombineConjointAtopU (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineConjointGeneralU (src, msk, dst, CombineAAtop);
+}
+
+void
+fbCombineConjointAtopC (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineConjointGeneralC (src, msk, dst, CombineAAtop);
+}
+
+void
+fbCombineConjointAtopReverseU (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineConjointGeneralU (src, msk, dst, CombineBAtop);
+}
+
+void
+fbCombineConjointAtopReverseC (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineConjointGeneralC (src, msk, dst, CombineBAtop);
+}
+
+void
+fbCombineConjointXorU (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineConjointGeneralU (src, msk, dst, CombineXor);
+}
+
+void
+fbCombineConjointXorC (FbCompositeOperand *src,
+ FbCompositeOperand *msk,
+ FbCompositeOperand *dst)
+{
+ fbCombineConjointGeneralC (src, msk, dst, CombineXor);
}
FbCombineFunc fbCombineFuncU[] = {
@@ -855,7 +1520,37 @@ FbCombineFunc fbCombineFuncU[] = {
fbCombineAtopReverseU,
fbCombineXorU,
fbCombineAddU,
- fbCombineSaturateU,
+ fbCombineDisjointOverU, /* Saturate */
+ 0,
+ 0,
+ fbCombineClear,
+ fbCombineSrcU,
+ fbCombineDst,
+ fbCombineDisjointOverU,
+ fbCombineDisjointOverReverseU,
+ fbCombineDisjointInU,
+ fbCombineDisjointInReverseU,
+ fbCombineDisjointOutU,
+ fbCombineDisjointOutReverseU,
+ fbCombineDisjointAtopU,
+ fbCombineDisjointAtopReverseU,
+ fbCombineDisjointXorU,
+ 0,
+ 0,
+ 0,
+ 0,
+ fbCombineClear,
+ fbCombineSrcU,
+ fbCombineDst,
+ fbCombineConjointOverU,
+ fbCombineConjointOverReverseU,
+ fbCombineConjointInU,
+ fbCombineConjointInReverseU,
+ fbCombineConjointOutU,
+ fbCombineConjointOutReverseU,
+ fbCombineConjointAtopU,
+ fbCombineConjointAtopReverseU,
+ fbCombineConjointXorU,
};
FbCombineFunc fbCombineFuncC[] = {
@@ -872,7 +1567,37 @@ FbCombineFunc fbCombineFuncC[] = {
fbCombineAtopReverseC,
fbCombineXorC,
fbCombineAddC,
- fbCombineSaturateC,
+ fbCombineDisjointOverC, /* Saturate */
+ 0,
+ 0,
+ fbCombineClear, /* 0x10 */
+ fbCombineSrcC,
+ fbCombineDst,
+ fbCombineDisjointOverC,
+ fbCombineDisjointOverReverseC,
+ fbCombineDisjointInC,
+ fbCombineDisjointInReverseC,
+ fbCombineDisjointOutC,
+ fbCombineDisjointOutReverseC,
+ fbCombineDisjointAtopC,
+ fbCombineDisjointAtopReverseC,
+ fbCombineDisjointXorC, /* 0x1b */
+ 0,
+ 0,
+ 0,
+ 0,
+ fbCombineClear,
+ fbCombineSrcC,
+ fbCombineDst,
+ fbCombineConjointOverC,
+ fbCombineConjointOverReverseC,
+ fbCombineConjointInC,
+ fbCombineConjointInReverseC,
+ fbCombineConjointOutC,
+ fbCombineConjointOutReverseC,
+ fbCombineConjointAtopC,
+ fbCombineConjointAtopReverseC,
+ fbCombineConjointXorC,
};
/*
@@ -880,20 +1605,23 @@ FbCombineFunc fbCombineFuncC[] = {
*/
CARD32
-fbFetch_a8r8g8b8 (FbBits *line, CARD32 offset)
+fbFetch_a8r8g8b8 (FbCompositeOperand *op)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
return ((CARD32 *)line)[offset >> 5];
}
CARD32
-fbFetch_x8r8g8b8 (FbBits *line, CARD32 offset)
+fbFetch_x8r8g8b8 (FbCompositeOperand *op)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
return ((CARD32 *)line)[offset >> 5] | 0xff000000;
}
CARD32
-fbFetch_a8b8g8r8 (FbBits *line, CARD32 offset)
+fbFetch_a8b8g8r8 (FbCompositeOperand *op)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD32 pixel = ((CARD32 *)line)[offset >> 5];
return ((pixel & 0xff000000) |
@@ -903,8 +1631,9 @@ fbFetch_a8b8g8r8 (FbBits *line, CARD32 offset)
}
CARD32
-fbFetch_x8b8g8r8 (FbBits *line, CARD32 offset)
+fbFetch_x8b8g8r8 (FbCompositeOperand *op)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD32 pixel = ((CARD32 *)line)[offset >> 5];
return ((0xff000000) |
@@ -914,8 +1643,9 @@ fbFetch_x8b8g8r8 (FbBits *line, CARD32 offset)
}
CARD32
-fbFetch_r8g8b8 (FbBits *line, CARD32 offset)
+fbFetch_r8g8b8 (FbCompositeOperand *op)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD8 *pixel = ((CARD8 *) line) + (offset >> 3);
#if IMAGE_BYTE_ORDER == MSBFirst
return (0xff000000 |
@@ -931,8 +1661,9 @@ fbFetch_r8g8b8 (FbBits *line, CARD32 offset)
}
CARD32
-fbFetch_b8g8r8 (FbBits *line, CARD32 offset)
+fbFetch_b8g8r8 (FbCompositeOperand *op)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD8 *pixel = ((CARD8 *) line) + (offset >> 3);
#if IMAGE_BYTE_ORDER == MSBFirst
return (0xff000000 |
@@ -948,8 +1679,9 @@ fbFetch_b8g8r8 (FbBits *line, CARD32 offset)
}
CARD32
-fbFetch_r5g6b5 (FbBits *line, CARD32 offset)
+fbFetch_r5g6b5 (FbCompositeOperand *op)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD32 pixel = ((CARD16 *) line)[offset >> 4];
CARD32 r,g,b;
@@ -960,8 +1692,9 @@ fbFetch_r5g6b5 (FbBits *line, CARD32 offset)
}
CARD32
-fbFetch_b5g6r5 (FbBits *line, CARD32 offset)
+fbFetch_b5g6r5 (FbCompositeOperand *op)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD32 pixel = ((CARD16 *) line)[offset >> 4];
CARD32 r,g,b;
@@ -972,8 +1705,9 @@ fbFetch_b5g6r5 (FbBits *line, CARD32 offset)
}
CARD32
-fbFetch_a1r5g5b5 (FbBits *line, CARD32 offset)
+fbFetch_a1r5g5b5 (FbCompositeOperand *op)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD32 pixel = ((CARD16 *) line)[offset >> 4];
CARD32 a,r,g,b;
@@ -985,8 +1719,9 @@ fbFetch_a1r5g5b5 (FbBits *line, CARD32 offset)
}
CARD32
-fbFetch_x1r5g5b5 (FbBits *line, CARD32 offset)
+fbFetch_x1r5g5b5 (FbCompositeOperand *op)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD32 pixel = ((CARD16 *) line)[offset >> 4];
CARD32 r,g,b;
@@ -997,8 +1732,9 @@ fbFetch_x1r5g5b5 (FbBits *line, CARD32 offset)
}
CARD32
-fbFetch_a1b5g5r5 (FbBits *line, CARD32 offset)
+fbFetch_a1b5g5r5 (FbCompositeOperand *op)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD32 pixel = ((CARD16 *) line)[offset >> 4];
CARD32 a,r,g,b;
@@ -1010,8 +1746,9 @@ fbFetch_a1b5g5r5 (FbBits *line, CARD32 offset)
}
CARD32
-fbFetch_x1b5g5r5 (FbBits *line, CARD32 offset)
+fbFetch_x1b5g5r5 (FbCompositeOperand *op)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD32 pixel = ((CARD16 *) line)[offset >> 4];
CARD32 r,g,b;
@@ -1022,16 +1759,18 @@ fbFetch_x1b5g5r5 (FbBits *line, CARD32 offset)
}
CARD32
-fbFetch_a8 (FbBits *line, CARD32 offset)
+fbFetch_a8 (FbCompositeOperand *op)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD32 pixel = ((CARD8 *) line)[offset>>3];
return pixel << 24;
}
CARD32
-fbFetcha_a8 (FbBits *line, CARD32 offset)
+fbFetcha_a8 (FbCompositeOperand *op)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD32 pixel = ((CARD8 *) line)[offset>>3];
pixel |= pixel << 8;
@@ -1040,8 +1779,9 @@ fbFetcha_a8 (FbBits *line, CARD32 offset)
}
CARD32
-fbFetch_r3g3b2 (FbBits *line, CARD32 offset)
+fbFetch_r3g3b2 (FbCompositeOperand *op)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD32 pixel = ((CARD8 *) line)[offset>>3];
CARD32 r,g,b;
@@ -1055,8 +1795,9 @@ fbFetch_r3g3b2 (FbBits *line, CARD32 offset)
}
CARD32
-fbFetch_b2g3r3 (FbBits *line, CARD32 offset)
+fbFetch_b2g3r3 (FbCompositeOperand *op)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD32 pixel = ((CARD8 *) line)[offset>>3];
CARD32 r,g,b;
@@ -1072,8 +1813,9 @@ fbFetch_b2g3r3 (FbBits *line, CARD32 offset)
}
CARD32
-fbFetch_a2r2g2b2 (FbBits *line, CARD32 offset)
+fbFetch_a2r2g2b2 (FbCompositeOperand *op)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD32 pixel = ((CARD8 *) line)[offset>>3];
CARD32 a,r,g,b;
@@ -1085,8 +1827,9 @@ fbFetch_a2r2g2b2 (FbBits *line, CARD32 offset)
}
CARD32
-fbFetch_a2b2g2r2 (FbBits *line, CARD32 offset)
+fbFetch_a2b2g2r2 (FbCompositeOperand *op)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD32 pixel = ((CARD8 *) line)[offset>>3];
CARD32 a,r,g,b;
@@ -1097,6 +1840,15 @@ fbFetch_a2b2g2r2 (FbBits *line, CARD32 offset)
return a|r|g|b;
}
+CARD32
+fbFetch_c8 (FbCompositeOperand *op)
+{
+ FbBits *line = op->line; CARD32 offset = op->offset;
+ CARD32 pixel = ((CARD8 *) line)[offset>>3];
+
+ return op->indexed->rgba[pixel];
+}
+
#define Fetch8(l,o) (((CARD8 *) (l))[(o) >> 3])
#if IMAGE_BYTE_ORDER == MSBFirst
#define Fetch4(l,o) ((o) & 2 ? Fetch8(l,o) & 0xf : Fetch8(l,o) >> 4)
@@ -1105,8 +1857,9 @@ fbFetch_a2b2g2r2 (FbBits *line, CARD32 offset)
#endif
CARD32
-fbFetch_a4 (FbBits *line, CARD32 offset)
+fbFetch_a4 (FbCompositeOperand *op)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD32 pixel = Fetch4(line, offset);
pixel |= pixel << 4;
@@ -1114,8 +1867,9 @@ fbFetch_a4 (FbBits *line, CARD32 offset)
}
CARD32
-fbFetcha_a4 (FbBits *line, CARD32 offset)
+fbFetcha_a4 (FbCompositeOperand *op)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD32 pixel = Fetch4(line, offset);
pixel |= pixel << 4;
@@ -1125,8 +1879,9 @@ fbFetcha_a4 (FbBits *line, CARD32 offset)
}
CARD32
-fbFetch_r1g2b1 (FbBits *line, CARD32 offset)
+fbFetch_r1g2b1 (FbCompositeOperand *op)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD32 pixel = Fetch4(line, offset);
CARD32 r,g,b;
@@ -1137,8 +1892,9 @@ fbFetch_r1g2b1 (FbBits *line, CARD32 offset)
}
CARD32
-fbFetch_b1g2r1 (FbBits *line, CARD32 offset)
+fbFetch_b1g2r1 (FbCompositeOperand *op)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD32 pixel = Fetch4(line, offset);
CARD32 r,g,b;
@@ -1149,8 +1905,9 @@ fbFetch_b1g2r1 (FbBits *line, CARD32 offset)
}
CARD32
-fbFetch_a1r1g1b1 (FbBits *line, CARD32 offset)
+fbFetch_a1r1g1b1 (FbCompositeOperand *op)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD32 pixel = Fetch4(line, offset);
CARD32 a,r,g,b;
@@ -1162,8 +1919,9 @@ fbFetch_a1r1g1b1 (FbBits *line, CARD32 offset)
}
CARD32
-fbFetch_a1b1g1r1 (FbBits *line, CARD32 offset)
+fbFetch_a1b1g1r1 (FbCompositeOperand *op)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD32 pixel = Fetch4(line, offset);
CARD32 a,r,g,b;
@@ -1175,8 +1933,18 @@ fbFetch_a1b1g1r1 (FbBits *line, CARD32 offset)
}
CARD32
-fbFetcha_a1 (FbBits *line, CARD32 offset)
+fbFetch_c4 (FbCompositeOperand *op)
+{
+ FbBits *line = op->line; CARD32 offset = op->offset;
+ CARD32 pixel = Fetch4(line, offset);
+
+ return op->indexed->rgba[pixel];
+}
+
+CARD32
+fbFetcha_a1 (FbCompositeOperand *op)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD32 pixel = ((CARD32 *)line)[offset >> 5];
CARD32 a;
#if BITMAP_BIT_ORDER == MSBFirst
@@ -1194,8 +1962,9 @@ fbFetcha_a1 (FbBits *line, CARD32 offset)
}
CARD32
-fbFetch_a1 (FbBits *line, CARD32 offset)
+fbFetch_a1 (FbCompositeOperand *op)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD32 pixel = ((CARD32 *)line)[offset >> 5];
CARD32 a;
#if BITMAP_BIT_ORDER == MSBFirst
@@ -1210,6 +1979,21 @@ fbFetch_a1 (FbBits *line, CARD32 offset)
return a << 24;
}
+CARD32
+fbFetch_g1 (FbCompositeOperand *op)
+{
+ FbBits *line = op->line; CARD32 offset = op->offset;
+ CARD32 pixel = ((CARD32 *)line)[offset >> 5];
+ CARD32 a;
+#if BITMAP_BIT_ORDER == MSBFirst
+ a = pixel >> (0x1f - offset & 0x1f);
+#else
+ a = pixel >> (offset & 0x1f);
+#endif
+ a = a & 1;
+ return op->indexed->rgba[a];
+}
+
/*
* All the store functions
*/
@@ -1218,34 +2002,39 @@ fbFetch_a1 (FbBits *line, CARD32 offset)
#define Split(v) CARD32 r = ((v) >> 16) & 0xff, g = ((v) >> 8) & 0xff, b = (v) & 0xff
void
-fbStore_a8r8g8b8 (FbBits *line, CARD32 offset, CARD32 value)
+fbStore_a8r8g8b8 (FbCompositeOperand *op, CARD32 value)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
((CARD32 *)line)[offset >> 5] = value;
}
void
-fbStore_x8r8g8b8 (FbBits *line, CARD32 offset, CARD32 value)
+fbStore_x8r8g8b8 (FbCompositeOperand *op, CARD32 value)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
((CARD32 *)line)[offset >> 5] = value & 0xffffff;
}
void
-fbStore_a8b8g8r8 (FbBits *line, CARD32 offset, CARD32 value)
+fbStore_a8b8g8r8 (FbCompositeOperand *op, CARD32 value)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
Splita(value);
((CARD32 *)line)[offset >> 5] = a << 24 | b << 16 | g << 8 | r;
}
void
-fbStore_x8b8g8r8 (FbBits *line, CARD32 offset, CARD32 value)
+fbStore_x8b8g8r8 (FbCompositeOperand *op, CARD32 value)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
Split(value);
((CARD32 *)line)[offset >> 5] = b << 16 | g << 8 | r;
}
void
-fbStore_r8g8b8 (FbBits *line, CARD32 offset, CARD32 value)
+fbStore_r8g8b8 (FbCompositeOperand *op, CARD32 value)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD8 *pixel = ((CARD8 *) line) + (offset >> 3);
Split(value);
#if IMAGE_BYTE_ORDER == MSBFirst
@@ -1260,8 +2049,9 @@ fbStore_r8g8b8 (FbBits *line, CARD32 offset, CARD32 value)
}
void
-fbStore_b8g8r8 (FbBits *line, CARD32 offset, CARD32 value)
+fbStore_b8g8r8 (FbCompositeOperand *op, CARD32 value)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD8 *pixel = ((CARD8 *) line) + (offset >> 3);
Split(value);
#if IMAGE_BYTE_ORDER == MSBFirst
@@ -1276,8 +2066,9 @@ fbStore_b8g8r8 (FbBits *line, CARD32 offset, CARD32 value)
}
void
-fbStore_r5g6b5 (FbBits *line, CARD32 offset, CARD32 value)
+fbStore_r5g6b5 (FbCompositeOperand *op, CARD32 value)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD16 *pixel = ((CARD16 *) line) + (offset >> 4);
Split(value);
*pixel = (((r << 8) & 0xf800) |
@@ -1286,8 +2077,9 @@ fbStore_r5g6b5 (FbBits *line, CARD32 offset, CARD32 value)
}
void
-fbStore_b5g6r5 (FbBits *line, CARD32 offset, CARD32 value)
+fbStore_b5g6r5 (FbCompositeOperand *op, CARD32 value)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD16 *pixel = ((CARD16 *) line) + (offset >> 4);
Split(value);
*pixel = (((b << 8) & 0xf800) |
@@ -1296,8 +2088,9 @@ fbStore_b5g6r5 (FbBits *line, CARD32 offset, CARD32 value)
}
void
-fbStore_a1r5g5b5 (FbBits *line, CARD32 offset, CARD32 value)
+fbStore_a1r5g5b5 (FbCompositeOperand *op, CARD32 value)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD16 *pixel = ((CARD16 *) line) + (offset >> 4);
Splita(value);
*pixel = (((a << 8) & 0x8000) |
@@ -1307,8 +2100,9 @@ fbStore_a1r5g5b5 (FbBits *line, CARD32 offset, CARD32 value)
}
void
-fbStore_x1r5g5b5 (FbBits *line, CARD32 offset, CARD32 value)
+fbStore_x1r5g5b5 (FbCompositeOperand *op, CARD32 value)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD16 *pixel = ((CARD16 *) line) + (offset >> 4);
Split(value);
*pixel = (((r << 7) & 0x7c00) |
@@ -1317,8 +2111,9 @@ fbStore_x1r5g5b5 (FbBits *line, CARD32 offset, CARD32 value)
}
void
-fbStore_a1b5g5r5 (FbBits *line, CARD32 offset, CARD32 value)
+fbStore_a1b5g5r5 (FbCompositeOperand *op, CARD32 value)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD16 *pixel = ((CARD16 *) line) + (offset >> 4);
Splita(value);
*pixel = (((a << 8) & 0x8000) |
@@ -1328,8 +2123,9 @@ fbStore_a1b5g5r5 (FbBits *line, CARD32 offset, CARD32 value)
}
void
-fbStore_x1b5g5r5 (FbBits *line, CARD32 offset, CARD32 value)
+fbStore_x1b5g5r5 (FbCompositeOperand *op, CARD32 value)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD16 *pixel = ((CARD16 *) line) + (offset >> 4);
Split(value);
*pixel = (((b << 7) & 0x7c00) |
@@ -1338,15 +2134,17 @@ fbStore_x1b5g5r5 (FbBits *line, CARD32 offset, CARD32 value)
}
void
-fbStore_a8 (FbBits *line, CARD32 offset, CARD32 value)
+fbStore_a8 (FbCompositeOperand *op, CARD32 value)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD8 *pixel = ((CARD8 *) line) + (offset >> 3);
*pixel = value >> 24;
}
void
-fbStore_r3g3b2 (FbBits *line, CARD32 offset, CARD32 value)
+fbStore_r3g3b2 (FbCompositeOperand *op, CARD32 value)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD8 *pixel = ((CARD8 *) line) + (offset >> 3);
Split(value);
*pixel = (((r ) & 0xe0) |
@@ -1355,8 +2153,9 @@ fbStore_r3g3b2 (FbBits *line, CARD32 offset, CARD32 value)
}
void
-fbStore_b2g3r3 (FbBits *line, CARD32 offset, CARD32 value)
+fbStore_b2g3r3 (FbCompositeOperand *op, CARD32 value)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD8 *pixel = ((CARD8 *) line) + (offset >> 3);
Split(value);
*pixel = (((b ) & 0xe0) |
@@ -1365,8 +2164,9 @@ fbStore_b2g3r3 (FbBits *line, CARD32 offset, CARD32 value)
}
void
-fbStore_a2r2g2b2 (FbBits *line, CARD32 offset, CARD32 value)
+fbStore_a2r2g2b2 (FbCompositeOperand *op, CARD32 value)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD8 *pixel = ((CARD8 *) line) + (offset >> 3);
Splita(value);
*pixel = (((a ) & 0xc0) |
@@ -1375,26 +2175,44 @@ fbStore_a2r2g2b2 (FbBits *line, CARD32 offset, CARD32 value)
((b >> 6) ));
}
+void
+fbStore_c8 (FbCompositeOperand *op, CARD32 value)
+{
+ FbBits *line = op->line; CARD32 offset = op->offset;
+ CARD8 *pixel = ((CARD8 *) line) + (offset >> 3);
+ *pixel = miIndexToEnt24(op->indexed,value);
+}
+
+void
+fbStore_g8 (FbCompositeOperand *op, CARD32 value)
+{
+ FbBits *line = op->line; CARD32 offset = op->offset;
+ CARD8 *pixel = ((CARD8 *) line) + (offset >> 3);
+ *pixel = miIndexToEntY24(op->indexed,value);
+}
+
#define Store8(l,o,v) (((CARD8 *) l)[(o) >> 3] = (v))
#if IMAGE_BYTE_ORDER == MSBFirst
-#define Store4(l,o,v) Store8(l,o,((o) & 2 ? \
- Fetch8(l,o) & 0xf0 | (v) : \
- Fetch8(l,o) & 0x0f | ((v) << 4)))
+#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) & 2 ? \
- Fetch8(l,o) & 0x0f | ((v) << 4) : \
- Fetch8(l,o) & 0xf0 | (v)))
+#define Store4(l,o,v) Store8(l,o,((o) & 4 ? \
+ (Fetch8(l,o) & 0x0f) | ((v) << 4) : \
+ (Fetch8(l,o) & 0xf0) | (v)))
#endif
void
-fbStore_a4 (FbBits *line, CARD32 offset, CARD32 value)
+fbStore_a4 (FbCompositeOperand *op, CARD32 value)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
Store4(line,offset,value>>28);
}
void
-fbStore_r1g2b1 (FbBits *line, CARD32 offset, CARD32 value)
+fbStore_r1g2b1 (FbCompositeOperand *op, CARD32 value)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD32 pixel;
Split(value);
@@ -1405,8 +2223,9 @@ fbStore_r1g2b1 (FbBits *line, CARD32 offset, CARD32 value)
}
void
-fbStore_b1g2r1 (FbBits *line, CARD32 offset, CARD32 value)
+fbStore_b1g2r1 (FbCompositeOperand *op, CARD32 value)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD32 pixel;
Split(value);
@@ -1417,8 +2236,9 @@ fbStore_b1g2r1 (FbBits *line, CARD32 offset, CARD32 value)
}
void
-fbStore_a1r1g1b1 (FbBits *line, CARD32 offset, CARD32 value)
+fbStore_a1r1g1b1 (FbCompositeOperand *op, CARD32 value)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD32 pixel;
Splita(value);
pixel = (((a >> 4) & 0x8) |
@@ -1429,8 +2249,9 @@ fbStore_a1r1g1b1 (FbBits *line, CARD32 offset, CARD32 value)
}
void
-fbStore_a1b1g1r1 (FbBits *line, CARD32 offset, CARD32 value)
+fbStore_a1b1g1r1 (FbCompositeOperand *op, CARD32 value)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD32 pixel;
Splita(value);
pixel = (((a >> 4) & 0x8) |
@@ -1441,13 +2262,68 @@ fbStore_a1b1g1r1 (FbBits *line, CARD32 offset, CARD32 value)
}
void
-fbStore_a1 (FbBits *line, CARD32 offset, CARD32 value)
+fbStore_c4 (FbCompositeOperand *op, CARD32 value)
{
+ FbBits *line = op->line; CARD32 offset = op->offset;
+ CARD32 pixel;
+
+ pixel = miIndexToEnt24(op->indexed,value);
+ Store4(line,offset,pixel);
+}
+
+void
+fbStore_g4 (FbCompositeOperand *op, CARD32 value)
+{
+ FbBits *line = op->line; CARD32 offset = op->offset;
+ CARD32 pixel;
+
+ pixel = miIndexToEntY24(op->indexed,value);
+ Store4(line,offset,pixel);
+}
+
+void
+fbStore_a1 (FbCompositeOperand *op, CARD32 value)
+{
+ FbBits *line = op->line; CARD32 offset = op->offset;
CARD32 *pixel = ((CARD32 *) line) + (offset >> 5);
CARD32 mask = FbStipMask(offset & 0x1f, 1);
value = value & 0x80000000 ? mask : 0;
- *pixel = *pixel & ~mask | value;
+ *pixel = (*pixel & ~mask) | value;
+}
+
+void
+fbStore_g1 (FbCompositeOperand *op, CARD32 value)
+{
+ FbBits *line = op->line; CARD32 offset = op->offset;
+ CARD32 *pixel = ((CARD32 *) line) + (offset >> 5);
+ CARD32 mask = FbStipMask(offset & 0x1f, 1);
+
+ value = miIndexToEntY24(op->indexed,value) ? mask : 0;
+ *pixel = (*pixel & ~mask) | value;
+}
+
+CARD32
+fbFetch_external (FbCompositeOperand *op)
+{
+ CARD32 rgb = (*op[1].fetch) (&op[1]);
+ CARD32 a = (*op[2].fetch) (&op[2]);
+
+ return (rgb & 0xffffff) | (a & 0xff000000);
+}
+
+
+CARD32
+fbFetcha_external (FbCompositeOperand *op)
+{
+ return (*op[2].fetch) (&op[2]);
+}
+
+void
+fbStore_external (FbCompositeOperand *op, CARD32 value)
+{
+ (*op[1].store) (&op[1], value | 0xff000000);
+ (*op[2].store) (&op[2], value & 0xff000000);
}
FbAccessMap fbAccessMap[] = {
@@ -1475,6 +2351,8 @@ FbAccessMap fbAccessMap[] = {
PICT_r3g3b2, fbFetch_r3g3b2, fbFetch_r3g3b2, fbStore_r3g3b2,
PICT_b2g3r3, fbFetch_b2g3r3, fbFetch_b2g3r3, fbStore_b2g3r3,
PICT_a2r2g2b2, fbFetch_a2r2g2b2, fbFetch_a2r2g2b2, fbStore_a2r2g2b2,
+ PICT_c8, fbFetch_c8, fbFetch_c8, fbStore_c8,
+ PICT_g8, fbFetch_c8, fbFetch_c8, fbStore_g8,
/* 4bpp formats */
PICT_a4, fbFetch_a4, fbFetcha_a4, fbStore_a4,
@@ -1482,17 +2360,20 @@ FbAccessMap fbAccessMap[] = {
PICT_b1g2r1, fbFetch_b1g2r1, fbFetch_b1g2r1, fbStore_b1g2r1,
PICT_a1r1g1b1, fbFetch_a1r1g1b1, fbFetch_a1r1g1b1, fbStore_a1r1g1b1,
PICT_a1b1g1r1, fbFetch_a1b1g1r1, fbFetch_a1b1g1r1, fbStore_a1b1g1r1,
+ PICT_c4, fbFetch_c4, fbFetch_c4, fbStore_c4,
+ PICT_g4, fbFetch_c4, fbFetch_c4, fbStore_g4,
/* 1bpp formats */
PICT_a1, fbFetch_a1, fbFetcha_a1, fbStore_a1,
+ PICT_g1, fbFetch_g1, fbFetch_g1, fbStore_g1,
};
#define NumAccessMap (sizeof fbAccessMap / sizeof fbAccessMap[0])
Bool
-fbBuildCompositeOperand (PicturePtr pPict,
- FbCompositeOperand *op,
- INT16 x,
- INT16 y)
+fbBuildOneCompositeOperand (PicturePtr pPict,
+ FbCompositeOperand *op,
+ INT16 x,
+ INT16 y)
{
int i;
@@ -1502,20 +2383,49 @@ fbBuildCompositeOperand (PicturePtr pPict,
op->fetch = fbAccessMap[i].fetch;
op->fetcha = fbAccessMap[i].fetcha;
op->store = fbAccessMap[i].store;
- fbGetDrawable (pPict->pDrawable, op->line, op->stride, op->bpp);
+ op->indexed = (miIndexedPtr) pPict->pFormat->indexed;
+ fbGetDrawable (pPict->pDrawable, op->line, op->stride, op->bpp,
+ op->xoff, op->yoff);
if (pPict->repeat && pPict->pDrawable->width == 1 &&
pPict->pDrawable->height == 1)
{
op->bpp = 0;
op->stride = 0;
}
- op->line = op->line + y * op->stride;
+ op->line = op->line + (y + op->yoff) * op->stride;
op->offset = 0;
return TRUE;
}
return FALSE;
}
+Bool
+fbBuildCompositeOperand (PicturePtr pPict,
+ FbCompositeOperand op[3],
+ INT16 x,
+ INT16 y)
+{
+ if (pPict->alphaMap)
+ {
+ if (!fbBuildOneCompositeOperand (pPict, &op[1], x, y))
+ return FALSE;
+ if (!fbBuildOneCompositeOperand (pPict->alphaMap, &op[2],
+ x - pPict->alphaOrigin.x,
+ y - pPict->alphaOrigin.y))
+ return FALSE;
+ op[0].fetch = fbFetch_external;
+ op[0].fetcha = fbFetcha_external;
+ op[0].store = fbStore_external;
+ op[2].xoff -= pPict->alphaOrigin.x;
+ op[2].yoff -= pPict->alphaOrigin.y;
+ return TRUE;
+ }
+ else
+ {
+ return fbBuildOneCompositeOperand (pPict, &op[0], x, y);
+ }
+}
+
void
fbCompositeGeneral (CARD8 op,
PicturePtr pSrc,
@@ -1530,44 +2440,104 @@ fbCompositeGeneral (CARD8 op,
CARD16 width,
CARD16 height)
{
- FbCompositeOperand src,msk,dst,*pmsk;
+ FbCompositeOperand src[3],msk[3],dst[3],*pmsk;
+ FbCompositeOperand *srcPict, *srcAlpha;
+ FbCompositeOperand *dstPict, *dstAlpha;
+ FbCompositeOperand *mskPict, *mskAlpha;
FbCombineFunc f;
int w;
- if (!fbBuildCompositeOperand (pSrc, &src, xSrc, ySrc))
+ if (!fbBuildCompositeOperand (pSrc, src, xSrc, ySrc))
return;
- if (!fbBuildCompositeOperand (pDst, &dst, xDst, yDst))
+ if (!fbBuildCompositeOperand (pDst, dst, xDst, yDst))
return;
+ if (pSrc->alphaMap)
+ {
+ srcPict = &src[1];
+ srcAlpha = &src[2];
+ }
+ else
+ {
+ srcPict = &src[0];
+ srcAlpha = 0;
+ }
+ if (pDst->alphaMap)
+ {
+ dstPict = &dst[1];
+ dstAlpha = &dst[2];
+ }
+ else
+ {
+ dstPict = &dst[0];
+ dstAlpha = 0;
+ }
f = fbCombineFuncU[op];
if (pMask)
{
- if (!fbBuildCompositeOperand (pMask, &msk, xMask, yMask))
+ if (!fbBuildCompositeOperand (pMask, msk, xMask, yMask))
return;
- pmsk = &msk;
+ pmsk = msk;
if (pMask->componentAlpha)
f = fbCombineFuncC[op];
+ if (pMask->alphaMap)
+ {
+ mskPict = &msk[1];
+ mskAlpha = &msk[2];
+ }
+ else
+ {
+ mskPict = &msk[0];
+ mskAlpha = 0;
+ }
}
else
pmsk = 0;
while (height--)
{
w = width;
- src.offset = xSrc * src.bpp;
- dst.offset = xDst * dst.bpp;
+
+ srcPict->offset = (xSrc + srcPict->xoff) * srcPict->bpp;
+ if (srcAlpha)
+ srcAlpha->offset = (xSrc + srcAlpha->xoff) * srcAlpha->bpp;
+
+ dstPict->offset = (xDst + dstPict->xoff) * dstPict->bpp;
+ if (dstAlpha)
+ dstAlpha->offset = (xDst + dstAlpha->xoff) * dstAlpha->bpp;
+
if (pmsk)
- msk.offset = xMask * msk.bpp;
+ {
+ mskPict->offset = (xMask + mskPict->xoff) * mskPict->bpp;
+ if (mskAlpha)
+ mskAlpha->offset = (xMask + mskAlpha->xoff) * mskAlpha->bpp;
+ }
while (w--)
{
- (*f) (&src, pmsk, &dst);
- src.offset += src.bpp;
- dst.offset += dst.bpp;
+ (*f) (src, pmsk, dst);
+ srcPict->offset += srcPict->bpp;
+ if (srcAlpha)
+ srcAlpha->offset += srcAlpha->bpp;
+ dstPict->offset += dstPict->bpp;
+ if (dstAlpha)
+ dstAlpha->offset += dstAlpha->bpp;
if (pmsk)
- msk.offset += msk.bpp;
+ {
+ mskPict->offset += mskPict->bpp;
+ if (mskAlpha)
+ mskAlpha->offset += mskAlpha->bpp;
+ }
}
- src.line += src.stride;
- dst.line += dst.stride;
+ srcPict->line += srcPict->stride;
+ if (srcAlpha)
+ srcAlpha->line += srcAlpha->stride;
+
+ dstPict->line += dstPict->stride;
+ if (dstAlpha)
+ dstAlpha->line += dstAlpha->stride;
if (pmsk)
- msk.line += msk.stride;
+ {
+ mskPict->line += mskPict->stride;
+ if (mskAlpha)
+ mskAlpha->line += mskAlpha->stride;
+ }
}
-
}