wip prep commit in lieu of gfx subsystem update changes.
[AROS.git] / rom / hidds / vesa / vesagfx_bitmapclass.c
blob02b084978a5d89404f55e17c3af7890b33a97311
1 /*
2 Copyright © 1995-2017, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc: Bitmap class for VESA Gfx hidd.
6 Lang: English.
7 */
9 #define __OOP_NOATTRBASES__
11 #include <proto/oop.h>
12 #include <proto/utility.h>
13 #include <assert.h>
14 #include <exec/memory.h>
15 #include <exec/lists.h>
16 #include <graphics/rastport.h>
17 #include <graphics/gfx.h>
18 #include <hidd/gfx.h>
19 #include <oop/oop.h>
20 #include <aros/symbolsets.h>
21 #define DEBUG 0
22 #include <aros/debug.h>
24 #include <string.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);
39 if (o)
41 OOP_MethodID disp_mid;
42 struct VESAGfxBitMapData *data;
43 HIDDT_ModeID modeid;
44 OOP_Object *sync, *pf;
46 data = OOP_INST_DATA(cl, o);
48 /* Get attr values */
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));
72 if (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);
78 o = NULL;
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));
91 if (data->DAC)
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);
104 ULONG idx;
106 if (IS_BM_ATTR(msg->attrID, idx))
108 switch (idx)
110 case aoHidd_BitMap_Visible:
111 *msg->storage = data->disp;
112 return;
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;
124 ULONG idx;
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))
133 switch(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;
138 if (data->disp) {
139 if (data->DAC)
140 DACLoad(XSD(cl), data->DAC, 0, 256);
142 break;
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;
159 if (data->disp)
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;
174 ULONG xc_i, col_i;
175 UBYTE p_shift;
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"));
182 return FALSE;
185 if ((msg->firstColor + msg->numColors) > (1 << data->bpp))
186 return FALSE;
188 if (data->DAC) {
189 for ( xc_i = msg->firstColor, col_i = 0;
190 col_i < msg->numColors;
191 xc_i ++, col_i ++) {
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 */
204 if (data->disp)
205 DACLoad(XSD(cl), data->DAC, msg->firstColor, msg->numColors);
207 return TRUE;
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));
215 if (data->disp) {
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));