Try again to fix drawable and tile offsets in miPaintWindow

Many coordinate spaces are hard. Let's go drinking.
This commit is contained in:
Keith Packard 2007-09-12 23:57:30 +01:00
parent dd3992eb86
commit 06d27f8045

View File

@ -592,22 +592,30 @@ miPaintWindow(WindowPtr pWin, RegionPtr prgn, int what)
BoxPtr pbox; BoxPtr pbox;
xRectangle *prect; xRectangle *prect;
int numRects; int numRects;
int tile_x_off = 0, tile_y_off = 0; /*
int draw_x_off = 0, draw_y_off = 0; * Distance from screen to destination drawable, use this
* to adjust rendering coordinates which come in in screen space
*/
int draw_x_off, draw_y_off;
/*
* Tile offset for drawing; these need to align the tile
* to the appropriate window origin
*/
int tile_x_off, tile_y_off;
PixUnion fill; PixUnion fill;
Bool solid = TRUE; Bool solid = TRUE;
DrawablePtr drawable = &pWin->drawable; DrawablePtr drawable = &pWin->drawable;
draw_x_off = pWin->drawable.x;
draw_y_off = pWin->drawable.y;
while (pWin->backgroundState == ParentRelative) while (pWin->backgroundState == ParentRelative)
pWin = pWin->parent; pWin = pWin->parent;
if (what == PW_BACKGROUND) if (what == PW_BACKGROUND)
{ {
tile_x_off = -pWin->drawable.x; draw_x_off = drawable->x;
tile_y_off = -pWin->drawable.y; draw_y_off = drawable->y;
tile_x_off = 0;
tile_y_off = 0;
fill = pWin->background; fill = pWin->background;
switch (pWin->backgroundState) { switch (pWin->backgroundState) {
case None: case None:
@ -619,16 +627,21 @@ miPaintWindow(WindowPtr pWin, RegionPtr prgn, int what)
} }
else else
{ {
PixmapPtr pPixmap; PixmapPtr pixmap;
tile_x_off = drawable->x;
tile_y_off = drawable->y;
/* servers without pixmaps draw their own borders */ /* servers without pixmaps draw their own borders */
if (!pScreen->GetWindowPixmap) if (!pScreen->GetWindowPixmap)
return; return;
pPixmap = (*pScreen->GetWindowPixmap) (pWin); pixmap = (*pScreen->GetWindowPixmap) ((WindowPtr) drawable);
drawable = &pPixmap->drawable; drawable = &pixmap->drawable;
#ifdef COMPOSITE #ifdef COMPOSITE
draw_x_off = -pPixmap->screen_x; draw_x_off = pixmap->screen_x;
draw_y_off = -pPixmap->screen_y; draw_y_off = pixmap->screen_y;
tile_x_off -= draw_x_off;
tile_y_off -= draw_y_off;
#else #else
draw_x_off = 0; draw_x_off = 0;
draw_y_off = 0; draw_y_off = 0;
@ -650,8 +663,8 @@ miPaintWindow(WindowPtr pWin, RegionPtr prgn, int what)
{ {
gcval[1].val = FillTiled; gcval[1].val = FillTiled;
gcval[2].ptr = (pointer)fill.pixmap; gcval[2].ptr = (pointer)fill.pixmap;
gcval[3].val = tile_x_off + draw_x_off; gcval[3].val = tile_x_off;
gcval[4].val = tile_y_off + draw_y_off; gcval[4].val = tile_y_off;
gcmask |= GCFillStyle | GCTile | GCTileStipXOrigin | GCTileStipYOrigin; gcmask |= GCFillStyle | GCTile | GCTileStipXOrigin | GCTileStipYOrigin;
} }
@ -674,8 +687,8 @@ miPaintWindow(WindowPtr pWin, RegionPtr prgn, int what)
pbox = REGION_RECTS(prgn); pbox = REGION_RECTS(prgn);
for (i= numRects; --i >= 0; pbox++, prect++) for (i= numRects; --i >= 0; pbox++, prect++)
{ {
prect->x = pbox->x1 + draw_x_off; prect->x = pbox->x1 - draw_x_off;
prect->y = pbox->y1 + draw_y_off; prect->y = pbox->y1 - draw_y_off;
prect->width = pbox->x2 - pbox->x1; prect->width = pbox->x2 - pbox->x1;
prect->height = pbox->y2 - pbox->y1; prect->height = pbox->y2 - pbox->y1;
} }