2 Copyright © 2003, The AROS Development Team.
8 #include <intuition/imageclass.h>
9 #include <proto/graphics.h>
10 #include <proto/exec.h>
14 #include "imspec_intern.h"
17 extern struct Library
*MUIMasterBase
;
19 static void draw_thick_line(struct RastPort
*rp
, int x1
, int y1
, int x2
,
32 #define ARROW_SPACING 1
33 #define ARROW_VSPACING ARROW_SPACING
34 #define ARROW_HSPACING ARROW_SPACING
35 #define VERTARROW_VSPACING ARROW_VSPACING
36 #define HORIZARROW_HSPACING ARROW_HSPACING
38 void arrowup_draw(struct MUI_RenderInfo
*mri
, LONG left
, LONG top
,
39 LONG width
, LONG height
, LONG state
)
42 struct RastPort
*rport
= mri
->mri_RastPort
;
44 SetAPen(rport
, mri
->mri_Pens
[MPEN_TEXT
]);
48 if ((width
> 8 + ARROW_SPACING
) && (height
> 8 + ARROW_SPACING
))
50 Move(rport
, left
+ ARROW_HSPACING
+ 1,
51 top
+ height
- 1 - VERTARROW_VSPACING
);
52 Draw(rport
, left
+ width
- cx
, top
+ VERTARROW_VSPACING
);
54 Move(rport
, left
+ ARROW_HSPACING
,
55 top
+ height
- 1 - VERTARROW_VSPACING
);
56 Draw(rport
, left
+ width
- cx
- 1, top
+ VERTARROW_VSPACING
);
57 if ((width
> 8 + ARROW_SPACING
) && (height
> 8 + ARROW_SPACING
))
59 Move(rport
, left
+ width
- 1 - ARROW_HSPACING
- 1,
60 top
+ height
- 1 - VERTARROW_VSPACING
);
61 Draw(rport
, left
+ cx
- 1, top
+ VERTARROW_VSPACING
);
63 Move(rport
, left
+ width
- 1 - ARROW_HSPACING
,
64 top
+ height
- 1 - VERTARROW_VSPACING
);
65 Draw(rport
, left
+ cx
, top
+ VERTARROW_VSPACING
);
68 void arrowdown_draw(struct MUI_RenderInfo
*mri
, LONG left
, LONG top
,
69 LONG width
, LONG height
, LONG state
)
72 struct RastPort
*rport
= mri
->mri_RastPort
;
74 SetAPen(rport
, mri
->mri_Pens
[MPEN_TEXT
]);
78 if ((width
> 8 + ARROW_SPACING
) && (height
> 8 + ARROW_SPACING
))
80 Move(rport
, left
+ ARROW_HSPACING
+ 1, top
+ VERTARROW_VSPACING
);
81 Draw(rport
, left
+ width
- cx
,
82 top
+ height
- 1 - VERTARROW_VSPACING
);
84 Move(rport
, left
+ ARROW_HSPACING
, top
+ VERTARROW_VSPACING
);
85 Draw(rport
, left
+ width
- cx
- 1,
86 top
+ height
- 1 - VERTARROW_VSPACING
);
87 if ((width
> 8 + ARROW_SPACING
) && (height
> 8 + ARROW_SPACING
))
89 Move(rport
, left
+ width
- 1 - ARROW_HSPACING
- 1,
90 top
+ VERTARROW_VSPACING
);
91 Draw(rport
, left
+ cx
- 1, top
+ height
- 1 - VERTARROW_VSPACING
);
93 Move(rport
, left
+ width
- 1 - ARROW_HSPACING
,
94 top
+ VERTARROW_VSPACING
);
95 Draw(rport
, left
+ cx
, top
+ height
- 1 - VERTARROW_VSPACING
);
98 void arrowleft_draw(struct MUI_RenderInfo
*mri
, LONG left
, LONG top
,
99 LONG width
, LONG height
, LONG state
)
102 struct RastPort
*rport
= mri
->mri_RastPort
;
104 SetAPen(rport
, mri
->mri_Pens
[MPEN_TEXT
]);
108 if ((height
> 8 + ARROW_SPACING
) && (width
> 8 + ARROW_SPACING
))
110 Move(rport
, left
+ width
- 1 - HORIZARROW_HSPACING
,
111 top
+ ARROW_VSPACING
+ 1);
112 Draw(rport
, left
+ HORIZARROW_HSPACING
, top
+ height
- cy
);
114 Move(rport
, left
+ width
- 1 - HORIZARROW_HSPACING
,
115 top
+ ARROW_VSPACING
);
116 Draw(rport
, left
+ HORIZARROW_HSPACING
, top
+ height
- cy
- 1);
117 if ((height
> 8 + ARROW_SPACING
) && (width
> 8 + ARROW_SPACING
))
119 Move(rport
, left
+ width
- 1 - HORIZARROW_HSPACING
,
120 top
+ height
- 1 - ARROW_VSPACING
- 1);
121 Draw(rport
, left
+ HORIZARROW_HSPACING
, top
+ cy
- 1);
123 Move(rport
, left
+ width
- 1 - HORIZARROW_HSPACING
,
124 top
+ height
- 1 - ARROW_VSPACING
);
125 Draw(rport
, left
+ HORIZARROW_HSPACING
, top
+ cy
);
128 void arrowright_draw(struct MUI_RenderInfo
*mri
, LONG left
, LONG top
,
129 LONG width
, LONG height
, LONG state
)
132 struct RastPort
*rport
= mri
->mri_RastPort
;
134 SetAPen(rport
, mri
->mri_Pens
[MPEN_TEXT
]);
138 if ((height
> 8 + ARROW_SPACING
) && (width
> 8 + ARROW_SPACING
))
140 Move(rport
, left
+ HORIZARROW_HSPACING
, top
+ ARROW_VSPACING
+ 1);
141 Draw(rport
, left
+ width
- 1 - HORIZARROW_HSPACING
,
144 Move(rport
, left
+ HORIZARROW_HSPACING
, top
+ ARROW_VSPACING
);
145 Draw(rport
, left
+ width
- 1 - HORIZARROW_HSPACING
,
146 top
+ height
- cy
- 1);
147 if ((height
> 8 + ARROW_SPACING
) && (width
> 8 + ARROW_SPACING
))
149 Move(rport
, left
+ HORIZARROW_HSPACING
,
150 top
+ height
- 1 - ARROW_VSPACING
- 1);
151 Draw(rport
, left
+ width
- 1 - HORIZARROW_HSPACING
, top
+ cy
- 1);
153 Move(rport
, left
+ HORIZARROW_HSPACING
,
154 top
+ height
- 1 - ARROW_VSPACING
);
155 Draw(rport
, left
+ width
- 1 - HORIZARROW_HSPACING
, top
+ cy
);
158 void checkbox_draw(struct MUI_RenderInfo
*mri
, LONG left
, LONG top
,
159 LONG width
, LONG height
, LONG state
)
161 int h_spacing
= width
/ 4;
162 int v_spacing
= height
/ 4;
163 int bottom
= top
+ height
- 1;
164 int right
= left
+ width
- 1;
166 /* Draw checkmark (only if image is in selected state) */
168 if (state
== IDS_SELECTED
)
172 width
-= h_spacing
* 2;
175 height
-= v_spacing
* 2;
177 SetAPen(mri
->mri_RastPort
, mri
->mri_Pens
[MPEN_TEXT
]);
179 draw_thick_line(mri
->mri_RastPort
, left
, top
+ height
/ 3, left
,
181 draw_thick_line(mri
->mri_RastPort
, left
+ 1, bottom
, right
- 1,
186 void mx_draw(struct MUI_RenderInfo
*mri
, LONG left
, LONG top
, LONG width
,
187 LONG height
, LONG state
)
189 struct RastPort
*rport
= mri
->mri_RastPort
;
190 int bottom
= top
+ height
- 1;
191 int right
= left
+ width
- 1;
195 if (state
== IDS_SELECTED
)
206 SetAPen(rport
, mri
->mri_Pens
[col1
]);
207 RectFill(rport
, left
+ 3, top
, right
- 3, top
);
208 WritePixel(rport
, left
+ 2, top
+ 1);
209 WritePixel(rport
, left
+ 1, top
+ 2);
210 RectFill(rport
, left
, top
+ 3, left
, bottom
- 3);
211 WritePixel(rport
, left
+ 1, bottom
- 2);
212 WritePixel(rport
, left
+ 2, bottom
- 1);
214 SetAPen(rport
, mri
->mri_Pens
[col2
]);
215 WritePixel(rport
, right
- 2, top
+ 1);
216 WritePixel(rport
, right
- 1, top
+ 2);
217 RectFill(rport
, right
, top
+ 3, right
, bottom
- 3);
218 WritePixel(rport
, right
- 1, bottom
- 2);
219 WritePixel(rport
, right
- 2, bottom
- 1);
220 RectFill(rport
, left
+ 3, bottom
, right
- 3, bottom
);
222 SetAPen(rport
, mri
->mri_DrawInfo
->dri_Pens
[BACKGROUNDPEN
]);
223 RectFill(rport
, left
+ 3, top
+ 1, right
- 3, bottom
- 1);
224 RectFill(rport
, left
+ 2, top
+ 2, right
- 2, bottom
- 2);
225 RectFill(rport
, left
+ 1, top
+ 3, right
- 1, bottom
- 3);
227 if (state
== IDS_SELECTED
)
236 SetAPen(rport
, mri
->mri_Pens
[MPEN_FILL
]);
237 if ((width
>= 5) && (height
>= 5))
239 RectFill(rport
, left
, top
+ 2, left
, bottom
- 2);
240 RectFill(rport
, left
+ 1, top
+ 1, left
+ 1, bottom
- 1);
241 RectFill(rport
, left
+ 2, top
, right
- 2, bottom
);
242 RectFill(rport
, right
- 1, top
+ 1, right
- 1, bottom
- 1);
243 RectFill(rport
, right
, top
+ 2, right
, bottom
- 2);
247 RectFill(rport
, left
, top
, right
, bottom
);
248 RectFill(rport
, left
- 1, top
+ 1, right
+ 1, bottom
- 1);
249 RectFill(rport
, left
+ 1, top
- 1, right
- 1, bottom
+ 1);
254 void cycle_draw(struct MUI_RenderInfo
*mri
, LONG left
, LONG top
, LONG width
,
255 LONG height
, LONG state
)
257 struct RastPort
*rport
= mri
->mri_RastPort
;
258 int bottom
= top
+ height
- 1;
259 int right
= left
+ width
- 1;
264 SetAPen(rport
, mri
->mri_Pens
[MPEN_TEXT
]);
266 Move(rport
, left
, top
+ 1);
267 Draw(rport
, left
, bottom
- 1);
268 Move(rport
, left
+ 1, top
);
269 Draw(rport
, left
+ 1, bottom
);
270 Draw(rport
, right
- 7, bottom
);
271 Move(rport
, right
- 7, bottom
- 1);
272 Draw(rport
, right
- 6, bottom
- 1);
273 Move(rport
, left
+ 2, top
);
274 Draw(rport
, right
- 7, top
);
275 Move(rport
, right
- 7, top
+ 1);
276 Draw(rport
, right
- 6, top
+ 1);
279 arrow_top
= top
+ (3 * height
/ 4) - 3;
280 /* prevent arrow touching bottom */
281 if (arrow_top
+ 4 >= bottom
- 1)
282 arrow_top
= bottom
- 5;
284 RectFill(rport
, right
- 7, top
+ 1, right
- 6, arrow_top
- 1);
286 /* The small arrow */
287 Move(rport
, right
- 6 - 3, top
+ 2);
288 Draw(rport
, right
- 7 + 3, top
+ 2);
289 Move(rport
, right
- 6 - 2, top
+ 3);
290 Draw(rport
, right
- 7 + 2, top
+ 3);
291 Move(rport
, right
- 6 - 1, top
+ 4);
292 Draw(rport
, right
- 7 + 1, top
+ 4);
294 /* makes arrow bigger */
295 if (arrow_top
- top
- 2 >= 4)
297 Move(rport
, right
- 6 - 3, arrow_top
- 1);
298 Draw(rport
, right
- 7 + 3, arrow_top
- 1);
299 Move(rport
, right
- 6 - 2, arrow_top
);
300 Draw(rport
, right
- 7 + 2, arrow_top
);
301 Move(rport
, right
- 6 - 2, arrow_top
+ 1);
302 Draw(rport
, right
- 7 + 2, arrow_top
+ 1);
303 Move(rport
, right
- 6 - 1, arrow_top
+ 2);
304 Draw(rport
, right
- 7 7 + 1, arrow_top
+ 2);
308 Move(rport
, right
- 6 - 3, arrow_top
);
309 Draw(rport
, right
- 7 + 3, arrow_top
);
310 Move(rport
, right
- 6 - 2, arrow_top
+ 1);
311 Draw(rport
, right
- 7 + 2, arrow_top
+ 1);
312 Move(rport
, right
- 6 - 1, arrow_top
+ 2);
313 Draw(rport
, right
- 7 + 1, arrow_top
+ 2);
318 SetAPen(rport
, mri
->mri_Pens
[MPEN_SHADOW
]);
319 Move(rport
, right
- 1, top
);
320 Draw(rport
, right
- 1, bottom
);
321 SetAPen(rport
, mri
->mri_Pens
[MPEN_SHINE
]);
322 Move(rport
, right
, top
);
323 Draw(rport
, right
, bottom
);
326 void popup_draw(struct MUI_RenderInfo
*mri
, LONG left
, LONG top
, LONG width
,
327 LONG height
, LONG state
)
329 int right
, bottom
, cx
;
330 struct RastPort
*rport
= mri
->mri_RastPort
;
334 SetAPen(rport
, mri
->mri_Pens
[MPEN_TEXT
]);
338 Move(rport
, left
+ HSPACING
+ 1, top
+ VSPACING
);
339 Draw(rport
, left
+ width
- cx
, top
+ height
- 1 - VSPACING
);
340 Move(rport
, left
+ HSPACING
, top
+ VSPACING
);
341 Draw(rport
, left
+ width
- cx
- 1, top
+ height
- 1 - VSPACING
);
343 Move(rport
, left
+ width
- 1 - HSPACING
- 1, top
+ VSPACING
);
344 Draw(rport
, left
+ cx
- 1, top
+ height
- 1 - VSPACING
);
345 Move(rport
, left
+ width
- 1 - HSPACING
, top
+ VSPACING
);
346 Draw(rport
, left
+ cx
, top
+ height
- 1 - VSPACING
);
348 bottom
= top
+ height
- 1 + 3;
349 right
= left
+ width
- 1;
350 Move(rport
, left
, bottom
- 2);
351 Draw(rport
, right
, bottom
- 2);
352 Move(rport
, left
, bottom
- 1);
353 Draw(rport
, right
, bottom
- 1);
356 void popfile_draw(struct MUI_RenderInfo
*mri
, LONG left
, LONG top
,
357 LONG width
, LONG height
, LONG state
)
361 struct RastPort
*rport
= mri
->mri_RastPort
;
363 right
= left
+ width
- 1;
364 bottom
= top
+ height
- 1;
366 edgex
= left
+ width
* 5 / 8;
367 edgey
= top
+ height
* 5 / 8;
369 SetAPen(rport
, mri
->mri_Pens
[MPEN_TEXT
]);
370 Move(rport
, left
, top
);
371 Draw(rport
, left
, bottom
);
372 Move(rport
, left
+ 1, top
);
373 Draw(rport
, left
+ 1, bottom
);
375 Move(rport
, left
, bottom
);
376 Draw(rport
, right
, bottom
);
377 Move(rport
, left
, bottom
- 1);
378 Draw(rport
, right
, bottom
- 1);
380 Move(rport
, right
, bottom
- 1);
381 Draw(rport
, right
, edgey
);
382 Move(rport
, right
- 1, bottom
- 1);
383 Draw(rport
, right
- 1, edgey
);
385 Move(rport
, right
, edgey
- 1);
386 Draw(rport
, edgex
, edgey
- 1);
387 Draw(rport
, edgex
, top
);
388 Draw(rport
, left
+ 2, top
);
389 Move(rport
, left
+ 2, top
+ 1);
390 Draw(rport
, edgex
- 1, top
+ 1);
392 Move(rport
, edgex
+ 1, top
);
393 Draw(rport
, right
, edgey
- 1);
397 void popdrawer_draw(struct MUI_RenderInfo
*mri
, LONG left
, LONG top
,
398 LONG width
, LONG height
, LONG state
)
401 int halfx
, halfy
, quartery
;
402 struct RastPort
*rport
= mri
->mri_RastPort
;
404 right
= left
+ width
- 1;
405 bottom
= top
+ height
- 1;
407 halfx
= (left
+ right
) / 2;
408 halfy
= (top
+ bottom
) / 2;
409 quartery
= top
+ height
/ 4;
411 SetAPen(rport
, mri
->mri_Pens
[MPEN_TEXT
]);
412 Move(rport
, left
, quartery
);
413 Draw(rport
, left
, bottom
);
414 Move(rport
, left
+ 1, quartery
);
415 Draw(rport
, left
+ 1, bottom
);
416 Draw(rport
, right
, bottom
);
417 Draw(rport
, right
, halfy
);
418 Draw(rport
, halfx
, halfy
);
419 Draw(rport
, halfx
, quartery
);
420 Draw(rport
, left
+ 1, quartery
);
422 Move(rport
, halfx
, quartery
- 1);
423 Draw(rport
, halfx
+ 2, top
);
424 Draw(rport
, right
- 2, top
);
425 Draw(rport
, right
, quartery
- 1);
426 Draw(rport
, right
, halfy
);
429 static void stddrawer_draw(struct MUI_RenderInfo
*mri
, LONG left
, LONG top
,
430 LONG width
, LONG height
)
432 struct RastPort
*rport
= mri
->mri_RastPort
;
433 int right
= left
+ width
- 1;
434 int bottom
= top
+ height
- 1;
437 #define XX(x) (x * (width - 1) / 100)
438 #define YY(y) (y * (height - 1) / 100)
442 for (y
= 0; y
< YY(YOFF
); y
++)
444 x
= (YY(XOFF
) > 1) ? XX(XOFF
) * y
/ (YY(YOFF
) - 1) : 1;
445 SetAPen(rport
, mri
->mri_Pens
[MPEN_SHINE
]);
446 RectFill(rport
, left
+ XX(XOFF
) - x
, top
+ y
, right
- XX(XOFF
) + x
,
448 SetAPen(rport
, mri
->mri_Pens
[MPEN_SHADOW
]);
449 WritePixel(rport
, left
+ XX(XOFF
) - x
, top
+ y
);
450 WritePixel(rport
, right
- XX(XOFF
) + x
, top
+ y
);
454 SetAPen(rport
, mri
->mri_Pens
[MPEN_SHINE
]);
455 RectFill(rport
, left
, top
+ YY(YOFF
), right
, bottom
);
457 SetAPen(rport
, mri
->mri_Pens
[MPEN_SHADOW
]);
458 Move(rport
, left
+ XX(XOFF
), top
);
459 Draw(rport
, right
- XX(XOFF
), top
);
461 Move(rport
, left
, top
+ YY(YOFF
));
462 Draw(rport
, left
, bottom
);
463 Draw(rport
, right
, bottom
);
464 Draw(rport
, right
, top
+ YY(YOFF
));
465 Draw(rport
, left
, top
+ YY(YOFF
));
474 void drawer_draw(struct MUI_RenderInfo
*mri
, LONG left
, LONG top
,
475 LONG width
, LONG height
, LONG state
)
477 struct RastPort
*rport
= mri
->mri_RastPort
;
478 int right
= left
+ width
- 1;
480 stddrawer_draw(mri
, left
, top
, width
, height
);
482 #define XX(x) x * (width - 1) / 100
483 #define YY(y) y * (height - 1) / 100
485 SetAPen(rport
, mri
->mri_Pens
[MPEN_SHADOW
]);
486 Move(rport
, left
+ XX(40), top
+ YY(75));
487 Draw(rport
, right
- XX(40), top
+ YY(75));
494 void harddisk_draw(struct MUI_RenderInfo
*mri
, LONG left
, LONG top
,
495 LONG width
, LONG height
, LONG state
)
497 struct RastPort
*rport
= mri
->mri_RastPort
;
499 stddrawer_draw(mri
, left
, top
, width
, height
);
501 #define XX(x) x * (width - 1) / 100
502 #define YY(y) y * (height - 1) / 100
504 SetAPen(rport
, mri
->mri_Pens
[MPEN_SHADOW
]);
505 Move(rport
, left
+ XX(20), top
+ YY(75));
506 Draw(rport
, left
+ XX(30), top
+ YY(75));
512 void disk_draw(struct MUI_RenderInfo
*mri
, LONG left
, LONG top
, LONG width
,
513 LONG height
, LONG state
)
515 struct RastPort
*rport
= mri
->mri_RastPort
;
516 int right
= left
+ width
- 1;
517 int bottom
= top
+ height
- 1;
520 #define XX(x) (x * (width - 1) / 100)
521 #define YY(y) (y * (height - 1) / 100)
525 SetAPen(rport
, mri
->mri_Pens
[MPEN_SHADOW
]);
526 for (y
= 0; y
< YY(YOFF
); y
++)
528 x
= (YY(YOFF
) > 1) ? XX(XOFF
) * y
/ (YY(YOFF
) - 1) : 1;
529 RectFill(rport
, left
, top
+ y
, right
- XX(XOFF
) + x
, top
+ y
);
531 RectFill(rport
, left
, top
+ YY(YOFF
), right
, bottom
);
533 SetAPen(rport
, mri
->mri_Pens
[MPEN_SHINE
]);
534 RectFill(rport
, left
+ XX(33), top
, right
- XX(33), top
+ YY(YOFF
));
535 RectFill(rport
, left
+ XX(25), top
+ YY(60), right
- XX(25), bottom
);
543 void ram_draw(struct MUI_RenderInfo
*mri
, LONG left
, LONG top
, LONG width
,
544 LONG height
, LONG state
)
546 struct RastPort
*rport
= mri
->mri_RastPort
;
549 #define XX(x) left + x * (width - 1) / 100
550 #define YY(y) top + y * (height - 1) / 100
552 right
= left
+ width
- 1;
553 bottom
= top
+ height
- 1;
555 SetAPen(rport
, mri
->mri_Pens
[MPEN_SHADOW
]);
556 RectFill(rport
, left
, top
, right
, bottom
);
558 SetAPen(rport
, mri
->mri_Pens
[MPEN_SHINE
]);
559 Move(rport
, XX(33), YY(20));
560 Draw(rport
, XX(33), YY(80));
562 Move(rport
, XX(71), YY(20));
563 Draw(rport
, XX(61), YY(20));
564 Draw(rport
, XX(61), YY(80));
565 Draw(rport
, XX(71), YY(80));
571 void volume_draw(struct MUI_RenderInfo
*mri
, LONG left
, LONG top
,
572 LONG width
, LONG height
, LONG state
)
574 struct RastPort
*rport
= mri
->mri_RastPort
;
577 #define XX(x) left + x * (width - 1) / 100
578 #define YY(y) top + y * (height - 1) / 100
580 right
= left
+ width
- 1;
581 bottom
= top
+ height
- 1;
583 SetAPen(rport
, mri
->mri_Pens
[MPEN_SHADOW
]);
584 RectFill(rport
, left
, top
, right
, bottom
);
586 SetAPen(rport
, mri
->mri_Pens
[MPEN_SHINE
]);
587 Move(rport
, XX(8), YY(20));
588 Draw(rport
, XX(8), YY(60));
589 Draw(rport
, XX(16), YY(80));
590 Draw(rport
, XX(24), YY(60));
591 Draw(rport
, XX(24), YY(20));
593 Move(rport
, XX(40), YY(20));
594 Draw(rport
, XX(60), YY(20));
595 Draw(rport
, XX(60), YY(80));
596 Draw(rport
, XX(40), YY(80));
597 Draw(rport
, XX(40), YY(20));
599 Move(rport
, XX(80), YY(20));
600 Draw(rport
, XX(80), YY(80));
601 Draw(rport
, XX(92), YY(80));
607 void network_draw(struct MUI_RenderInfo
*mri
, LONG left
, LONG top
,
608 LONG width
, LONG height
, LONG state
)
610 struct RastPort
*rport
= mri
->mri_RastPort
;
611 int right
= left
+ width
- 1;
613 stddrawer_draw(mri
, left
, top
, width
, height
);
615 #define XX(x) x * (width - 1) / 100
616 #define YY(y) y * (height - 1) / 100
618 SetAPen(rport
, mri
->mri_Pens
[MPEN_SHADOW
]);
619 Move(rport
, left
+ XX(40), top
+ YY(75));
620 Draw(rport
, right
- XX(40), top
+ YY(75));
626 void assign_draw(struct MUI_RenderInfo
*mri
, LONG left
, LONG top
,
627 LONG width
, LONG height
, LONG state
)
629 struct RastPort
*rport
= mri
->mri_RastPort
;
630 int right
= left
+ width
- 1;
632 stddrawer_draw(mri
, left
, top
, width
, height
);
634 #define XX(x) x * (width - 1) / 100
635 #define YY(y) y * (height - 1) / 100
637 SetAPen(rport
, mri
->mri_Pens
[MPEN_SHADOW
]);
638 Move(rport
, left
+ XX(40), top
+ YY(75));
639 Draw(rport
, right
- XX(40), top
+ YY(75));
645 void tape_play_draw(struct MUI_RenderInfo
*mri
, LONG left
, LONG top
,
646 LONG width
, LONG height
, LONG state
)
648 struct RastPort
*rport
= mri
->mri_RastPort
;
649 int x
, half
= height
/ 2;
651 SetAPen(rport
, mri
->mri_Pens
[MPEN_SHADOW
]);
653 for (x
= 0; x
< width
; x
++)
655 int y
= (width
> 1) ? half
* x
/ (width
- 1) : 1;
657 RectFill(rport
, left
+ width
- 1 - x
, top
+ half
- y
,
658 left
+ width
- 1 - x
, top
+ half
+ y
);
662 void tape_playback_draw(struct MUI_RenderInfo
*mri
, LONG left
, LONG top
,
663 LONG width
, LONG height
, LONG state
)
665 struct RastPort
*rport
= mri
->mri_RastPort
;
666 int x
, half
= height
/ 2;
668 SetAPen(rport
, mri
->mri_Pens
[MPEN_SHADOW
]);
670 for (x
= 0; x
< width
; x
++)
672 int y
= (width
> 1) ? half
* x
/ (width
- 1) : 1;
674 RectFill(rport
, left
+ x
, top
+ half
- y
, left
+ x
, top
+ half
+ y
);
678 void tape_pause_draw(struct MUI_RenderInfo
*mri
, LONG left
, LONG top
,
679 LONG width
, LONG height
, LONG state
)
681 struct RastPort
*rport
= mri
->mri_RastPort
;
683 SetAPen(rport
, mri
->mri_Pens
[MPEN_SHADOW
]);
684 RectFill(rport
, left
, top
, left
+ width
/ 4, top
+ height
- 1);
685 RectFill(rport
, left
+ width
- 1 - width
/ 4, top
, left
+ width
- 1,
689 void tape_stop_draw(struct MUI_RenderInfo
*mri
, LONG left
, LONG top
,
690 LONG width
, LONG height
, LONG state
)
692 struct RastPort
*rport
= mri
->mri_RastPort
;
694 SetAPen(rport
, mri
->mri_Pens
[MPEN_TEXT
]);
695 RectFill(rport
, left
, top
, left
+ width
- 1, top
+ height
- 1);
698 void tape_record_draw(struct MUI_RenderInfo
*mri
, LONG left
, LONG top
,
699 LONG width
, LONG height
, LONG state
)
701 struct RastPort
*rport
= mri
->mri_RastPort
;
702 int rx
= (width
- 1) / 2;
703 int ry
= (height
- 1) / 2;
704 int x
= rx
, y
= 0; /* ellipse points */
706 /* intermediate terms to speed up loop */
707 int t1
= rx
* rx
, t2
= t1
<< 1, t3
= t2
<< 1;
708 int t4
= ry
* ry
, t5
= t4
<< 1, t6
= t5
<< 1;
709 int t7
= rx
* t5
, t8
= t7
<< 1, t9
= 0L;
710 int d1
= t2
- t7
+ (t4
>> 1); /* error terms */
711 int d2
= (t1
>> 1) - t8
+ t5
;
713 SetAPen(rport
, mri
->mri_Pens
[MPEN_SHADOW
]);
715 while (d2
< 0) /* til slope = -1 */
718 /* draw 4 points using symmetry */
719 RectFill(rport
, left
+ rx
- x
, top
+ ry
+ y
, left
+ rx
+ x
,
721 RectFill(rport
, left
+ rx
- x
, top
+ ry
- y
, left
+ rx
+ x
,
724 y
++; /* always move up here */
726 if (d1
< 0) /* move straight up */
731 else /* move up and left */
735 d1
= d1
+ t9
+ t2
- t8
;
736 d2
= d2
+ t9
+ t5
- t8
;
740 do /* rest of top right quadrant */
742 /* draw 4 points using symmetry */
743 RectFill(rport
, left
+ rx
- x
, top
+ ry
+ y
, left
+ rx
+ x
,
745 RectFill(rport
, left
+ rx
- x
, top
+ ry
- y
, left
+ rx
+ x
,
748 x
--; /* always move left here */
750 if (d2
< 0) /* move up and left */
754 d2
= d2
+ t9
+ t5
- t8
;
756 else /* move straight left */
766 void tape_up_draw(struct MUI_RenderInfo
*mri
, LONG left
, LONG top
,
767 LONG width
, LONG height
, LONG state
)
769 struct RastPort
*rport
= mri
->mri_RastPort
;
770 int y
, half
= width
/ 2;
772 SetAPen(rport
, mri
->mri_Pens
[MPEN_SHADOW
]);
774 for (y
= 0; y
< height
; y
++)
776 int x
= (height
> 1) ? half
* y
/ (height
- 1) : 1;
778 RectFill(rport
, left
+ half
- x
, top
+ y
, left
+ half
+ x
, top
+ y
);
782 void tape_down_draw(struct MUI_RenderInfo
*mri
, LONG left
, LONG top
,
783 LONG width
, LONG height
, LONG state
)
785 struct RastPort
*rport
= mri
->mri_RastPort
;
786 int y
, half
= width
/ 2;
788 SetAPen(rport
, mri
->mri_Pens
[MPEN_SHADOW
]);
790 for (y
= 0; y
< height
; y
++)
792 int x
= (height
> 1) ? half
* y
/ (height
- 1) : 1;
794 RectFill(rport
, left
+ half
- x
, top
+ height
- 1 - y
,
795 left
+ half
+ x
, top
+ height
- 1 - y
);
803 VECTOR_DRAW_FUNC draw_func
;
806 static const struct vector_image vector_table
[] = {
807 {8 + 2 * ARROW_SPACING
, 8 + 2 * ARROW_SPACING
, arrowup_draw
},
808 {8 + 2 * ARROW_SPACING
, 8 + 2 * ARROW_SPACING
, arrowdown_draw
},
809 {8 + 2 * ARROW_SPACING
, 8 + 2 * ARROW_SPACING
, arrowleft_draw
},
810 {8 + 2 * ARROW_SPACING
, 8 + 2 * ARROW_SPACING
, arrowright_draw
},
811 {16, 10, checkbox_draw
},
814 {10, 11, popup_draw
},
815 {10, 11, popfile_draw
},
816 {10, 11, popdrawer_draw
},
818 {13, 8, drawer_draw
},
819 {13, 8, harddisk_draw
},
822 {14, 6, volume_draw
},
823 {13, 8, network_draw
},
824 {13, 8, assign_draw
},
826 {4, 7, tape_play_draw
},
827 {4, 7, tape_playback_draw
},
828 {6, 7, tape_pause_draw
},
829 {6, 7, tape_stop_draw
},
830 {7, 7, tape_record_draw
},
831 {7, 4, tape_up_draw
},
832 {7, 4, tape_down_draw
},
835 #define VECTOR_TABLE_ENTRIES (sizeof(vector_table)/sizeof(vector_table[0]))
837 struct MUI_ImageSpec_intern
*zune_imspec_create_vector(LONG vect
)
839 struct MUI_ImageSpec_intern
*spec
;
841 if (!(vect
>= 0 && vect
< VECTOR_TABLE_ENTRIES
))
844 if ((spec
= mui_alloc_struct(struct MUI_ImageSpec_intern
)))
846 spec
->type
= IST_VECTOR
;
847 spec
->u
.vect
.type
= vect
;
848 spec
->u
.vect
.draw
= vector_table
[vect
].draw_func
;
853 BOOL
zune_imspec_vector_get_minmax(struct MUI_ImageSpec_intern
*spec
,
854 struct MUI_MinMax
*minmax
)
856 if (!spec
|| spec
->type
!= IST_VECTOR
)
858 if ((spec
->u
.vect
.type
>= 0)
859 && (spec
->u
.vect
.type
< VECTOR_TABLE_ENTRIES
))
861 minmax
->MinWidth
= vector_table
[spec
->u
.vect
.type
].minwidth
;
862 minmax
->MinHeight
= vector_table
[spec
->u
.vect
.type
].minheight
;
863 minmax
->DefWidth
= minmax
->MinWidth
;
864 minmax
->DefHeight
= minmax
->MinHeight
;
865 minmax
->MaxWidth
= MUI_MAXMAX
;
866 minmax
->MaxHeight
= MUI_MAXMAX
;