Fix problems in render fb implementation found by rendercheck:

- fbCombineSaturate was pointed at fbCombineDisjointOver, instead of
    fbCombineDisjointOverReverse as it should. Instead, point
    fbCombineDisjointOverReverse at fbCombineSaturate (which is likely to
    be faster).
- fix previously-unused fbCombineSaturate implementation.
- fbCombineMaskAlphaC was just a copy of fbCombineMaskValueC. Make it do
    what it's supposed to (return a cs.alpha).
- fbCombineAtopC didn't invert the source alpha value.
- fix copy'n'paste errors in fbCombine(Dis/Con)jointGeneralC, also source
    alpha wasn't treated in a component fashion.
- fbCompositeSrc_8888* didn't handle when the source lacks an alpha
    channel. Rather than adding that and possilby slowing down the (normal)
    alpha case, don't let x8r8g8b8/x8b8g8r8 Pictures be used in
    fbCompositeSrc_8888* because Over with one of these is just Src.
This commit is contained in:
Eric Anholt 2004-05-12 01:49:46 +00:00
parent a43d5412b4
commit 4078457919
3 changed files with 65 additions and 84 deletions

View File

@ -1,5 +1,5 @@
/* /*
* $XdotOrg: xc/programs/Xserver/fb/fbcompose.c,v 1.18 2003/12/04 17:15:12 tsi Exp $ * $XdotOrg: xc/programs/Xserver/fb/fbcompose.c,v 1.2 2004/04/23 19:05:14 eich Exp $
* $XFree86: xc/programs/Xserver/fb/fbcompose.c,v 1.17tsi Exp $ * $XFree86: xc/programs/Xserver/fb/fbcompose.c,v 1.17tsi Exp $
* *
* Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc. * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
@ -191,15 +191,15 @@ fbCombineMaskAlphaC (FbCompositeOperand *src,
a = (*msk->fetcha) (msk); a = (*msk->fetcha) (msk);
if (!a) if (!a)
return 0; return 0;
x = (*src->fetcha) (src); x = (*src->fetch) (src) >> 24;
if (a == 0xffffffff) if (x == 0xff)
return x; return a;
m = FbInC(x,0,a,t); m = FbInU(a,0,x,t);
n = FbInC(x,8,a,t); n = FbInU(a,8,x,t);
o = FbInC(x,16,a,t); o = FbInU(a,16,x,t);
p = FbInC(x,24,a,t); p = FbInU(a,24,x,t);
return m|n|o|p; return m|n|o|p;
} }
@ -608,7 +608,7 @@ fbCombineAtopC (FbCompositeOperand *src,
cs = fbCombineMaskC (src, msk); cs = fbCombineMaskC (src, msk);
d = (*dst->fetch) (dst); d = (*dst->fetch) (dst);
s = cs.value; s = cs.value;
ad = cs.alpha; ad = ~cs.alpha;
as = d >> 24; as = d >> 24;
m = FbGen(s,d,0,as,FbGet8(ad,0),t,u,v); m = FbGen(s,d,0,as,FbGet8(ad,0),t,u,v);
n = FbGen(s,d,8,as,FbGet8(ad,8),t,u,v); n = FbGen(s,d,8,as,FbGet8(ad,8),t,u,v);
@ -698,10 +698,10 @@ fbCombineXorC (FbCompositeOperand *src,
s = cs.value; s = cs.value;
ad = ~cs.alpha; ad = ~cs.alpha;
as = ~d >> 24; as = ~d >> 24;
m = FbGen(s,d,0,as,ad,t,u,v); m = FbGen(s,d,0,as,FbGet8(ad,0),t,u,v);
n = FbGen(s,d,8,as,ad,t,u,v); n = FbGen(s,d,8,as,FbGet8(ad,8),t,u,v);
o = FbGen(s,d,16,as,ad,t,u,v); o = FbGen(s,d,16,as,FbGet8(ad,16),t,u,v);
p = FbGen(s,d,24,as,ad,t,u,v); p = FbGen(s,d,24,as,FbGet8(ad,24),t,u,v);
(*dst->store) (dst, m|n|o|p); (*dst->store) (dst, m|n|o|p);
} }
@ -763,10 +763,9 @@ fbCombineSaturateU (FbCompositeOperand *src,
FbCompositeOperand *dst) FbCompositeOperand *dst)
{ {
CARD32 s = fbCombineMaskU (src, msk), d; CARD32 s = fbCombineMaskU (src, msk), d;
#if 0
CARD16 sa, da; CARD16 sa, da;
CARD16 ad, as; CARD16 ad, as;
CARD16 t; CARD16 t, u, v;
CARD32 m,n,o,p; CARD32 m,n,o,p;
d = (*dst->fetch) (dst); d = (*dst->fetch) (dst);
@ -789,16 +788,6 @@ fbCombineSaturateU (FbCompositeOperand *src,
p = FbGen(s,d,24,as,ad,t,u,v); p = FbGen(s,d,24,as,ad,t,u,v);
} }
(*dst->store) (dst, m|n|o|p); (*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);
}
#endif
} }
void void
@ -831,7 +820,7 @@ fbCombineSaturateC (FbCompositeOperand *src,
else else
n = FbGen (s, d, 8, (da << 8) / sg, 0xff, t, u, v); n = FbGen (s, d, 8, (da << 8) / sg, 0xff, t, u, v);
if (sr < da) if (sr <= da)
o = FbAdd(s,d,16,t); o = FbAdd(s,d,16,t);
else else
o = FbGen (s, d, 16, (da << 8) / sr, 0xff, t, u, v); o = FbGen (s, d, 16, (da << 8) / sr, 0xff, t, u, v);
@ -972,8 +961,8 @@ fbCombineDisjointGeneralC (FbCompositeOperand *src,
FbCompSrc cs; FbCompSrc cs;
CARD32 s, d; CARD32 s, d;
CARD32 m,n,o,p; CARD32 m,n,o,p;
CARD32 Fa; CARD32 Fa, Fb;
CARD16 Fb, t, u, v; CARD16 t, u, v;
CARD32 sa; CARD32 sa;
CARD8 da; CARD8 da;
@ -996,10 +985,10 @@ fbCombineDisjointGeneralC (FbCompositeOperand *src,
Fa = m|n|o|p; Fa = m|n|o|p;
break; break;
case CombineAIn: case CombineAIn:
m = fbCombineDisjointOutPart ((CARD8) (sa >> 0), da); m = fbCombineDisjointInPart ((CARD8) (sa >> 0), da);
n = fbCombineDisjointOutPart ((CARD8) (sa >> 8), da) << 8; n = fbCombineDisjointInPart ((CARD8) (sa >> 8), da) << 8;
o = fbCombineDisjointOutPart ((CARD8) (sa >> 16), da) << 16; o = fbCombineDisjointInPart ((CARD8) (sa >> 16), da) << 16;
p = fbCombineDisjointOutPart ((CARD8) (sa >> 24), da) << 24; p = fbCombineDisjointInPart ((CARD8) (sa >> 24), da) << 24;
Fa = m|n|o|p; Fa = m|n|o|p;
break; break;
case CombineA: case CombineA:
@ -1012,19 +1001,27 @@ fbCombineDisjointGeneralC (FbCompositeOperand *src,
Fb = 0; Fb = 0;
break; break;
case CombineBOut: case CombineBOut:
Fb = fbCombineDisjointOutPart (da, sa); m = fbCombineDisjointOutPart (da, (CARD8) (sa >> 0));
n = fbCombineDisjointOutPart (da, (CARD8) (sa >> 8)) << 8;
o = fbCombineDisjointOutPart (da, (CARD8) (sa >> 16)) << 16;
p = fbCombineDisjointOutPart (da, (CARD8) (sa >> 24)) << 24;
Fb = m|n|o|p;
break; break;
case CombineBIn: case CombineBIn:
Fb = fbCombineDisjointInPart (da, sa); m = fbCombineDisjointInPart (da, (CARD8) (sa >> 0));
n = fbCombineDisjointInPart (da, (CARD8) (sa >> 8)) << 8;
o = fbCombineDisjointInPart (da, (CARD8) (sa >> 16)) << 16;
p = fbCombineDisjointInPart (da, (CARD8) (sa >> 24)) << 24;
Fb = m|n|o|p;
break; break;
case CombineB: case CombineB:
Fb = 0xff; Fb = 0xffffffff;
break; break;
} }
m = FbGen (s,d,0,FbGet8(Fa,0),Fb,t,u,v); m = FbGen (s,d,0,FbGet8(Fa,0),FbGet8(Fb,0),t,u,v);
n = FbGen (s,d,8,FbGet8(Fa,8),Fb,t,u,v); n = FbGen (s,d,8,FbGet8(Fa,8),FbGet8(Fb,8),t,u,v);
o = FbGen (s,d,16,FbGet8(Fa,16),Fb,t,u,v); o = FbGen (s,d,16,FbGet8(Fa,16),FbGet8(Fb,16),t,u,v);
p = FbGen (s,d,24,FbGet8(Fa,24),Fb,t,u,v); p = FbGen (s,d,24,FbGet8(Fa,24),FbGet8(Fb,24),t,u,v);
s = m|n|o|p; s = m|n|o|p;
(*dst->store) (dst, s); (*dst->store) (dst, s);
} }
@ -1065,21 +1062,6 @@ fbCombineDisjointOverC (FbCompositeOperand *src,
fbCombineDisjointGeneralC (src, msk, dst, CombineAOver); 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 void
fbCombineDisjointInU (FbCompositeOperand *src, fbCombineDisjointInU (FbCompositeOperand *src,
@ -1281,8 +1263,8 @@ fbCombineConjointGeneralC (FbCompositeOperand *src,
FbCompSrc cs; FbCompSrc cs;
CARD32 s, d; CARD32 s, d;
CARD32 m,n,o,p; CARD32 m,n,o,p;
CARD32 Fa; CARD32 Fa, Fb;
CARD16 Fb, t, u, v; CARD16 t, u, v;
CARD32 sa; CARD32 sa;
CARD8 da; CARD8 da;
@ -1305,10 +1287,10 @@ fbCombineConjointGeneralC (FbCompositeOperand *src,
Fa = m|n|o|p; Fa = m|n|o|p;
break; break;
case CombineAIn: case CombineAIn:
m = fbCombineConjointOutPart ((CARD8) (sa >> 0), da); m = fbCombineConjointInPart ((CARD8) (sa >> 0), da);
n = fbCombineConjointOutPart ((CARD8) (sa >> 8), da) << 8; n = fbCombineConjointInPart ((CARD8) (sa >> 8), da) << 8;
o = fbCombineConjointOutPart ((CARD8) (sa >> 16), da) << 16; o = fbCombineConjointInPart ((CARD8) (sa >> 16), da) << 16;
p = fbCombineConjointOutPart ((CARD8) (sa >> 24), da) << 24; p = fbCombineConjointInPart ((CARD8) (sa >> 24), da) << 24;
Fa = m|n|o|p; Fa = m|n|o|p;
break; break;
case CombineA: case CombineA:
@ -1321,19 +1303,27 @@ fbCombineConjointGeneralC (FbCompositeOperand *src,
Fb = 0; Fb = 0;
break; break;
case CombineBOut: case CombineBOut:
Fb = fbCombineConjointOutPart (da, sa); m = fbCombineConjointOutPart (da, (CARD8) (sa >> 0));
n = fbCombineConjointOutPart (da, (CARD8) (sa >> 8)) << 8;
o = fbCombineConjointOutPart (da, (CARD8) (sa >> 16)) << 16;
p = fbCombineConjointOutPart (da, (CARD8) (sa >> 24)) << 24;
Fb = m|n|o|p;
break; break;
case CombineBIn: case CombineBIn:
Fb = fbCombineConjointInPart (da, sa); m = fbCombineConjointInPart (da, (CARD8) (sa >> 0));
n = fbCombineConjointInPart (da, (CARD8) (sa >> 8)) << 8;
o = fbCombineConjointInPart (da, (CARD8) (sa >> 16)) << 16;
p = fbCombineConjointInPart (da, (CARD8) (sa >> 24)) << 24;
Fb = m|n|o|p;
break; break;
case CombineB: case CombineB:
Fb = 0xff; Fb = 0xffffffff;
break; break;
} }
m = FbGen (s,d,0,FbGet8(Fa,0),Fb,t,u,v); m = FbGen (s,d,0,FbGet8(Fa,0),FbGet8(Fb,0),t,u,v);
n = FbGen (s,d,8,FbGet8(Fa,8),Fb,t,u,v); n = FbGen (s,d,8,FbGet8(Fa,8),FbGet8(Fb,8),t,u,v);
o = FbGen (s,d,16,FbGet8(Fa,16),Fb,t,u,v); o = FbGen (s,d,16,FbGet8(Fa,16),FbGet8(Fb,16),t,u,v);
p = FbGen (s,d,24,FbGet8(Fa,24),Fb,t,u,v); p = FbGen (s,d,24,FbGet8(Fa,24),FbGet8(Fb,24),t,u,v);
s = m|n|o|p; s = m|n|o|p;
(*dst->store) (dst, s); (*dst->store) (dst, s);
} }
@ -1519,14 +1509,14 @@ FbCombineFunc fbCombineFuncU[] = {
fbCombineAtopReverseU, fbCombineAtopReverseU,
fbCombineXorU, fbCombineXorU,
fbCombineAddU, fbCombineAddU,
fbCombineDisjointOverU, /* Saturate */ fbCombineSaturateU,
0, 0,
0, 0,
fbCombineClear, fbCombineClear,
fbCombineSrcU, fbCombineSrcU,
fbCombineDst, fbCombineDst,
fbCombineDisjointOverU, fbCombineDisjointOverU,
fbCombineDisjointOverReverseU, fbCombineSaturateU, /* DisjointOverReverse */
fbCombineDisjointInU, fbCombineDisjointInU,
fbCombineDisjointInReverseU, fbCombineDisjointInReverseU,
fbCombineDisjointOutU, fbCombineDisjointOutU,
@ -1566,14 +1556,14 @@ FbCombineFunc fbCombineFuncC[] = {
fbCombineAtopReverseC, fbCombineAtopReverseC,
fbCombineXorC, fbCombineXorC,
fbCombineAddC, fbCombineAddC,
fbCombineDisjointOverC, /* Saturate */ fbCombineSaturateC,
0, 0,
0, 0,
fbCombineClear, /* 0x10 */ fbCombineClear, /* 0x10 */
fbCombineSrcC, fbCombineSrcC,
fbCombineDst, fbCombineDst,
fbCombineDisjointOverC, fbCombineDisjointOverC,
fbCombineDisjointOverReverseC, fbCombineSaturateC, /* DisjointOverReverse */
fbCombineDisjointInC, fbCombineDisjointInC,
fbCombineDisjointInReverseC, fbCombineDisjointInReverseC,
fbCombineDisjointOutC, fbCombineDisjointOutC,

View File

@ -1001,7 +1001,6 @@ fbComposite (CARD8 op,
{ {
switch (pSrc->format) { switch (pSrc->format) {
case PICT_a8r8g8b8: case PICT_a8r8g8b8:
case PICT_x8r8g8b8:
switch (pDst->format) { switch (pDst->format) {
case PICT_a8r8g8b8: case PICT_a8r8g8b8:
case PICT_x8r8g8b8: case PICT_x8r8g8b8:
@ -1016,7 +1015,6 @@ fbComposite (CARD8 op,
} }
break; break;
case PICT_a8b8g8r8: case PICT_a8b8g8r8:
case PICT_x8b8g8r8:
switch (pDst->format) { switch (pDst->format) {
case PICT_a8b8g8r8: case PICT_a8b8g8r8:
case PICT_x8b8g8r8: case PICT_x8b8g8r8:

View File

@ -333,15 +333,8 @@ fbCombineDisjointOverC (FbCompositeOperand *src,
FbCompositeOperand *msk, FbCompositeOperand *msk,
FbCompositeOperand *dst); FbCompositeOperand *dst);
void #define fbCombineDisjointOverReverseU fbCombineSaturateU
fbCombineDisjointOverReverseU (FbCompositeOperand *src, #define fbCombineDisjointOverReverseC fbCombineSaturateC
FbCompositeOperand *msk,
FbCompositeOperand *dst);
void
fbCombineDisjointOverReverseC (FbCompositeOperand *src,
FbCompositeOperand *msk,
FbCompositeOperand *dst);
void void
fbCombineDisjointInU (FbCompositeOperand *src, fbCombineDisjointInU (FbCompositeOperand *src,