2 Copyright © 2002-2009, The AROS Development Team. All rights reserved.
6 /* Dtpic.mui. Source based on the one from MUIUndoc */
8 #define MUIMASTER_YES_INLINE_STDARG
13 #include <graphics/gfx.h>
14 #include <graphics/view.h>
15 #include <clib/alib_protos.h>
17 #include <datatypes/datatypesclass.h>
18 #include <datatypes/pictureclass.h>
19 #include <cybergraphx/cybergraphics.h>
21 #include <proto/exec.h>
22 #include <proto/graphics.h>
23 #include <proto/cybergraphics.h>
24 #include <proto/utility.h>
25 #include <proto/intuition.h>
26 #include <proto/muimaster.h>
27 #include <proto/datatypes.h>
31 /* #define MYDEBUG 1 */
35 #include "muimaster_intern.h"
37 #include "support_classes.h"
38 #include "dtpic_private.h"
40 extern struct Library
*MUIMasterBase
;
46 #define DataTypesBase data->datatypesbase
48 static void killdto(struct Dtpic_DATA
*data
)
55 DisposeDTObject(data
->dto
);
59 if (data
->datatypesbase
)
61 CloseLibrary(data
->datatypesbase
);
66 * We copy the filename, as the file is opened later in setup and
69 IPTR
Dtpic__OM_NEW(struct IClass
*cl
, Object
*obj
, struct opSet
*msg
)
71 obj
= (Object
*) DoSuperMethodA(cl
, obj
, (Msg
) msg
);
75 struct Dtpic_DATA
*data
= INST_DATA(cl
, obj
);
76 struct TagItem
*tags
= msg
->ops_AttrList
;
79 while ((tag
= NextTagItem(&tags
)) != NULL
)
85 AllocVec(strlen((char *)tag
->ti_Data
) + 1, MEMF_ANY
);
86 strcpy((char *)data
->name
, (char *)tag
->ti_Data
);
95 IPTR
setup_datatype(struct IClass
*cl
, Object
*obj
)
97 struct Dtpic_DATA
*data
= INST_DATA(cl
, obj
);
100 killdto(data
); /* Object already existed */
104 if ((data
->datatypesbase
= OpenLibrary("datatypes.library", 39)))
106 /* Prevent DOS Requesters from showing up */
108 struct Process
*me
= (struct Process
*)FindTask(0);
109 APTR oldwinptr
= me
->pr_WindowPtr
;
111 me
->pr_WindowPtr
= (APTR
) - 1;
113 data
->dto
= NewDTObject(data
->name
, DTA_GroupID
, GID_PICTURE
,
114 OBP_Precision
, PRECISION_IMAGE
,
115 PDTA_Screen
, _screen(obj
),
116 PDTA_DestMode
, PMODE_V43
,
117 PDTA_UseFriendBitMap
, TRUE
, TAG_DONE
);
118 me
->pr_WindowPtr
= oldwinptr
;
122 struct FrameInfo fri
= { 0 };
124 DoMethod(data
->dto
, DTM_FRAMEBOX
, 0, &fri
, &fri
,
125 sizeof(struct FrameInfo
), 0);
127 if (fri
.fri_Dimensions
.Depth
> 0)
129 if (DoMethod(data
->dto
, DTM_PROCLAYOUT
, 0, 1))
131 get(data
->dto
, PDTA_BitMapHeader
, &data
->bmhd
);
135 if (data
->bmhd
->bmh_Masking
!= mskNone
)
136 set(obj
, MUIA_FillArea
, TRUE
);
138 set(obj
, MUIA_FillArea
, FALSE
);
140 GetDTAttrs(data
->dto
, PDTA_DestBitMap
,
141 &data
->bm
, TAG_DONE
);
145 GetDTAttrs(data
->dto
, PDTA_BitMap
,
146 &data
->bm
, TAG_DONE
);
162 IPTR
Dtpic__MUIM_Setup(struct IClass
*cl
, Object
*obj
,
163 struct MUIP_Setup
*msg
)
165 if (!DoSuperMethodA(cl
, obj
, (Msg
) msg
))
168 return setup_datatype(cl
, obj
);
171 IPTR
Dtpic__MUIM_Cleanup(struct IClass
*cl
, Object
*obj
,
172 struct MUIP_Cleanup
*msg
)
174 struct Dtpic_DATA
*data
= INST_DATA(cl
, obj
);
178 return DoSuperMethodA(cl
, obj
, (Msg
) msg
);
181 IPTR
Dtpic__MUIM_AskMinMax(struct IClass
*cl
, Object
*obj
,
182 struct MUIP_AskMinMax
*msg
)
184 struct Dtpic_DATA
*data
= INST_DATA(cl
, obj
);
187 retval
= DoSuperMethodA(cl
, obj
, (Msg
) msg
);
191 msg
->MinMaxInfo
->MinWidth
+= data
->bmhd
->bmh_Width
;
192 msg
->MinMaxInfo
->MinHeight
+= data
->bmhd
->bmh_Height
;
193 msg
->MinMaxInfo
->DefWidth
+= data
->bmhd
->bmh_Width
;
194 msg
->MinMaxInfo
->DefHeight
+= data
->bmhd
->bmh_Height
;
195 msg
->MinMaxInfo
->MaxWidth
+= data
->bmhd
->bmh_Width
;
196 msg
->MinMaxInfo
->MaxHeight
+= data
->bmhd
->bmh_Height
;
202 IPTR
Dtpic__MUIM_Draw(struct IClass
*cl
, Object
*obj
,
203 struct MUIP_Draw
*msg
)
205 struct Dtpic_DATA
*data
= INST_DATA(cl
, obj
);
207 DoSuperMethodA(cl
, obj
, (Msg
) msg
);
209 if ((msg
->flags
& MADF_DRAWOBJECT
) && data
->bm
)
211 /* Note: codes taken from picture.datatype GM_RENDER routine */
212 ULONG depth
= (ULONG
) GetBitMapAttr(_rp(obj
)->BitMap
, BMA_DEPTH
);
214 if ((depth
>= 15) && (data
->bmhd
->bmh_Masking
== mskHasAlpha
))
216 /* Transparency on high color rast port with alpha channel in
219 AllocVec(_mwidth(obj
) * _mheight(obj
) * 4, MEMF_ANY
);
222 struct pdtBlitPixelArray pa
;
223 pa
.MethodID
= PDTM_READPIXELARRAY
;
224 pa
.pbpa_PixelData
= (UBYTE
*) img
;
225 pa
.pbpa_PixelFormat
= PBPAFMT_ARGB
;
226 pa
.pbpa_PixelArrayMod
= _mwidth(obj
) * 4;
229 pa
.pbpa_Width
= _mwidth(obj
);
230 pa
.pbpa_Height
= _mheight(obj
);
231 if (DoMethodA(data
->dto
, (Msg
) & pa
))
232 WritePixelArrayAlpha(img
, 0, 0, _mwidth(obj
) * 4,
233 _rp(obj
), _mleft(obj
), _mtop(obj
), _mwidth(obj
),
234 _mheight(obj
), 0xffffffff);
240 if (data
->bmhd
->bmh_Masking
== mskHasMask
)
242 /* Transparency with mask */
245 GetDTAttrs(data
->dto
, PDTA_MaskPlane
, (IPTR
) & mask
,
249 BltMaskBitMapRastPort(data
->bm
, 0, 0, _rp(obj
),
250 _mleft(obj
), _mtop(obj
), _mwidth(obj
),
251 _mheight(obj
), 0xE0, (PLANEPTR
) mask
);
255 /* All other cases */
256 BltBitMapRastPort(data
->bm
, 0, 0, _rp(obj
), _mleft(obj
),
257 _mtop(obj
), _mwidth(obj
), _mheight(obj
), 0xC0);
265 IPTR
Dtpic__OM_DISPOSE(struct IClass
*cl
, Object
*obj
, Msg msg
)
267 struct Dtpic_DATA
*data
= INST_DATA(cl
, obj
);
272 return DoSuperMethodA(cl
, obj
, msg
);
275 IPTR
Dtpic__OM_SET(struct IClass
*cl
, Object
*obj
, struct opSet
*msg
)
277 struct Dtpic_DATA
*data
= INST_DATA(cl
, obj
);
278 struct TagItem
*tags
= msg
->ops_AttrList
;
280 ULONG needs_redraw
= 0;
282 while ((tag
= NextTagItem(&tags
)) != NULL
)
286 case MUIA_Dtpic_Name
:
287 /* If no filename or different filenames */
288 if (!data
->name
|| strcmp(data
->name
, (char *)tag
->ti_Data
))
293 AllocVec(strlen((char *)tag
->ti_Data
) + 1, MEMF_ANY
);
294 strcpy((char *)data
->name
, (char *)tag
->ti_Data
);
296 /* Run immediate setup only if base class is setup up */
297 if (_flags(obj
) & MADF_SETUP
)
298 setup_datatype(cl
, obj
);
307 MUI_Redraw(obj
, MADF_DRAWOBJECT
);
310 return DoSuperMethodA(cl
, obj
, (Msg
) msg
);
313 IPTR
Dtpic__OM_GET(struct IClass
*cl
, Object
*obj
, struct opGet
*msg
)
315 struct Dtpic_DATA
*data
= INST_DATA(cl
, obj
);
317 switch (msg
->opg_AttrID
)
319 case MUIA_Dtpic_Name
:
320 *(msg
->opg_Storage
) = (IPTR
) data
->name
;
324 return DoSuperMethodA(cl
, obj
, (Msg
) msg
);
327 #if ZUNE_BUILTIN_DTPIC
328 BOOPSI_DISPATCHER(IPTR
, Dtpic_Dispatcher
, cl
, obj
, msg
)
330 switch (msg
->MethodID
)
333 return Dtpic__OM_NEW(cl
, obj
, (struct opSet
*)msg
);
335 return Dtpic__MUIM_Setup(cl
, obj
, (struct MUIP_Setup
*)msg
);
337 return Dtpic__MUIM_Cleanup(cl
, obj
, (struct MUIP_Clean
*)msg
);
339 return Dtpic__MUIM_AskMinMax(cl
, obj
, (struct MUIP_AskMinMax
*)msg
);
341 return Dtpic__MUIM_Draw(cl
, obj
, (struct MUIP_Draw
*)msg
);
343 return Dtpic__OM_DISPOSE(cl
, obj
, msg
);
345 return Dtpic__OM_SET(cl
, obj
, (struct opSet
*)msg
);
347 return Dtpic__OM_GET(cl
, obj
, (struct opGet
*)msg
);
349 return DoSuperMethodA(cl
, obj
, msg
);
352 BOOPSI_DISPATCHER_END
354 const struct __MUIBuiltinClass _MUI_Dtpic_desc
=
358 sizeof(struct Dtpic_DATA
),
359 (void *) Dtpic_Dispatcher
361 #endif /* ZUNE_BUILTIN_DTPIC */