VOID defineCursorVMWareSVGA(struct HWData *data, struct MouseData *mouse) { int i; ULONG *cshape = mouse->shape; struct Box box; ULONG andmask[SVGA_PIXMAP_SIZE(mouse->width, mouse->height, data->bitsperpixel)]; ULONG *a; ULONG *b; #warning "convert mouse shape to current depth" writeVMWareSVGAFIFO(data, SVGA_CMD_DEFINE_CURSOR); writeVMWareSVGAFIFO(data, 1); writeVMWareSVGAFIFO(data, 0); /* hot x value */ writeVMWareSVGAFIFO(data, 0); /* hot y value */ writeVMWareSVGAFIFO(data, mouse->width); /* width */ writeVMWareSVGAFIFO(data, mouse->height); /* height */ writeVMWareSVGAFIFO(data, data->bitsperpixel); /* bits per pixel */ writeVMWareSVGAFIFO(data, data->bitsperpixel); /* bits per pixel */ b = cshape; a = andmask; for (i = 0; i<(SVGA_PIXMAP_SIZE(mouse->width, mouse->height, data->bitsperpixel)*2);i++) { *((UWORD *)a) = *((UWORD *)b) ? 0 : ~0; a = ((UWORD *)a) + 1; b = ((UWORD *)b) + 1; } a = andmask; for (i = 0; i<SVGA_PIXMAP_SIZE(mouse->width, mouse->height, data->bitsperpixel);i++) writeVMWareSVGAFIFO(data, *a++); for (i = 0; i<SVGA_PIXMAP_SIZE(mouse->width, mouse->height, data->bitsperpixel);i++) writeVMWareSVGAFIFO(data, *cshape++); syncVMWareSVGAFIFO(data); }
static void RedefineCursor(VMWAREPtr pVMWARE) { int i; VmwareLog(("RedefineCursor\n")); pVMWARE->cursorDefined = FALSE; /* Define cursor */ vmwareWriteWordToFIFO(pVMWARE, SVGA_CMD_DEFINE_CURSOR); vmwareWriteWordToFIFO(pVMWARE, MOUSE_ID); vmwareWriteWordToFIFO(pVMWARE, 0); /* HotX/HotY seem to be zero? */ vmwareWriteWordToFIFO(pVMWARE, 0); /* HotX/HotY seem to be zero? */ vmwareWriteWordToFIFO(pVMWARE, pVMWARE->CursorInfoRec->MaxWidth); vmwareWriteWordToFIFO(pVMWARE, pVMWARE->CursorInfoRec->MaxHeight); vmwareWriteWordToFIFO(pVMWARE, 1); vmwareWriteWordToFIFO(pVMWARE, pVMWARE->bitsPerPixel); /* * Since we have AND and XOR masks rather than 'source' and 'mask', * color expand 'mask' with all zero as its foreground and all one as * its background. This makes 'image & 0 ^ 'source' = source. We * arange for 'image' & 1 ^ 'source' = 'image' below when we clip * 'source' below. */ vmwareRaster_BitsToPixels((uint8 *) pVMWARE->hwcur.mask, SVGA_BITMAP_INCREMENT(pVMWARE->CursorInfoRec->MaxWidth), (uint8 *) pVMWARE->hwcur.maskPixmap, SVGA_PIXMAP_INCREMENT(pVMWARE->CursorInfoRec->MaxWidth, pVMWARE->bitsPerPixel), pVMWARE->bitsPerPixel / 8, pVMWARE->CursorInfoRec->MaxWidth, pVMWARE->CursorInfoRec->MaxHeight, 0, ~0); for (i = 0; i < SVGA_BITMAP_SIZE(pVMWARE->CursorInfoRec->MaxWidth, pVMWARE->CursorInfoRec->MaxHeight); i++) { vmwareWriteWordToFIFO(pVMWARE, ~pVMWARE->hwcur.mask[i]); } vmwareRaster_BitsToPixels((uint8 *) pVMWARE->hwcur.source, SVGA_BITMAP_INCREMENT(pVMWARE->CursorInfoRec->MaxWidth), (uint8 *) pVMWARE->hwcur.sourcePixmap, SVGA_PIXMAP_INCREMENT(pVMWARE->CursorInfoRec->MaxWidth, pVMWARE->bitsPerPixel), pVMWARE->bitsPerPixel / 8, pVMWARE->CursorInfoRec->MaxWidth, pVMWARE->CursorInfoRec->MaxHeight, pVMWARE->hwcur.fg, pVMWARE->hwcur.bg); /* * As pointed out above, we need to clip the expanded 'source' against * the expanded 'mask' since we actually have AND and XOR masks in the * virtual hardware. Effectively, 'source' becomes a three color fg/bg/0 * pixmap that XORs appropriately. */ for (i = 0; i < SVGA_PIXMAP_SIZE(pVMWARE->CursorInfoRec->MaxWidth, pVMWARE->CursorInfoRec->MaxHeight, pVMWARE->bitsPerPixel); i++) { pVMWARE->hwcur.sourcePixmap[i] &= ~pVMWARE->hwcur.maskPixmap[i]; vmwareWriteWordToFIFO(pVMWARE, pVMWARE->hwcur.sourcePixmap[i]); } /* Sync the FIFO, so that the definition preceeds any use of the cursor */ vmwareWaitForFB(pVMWARE); pVMWARE->cursorDefined = TRUE; }