diff options
author | Sandy Stutsman <sstutsma@redhat.com> | 2015-12-04 11:25:09 -0500 |
---|---|---|
committer | Sandy Stutsman <sstutsma@redhat.com> | 2015-12-10 12:56:38 -0500 |
commit | 494f3b838105071ef47a80895a46ff9378e2ce93 (patch) | |
tree | e879740eae4154eebba538a073ac343818659b99 | |
parent | fb369d5649e5e09cde2d4dc925f217825ffcce40 (diff) |
Enable HW cursor support and fix handling of monochrome cursors.
* Turn on enable pointer
* Allow for 1bpp bitmap followed by 1bpp XOR map.
-rwxr-xr-x | qxldod/QxlDod.cpp | 19 | ||||
-rwxr-xr-x | qxldod/QxlDod.h | 2 |
2 files changed, 12 insertions, 9 deletions
diff --git a/qxldod/QxlDod.cpp b/qxldod/QxlDod.cpp index ff987c4..3139092 100755 --- a/qxldod/QxlDod.cpp +++ b/qxldod/QxlDod.cpp @@ -4383,6 +4383,7 @@ NTSTATUS QxlDevice::SetPointerShape(_In_ CONST DXGKARG_SETPOINTERSHAPE* pSetPoi UINT8 *now;
UINT8 *end;
int line_size;
+ int num_images = 1;
cursor_cmd = CursorCmd();
cursor_cmd->type = QXL_CURSOR_SET;
@@ -4405,16 +4406,17 @@ NTSTATUS QxlDevice::SetPointerShape(_In_ CONST DXGKARG_SETPOINTERSHAPE* pSetPoi cursor->header.width = (UINT16)pSetPointerShape->Width;
cursor->header.height = (UINT16)pSetPointerShape->Height;
if (cursor->header.type == SPICE_CURSOR_TYPE_MONO) {
- cursor->header.height >>= 1;
line_size = ALIGN(cursor->header.width, 8) >> 3;
+ cursor->data_size = line_size * pSetPointerShape->Height * 2;
+ num_images = 2;
} else {
line_size = cursor->header.width << 2;
+ cursor->data_size = line_size * pSetPointerShape->Height;
}
cursor->header.hot_spot_x = (UINT16)pSetPointerShape->XHot;
cursor->header.hot_spot_y = (UINT16)pSetPointerShape->YHot;
- cursor->data_size = line_size * pSetPointerShape->Height;
DbgPrint(TRACE_LEVEL_INFORMATION, ("<--> %s %d::%d::%d::%d::%d\n", __FUNCTION__, cursor->header.width, cursor->header.height, cursor->header.hot_spot_x, cursor->header.hot_spot_y, cursor->data_size));
chunk = &cursor->chunk;
@@ -4426,7 +4428,7 @@ NTSTATUS QxlDevice::SetPointerShape(_In_ CONST DXGKARG_SETPOINTERSHAPE* pSetPoi now = chunk->data;
end = (UINT8 *)res + CURSOR_ALLOC_SIZE;
- src_end = src + (pSetPointerShape->Pitch * pSetPointerShape->Height);
+ src_end = src + (pSetPointerShape->Pitch * pSetPointerShape->Height * num_images);
for (; src != src_end; src += pSetPointerShape->Pitch) {
PutBytesAlign(&chunk, &now, &end, src, line_size,
PAGE_SIZE, 1);
@@ -4449,14 +4451,15 @@ NTSTATUS QxlDevice::SetPointerPosition(_In_ CONST DXGKARG_SETPOINTERPOSITION* pS pSetPointerPosition->VidPnSourceId,
pSetPointerPosition->X,
pSetPointerPosition->Y));
- if (EnablePointer()) {
+ if (!EnablePointer()) {
QXLCursorCmd *cursor_cmd = CursorCmd();
if (pSetPointerPosition->X < 0) {
cursor_cmd->type = QXL_CURSOR_HIDE;
- } else {
- cursor_cmd->type = QXL_CURSOR_MOVE;
- cursor_cmd->u.position.x = (INT16)pSetPointerPosition->X;
- cursor_cmd->u.position.y = (INT16)pSetPointerPosition->Y;
+ }
+ else {
+ cursor_cmd->type = QXL_CURSOR_MOVE;
+ cursor_cmd->u.position.x = (INT16) pSetPointerPosition->X;
+ cursor_cmd->u.position.y = (INT16) pSetPointerPosition->Y;
}
PushCursorCmd(cursor_cmd);
}
diff --git a/qxldod/QxlDod.h b/qxldod/QxlDod.h index 8ecae19..9bc0bdb 100755 --- a/qxldod/QxlDod.h +++ b/qxldod/QxlDod.h @@ -462,7 +462,7 @@ public: NTSTATUS SetPowerState(DEVICE_POWER_STATE DevicePowerState, DXGK_DISPLAY_INFORMATION* pDispInfo);
NTSTATUS HWInit(PCM_RESOURCE_LIST pResList, DXGK_DISPLAY_INFORMATION* pDispInfo);
NTSTATUS HWClose(void);
- BOOLEAN EnablePointer(void) { return FALSE; }
+ BOOLEAN EnablePointer(void) { return TRUE; }
NTSTATUS ExecutePresentDisplayOnly(_In_ BYTE* DstAddr,
_In_ UINT DstBitPerPixel,
_In_ BYTE* SrcAddr,
|