static void VMWAREGetImage(DrawablePtr src, int x, int y, int w, int h, unsigned int format, unsigned long planeMask, char *pBinImage) { ScreenPtr pScreen = src->pScreen; VMWAREPtr pVMWARE = VMWAREPTR(infoFromScreen(src->pScreen)); BoxRec box; Bool hidden = FALSE; VmwareLog(("VMWAREGetImage(%p, %d, %d, %d, %d, %d, %d, %p)\n", src, x, y, w, h, format, planeMask, pBinImage)); box.x1 = src->x + x; box.y1 = src->y + y; box.x2 = box.x1 + w; box.y2 = box.y1 + h; if (BOX_INTERSECT(box, pVMWARE->hwcur.box)) { PRE_OP_HIDE_CURSOR(); hidden = TRUE; } pScreen->GetImage = pVMWARE->ScrnFuncs.GetImage; (*pScreen->GetImage)(src, x, y, w, h, format, planeMask, pBinImage); pScreen->GetImage = VMWAREGetImage; if (hidden) { POST_OP_SHOW_CURSOR(); } }
static void VMWARECopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc) { ScreenPtr pScreen = pWin->drawable.pScreen; VMWAREPtr pVMWARE = VMWAREPTR(infoFromScreen(pWin->drawable.pScreen)); BoxPtr pBB; Bool hidden = FALSE; /* * We only worry about the source region here, since shadowfb will * take care of the destination region. */ pBB = REGION_EXTENTS(pWin->drawable.pScreen, prgnSrc); VmwareLog(("VMWARECopyWindow(%p, (%d, %d), (%d, %d - %d, %d)\n", pWin, ptOldOrg.x, ptOldOrg.y, pBB->x1, pBB->y1, pBB->x2, pBB->y2)); if (BOX_INTERSECT(*pBB, pVMWARE->hwcur.box)) { PRE_OP_HIDE_CURSOR(); hidden = TRUE; } pScreen->CopyWindow = pVMWARE->ScrnFuncs.CopyWindow; (*pScreen->CopyWindow)(pWin, ptOldOrg, prgnSrc); pScreen->CopyWindow = VMWARECopyWindow; if (hidden) { POST_OP_SHOW_CURSOR(); } }
static Bool vmwareUseHWCursorARGB(ScreenPtr pScreen, CursorPtr pCurs) { ScrnInfoPtr pScrn = infoFromScreen(pScreen); return pCurs->bits->height <= MAX_CURS && pCurs->bits->width <= MAX_CURS && pScrn->bitsPerPixel > 8; }
static Bool vmwareUseHWCursor(ScreenPtr pScreen, CursorPtr pCurs) { ScrnInfoPtr pScrn = infoFromScreen(pScreen); VMWAREPtr pVMWARE = VMWAREPTR(pScrn); pVMWARE->hwcur.hotX = pCurs->bits->xhot; pVMWARE->hwcur.hotY = pCurs->bits->yhot; return pScrn->bitsPerPixel > 8; }
Bool vmwareCursorInit(ScreenPtr pScreen) { xf86CursorInfoPtr infoPtr; VMWAREPtr pVMWARE = VMWAREPTR(infoFromScreen(pScreen)); Bool ret; TRACEPOINT /* Require cursor bypass for hwcursor. Ignore deprecated FIFO hwcursor */ if (!(pVMWARE->vmwareCapability & SVGA_CAP_CURSOR_BYPASS)) { return FALSE; } infoPtr = xf86CreateCursorInfoRec(); if (!infoPtr) return FALSE; pVMWARE->CursorInfoRec = infoPtr; infoPtr->MaxWidth = MAX_CURS; infoPtr->MaxHeight = MAX_CURS; infoPtr->Flags = HARDWARE_CURSOR_BIT_ORDER_MSBFIRST | HARDWARE_CURSOR_SOURCE_MASK_NOT_INTERLEAVED; infoPtr->SetCursorColors = vmwareSetCursorColors; infoPtr->SetCursorPosition = vmwareSetCursorPosition; infoPtr->LoadCursorImage = vmwareLoadCursorImage; infoPtr->HideCursor = vmwareHideCursor; infoPtr->ShowCursor = vmwareShowCursor; infoPtr->UseHWCursor = vmwareUseHWCursor; #ifdef ARGB_CURSOR if (pVMWARE->vmwareCapability & SVGA_CAP_ALPHA_CURSOR) { infoPtr->UseHWCursorARGB = vmwareUseHWCursorARGB; infoPtr->LoadCursorARGB = vmwareLoadCursorARGB; } #endif ret = xf86InitCursor(pScreen, infoPtr); if (!ret) { xf86DestroyCursorInfoRec(infoPtr); pVMWARE->CursorInfoRec = NULL; } return ret; }
void vmwareCursorCloseScreen(ScreenPtr pScreen) { ScrnInfoPtr pScrn = infoFromScreen(pScreen); VMWAREPtr pVMWARE = VMWAREPTR(pScrn); #ifdef RENDER PictureScreenPtr ps = GetPictureScreenIfSet(pScreen); #endif pScreen->GetImage = pVMWARE->ScrnFuncs.GetImage; pScreen->CopyWindow = pVMWARE->ScrnFuncs.CopyWindow; #ifdef RENDER if (ps) { ps->Composite = pVMWARE->Composite; } #endif /* RENDER */ vmwareHideCursor(pScrn); xf86DestroyCursorInfoRec(pVMWARE->CursorInfoRec); }
static void VMWAREComposite(CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst, INT16 xSrc, INT16 ySrc, INT16 xMask, INT16 yMask, INT16 xDst, INT16 yDst, CARD16 width, CARD16 height) { ScreenPtr pScreen = pDst->pDrawable->pScreen; VMWAREPtr pVMWARE = VMWAREPTR(infoFromScreen(pScreen)); PictureScreenPtr ps = GetPictureScreen(pScreen); BoxRec box; Bool hidden = FALSE; VmwareLog(("VMWAREComposite op = %d, pSrc = %p, pMask = %p, pDst = %p," " src = (%d, %d), mask = (%d, %d), dst = (%d, %d), w = %d," " h = %d\n", op, pSrc, pMask, pDst, xSrc, ySrc, xMask, yMask, xDst, yDst, width, height)); /* * We only worry about the source region here, since shadowfb or XAA will * take care of the destination region. */ box.x1 = pSrc->pDrawable->x + xSrc; box.y1 = pSrc->pDrawable->y + ySrc; box.x2 = box.x1 + width; box.y2 = box.y1 + height; if (BOX_INTERSECT(box, pVMWARE->hwcur.box)) { PRE_OP_HIDE_CURSOR(); hidden = TRUE; } ps->Composite = pVMWARE->Composite; (*ps->Composite)(op, pSrc, pMask, pDst, xSrc, ySrc, xMask, yMask, xDst, yDst, width, height); ps->Composite = VMWAREComposite; if (hidden) { POST_OP_SHOW_CURSOR(); } }
void vmwareCursorHookWrappers(ScreenPtr pScreen) { VMWAREPtr pVMWARE = VMWAREPTR(infoFromScreen(pScreen)); #ifdef RENDER PictureScreenPtr ps = GetPictureScreenIfSet(pScreen); #endif TRACEPOINT pVMWARE->ScrnFuncs.GetImage = pScreen->GetImage; pVMWARE->ScrnFuncs.CopyWindow = pScreen->CopyWindow; pScreen->GetImage = VMWAREGetImage; pScreen->CopyWindow = VMWARECopyWindow; #ifdef RENDER if (ps) { pVMWARE->Composite = ps->Composite; ps->Composite = VMWAREComposite; } #endif /* RENDER */ }