- Made MUIA_Colorfield_Pen settable (an undocumented MUI feature).
[AROS.git] / workbench / libs / muimaster / classes / colorfield.c
blob97ac26bbaa460df20a0aa2c4478539fc66f55ae6
1 /*
2 Copyright © 2002-2015, 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 /****** Colorfield.mui/MUIA_Colorfield_Pen ***********************************
41 * NAME
42 * MUIA_Colorfield_Pen -- (V4) [ISG], ULONG
44 * FUNCTION
45 * The used pen. If not set explicitly, a new one is obtained
46 * automatically.
48 * This attribute was incorrectly documented as gettable-only in the MUI
49 * documentation.
51 ******************************************************************************
55 /****** Colorfield.mui/MUIA_Colorfield_Red ***********************************
57 * NAME
58 * MUIA_Colorfield_Red -- (V4) [ISG], ULONG
60 * FUNCTION
61 * The red component of the color field as an unsigned 32-bit value
62 * (0 to 0xFFFFFFFF).
64 * SEE ALSO
65 * MUIA_Colorfield_RGB, MUIA_Colorfield_Green, MUIA_Colorfield_Blue
67 ******************************************************************************
71 /****** Colorfield.mui/MUIA_Colorfield_Green *********************************
73 * NAME
74 * MUIA_Colorfield_Green -- (V4) [ISG], ULONG
76 * FUNCTION
77 * The green component of the color field as an unsigned 32-bit value
78 * (0 to 0xFFFFFFFF).
80 * SEE ALSO
81 * MUIA_Colorfield_RGB, MUIA_Colorfield_Red, MUIA_Colorfield_Blue
83 ******************************************************************************
87 /****** Colorfield.mui/MUIA_Colorfield_Blue **********************************
89 * NAME
90 * MUIA_Colorfield_Blue -- (V4) [ISG], ULONG
92 * FUNCTION
93 * The blue component of the color field as an unsigned 32-bit value
94 * (0 to 0xFFFFFFFF).
96 * SEE ALSO
97 * MUIA_Colorfield_RGB, MUIA_Colorfield_Red, MUIA_Colorfield_Green
99 ******************************************************************************
103 /****** Colorfield.mui/MUIA_Colorfield_RGB ***********************************
105 * NAME
106 * MUIA_Colorfield_RGB -- (V4) [ISG], ULONG *
108 * FUNCTION
109 * The red, green and blue components of the color field as an array of
110 * unsigned 32-bit values (0 to 0xFFFFFFFF).
112 * SEE ALSO
113 * MUIA_Colorfield_Red, MUIA_Colorfield_Green, MUIA_Colorfield_Blue
115 ******************************************************************************
119 IPTR Colorfield__OM_NEW(struct IClass *cl, Object *obj, struct opSet *msg)
121 struct Colorfield_DATA *data;
122 struct TagItem *tags;
123 struct TagItem *tag;
124 ULONG *rgb;
126 obj = (Object *) DoSuperMethodA(cl, obj, (Msg) msg);
127 if (!obj)
128 return FALSE;
130 data = INST_DATA(cl, obj);
132 /* parse initial taglist */
133 for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));)
135 switch (tag->ti_Tag)
137 case MUIA_Colorfield_Red:
138 data->rgb[0] = (ULONG) tag->ti_Data;
139 break;
141 case MUIA_Colorfield_Green:
142 data->rgb[1] = (ULONG) tag->ti_Data;
143 break;
145 case MUIA_Colorfield_Blue:
146 data->rgb[2] = (ULONG) tag->ti_Data;
147 break;
149 case MUIA_Colorfield_RGB:
150 rgb = (ULONG *) tag->ti_Data;
151 data->rgb[0] = *rgb++;
152 data->rgb[1] = *rgb++;
153 data->rgb[2] = *rgb++;
154 break;
156 case MUIA_Colorfield_Pen:
157 data->pen = (UBYTE) tag->ti_Data;
158 data->pen = FLAG_FIXED_PEN;
159 break;
164 return (IPTR) obj;
167 IPTR Colorfield__OM_SET(struct IClass *cl, Object *obj,
168 struct opSet *msg)
170 struct Colorfield_DATA *data;
171 struct TagItem *tags;
172 struct TagItem *tag;
173 ULONG *rgb;
174 BOOL newcol = FALSE;
175 IPTR retval;
177 data = INST_DATA(cl, obj);
179 for (tags = msg->ops_AttrList; (tag = NextTagItem(&tags));)
181 switch (tag->ti_Tag)
183 case MUIA_Colorfield_Red:
184 data->rgb[0] = (ULONG) tag->ti_Data;
185 newcol = TRUE;
186 break;
188 case MUIA_Colorfield_Green:
189 data->rgb[1] = (ULONG) tag->ti_Data;
190 newcol = TRUE;
191 break;
193 case MUIA_Colorfield_Blue:
194 data->rgb[2] = (ULONG) tag->ti_Data;
195 newcol = TRUE;
196 break;
198 case MUIA_Colorfield_RGB:
199 rgb = (ULONG *) tag->ti_Data;
200 data->rgb[0] = *rgb++;
201 data->rgb[1] = *rgb++;
202 data->rgb[2] = *rgb++;
203 newcol = TRUE;
204 break;
206 case MUIA_Colorfield_Pen:
207 if (data->flags & FLAG_PEN_ALLOCATED)
209 ReleasePen(_screen(obj)->ViewPort.ColorMap, data->pen);
210 data->flags &= ~(FLAG_PEN_ALLOCATED | FLAG_NO_PEN);
212 data->pen = (UBYTE) tag->ti_Data;
213 data->flags |= FLAG_FIXED_PEN;
214 break;
219 retval = DoSuperMethodA(cl, obj, (Msg) msg);
221 if (newcol && (_flags(obj) & MADF_SETUP)
222 && !(data->flags & FLAG_NO_PEN))
224 SetRGB32(&_screen(obj)->ViewPort, data->pen, data->rgb[0],
225 data->rgb[1], data->rgb[2]);
227 if (GetBitMapAttr(_rp(obj)->BitMap, BMA_DEPTH) > 8)
229 MUI_Redraw(obj, MADF_DRAWUPDATE);
233 return retval;
236 IPTR Colorfield__OM_GET(struct IClass *cl, Object *obj,
237 struct opGet *msg)
239 struct Colorfield_DATA *data = INST_DATA(cl, obj);
240 IPTR *store = msg->opg_Storage;
242 switch (msg->opg_AttrID)
244 case MUIA_Colorfield_Red:
245 *store = data->rgb[0];
246 break;
248 case MUIA_Colorfield_Green:
249 *store = data->rgb[1];
250 break;
252 case MUIA_Colorfield_Blue:
253 *store = data->rgb[2];
254 break;
256 case MUIA_Colorfield_RGB:
257 *(ULONG **) store = data->rgb;
258 break;
260 case MUIA_Colorfield_Pen:
261 *store = data->pen;
262 break;
264 default:
265 return DoSuperMethodA(cl, obj, (Msg) msg);
268 return TRUE;
271 IPTR Colorfield__MUIM_Setup(struct IClass *cl, Object *obj,
272 struct MUIP_Setup *msg)
274 struct Colorfield_DATA *data = INST_DATA(cl, obj);
276 if (!(DoSuperMethodA(cl, obj, (Msg) msg)))
277 return 0;
279 if (data->flags & FLAG_FIXED_PEN)
281 SetRGB32(&_screen(obj)->ViewPort,
282 data->pen, data->rgb[0], data->rgb[1], data->rgb[2]);
284 else
286 LONG pen;
288 pen = ObtainPen(_screen(obj)->ViewPort.ColorMap,
289 (ULONG) -1,
290 data->rgb[0], data->rgb[1], data->rgb[2], PENF_EXCLUSIVE);
292 if (pen == -1)
294 data->flags |= FLAG_NO_PEN;
295 data->pen = 0;
297 else
299 data->pen = (UBYTE) pen;
300 data->flags |= FLAG_PEN_ALLOCATED;
304 return 1;
307 IPTR Colorfield__MUIM_Cleanup(struct IClass *cl, Object *obj,
308 struct MUIP_Cleanup *msg)
310 struct Colorfield_DATA *data = INST_DATA(cl, obj);
312 if (data->flags & FLAG_PEN_ALLOCATED)
314 ReleasePen(_screen(obj)->ViewPort.ColorMap, data->pen);
315 data->flags &= ~FLAG_PEN_ALLOCATED;
316 data->pen = 0;
318 data->flags &= ~FLAG_NO_PEN;
320 return DoSuperMethodA(cl, obj, (Msg) msg);
323 IPTR Colorfield__MUIM_AskMinMax(struct IClass *cl, Object *obj,
324 struct MUIP_AskMinMax *msg)
326 DoSuperMethodA(cl, obj, (Msg) msg);
328 msg->MinMaxInfo->MinWidth += 1;
329 msg->MinMaxInfo->MinHeight += 1;
330 msg->MinMaxInfo->DefWidth += 16;
331 msg->MinMaxInfo->DefHeight += 16;
332 msg->MinMaxInfo->MaxWidth = MUI_MAXMAX;
333 msg->MinMaxInfo->MaxHeight = MUI_MAXMAX;
335 return 0;
338 IPTR Colorfield__MUIM_Draw(struct IClass *cl, Object *obj,
339 struct MUIP_Draw *msg)
341 struct Colorfield_DATA *data = INST_DATA(cl, obj);
343 DoSuperMethodA(cl, obj, (Msg) msg);
345 if (!(msg->flags & (MADF_DRAWOBJECT | MADF_DRAWUPDATE)))
346 return FALSE;
348 if (data->flags & FLAG_NO_PEN)
350 static UWORD pat[] = { 0x1111, 0x2222, 0x4444, 0x8888 };
352 SetAfPt(_rp(obj), pat, 2);
353 SetABPenDrMd(_rp(obj), _pens(obj)[MPEN_SHADOW],
354 _pens(obj)[MPEN_BACKGROUND], JAM2);
357 else
359 SetABPenDrMd(_rp(obj), data->pen, 0, JAM1);
362 RectFill(_rp(obj), _mleft(obj), _mtop(obj), _mright(obj),
363 _mbottom(obj));
365 SetAfPt(_rp(obj), NULL, 0);
367 return 0;
370 #if ZUNE_BUILTIN_COLORFIELD
371 BOOPSI_DISPATCHER(IPTR, Colorfield_Dispatcher, cl, obj, msg)
373 switch (msg->MethodID)
375 case OM_NEW:
376 return Colorfield__OM_NEW(cl, obj, (struct opSet *)msg);
377 case OM_SET:
378 return Colorfield__OM_SET(cl, obj, (struct opSet *)msg);
379 case OM_GET:
380 return Colorfield__OM_GET(cl, obj, (struct opGet *)msg);
381 case MUIM_Setup:
382 return Colorfield__MUIM_Setup(cl, obj, (struct MUIP_Setup *)msg);
383 case MUIM_Cleanup:
384 return Colorfield__MUIM_Cleanup(cl, obj,
385 (struct MUIP_Cleanup *)msg);
386 case MUIM_AskMinMax:
387 return Colorfield__MUIM_AskMinMax(cl, obj,
388 (struct MUIP_AskMinMax *)msg);
389 case MUIM_Draw:
390 return Colorfield__MUIM_Draw(cl, obj, (struct MUIP_Draw *)msg);
391 default:
392 return DoSuperMethodA(cl, obj, msg);
395 BOOPSI_DISPATCHER_END
397 const struct __MUIBuiltinClass _MUI_Colorfield_desc =
399 MUIC_Colorfield,
400 MUIC_Area,
401 sizeof(struct Colorfield_DATA),
402 (void *) Colorfield_Dispatcher
404 #endif /* ZUNE_BUILTIN_COLORFIELD */