Merge remote branch 'origin/master' into paint-window

Conflicts:

	mi/miexpose.c
This commit is contained in:
Eric Anholt 2007-09-13 00:15:45 +00:00
commit b9f7aeb200

View File

@ -539,64 +539,85 @@ miPaintWindow(WindowPtr pWin, RegionPtr prgn, int what)
ScreenPtr pScreen = pWin->drawable.pScreen; ScreenPtr pScreen = pWin->drawable.pScreen;
ChangeGCVal gcval[5]; ChangeGCVal gcval[5];
BITS32 gcmask; BITS32 gcmask;
PixmapPtr pPixmap;
GCPtr pGC; GCPtr pGC;
int i; int i;
BoxPtr pbox; BoxPtr pbox;
xRectangle *prect; xRectangle *prect;
int numRects; int numRects;
int xoff, yoff; /*
* Distance from screen to destination drawable, use this
pPixmap = (*pScreen->GetWindowPixmap) (pWin); * to adjust rendering coordinates which come in in screen space
*/
#ifdef COMPOSITE int draw_x_off, draw_y_off;
xoff = -pPixmap->screen_x; /*
yoff = -pPixmap->screen_y; * Tile offset for drawing; these need to align the tile
#else * to the appropriate window origin
xoff = 0; */
yoff = 0; int tile_x_off, tile_y_off;
#endif PixUnion fill;
gcval[0].val = GXcopy; Bool solid = TRUE;
gcmask = GCFunction; DrawablePtr drawable = &pWin->drawable;
if (what == PW_BACKGROUND) if (what == PW_BACKGROUND)
{ {
while (pWin->backgroundState == ParentRelative) while (pWin->backgroundState == ParentRelative)
pWin = pWin->parent; pWin = pWin->parent;
draw_x_off = drawable->x;
draw_y_off = drawable->y;
tile_x_off = 0;
tile_y_off = 0;
fill = pWin->background;
switch (pWin->backgroundState) { switch (pWin->backgroundState) {
case None: case None:
return; return;
case BackgroundPixel:
gcval[1].val = pWin->background.pixel;
gcval[2].val = FillSolid;
gcmask |= GCForeground | GCFillStyle;
break;
case BackgroundPixmap: case BackgroundPixmap:
gcval[1].val = FillTiled; solid = FALSE;
gcval[2].ptr = (pointer)pWin->background.pixmap;
gcval[3].val = pWin->drawable.x + xoff;
gcval[4].val = pWin->drawable.y + yoff;
gcmask |= GCFillStyle | GCTile | GCTileStipXOrigin | GCTileStipYOrigin;
break; break;
} }
} }
else else
{ {
if (pWin->borderIsPixel) PixmapPtr pixmap;
{
gcval[1].val = pWin->border.pixel; tile_x_off = drawable->x;
gcval[2].val = FillSolid; tile_y_off = drawable->y;
gcmask |= GCForeground | GCFillStyle;
} /* servers without pixmaps draw their own borders */
else if (!pScreen->GetWindowPixmap)
{ return;
gcval[1].val = FillTiled; pixmap = (*pScreen->GetWindowPixmap) ((WindowPtr) drawable);
gcval[2].ptr = (pointer)pWin->border.pixmap; drawable = &pixmap->drawable;
gcval[3].val = pWin->drawable.x + xoff; #ifdef COMPOSITE
gcval[4].val = pWin->drawable.y + yoff; draw_x_off = pixmap->screen_x;
gcmask |= GCFillStyle | GCTile | GCTileStipXOrigin | GCTileStipYOrigin; draw_y_off = pixmap->screen_y;
} tile_x_off -= draw_x_off;
tile_y_off -= draw_y_off;
#else
draw_x_off = 0;
draw_y_off = 0;
#endif
fill = pWin->border;
solid = pWin->borderIsPixel;
}
gcval[0].val = GXcopy;
gcmask = GCFunction;
if (solid)
{
gcval[1].val = fill.pixel;
gcval[2].val = FillSolid;
gcmask |= GCForeground | GCFillStyle;
}
else
{
gcval[1].val = FillTiled;
gcval[2].ptr = (pointer)fill.pixmap;
gcval[3].val = tile_x_off;
gcval[4].val = tile_y_off;
gcmask |= GCFillStyle | GCTile | GCTileStipXOrigin | GCTileStipYOrigin;
} }
prect = (xRectangle *)ALLOCATE_LOCAL(REGION_NUM_RECTS(prgn) * prect = (xRectangle *)ALLOCATE_LOCAL(REGION_NUM_RECTS(prgn) *
@ -604,27 +625,27 @@ miPaintWindow(WindowPtr pWin, RegionPtr prgn, int what)
if (!prect) if (!prect)
return; return;
pGC = GetScratchGC(pPixmap->drawable.depth, pPixmap->drawable.pScreen); pGC = GetScratchGC(drawable->depth, drawable->pScreen);
if (!pGC) if (!pGC)
{ {
DEALLOCATE_LOCAL(prect); DEALLOCATE_LOCAL(prect);
return; return;
} }
dixChangeGC(NullClient, pGC, gcmask, NULL, gcval); dixChangeGC (NullClient, pGC, gcmask, NULL, gcval);
ValidateGC(&pPixmap->drawable, pGC); ValidateGC (drawable, pGC);
numRects = REGION_NUM_RECTS(prgn); numRects = REGION_NUM_RECTS(prgn);
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 + xoff; prect->x = pbox->x1 - draw_x_off;
prect->y = pbox->y1 + yoff; 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;
} }
prect -= numRects; prect -= numRects;
(*pGC->ops->PolyFillRect)(&pPixmap->drawable, pGC, numRects, prect); (*pGC->ops->PolyFillRect)(drawable, pGC, numRects, prect);
DEALLOCATE_LOCAL(prect); DEALLOCATE_LOCAL(prect);
FreeScratchGC(pGC); FreeScratchGC(pGC);