2 Copyright 1995-2017, The AROS Development Team. All rights reserved.
5 Desc: Bitmap class for native Amiga chipset.
10 /****************************************************************************************/
16 #include <proto/oop.h>
17 #include <proto/utility.h>
18 #include <exec/alerts.h>
19 #include <aros/macros.h>
20 #include <exec/memory.h>
21 #include <exec/lists.h>
22 #include <graphics/rastport.h>
23 #include <graphics/gfx.h>
26 #include <aros/symbolsets.h>
32 #include <aros/debug.h>
34 #include LC_LIBDEFS_FILE
36 #include "uaegfx_intern.h"
37 #include "uaegfx_bitmap.h"
42 swap bitmap between RAM <-> VRAM allowed only if this lock is held
44 the bitmap being swapped must also get LOCK_BITMAP lock, otherwise
45 gfx functions (done by other tasks) could render into wrong place while
46 bitmap is moved around.
50 static APTR
allocrtgvrambitmap(struct uaegfx_staticdata
*csd
, struct bm_data
*bm
)
53 SetMemoryMode(csd
, RGBFB_CLUT
);
54 vmem
= Allocate(csd
->vmem
, bm
->memsize
);
55 SetMemoryMode(csd
, bm
->rgbformat
);
58 DVRAM(bug("BM %p (%dx%dx%d %d): %p,%d bytes VRAM allocated.\n", bm
, bm
->width
, bm
->height
, bm
->bytesperpixel
*8, bm
->bytesperline
, vmem
, bm
->memsize
));
63 static void freertgbitmap(struct uaegfx_staticdata
*csd
, struct bm_data
*bm
)
65 DVRAM(bug("BM %p: freeing %p:%d from %s\n", bm
, bm
->VideoData
, bm
->memsize
, bm
->invram
? "VRAM" : "RAM"));
68 SetMemoryMode(csd
, RGBFB_CLUT
);
69 Deallocate(csd
->vmem
, bm
->VideoData
, bm
->memsize
);
70 SetMemoryMode(csd
, bm
->rgbformat
);
71 csd
->vram_used
-= bm
->memsize
;
73 else if (bm
->VideoData
)
75 FreeMem(bm
->VideoData
, bm
->memsize
);
76 csd
->fram_used
-= bm
->memsize
;
82 static BOOL
movebitmaptofram(struct uaegfx_staticdata
*csd
, struct bm_data
*bm
)
87 /* TRYLOCK here as we are in wrong locking order (could deadlock):
89 LOCK_BITMAP_MULTI -> LOCK_HW -> [...] <- UNLOCK_HW <- UNLOCK_BITMAP_MULTI
90 (Correct locking order is: LOCK_BM_MULTI -> LOCK_BM -> LOCK_HW)
92 Alternative would be to always lock all (swappable) bitmaps during bitmap
93 allocation/freeing routines. */
96 if (TRYLOCK_BITMAP(bm
))
98 vmem
= AllocMem(bm
->memsize
, MEMF_ANY
);
101 SetMemoryMode(csd
, bm
->rgbformat
);
102 CopyMemQuick(bm
->VideoData
, vmem
, bm
->memsize
);
103 freertgbitmap(csd
, bm
);
104 bm
->VideoData
= vmem
;
106 csd
->fram_used
+= bm
->memsize
;
109 DVRAM(bug("BM %p: %d x %d moved to RAM %p:%d. VRAM=%d\n", bm
, bm
->width
, bm
->height
, bm
->VideoData
, bm
->memsize
, csd
->vram_used
));
117 static BOOL
allocrtgbitmap(struct uaegfx_staticdata
*csd
, struct bm_data
*bm
, BOOL usevram
)
119 bm
->memsize
= (bm
->bytesperline
* bm
->height
+ 7) & ~7;
121 if (!(bm
->VideoData
= allocrtgvrambitmap(csd
, bm
)))
123 if (usevram
&& bm
->memsize
< csd
->vram_size
)
125 struct bm_data
*bmnode
;
126 ForeachNode(&csd
->bitmaplist
, bmnode
)
128 if (bmnode
!= bm
&& bmnode
->invram
&& !bmnode
->locked
)
130 if (movebitmaptofram(csd
, bmnode
))
132 if ((bm
->VideoData
= allocrtgvrambitmap(csd
, bm
)))
134 csd
->vram_used
+= bm
->memsize
;
145 bm
->VideoData
= AllocMem(bm
->memsize
, MEMF_ANY
);
148 csd
->fram_used
+= bm
->memsize
;
154 csd
->vram_used
+= bm
->memsize
;
157 DVRAM(bug("BM %p: %p,%d bytes allocated from %s. VRAM=%d\n", bm
, bm
->VideoData
, bm
->memsize
, bm
->invram
? "VRAM" : "RAM", csd
->vram_used
));
159 //if (bm->VideoData != NULL)
163 // for(i = 0; i < bm->memsize; i++) bm->VideoData[i] = 0xFF;
166 return bm
->VideoData
!= NULL
;
169 static BOOL
movethisbitmaptovram(struct uaegfx_staticdata
*csd
, struct bm_data
*bm
)
171 APTR vmem
= allocrtgvrambitmap(csd
, bm
);
174 SetMemoryMode(csd
, bm
->rgbformat
);
175 CopyMemQuick(bm
->VideoData
, vmem
, bm
->memsize
);
176 freertgbitmap(csd
, bm
);
177 bm
->VideoData
= vmem
;
179 csd
->vram_used
+= bm
->memsize
;
180 DVRAM(bug("BM %p: %p:%d (%d x %d) moved back to VRAM\n", bm
, bm
->VideoData
, bm
->memsize
, bm
->width
, bm
->height
));
186 static BOOL
movebitmaptovram(struct uaegfx_staticdata
*csd
, struct bm_data
*bm
)
188 struct bm_data
*bmnode
;
193 DVRAM(bug("BM %p: %p,%d needs to be in VRAM...\n", bm
, bm
->VideoData
, bm
->memsize
));
195 ForeachNode(&csd
->bitmaplist
, bmnode
)
197 if (bmnode
!= bm
&& bmnode
->invram
&& !bmnode
->locked
)
199 if (movebitmaptofram(csd
, bmnode
))
201 if (movethisbitmaptovram(csd
, bm
))
209 DVRAM(bug("-> not enough memory, VRAM=%d\n", csd
->vram_used
));
215 static BOOL
maybeputinvram(struct uaegfx_staticdata
*csd
, struct bm_data
*bm
)
219 if (bm
->memsize
>= csd
->vram_size
- csd
->vram_used
)
221 return movethisbitmaptovram(csd
, bm
);
225 static void hidescreen(struct uaegfx_staticdata
*csd
, struct bm_data
*bm
)
227 D(bug("Hide %p: (%p:%d)\n",
228 bm
, bm
->VideoData
, bm
->memsize
));
229 SetInterrupt(csd
, FALSE
);
230 SetDisplay(csd
, FALSE
);
231 SetSwitch(csd
, FALSE
);
237 /****************************************************************************************/
239 #define AO(x) (aoHidd_BitMap_ ## x)
240 #define GOT_BM_ATTR(code) GOT_ATTR(code, aoHidd_BitMap, bitmap)
242 /****************************************************************************************/
244 OOP_Object
*UAEGFXBitmap__Root__New(OOP_Class
*cl
, OOP_Object
*o
, struct pRoot_New
*msg
)
246 struct uaegfx_staticdata
*csd
= CSD(cl
);
248 struct bm_data
*data
;
249 IPTR width
, height
, multi
;
251 struct TagItem tags
[2];
253 DB2(bug("UAEGFXBitmap__Root__New\n"));
255 o
=(OOP_Object
*)OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
261 data
= OOP_INST_DATA(cl
, o
);
262 memset(data
, 0, sizeof (*data
));
263 InitSemaphore(&data
->bmLock
);
265 OOP_GetAttr(o
, aHidd_BitMap_Width
, &width
);
266 OOP_GetAttr(o
, aHidd_BitMap_Height
, &height
);
267 OOP_GetAttr(o
, aHidd_BitMap_Displayable
, &displayable
);
268 OOP_GetAttr(o
, aHidd_BitMap_GfxHidd
, (APTR
)&data
->gfxhidd
);
269 OOP_GetAttr(o
, aHidd_BitMap_PixFmt
, (APTR
)&data
->pixfmtobj
);
270 OOP_GetAttr(data
->pixfmtobj
, aHidd_PixFmt_BytesPerPixel
, &multi
);
272 data
->rgbformat
= getrtgformat(csd
, data
->pixfmtobj
);
273 data
->align
= displayable
? 32 : 16;
274 width
= (width
+ data
->align
- 1) & ~(data
->align
- 1);
275 data
->bytesperline
= CalculateBytesPerRow(csd
, width
, data
->rgbformat
);
277 data
->height
= height
;
278 data
->bytesperpixel
= multi
;
282 LOCK_HW
/* alloc routines call SetMemoryMode */
283 WaitBlitter(csd
); /* in case bitmaps are swapped between RAM <-> VRAM during allocation */
284 allocrtgbitmap(csd
, data
, TRUE
);
287 AddTail(&csd
->bitmaplist
, (struct Node
*)&data
->node
);
291 tags
[0].ti_Tag
= aHidd_BitMap_BytesPerRow
;
292 tags
[0].ti_Data
= data
->bytesperline
;
293 tags
[1].ti_Tag
= TAG_DONE
;
294 OOP_SetAttrs(o
, tags
);
296 DB2(bug("%dx%dx%d %d RGBF=%08x P=%08x\n", width
, height
, multi
, data
->bytesperline
, data
->rgbformat
, data
->VideoData
));
298 if (data
->VideoData
== NULL
)
302 OOP_MethodID dispose_mid
;
303 dispose_mid
= OOP_GetMethodID(IID_Root
, moRoot_Dispose
);
304 OOP_CoerceMethod(cl
, o
, (OOP_Msg
)&dispose_mid
);
308 DB2(bug("ret=%x bm=%p (%p:%d)\n", o
, data
, data
->VideoData
, data
->memsize
));
313 VOID
UAEGFXBitmap__Root__Dispose(OOP_Class
*cl
, OOP_Object
*o
, OOP_Msg msg
)
315 struct uaegfx_staticdata
*csd
= CSD(cl
);
316 struct bm_data
*data
;
318 data
= OOP_INST_DATA(cl
, o
);
323 DB2(bug("UAEGFXBitmap__Root__Dispose %x bm=%x (%p,%d)\n", o
, data
, data
->VideoData
, data
->memsize
));
324 if (csd
->disp
== data
)
325 hidescreen(csd
, data
);
329 FreeVec(data
->palette
);
333 LOCK_HW
/* free functions call SetMemoryMode */
334 freertgbitmap(csd
, data
);
337 Remove((struct Node
*)&data
->node
);
341 OOP_DoSuperMethod(cl
, o
, msg
);
344 VOID
UAEGFXBitmap__Root__Set(OOP_Class
*cl
, OOP_Object
*o
, struct pRoot_Set
*msg
)
346 struct uaegfx_staticdata
*csd
= CSD(cl
);
347 struct bm_data
*data
= OOP_INST_DATA(cl
, o
);
348 struct TagItem
*tag
, *tstate
;
352 DB2(bug("UAEGFXBitmap__Root__Set %p (%p:%d)\n", data
, data
->VideoData
, data
->memsize
));
353 tstate
= msg
->attrList
;
354 while((tag
= NextTagItem(&tstate
)))
356 DB2(bug("%d/%d\n", tag
->ti_Tag
, tag
->ti_Data
));
357 if(IS_BITMAP_ATTR(tag
->ti_Tag
, idx
))
359 DB2(bug("->%d\n", idx
));
362 case aoHidd_BitMap_Visible
:
367 OOP_Object
*gfxhidd
, *sync
, *pf
;
368 IPTR modeid
= vHidd_ModeID_Invalid
;
369 IPTR dwidth
, dheight
, depth
, width
, height
;
370 struct ModeInfo
*modeinfo
;
373 height
= data
->height
;
374 OOP_GetAttr(o
, aHidd_BitMap_ModeID
, &modeid
);
375 OOP_GetAttr(o
, aHidd_BitMap_GfxHidd
, (IPTR
*)&gfxhidd
);
376 HIDD_Gfx_GetMode(gfxhidd
, modeid
, &sync
, &pf
);
377 OOP_GetAttr(sync
, aHidd_Sync_HDisp
, &dwidth
);
378 OOP_GetAttr(sync
, aHidd_Sync_VDisp
, &dheight
);
379 OOP_GetAttr(pf
, aHidd_PixFmt_Depth
, &depth
);
380 data
->rgbformat
= getrtgformat(csd
, pf
);
381 modeinfo
= getrtgmodeinfo(csd
, sync
, pf
, csd
->fakemodeinfo
);
382 csd
->modeinfo
= modeinfo
;
383 csd
->rgbformat
= data
->rgbformat
;
384 pw(csd
->bitmapextra
+ PSSO_BitMapExtra_Width
, width
);
385 pw(csd
->bitmapextra
+ PSSO_BitMapExtra_Height
, height
);
386 D(bug("Show %p: (%p:%d) %dx%dx%d (%dx%d) BF=%08x\n",
387 data
, data
->VideoData
, data
->memsize
,
388 dwidth
, dheight
, depth
, width
, height
, data
->rgbformat
));
392 WaitBlitter(csd
); /* in case other bitmaps are swapped from VRAM to RAM */
393 if (!movebitmaptovram(csd
, data
))
395 struct bm_data
*bmnode
;
397 /* Second try. Now lock all bitmaps first. UNLOCK_HW first, to ensure
398 correct locking order: multibm -> bm -> hw */
402 ForeachNode(&csd
->bitmaplist
, bmnode
)
404 if (bmnode
!= data
) LOCK_BITMAP(bmnode
)
408 WaitBlitter(csd
); /* in case other bitmaps are swapped from VRAM to RAM */
409 movebitmaptovram(csd
, data
); /* shouldn't fail this time. If it does we are screwed ... */
412 ForeachNode(&csd
->bitmaplist
, bmnode
)
414 if (bmnode
!= data
) UNLOCK_BITMAP(bmnode
)
421 csd
->dwidth
= dwidth
;
422 csd
->dheight
= dheight
;
423 csd
->dmodeid
= modeid
;
425 if (csd
->hardwaresprite
&& depth
<= 8) {
427 UBYTE
*clut
= csd
->boardinfo
+ PSSO_BoardInfo_CLUT
;
428 for (i
= csd
->spritecolors
+ 1; i
< csd
->spritecolors
+ 4; i
++)
429 SetSpriteColor(csd
, i
- (csd
->spritecolors
+ 1), clut
[i
* 3 + 0], clut
[i
* 3 + 1], clut
[i
* 3 + 2]);
431 SetInterrupt(csd
, FALSE
);
432 SetColorArray(csd
, 0, 256);
433 SetDisplay(csd
, FALSE
);
434 SetGC(csd
, modeinfo
, 0);
437 SetPanning(csd
, data
->VideoData
, width
, 0, 0);
438 SetDisplay(csd
, TRUE
);
439 SetSwitch(csd
, TRUE
);
440 SetInterrupt(csd
, TRUE
);
444 hidescreen(csd
, data
);
451 case aoHidd_BitMap_LeftEdge
:
452 if (data
->leftedge
!= tag
->ti_Data
) {
453 data
->leftedge
= tag
->ti_Data
;
457 case aoHidd_BitMap_TopEdge
:
458 if (data
->topedge
!= tag
->ti_Data
) {
459 data
->topedge
= tag
->ti_Data
;
466 DB2(bug("UAEGFXBitmap__Root__Set Exit\n"));
467 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
469 if (moved
&& csd
->disp
== data
)
470 setscroll(csd
, data
);
476 VOID
UAEGFXBitmap__Root__Get(OOP_Class
*cl
, OOP_Object
*o
, struct pRoot_Get
*msg
)
478 struct uaegfx_staticdata
*csd
= CSD(cl
);
479 struct bm_data
*data
= OOP_INST_DATA(cl
, o
);
482 //DB2(bug("UAEGFXBitmap__Root__Get\n"));
483 if (IS_BITMAP_ATTR(msg
->attrID
, idx
)) {
484 //DB2(bug("=%d\n", idx));
486 case aoHidd_BitMap_LeftEdge
:
487 *msg
->storage
= 0;//data->leftedge;
489 case aoHidd_BitMap_TopEdge
:
490 *msg
->storage
= 0;//data->topedge;
492 case aoHidd_BitMap_Visible
:
493 *msg
->storage
= csd
->disp
== data
;
495 case aoHidd_BitMap_Align
:
496 *msg
->storage
= data
->align
;
498 case aoHidd_BitMap_BytesPerRow
:
499 *msg
->storage
= data
->bytesperline
;
501 case aoHidd_BitMap_IsLinearMem
:
502 *msg
->storage
= TRUE
;
506 //DB2(bug("UAEGFXBitmap__Root__Get Exit\n"));
507 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
510 /****************************************************************************************/
512 static int UAEGFXBitmap_Init(LIBBASETYPEPTR LIBBASE
)
514 D(bug("UAEGFXBitmap_Init\n"));
515 return TRUE
; //return OOP_ObtainAttrBases(attrbases);
518 /****************************************************************************************/
520 static int UAEGFXBitmap_Expunge(LIBBASETYPEPTR LIBBASE
)
522 D(bug("UAEGFXBitmap_Expunge\n"));
523 //OOP_ReleaseAttrBases(attrbases);
527 /****************************************************************************************/
529 ADD2INITLIB(UAEGFXBitmap_Init
, 0);
530 ADD2EXPUNGELIB(UAEGFXBitmap_Expunge
, 0);
532 BOOL
UAEGFXBitmap__Hidd_BitMap__ObtainDirectAccess(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_BitMap_ObtainDirectAccess
*msg
)
534 struct uaegfx_staticdata
*csd
= CSD(cl
);
535 struct bm_data
*data
= OOP_INST_DATA(cl
, o
);
541 if (!movebitmaptovram(csd
, data
))
546 *msg
->addressReturn
= data
->VideoData
;
547 *msg
->widthReturn
= data
->width
;
548 *msg
->heightReturn
= data
->height
;
549 /* undocumented, just a guess.. */
550 *msg
->bankSizeReturn
= *msg
->memSizeReturn
= data
->bytesperline
* data
->height
;
560 VOID
UAEGFXBitmap__Hidd_BitMap__ReleaseDirectAccess(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_BitMap_ReleaseDirectAccess
*msg
)
562 struct uaegfx_staticdata
*csd
= CSD(cl
);
563 struct bm_data
*data
= OOP_INST_DATA(cl
, o
);
569 BOOL
UAEGFXBitmap__Hidd_BitMap__SetColors(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_BitMap_SetColors
*msg
)
571 struct uaegfx_staticdata
*csd
= CSD(cl
);
575 if (!OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
))
581 clut
= csd
->boardinfo
+ PSSO_BoardInfo_CLUT
;
582 for (i
= msg
->firstColor
, j
= 0; j
< msg
->numColors
; i
++, j
++) {
583 clut
[i
* 3 + 0] = msg
->colors
[j
].red
>> 8;
584 clut
[i
* 3 + 1] = msg
->colors
[j
].green
>> 8;
585 clut
[i
* 3 + 2] = msg
->colors
[j
].blue
>> 8;
586 //bug("UAESET color %d %02x%02x%02x\n", i, msg->colors[j].red >> 8, msg->colors[j].green >> 8, msg->colors[j].blue >> 8);
588 SetColorArray(csd
, msg
->firstColor
, msg
->numColors
);
595 VOID
UAEGFXBitmap__Hidd_BitMap__PutPixel(OOP_Class
*cl
, OOP_Object
*o
,
596 struct pHidd_BitMap_PutPixel
*msg
)
598 struct uaegfx_staticdata
*csd
= CSD(cl
);
599 struct bm_data
*data
= OOP_INST_DATA(cl
, o
);
601 HIDDT_Pixel pixel
= msg
->pixel
;
610 offset
= (msg
->x
* data
->bytesperpixel
) + (msg
->y
* data
->bytesperline
);
611 mem
= data
->VideoData
+ offset
;
613 switch(data
->bytesperpixel
)
616 *(UBYTE
*)mem
= pixel
;
620 *(UWORD
*)mem
= pixel
;
624 *(UBYTE
*)(mem
) = pixel
>> 16;
625 *(UBYTE
*)(mem
+ 1) = pixel
>> 8;
626 *(UBYTE
*)(mem
+ 2) = pixel
;
630 *(ULONG
*)mem
= pixel
;
639 /****************************************************************************************/
641 ULONG
UAEGFXBitmap__Hidd_BitMap__GetPixel(OOP_Class
*cl
, OOP_Object
*o
,
642 struct pHidd_BitMap_GetPixel
*msg
)
644 struct uaegfx_staticdata
*csd
= CSD(cl
);
645 struct bm_data
*data
= OOP_INST_DATA(cl
, o
);
646 HIDDT_Pixel pixel
= 0;
656 offset
= (msg
->x
* data
->bytesperpixel
) +(msg
->y
* data
->bytesperline
);
657 mem
= data
->VideoData
+ offset
;
659 switch(data
->bytesperpixel
)
662 pixel
= *(UBYTE
*)mem
;
666 pixel
= *(UWORD
*)mem
;
670 pixel
= (mem
[0] << 16) | (mem
[1] << 8) | mem
[2];
674 pixel
= *(ULONG
*)mem
;
684 /****************************************************************************************/
686 VOID
UAEGFXBitmap__Hidd_BitMap__DrawLine(OOP_Class
*cl
, OOP_Object
*o
,
687 struct pHidd_BitMap_DrawLine
*msg
)
689 struct uaegfx_staticdata
*csd
= CSD(cl
);
695 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
698 /****************************************************************************************/
700 VOID
UAEGFXBitmap__Hidd_BitMap__GetImage(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_BitMap_GetImage
*msg
)
702 struct bm_data
*data
= OOP_INST_DATA(cl
, o
);
703 struct uaegfx_staticdata
*csd
= CSD(cl
);
713 case vHidd_StdPixFmt_Native
:
714 switch(data
->bytesperpixel
)
717 HIDD_BM_CopyMemBox8(o
,
731 HIDD_BM_CopyMemBox16(o
,
745 HIDD_BM_CopyMemBox24(o
,
759 HIDD_BM_CopyMemBox32(o
,
772 } /* switch(data->bytesperpix) */
775 case vHidd_StdPixFmt_Native32
:
776 switch(data
->bytesperpixel
)
779 HIDD_BM_GetMem32Image8(o
,
791 HIDD_BM_GetMem32Image16(o
,
803 HIDD_BM_GetMem32Image24(o
,
815 HIDD_BM_CopyMemBox32(o
,
828 } /* switch(data->bytesperpix) */
833 APTR pixels
= msg
->pixels
;
834 APTR srcPixels
= data
->VideoData
+ msg
->y
* data
->bytesperline
+ msg
->x
* data
->bytesperpixel
;
837 dstpf
= HIDD_Gfx_GetPixFmt(data
->gfxhidd
, msg
->pixFmt
);
839 HIDD_BM_ConvertPixels(o
, &srcPixels
, (HIDDT_PixelFormat
*)data
->pixfmtobj
, data
->bytesperline
,
840 &pixels
, (HIDDT_PixelFormat
*)dstpf
, msg
->modulo
,
841 msg
->width
, msg
->height
, NULL
);
845 } /* switch(msg->pixFmt) */
850 /****************************************************************************************/
852 VOID
UAEGFXBitmap__Hidd_BitMap__PutImage(OOP_Class
*cl
, OOP_Object
*o
,
853 struct pHidd_BitMap_PutImage
*msg
)
855 struct bm_data
*data
= OOP_INST_DATA(cl
, o
);
856 struct uaegfx_staticdata
*csd
= CSD(cl
);
866 case vHidd_StdPixFmt_Native
:
867 switch(data
->bytesperpixel
)
870 HIDD_BM_CopyMemBox8(o
,
884 HIDD_BM_CopyMemBox16(o
,
898 HIDD_BM_CopyMemBox24(o
,
912 HIDD_BM_CopyMemBox32(o
,
925 } /* switch(data->bytesperpix) */
928 case vHidd_StdPixFmt_Native32
:
929 switch(data
->bytesperpixel
)
932 HIDD_BM_PutMem32Image8(o
,
944 HIDD_BM_PutMem32Image16(o
,
956 HIDD_BM_PutMem32Image24(o
,
968 HIDD_BM_CopyMemBox32(o
,
981 } /* switch(data->bytesperpix) */
986 APTR pixels
= msg
->pixels
;
987 APTR dstBuf
= data
->VideoData
+ msg
->y
* data
->bytesperline
+ msg
->x
* data
->bytesperpixel
;
990 srcpf
= HIDD_Gfx_GetPixFmt(data
->gfxhidd
, msg
->pixFmt
);
992 HIDD_BM_ConvertPixels(o
, &pixels
, (HIDDT_PixelFormat
*)srcpf
, msg
->modulo
,
993 &dstBuf
, (HIDDT_PixelFormat
*)data
->pixfmtobj
, data
->bytesperline
,
994 msg
->width
, msg
->height
, NULL
);
998 } /* switch(msg->pixFmt) */
1003 /****************************************************************************************/
1005 VOID
UAEGFXBitmap__Hidd_BitMap__PutImageLUT(OOP_Class
*cl
, OOP_Object
*o
,
1006 struct pHidd_BitMap_PutImageLUT
*msg
)
1008 struct bm_data
*data
= OOP_INST_DATA(cl
, o
);
1009 struct uaegfx_staticdata
*csd
= CSD(cl
);
1017 switch(data
->bytesperpixel
)
1020 HIDD_BM_CopyLUTMemBox16(o
,
1035 HIDD_BM_CopyLUTMemBox24(o
,
1050 HIDD_BM_CopyLUTMemBox32(o
,
1065 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
1068 } /* switch(data->bytesperpix) */
1073 /****************************************************************************************/
1075 VOID
UAEGFXBitmap__Hidd_BitMap__GetImageLUT(OOP_Class
*cl
, OOP_Object
*o
,
1076 struct pHidd_BitMap_GetImageLUT
*msg
)
1078 struct uaegfx_staticdata
*csd
= CSD(cl
);
1084 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
1087 /****************************************************************************************/
1089 VOID
UAEGFXBitmap__Hidd_BitMap__FillRect(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_BitMap_DrawRect
*msg
)
1091 HIDDT_Pixel fg
= GC_FG(msg
->gc
);
1092 HIDDT_DrawMode mode
= GC_DRMD(msg
->gc
);
1093 struct uaegfx_staticdata
*csd
= CSD(cl
);
1094 struct bm_data
*data
= OOP_INST_DATA(cl
, o
);
1095 struct RenderInfo ri
;
1104 maybeputinvram(csd
, data
);
1108 makerenderinfo(csd
, &ri
, data
);
1112 if (mode
== vHidd_GC_DrawMode_Clear
|| mode
== vHidd_GC_DrawMode_Set
) {
1113 ULONG pen
= mode
== vHidd_GC_DrawMode_Clear
? 0x00000000 : 0xffffffff;
1114 v
= FillRect(csd
, &ri
, msg
->minX
, msg
->minY
, msg
->maxX
- msg
->minX
+ 1, msg
->maxY
- msg
->minY
+ 1, pen
, 0xff, data
->rgbformat
);
1115 } else if (mode
== vHidd_GC_DrawMode_Copy
) {
1116 v
= FillRect(csd
, &ri
, msg
->minX
, msg
->minY
, msg
->maxX
- msg
->minX
+ 1, msg
->maxY
- msg
->minY
+ 1, fg
, 0xff, data
->rgbformat
);
1117 } else if (mode
== vHidd_GC_DrawMode_Invert
) {
1118 v
= InvertRect(csd
, &ri
, msg
->minX
, msg
->minY
, msg
->maxX
- msg
->minX
+ 1, msg
->maxY
- msg
->minY
+ 1, 0xff, data
->rgbformat
);
1124 if (!v
) switch(mode
)
1126 case vHidd_GC_DrawMode_Copy
:
1127 switch(data
->bytesperpixel
)
1130 HIDD_BM_FillMemRect8(o
,
1141 HIDD_BM_FillMemRect16(o
,
1152 HIDD_BM_FillMemRect24(o
,
1163 HIDD_BM_FillMemRect32(o
,
1176 case vHidd_GC_DrawMode_Invert
:
1177 HIDD_BM_InvertMemRect(o
,
1179 msg
->minX
* data
->bytesperpixel
,
1181 msg
->maxX
* data
->bytesperpixel
+ data
->bytesperpixel
- 1,
1183 data
->bytesperline
);
1187 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
1190 } /* switch(mode) */
1196 /****************************************************************************************/
1198 VOID
UAEGFXBitmap__Hidd_BitMap__PutPattern(OOP_Class
*cl
, OOP_Object
*o
,
1199 struct pHidd_BitMap_PutPattern
*msg
)
1201 struct uaegfx_staticdata
*csd
= CSD(cl
);
1202 struct bm_data
*data
= OOP_INST_DATA(cl
, o
);
1203 HIDDT_Pixel fg
= GC_FG(msg
->gc
);
1204 HIDDT_Pixel bg
= GC_BG(msg
->gc
);
1206 struct RenderInfo ri
;
1216 DB2(bug("blitpattern(%d,%d)(%d,%d)(%x,%d,%d,%d,%d,%d)\n",
1217 msg
->x
, msg
->y
, msg
->width
, msg
->height
,
1218 msg
->pattern
, msg
->patternsrcx
, msg
->patternsrcy
, fg
, bg
, msg
->patternheight
));
1220 if ((msg
->mask
== NULL
) && (msg
->patterndepth
== 1))
1222 switch (msg
->patternheight
)
1258 maybeputinvram(csd
, data
);
1262 makerenderinfo(csd
, &ri
, data
);
1263 if (GC_COLEXP(msg
->gc
) == vHidd_GC_ColExp_Transparent
)
1265 else if (GC_DRMD(msg
->gc
) == vHidd_GC_DrawMode_Invert
)
1266 drawmode
= COMPLEMENT
;
1269 if (msg
->invertpattern
)
1270 drawmode
|= INVERSVID
;
1272 pat
.Memory
= msg
->pattern
;
1273 pat
.XOffset
= msg
->patternsrcx
;
1274 pat
.YOffset
= msg
->patternsrcy
;
1277 pat
.DrawMode
= drawmode
;
1281 v
= BlitPattern(csd
, &ri
, &pat
, msg
->x
, msg
->y
, msg
->width
, msg
->height
, 0xff, data
->rgbformat
);
1288 if (!v
) switch(data
->bytesperpixel
)
1291 HIDD_BM_PutMemPattern8(o
,
1312 HIDD_BM_PutMemPattern16(o
,
1333 HIDD_BM_PutMemPattern24(o
,
1354 HIDD_BM_PutMemPattern32(o
,
1375 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
1378 } /* switch(data->bytesperpixel) */
1384 /****************************************************************************************/
1386 VOID
UAEGFXBitmap__Hidd_BitMap__PutTemplate(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_BitMap_PutTemplate
*msg
)
1388 struct uaegfx_staticdata
*csd
= CSD(cl
);
1389 struct bm_data
*data
= OOP_INST_DATA(cl
, o
);
1390 HIDDT_Pixel fg
= GC_FG(msg
->gc
);
1391 HIDDT_Pixel bg
= GC_BG(msg
->gc
);
1392 struct Template tmpl
;
1393 struct RenderInfo ri
;
1404 maybeputinvram(csd
, data
);
1408 makerenderinfo(csd
, &ri
, data
);
1409 if (GC_COLEXP(msg
->gc
) == vHidd_GC_ColExp_Transparent
)
1411 else if (GC_DRMD(msg
->gc
) == vHidd_GC_DrawMode_Invert
)
1412 drawmode
= COMPLEMENT
;
1415 if (msg
->inverttemplate
)
1416 drawmode
|= INVERSVID
;
1418 /* tmpl.XOffset has only UBYTE size so we must fix params up [1] [2] */
1420 tmpl
.Memory
= msg
->masktemplate
+ ((msg
->srcx
/ 8) & ~1); /* [1] */
1421 tmpl
.BytesPerRow
= msg
->modulo
;
1422 tmpl
.XOffset
= msg
->srcx
& 0XF; /* [2] */
1423 tmpl
.DrawMode
= drawmode
;
1428 v
= BlitTemplate(csd
, &ri
, &tmpl
, msg
->x
, msg
->y
, msg
->width
, msg
->height
, 0xff, data
->rgbformat
);
1432 if (!v
) switch(data
->bytesperpixel
)
1435 HIDD_BM_PutMemTemplate8(o
,
1446 msg
->inverttemplate
);
1450 HIDD_BM_PutMemTemplate16(o
,
1461 msg
->inverttemplate
);
1465 HIDD_BM_PutMemTemplate24(o
,
1476 msg
->inverttemplate
);
1480 HIDD_BM_PutMemTemplate32(o
,
1491 msg
->inverttemplate
);
1495 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
1498 } /* switch(data->bytesperpixel) */
1505 /****************************************************************************************/
1507 VOID
UAEGFXBitmap__Hidd_BitMap__UpdateRect(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_BitMap_UpdateRect
*msg
)
1509 struct uaegfx_staticdata
*csd
= CSD(cl
);
1515 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
1518 /****************************************************************************************/
1520 BOOL
UAEGFXBitmap__Hidd_PlanarBM__SetBitMap(OOP_Class
*cl
, OOP_Object
*o
,
1521 struct pHidd_PlanarBM_SetBitMap
*msg
)
1523 struct uaegfx_staticdata
*csd
= CSD(cl
);
1529 return OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
1532 /****************************************************************************************/
1534 BOOL
UAEGFXBitmap__Hidd_PlanarBM__GetBitMap(OOP_Class
*cl
, OOP_Object
*o
,
1535 struct pHidd_PlanarBM_GetBitMap
*msg
)
1537 struct uaegfx_staticdata
*csd
= CSD(cl
);
1543 return OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);