VBoxDispMouse.cpp revision b0a3d0ec5780199a2f379da63c59ccf48f1a73b9
/* $Id$ */
/** @file
* VBox XPDM Display driver, mouse pointer related functions
*/
/*
* Copyright (C) 2011 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
#include "VBoxDisp.h"
#include "VBoxDispMini.h"
{
ULONG x, y;
LOGF_ENTER();
/* truncate masks if we exceed size supported by miniport */
/* copy AND mask */
{
}
/* convert XOR mask to RGB0 DIB, it start in pAttrs->Pixels should be 4bytes aligned */
{
{
*(ULONG*)&pDst[y*dstBytesPerLine+x*4] = (pSrc[y*psoMask->lDelta+x/8] & RT_BIT(bit)) ? 0x00FFFFFF : 0;
}
}
LOGF_LEAVE();
return TRUE;
}
static SURFOBJ *VBoxDispConvSurfTo32BPP(PVBOXDISPDEV pDev, SURFOBJ *psoScreen, SURFOBJ *psoSrc, XLATEOBJ *pxlo, HSURF *phDstSurf)
{
{
LOG(("no convertion needed"));
return psoSrc;
}
/* Convert src surface */
{
LOG(("Converting color surface to bitmap"));
/* Convert unknown format surface to screen format bitmap */
hSurfBitmap = (HSURF) EngCreateBitmap(psoSrc->sizlBitmap, 0, psoScreen->iBitmapFormat, BMF_TOPDOWN, NULL);
if (!hSurfBitmap)
{
WARN(("EngCreateBitmap for tmp surface failed"));
return NULL;
}
if (!psoBitmap)
{
WARN(("EngLockSurface for tmp surface failed"));
return NULL;
}
ptlSrc.x = 0;
ptlSrc.y = 0;
{
WARN(("EngCopyBits failed"));
return NULL;
}
}
else
{
}
/* Allocate result surface */
if (!hSurfRes)
{
WARN(("EngCreateBitmap for res surface failed"));
if (hSurfBitmap)
{
}
return NULL;
}
if (!psoRes)
{
WARN(("EngLockSurface for res surface failed"));
if (hSurfBitmap)
{
}
return NULL;
}
/* Convert known fromats src surface to 32bpp */
ULONG x, y;
{
LOG(("BMF_8BPP"));
{
{
}
}
}
{
LOG(("BMF_16BPP"));
{
{
}
}
}
{
LOG(("BMF_24BPP"));
{
{
}
}
}
{
LOG(("BMF_32BPP"));
}
else
{
WARN(("unsupported bpp"));
if (hSurfBitmap)
{
}
return NULL;
}
/* cleanup tmp surface */
if (hSurfBitmap)
{
}
return psoRes;
}
static BOOL VBoxDispFillColorShape(PVBOXDISPDEV pDev, SURFOBJ *psoScreen, SURFOBJ *psoMask, SURFOBJ *psoColor,
{
ULONG x, y;
LOGF_ENTER();
/* truncate masks if we exceed size supported by miniport */
{
LOG(("SPS_ALPHA"));
/* Construct AND mask from alpha color channel */
{
{
{
}
}
}
}
else
{
LOG(("Surface mask"));
if (!psoMask)
{
WARN(("!psoMask"));
return FALSE;
}
/* copy AND mask */
{
}
if (!pso32bpp)
{
WARN(("failed to convert to 32bpp"));
return FALSE;
}
}
/* copy 32bit bitmap to XOR DIB in pAttrs->pixels, it start there should be 4bytes aligned */
{
}
/* deallocate temp surface */
if (hSurf32bpp)
{
}
LOGF_LEAVE();
return TRUE;
}
{
int rc;
{
}
return VINF_SUCCESS;
}
{
/* We have no idea what bpp would have pointer glyph DIBs,
* so make sure it's enough to fit largest one.
*/
{
}
else
{
}
/* VIDEO_POINTER_ATTRIBUTES followed by data and mask DIBs.*/
pDev->pointer.cbAttrs = sizeof(VIDEO_POINTER_ATTRIBUTES) + 2*(pDev->pointer.caps.MaxHeight*bytesPerLine);
pDev->pointer.pAttrs = (PVIDEO_POINTER_ATTRIBUTES) EngAllocMem(0, pDev->pointer.cbAttrs, MEM_ALLOC_TAG);
{
return VERR_NO_MEMORY;
}
return VINF_SUCCESS;
}
/*
* Display driver callbacks.
*/
{
int rc;
LOGF_ENTER();
/* For NT4 offset pointer position by display origin in virtual desktop */
if (-1==x) /* hide pointer */
{
}
else
{
}
LOGF_LEAVE();
return;
}
{
int rc;
LOGF_ENTER();
/* sanity check */
{
WARN(("pDev->pointer.pAttrs == NULL"));
return SPS_ERROR;
}
/* Check if we've been requested to make pointer transparent */
{
LOG(("SPS_ALPHA"));
return SPS_ACCEPT_NOEXCLUDE;
}
/* Fill data and mask DIBs to pass to miniport driver */
LOG(("pso=%p, psoMask=%p, psoColor=%p, pxlo=%p, hot=%i,%i xy=%i,%i fl=%#x",
if (psoMask)
{
}
if (psoColor)
{
}
if (!psoColor) /* Monochrome pointer */
{
{
return SPS_DECLINE;
}
}
else /* Color pointer */
{
{
return SPS_DECLINE;
}
}
/* Fill position and enable bits to pass to miniport driver.
* Note: pDev->pointer.pAttrs->Enable is also used to pass hotspot coordinates in it's high word
* to miniport driver.
*/
if (x!=-1)
{
}
{
}
/* Update Flags */
if (fl & SPS_ANIMATESTART)
{
}
else if (fl & SPS_ANIMATEUPDATE)
{
}
{
WARN(("asked for mousetrail without GCAPS2_MOUSETRAILS"));
}
/* Pass attributes to miniport */
if (RT_FAILURE(rc))
{
return SPS_DECLINE;
}
/* Move pointer to requested position */
if (x!=-1)
{
}
LOGF_LEAVE();
return SPS_ACCEPT_NOEXCLUDE;
}