Tabs to spaces, more consistent formatting.
[AROS.git] / workbench / libs / muimaster / classes / colorfield.c
blob922a9b906653b5606860a3f4cd1ee9d57c5c5146
1 /*
2 Copyright © 2002-2003, The AROS Development Team. All rights reserved.
3 $Id$
4 */
6 #define MUIMASTER_YES_INLINE_STDARG
8 #include <stdio.h>
10 #include <graphics/gfx.h>
11 #include <graphics/view.h>
12 #include <graphics/gfxmacros.h>
13 #include <clib/alib_protos.h>
14 #include <proto/exec.h>
15 #include <proto/graphics.h>
16 #include <proto/utility.h>
17 #include <proto/intuition.h>
18 #include <proto/muimaster.h>
20 #include <string.h>
22 #include "mui.h"
23 #include "muimaster_intern.h"
24 #include "textengine.h"
25 #include "support.h"
26 #include "support_classes.h"
27 #include "colorfield_private.h"
29 /* #define MYDEBUG 1 */
30 #include "debug.h"
32 extern struct Library *MUIMasterBase;
34 #define FLAG_FIXED_PEN 1
35 #define FLAG_PEN_ALLOCATED 2
36 #define FLAG_NO_PEN 4
39 IPTR Colorfield__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg)
41 struct Colorfield_DATA *data;
42 struct TagItem *tags;
43 struct TagItem *tag;
44 ULONG *rgb;
46 obj = (Object *) DoSuperMethodA(cl, obj, (Msg) msg);
47 if (!obj)
48 return FALSE;
50 data = INST_DATA(cl, obj);
52 /* parse initial taglist */
53 for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));)
55 switch (tag->ti_Tag)
57 case MUIA_Colorfield_Red:
58 data->rgb[0] = (ULONG) tag->ti_Data;
59 break;
61 case MUIA_Colorfield_Green:
62 data->rgb[1] = (ULONG) tag->ti_Data;
63 break;
65 case MUIA_Colorfield_Blue:
66 data->rgb[2] = (ULONG) tag->ti_Data;
67 break;
69 case MUIA_Colorfield_RGB:
70 rgb = (ULONG *) tag->ti_Data;
71 data->rgb[0] = *rgb++;
72 data->rgb[1] = *rgb++;
73 data->rgb[2] = *rgb++;
74 break;
76 case MUIA_Colorfield_Pen:
77 data->pen = (UBYTE) tag->ti_Data;
78 data->pen = FLAG_FIXED_PEN;
79 break;
84 return (IPTR) obj;
87 IPTR Colorfield__OM_SET(struct IClass *cl, Object *obj,
88 struct opSet *msg)
90 struct Colorfield_DATA *data;
91 struct TagItem *tags;
92 struct TagItem *tag;
93 ULONG *rgb;
94 BOOL newcol = FALSE;
95 IPTR retval;
97 data = INST_DATA(cl, obj);
99 for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));)
101 switch (tag->ti_Tag)
103 case MUIA_Colorfield_Red:
104 data->rgb[0] = (ULONG) tag->ti_Data;
105 newcol = TRUE;
106 break;
108 case MUIA_Colorfield_Green:
109 data->rgb[1] = (ULONG) tag->ti_Data;
110 newcol = TRUE;
111 break;
113 case MUIA_Colorfield_Blue:
114 data->rgb[2] = (ULONG) tag->ti_Data;
115 newcol = TRUE;
116 break;
118 case MUIA_Colorfield_RGB:
119 rgb = (ULONG *) tag->ti_Data;
120 data->rgb[0] = *rgb++;
121 data->rgb[1] = *rgb++;
122 data->rgb[2] = *rgb++;
123 newcol = TRUE;
124 break;
126 case MUIA_Colorfield_Pen:
127 if (data->flags & FLAG_PEN_ALLOCATED)
129 ReleasePen(_screen(obj)->ViewPort.ColorMap, data->pen);
130 data->flags &= ~(FLAG_PEN_ALLOCATED | FLAG_NO_PEN);
132 data->pen = (UBYTE) data->pen;
133 data->flags |= FLAG_FIXED_PEN;
134 break;
139 retval = DoSuperMethodA(cl, obj, (Msg) msg);
141 if (newcol && (_flags(obj) & MADF_SETUP)
142 && !(data->flags & FLAG_NO_PEN))
144 SetRGB32(&_screen(obj)->ViewPort, data->pen, data->rgb[0],
145 data->rgb[1], data->rgb[2]);
147 if (GetBitMapAttr(_rp(obj)->BitMap, BMA_DEPTH) > 8)
149 MUI_Redraw(obj, MADF_DRAWUPDATE);
153 return retval;
156 IPTR Colorfield__OM_GET(struct IClass *cl, Object *obj,
157 struct opGet *msg)
159 struct Colorfield_DATA *data = INST_DATA(cl, obj);
160 IPTR *store = msg->opg_Storage;
162 switch (msg->opg_AttrID)
164 case MUIA_Colorfield_Red:
165 *store = data->rgb[0];
166 break;
168 case MUIA_Colorfield_Green:
169 *store = data->rgb[1];
170 break;
172 case MUIA_Colorfield_Blue:
173 *store = data->rgb[2];
174 break;
176 case MUIA_Colorfield_RGB:
177 *(ULONG **) store = data->rgb;
178 break;
180 case MUIA_Colorfield_Pen:
181 *store = data->pen;
182 break;
184 default:
185 return DoSuperMethodA(cl, obj, (Msg) msg);
188 return TRUE;
191 IPTR Colorfield__MUIM_Setup(struct IClass *cl, Object *obj,
192 struct MUIP_Setup *msg)
194 struct Colorfield_DATA *data = INST_DATA(cl, obj);
196 if (!(DoSuperMethodA(cl, obj, (Msg) msg)))
197 return 0;
199 if (data->flags & FLAG_FIXED_PEN)
201 SetRGB32(&_screen(obj)->ViewPort,
202 data->pen, data->rgb[0], data->rgb[1], data->rgb[2]);
204 else
206 LONG pen;
208 pen = ObtainPen(_screen(obj)->ViewPort.ColorMap,
209 (ULONG) - 1,
210 data->rgb[0], data->rgb[1], data->rgb[2], PENF_EXCLUSIVE);
212 if (pen == -1)
214 data->flags |= FLAG_NO_PEN;
215 data->pen = 0;
217 else
219 data->pen = (UBYTE) pen;
220 data->flags |= FLAG_PEN_ALLOCATED;
224 return 1;
227 IPTR Colorfield__MUIM_Cleanup(struct IClass *cl, Object *obj,
228 struct MUIP_Cleanup *msg)
230 struct Colorfield_DATA *data = INST_DATA(cl, obj);
232 if (data->flags & FLAG_PEN_ALLOCATED)
234 ReleasePen(_screen(obj)->ViewPort.ColorMap, data->pen);
235 data->flags &= ~FLAG_PEN_ALLOCATED;
236 data->pen = 0;
238 data->flags &= ~FLAG_NO_PEN;
240 return DoSuperMethodA(cl, obj, (Msg) msg);
243 IPTR Colorfield__MUIM_AskMinMax(struct IClass *cl, Object *obj,
244 struct MUIP_AskMinMax *msg)
246 DoSuperMethodA(cl, obj, (Msg) msg);
248 msg->MinMaxInfo->MinWidth += 1;
249 msg->MinMaxInfo->MinHeight += 1;
250 msg->MinMaxInfo->DefWidth += 16;
251 msg->MinMaxInfo->DefHeight += 16;
252 msg->MinMaxInfo->MaxWidth = MUI_MAXMAX;
253 msg->MinMaxInfo->MaxHeight = MUI_MAXMAX;
255 return 0;
258 IPTR Colorfield__MUIM_Draw(struct IClass *cl, Object *obj,
259 struct MUIP_Draw *msg)
261 struct Colorfield_DATA *data = INST_DATA(cl, obj);
263 DoSuperMethodA(cl, obj, (Msg) msg);
265 if (!(msg->flags & (MADF_DRAWOBJECT | MADF_DRAWUPDATE)))
266 return FALSE;
268 if (data->flags & FLAG_NO_PEN)
270 static UWORD pat[] = { 0x1111, 0x2222, 0x4444, 0x8888 };
272 SetAfPt(_rp(obj), pat, 2);
273 SetABPenDrMd(_rp(obj), _pens(obj)[MPEN_SHADOW],
274 _pens(obj)[MPEN_BACKGROUND], JAM2);
277 else
279 SetABPenDrMd(_rp(obj), data->pen, 0, JAM1);
282 RectFill(_rp(obj), _mleft(obj), _mtop(obj), _mright(obj),
283 _mbottom(obj));
285 SetAfPt(_rp(obj), NULL, 0);
287 return 0;
290 #if ZUNE_BUILTIN_COLORFIELD
291 BOOPSI_DISPATCHER(IPTR, Colorfield_Dispatcher, cl, obj, msg)
293 switch (msg->MethodID)
295 case OM_NEW:
296 return Colorfield__OM_NEW(cl, obj, (struct opSet *)msg);
297 case OM_SET:
298 return Colorfield__OM_SET(cl, obj, (struct opSet *)msg);
299 case OM_GET:
300 return Colorfield__OM_GET(cl, obj, (struct opGet *)msg);
301 case MUIM_Setup:
302 return Colorfield__MUIM_Setup(cl, obj, (struct MUIP_Setup *)msg);
303 case MUIM_Cleanup:
304 return Colorfield__MUIM_Cleanup(cl, obj,
305 (struct MUIP_Cleanup *)msg);
306 case MUIM_AskMinMax:
307 return Colorfield__MUIM_AskMinMax(cl, obj,
308 (struct MUIP_AskMinMax *)msg);
309 case MUIM_Draw:
310 return Colorfield__MUIM_Draw(cl, obj, (struct MUIP_Draw *)msg);
311 default:
312 return DoSuperMethodA(cl, obj, msg);
315 BOOPSI_DISPATCHER_END
317 const struct __MUIBuiltinClass _MUI_Colorfield_desc =
319 MUIC_Colorfield,
320 MUIC_Area,
321 sizeof(struct Colorfield_DATA),
322 (void *) Colorfield_Dispatcher
324 #endif /* ZUNE_BUILTIN_COLORFIELD */