summaryrefslogtreecommitdiff
path: root/fb
diff options
context:
space:
mode:
Diffstat (limited to 'fb')
-rw-r--r--fb/fbcompose.c2
-rw-r--r--fb/fbpict.c66
-rw-r--r--fb/fbpict.h3
3 files changed, 56 insertions, 15 deletions
diff --git a/fb/fbcompose.c b/fb/fbcompose.c
index 24b552e0b..6e4989375 100644
--- a/fb/fbcompose.c
+++ b/fb/fbcompose.c
@@ -4027,7 +4027,7 @@ static void fbStoreExternalAlpha(PicturePtr pict, int x, int y, int width, CARD3
typedef void (*scanStoreProc)(PicturePtr , int , int , int , CARD32 *);
typedef void (*scanFetchProc)(PicturePtr , int , int , int , CARD32 * , CARD32 *, CARD32);
-static void
+void
fbCompositeRect (const FbComposeData *data, CARD32 *scanline_buffer)
{
CARD32 *src_buffer = scanline_buffer;
diff --git a/fb/fbpict.c b/fb/fbpict.c
index a7359673d..819d21adc 100644
--- a/fb/fbpict.c
+++ b/fb/fbpict.c
@@ -1018,14 +1018,6 @@ fbCompositeSolidMask_nx1xn (CARD8 op,
FbBits src;
fbComposeGetSolid(pSrc, src, pDst->format);
-
- if ((src & 0xff000000) != 0xff000000)
- {
- fbCompositeGeneral (op, pSrc, pMask, pDst,
- xSrc, ySrc, xMask, yMask, xDst, yDst,
- width, height);
- return;
- }
fbGetStipDrawable (pMask->pDrawable, maskBits, maskStride, maskBpp, maskXoff, maskYoff);
fbGetDrawable (pDst->pDrawable, dstBits, dstStride, dstBpp, dstXoff, dstYoff);
@@ -1443,6 +1435,48 @@ fbCompositeSolidSrc_nxn (CARD8 op,
}
*/
+#define SCANLINE_BUFFER_LENGTH 2048
+
+static void
+fbCompositeRectWrapper (CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pMask,
+ PicturePtr pDst,
+ INT16 xSrc,
+ INT16 ySrc,
+ INT16 xMask,
+ INT16 yMask,
+ INT16 xDst,
+ INT16 yDst,
+ CARD16 width,
+ CARD16 height)
+{
+ CARD32 _scanline_buffer[SCANLINE_BUFFER_LENGTH * 3];
+ CARD32 *scanline_buffer = _scanline_buffer;
+ FbComposeData data;
+
+ data.op = op;
+ data.src = pSrc;
+ data.mask = pMask;
+ data.dest = pDst;
+ data.xSrc = xSrc;
+ data.ySrc = ySrc;
+ data.xMask = xMask;
+ data.yMask = yMask;
+ data.xDest = xDst;
+ data.yDest = yDst;
+ data.width = width;
+ data.height = height;
+
+ if (width > SCANLINE_BUFFER_LENGTH)
+ scanline_buffer = (CARD32 *) malloc(width * 3 * sizeof(CARD32));
+
+ fbCompositeRect (&data, scanline_buffer);
+
+ if (scanline_buffer != _scanline_buffer)
+ free(scanline_buffer);
+}
+
void
fbComposite (CARD8 op,
PicturePtr pSrc,
@@ -1632,8 +1666,14 @@ fbComposite (CARD8 op,
case PICT_x8r8g8b8:
case PICT_a8b8g8r8:
case PICT_x8b8g8r8:
- func = fbCompositeSolidMask_nx1xn;
+ {
+ FbBits src;
+
+ fbComposeGetSolid(pSrc, src, pDst->format);
+ if ((src & 0xff000000) == 0xff000000)
+ func = fbCompositeSolidMask_nx1xn;
break;
+ }
default:
break;
}
@@ -1642,7 +1682,7 @@ fbComposite (CARD8 op,
break;
}
}
- if (func != fbCompositeGeneral)
+ if (func)
srcRepeat = FALSE;
}
else if (!srcRepeat) /* has mask and non-repeating source */
@@ -1755,7 +1795,7 @@ fbComposite (CARD8 op,
break;
}
- if (func != fbCompositeGeneral)
+ if (func)
maskRepeat = FALSE;
}
}
@@ -2043,9 +2083,7 @@ fbComposite (CARD8 op,
}
if (!func) {
- /* no fast path, use the general code */
- fbCompositeGeneral(op, pSrc, pMask, pDst, xSrc, ySrc, xMask, yMask, xDst, yDst, width, height);
- return;
+ func = fbCompositeRectWrapper;
}
/* if we are transforming, we handle repeats in fbFetchTransformed */
diff --git a/fb/fbpict.h b/fb/fbpict.h
index 5246cd5ac..86f271e7f 100644
--- a/fb/fbpict.h
+++ b/fb/fbpict.h
@@ -383,6 +383,9 @@ typedef struct _FbComposeData {
CARD16 height;
} FbComposeData;
+void
+fbCompositeRect (const FbComposeData *data, CARD32 *scanline_buffer);
+
typedef FASTCALL void (*CombineMaskU) (CARD32 *src, const CARD32 *mask, int width);
typedef FASTCALL void (*CombineFuncU) (CARD32 *dest, const CARD32 *src, int width);
typedef FASTCALL void (*CombineFuncC) (CARD32 *dest, CARD32 *src, CARD32 *mask, int width);