aboutsummaryrefslogtreecommitdiff
path: root/debian/patches/120_nxagent_libcairo-null-source-drawables.full.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/120_nxagent_libcairo-null-source-drawables.full.patch')
-rw-r--r--debian/patches/120_nxagent_libcairo-null-source-drawables.full.patch130
1 files changed, 130 insertions, 0 deletions
diff --git a/debian/patches/120_nxagent_libcairo-null-source-drawables.full.patch b/debian/patches/120_nxagent_libcairo-null-source-drawables.full.patch
new file mode 100644
index 000000000..66af325bd
--- /dev/null
+++ b/debian/patches/120_nxagent_libcairo-null-source-drawables.full.patch
@@ -0,0 +1,130 @@
+--- 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",