diff options
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.patch | 124 |
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; |