2 Copyright © 2002-2003, 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 IPTR
Colorfield__OM_NEW(struct IClass
*cl
, Object
*obj
, struct opSet
*msg
)
41 struct Colorfield_DATA
*data
;
46 obj
= (Object
*) DoSuperMethodA(cl
, obj
, (Msg
) msg
);
50 data
= INST_DATA(cl
, obj
);
52 /* parse initial taglist */
53 for (tags
= msg
->ops_AttrList
; (tag
= NextTagItem(&tags
));)
57 case MUIA_Colorfield_Red
:
58 data
->rgb
[0] = (ULONG
) tag
->ti_Data
;
61 case MUIA_Colorfield_Green
:
62 data
->rgb
[1] = (ULONG
) tag
->ti_Data
;
65 case MUIA_Colorfield_Blue
:
66 data
->rgb
[2] = (ULONG
) tag
->ti_Data
;
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
++;
76 case MUIA_Colorfield_Pen
:
77 data
->pen
= (UBYTE
) tag
->ti_Data
;
78 data
->pen
= FLAG_FIXED_PEN
;
87 IPTR
Colorfield__OM_SET(struct IClass
*cl
, Object
*obj
,
90 struct Colorfield_DATA
*data
;
97 data
= INST_DATA(cl
, obj
);
99 for (tags
= msg
->ops_AttrList
; (tag
= NextTagItem(&tags
));)
103 case MUIA_Colorfield_Red
:
104 data
->rgb
[0] = (ULONG
) tag
->ti_Data
;
108 case MUIA_Colorfield_Green
:
109 data
->rgb
[1] = (ULONG
) tag
->ti_Data
;
113 case MUIA_Colorfield_Blue
:
114 data
->rgb
[2] = (ULONG
) tag
->ti_Data
;
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
++;
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
;
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
);
156 IPTR
Colorfield__OM_GET(struct IClass
*cl
, Object
*obj
,
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];
168 case MUIA_Colorfield_Green
:
169 *store
= data
->rgb
[1];
172 case MUIA_Colorfield_Blue
:
173 *store
= data
->rgb
[2];
176 case MUIA_Colorfield_RGB
:
177 *(ULONG
**) store
= data
->rgb
;
180 case MUIA_Colorfield_Pen
:
185 return DoSuperMethodA(cl
, obj
, (Msg
) msg
);
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
)))
199 if (data
->flags
& FLAG_FIXED_PEN
)
201 SetRGB32(&_screen(obj
)->ViewPort
,
202 data
->pen
, data
->rgb
[0], data
->rgb
[1], data
->rgb
[2]);
208 pen
= ObtainPen(_screen(obj
)->ViewPort
.ColorMap
,
210 data
->rgb
[0], data
->rgb
[1], data
->rgb
[2], PENF_EXCLUSIVE
);
214 data
->flags
|= FLAG_NO_PEN
;
219 data
->pen
= (UBYTE
) pen
;
220 data
->flags
|= FLAG_PEN_ALLOCATED
;
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
;
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
;
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
)))
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
);
279 SetABPenDrMd(_rp(obj
), data
->pen
, 0, JAM1
);
282 RectFill(_rp(obj
), _mleft(obj
), _mtop(obj
), _mright(obj
),
285 SetAfPt(_rp(obj
), NULL
, 0);
290 #if ZUNE_BUILTIN_COLORFIELD
291 BOOPSI_DISPATCHER(IPTR
, Colorfield_Dispatcher
, cl
, obj
, msg
)
293 switch (msg
->MethodID
)
296 return Colorfield__OM_NEW(cl
, obj
, (struct opSet
*)msg
);
298 return Colorfield__OM_SET(cl
, obj
, (struct opSet
*)msg
);
300 return Colorfield__OM_GET(cl
, obj
, (struct opGet
*)msg
);
302 return Colorfield__MUIM_Setup(cl
, obj
, (struct MUIP_Setup
*)msg
);
304 return Colorfield__MUIM_Cleanup(cl
, obj
,
305 (struct MUIP_Cleanup
*)msg
);
307 return Colorfield__MUIM_AskMinMax(cl
, obj
,
308 (struct MUIP_AskMinMax
*)msg
);
310 return Colorfield__MUIM_Draw(cl
, obj
, (struct MUIP_Draw
*)msg
);
312 return DoSuperMethodA(cl
, obj
, msg
);
315 BOOPSI_DISPATCHER_END
317 const struct __MUIBuiltinClass _MUI_Colorfield_desc
=
321 sizeof(struct Colorfield_DATA
),
322 (void *) Colorfield_Dispatcher
324 #endif /* ZUNE_BUILTIN_COLORFIELD */