Move miTriangles to fb as fbTriangles()

The fb version simply calls the new pixman_composite_triangles(). This
allows us to get rid of miCreateAlphaPicture().

Reviewed-by: Adam Jackson <ajax@redhat.com>
Signed-off-by: Søren Sandmann <ssp@redhat.com>
This commit is contained in:
Søren Sandmann Pedersen 2011-01-11 10:33:57 -05:00 committed by Søren Sandmann Pedersen
parent 788ccb9a8b
commit 566f1931ee
7 changed files with 90 additions and 157 deletions

View File

@ -367,6 +367,7 @@ fbPictureInit (ScreenPtr pScreen, PictFormatPtr formats, int nformats)
ps->Trapezoids = fbTrapezoids;
ps->AddTraps = fbAddTraps;
ps->AddTriangles = fbAddTriangles;
ps->Triangles = fbTriangles;
return TRUE;
}

View File

@ -75,4 +75,14 @@ fbTrapezoids (CARD8 op,
int ntrap,
xTrapezoid *traps);
extern _X_EXPORT void
fbTriangles (CARD8 op,
PicturePtr pSrc,
PicturePtr pDst,
PictFormatPtr maskFormat,
INT16 xSrc,
INT16 ySrc,
int ntris,
xTriangle *tris);
#endif /* _FBPICT_H_ */

View File

@ -157,51 +157,56 @@ fbAddTriangles (PicturePtr pPicture,
}
}
typedef void (* CompositeShapesFunc) (pixman_op_t op,
pixman_image_t *src,
pixman_image_t *dst,
pixman_format_code_t mask_format,
int x_src, int y_src,
int x_dst, int y_dst,
int n_shapes, const uint8_t *shapes);
void
fbTrapezoids (CARD8 op,
PicturePtr pSrc,
PicturePtr pDst,
PictFormatPtr maskFormat,
INT16 xSrc,
INT16 ySrc,
int ntrap,
xTrapezoid *traps)
static void
fbShapes (CompositeShapesFunc composite,
pixman_op_t op,
PicturePtr pSrc,
PicturePtr pDst,
PictFormatPtr maskFormat,
int16_t xSrc,
int16_t ySrc,
int16_t xDst,
int16_t yDst,
int nshapes,
int shape_size,
const uint8_t * shapes)
{
pixman_image_t *src, *dst;
int src_xoff, src_yoff;
int dst_xoff, dst_yoff;
if (ntrap == 0)
return;
src = image_from_pict (pSrc, FALSE, &src_xoff, &src_yoff);
dst = image_from_pict (pDst, TRUE, &dst_xoff, &dst_yoff);
if (src && dst)
{
pixman_format_code_t format;
int x_dst, y_dst;
int i;
x_dst = traps[0].left.p1.x >> 16;
y_dst = traps[0].left.p1.y >> 16;
if (!maskFormat)
{
int i;
if (pDst->polyEdge == PolyEdgeSharp)
format = PIXMAN_a1;
else
format = PIXMAN_a8;
for (i = 0; i < ntrap; ++i)
for (i = 0; i < nshapes; ++i)
{
pixman_composite_trapezoids (op, src, dst, format,
xSrc + src_xoff,
ySrc + src_yoff,
x_dst + dst_xoff,
y_dst + dst_yoff,
1, (pixman_trapezoid_t *)traps++);
composite (op, src, dst, format,
xSrc + src_xoff,
ySrc + src_yoff,
xDst + dst_xoff,
yDst + dst_yoff,
1, shapes + i * shape_size);
}
}
else
@ -221,16 +226,58 @@ fbTrapezoids (CARD8 op,
format = PIXMAN_a8;
break;
}
pixman_composite_trapezoids (op, src, dst, format,
xSrc + src_xoff,
ySrc + src_yoff,
x_dst + dst_xoff,
y_dst + dst_yoff,
ntrap, (pixman_trapezoid_t *)traps);
composite (op, src, dst, format,
xSrc + src_xoff,
ySrc + src_yoff,
xDst + dst_xoff,
yDst + dst_yoff,
nshapes, shapes);
}
}
free_pixman_pict (pSrc, src);
free_pixman_pict (pDst, dst);
}
void
fbTrapezoids (CARD8 op,
PicturePtr pSrc,
PicturePtr pDst,
PictFormatPtr maskFormat,
INT16 xSrc,
INT16 ySrc,
int ntrap,
xTrapezoid *traps)
{
int xDst, yDst;
xDst = traps[0].left.p1.x >> 16;
yDst = traps[0].left.p1.y >> 16;
fbShapes ((CompositeShapesFunc)pixman_composite_trapezoids,
op, pSrc, pDst, maskFormat,
xSrc, ySrc, xDst, yDst,
ntrap, sizeof (xTrapezoid), (const uint8_t *)traps);
}
void
fbTriangles (CARD8 op,
PicturePtr pSrc,
PicturePtr pDst,
PictFormatPtr maskFormat,
INT16 xSrc,
INT16 ySrc,
int ntris,
xTriangle *tris)
{
int xDst, yDst;
xDst = tris[0].p1.x >> 16;
yDst = tris[0].p1.y >> 16;
fbShapes ((CompositeShapesFunc)pixman_composite_triangles,
op, pSrc, pDst, maskFormat,
xSrc, ySrc, xDst, yDst,
ntris, sizeof (xTriangle), (const uint8_t *)tris);
}

View File

@ -632,7 +632,7 @@ miPictureInit (ScreenPtr pScreen, PictFormatPtr formats, int nformats)
ps->Glyphs = miGlyphs;
ps->CompositeRects = miCompositeRects;
ps->Trapezoids = 0;
ps->Triangles = miTriangles;
ps->Triangles = 0;
ps->TriStrip = miTriStrip;
ps->TriFan = miTriFan;

View File

@ -151,16 +151,6 @@ miPointFixedBounds (int npoint, xPointFixed *points, BoxPtr bounds);
extern _X_EXPORT void
miTriangleBounds (int ntri, xTriangle *tris, BoxPtr bounds);
extern _X_EXPORT void
miTriangles (CARD8 op,
PicturePtr pSrc,
PicturePtr pDst,
PictFormatPtr maskFormat,
INT16 xSrc,
INT16 ySrc,
int ntri,
xTriangle *tris);
extern _X_EXPORT void
miTriStrip (CARD8 op,
PicturePtr pSrc,
@ -181,13 +171,6 @@ miTriFan (CARD8 op,
int npoint,
xPointFixed *points);
extern _X_EXPORT PicturePtr
miCreateAlphaPicture (ScreenPtr pScreen,
PicturePtr pDst,
PictFormatPtr pPictFormat,
CARD16 width,
CARD16 height);
extern _X_EXPORT Bool
miInitIndexed (ScreenPtr pScreen,
PictFormatPtr pFormat);

View File

@ -34,55 +34,6 @@
#include "picturestr.h"
#include "mipict.h"
PicturePtr
miCreateAlphaPicture (ScreenPtr pScreen,
PicturePtr pDst,
PictFormatPtr pPictFormat,
CARD16 width,
CARD16 height)
{
PixmapPtr pPixmap;
PicturePtr pPicture;
GCPtr pGC;
int error;
xRectangle rect;
if (width > 32767 || height > 32767)
return 0;
if (!pPictFormat)
{
if (pDst->polyEdge == PolyEdgeSharp)
pPictFormat = PictureMatchFormat (pScreen, 1, PICT_a1);
else
pPictFormat = PictureMatchFormat (pScreen, 8, PICT_a8);
if (!pPictFormat)
return 0;
}
pPixmap = (*pScreen->CreatePixmap) (pScreen, width, height,
pPictFormat->depth, 0);
if (!pPixmap)
return 0;
pGC = GetScratchGC (pPixmap->drawable.depth, pScreen);
if (!pGC)
{
(*pScreen->DestroyPixmap) (pPixmap);
return 0;
}
ValidateGC (&pPixmap->drawable, pGC);
rect.x = 0;
rect.y = 0;
rect.width = width;
rect.height = height;
(*pGC->ops->PolyFillRect)(&pPixmap->drawable, pGC, 1, &rect);
FreeScratchGC (pGC);
pPicture = CreatePicture (0, &pPixmap->drawable, pPictFormat,
0, 0, serverClient, &error);
(*pScreen->DestroyPixmap) (pPixmap);
return pPicture;
}
static xFixed
miLineFixedX (xLineFixed *l, xFixed y, Bool ceil)
{

View File

@ -67,65 +67,6 @@ miTriangleBounds (int ntri, xTriangle *tris, BoxPtr bounds)
miPointFixedBounds (ntri * 3, (xPointFixed *) tris, bounds);
}
void
miTriangles (CARD8 op,
PicturePtr pSrc,
PicturePtr pDst,
PictFormatPtr maskFormat,
INT16 xSrc,
INT16 ySrc,
int ntri,
xTriangle *tris)
{
ScreenPtr pScreen = pDst->pDrawable->pScreen;
PictureScreenPtr ps = GetPictureScreen(pScreen);
/*
* Check for solid alpha add
*/
if (op == PictOpAdd && miIsSolidAlpha (pSrc))
{
(*ps->AddTriangles) (pDst, 0, 0, ntri, tris);
}
else if (maskFormat)
{
BoxRec bounds;
PicturePtr pPicture;
INT16 xDst, yDst;
INT16 xRel, yRel;
xDst = tris[0].p1.x >> 16;
yDst = tris[0].p1.y >> 16;
miTriangleBounds (ntri, tris, &bounds);
if (bounds.x2 <= bounds.x1 || bounds.y2 <= bounds.y1)
return;
pPicture = miCreateAlphaPicture (pScreen, pDst, maskFormat,
bounds.x2 - bounds.x1,
bounds.y2 - bounds.y1);
if (!pPicture)
return;
(*ps->AddTriangles) (pPicture, -bounds.x1, -bounds.y1, ntri, tris);
xRel = bounds.x1 + xSrc - xDst;
yRel = bounds.y1 + ySrc - yDst;
CompositePicture (op, pSrc, pPicture, pDst,
xRel, yRel, 0, 0, bounds.x1, bounds.y1,
bounds.x2 - bounds.x1, bounds.y2 - bounds.y1);
FreePicture (pPicture, 0);
}
else
{
if (pDst->polyEdge == PolyEdgeSharp)
maskFormat = PictureMatchFormat (pScreen, 1, PICT_a1);
else
maskFormat = PictureMatchFormat (pScreen, 8, PICT_a8);
for (; ntri; ntri--, tris++)
miTriangles (op, pSrc, pDst, maskFormat, xSrc, ySrc, 1, tris);
}
}
void
miTriStrip (CARD8 op,
PicturePtr pSrc,