static Bool _glamor_copy_plane(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, int srcx, int srcy, int w, int h, int dstx, int dsty, unsigned long bitPlane, RegionPtr *pRegion, Bool fallback) { if (!fallback && glamor_ddx_fallback_check_gc(pGC) && glamor_ddx_fallback_check_pixmap(pSrc) && glamor_ddx_fallback_check_pixmap(pDst)) goto fail; if (glamor_prepare_access(pDst, GLAMOR_ACCESS_RW) && glamor_prepare_access(pSrc, GLAMOR_ACCESS_RO) && glamor_prepare_access_gc(pGC)) { *pRegion = fbCopyPlane(pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty, bitPlane); } glamor_finish_access_gc(pGC); glamor_finish_access(pSrc); glamor_finish_access(pDst); return TRUE; fail: return FALSE; }
Bool glamor_put_image_nf(DrawablePtr drawable, GCPtr gc, int depth, int x, int y, int w, int h, int leftPad, int format, char *bits) { if (glamor_put_image_gl(drawable, gc, depth, x, y, w, h, leftPad, format, bits)) return TRUE; if (glamor_ddx_fallback_check_pixmap(drawable) && glamor_ddx_fallback_check_gc(gc)) return FALSE; glamor_put_image_bail(drawable, gc, depth, x, y, w, h, leftPad, format, bits); return TRUE; }
/** @file glamor_fillspans.c * * GC fill implementation, based loosely on fb_fill.c */ Bool glamor_fill(DrawablePtr drawable, GCPtr gc, int x, int y, int width, int height, Bool fallback) { PixmapPtr dst_pixmap = glamor_get_drawable_pixmap(drawable); int off_x, off_y; PixmapPtr sub_pixmap = NULL; glamor_access_t sub_pixmap_access; DrawablePtr saved_drawable = NULL; int saved_x = x, saved_y = y; glamor_get_drawable_deltas(drawable, dst_pixmap, &off_x, &off_y); switch (gc->fillStyle) { case FillSolid: if (!glamor_solid(dst_pixmap, x + off_x, y + off_y, width, height, gc->alu, gc->planemask, gc->fgPixel)) goto fail; break; case FillStippled: case FillOpaqueStippled: if (!glamor_stipple(dst_pixmap, gc->stipple, x + off_x, y + off_y, width, height, gc->alu, gc->planemask, gc->fgPixel, gc->bgPixel, gc->patOrg.x, gc->patOrg.y)) goto fail; break; case FillTiled: if (!glamor_tile(dst_pixmap, gc->tile.pixmap, x + off_x, y + off_y, width, height, gc->alu, gc->planemask, x - drawable->x - gc->patOrg.x, y - drawable->y - gc->patOrg.y)) goto fail; break; } return TRUE; fail: if (!fallback) { if (glamor_ddx_fallback_check_pixmap(&dst_pixmap->drawable) && glamor_ddx_fallback_check_gc(gc)) return FALSE; } /* Is it possible to set the access as WO? */ sub_pixmap_access = GLAMOR_ACCESS_RW; sub_pixmap = glamor_get_sub_pixmap(dst_pixmap, x + off_x, y + off_y, width, height, sub_pixmap_access); if (sub_pixmap != NULL) { if (gc->fillStyle != FillSolid) { gc->patOrg.x += (drawable->x - x); gc->patOrg.y += (drawable->y - y); } saved_drawable = drawable; drawable = &sub_pixmap->drawable; saved_x = x; saved_y = y; x = 0; y = 0; } if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RW)) { if (glamor_prepare_access_gc(gc)) { fbFill(drawable, gc, x, y, width, height); glamor_finish_access_gc(gc); } glamor_finish_access(drawable, GLAMOR_ACCESS_RW); } if (sub_pixmap != NULL) { if (gc->fillStyle != FillSolid) { gc->patOrg.x -= (saved_drawable->x - saved_x); gc->patOrg.y -= (saved_drawable->y - saved_y); } x = saved_x; y = saved_y; glamor_put_sub_pixmap(sub_pixmap, dst_pixmap, x + off_x, y + off_y, width, height, sub_pixmap_access); } return TRUE; }