use the correct naming convention for hidd tags.
[AROS.git] / workbench / hidds / vmwaresvga / vmwaresvga_hiddclass.c
blob37e8f955b8ef6c2c57069f7dd4e90a683dac92e1
1 /*
2 Copyright � 1995-2019, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc: Class for VMWare.
6 Lang: English.
7 */
9 #ifdef DEBUG
10 #undef DEBUG
11 #endif
12 #define DEBUG 0
13 #include <aros/debug.h>
15 #define __OOP_NOATTRBASES__
17 #include <proto/exec.h>
18 #include <proto/oop.h>
19 #include <proto/utility.h>
20 #include <aros/symbolsets.h>
21 #include <devices/inputevent.h>
22 #include <exec/alerts.h>
23 #include <exec/memory.h>
24 #include <hardware/custom.h>
25 #include <hidd/hidd.h>
26 #include <hidd/gfx.h>
27 #include <oop/oop.h>
28 #include <clib/alib_protos.h>
29 #include <string.h>
30 #include <stdio.h>
32 #include "vmwaresvga_intern.h"
34 #include LC_LIBDEFS_FILE
36 #define DINFO(x) x
38 #define DESCRIPTORNAME_LEN 32
40 static OOP_AttrBase HiddAttrBase;
41 static OOP_AttrBase HiddBitMapAttrBase;
42 static OOP_AttrBase HiddPixFmtAttrBase;
43 static OOP_AttrBase HiddGfxAttrBase;
44 static OOP_AttrBase HiddSyncAttrBase;
45 static OOP_AttrBase HiddVMWareSVGAAttrBase;
46 static OOP_AttrBase HiddVMWareSVGABitMapAttrBase;
48 static struct OOP_ABDescr attrbases[] =
50 {IID_Hidd, &HiddAttrBase },
51 {IID_Hidd_BitMap, &HiddBitMapAttrBase },
52 {IID_Hidd_VMWareSVGABitMap, &HiddVMWareSVGABitMapAttrBase },
53 {IID_Hidd_VMWareSVGA, &HiddVMWareSVGAAttrBase },
54 {IID_Hidd_PixFmt, &HiddPixFmtAttrBase },
55 {IID_Hidd_Sync, &HiddSyncAttrBase },
56 {IID_Hidd_Gfx, &HiddGfxAttrBase },
57 {NULL, NULL }
60 STATIC ULONG mask_to_shift(ULONG mask)
62 ULONG i;
64 for (i = 32; mask; i --) {
65 mask >>= 1;
68 if (mask == 32) {
69 i = 0;
72 return i;
75 OOP_Object *VMWareSVGA__Root__New(OOP_Class *cl, OOP_Object *o, struct pRoot_New *msg)
77 unsigned int sync_count, sync_modes, sync_curr, sync_displayid, sync_modeid;
78 ULONG max_width, max_height;
80 struct TagItem pftags[] =
82 {aHidd_PixFmt_RedShift, 0 }, /* 0 */
83 {aHidd_PixFmt_GreenShift, 0 }, /* 1 */
84 {aHidd_PixFmt_BlueShift, 0 }, /* 2 */
85 {aHidd_PixFmt_AlphaShift, 0 }, /* 3 */
86 {aHidd_PixFmt_RedMask, 0 }, /* 4 */
87 {aHidd_PixFmt_GreenMask, 0 }, /* 5 */
88 {aHidd_PixFmt_BlueMask, 0 }, /* 6 */
89 {aHidd_PixFmt_AlphaMask, 0 }, /* 7 */
90 {aHidd_PixFmt_ColorModel, 0 }, /* 8 */
91 {aHidd_PixFmt_Depth, 0 }, /* 9 */
92 {aHidd_PixFmt_BytesPerPixel, 0 }, /* 10 */
93 {aHidd_PixFmt_BitsPerPixel, 0 }, /* 11 */
94 {aHidd_PixFmt_StdPixFmt, 0 }, /* 12 */
95 {aHidd_PixFmt_CLUTShift, 0 }, /* 13 */
96 {aHidd_PixFmt_CLUTMask, 0x0f }, /* 14 */
97 {aHidd_PixFmt_BitMapType, 0 }, /* 15 */
98 {TAG_DONE, 0UL }
101 /* TODO: Probe available sync modes */
102 #define VMWARESVGA_SYNCMODES 12
103 sync_modes = VMWARESVGA_SYNCMODES;
105 // TODO: We don't really support multiple displays. We'll switch this back on when we can handle it
106 sync_count = sync_modes;// * XSD(cl)->data.displaycount;
108 struct TagItem *modetags = AllocVec((sync_count + 2) * sizeof(struct TagItem), MEMF_CLEAR);
110 modetags[0].ti_Tag = aHidd_Gfx_PixFmtTags;
111 modetags[0].ti_Data = (IPTR)pftags;
112 modetags[sync_count + 1].ti_Tag = TAG_DONE;
114 sync_curr = 0;
116 #if (0)
117 max_width = vmwareReadReg(&XSD(cl)->data, SVGA_REG_MAX_WIDTH);
118 max_height = vmwareReadReg(&XSD(cl)->data, VGA_REG_MAX_HEIGHT);
119 #endif
121 while (sync_curr < sync_count)
123 sync_modeid = sync_curr % sync_modes;
124 sync_displayid = sync_curr/sync_modes;
126 ULONG sync_Width =0;
127 ULONG sync_Height=0;
129 DINFO(bug("[VMWareSVGA] %s: Setting Sync Mode %d for Display %d\n", __func__, sync_modeid, sync_displayid));
131 char *sync_Description = AllocVec(DESCRIPTORNAME_LEN, MEMF_CLEAR);
133 switch (sync_modeid)
135 case 1:
136 sync_Width =800;
137 sync_Height=600;
138 break;
139 case 2:
140 sync_Width =1024;
141 sync_Height=768;
142 break;
143 case 3:
144 sync_Width =1280;
145 sync_Height=1024;
146 break;
147 case 4:
148 sync_Width =1366;
149 sync_Height=768;
150 break;
151 case 5:
152 sync_Width =1440;
153 sync_Height=900;
154 break;
155 case 6:
156 sync_Width =1600;
157 sync_Height=1200;
158 break;
159 case 7:
160 sync_Width =1680;
161 sync_Height=1050;
162 break;
163 case 8:
164 sync_Width =1920;
165 sync_Height=1080;
166 break;
167 case 9:
168 sync_Width =1920;
169 sync_Height=1200;
170 break;
171 case 10:
172 sync_Width =2560;
173 sync_Height=1600;
174 break;
175 case 11:
176 sync_Width =3840;
177 sync_Height=2160;
178 break;
179 default:
180 sync_Width =640;
181 sync_Height=480;
182 break;
185 if (sync_displayid == 0)
187 sprintf(sync_Description, "VMWareSVGA:%dx%d", sync_Width, sync_Height);
189 else
191 sprintf(sync_Description, "VMWareSVGA.%d:%dx%d", sync_displayid, sync_Width, sync_Height);
193 DINFO(bug("[VMWareSVGA] %s: Description '%s'\n", __func__, sync_Description));
195 struct TagItem *sync_mode = AllocVec(11 * sizeof(struct TagItem), MEMF_CLEAR);
197 sync_mode[0].ti_Tag = aHidd_Sync_Description;
198 sync_mode[0].ti_Data = (IPTR)sync_Description;
199 sync_mode[1].ti_Tag = aHidd_Sync_PixelClock;
200 sync_mode[2].ti_Tag = aHidd_Sync_HDisp;
201 sync_mode[2].ti_Data = sync_Width;
202 sync_mode[3].ti_Tag = aHidd_Sync_VDisp;
203 sync_mode[3].ti_Data = sync_Height;
204 sync_mode[4].ti_Tag = aHidd_Sync_HSyncStart;
205 sync_mode[5].ti_Tag = aHidd_Sync_HSyncEnd;
206 sync_mode[6].ti_Tag = aHidd_Sync_HTotal;
207 sync_mode[7].ti_Tag = aHidd_Sync_VSyncStart;
208 sync_mode[8].ti_Tag = aHidd_Sync_VSyncEnd;
209 sync_mode[9].ti_Tag = aHidd_Sync_VTotal;
210 sync_mode[10].ti_Tag = TAG_DONE;
212 modetags[1 + sync_curr].ti_Tag = aHidd_Gfx_SyncTags;
213 modetags[1 + sync_curr].ti_Data = (IPTR)sync_mode;
215 sync_curr++;
218 struct TagItem yourtags[] =
220 {aHidd_Gfx_ModeTags, (IPTR)modetags },
221 { aHidd_Name , (IPTR)"VMWareSVGA" },
222 { aHidd_HardwareName , (IPTR)"VMWare SVGA Gfx Adaptor" },
223 { aHidd_ProducerName , (IPTR)"VMWare Inc" },
224 {TAG_MORE, 0UL }
226 struct pRoot_New yourmsg;
228 /* set pftags = 0 */
229 if (!XSD(cl)->data.pseudocolor)
231 pftags[0].ti_Data = mask_to_shift(XSD(cl)->data.redmask);
232 pftags[1].ti_Data = mask_to_shift(XSD(cl)->data.greenmask);
233 pftags[2].ti_Data = mask_to_shift(XSD(cl)->data.bluemask);
235 else
237 pftags[0].ti_Data = 0;
238 pftags[1].ti_Data = 0;
239 pftags[2].ti_Data = 0;
241 pftags[3].ti_Data = 0;
242 pftags[4].ti_Data = XSD(cl)->data.redmask;
243 pftags[5].ti_Data = XSD(cl)->data.greenmask;
244 pftags[6].ti_Data = XSD(cl)->data.bluemask;
245 pftags[7].ti_Data = 0;
246 DINFO(bug("[VMWareSVGA] New: Masks red=%08x<<%d,green=%08x<<%d,blue%08x<<%d\n",
247 pftags[4].ti_Data, pftags[0].ti_Data,
248 pftags[5].ti_Data, pftags[1].ti_Data,
249 pftags[6].ti_Data, pftags[2].ti_Data));
251 if (XSD(cl)->data.pseudocolor)
252 pftags[8].ti_Data = vHidd_ColorModel_Palette;
253 else
254 pftags[8].ti_Data = vHidd_ColorModel_TrueColor;
256 pftags[9].ti_Data = XSD(cl)->data.depth;
257 pftags[10].ti_Data = XSD(cl)->data.bytesperpixel;
258 pftags[11].ti_Data = XSD(cl)->data.bitsperpixel;
259 pftags[12].ti_Data = vHidd_StdPixFmt_Native;
260 pftags[15].ti_Data = vHidd_BitMapType_Chunky;
262 yourtags[1].ti_Data = (IPTR)msg->attrList;
264 yourmsg.mID = msg->mID;
265 yourmsg.attrList = yourtags;
266 msg = &yourmsg;
267 EnterFunc(bug("[VMWareSVGA] New()\n"));
268 o = (OOP_Object *)OOP_DoSuperMethod(cl, o, (OOP_Msg)msg);
269 if (o)
271 DINFO(bug("[VMWareSVGA] %s: object @ 0x%p\n", __func__, o);)
273 XSD(cl)->vmwaresvgahidd = o;
274 XSD(cl)->mouse.shape = NULL;
275 DINFO(
276 bug("[VMWareSVGA] %s: Device capabilities: %08x\n", __func__, XSD(cl)->data.capabilities);
277 if (XSD(cl)->data.capabilities & SVGA_CAP_IRQMASK)
278 bug("[VMWareSVGA] %s: IRQ Mask\n", __func__);
279 if (XSD(cl)->data.capabilities & SVGA_CAP_EXTENDED_FIFO)
280 bug("[VMWareSVGA] %s: Extended FIFO\n", __func__);
281 if (XSD(cl)->data.capabilities & SVGA_CAP_CURSOR)
282 bug("[VMWareSVGA] %s: HW Cursor\n", __func__);
283 if (XSD(cl)->data.capabilities & SVGA_CAP_ALPHA_CURSOR)
284 bug("[VMWareSVGA] %s: Alpha Cursor\n", __func__);
285 if (XSD(cl)->data.capabilities & SVGA_CAP_CURSOR_BYPASS)
286 bug("[VMWareSVGA] %s: Cursor-Bypass\n", __func__);
287 if (XSD(cl)->data.capabilities & SVGA_CAP_CURSOR_BYPASS_2)
288 bug("[VMWareSVGA] %s: Cursor-Bypass2\n", __func__);
289 if (XSD(cl)->data.capabilities & SVGA_CAP_RECT_COPY)
290 bug("[VMWareSVGA] %s: Copy Rect\n", __func__);
291 if (XSD(cl)->data.capabilities & SVGA_CAP_8BIT_EMULATION)
292 bug("[VMWareSVGA] %s: 8bit-emu\n", __func__);
293 if (XSD(cl)->data.capabilities & SVGA_CAP_3D)
294 bug("[VMWareSVGA] %s: 3D.\n", __func__);
295 if (XSD(cl)->data.capabilities & SVGA_CAP_MULTIMON)
296 bug("[VMWareSVGA] %s: Multimon\n", __func__);
297 if (XSD(cl)->data.capabilities & SVGA_CAP_DISPLAY_TOPOLOGY)
298 bug("[VMWareSVGA] %s: Display Topology\n", __func__);
299 if (XSD(cl)->data.capabilities & SVGA_CAP_PITCHLOCK)
300 bug("[VMWareSVGA] %s: Pitchlock\n", __func__);
301 if (XSD(cl)->data.capabilities & SVGA_CAP_GMR)
302 bug("[VMWareSVGA] %s: GMR\n", __func__);
303 if (XSD(cl)->data.capabilities & SVGA_CAP_GMR2)
304 bug("[VMWareSVGA] %s: GMR2\n", __func__);
305 if (XSD(cl)->data.capabilities & SVGA_CAP_TRACES)
306 bug("[VMWareSVGA] %s: Traces\n", __func__);
307 if (XSD(cl)->data.capabilities & SVGA_CAP_SCREEN_OBJECT_2)
308 bug("[VMWareSVGA] %s: Screen-Object2\n", __func__);
312 D(bug("[VMWareSVGA] %s: returning 0x%p\n", __func__, o);)
314 return o;
317 VOID VMWareSVGA__Root__Dispose(OOP_Class *cl, OOP_Object *o, OOP_Msg msg)
319 FreeVec(XSD(cl)->mouse.shape);
320 OOP_DoSuperMethod(cl, o, (OOP_Msg)msg);
323 VOID VMWareSVGA__Root__Get(OOP_Class *cl, OOP_Object *o, struct pRoot_Get *msg)
325 ULONG idx;
326 BOOL found = FALSE;
328 if (IS_GFX_ATTR(msg->attrID, idx))
330 switch (idx)
332 case aoHidd_Gfx_SupportsHWCursor:
333 *msg->storage = (IPTR)TRUE;
334 found = TRUE;
335 break;
336 case aoHidd_Gfx_MemoryAttribs:
338 struct TagItem *matstate = (struct TagItem *)msg->storage;
339 found = TRUE;
340 if (matstate)
342 struct TagItem *matag;
343 while ((matag = NextTagItem(&matstate)))
345 switch(matag->ti_Tag)
347 case tHidd_Gfx_MemTotal:
348 case tHidd_Gfx_MemAddressableTotal:
349 matag->ti_Data = (IPTR)vmwareReadReg(&XSD(cl)->data, SVGA_REG_VRAM_SIZE);
350 break;
351 case tHidd_Gfx_MemFree:
352 case tHidd_Gfx_MemAddressableFree:
353 matag->ti_Data = 0;
354 break;
359 break;
362 if (!found)
363 OOP_DoSuperMethod(cl, o, (OOP_Msg)msg);
366 OOP_Object *VMWareSVGA__Hidd_Gfx__CreateObject(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_CreateObject *msg)
368 OOP_Object *object = NULL;
370 D(bug("[VMWareSVGA] %s()\n", __func__));
372 if (msg->cl == XSD(cl)->basebm)
374 BOOL displayable;
375 BOOL framebuffer;
376 OOP_Class *classptr = NULL;
377 struct TagItem tags[] =
379 { TAG_IGNORE, TAG_IGNORE }, /* Placeholder for aHidd_BitMap_ClassPtr */
380 { TAG_MORE, (IPTR)msg->attrList }
383 struct pHidd_Gfx_CreateObject yourmsg;
385 displayable = GetTagData(aHidd_BitMap_Displayable, FALSE, msg->attrList);
386 framebuffer = GetTagData(aHidd_BitMap_FrameBuffer, FALSE, msg->attrList);
387 if (framebuffer)
388 classptr = XSD(cl)->vmwaresvgaonbmclass;
389 else if (displayable)
390 classptr = XSD(cl)->vmwaresvgaoffbmclass;
391 else
393 HIDDT_ModeID modeid;
394 modeid = (HIDDT_ModeID)GetTagData(aHidd_BitMap_ModeID, vHidd_ModeID_Invalid, msg->attrList);
395 if (modeid != vHidd_ModeID_Invalid)
396 classptr = XSD(cl)->vmwaresvgaoffbmclass;
397 else
399 HIDDT_StdPixFmt stdpf;
400 stdpf = (HIDDT_StdPixFmt)GetTagData(aHidd_BitMap_StdPixFmt, vHidd_StdPixFmt_Unknown, msg->attrList);
401 if (stdpf == vHidd_StdPixFmt_Unknown)
403 OOP_Object *friend;
404 friend = (OOP_Object *)GetTagData(aHidd_BitMap_Friend, (IPTR)NULL, msg->attrList);
405 if (friend != NULL)
407 OOP_Class *friend_class = NULL;
408 OOP_GetAttr(friend, aHidd_BitMap_ClassPtr, (IPTR *)&friend_class);
409 if (friend_class == XSD(cl)->vmwaresvgaonbmclass)
411 classptr = XSD(cl)->vmwaresvgaoffbmclass;
417 if (classptr != NULL)
419 tags[0].ti_Tag = aHidd_BitMap_ClassPtr;
420 tags[0].ti_Data = (IPTR)classptr;
422 yourmsg.mID = msg->mID;
423 yourmsg.cl = msg->cl;
424 yourmsg.attrList = tags;
426 object = (OOP_Object *)OOP_DoSuperMethod(cl, o, (OOP_Msg)&yourmsg);
428 else if (XSD(cl)->basegallium && (msg->cl == XSD(cl)->basegallium))
430 /* Create the gallium 3d driver object .. */
431 object = OOP_NewObject(NULL, CLID_Hidd_Gallium_VMWareSVGA, msg->attrList);
433 else
434 object = (OOP_Object *)OOP_DoSuperMethod(cl, o, (OOP_Msg)msg);
436 D(bug("[VMWareSVGA] %s: returning 0x%p\n", __func__, object);)
437 return object;
440 VOID VMWareSVGA__Hidd_Gfx__CopyBox(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_CopyBox *msg)
442 UBYTE *src = NULL;
443 UBYTE *dst = NULL;
444 HIDDT_DrawMode mode;
445 struct HWData *hwdata = &XSD(cl)->data;
446 struct Box box = { msg->srcX, msg->srcY, msg->srcX + msg->width + 1, msg->srcY + msg->height + 1};
448 D(bug("[VMWareSVGA] %s()\n", __func__));
450 ObtainSemaphore(&hwdata->damage_control);
452 mode = GC_DRMD(msg->gc);
453 OOP_GetAttr(msg->src, aHidd_VMWareSVGABitMap_Drawable, (IPTR *)&src);
454 OOP_GetAttr(msg->dest, aHidd_VMWareSVGABitMap_Drawable, (IPTR *)&dst);
455 if (((dst == NULL) || (src == NULL))) /* no vmwaregfx bitmap */
457 OOP_DoSuperMethod(cl, o, (OOP_Msg)msg);
460 // TODO: This is nice and fast. but unfortunately has to go. We'll soon switch to a more refined accelerated blitting
461 else if (dst == src)
463 struct BitmapData *data;
464 data = OOP_INST_DATA(OOP_OCLASS(msg->src), msg->src);
465 switch (mode)
467 case vHidd_GC_DrawMode_Clear:
468 clearCopyVMWareSVGA(data->data, msg->srcX, msg->srcY, msg->destX, msg->destY, msg->width, msg->height);
469 break;
470 case vHidd_GC_DrawMode_And:
471 andCopyVMWareSVGA(data->data, msg->srcX, msg->srcY, msg->destX, msg->destY, msg->width, msg->height);
472 break;
473 case vHidd_GC_DrawMode_AndReverse:
474 andReverseCopyVMWareSVGA(data->data, msg->srcX, msg->srcY, msg->destX, msg->destY, msg->width, msg->height);
475 break;
476 case vHidd_GC_DrawMode_Copy:
477 copyCopyVMWareSVGA(data->data, msg->srcX, msg->srcY, msg->destX, msg->destY, msg->width, msg->height);
478 break;
479 case vHidd_GC_DrawMode_AndInverted:
480 andInvertedCopyVMWareSVGA(data->data, msg->srcX, msg->srcY, msg->destX, msg->destY, msg->width, msg->height);
481 break;
482 case vHidd_GC_DrawMode_NoOp:
483 noOpCopyVMWareSVGA(data->data, msg->srcX, msg->srcY, msg->destX, msg->destY, msg->width, msg->height);
484 break;
485 case vHidd_GC_DrawMode_Xor:
486 xorCopyVMWareSVGA(data->data, msg->srcX, msg->srcY, msg->destX, msg->destY, msg->width, msg->height);
487 break;
488 case vHidd_GC_DrawMode_Or:
489 orCopyVMWareSVGA(data->data, msg->srcX, msg->srcY, msg->destX, msg->destY, msg->width, msg->height);
490 break;
491 case vHidd_GC_DrawMode_Nor:
492 norCopyVMWareSVGA(data->data, msg->srcX, msg->srcY, msg->destX, msg->destY, msg->width, msg->height);
493 break;
494 case vHidd_GC_DrawMode_Equiv:
495 equivCopyVMWareSVGA(data->data, msg->srcX, msg->srcY, msg->destX, msg->destY, msg->width, msg->height);
496 break;
497 case vHidd_GC_DrawMode_Invert:
498 invertCopyVMWareSVGA(data->data, msg->srcX, msg->srcY, msg->destX, msg->destY, msg->width, msg->height);
499 break;
500 case vHidd_GC_DrawMode_OrReverse:
501 orReverseCopyVMWareSVGA(data->data, msg->srcX, msg->srcY, msg->destX, msg->destY, msg->width, msg->height);
502 break;
503 case vHidd_GC_DrawMode_CopyInverted:
504 copyInvertedCopyVMWareSVGA(data->data, msg->srcX, msg->srcY, msg->destX, msg->destY, msg->width, msg->height);
505 break;
506 case vHidd_GC_DrawMode_OrInverted:
507 orInvertedCopyVMWareSVGA(data->data, msg->srcX, msg->srcY, msg->destX, msg->destY, msg->width, msg->height);
508 break;
509 case vHidd_GC_DrawMode_Nand:
510 nandCopyVMWareSVGA(data->data, msg->srcX, msg->srcY, msg->destX, msg->destY, msg->width, msg->height);
511 break;
512 case vHidd_GC_DrawMode_Set:
513 setCopyVMWareSVGA(data->data, msg->srcX, msg->srcY, msg->destX, msg->destY, msg->width, msg->height);
514 break;
515 default:
516 OOP_DoSuperMethod(cl, o, (OOP_Msg)msg);
519 else
521 struct BitmapData *srcbd = OOP_INST_DATA(OOP_OCLASS(msg->src), msg->src);
522 struct BitmapData *dstbd = OOP_INST_DATA(OOP_OCLASS(msg->dest), msg->dest);
523 UBYTE *sbuffer;
524 ULONG srestadd;
525 UBYTE *dbuffer;
526 ULONG drestadd;
527 ULONG ycnt = msg->height;
528 ULONG xcnt;
529 LONG offset;
531 /* get src/dest video data start addresses and skip sizes */
532 if (srcbd->VideoData == srcbd->data->vrambase)
534 offset = (msg->srcX*srcbd->bytesperpix)+(msg->srcY*srcbd->data->bytesperline);
535 srestadd = (srcbd->data->bytesperline - (msg->width*srcbd->bytesperpix));
536 // displayCursorVMWareSVGA(&XSD(cl)->data, 0);
537 // XSD(cl)->mouse.visible = 0;
539 else
541 offset = (msg->srcX+(msg->srcY*srcbd->width))*srcbd->bytesperpix;
542 srestadd = (srcbd->width - msg->width)*srcbd->bytesperpix;
544 sbuffer = srcbd->VideoData+offset;
545 if (dstbd->VideoData == dstbd->data->vrambase)
547 offset = (msg->destX*dstbd->bytesperpix)+(msg->destY*dstbd->data->bytesperline);
548 drestadd = (dstbd->data->bytesperline - (msg->width*dstbd->bytesperpix));
549 // displayCursorVMWareSVGA(&XSD(cl)->data, 0);
550 // XSD(cl)->mouse.visible = 0;
552 else
554 offset = (msg->destX+(msg->destY*dstbd->width))*dstbd->bytesperpix;
555 drestadd = (dstbd->width - msg->width)*dstbd->bytesperpix;
557 dbuffer = dstbd->VideoData+offset;
559 switch (mode)
561 case vHidd_GC_DrawMode_Copy:
562 while (ycnt--)
564 xcnt = msg->width;
566 // NOTE: this is only valid if the two bitmaps share the same bytes per pixel.
567 // we may want to pre-process it (see below in the mouse definition code)
568 CopyMem(sbuffer, dbuffer, xcnt * dstbd->bytesperpix);
570 sbuffer += xcnt * dstbd->bytesperpix;
571 sbuffer += srestadd;
572 dbuffer += xcnt * dstbd->bytesperpix;
573 dbuffer += drestadd;
575 break;
576 default:
577 D(bug("[VMWareSVGA] mode = %ld src=%lx dst=%lx\n", mode, src, dst);)
578 OOP_DoSuperMethod(cl, o, (OOP_Msg)msg);
581 // if (XSD(cl)->mouse.visible == 0)
582 // {
583 // displayCursorVMWareSVGA(&XSD(cl)->data, 1);
584 // XSD(cl)->mouse.visible = 1;
585 // }
588 box.x1 = msg->srcX;
589 box.y1 = msg->srcY;
590 box.x2 = box.x1+msg->width+1;
591 box.y2 = box.y1+msg->height+1;
593 VMWareSVGA_Damage_DeltaAdd(hwdata, box);
594 ReleaseSemaphore(&hwdata->damage_control);
596 D(bug("[VMWareSVGA] %s: done\n", __func__);)
599 BOOL VMWareSVGA__Hidd_Gfx__SetCursorShape(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_SetCursorShape *msg)
601 struct VMWareSVGA_staticdata *data = XSD(cl);
603 D(bug("[VMWareSVGA] %s()\n", __func__));
605 if (msg->shape == NULL)
607 displayCursorVMWareSVGA(&XSD(cl)->data, 0);
608 data->mouse.oopshape = NULL;
609 FreeVec(data->mouse.shape);
610 data->mouse.shape = NULL;
612 return TRUE;
614 else
616 OOP_Object *pfmt;
617 OOP_Object *colmap;
618 HIDDT_StdPixFmt pixfmt;
619 IPTR tmp;
621 OOP_GetAttr(msg->shape, aHidd_BitMap_Width, &tmp);
622 data->mouse.width = tmp;
623 OOP_GetAttr(msg->shape, aHidd_BitMap_Height, &tmp);
624 data->mouse.height = tmp;
625 OOP_GetAttr(msg->shape, aHidd_BitMap_PixFmt, (IPTR *)&pfmt);
626 OOP_GetAttr(pfmt, aHidd_PixFmt_StdPixFmt, (IPTR *)&pixfmt);
627 OOP_GetAttr(msg->shape, aHidd_BitMap_ColorMap, (IPTR *)&colmap);
628 data->mouse.oopshape = msg->shape;
630 /* convert shape to vmware needs */
631 FreeVec(data->mouse.shape);
632 tmp = data->mouse.width * data->mouse.height;
633 data->mouse.shape = AllocVec(tmp * 4, MEMF_CLEAR|MEMF_PUBLIC);
634 if (data->mouse.shape != NULL)
636 UBYTE *shape;
637 shape = data->mouse.shape;
639 // Get data from the bitmap. Using the ALPHA CURSOR we can now directly pre-process the bitmap to a suitable format
640 HIDD_BM_GetImage(msg->shape, (UBYTE *)shape, data->mouse.width * 4, 0, 0, data->mouse.width, data->mouse.height, vHidd_StdPixFmt_BGRA32);
642 defineCursorVMWareSVGA(&XSD(cl)->data, &data->mouse);
643 return TRUE;
647 return FALSE;
650 BOOL VMWareSVGA__Hidd_Gfx__SetCursorPos(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_SetCursorPos *msg)
652 D(bug("[VMWareSVGA] %s()\n", __func__));
654 XSD(cl)->mouse.x = msg->x;
655 XSD(cl)->mouse.y = msg->y;
657 moveCursorVMWareSVGA(&XSD(cl)->data, XSD(cl)->mouse.x, XSD(cl)->mouse.y);
659 return TRUE;
662 VOID VMWareSVGA__Hidd_Gfx__SetCursorVisible(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_SetCursorVisible *msg)
664 D(bug("[VMWareSVGA] %s()\n", __func__));
666 XSD(cl)->mouse.visible = msg->visible;
667 displayCursorVMWareSVGA(&XSD(cl)->data, msg->visible ? 1 : 0);
671 static int VMWareSVGA_InitStatic(LIBBASETYPEPTR LIBBASE)
673 D(bug("[VMWareSVGA] %s()\n", __func__));
675 LIBBASE->vsd.mouse.x=0;
676 LIBBASE->vsd.mouse.y=0;
677 LIBBASE->vsd.mouse.shape = NULL;
679 if (!OOP_ObtainAttrBases(attrbases))
681 D(bug("[VMWareSVGA] %s: attrbases init failed\n", __func__));
682 return FALSE;
685 D(bug("[VMWareSVGA] %s: initialised\n", __func__));
687 return TRUE;
690 static int VMWareSVGA_ExpungeStatic(LIBBASETYPEPTR LIBBASE)
692 D(bug("[VMWareSVGA] %s()\n", __func__));
694 OOP_ReleaseAttrBases(attrbases);
696 D(bug("[VMWareSVGA] %s: done\n", __func__));
698 return TRUE;
701 ADD2INITLIB(VMWareSVGA_InitStatic, 0)
702 ADD2EXPUNGELIB(VMWareSVGA_ExpungeStatic, 0)