Removed cut-and-pasted code for clamping of X/Y offsets. These
[AROS.git] / rom / hidds / vesa / bitmap.c
blobba42daee003fedd3ceb4973b50c3affe28dd7994
1 /*
2 Copyright © 1995-2014, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc: Bitmap class for Vesa 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/graphics.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 "bitmap.h"
27 #include "vesagfxclass.h"
29 #include LC_LIBDEFS_FILE
31 #define MNAME_ROOT(x) PCVesaBM__Root__ ## x
32 #define MNAME_BM(x) PCVesaBM__Hidd_BitMap__ ## x
34 /*********** BitMap::New() *************************************/
35 OOP_Object *MNAME_ROOT(New)(OOP_Class *cl, OOP_Object *o, struct pRoot_New *msg)
37 EnterFunc(bug("VesaGfx.BitMap::New()\n"));
39 o = (OOP_Object *)OOP_DoSuperMethod(cl, o, (OOP_Msg) msg);
40 if (o)
42 OOP_MethodID disp_mid;
43 struct BitmapData *data;
44 HIDDT_ModeID modeid;
45 OOP_Object *sync, *pf;
47 data = OOP_INST_DATA(cl, o);
49 /* Get attr values */
50 OOP_GetAttr(o, aHidd_BitMap_GfxHidd , (APTR)&data->gfxhidd);
51 OOP_GetAttr(o, aHidd_BitMap_PixFmt , (APTR)&data->pixfmtobj);
52 OOP_GetAttr(o, aHidd_BitMap_ModeID , &modeid);
53 OOP_GetAttr(o, aHidd_ChunkyBM_Buffer, (IPTR *)&data->VideoData);
55 HIDD_Gfx_GetMode(data->gfxhidd, modeid, &sync, &pf);
57 data->width = OOP_GET(o, aHidd_BitMap_Width);
58 data->height = OOP_GET(o, aHidd_BitMap_Height);
59 data->bytesperline = OOP_GET(o, aHidd_BitMap_BytesPerRow);
60 data->bytesperpix = OOP_GET(data->pixfmtobj, aHidd_PixFmt_BytesPerPixel);
61 data->disp_width = OOP_GET(sync, aHidd_Sync_HDisp);
62 data->disp_height = OOP_GET(sync, aHidd_Sync_VDisp);
64 D(bug("[VesaBitMap] Bitmap %ld x % ld, %u bytes per pixel, %u bytes per line\n",
65 data->width, data->height, data->bytesperpix, data->bytesperline));
66 D(bug("[VesaBitMap] Video data at 0x%p (%u bytes)\n", data->VideoData, data->bytesperline * data->height));
68 if (OOP_GET(data->pixfmtobj, aHidd_PixFmt_ColorModel) != vHidd_ColorModel_Palette)
69 ReturnPtr("VesaGfx.BitMap::New()", OOP_Object *, o);
71 data->DAC = AllocMem(768, MEMF_ANY);
72 D(bug("[VesaBitMap] Palette data at 0x%p\n", data->DAC));
73 if (data->DAC)
74 ReturnPtr("VesaGfx.BitMap::New()", OOP_Object *, o);
76 disp_mid = OOP_GetMethodID(IID_Root, moRoot_Dispose);
78 OOP_CoerceMethod(cl, o, (OOP_Msg) &disp_mid);
79 o = NULL;
80 } /* if created object */
82 ReturnPtr("VesaGfx.BitMap::New()", OOP_Object *, o);
85 /********** Bitmap::Dispose() ***********************************/
86 VOID MNAME_ROOT(Dispose)(OOP_Class *cl, OOP_Object *o, OOP_Msg msg)
88 struct BitmapData *data = OOP_INST_DATA(cl, o);
90 D(bug("[VesaBitMap] Dispose(0x%p)\n", o));
92 if (data->DAC)
93 FreeMem(data->DAC, 768);
95 OOP_DoSuperMethod(cl, o, msg);
97 ReturnVoid("VesaGfx.BitMap::Dispose");
100 /*** BitMap::Get() *******************************************/
102 VOID MNAME_ROOT(Get)(OOP_Class *cl, OOP_Object *o, struct pRoot_Get *msg)
104 struct BitmapData *data = OOP_INST_DATA(cl, o);
105 ULONG idx;
107 if (IS_BM_ATTR(msg->attrID, idx))
109 switch (idx)
111 case aoHidd_BitMap_Visible:
112 *msg->storage = data->disp;
113 return;
116 OOP_DoSuperMethod(cl, o, (OOP_Msg)msg);
119 /*** BitMap::Set() *******************************************/
121 VOID MNAME_ROOT(Set)(OOP_Class *cl, OOP_Object *o, struct pRoot_Set *msg)
123 struct BitmapData *data = OOP_INST_DATA(cl, o);
124 struct TagItem *tag, *tstate;
125 ULONG idx;
126 IPTR xoffset = data->xoffset;
127 IPTR yoffset = data->yoffset;
129 tstate = msg->attrList;
130 while((tag = NextTagItem(&tstate)))
132 if(IS_BM_ATTR(tag->ti_Tag, idx))
134 switch(idx)
136 case aoHidd_BitMap_Visible:
137 D(bug("[VesaBitMap] Setting Visible to %d\n", tag->ti_Data));
138 data->disp = tag->ti_Data;
139 if (data->disp) {
140 if (data->DAC)
141 DACLoad(XSD(cl), data->DAC, 0, 256);
143 break;
148 OOP_DoSuperMethod(cl, o, (OOP_Msg)msg);
150 /* Bring local X/Y offsets back into sync with validated values */
151 OOP_GetAttr(o, aHidd_BitMap_LeftEdge, &xoffset);
152 OOP_GetAttr(o, aHidd_BitMap_TopEdge, &yoffset);
154 if ((xoffset != data->xoffset) || (yoffset != data->yoffset))
156 D(bug("[VesaBitMap] Scroll to (%d, %d)\n", xoffset, yoffset));
157 data->xoffset = xoffset;
158 data->yoffset = yoffset;
160 if (data->disp)
162 LOCK_FRAMEBUFFER(XSD(cl));
163 vesaDoRefreshArea(&XSD(cl)->data, data, 0, 0, data->width, data->height);
164 UNLOCK_FRAMEBUFFER(XSD(cl));
169 /*** BitMap::SetColors() *************************************/
171 BOOL MNAME_BM(SetColors)(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_SetColors *msg)
173 struct BitmapData *data = OOP_INST_DATA(cl, o);
174 struct HWData *hwdata = &XSD(cl)->data;
175 ULONG xc_i, col_i;
176 UBYTE p_shift;
177 UWORD red, green, blue;
179 D(bug("[VesaBitMap] SetColors(%u, %u)\n", msg->firstColor, msg->numColors));
181 if (!OOP_DoSuperMethod(cl, o, (OOP_Msg)msg)) {
182 D(bug("[VesaBitMap] DoSuperMethod() failed\n"));
183 return FALSE;
186 if ((msg->firstColor + msg->numColors) > (1 << data->bpp))
187 return FALSE;
189 if (data->DAC) {
190 for ( xc_i = msg->firstColor, col_i = 0;
191 col_i < msg->numColors;
192 xc_i ++, col_i ++) {
193 red = msg->colors[col_i].red >> 8;
194 green = msg->colors[col_i].green >> 8;
195 blue = msg->colors[col_i].blue >> 8;
197 /* Update DAC registers */
198 p_shift = 8 - hwdata->palettewidth;
199 data->DAC[xc_i*3] = red >> p_shift;
200 data->DAC[xc_i*3+1] = green >> p_shift;
201 data->DAC[xc_i*3+2] = blue >> p_shift;
204 /* Upload palette to the DAC if the current bitmap is on display */
205 if (data->disp)
206 DACLoad(XSD(cl), data->DAC, msg->firstColor, msg->numColors);
208 return TRUE;
211 VOID MNAME_BM(UpdateRect)(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_UpdateRect *msg)
213 struct BitmapData *data = OOP_INST_DATA(cl, o);
215 D(bug("[VesaBitMap] UpdateRect(%d, %d, %d, %d), bitmap 0x%p\n", msg->x, msg->y, msg->width, msg->height, o));
216 if (data->disp) {
217 LOCK_FRAMEBUFFER(XSD(cl));
218 vesaDoRefreshArea(&XSD(cl)->data, data, msg->x, msg->y, msg->x + msg->width, msg->y + msg->height);
219 UNLOCK_FRAMEBUFFER(XSD(cl));