summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'x11-base/xorg-server/files/use-composite-for-unequal-depths.patch')
-rw-r--r--x11-base/xorg-server/files/use-composite-for-unequal-depths.patch124
1 files changed, 124 insertions, 0 deletions
diff --git a/x11-base/xorg-server/files/use-composite-for-unequal-depths.patch b/x11-base/xorg-server/files/use-composite-for-unequal-depths.patch
new file mode 100644
index 0000000..fd2c5ad
--- /dev/null
+++ b/x11-base/xorg-server/files/use-composite-for-unequal-depths.patch
@@ -0,0 +1,124 @@
+Gentoo bug #191964
+freedesktop.org bug #7447 attachment #11368
+Fixed in 1.4 and newer
+
+diff --git a/composite/compalloc.c b/composite/compalloc.c
+index f555411..006e808 100644
+--- a/composite/compalloc.c
++++ b/composite/compalloc.c
+@@ -461,7 +461,6 @@ compNewPixmap (WindowPtr pWin, int x, int y, int w, int h)
+ ScreenPtr pScreen = pWin->drawable.pScreen;
+ WindowPtr pParent = pWin->parent;
+ PixmapPtr pPixmap;
+- GCPtr pGC;
+
+ pPixmap = (*pScreen->CreatePixmap) (pScreen, w, h, pWin->drawable.depth);
+
+@@ -471,25 +470,63 @@ compNewPixmap (WindowPtr pWin, int x, int y, int w, int h)
+ pPixmap->screen_x = x;
+ pPixmap->screen_y = y;
+
+- pGC = GetScratchGC (pWin->drawable.depth, pScreen);
+-
+- /*
+- * Copy bits from the parent into the new pixmap so that it will
+- * have "reasonable" contents in case for background None areas.
+- */
+- if (pGC)
++ if (pParent->drawable.depth == pWin->drawable.depth)
+ {
+- XID val = IncludeInferiors;
++ GCPtr pGC = GetScratchGC (pWin->drawable.depth, pScreen);
+
+- ValidateGC(&pPixmap->drawable, pGC);
+- dixChangeGC (serverClient, pGC, GCSubwindowMode, &val, NULL);
+- (*pGC->ops->CopyArea) (&pParent->drawable,
+- &pPixmap->drawable,
+- pGC,
+- x - pParent->drawable.x,
+- y - pParent->drawable.y,
+- w, h, 0, 0);
+- FreeScratchGC (pGC);
++ /*
++ * Copy bits from the parent into the new pixmap so that it will
++ * have "reasonable" contents in case for background None areas.
++ */
++ if (pGC)
++ {
++ XID val = IncludeInferiors;
++
++ ValidateGC(&pPixmap->drawable, pGC);
++ dixChangeGC (serverClient, pGC, GCSubwindowMode, &val, NULL);
++ (*pGC->ops->CopyArea) (&pParent->drawable,
++ &pPixmap->drawable,
++ pGC,
++ x - pParent->drawable.x,
++ y - pParent->drawable.y,
++ w, h, 0, 0);
++ FreeScratchGC (pGC);
++ }
++ }
++ else
++ {
++ PictFormatPtr pSrcFormat = compWindowFormat (pParent);
++ PictFormatPtr pDstFormat = compWindowFormat (pWin);
++ XID inferiors = IncludeInferiors;
++ int error;
++
++ PicturePtr pSrcPicture = CreatePicture (None,
++ &pParent->drawable,
++ pSrcFormat,
++ CPSubwindowMode,
++ &inferiors,
++ serverClient, &error);
++
++ PicturePtr pDstPicture = CreatePicture (None,
++ &pPixmap->drawable,
++ pDstFormat,
++ 0, 0,
++ serverClient, &error);
++
++ if (pSrcPicture && pDstPicture)
++ {
++ CompositePicture (PictOpSrc,
++ pSrcPicture,
++ NULL,
++ pDstPicture,
++ x - pParent->drawable.x,
++ y - pParent->drawable.y,
++ 0, 0, 0, 0, w, h);
++ }
++ if (pSrcPicture)
++ FreePicture (pSrcPicture, 0);
++ if (pDstPicture)
++ FreePicture (pDstPicture, 0);
+ }
+ return pPixmap;
+ }
+diff --git a/composite/compint.h b/composite/compint.h
+index 38b1777..f69595c 100644
+--- a/composite/compint.h
++++ b/composite/compint.h
+@@ -237,6 +237,9 @@ compCheckTree (ScreenPtr pScreen);
+ #define compCheckTree(s)
+ #endif
+
++PictFormatPtr
++compWindowFormat (WindowPtr pWin);
++
+ void
+ compSetPixmap (WindowPtr pWin, PixmapPtr pPixmap);
+
+diff --git a/composite/compwindow.c b/composite/compwindow.c
+index a4c4e6f..bfd2946 100644
+--- a/composite/compwindow.c
++++ b/composite/compwindow.c
+@@ -685,7 +685,7 @@ compGetWindowVisual (WindowPtr pWin)
+ return 0;
+ }
+
+-static PictFormatPtr
++PictFormatPtr
+ compWindowFormat (WindowPtr pWin)
+ {
+ ScreenPtr pScreen = pWin->drawable.pScreen;