2 Copyright 1995-2010, 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>
25 #include <hidd/graphics.h>
26 #include <aros/symbolsets.h>
32 #include <aros/debug.h>
34 #include LC_LIBDEFS_FILE
37 #include "uaegfxbitmap.h"
40 static APTR
allocrtgvrambitmap(struct uaegfx_staticdata
*csd
, struct bm_data
*bm
)
43 SetMemoryMode(csd
, RGBFB_CLUT
);
44 vmem
= Allocate(csd
->vmem
, bm
->memsize
);
45 SetMemoryMode(csd
, bm
->rgbformat
);
46 DVRAM(bug("BM %p: %p,%d VRAM allocated.\n", bm
, vmem
, bm
->memsize
));
50 static void freertgbitmap(struct uaegfx_staticdata
*csd
, struct bm_data
*bm
)
52 DVRAM(bug("BM %p: freeing %p:%d from %s\n", bm
, bm
->VideoData
, bm
->memsize
, bm
->invram
? "VRAM" : "RAM"));
54 SetMemoryMode(csd
, RGBFB_CLUT
);
55 Deallocate(csd
->vmem
, bm
->VideoData
, bm
->memsize
);
56 SetMemoryMode(csd
, bm
->rgbformat
);
57 csd
->vram_used
-= bm
->memsize
;
59 FreeMem(bm
->VideoData
, bm
->memsize
);
60 csd
->fram_used
-= bm
->memsize
;
66 static BOOL
movebitmaptofram(struct uaegfx_staticdata
*csd
, struct bm_data
*bm
)
71 vmem
= AllocMem(bm
->memsize
, MEMF_ANY
);
73 SetMemoryMode(csd
, bm
->rgbformat
);
74 CopyMemQuick(bm
->VideoData
, vmem
, bm
->memsize
);
75 freertgbitmap(csd
, bm
);
77 csd
->fram_used
+= bm
->memsize
;
80 DVRAM(bug("BM %p: moved to RAM %p:%d. VRAM=%d\n", bm
, bm
->VideoData
, bm
->memsize
, csd
->vram_used
));
84 static BOOL
allocrtgbitmap(struct uaegfx_staticdata
*csd
, struct bm_data
*bm
, BOOL usevram
)
86 bm
->memsize
= (bm
->bytesperline
* bm
->height
+ 7) & ~7;
87 if (!(bm
->VideoData
= allocrtgvrambitmap(csd
, bm
))) {
88 if (usevram
&& bm
->memsize
< csd
->vram_size
) {
89 struct bm_data
*bmnode
;
90 ForeachNode(&csd
->bitmaplist
, bmnode
) {
91 if (bmnode
!= bm
&& bmnode
->invram
&& !bmnode
->locked
) {
92 if (movebitmaptofram(csd
, bmnode
)) {
93 if ((bm
->VideoData
= allocrtgvrambitmap(csd
, bm
))) {
94 csd
->vram_used
+= bm
->memsize
;
102 if (!bm
->VideoData
) {
103 bm
->VideoData
= AllocMem(bm
->memsize
, MEMF_ANY
);
105 csd
->fram_used
+= bm
->memsize
;
108 csd
->vram_used
+= bm
->memsize
;
111 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
));
112 return bm
->VideoData
!= NULL
;
115 static BOOL
movethisbitmaptovram(struct uaegfx_staticdata
*csd
, struct bm_data
*bm
)
117 APTR vmem
= allocrtgvrambitmap(csd
, bm
);
119 SetMemoryMode(csd
, bm
->rgbformat
);
120 CopyMemQuick(bm
->VideoData
, vmem
, bm
->memsize
);
121 freertgbitmap(csd
, bm
);
122 bm
->VideoData
= vmem
;
124 csd
->vram_used
+= bm
->memsize
;
125 DVRAM(bug("BM %p: %p:%d moved back to VRAM\n", bm
, bm
->VideoData
, bm
->memsize
));
131 static BOOL
movebitmaptovram(struct uaegfx_staticdata
*csd
, struct bm_data
*bm
)
133 struct bm_data
*bmnode
;
137 DVRAM(bug("BM %p: %p,%d needs to be in VRAM...\n", bm
, bm
->VideoData
, bm
->memsize
));
138 ForeachNode(&csd
->bitmaplist
, bmnode
) {
139 if (bmnode
!= bm
&& bmnode
->invram
&& !bmnode
->locked
) {
140 if (movebitmaptofram(csd
, bmnode
)) {
141 if (movethisbitmaptovram(csd
, bm
)) {
147 DVRAM(bug("-> not enough memory, VRAM=%d\n", csd
->vram_used
));
151 static BOOL
maybeputinvram(struct uaegfx_staticdata
*csd
, struct bm_data
*bm
)
155 if (bm
->memsize
>= csd
->vram_size
- csd
->vram_used
)
157 return movethisbitmaptovram(csd
, bm
);
160 static void hidescreen(struct uaegfx_staticdata
*csd
, struct bm_data
*bm
)
162 D(bug("Hide %p: (%p:%d)\n",
163 bm
, bm
->VideoData
, bm
->memsize
));
164 SetInterrupt(csd
, FALSE
);
165 SetDisplay(csd
, FALSE
);
166 SetSwitch(csd
, FALSE
);
173 /****************************************************************************************/
175 #define AO(x) (aoHidd_BitMap_ ## x)
176 #define GOT_BM_ATTR(code) GOT_ATTR(code, aoHidd_BitMap, bitmap)
178 /****************************************************************************************/
180 OOP_Object
*UAEGFXBitmap__Root__New(OOP_Class
*cl
, OOP_Object
*o
, struct pRoot_New
*msg
)
182 struct uaegfx_staticdata
*csd
= CSD(cl
);
183 struct Library
*OOPBase
= csd
->cs_OOPBase
;
185 struct bm_data
*data
;
186 IPTR width
, height
, multi
;
190 DB2(bug("UAEGFXBitmap__Root__New\n"));
192 o
=(OOP_Object
*)OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
196 data
= OOP_INST_DATA(cl
, o
);
197 memset(data
, 0, sizeof (*data
));
201 OOP_GetAttr(o
, aHidd_BitMap_Width
, &width
);
202 OOP_GetAttr(o
, aHidd_BitMap_Height
, &height
);
203 OOP_GetAttr(o
, aHidd_BitMap_Displayable
, &displayable
);
204 OOP_GetAttr(o
, aHidd_BitMap_GfxHidd
, (APTR
)&data
->gfxhidd
);
205 OOP_GetAttr(o
, aHidd_BitMap_PixFmt
, (APTR
)&data
->pixfmtobj
);
206 OOP_GetAttr(data
->pixfmtobj
, aHidd_PixFmt_BytesPerPixel
, &multi
);
208 data
->rgbformat
= getrtgformat(csd
, data
->pixfmtobj
);
210 width
= CalculateBytesPerRow(csd
, width
, data
->rgbformat
);
211 data
->bytesperline
= width
;
212 data
->height
= height
;
213 data
->bytesperpixel
= multi
;
214 allocrtgbitmap(csd
, data
, TRUE
);
215 AddTail(&csd
->bitmaplist
, (struct Node
*)&data
->node
);
217 DB2(bug("%dx%dx%d RGBF=%08x P=%08x\n", width
, height
, multi
, data
->rgbformat
, data
->VideoData
));
219 if (data
->VideoData
== NULL
)
222 OOP_GetAttr(o
, aHidd_BitMap_ModeID
, &modeid
);
223 if (ok
&& modeid
!= vHidd_ModeID_Invalid
) {
224 OOP_Object
*sync
, *pf
;
225 IPTR dwidth
, dheight
;
227 HIDD_Gfx_GetMode(data
->gfxhidd
, modeid
, &sync
, &pf
);
228 OOP_GetAttr(sync
, aHidd_Sync_HDisp
, &dwidth
);
229 OOP_GetAttr(sync
, aHidd_Sync_VDisp
, &dheight
);
230 data
->disp_width
= dwidth
;
231 data
->disp_height
= dheight
;
235 OOP_MethodID dispose_mid
;
236 dispose_mid
= OOP_GetMethodID(IID_Root
, moRoot_Dispose
);
237 OOP_CoerceMethod(cl
, o
, (OOP_Msg
)&dispose_mid
);
241 DB2(bug("ret=%x bm=%p (%p:%d)\n", o
, data
, data
->VideoData
, data
->memsize
));
246 VOID
UAEGFXBitmap__Root__Dispose(OOP_Class
*cl
, OOP_Object
*o
, OOP_Msg msg
)
248 struct uaegfx_staticdata
*csd
= CSD(cl
);
249 struct bm_data
*data
;
251 data
= OOP_INST_DATA(cl
, o
);
254 DB2(bug("UAEGFXBitmap__Root__Dispose %x bm=%x (%p,%d)\n", o
, data
, data
->VideoData
, data
->memsize
));
256 hidescreen(csd
, data
);
258 FreeVec(data
->palette
);
259 freertgbitmap(csd
, data
);
260 Remove((struct Node
*)&data
->node
);
262 OOP_DoSuperMethod(cl
, o
, msg
);
265 VOID
UAEGFXBitmap__Root__Set(OOP_Class
*cl
, OOP_Object
*o
, struct pRoot_Set
*msg
)
267 struct uaegfx_staticdata
*csd
= CSD(cl
);
268 struct Library
*OOPBase
= csd
->cs_OOPBase
;
269 struct bm_data
*data
= OOP_INST_DATA(cl
, o
);
270 struct TagItem
*tag
, *tstate
;
274 DB2(bug("UAEGFXBitmap__Root__Set %p (%p:%d)\n", data
, data
->VideoData
, data
->memsize
));
275 tstate
= msg
->attrList
;
276 while((tag
= NextTagItem((const struct TagItem
**)&tstate
)))
278 DB2(bug("%d/%d\n", tag
->ti_Tag
, tag
->ti_Data
));
279 if(IS_BITMAP_ATTR(tag
->ti_Tag
, idx
))
281 DB2(bug("->%d\n", idx
));
284 case aoHidd_BitMap_Visible
:
286 OOP_Object
*gfxhidd
, *sync
, *pf
;
287 IPTR modeid
= vHidd_ModeID_Invalid
;
288 IPTR dwidth
, dheight
, depth
, width
, height
;
289 struct ModeInfo
*modeinfo
;
291 OOP_GetAttr(o
, aHidd_BitMap_Width
, &width
);
292 OOP_GetAttr(o
, aHidd_BitMap_Height
, &height
);
293 OOP_GetAttr(o
, aHidd_BitMap_ModeID
, &modeid
);
294 OOP_GetAttr(o
, aHidd_BitMap_GfxHidd
, (IPTR
*)&gfxhidd
);
295 HIDD_Gfx_GetMode(gfxhidd
, modeid
, &sync
, &pf
);
296 OOP_GetAttr(sync
, aHidd_Sync_HDisp
, &dwidth
);
297 OOP_GetAttr(sync
, aHidd_Sync_VDisp
, &dheight
);
298 OOP_GetAttr(pf
, aHidd_PixFmt_Depth
, &depth
);
299 data
->rgbformat
= getrtgformat(csd
, pf
);
300 modeinfo
= getrtgmodeinfo(csd
, sync
, pf
, csd
->fakemodeinfo
);
301 csd
->modeinfo
= modeinfo
;
302 csd
->rgbformat
= data
->rgbformat
;
303 pw(csd
->bitmapextra
+ PSSO_BitMapExtra_Width
, width
);
304 pw(csd
->bitmapextra
+ PSSO_BitMapExtra_Height
, height
);
305 D(bug("Show %p: (%p:%d) %dx%dx%d (%dx%d) BF=%08x\n",
306 data
, data
->VideoData
, data
->memsize
,
307 dwidth
, dheight
, depth
, width
, height
, data
->rgbformat
));
310 movebitmaptovram(csd
, data
);
312 csd
->dwidth
= dwidth
;
313 csd
->dheight
= dheight
;
314 csd
->dmodeid
= modeid
;
316 if (csd
->hardwaresprite
&& depth
<= 8) {
318 UBYTE
*clut
= csd
->boardinfo
+ PSSO_BoardInfo_CLUT
;
319 for (i
= csd
->spritecolors
+ 1; i
< csd
->spritecolors
+ 4; i
++)
320 SetSpriteColor(csd
, i
- (csd
->spritecolors
+ 1), clut
[i
* 3 + 0], clut
[i
* 3 + 1], clut
[i
* 3 + 2]);
322 SetInterrupt(csd
, FALSE
);
323 SetColorArray(csd
, 0, 256);
324 SetDisplay(csd
, FALSE
);
325 SetGC(csd
, modeinfo
, 0);
328 SetPanning(csd
, data
->VideoData
, dwidth
, 0, 0);
329 SetDisplay(csd
, TRUE
);
330 SetSwitch(csd
, TRUE
);
331 SetInterrupt(csd
, TRUE
);
336 hidescreen(csd
, data
);
339 case aoHidd_BitMap_LeftEdge
:
340 if (data
->leftedge
!= tag
->ti_Data
) {
341 data
->leftedge
= tag
->ti_Data
;
345 case aoHidd_BitMap_TopEdge
:
346 if (data
->topedge
!= tag
->ti_Data
) {
347 data
->topedge
= tag
->ti_Data
;
354 DB2(bug("UAEGFXBitmap__Root__Set Exit\n"));
355 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
357 if (moved
&& csd
->disp
== data
)
358 setscroll(csd
, data
);
364 VOID
UAEGFXBitmap__Root__Get(OOP_Class
*cl
, OOP_Object
*o
, struct pRoot_Get
*msg
)
366 struct uaegfx_staticdata
*csd
= CSD(cl
);
367 struct bm_data
*data
= OOP_INST_DATA(cl
, o
);
370 //DB2(bug("UAEGFXBitmap__Root__Get\n"));
371 if (IS_BITMAP_ATTR(msg
->attrID
, idx
)) {
372 //DB2(bug("=%d\n", idx));
374 case aoHidd_BitMap_LeftEdge
:
375 *msg
->storage
= 0;//data->leftedge;
377 case aoHidd_BitMap_TopEdge
:
378 *msg
->storage
= 0;//data->topedge;
380 case aoHidd_BitMap_Visible
:
381 *msg
->storage
= data
->disp
;
383 case aoHidd_BitMap_Align
:
386 case aoHidd_BitMap_IsLinearMem
:
387 *msg
->storage
= TRUE
;
391 //DB2(bug("UAEGFXBitmap__Root__Get Exit\n"));
392 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
395 /****************************************************************************************/
397 static int UAEGFXBitmap_Init(LIBBASETYPEPTR LIBBASE
)
399 D(bug("UAEGFXBitmap_Init\n"));
400 return TRUE
; //return OOP_ObtainAttrBases(attrbases);
403 /****************************************************************************************/
405 static int UAEGFXBitmap_Expunge(LIBBASETYPEPTR LIBBASE
)
407 D(bug("UAEGFXBitmap_Expunge\n"));
408 //OOP_ReleaseAttrBases(attrbases);
412 /****************************************************************************************/
414 ADD2INITLIB(UAEGFXBitmap_Init
, 0);
415 ADD2EXPUNGELIB(UAEGFXBitmap_Expunge
, 0);
417 BOOL
UAEGFXBitmap__Hidd_BitMap__ObtainDirectAccess(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_BitMap_ObtainDirectAccess
*msg
)
419 struct uaegfx_staticdata
*csd
= CSD(cl
);
420 struct bm_data
*data
= OOP_INST_DATA(cl
, o
);
423 if (!movebitmaptovram(csd
, data
))
427 *msg
->addressReturn
= data
->VideoData
;
428 *msg
->widthReturn
= data
->width
;
429 *msg
->heightReturn
= data
->height
;
430 /* undocumented, just a guess.. */
431 *msg
->bankSizeReturn
= *msg
->memSizeReturn
= data
->bytesperline
* data
->height
;
437 VOID
UAEGFXBitmap__Hidd_BitMap__ReleaseDirectAccess(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_BitMap_ReleaseDirectAccess
*msg
)
439 struct bm_data
*data
= OOP_INST_DATA(cl
, o
);
443 BOOL
UAEGFXBitmap__Hidd_BitMap__SetColors(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_BitMap_SetColors
*msg
)
445 struct uaegfx_staticdata
*csd
= CSD(cl
);
449 if (!OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
))
452 clut
= csd
->boardinfo
+ PSSO_BoardInfo_CLUT
;
453 for (i
= msg
->firstColor
, j
= 0; j
< msg
->numColors
; i
++, j
++) {
454 clut
[i
* 3 + 0] = msg
->colors
[j
].red
>> 8;
455 clut
[i
* 3 + 1] = msg
->colors
[j
].green
>> 8;
456 clut
[i
* 3 + 2] = msg
->colors
[j
].blue
>> 8;
457 //bug("%d %02x%02x%02x\n", i, msg->colors[j].red >> 8, msg->colors[j].green >> 8, msg->colors[j].blue >> 8);
459 SetColorArray(csd
, msg
->firstColor
, msg
->numColors
);
463 VOID
UAEGFXBitmap__Hidd_BitMap__PutPixel(OOP_Class
*cl
, OOP_Object
*o
,
464 struct pHidd_BitMap_PutPixel
*msg
)
466 struct uaegfx_staticdata
*csd
= CSD(cl
);
467 struct bm_data
*data
= OOP_INST_DATA(cl
, o
);
469 HIDDT_Pixel pixel
= msg
->pixel
;
473 offset
= (msg
->x
* data
->bytesperpixel
) + (msg
->y
* data
->bytesperline
);
474 mem
= data
->VideoData
+ offset
;
476 switch(data
->bytesperpixel
)
479 *(UBYTE
*)mem
= pixel
;
483 *(UWORD
*)mem
= pixel
;
487 *(UBYTE
*)(mem
) = pixel
>> 16;
488 *(UBYTE
*)(mem
+ 1) = pixel
>> 8;
489 *(UBYTE
*)(mem
+ 2) = pixel
;
493 *(ULONG
*)mem
= pixel
;
500 /****************************************************************************************/
502 ULONG
UAEGFXBitmap__Hidd_BitMap__GetPixel(OOP_Class
*cl
, OOP_Object
*o
,
503 struct pHidd_BitMap_GetPixel
*msg
)
505 struct uaegfx_staticdata
*csd
= CSD(cl
);
506 struct bm_data
*data
= OOP_INST_DATA(cl
, o
);
507 HIDDT_Pixel pixel
= 0;
512 offset
= (msg
->x
* data
->bytesperpixel
) +(msg
->y
* data
->bytesperline
);
513 mem
= data
->VideoData
+ offset
;
515 switch(data
->bytesperpixel
)
518 pixel
= *(UBYTE
*)mem
;
522 pixel
= *(UWORD
*)mem
;
526 pixel
= (mem
[0] << 16) | (mem
[1] << 8) | mem
[2];
530 pixel
= *(ULONG
*)mem
;
538 /****************************************************************************************/
540 VOID
UAEGFXBitmap__Hidd_BitMap__DrawLine(OOP_Class
*cl
, OOP_Object
*o
,
541 struct pHidd_BitMap_DrawLine
*msg
)
543 struct uaegfx_staticdata
*csd
= CSD(cl
);
546 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
549 /****************************************************************************************/
551 VOID
UAEGFXBitmap__Hidd_BitMap__GetImage(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_BitMap_GetImage
*msg
)
553 struct bm_data
*data
= OOP_INST_DATA(cl
, o
);
554 struct uaegfx_staticdata
*csd
= CSD(cl
);
559 case vHidd_StdPixFmt_Native
:
560 switch(data
->bytesperpixel
)
563 HIDD_BM_CopyMemBox8(o
,
577 HIDD_BM_CopyMemBox16(o
,
591 HIDD_BM_CopyMemBox24(o
,
605 HIDD_BM_CopyMemBox32(o
,
618 } /* switch(data->bytesperpix) */
621 case vHidd_StdPixFmt_Native32
:
622 switch(data
->bytesperpixel
)
625 HIDD_BM_GetMem32Image8(o
,
637 HIDD_BM_GetMem32Image16(o
,
649 HIDD_BM_GetMem32Image24(o
,
661 HIDD_BM_CopyMemBox32(o
,
674 } /* switch(data->bytesperpix) */
679 APTR pixels
= msg
->pixels
;
680 APTR srcPixels
= data
->VideoData
+ msg
->y
* data
->bytesperline
+ msg
->x
* data
->bytesperpixel
;
683 dstpf
= HIDD_Gfx_GetPixFmt(data
->gfxhidd
, msg
->pixFmt
);
685 HIDD_BM_ConvertPixels(o
, &srcPixels
, (HIDDT_PixelFormat
*)data
->pixfmtobj
, data
->bytesperline
,
686 &pixels
, (HIDDT_PixelFormat
*)dstpf
, msg
->modulo
,
687 msg
->width
, msg
->height
, NULL
);
691 } /* switch(msg->pixFmt) */
694 /****************************************************************************************/
696 VOID
UAEGFXBitmap__Hidd_BitMap__PutImage(OOP_Class
*cl
, OOP_Object
*o
,
697 struct pHidd_BitMap_PutImage
*msg
)
699 struct bm_data
*data
= OOP_INST_DATA(cl
, o
);
700 struct uaegfx_staticdata
*csd
= CSD(cl
);
705 case vHidd_StdPixFmt_Native
:
706 switch(data
->bytesperpixel
)
709 HIDD_BM_CopyMemBox8(o
,
723 HIDD_BM_CopyMemBox16(o
,
737 HIDD_BM_CopyMemBox24(o
,
751 HIDD_BM_CopyMemBox32(o
,
764 } /* switch(data->bytesperpix) */
767 case vHidd_StdPixFmt_Native32
:
768 switch(data
->bytesperpixel
)
771 HIDD_BM_PutMem32Image8(o
,
783 HIDD_BM_PutMem32Image16(o
,
795 HIDD_BM_PutMem32Image24(o
,
807 HIDD_BM_CopyMemBox32(o
,
820 } /* switch(data->bytesperpix) */
825 APTR pixels
= msg
->pixels
;
826 APTR dstBuf
= data
->VideoData
+ msg
->y
* data
->bytesperline
+ msg
->x
* data
->bytesperpixel
;
829 srcpf
= HIDD_Gfx_GetPixFmt(data
->gfxhidd
, msg
->pixFmt
);
831 HIDD_BM_ConvertPixels(o
, &pixels
, (HIDDT_PixelFormat
*)srcpf
, msg
->modulo
,
832 &dstBuf
, (HIDDT_PixelFormat
*)data
->pixfmtobj
, data
->bytesperline
,
833 msg
->width
, msg
->height
, NULL
);
837 } /* switch(msg->pixFmt) */
840 /****************************************************************************************/
842 VOID
UAEGFXBitmap__Hidd_BitMap__PutImageLUT(OOP_Class
*cl
, OOP_Object
*o
,
843 struct pHidd_BitMap_PutImageLUT
*msg
)
845 struct bm_data
*data
= OOP_INST_DATA(cl
, o
);
846 struct uaegfx_staticdata
*csd
= CSD(cl
);
849 switch(data
->bytesperpixel
)
852 HIDD_BM_CopyLUTMemBox16(o
,
867 HIDD_BM_CopyLUTMemBox24(o
,
882 HIDD_BM_CopyLUTMemBox32(o
,
897 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
900 } /* switch(data->bytesperpix) */
903 /****************************************************************************************/
905 VOID
UAEGFXBitmap__Hidd_BitMap__GetImageLUT(OOP_Class
*cl
, OOP_Object
*o
,
906 struct pHidd_BitMap_GetImageLUT
*msg
)
908 struct uaegfx_staticdata
*csd
= CSD(cl
);
911 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
914 /****************************************************************************************/
916 VOID
UAEGFXBitmap__Hidd_BitMap__FillRect(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_BitMap_DrawRect
*msg
)
918 HIDDT_Pixel fg
= GC_FG(msg
->gc
);
919 HIDDT_DrawMode mode
= GC_DRMD(msg
->gc
);
920 struct uaegfx_staticdata
*csd
= CSD(cl
);
921 struct bm_data
*data
= OOP_INST_DATA(cl
, o
);
922 struct RenderInfo ri
;
926 maybeputinvram(csd
, data
);
928 makerenderinfo(csd
, &ri
, data
);
929 if (mode
== vHidd_GC_DrawMode_Clear
|| mode
== vHidd_GC_DrawMode_Set
) {
930 ULONG pen
= mode
== vHidd_GC_DrawMode_Clear
? 0x00000000 : 0xffffffff;
931 v
= FillRect(csd
, &ri
, msg
->minX
, msg
->minY
, msg
->maxX
- msg
->minX
+ 1, msg
->maxY
- msg
->minY
+ 1, pen
, 0xff, data
->rgbformat
);
932 } else if (mode
== vHidd_GC_DrawMode_Copy
) {
933 v
= FillRect(csd
, &ri
, msg
->minX
, msg
->minY
, msg
->maxX
- msg
->minX
+ 1, msg
->maxY
- msg
->minY
+ 1, fg
, 0xff, data
->rgbformat
);
934 } else if (mode
== vHidd_GC_DrawMode_Invert
) {
935 v
= InvertRect(csd
, &ri
, msg
->minX
, msg
->minY
, msg
->maxX
- msg
->minX
+ 1, msg
->maxY
- msg
->minY
+ 1, 0xff, data
->rgbformat
);
939 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
942 /****************************************************************************************/
944 VOID
UAEGFXBitmap__Hidd_BitMap__PutPattern(OOP_Class
*cl
, OOP_Object
*o
,
945 struct pHidd_BitMap_PutPattern
*msg
)
947 struct uaegfx_staticdata
*csd
= CSD(cl
);
948 struct bm_data
*data
= OOP_INST_DATA(cl
, o
);
949 HIDDT_Pixel fg
= GC_FG(msg
->gc
);
950 HIDDT_Pixel bg
= GC_BG(msg
->gc
);
952 struct RenderInfo ri
;
958 DB2(bug("blitpattern(%d,%d)(%d,%d)(%x,%d,%d,%d,%d,%d)\n",
959 msg
->x
, msg
->y
, msg
->width
, msg
->height
,
960 msg
->pattern
, msg
->patternsrcx
, msg
->patternsrcy
, fg
, bg
, msg
->patternheight
));
962 if (msg
->mask
|| msg
->patterndepth
> 1) {
963 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
967 maybeputinvram(csd
, data
);
969 makerenderinfo(csd
, &ri
, data
);
970 if (GC_COLEXP(msg
->gc
) == vHidd_GC_ColExp_Transparent
)
972 else if (GC_DRMD(msg
->gc
) == vHidd_GC_DrawMode_Invert
)
973 drawmode
= COMPLEMENT
;
976 if (msg
->invertpattern
)
977 drawmode
|= INVERSVID
;
979 pat
.Memory
= msg
->pattern
;
980 pat
.XOffset
= msg
->patternsrcx
;
981 pat
.YOffset
= msg
->patternsrcy
;
984 pat
.DrawMode
= drawmode
;
985 switch (msg
->patternheight
)
1018 if (pat
.Size
<= 8) {
1019 v
= BlitPattern(csd
, &ri
, &pat
, msg
->x
, msg
->y
, msg
->width
, msg
->height
, 0xff, data
->rgbformat
);
1024 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
1027 /****************************************************************************************/
1029 VOID
UAEGFXBitmap__Hidd_BitMap__PutTemplate(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_BitMap_PutTemplate
*msg
)
1031 struct uaegfx_staticdata
*csd
= CSD(cl
);
1032 struct bm_data
*data
= OOP_INST_DATA(cl
, o
);
1033 HIDDT_Pixel fg
= GC_FG(msg
->gc
);
1034 HIDDT_Pixel bg
= GC_BG(msg
->gc
);
1035 struct Template tmpl
;
1036 struct RenderInfo ri
;
1041 maybeputinvram(csd
, data
);
1043 makerenderinfo(csd
, &ri
, data
);
1044 if (GC_COLEXP(msg
->gc
) == vHidd_GC_ColExp_Transparent
)
1046 else if (GC_DRMD(msg
->gc
) == vHidd_GC_DrawMode_Invert
)
1047 drawmode
= COMPLEMENT
;
1050 if (msg
->inverttemplate
)
1051 drawmode
|= INVERSVID
;
1053 tmpl
.Memory
= msg
->Template
;
1054 tmpl
.BytesPerRow
= msg
->modulo
;
1055 tmpl
.XOffset
= msg
->srcx
;
1056 tmpl
.DrawMode
= drawmode
;
1059 v
= BlitTemplate(csd
, &ri
, &tmpl
, msg
->x
, msg
->y
, msg
->width
, msg
->height
, 0xff, data
->rgbformat
);
1062 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
1066 /****************************************************************************************/
1068 VOID
UAEGFXBitmap__Hidd_BitMap__UpdateRect(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_BitMap_UpdateRect
*msg
)
1070 struct uaegfx_staticdata
*csd
= CSD(cl
);
1073 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
1076 /****************************************************************************************/
1078 BOOL
UAEGFXBitmap__Hidd_PlanarBM__SetBitMap(OOP_Class
*cl
, OOP_Object
*o
,
1079 struct pHidd_PlanarBM_SetBitMap
*msg
)
1081 struct uaegfx_staticdata
*csd
= CSD(cl
);
1084 return OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
1087 /****************************************************************************************/
1089 BOOL
UAEGFXBitmap__Hidd_PlanarBM__GetBitMap(OOP_Class
*cl
, OOP_Object
*o
,
1090 struct pHidd_PlanarBM_GetBitMap
*msg
)
1092 struct uaegfx_staticdata
*csd
= CSD(cl
);
1095 return OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);