2 Copyright © 2002-2015, The AROS Development Team. All rights reserved.
6 #define MUIMASTER_YES_INLINE_STDARG
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>
23 #include "muimaster_intern.h"
24 #include "textengine.h"
26 #include "support_classes.h"
27 #include "colorfield_private.h"
29 /* #define MYDEBUG 1 */
32 extern struct Library
*MUIMasterBase
;
34 #define FLAG_FIXED_PEN 1
35 #define FLAG_PEN_ALLOCATED 2
39 /****** Colorfield.mui/MUIA_Colorfield_Pen ***********************************
42 * MUIA_Colorfield_Pen -- (V4) [ISG], ULONG
45 * The used pen. If not set explicitly, a new one is obtained
48 * This attribute was incorrectly documented as gettable-only in the MUI
51 ******************************************************************************
55 /****** Colorfield.mui/MUIA_Colorfield_Red ***********************************
58 * MUIA_Colorfield_Red -- (V4) [ISG], ULONG
61 * The red component of the color field as an unsigned 32-bit value
65 * MUIA_Colorfield_RGB, MUIA_Colorfield_Green, MUIA_Colorfield_Blue
67 ******************************************************************************
71 /****** Colorfield.mui/MUIA_Colorfield_Green *********************************
74 * MUIA_Colorfield_Green -- (V4) [ISG], ULONG
77 * The green component of the color field as an unsigned 32-bit value
81 * MUIA_Colorfield_RGB, MUIA_Colorfield_Red, MUIA_Colorfield_Blue
83 ******************************************************************************
87 /****** Colorfield.mui/MUIA_Colorfield_Blue **********************************
90 * MUIA_Colorfield_Blue -- (V4) [ISG], ULONG
93 * The blue component of the color field as an unsigned 32-bit value
97 * MUIA_Colorfield_RGB, MUIA_Colorfield_Red, MUIA_Colorfield_Green
99 ******************************************************************************
103 /****** Colorfield.mui/MUIA_Colorfield_RGB ***********************************
106 * MUIA_Colorfield_RGB -- (V4) [ISG], ULONG *
109 * The red, green and blue components of the color field as an array of
110 * unsigned 32-bit values (0 to 0xFFFFFFFF).
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
;
126 obj
= (Object
*) DoSuperMethodA(cl
, obj
, (Msg
) msg
);
130 data
= INST_DATA(cl
, obj
);
132 /* parse initial taglist */
133 for (tags
= msg
->ops_AttrList
; (tag
= NextTagItem(&tags
));)
137 case MUIA_Colorfield_Red
:
138 data
->rgb
[0] = (ULONG
) tag
->ti_Data
;
141 case MUIA_Colorfield_Green
:
142 data
->rgb
[1] = (ULONG
) tag
->ti_Data
;
145 case MUIA_Colorfield_Blue
:
146 data
->rgb
[2] = (ULONG
) tag
->ti_Data
;
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
++;
156 case MUIA_Colorfield_Pen
:
157 data
->pen
= (UBYTE
) tag
->ti_Data
;
158 data
->pen
= FLAG_FIXED_PEN
;
167 IPTR
Colorfield__OM_SET(struct IClass
*cl
, Object
*obj
,
170 struct Colorfield_DATA
*data
;
171 struct TagItem
*tags
;
177 data
= INST_DATA(cl
, obj
);
179 for (tags
= msg
->ops_AttrList
; (tag
= NextTagItem(&tags
));)
183 case MUIA_Colorfield_Red
:
184 data
->rgb
[0] = (ULONG
) tag
->ti_Data
;
188 case MUIA_Colorfield_Green
:
189 data
->rgb
[1] = (ULONG
) tag
->ti_Data
;
193 case MUIA_Colorfield_Blue
:
194 data
->rgb
[2] = (ULONG
) tag
->ti_Data
;
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
++;
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
;
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
);
236 IPTR
Colorfield__OM_GET(struct IClass
*cl
, Object
*obj
,
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];
248 case MUIA_Colorfield_Green
:
249 *store
= data
->rgb
[1];
252 case MUIA_Colorfield_Blue
:
253 *store
= data
->rgb
[2];
256 case MUIA_Colorfield_RGB
:
257 *(ULONG
**) store
= data
->rgb
;
260 case MUIA_Colorfield_Pen
:
265 return DoSuperMethodA(cl
, obj
, (Msg
) msg
);
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
)))
279 if (data
->flags
& FLAG_FIXED_PEN
)
281 SetRGB32(&_screen(obj
)->ViewPort
,
282 data
->pen
, data
->rgb
[0], data
->rgb
[1], data
->rgb
[2]);
288 pen
= ObtainPen(_screen(obj
)->ViewPort
.ColorMap
,
290 data
->rgb
[0], data
->rgb
[1], data
->rgb
[2], PENF_EXCLUSIVE
);
294 data
->flags
|= FLAG_NO_PEN
;
299 data
->pen
= (UBYTE
) pen
;
300 data
->flags
|= FLAG_PEN_ALLOCATED
;
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
;
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
;
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
)))
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
);
359 SetABPenDrMd(_rp(obj
), data
->pen
, 0, JAM1
);
362 RectFill(_rp(obj
), _mleft(obj
), _mtop(obj
), _mright(obj
),
365 SetAfPt(_rp(obj
), NULL
, 0);
370 #if ZUNE_BUILTIN_COLORFIELD
371 BOOPSI_DISPATCHER(IPTR
, Colorfield_Dispatcher
, cl
, obj
, msg
)
373 switch (msg
->MethodID
)
376 return Colorfield__OM_NEW(cl
, obj
, (struct opSet
*)msg
);
378 return Colorfield__OM_SET(cl
, obj
, (struct opSet
*)msg
);
380 return Colorfield__OM_GET(cl
, obj
, (struct opGet
*)msg
);
382 return Colorfield__MUIM_Setup(cl
, obj
, (struct MUIP_Setup
*)msg
);
384 return Colorfield__MUIM_Cleanup(cl
, obj
,
385 (struct MUIP_Cleanup
*)msg
);
387 return Colorfield__MUIM_AskMinMax(cl
, obj
,
388 (struct MUIP_AskMinMax
*)msg
);
390 return Colorfield__MUIM_Draw(cl
, obj
, (struct MUIP_Draw
*)msg
);
392 return DoSuperMethodA(cl
, obj
, msg
);
395 BOOPSI_DISPATCHER_END
397 const struct __MUIBuiltinClass _MUI_Colorfield_desc
=
401 sizeof(struct Colorfield_DATA
),
402 (void *) Colorfield_Dispatcher
404 #endif /* ZUNE_BUILTIN_COLORFIELD */