diff options
author | Eric Anholt <anholt@freebsd.org> | 2004-08-05 18:24:58 +0000 |
---|---|---|
committer | Eric Anholt <anholt@freebsd.org> | 2004-08-05 18:24:58 +0000 |
commit | ae1580c494fde2b56f9faa40f7ebcf637728efc8 (patch) | |
tree | 0798058dcd39a70c33663f38f140eeafcb6c8ff6 /miext | |
parent | 73e14bd611fa7eac649a2b4c7964959d9eae887b (diff) |
- 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.
Diffstat (limited to 'miext')
-rw-r--r-- | miext/cw/cw.c | 11 | ||||
-rw-r--r-- | miext/cw/cw.h | 10 | ||||
-rw-r--r-- | miext/cw/cw_render.c | 209 |
3 files changed, 116 insertions, 114 deletions
diff --git a/miext/cw/cw.c b/miext/cw/cw.c index a99dd0e0a..e0b7467ed 100644 --- a/miext/cw/cw.c +++ b/miext/cw/cw.c @@ -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 diff --git a/miext/cw/cw.h b/miext/cw/cw.h index 014cfd4bb..0fb626d11 100644 --- a/miext/cw/cw.h +++ b/miext/cw/cw.h @@ -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 */ diff --git a/miext/cw/cw_render.c b/miext/cw/cw_render.c index 7d28b7b34..2db90b759 100644 --- a/miext/cw/cw_render.c +++ b/miext/cw/cw_render.c @@ -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; + + pBackingPicture = CreatePicture (0, &pPixmap->drawable, pPicture->pFormat, + 0, 0, serverClient, &error); + + pPicture->devPrivates[cwPictureIndex].ptr = pBackingPicture; - return pCwPicture->pBackingPicture = 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; - - 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; + SetPictureTransform(pBackingPicture, pPicture->transform); + /* XXX Set filters */ + + 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 */ |