2 Copyright © 1995-2017, The AROS Development Team. All rights reserved.
5 Desc: Bitmap class for VESA Gfx hidd.
9 #define __OOP_NOATTRBASES__
11 #include <proto/oop.h>
12 #include <proto/utility.h>
14 #include <exec/memory.h>
15 #include <exec/lists.h>
16 #include <graphics/rastport.h>
17 #include <graphics/gfx.h>
20 #include <aros/symbolsets.h>
22 #include <aros/debug.h>
26 #include "vesagfx_hidd.h"
28 #include LC_LIBDEFS_FILE
30 #define MNAME_ROOT(x) VESAGfxBM__Root__ ## x
31 #define MNAME_BM(x) VESAGfxBM__Hidd_BitMap__ ## x
33 /*********** BitMap::New() *************************************/
34 OOP_Object
*MNAME_ROOT(New
)(OOP_Class
*cl
, OOP_Object
*o
, struct pRoot_New
*msg
)
36 EnterFunc(bug("VESAGfx.BitMap::New()\n"));
38 o
= (OOP_Object
*)OOP_DoSuperMethod(cl
, o
, (OOP_Msg
) msg
);
41 OOP_MethodID disp_mid
;
42 struct VESAGfxBitMapData
*data
;
44 OOP_Object
*sync
, *pf
;
46 data
= OOP_INST_DATA(cl
, o
);
49 OOP_GetAttr(o
, aHidd_BitMap_GfxHidd
, (APTR
)&data
->gfxhidd
);
50 OOP_GetAttr(o
, aHidd_BitMap_PixFmt
, (APTR
)&data
->pixfmtobj
);
51 OOP_GetAttr(o
, aHidd_BitMap_ModeID
, &modeid
);
52 OOP_GetAttr(o
, aHidd_ChunkyBM_Buffer
, (IPTR
*)&data
->VideoData
);
54 HIDD_Gfx_GetMode(data
->gfxhidd
, modeid
, &sync
, &pf
);
56 data
->width
= OOP_GET(o
, aHidd_BitMap_Width
);
57 data
->height
= OOP_GET(o
, aHidd_BitMap_Height
);
58 data
->bytesperline
= OOP_GET(o
, aHidd_BitMap_BytesPerRow
);
59 data
->bytesperpix
= OOP_GET(data
->pixfmtobj
, aHidd_PixFmt_BytesPerPixel
);
60 data
->disp_width
= OOP_GET(sync
, aHidd_Sync_HDisp
);
61 data
->disp_height
= OOP_GET(sync
, aHidd_Sync_VDisp
);
63 D(bug("[VESAGfx:BitMap] Bitmap %ld x % ld, %u bytes per pixel, %u bytes per line\n",
64 data
->width
, data
->height
, data
->bytesperpix
, data
->bytesperline
));
65 D(bug("[VESAGfx:BitMap] Video data at 0x%p (%u bytes)\n", data
->VideoData
, data
->bytesperline
* data
->height
));
67 if (OOP_GET(data
->pixfmtobj
, aHidd_PixFmt_ColorModel
) != vHidd_ColorModel_Palette
)
68 ReturnPtr("VESAGfx.BitMap::New()", OOP_Object
*, o
);
70 data
->DAC
= AllocMem(768, MEMF_ANY
);
71 D(bug("[VESAGfx:BitMap] Palette data at 0x%p\n", data
->DAC
));
73 ReturnPtr("VESAGfx.BitMap::New()", OOP_Object
*, o
);
75 disp_mid
= OOP_GetMethodID(IID_Root
, moRoot_Dispose
);
77 OOP_CoerceMethod(cl
, o
, (OOP_Msg
) &disp_mid
);
79 } /* if created object */
81 ReturnPtr("VESAGfx.BitMap::New()", OOP_Object
*, o
);
84 /********** Bitmap::Dispose() ***********************************/
85 VOID
MNAME_ROOT(Dispose
)(OOP_Class
*cl
, OOP_Object
*o
, OOP_Msg msg
)
87 struct VESAGfxBitMapData
*data
= OOP_INST_DATA(cl
, o
);
89 D(bug("[VESAGfx:BitMap] Dispose(0x%p)\n", o
));
92 FreeMem(data
->DAC
, 768);
94 OOP_DoSuperMethod(cl
, o
, msg
);
96 ReturnVoid("VESAGfx.BitMap::Dispose");
99 /*** BitMap::Get() *******************************************/
101 VOID
MNAME_ROOT(Get
)(OOP_Class
*cl
, OOP_Object
*o
, struct pRoot_Get
*msg
)
103 struct VESAGfxBitMapData
*data
= OOP_INST_DATA(cl
, o
);
106 if (IS_BM_ATTR(msg
->attrID
, idx
))
110 case aoHidd_BitMap_Visible
:
111 *msg
->storage
= data
->disp
;
115 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
118 /*** BitMap::Set() *******************************************/
120 VOID
MNAME_ROOT(Set
)(OOP_Class
*cl
, OOP_Object
*o
, struct pRoot_Set
*msg
)
122 struct VESAGfxBitMapData
*data
= OOP_INST_DATA(cl
, o
);
123 struct TagItem
*tag
, *tstate
;
125 IPTR xoffset
= data
->xoffset
;
126 IPTR yoffset
= data
->yoffset
;
128 tstate
= msg
->attrList
;
129 while((tag
= NextTagItem(&tstate
)))
131 if(IS_BM_ATTR(tag
->ti_Tag
, idx
))
135 case aoHidd_BitMap_Visible
:
136 D(bug("[VESAGfx:BitMap] Setting Visible to %d\n", tag
->ti_Data
));
137 data
->disp
= tag
->ti_Data
;
140 DACLoad(XSD(cl
), data
->DAC
, 0, 256);
147 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
149 /* Bring local X/Y offsets back into sync with validated values */
150 OOP_GetAttr(o
, aHidd_BitMap_LeftEdge
, &xoffset
);
151 OOP_GetAttr(o
, aHidd_BitMap_TopEdge
, &yoffset
);
153 if ((xoffset
!= data
->xoffset
) || (yoffset
!= data
->yoffset
))
155 D(bug("[VESAGfx:BitMap] Scroll to (%d, %d)\n", xoffset
, yoffset
));
156 data
->xoffset
= xoffset
;
157 data
->yoffset
= yoffset
;
161 LOCK_FRAMEBUFFER(XSD(cl
));
162 vesaDoRefreshArea(&XSD(cl
)->data
, data
, 0, 0, data
->width
, data
->height
);
163 UNLOCK_FRAMEBUFFER(XSD(cl
));
168 /*** BitMap::SetColors() *************************************/
170 BOOL
MNAME_BM(SetColors
)(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_BitMap_SetColors
*msg
)
172 struct VESAGfxBitMapData
*data
= OOP_INST_DATA(cl
, o
);
173 struct HWData
*hwdata
= &XSD(cl
)->data
;
176 UWORD red
, green
, blue
;
178 D(bug("[VESAGfx:BitMap] SetColors(%u, %u)\n", msg
->firstColor
, msg
->numColors
));
180 if (!OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
)) {
181 D(bug("[VESAGfx:BitMap] DoSuperMethod() failed\n"));
185 if ((msg
->firstColor
+ msg
->numColors
) > (1 << data
->bpp
))
189 for ( xc_i
= msg
->firstColor
, col_i
= 0;
190 col_i
< msg
->numColors
;
192 red
= msg
->colors
[col_i
].red
>> 8;
193 green
= msg
->colors
[col_i
].green
>> 8;
194 blue
= msg
->colors
[col_i
].blue
>> 8;
196 /* Update DAC registers */
197 p_shift
= 8 - hwdata
->palettewidth
;
198 data
->DAC
[xc_i
*3] = red
>> p_shift
;
199 data
->DAC
[xc_i
*3+1] = green
>> p_shift
;
200 data
->DAC
[xc_i
*3+2] = blue
>> p_shift
;
203 /* Upload palette to the DAC if the current bitmap is on display */
205 DACLoad(XSD(cl
), data
->DAC
, msg
->firstColor
, msg
->numColors
);
210 VOID
MNAME_BM(UpdateRect
)(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_BitMap_UpdateRect
*msg
)
212 struct VESAGfxBitMapData
*data
= OOP_INST_DATA(cl
, o
);
214 D(bug("[VESAGfx:BitMap] UpdateRect(%d, %d, %d, %d), bitmap 0x%p\n", msg
->x
, msg
->y
, msg
->width
, msg
->height
, o
));
216 LOCK_FRAMEBUFFER(XSD(cl
));
217 vesaDoRefreshArea(&XSD(cl
)->data
, data
, msg
->x
, msg
->y
, msg
->x
+ msg
->width
, msg
->y
+ msg
->height
);
218 UNLOCK_FRAMEBUFFER(XSD(cl
));