Add functions fbCompositeSrcSrc_nxn() and fbCompositeTrans_0565xnx0565
from xserver via pixman. Add READ/WRITE and fbFinishAccess as appropriate.
This commit is contained in:
parent
09436fb7c3
commit
077a5d4555
181
fb/fbpict.c
181
fb/fbpict.c
|
@ -64,6 +64,20 @@ fbOver (CARD32 x, CARD32 y)
|
||||||
return m|n|o|p;
|
return m|n|o|p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static CARD32
|
||||||
|
fbIn24 (CARD32 x, CARD8 y)
|
||||||
|
{
|
||||||
|
CARD16 a = y;
|
||||||
|
CARD16 t;
|
||||||
|
CARD32 m,n,o,p;
|
||||||
|
|
||||||
|
m = FbInU(x,0,a,t);
|
||||||
|
n = FbInU(x,8,a,t);
|
||||||
|
o = FbInU(x,16,a,t);
|
||||||
|
p = (y << 24);
|
||||||
|
return m|n|o|p;
|
||||||
|
}
|
||||||
|
|
||||||
CARD32
|
CARD32
|
||||||
fbOver24 (CARD32 x, CARD32 y)
|
fbOver24 (CARD32 x, CARD32 y)
|
||||||
{
|
{
|
||||||
|
@ -864,6 +878,148 @@ fbCompositeSolidMask_nx1xn (CARD8 op,
|
||||||
|
|
||||||
# define mod(a,b) ((b) == 1 ? 0 : (a) >= 0 ? (a) % (b) : (b) - (-a) % (b))
|
# define mod(a,b) ((b) == 1 ? 0 : (a) >= 0 ? (a) % (b) : (b) - (-a) % (b))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Apply a constant alpha value in an over computation
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void
|
||||||
|
fbCompositeTrans_0565xnx0565(CARD8 op,
|
||||||
|
PicturePtr pSrc,
|
||||||
|
PicturePtr pMask,
|
||||||
|
PicturePtr pDst,
|
||||||
|
INT16 xSrc,
|
||||||
|
INT16 ySrc,
|
||||||
|
INT16 xMask,
|
||||||
|
INT16 yMask,
|
||||||
|
INT16 xDst,
|
||||||
|
INT16 yDst,
|
||||||
|
CARD16 width,
|
||||||
|
CARD16 height)
|
||||||
|
{
|
||||||
|
CARD16 *dstLine, *dst;
|
||||||
|
CARD16 *srcLine, *src;
|
||||||
|
FbStride dstStride, srcStride;
|
||||||
|
CARD16 w;
|
||||||
|
FbBits mask;
|
||||||
|
CARD8 maskAlpha;
|
||||||
|
CARD16 s_16, d_16, r_16;
|
||||||
|
CARD32 s_32, d_32, i_32, r_32;
|
||||||
|
|
||||||
|
fbComposeGetSolid (pMask, mask, pDst->format);
|
||||||
|
maskAlpha = mask >> 24;
|
||||||
|
|
||||||
|
if (!maskAlpha)
|
||||||
|
return;
|
||||||
|
if (maskAlpha == 0xff)
|
||||||
|
{
|
||||||
|
fbCompositeSrc_0565x0565 (op, pSrc, pMask, pDst,
|
||||||
|
xSrc, ySrc, xMask, yMask, xDst, yDst,
|
||||||
|
width, height);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
fbComposeGetStart (pSrc, xSrc, ySrc, CARD16, srcStride, srcLine, 1);
|
||||||
|
fbComposeGetStart (pDst, xDst, yDst, CARD16, dstStride, dstLine, 1);
|
||||||
|
|
||||||
|
while (height--)
|
||||||
|
{
|
||||||
|
dst = dstLine;
|
||||||
|
dstLine += dstStride;
|
||||||
|
src = srcLine;
|
||||||
|
srcLine += srcStride;
|
||||||
|
w = width;
|
||||||
|
|
||||||
|
while (w--)
|
||||||
|
{
|
||||||
|
s_16 = READ(src++);
|
||||||
|
s_32 = cvt0565to8888(s_16);
|
||||||
|
d_16 = READ(dst);
|
||||||
|
d_32 = cvt0565to8888(d_16);
|
||||||
|
|
||||||
|
i_32 = fbIn24 (s_32, maskAlpha);
|
||||||
|
r_32 = fbOver24 (i_32, d_32);
|
||||||
|
r_16 = cvt8888to0565(r_32);
|
||||||
|
WRITE(dst++, r_16);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fbFinishAccess (pSrc->pDrawable);
|
||||||
|
fbFinishAccess (pDst->pDrawable);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Simple bitblt
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void
|
||||||
|
fbCompositeSrcSrc_nxn (CARD8 op,
|
||||||
|
PicturePtr pSrc,
|
||||||
|
PicturePtr pMask,
|
||||||
|
PicturePtr pDst,
|
||||||
|
INT16 xSrc,
|
||||||
|
INT16 ySrc,
|
||||||
|
INT16 xMask,
|
||||||
|
INT16 yMask,
|
||||||
|
INT16 xDst,
|
||||||
|
INT16 yDst,
|
||||||
|
CARD16 width,
|
||||||
|
CARD16 height)
|
||||||
|
{
|
||||||
|
FbBits *dst;
|
||||||
|
FbBits *src;
|
||||||
|
FbStride dstStride, srcStride;
|
||||||
|
int srcXoff, srcYoff;
|
||||||
|
int dstXoff, dstYoff;
|
||||||
|
int srcBpp;
|
||||||
|
int dstBpp;
|
||||||
|
Bool reverse = FALSE;
|
||||||
|
Bool upsidedown = FALSE;
|
||||||
|
|
||||||
|
fbGetDrawable(pSrc->pDrawable,src,srcStride,srcBpp,srcXoff,srcYoff);
|
||||||
|
fbGetDrawable(pDst->pDrawable,dst,dstStride,dstBpp,dstXoff,dstYoff);
|
||||||
|
|
||||||
|
fbBlt (src + (ySrc + srcYoff) * srcStride,
|
||||||
|
srcStride,
|
||||||
|
(xSrc + srcXoff) * srcBpp,
|
||||||
|
|
||||||
|
dst + (yDst + dstYoff) * dstStride,
|
||||||
|
dstStride,
|
||||||
|
(xDst + dstXoff) * dstBpp,
|
||||||
|
|
||||||
|
(width) * dstBpp,
|
||||||
|
(height),
|
||||||
|
|
||||||
|
GXcopy,
|
||||||
|
FB_ALLONES,
|
||||||
|
dstBpp,
|
||||||
|
|
||||||
|
reverse,
|
||||||
|
upsidedown);
|
||||||
|
|
||||||
|
fbFinishAccess(pSrc->pDrawable);
|
||||||
|
fbFinishAccess(pDst->pDrawable);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Solid fill
|
||||||
|
void
|
||||||
|
fbCompositeSolidSrc_nxn (CARD8 op,
|
||||||
|
PicturePtr pSrc,
|
||||||
|
PicturePtr pMask,
|
||||||
|
PicturePtr pDst,
|
||||||
|
INT16 xSrc,
|
||||||
|
INT16 ySrc,
|
||||||
|
INT16 xMask,
|
||||||
|
INT16 yMask,
|
||||||
|
INT16 xDst,
|
||||||
|
INT16 yDst,
|
||||||
|
CARD16 width,
|
||||||
|
CARD16 height)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
void
|
void
|
||||||
fbComposite (CARD8 op,
|
fbComposite (CARD8 op,
|
||||||
PicturePtr pSrc,
|
PicturePtr pSrc,
|
||||||
|
@ -925,7 +1081,13 @@ fbComposite (CARD8 op,
|
||||||
{
|
{
|
||||||
func = fbCompositeCopyAreammx;
|
func = fbCompositeCopyAreammx;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
#endif
|
#endif
|
||||||
|
if (pMask == 0)
|
||||||
|
{
|
||||||
|
if (pSrc->format_code == pDst->format_code)
|
||||||
|
func = fbCompositeSrcSrc_nxn;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case PictOpOver:
|
case PictOpOver:
|
||||||
if (pMask)
|
if (pMask)
|
||||||
|
@ -933,7 +1095,6 @@ fbComposite (CARD8 op,
|
||||||
if (fbCanGetSolid(pSrc) &&
|
if (fbCanGetSolid(pSrc) &&
|
||||||
!maskRepeat)
|
!maskRepeat)
|
||||||
{
|
{
|
||||||
srcRepeat = FALSE;
|
|
||||||
if (PICT_FORMAT_COLOR(pSrc->format)) {
|
if (PICT_FORMAT_COLOR(pSrc->format)) {
|
||||||
switch (pMask->format) {
|
switch (pMask->format) {
|
||||||
case PICT_a8:
|
case PICT_a8:
|
||||||
|
@ -1120,6 +1281,24 @@ fbComposite (CARD8 op,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (func != fbCompositeGeneral)
|
||||||
|
srcRepeat = FALSE;
|
||||||
|
}
|
||||||
|
else if (maskRepeat &&
|
||||||
|
pMask->pDrawable->width == 1 &&
|
||||||
|
pMask->pDrawable->height == 1)
|
||||||
|
{
|
||||||
|
switch (pSrc->format) {
|
||||||
|
case PICT_r5g6b5:
|
||||||
|
case PICT_b5g6r5:
|
||||||
|
if (pDst->format == pSrc->format)
|
||||||
|
func = fbCompositeTrans_0565xnx0565;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (func != fbCompositeGeneral)
|
||||||
|
maskRepeat = FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else /* no mask */
|
else /* no mask */
|
||||||
|
|
|
@ -123,6 +123,14 @@ fbCanGetSolid(PicturePtr pict)
|
||||||
(bits) = READ((CARD16 *) __bits__); \
|
(bits) = READ((CARD16 *) __bits__); \
|
||||||
(bits) = cvt0565to8888(bits); \
|
(bits) = cvt0565to8888(bits); \
|
||||||
break; \
|
break; \
|
||||||
|
case 8: \
|
||||||
|
(bits) = READ((CARD8 *) __bits__); \
|
||||||
|
(bits) = (bits) << 24; \
|
||||||
|
break; \
|
||||||
|
case 1: \
|
||||||
|
(bits) = READ((CARD32 *) __bits__); \
|
||||||
|
(bits) = FbLeftStipBits((bits),1) ? 0xff000000 : 0x00000000;\
|
||||||
|
break; \
|
||||||
default: \
|
default: \
|
||||||
return; \
|
return; \
|
||||||
} \
|
} \
|
||||||
|
|
Loading…
Reference in New Issue