forked from mirrors/nixpkgs
166 lines
5.4 KiB
Diff
166 lines
5.4 KiB
Diff
|
From 9ca14507a31338fad40d430445a4a4cb8106bc9b Mon Sep 17 00:00:00 2001
|
||
|
From: Jeremy Huddleston <jeremyhu@apple.com>
|
||
|
Date: Fri, 30 Apr 2010 13:08:25 -0700
|
||
|
Subject: [PATCH 5001/5004] Workaround the GC clipping problem in miPaintWindow
|
||
|
and add some debugging output.
|
||
|
|
||
|
Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
|
||
|
---
|
||
|
mi/miexpose.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++++------
|
||
|
1 file changed, 94 insertions(+), 10 deletions(-)
|
||
|
|
||
|
diff --git a/mi/miexpose.c b/mi/miexpose.c
|
||
|
index 8b7c93f..3e972f7 100644
|
||
|
--- a/mi/miexpose.c
|
||
|
+++ b/mi/miexpose.c
|
||
|
@@ -489,7 +489,8 @@ void RootlessSetPixmapOfAncestors(WindowPtr pWin);
|
||
|
void RootlessStartDrawing(WindowPtr pWin);
|
||
|
void RootlessDamageRegion(WindowPtr pWin, RegionPtr prgn);
|
||
|
Bool IsFramedWindow(WindowPtr pWin);
|
||
|
-#endif
|
||
|
+#include "../fb/fb.h"
|
||
|
+#endif
|
||
|
|
||
|
void
|
||
|
miPaintWindow(WindowPtr pWin, RegionPtr prgn, int what)
|
||
|
@@ -518,23 +519,37 @@ miPaintWindow(WindowPtr pWin, RegionPtr prgn, int what)
|
||
|
Bool solid = TRUE;
|
||
|
DrawablePtr drawable = &pWin->drawable;
|
||
|
|
||
|
+#ifdef XQUARTZ_CLIP_DEBUG
|
||
|
+ ErrorF("START %d BS %d (pR = %ld)\n", what, pWin->backgroundState, ParentRelative);
|
||
|
+ ErrorF(" Rgn: %d %d %d %d\n", prgn->extents.x1, prgn->extents.y1,
|
||
|
+ prgn->extents.x2 - prgn->extents.x1,
|
||
|
+ prgn->extents.y2 - prgn->extents.y1);
|
||
|
+ ErrorF(" Win: %d %d (%d %d) %d %d\n", pWin->origin.x, pWin->origin.y,
|
||
|
+ pWin->winSize.extents.x1, pWin->winSize.extents.y1,
|
||
|
+ pWin->winSize.extents.x2 - pWin->winSize.extents.x1,
|
||
|
+ pWin->winSize.extents.y2 - pWin->winSize.extents.y1);
|
||
|
+ ErrorF(" Draw: %d %d %d %d\n", pWin->drawable.x, pWin->drawable.y,
|
||
|
+ pWin->drawable.width, pWin->drawable.height);
|
||
|
+#endif
|
||
|
+
|
||
|
#ifdef ROOTLESS
|
||
|
if (!drawable || drawable->type == UNDRAWABLE_WINDOW)
|
||
|
return;
|
||
|
+#endif
|
||
|
+
|
||
|
+ if (what == PW_BACKGROUND)
|
||
|
+ {
|
||
|
+#ifdef ROOTLESS
|
||
|
+ if(IsFramedWindow(pWin)) {
|
||
|
+ RootlessStartDrawing(pWin);
|
||
|
+ RootlessDamageRegion(pWin, prgn);
|
||
|
|
||
|
- if (IsFramedWindow(pWin)) {
|
||
|
- RootlessStartDrawing(pWin);
|
||
|
- RootlessDamageRegion(pWin, prgn);
|
||
|
-
|
||
|
- if (pWin->backgroundState == ParentRelative) {
|
||
|
- if ((what == PW_BACKGROUND) ||
|
||
|
- (what == PW_BORDER && !pWin->borderIsPixel))
|
||
|
+ if(pWin->backgroundState == ParentRelative) {
|
||
|
RootlessSetPixmapOfAncestors(pWin);
|
||
|
+ }
|
||
|
}
|
||
|
- }
|
||
|
#endif
|
||
|
|
||
|
- if (what == PW_BACKGROUND) {
|
||
|
while (pWin->backgroundState == ParentRelative)
|
||
|
pWin = pWin->parent;
|
||
|
|
||
|
@@ -559,6 +574,18 @@ miPaintWindow(WindowPtr pWin, RegionPtr prgn, int what)
|
||
|
else {
|
||
|
PixmapPtr pixmap;
|
||
|
|
||
|
+#ifdef ROOTLESS
|
||
|
+ if(IsFramedWindow(pWin)) {
|
||
|
+ RootlessStartDrawing(pWin);
|
||
|
+ RootlessDamageRegion(pWin, prgn);
|
||
|
+
|
||
|
+ if(!pWin->borderIsPixel &&
|
||
|
+ pWin->backgroundState == ParentRelative) {
|
||
|
+ RootlessSetPixmapOfAncestors(pWin);
|
||
|
+ }
|
||
|
+ }
|
||
|
+#endif
|
||
|
+
|
||
|
tile_x_off = drawable->x;
|
||
|
tile_y_off = drawable->y;
|
||
|
|
||
|
@@ -567,6 +594,12 @@ miPaintWindow(WindowPtr pWin, RegionPtr prgn, int what)
|
||
|
return;
|
||
|
pixmap = (*pScreen->GetWindowPixmap) ((WindowPtr) drawable);
|
||
|
drawable = &pixmap->drawable;
|
||
|
+
|
||
|
+#ifdef XQUARTZ_CLIP_DEBUG
|
||
|
+ ErrorF(" Draw: %d %d %d %d\n",
|
||
|
+ drawable->x, drawable->y, drawable->width, drawable->height);
|
||
|
+#endif
|
||
|
+
|
||
|
#ifdef COMPOSITE
|
||
|
draw_x_off = pixmap->screen_x;
|
||
|
draw_y_off = pixmap->screen_y;
|
||
|
@@ -629,6 +662,57 @@ miPaintWindow(WindowPtr pWin, RegionPtr prgn, int what)
|
||
|
ChangeGC(NullClient, pGC, gcmask, gcval);
|
||
|
ValidateGC(drawable, pGC);
|
||
|
|
||
|
+#ifdef XQUARTZ_CLIP_DEBUG
|
||
|
+ ErrorF(" GC: %d %d %d %d\n",
|
||
|
+ pGC->pCompositeClip->extents.x1, pGC->pCompositeClip->extents.y1,
|
||
|
+ pGC->pCompositeClip->extents.x2 - pGC->pCompositeClip->extents.x1,
|
||
|
+ pGC->pCompositeClip->extents.y2 - pGC->pCompositeClip->extents.y1);
|
||
|
+#endif
|
||
|
+
|
||
|
+#ifdef XQUARTZ
|
||
|
+ /* Looks like our clipping isn't set right for some reason:
|
||
|
+ * http://xquartz.macosforge.org/trac/ticket/290
|
||
|
+ */
|
||
|
+ if(what == PW_BORDER) {
|
||
|
+
|
||
|
+#if 0
|
||
|
+ if(solid) {
|
||
|
+#if 1
|
||
|
+ fbFillRegionSolid(&pWin->drawable,
|
||
|
+ prgn,
|
||
|
+ 0,
|
||
|
+ fbReplicatePixel(fill.pixel,
|
||
|
+ pWin->drawable.bitsPerPixel));
|
||
|
+#else
|
||
|
+ fbFillRegionSolid(drawable,
|
||
|
+ prgn,
|
||
|
+ 0,
|
||
|
+ fbReplicatePixel(fill.pixel,
|
||
|
+ drawable->bitsPerPixel));
|
||
|
+#endif
|
||
|
+ return;
|
||
|
+ }
|
||
|
+#endif
|
||
|
+
|
||
|
+ pGC->pCompositeClip->extents.x1 += prgn->extents.x1;
|
||
|
+ pGC->pCompositeClip->extents.y1 += prgn->extents.y1;
|
||
|
+ pGC->pCompositeClip->extents.x2 += prgn->extents.x1;
|
||
|
+ pGC->pCompositeClip->extents.y2 += prgn->extents.y1;
|
||
|
+
|
||
|
+ if(pGC->pCompositeClip->extents.x2 > drawable->pScreen->width)
|
||
|
+ pGC->pCompositeClip->extents.x2 = drawable->pScreen->width;
|
||
|
+ if(pGC->pCompositeClip->extents.y2 > drawable->pScreen->height)
|
||
|
+ pGC->pCompositeClip->extents.y2 = drawable->pScreen->height;
|
||
|
+ }
|
||
|
+#endif
|
||
|
+
|
||
|
+#ifdef XQUARTZ_CLIP_DEBUG
|
||
|
+ ErrorF(" GC: %d %d %d %d\n",
|
||
|
+ pGC->pCompositeClip->extents.x1, pGC->pCompositeClip->extents.y1,
|
||
|
+ pGC->pCompositeClip->extents.x2 - pGC->pCompositeClip->extents.x1,
|
||
|
+ pGC->pCompositeClip->extents.y2 - pGC->pCompositeClip->extents.y1);
|
||
|
+#endif
|
||
|
+
|
||
|
numRects = RegionNumRects(prgn);
|
||
|
pbox = RegionRects(prgn);
|
||
|
for (i = numRects; --i >= 0; pbox++, prect++) {
|
||
|
--
|
||
|
1.8.4.1
|
||
|
|