static RootlessWindowRec * canAccelBlit(DrawablePtr pDraw, GCPtr pGC) { WindowPtr pTop; RootlessWindowRec *winRec; unsigned int pm; if (pGC->alu != GXcopy) return NULL; if (pDraw->type != DRAWABLE_WINDOW) return NULL; pm = ~RootlessAlphaMask(pDraw->bitsPerPixel); if ((pGC->planemask & pm) != pm) return NULL; pTop = TopLevelParent((WindowPtr) pDraw); if (pTop == NULL) return NULL; winRec = WINREC(pTop); if (winRec == NULL) return NULL; return winRec; }
static DWORD DrvFixupStackingOrder(HWND hWndInsertAfter, Window WinAfter, Window win) { XWindowChanges changes; PRIVATEDISPLAY *Disp = GETDP(); Window WinAfterParent, winParent; WinAfterParent = TopLevelParent(WinAfter); winParent = TopLevelParent(win); changes.sibling = winParent; changes.stack_mode = Above; XConfigureWindow(Disp->display, WinAfterParent, CWSibling|CWStackMode, &changes); return 0; }
static void RootlessGetImage(DrawablePtr pDrawable, int sx, int sy, int w, int h, unsigned int format, unsigned long planeMask, char *pdstLine) { ScreenPtr pScreen = pDrawable->pScreen; SCREEN_UNWRAP(pScreen, GetImage); if (pDrawable->type == DRAWABLE_WINDOW) { int x0, y0, x1, y1; RootlessWindowRec *winRec; // Many apps use GetImage to sync with the visible frame buffer // FIXME: entire screen or just window or all screens? RootlessRedisplayScreen(pScreen); // RedisplayScreen stops drawing, so we need to start it again RootlessStartDrawing((WindowPtr)pDrawable); /* Check that we have some place to read from. */ winRec = WINREC(TopLevelParent((WindowPtr) pDrawable)); if (winRec == NULL) goto out; /* Clip to top-level window bounds. */ /* FIXME: fbGetImage uses the width parameter to calculate the stride of the destination pixmap. If w is clipped, the data returned will be garbage, although we will not crash. */ x0 = pDrawable->x + sx; y0 = pDrawable->y + sy; x1 = x0 + w; y1 = y0 + h; x0 = max (x0, winRec->x); y0 = max (y0, winRec->y); x1 = min (x1, winRec->x + winRec->width); y1 = min (y1, winRec->y + winRec->height); sx = x0 - pDrawable->x; sy = y0 - pDrawable->y; w = x1 - x0; h = y1 - y0; if (w <= 0 || h <= 0) goto out; } pScreen->GetImage(pDrawable, sx, sy, w, h, format, planeMask, pdstLine); out: SCREEN_WRAP(pScreen, GetImage); }
static void DRIUpdateSurface(DRIDrawablePrivPtr pDRIDrawablePriv, DrawablePtr pDraw) { xp_window_changes wc; unsigned int flags = 0; if (pDRIDrawablePriv->sid == 0) return; #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1030 wc.depth = (pDraw->bitsPerPixel == 32 ? XP_DEPTH_ARGB8888 : pDraw->bitsPerPixel == 16 ? XP_DEPTH_RGB555 : XP_DEPTH_NIL); if (wc.depth != XP_DEPTH_NIL) flags |= XP_DEPTH; #endif if (pDraw->type == DRAWABLE_WINDOW) { WindowPtr pWin = (WindowPtr)pDraw; WindowPtr pTopWin = TopLevelParent(pWin); wc.x = pWin->drawable.x - (pTopWin->drawable.x - pTopWin->borderWidth); wc.y = pWin->drawable.y - (pTopWin->drawable.y - pTopWin->borderWidth); wc.width = pWin->drawable.width + 2 * pWin->borderWidth; wc.height = pWin->drawable.height + 2 * pWin->borderWidth; wc.bit_gravity = XP_GRAVITY_NONE; wc.shape_nrects = RegionNumRects(&pWin->clipList); wc.shape_rects = RegionRects(&pWin->clipList); wc.shape_tx = -(pTopWin->drawable.x - pTopWin->borderWidth); wc.shape_ty = -(pTopWin->drawable.y - pTopWin->borderWidth); flags |= XP_BOUNDS | XP_SHAPE; } else if (pDraw->type == DRAWABLE_PIXMAP) { wc.x = 0; wc.y = 0; wc.width = pDraw->width; wc.height = pDraw->height; wc.bit_gravity = XP_GRAVITY_NONE; flags |= XP_BOUNDS; } xp_configure_surface(pDRIDrawablePriv->sid, flags, &wc); }