*** x2go/nx-libs-3.5.0.12/nx-X11/programs/Xserver/hw/nxagent/Render.c 2012-03-07 14:04:02.000000000 -0700 --- x2go-new/nx-libs-3.5.0.12/nx-X11/programs/Xserver/hw/nxagent/Render.c 2012-05-10 11:09:39.631786853 -0600 *************** *** 995,1000 **** --- 995,1030 ---- #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,1043 **** } #endif ! ! if (NXAGENT_SHOULD_DEFER_COMPOSITE(pSrc, pMask, pDst)) { pDstRegion = nxagentCreateRegion(pDst -> pDrawable, NULL, xDst, yDst, width, height); --- 1066,1073 ---- } #endif ! /* if (NXAGENT_SHOULD_DEFER_COMPOSITE(pSrc, pMask, pDst)) */ ! if (nxagentShouldDeferComposite(pSrc, pMask, pDst)) { pDstRegion = nxagentCreateRegion(pDst -> pDrawable, NULL, xDst, yDst, width, height); *************** *** 1095,1101 **** } } ! if (pMask != NULL && pMask -> pDrawable != pSrc -> pDrawable && pMask -> pDrawable != pDst -> pDrawable) { nxagentSynchronizeShmPixmap(pMask -> pDrawable, xMask, yMask, width, height); --- 1125,1132 ---- } } ! if ((pMask) && (pMask->pDrawable) && ! pMask -> pDrawable != pSrc -> pDrawable && pMask -> pDrawable != pDst -> pDrawable) { nxagentSynchronizeShmPixmap(pMask -> pDrawable, xMask, yMask, width, height); *************** *** 1259,1265 **** * on the real X server. */ ! if (nxagentDrawableStatus(pSrc -> pDrawable) == NotSynchronized) { #ifdef TEST fprintf(stderr, "nxagentGlyphs: Synchronizing source [%s] at [%p].\n", --- 1290,1296 ---- * on the real X server. */ ! if (pSrc -> pDrawable && (nxagentDrawableStatus(pSrc -> pDrawable) == NotSynchronized)) { #ifdef TEST fprintf(stderr, "nxagentGlyphs: Synchronizing source [%s] at [%p].\n", *************** *** 1302,1315 **** nxagentSynchronizeBox(pSrc -> pDrawable, &glyphBox, NEVER_BREAK); } ! if (pSrc -> pDrawable -> type == DRAWABLE_PIXMAP) { nxagentIncreasePixmapUsageCounter((PixmapPtr) pSrc -> pDrawable); } } ! if (pSrc -> pDrawable != pDst -> pDrawable && ! nxagentDrawableStatus(pDst -> pDrawable) == NotSynchronized) { #ifdef TEST fprintf(stderr, "nxagentGlyphs: Synchronizing destination [%s] at [%p].\n", --- 1333,1347 ---- nxagentSynchronizeBox(pSrc -> pDrawable, &glyphBox, NEVER_BREAK); } ! if (pSrc -> pDrawable && (pSrc -> pDrawable -> type == DRAWABLE_PIXMAP)) { nxagentIncreasePixmapUsageCounter((PixmapPtr) pSrc -> pDrawable); } } ! ! if (pSrc -> pDrawable && (pSrc -> pDrawable != pDst -> pDrawable && ! nxagentDrawableStatus(pDst -> pDrawable) == NotSynchronized)) { #ifdef TEST fprintf(stderr, "nxagentGlyphs: Synchronizing destination [%s] at [%p].\n", *************** *** 1749,1755 **** return; } ! if (nxagentDrawableStatus(pSrc -> pDrawable) == NotSynchronized) { #ifdef TEST fprintf(stderr, "nxagentTrapezoids: Going to synchronize the source drawable at [%p].\n", --- 1781,1789 ---- return; } ! /* 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,1849 **** * operation like nxagentTrapezoids() does. */ ! if (nxagentDrawableStatus(pSrc -> pDrawable) == NotSynchronized) { #ifdef TEST fprintf(stderr, "nxagentTriangles: Going to synchronize the source drawable at [%p].\n", --- 1877,1885 ---- * operation like nxagentTrapezoids() does. */ ! ! ! if (pSrc -> pDrawable && (nxagentDrawableStatus(pSrc -> pDrawable) == NotSynchronized)) { #ifdef TEST fprintf(stderr, "nxagentTriangles: Going to synchronize the source drawable at [%p].\n", *************** *** 1920,1926 **** * operation like nxagentTrapezoids() does. */ ! if (nxagentDrawableStatus(pSrc -> pDrawable) == NotSynchronized) { #ifdef TEST fprintf(stderr, "nxagentTriStrip: Going to synchronize the source drawable at [%p].\n", --- 1956,1963 ---- * operation like nxagentTrapezoids() does. */ ! ! if (pSrc -> pDrawable && (nxagentDrawableStatus(pSrc -> pDrawable) == NotSynchronized)) { #ifdef TEST fprintf(stderr, "nxagentTriStrip: Going to synchronize the source drawable at [%p].\n", *************** *** 1997,2003 **** * operation like nxagentTrapezoids() does. */ ! if (nxagentDrawableStatus(pSrc -> pDrawable) == NotSynchronized) { #ifdef TEST fprintf(stderr, "nxagentTriFan: Going to synchronize the source drawable at [%p].\n", --- 2034,2041 ---- * operation like nxagentTrapezoids() does. */ ! ! if (pSrc -> pDrawable && (nxagentDrawableStatus(pSrc -> pDrawable) == NotSynchronized)) { #ifdef TEST fprintf(stderr, "nxagentTriFan: Going to synchronize the source drawable at [%p].\n",