--- a/nx-X11/programs/Xserver/hw/nxagent/Render.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Render.c @@ -995,6 +995,36 @@ #endif } + +int nxagentShouldDeferComposite(PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst) +{ + +int drawableDst; +int linkDeferred; +int unSyncedSrcMask; + + drawableDst = ( nxagentRenderVersionMajor == 0 && + nxagentRenderVersionMinor == 8 && + (pDst) -> pDrawable -> type == DRAWABLE_PIXMAP + ); + + linkDeferred = ( nxagentOption(DeferLevel) >= 2 && + nxagentOption(LinkType) < LINK_TYPE_ADSL + ); + + unSyncedSrcMask = ( nxagentOption(DeferLevel) == 1 && + (pDst) -> pDrawable -> type == DRAWABLE_PIXMAP && + ( + (pSrc -> pDrawable && (nxagentDrawableStatus(pSrc -> pDrawable) == NotSynchronized)) || + ((pMask) && pMask -> pDrawable && (nxagentDrawableStatus((pMask) -> pDrawable) == NotSynchronized)) + ) + ); + + + return drawableDst || linkDeferred || unSyncedSrcMask; +} + + void nxagentComposite(CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst, INT16 xSrc, INT16 ySrc, INT16 xMask, INT16 yMask, INT16 xDst, INT16 yDst, CARD16 width, CARD16 height) @@ -1036,8 +1066,8 @@ } #endif - - if (NXAGENT_SHOULD_DEFER_COMPOSITE(pSrc, pMask, pDst)) + /* if (NXAGENT_SHOULD_DEFER_COMPOSITE(pSrc, pMask, pDst)) */ + if (nxagentShouldDeferComposite(pSrc, pMask, pDst)) { pDstRegion = nxagentCreateRegion(pDst -> pDrawable, NULL, xDst, yDst, width, height); @@ -1095,7 +1125,8 @@ } } - if (pMask != NULL && pMask -> pDrawable != pSrc -> pDrawable && + if ((pMask) && (pMask->pDrawable) && + pMask -> pDrawable != pSrc -> pDrawable && pMask -> pDrawable != pDst -> pDrawable) { nxagentSynchronizeShmPixmap(pMask -> pDrawable, xMask, yMask, width, height); @@ -1259,7 +1290,7 @@ * on the real X server. */ - if (nxagentDrawableStatus(pSrc -> pDrawable) == NotSynchronized) + if (pSrc -> pDrawable && (nxagentDrawableStatus(pSrc -> pDrawable) == NotSynchronized)) { #ifdef TEST fprintf(stderr, "nxagentGlyphs: Synchronizing source [%s] at [%p].\n", @@ -1302,14 +1333,15 @@ nxagentSynchronizeBox(pSrc -> pDrawable, &glyphBox, NEVER_BREAK); } - if (pSrc -> pDrawable -> type == DRAWABLE_PIXMAP) + if (pSrc -> pDrawable && (pSrc -> pDrawable -> type == DRAWABLE_PIXMAP)) { nxagentIncreasePixmapUsageCounter((PixmapPtr) pSrc -> pDrawable); } } - if (pSrc -> pDrawable != pDst -> pDrawable && - nxagentDrawableStatus(pDst -> pDrawable) == NotSynchronized) + + if (pSrc -> pDrawable && (pSrc -> pDrawable != pDst -> pDrawable && + nxagentDrawableStatus(pDst -> pDrawable) == NotSynchronized)) { #ifdef TEST fprintf(stderr, "nxagentGlyphs: Synchronizing destination [%s] at [%p].\n", @@ -1749,7 +1781,9 @@ return; } - if (nxagentDrawableStatus(pSrc -> pDrawable) == NotSynchronized) + /* the following blocks need fixing to ignore null values of pDrawable */ + + if (pSrc -> pDrawable && (nxagentDrawableStatus(pSrc -> pDrawable) == NotSynchronized)) { #ifdef TEST fprintf(stderr, "nxagentTrapezoids: Going to synchronize the source drawable at [%p].\n", @@ -1843,7 +1877,9 @@ * operation like nxagentTrapezoids() does. */ - if (nxagentDrawableStatus(pSrc -> pDrawable) == NotSynchronized) + + + if (pSrc -> pDrawable && (nxagentDrawableStatus(pSrc -> pDrawable) == NotSynchronized)) { #ifdef TEST fprintf(stderr, "nxagentTriangles: Going to synchronize the source drawable at [%p].\n", @@ -1920,7 +1956,8 @@ * operation like nxagentTrapezoids() does. */ - if (nxagentDrawableStatus(pSrc -> pDrawable) == NotSynchronized) + + if (pSrc -> pDrawable && (nxagentDrawableStatus(pSrc -> pDrawable) == NotSynchronized)) { #ifdef TEST fprintf(stderr, "nxagentTriStrip: Going to synchronize the source drawable at [%p].\n", @@ -1997,7 +2034,8 @@ * operation like nxagentTrapezoids() does. */ - if (nxagentDrawableStatus(pSrc -> pDrawable) == NotSynchronized) + + if (pSrc -> pDrawable && (nxagentDrawableStatus(pSrc -> pDrawable) == NotSynchronized)) { #ifdef TEST fprintf(stderr, "nxagentTriFan: Going to synchronize the source drawable at [%p].\n",