- Add a new Render function, CopyPicture, which will update a picture with

the flagged bits from a source picture. Approved in principle by
    keithp.
- Use CopyPicture and SetTransform to update most of the backing picture's
    state in the composite wrapper. Filters are still missing.
- Don't allocate a picture private, now that we calculate clipping properly
    and don't need the serialNumber or stateChanges.
- Use the format of the source pixmap rather than generating the format
    from the window's visual.
- Wrap the rest of the Render primitives that were stubbed out before.
This commit is contained in:
Eric Anholt 2004-08-05 18:24:58 +00:00
parent 73e14bd611
commit ae1580c494
5 changed files with 200 additions and 114 deletions

View File

@ -659,6 +659,10 @@ miInitializeCompositeWrapper(ScreenPtr pScreen)
}
if (!AllocateGCPrivate(pScreen, cwGCIndex, 0))
return;
#ifdef RENDER
if (!AllocatePicturePrivate(pScreen, cwPictureIndex, 0))
return;
#endif
pScreenPriv = (cwScreenPtr)xalloc(sizeof(cwScreenRec));
if (!pScreenPriv)
return;
@ -681,13 +685,8 @@ miInitializeCompositeWrapper(ScreenPtr pScreen)
#ifdef RENDER
if (GetPictureScreen (pScreen))
{
if (!cwInitializeRender (pScreen))
/* FIXME */;
}
cwInitializeRender(pScreen)
#endif
ErrorF("Initialized composite wrapper\n");
}
static Bool

View File

@ -44,16 +44,8 @@ extern int cwGCIndex;
#define getCwGC(pGC) ((cwGCPtr)(pGC)->devPrivates[cwGCIndex].ptr)
#define setCwGC(pGC,p) ((pGC)->devPrivates[cwGCIndex].ptr = (pointer) (p))
typedef struct {
PicturePtr pBackingPicture;
unsigned long serialNumber; /* clientClip computed time */
unsigned long stateChanges; /* changes in parent picture since last copy */
} cwPictureRec, *cwPicturePtr;
extern int cwPictureIndex;
#define getCwPicture(pPicture) ((cwPicturePtr)(pPicture)->devPrivates[cwPictureIndex].ptr)
#define cwDrawableIsRedirWindow(pDraw) \
((pDraw)->type == DRAWABLE_WINDOW && \
((*(pDraw)->pScreen->GetWindowPixmap)((WindowPtr)(pDraw)) != \
@ -142,7 +134,7 @@ cwGetBackingDrawable(DrawablePtr pDrawable, int *x_off, int *y_off);
/* cw_render.c */
Bool
void
cwInitializeRender (ScreenPtr pScreen);
/* cw.c */

View File

@ -31,13 +31,9 @@
PictureScreenPtr ps = GetPictureScreen (pScreen); \
cwScreenPtr pCwScreen = getCwScreen (pScreen)
#define cwBackingPicture(pCwPicture, pPicture) \
((pCwPicture && pCwPicture->pBackingPicture) ? \
pCwPicture->pBackingPicture : pPicture)
#define cwPictureDecl \
cwPicturePtr pCwPicture = getCwPicture(pPicture); \
PicturePtr pBackingPicture = pCwPicture ? pCwPicture->pBackingPicture : 0
#define cwPictureDecl \
PicturePtr pBackingPicture = \
((pPicture)->devPrivates[cwPictureIndex].ptr)
#define cwSrcPictureDecl \
int src_picture_x_off, src_picture_y_off; \
@ -67,36 +63,23 @@
ps->elt = func; \
}
static VisualPtr
cwFindVisualById (ScreenPtr pScreen, VisualID visual)
{
int i;
VisualPtr pVisual;
for (i = 0, pVisual = pScreen->visuals;
i < pScreen->numVisuals;
i++, pVisual++)
{
if (pVisual->vid == visual)
return pVisual;
}
return 0;
}
static PicturePtr
cwCreateBackingPicture (PicturePtr pPicture)
{
ScreenPtr pScreen = pPicture->pDrawable->pScreen;
WindowPtr pWindow = (WindowPtr) pPicture->pDrawable;
PixmapPtr pPixmap = (*pScreen->GetWindowPixmap) (pWindow);
VisualPtr pVisual = cwFindVisualById (pScreen, wVisual (pWindow));
PictFormatPtr pFormat = PictureMatchVisual (pScreen, pWindow->drawable.depth,
pVisual);
int error;
PicturePtr pBackingPicture = CreatePicture (0, &pPixmap->drawable, pFormat,
0, 0, serverClient, &error);
cwPicturePtr pCwPicture = getCwPicture (pPicture);
PicturePtr pBackingPicture;
return pCwPicture->pBackingPicture = pBackingPicture;
pBackingPicture = CreatePicture (0, &pPixmap->drawable, pPicture->pFormat,
0, 0, serverClient, &error);
pPicture->devPrivates[cwPictureIndex].ptr = pBackingPicture;
CopyPicture(pPicture, (1 << (CPLastBit + 1)) - 1, pBackingPicture);
return pBackingPicture;
}
static void
@ -107,7 +90,7 @@ cwDestroyBackingPicture (PicturePtr pPicture)
if (pBackingPicture)
{
FreePicture (pBackingPicture, 0);
pCwPicture->pBackingPicture = 0;
pPicture->devPrivates[cwPictureIndex].ptr = NULL;
}
}
@ -143,7 +126,6 @@ cwCreatePicture (PicturePtr pPicture)
cwPsDecl(pScreen);
cwPsUnwrap (CreatePicture);
bzero(getCwPicture(pPicture), sizeof(cwPictureRec));
ret = (*ps->CreatePicture) (pPicture);
cwPsWrap (CreatePicture, cwCreatePicture);
return ret;
@ -180,7 +162,8 @@ cwChangePicture (PicturePtr pPicture,
}
cwPsWrap(ChangePicture, cwChangePicture);
}
static void
cwValidatePicture (PicturePtr pPicture,
Mask mask)
@ -220,26 +203,25 @@ cwValidatePicture (PicturePtr pPicture,
}
}
pBackingDrawable = cwGetBackingDrawable (&pWin->drawable, &x_off, &y_off);
/* Check to see if a new composite clip must be generated */
pBackingDrawable = cwGetBackingDrawable (&pWin->drawable, &x_off,&y_off);
if (pDrawable->serialNumber != pCwPicture->serialNumber ||
(mask & (CPClipXOrigin|CPClipYOrigin|CPClipMask|CPSubwindowMode)))
{
RegionPtr pCompositeClip;
SetPictureTransform(pBackingPicture, pPicture->transform);
/* XXX Set filters */
pCompositeClip = REGION_CREATE(pScreen, NULL, 1);
/* note - CT_PIXMAP "cannot" happen because no DDX supports it*/
REGION_COPY (pScreen, pCompositeClip, pPicture->pCompositeClip);
SetPictureClipRegion (pBackingPicture, -x_off, -y_off,
pCompositeClip);
pCwPicture->serialNumber = pDrawable->serialNumber;
if (mask & (CPClipXOrigin || CPClipYOrigin)) {
XID vals[2];
vals[0] = pPicture->clipOrigin.x + x_off;
vals[1] = pPicture->clipOrigin.y + y_off;
ChangePicture(pBackingPicture, CPClipXOrigin | CPClipYOrigin,
vals, NULL, NullClient);
mask &= ~(CPClipXOrigin | CPClipYOrigin);
}
mask |= pCwPicture->stateChanges;
CopyPicture(pPicture, mask, pBackingPicture);
(*ps->ValidatePicture) (pBackingPicture, mask);
pCwPicture->stateChanges = 0;
pBackingPicture->serialNumber = pBackingDrawable->serialNumber;
}
cwPsWrap(ValidatePicture, cwValidatePicture);
}
@ -298,11 +280,6 @@ cwGlyphs (CARD8 op,
(*ps->Glyphs) (op, pBackingSrcPicture, pBackingDstPicture, maskFormat,
xSrc + src_picture_x_off, ySrc + src_picture_y_off,
nlists, lists, glyphs);
if (nlists)
{
lists->xOff -= dst_picture_x_off;
lists->yOff -= dst_picture_y_off;
}
cwPsWrap(Glyphs, cwGlyphs);
}
@ -325,11 +302,6 @@ cwCompositeRects (CARD8 op,
rects[i].y += dst_picture_y_off;
}
(*ps->CompositeRects) (op, pBackingDstPicture, color, nRect, rects);
for (i = 0; i < nRect; i++)
{
rects[i].x -= dst_picture_x_off;
rects[i].y -= dst_picture_y_off;
}
cwPsWrap(CompositeRects, cwCompositeRects);
}
@ -350,7 +322,7 @@ cwTrapezoids (CARD8 op,
int i;
cwPsUnwrap(Trapezoids);
if (dst_picture_x_off | dst_picture_y_off)
if (dst_picture_x_off || dst_picture_y_off) {
for (i = 0; i < ntrap; i++)
{
traps[i].top += dst_picture_y_off << 16;
@ -364,72 +336,112 @@ cwTrapezoids (CARD8 op,
traps[i].right.p2.x += dst_picture_x_off << 16;
traps[i].right.p2.y += dst_picture_y_off << 16;
}
}
(*ps->Trapezoids) (op, pBackingSrcPicture, pBackingDstPicture, maskFormat,
xSrc + src_picture_x_off, ySrc + src_picture_y_off,
ntrap, traps);
if (dst_picture_x_off | dst_picture_y_off)
for (i = 0; i < ntrap; i++)
{
traps[i].top -= dst_picture_y_off << 16;
traps[i].bottom -= dst_picture_y_off << 16;
traps[i].left.p1.x -= dst_picture_x_off << 16;
traps[i].left.p1.y -= dst_picture_y_off << 16;
traps[i].left.p2.x -= dst_picture_x_off << 16;
traps[i].left.p2.y -= dst_picture_y_off << 16;
traps[i].right.p1.x -= dst_picture_x_off << 16;
traps[i].right.p1.y -= dst_picture_y_off << 16;
traps[i].right.p2.x -= dst_picture_x_off << 16;
traps[i].right.p2.y -= dst_picture_y_off << 16;
}
cwPsWrap(Trapezoids, cwTrapezoids);
}
static void
cwTriangles (CARD8 op,
PicturePtr pSrc,
PicturePtr pDst,
PicturePtr pSrcPicture,
PicturePtr pDstPicture,
PictFormatPtr maskFormat,
INT16 xSrc,
INT16 ySrc,
int ntri,
xTriangle *tris)
xTriangle *tris)
{
/* FIXME */
ScreenPtr pScreen = pDstPicture->pDrawable->pScreen;
cwPsDecl(pScreen);
cwSrcPictureDecl;
cwDstPictureDecl;
int i;
cwPsUnwrap(Triangles);
if (dst_picture_x_off || dst_picture_y_off) {
for (i = 0; i < ntri; i++)
{
tris[i].p1.x += dst_picture_x_off << 16;
tris[i].p1.y += dst_picture_y_off << 16;
tris[i].p2.x += dst_picture_x_off << 16;
tris[i].p2.y += dst_picture_y_off << 16;
tris[i].p3.x += dst_picture_x_off << 16;
tris[i].p3.y += dst_picture_y_off << 16;
}
}
(*ps->Triangles) (op, pBackingSrcPicture, pBackingDstPicture, maskFormat,
xSrc + src_picture_x_off, ySrc + src_picture_y_off,
ntri, tris);
cwPsWrap(Triangles, cwTriangles);
}
static void
cwTriStrip (CARD8 op,
PicturePtr pSrc,
PicturePtr pDst,
PictFormatPtr maskFormat,
INT16 xSrc,
INT16 ySrc,
int npoint,
xPointFixed *points)
PicturePtr pSrcPicture,
PicturePtr pDstPicture,
PictFormatPtr maskFormat,
INT16 xSrc,
INT16 ySrc,
int npoint,
xPointFixed *points)
{
/* FIXME */
ScreenPtr pScreen = pDstPicture->pDrawable->pScreen;
cwPsDecl(pScreen);
cwSrcPictureDecl;
cwDstPictureDecl;
int i;
cwPsUnwrap(TriStrip);
if (dst_picture_x_off || dst_picture_y_off) {
for (i = 0; i < npoint; i++)
{
points[i].x += dst_picture_x_off << 16;
points[i].y += dst_picture_y_off << 16;
}
}
(*ps->TriStrip) (op, pBackingSrcPicture, pBackingDstPicture, maskFormat,
xSrc + src_picture_x_off, ySrc + src_picture_y_off,
npoint, points);
cwPsWrap(TriStrip, cwTriStrip);
}
static void
cwTriFan (CARD8 op,
PicturePtr pSrc,
PicturePtr pDst,
PictFormatPtr maskFormat,
INT16 xSrc,
INT16 ySrc,
int npoint,
xPointFixed *points)
cwTriFan (CARD8 op,
PicturePtr pSrcPicture,
PicturePtr pDstPicture,
PictFormatPtr maskFormat,
INT16 xSrc,
INT16 ySrc,
int npoint,
xPointFixed *points)
{
/* FIXME */
ScreenPtr pScreen = pDstPicture->pDrawable->pScreen;
cwPsDecl(pScreen);
cwSrcPictureDecl;
cwDstPictureDecl;
int i;
cwPsUnwrap(TriFan);
if (dst_picture_x_off || dst_picture_y_off) {
for (i = 0; i < npoint; i++)
{
points[i].x += dst_picture_x_off << 16;
points[i].y += dst_picture_y_off << 16;
}
}
(*ps->TriFan) (op, pBackingSrcPicture, pBackingDstPicture, maskFormat,
xSrc + src_picture_x_off, ySrc + src_picture_y_off,
npoint, points);
cwPsWrap(TriFan, cwTriFan);
}
Bool
void
cwInitializeRender (ScreenPtr pScreen)
{
cwPsDecl (pScreen);
if (!AllocatePicturePrivate (pScreen, cwPictureIndex, sizeof(cwPictureRec)))
return FALSE;
cwPsWrap(CreatePicture, cwCreatePicture);
cwPsWrap(DestroyPicture, cwDestroyPicture);
cwPsWrap(ChangePicture, cwChangePicture);
@ -441,7 +453,6 @@ cwInitializeRender (ScreenPtr pScreen)
cwPsWrap(Triangles, cwTriangles);
cwPsWrap(TriStrip, cwTriStrip);
cwPsWrap(TriFan, cwTriFan);
return TRUE;
}
#endif /* RENDER */

View File

@ -1180,6 +1180,85 @@ SetPictureTransform (PicturePtr pPicture,
return Success;
}
void
CopyPicture (PicturePtr pSrc,
Mask mask,
PicturePtr pDst)
{
PictureScreenPtr ps = GetPictureScreen(pSrc->pDrawable->pScreen);
pDst->stateChanges |= mask;
while (mask) {
Mask bit = lowbit(mask);
switch (bit)
{
case CPRepeat:
pDst->repeat = pSrc->repeat;
break;
case CPAlphaMap:
if (pSrc->alphaMap && pSrc->alphaMap->pDrawable->type == DRAWABLE_PIXMAP)
pSrc->alphaMap->refcnt++;
if (pDst->alphaMap)
FreePicture ((pointer) pDst->alphaMap, (XID) 0);
pDst->alphaMap = pSrc->alphaMap;
break;
case CPAlphaXOrigin:
pDst->alphaOrigin.x = pSrc->alphaOrigin.y;
break;
case CPAlphaYOrigin:
pDst->alphaOrigin.y = pSrc->alphaOrigin.y;
break;
case CPClipXOrigin:
pDst->clipOrigin.x = pSrc->clipOrigin.y;
break;
case CPClipYOrigin:
pDst->clipOrigin.y = pSrc->clipOrigin.y;
break;
case CPClipMask:
switch (pSrc->clientClipType) {
case CT_NONE:
(*ps->ChangePictureClip)(pDst, CT_NONE, NULL, 0);
break;
case CT_REGION:
if (!pSrc->clientClip) {
(*ps->ChangePictureClip)(pDst, CT_NONE, NULL, 0);
} else {
RegionPtr clientClip;
RegionPtr srcClientClip = (RegionPtr)pSrc->clientClip;
clientClip = REGION_CREATE(pSrc->pDrawable->pScreen,
REGION_EXTENTS(pSrc->pDrawable->pScreen, srcClientClip),
REGION_NUM_RECTS(srcClientClip));
(*ps->ChangePictureClip)(pDst, CT_REGION, clientClip, 0);
}
break;
default:
/* XXX: CT_PIXMAP unimplemented */
break;
}
break;
case CPGraphicsExposure:
pDst->graphicsExposures = pSrc->graphicsExposures;
break;
case CPPolyEdge:
pDst->polyEdge = pSrc->polyEdge;
break;
case CPPolyMode:
pDst->polyMode = pSrc->polyMode;
break;
case CPDither:
pDst->dither = pSrc->dither;
break;
case CPComponentAlpha:
pDst->componentAlpha = pSrc->componentAlpha;
break;
}
mask &= ~bit;
}
}
static void
ValidateOnePicture (PicturePtr pPicture)
{

View File

@ -415,7 +415,12 @@ SetPictureClipRegion (PicturePtr pPicture,
int
SetPictureTransform (PicturePtr pPicture,
PictTransform *transform);
void
CopyPicture (PicturePtr pSrc,
Mask mask,
PicturePtr pDst);
void
ValidatePicture(PicturePtr pPicture);