1 //
2 // "$Id: fl_symbols.cxx 5190 2006-06-09 16:16:34Z mike $"
3 //
4 // Symbol drawing code for the Fast Light Tool Kit (FLTK).
5 //
6 // Copyright 1998-2005 by Bill Spitzak and others.
7 //
8 // This library is free software; you can redistribute it and/or
9 // modify it under the terms of the GNU Library General Public
10 // License as published by the Free Software Foundation; either
11 // version 2 of the License, or (at your option) any later version.
12 //
13 // This library is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16 // Library General Public License for more details.
17 //
18 // You should have received a copy of the GNU Library General Public
19 // License along with this library; if not, write to the Free Software
20 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
21 // USA.
22 //
23 // Please report all bugs and problems on the following page:
24 //
25 //     http://www.fltk.org/str.php
26 //
27 
28 // These are small graphics drawn by the normal label-drawing
29 // code when the string starts with an '@' sign.
30 
31 // Adapted from original code written by:
32 
33 // Written by Mark Overmars
34 // Version 2.1 a
35 // Date: Oct  2, 1992
36 
37 #include <FL/Fl.H>
38 #include <FL/fl_draw.H>
39 #include <FL/math.h>
40 #include "flstring.h"
41 
42 typedef struct {
43   const char *name;
44   void (*drawit)(Fl_Color);
45   char scalable;
46   char notempty;
47 } SYMBOL;
48 
49 #define MAXSYMBOL       211
50    /* Maximal number of symbols in table. Only half of them are
51       used. Should be prime. */
52 
53 static SYMBOL symbols[MAXSYMBOL];      /* The symbols */
54 static int symbnumb = -1;              /* Their number */
55 
find(const char * name)56 static int find(const char *name) {
57 // returns hash entry if it exists, or first empty slot:
58   int pos = name[0] ? (
59     name[1] ? (
60       name[2] ? 71*name[0]+31*name[1]+name[2] : 31*name[0]+name[1]
61     ) :
62       name[0]
63   ) : 0;
64   pos %= MAXSYMBOL;
65   int hh2 = name[0] ? (
66     (name[1]) ? 51*name[0]+3*name[1] : 3*name[0]
67     ) : 1;
68   hh2 %= MAXSYMBOL; if (!hh2) hh2 = 1;
69   for (;;) {
70     if (!symbols[pos].notempty) return pos;
71     if (!strcmp(symbols[pos].name,name)) return pos;
72     pos = (pos + hh2) % MAXSYMBOL;
73   }
74 }
75 
76 static void fl_init_symbols(void);
77 
78 /**************** The routines seen by the user *************************/
79 
fl_add_symbol(const char * name,void (* drawit)(Fl_Color),int scalable)80 int fl_add_symbol(const char *name, void (*drawit)(Fl_Color), int scalable)
81 /* Adds a symbol to the system. Returns whether correct. */
82 {
83   fl_init_symbols();
84   int pos;
85   if (symbnumb > MAXSYMBOL / 2) return 0;	// table is full
86   pos = find(name);
87   symbols[pos].name = name;
88   symbols[pos].drawit = drawit;
89   symbols[pos].notempty = 1;
90   symbols[pos].scalable = scalable;
91   symbnumb++;
92   return 1;
93 }
94 
95 int fl_return_arrow(int x,int y,int w,int h);
96 
97 // provided for back compatability:
fl_draw_symbol(const char * label,int x,int y,int w,int h,Fl_Color col)98 int fl_draw_symbol(const char *label,int x,int y,int w,int h,Fl_Color col) {
99   const char *p = label;
100   if (*p++ != '@') return 0;
101   fl_init_symbols();
102   int equalscale = 0;
103   if (*p == '#') {equalscale = 1; p++;}
104   if (*p == '-' && p[1]>='1' && p[1]<='9') {
105     int n = p[1]-'0';
106     x += n; y += n; w -= 2*n; h -= 2*n;
107     p += 2;
108   } else if (*p == '+' && p[1]>='1' && p[1]<='9') {
109     int n = p[1]-'0';
110     x -= n; y -= n; w += 2*n; h += 2*n;
111     p += 2;
112   }
113   if (w < 10) {x -= (10-w)/2; w = 10;}
114   if (h < 10) {y -= (10-h)/2; h = 10;}
115   w = (w-1)|1; h = (h-1)|1;
116   char flip_x = 0, flip_y = 0;
117   if (*p=='$') {
118     flip_x = 1;
119     p++;
120   }
121   if (*p=='%') {
122     flip_y = 1;
123     p++;
124   }
125   int rotangle;
126   switch (*p++) {
127   case '0':
128     rotangle = 1000*(p[1]-'0') + 100*(p[2]-'0') + 10*(p[3]-'0');
129     p += 4;
130     break;
131   case '1': rotangle = 2250; break;
132   case '2': rotangle = 2700; break;
133   case '3': rotangle = 3150; break;
134   case '4': rotangle = 1800; break;
135   case '5':
136   case '6': rotangle = 0; break;
137   case '7': rotangle = 1350; break;
138   case '8': rotangle =  900; break;
139   case '9': rotangle =  450; break;
140   default: rotangle = 0; p--; break;
141   }
142   int pos = find(p);
143   if (!symbols[pos].notempty) return 0;
144   if (symbols[pos].scalable == 3) { // kludge to detect return arrow
145     fl_return_arrow(x,y,w,h);
146     return 1;
147   }
148   fl_push_matrix();
149   fl_translate(x+w/2,y+h/2);
150   if (symbols[pos].scalable) {
151     if (equalscale) {if (w<h) h = w; else w = h;}
152     fl_scale(0.5*w, 0.5*h);
153     fl_rotate(rotangle/10.0);
154     if (flip_x) fl_scale(-1.0, 1.0);
155     if (flip_y) fl_scale(1.0, -1.0);
156   }
157   (symbols[pos].drawit)(col);
158   fl_pop_matrix();
159   return 1;
160 }
161 
162 /******************** THE DEFAULT SYMBOLS ****************************/
163 
164 /* Some help stuff */
165 
166 #define BP fl_begin_polygon()
167 #define EP fl_end_polygon()
168 #define BCP fl_begin_complex_polygon()
169 #define ECP fl_end_complex_polygon()
170 #define BL fl_begin_line()
171 #define EL fl_end_line()
172 #define BC fl_begin_loop()
173 #define EC fl_end_loop()
174 #define vv(x,y) fl_vertex(x,y)
175 
176 //for the outline color
set_outline_color(Fl_Color c)177 static void set_outline_color(Fl_Color c) {
178   fl_color(fl_darker(c));
179 }
180 
rectangle(double x,double y,double x2,double y2,Fl_Color col)181 static void rectangle(double x,double y,double x2,double y2,Fl_Color col) {
182   fl_color(col);
183   BP; vv(x,y); vv(x2,y); vv(x2,y2); vv(x,y2); EP;
184   set_outline_color(col);
185   BC; vv(x,y); vv(x2,y); vv(x2,y2); vv(x,y2); EC;
186 }
187 
188 /* The drawing routines */
189 
draw_fltk(Fl_Color col)190 static void draw_fltk(Fl_Color col)
191 {
192   fl_color(col);
193   // F fill
194   BCP; vv(-2.0, -0.5); vv(-1.0, -0.5); vv(-1.0, -0.3); vv(-1.8, -0.3);
195   vv(-1.8, -0.1); vv(-1.2, -0.1); vv(-1.2, 0.1); vv(-1.8, 0.1);
196   vv(-1.8, 0.5); vv(-2.0, 0.5); ECP;
197   // L fill
198   BCP; vv(-1.0, -0.5); vv(-0.8, -0.5); vv(-0.8, 0.3); vv(0.0, 0.3);
199   vv(0.0, 0.5); vv(-1.0, 0.5); ECP;
200   // T outline
201   BCP; vv(-0.1, -0.5); vv(1.1, -0.5); vv(1.1, -0.3); vv(0.6, -0.3);
202   vv(0.6, 0.5); vv(0.4, 0.5); vv(0.4, -0.3); vv(-0.1, -0.3); ECP;
203   // K outline
204   BCP; vv(1.1, -0.5); vv(1.3, -0.5); vv(1.3, -0.15); vv(1.70, -0.5);
205   vv(2.0, -0.5); vv(1.43, 0.0); vv(2.0, 0.5); vv(1.70, 0.5);
206   vv(1.3, 0.15); vv(1.3, 0.5); vv(1.1, 0.5); ECP;
207   set_outline_color(col);
208   // F outline
209   BC; vv(-2.0, -0.5); vv(-1.0, -0.5); vv(-1.0, -0.3); vv(-1.8, -0.3);
210   vv(-1.8, -0.1); vv(-1.2, -0.1); vv(-1.2, 0.1); vv(-1.8, 0.1);
211   vv(-1.8, 0.5); vv(-2.0, 0.5); EC;
212   // L outline
213   BC; vv(-1.0, -0.5); vv(-0.8, -0.5); vv(-0.8, 0.3); vv(0.0, 0.3);
214   vv(0.0, 0.5); vv(-1.0, 0.5); EC;
215   // T outline
216   BC; vv(-0.1, -0.5); vv(1.1, -0.5); vv(1.1, -0.3); vv(0.6, -0.3);
217   vv(0.6, 0.5); vv(0.4, 0.5); vv(0.4, -0.3); vv(-0.1, -0.3); EC;
218   // K outline
219   BC; vv(1.1, -0.5); vv(1.3, -0.5); vv(1.3, -0.15); vv(1.70, -0.5);
220   vv(2.0, -0.5); vv(1.43, 0.0); vv(2.0, 0.5); vv(1.70, 0.5);
221   vv(1.3, 0.15); vv(1.3, 0.5); vv(1.1, 0.5); EC;
222 }
223 
draw_search(Fl_Color col)224 static void draw_search(Fl_Color col)
225 {
226   fl_color(col);
227   BP; vv(-.4, .13); vv(-1.0, .73); vv(-.73, 1.0); vv(-.13, .4); EP;
228   set_outline_color(col);
229   fl_line_style(FL_SOLID, 3, 0);
230   BC; fl_circle(.2, -.2, .6); EC;
231   fl_line_style(FL_SOLID, 1, 0);
232   BC; vv(-.4, .13); vv(-1.0, .73); vv(-.73, 1.0); vv(-.13, .4); EC;
233 }
234 
draw_arrow1(Fl_Color col)235 static void draw_arrow1(Fl_Color col)
236 {
237   fl_color(col);
238   BP; vv(-0.8,-0.4); vv(-0.8,0.4); vv(0.0,0.4); vv(0.0,-0.4); EP;
239   BP; vv(0.0,0.8); vv(0.8,0.0); vv(0.0,-0.8); vv(0.0,-0.4); vv(0.0,0.4); EP;
240   set_outline_color(col);
241   BC; vv(-0.8,-0.4); vv(-0.8,0.4); vv(0.0,0.4); vv(0.0,0.8); vv(0.8,0.0);
242       vv(0.0,-0.8); vv(0.0,-0.4); EC;
243 }
244 
draw_arrow1bar(Fl_Color col)245 static void draw_arrow1bar(Fl_Color col)
246 {
247   draw_arrow1(col);
248   rectangle(.6,-.8,.9,.8,col);
249 }
250 
draw_arrow2(Fl_Color col)251 static void draw_arrow2(Fl_Color col)
252 {
253   fl_color(col);
254   BP; vv(-0.3,0.8); vv(0.50,0.0); vv(-0.3,-0.8); EP;
255   set_outline_color(col);
256   BC; vv(-0.3,0.8); vv(0.50,0.0); vv(-0.3,-0.8); EC;
257 }
258 
draw_arrow3(Fl_Color col)259 static void draw_arrow3(Fl_Color col)
260 {
261   fl_color(col);
262   BP; vv(0.1,0.8); vv(0.9,0.0); vv(0.1,-0.8); EP;
263   BP; vv(-0.7,0.8); vv(0.1,0.0); vv(-0.7,-0.8); EP;
264   set_outline_color(col);
265   BC; vv(0.1,0.8); vv(0.9,0.0); vv(0.1,-0.8); EC;
266   BC; vv(-0.7,0.8); vv(0.1,0.0); vv(-0.7,-0.8); EC;
267 }
268 
draw_arrowbar(Fl_Color col)269 static void draw_arrowbar(Fl_Color col)
270 {
271   fl_color(col);
272   BP; vv(0.2,0.8); vv(0.6,0.8); vv(0.6,-0.8); vv(0.2,-0.8); EP;
273   BP; vv(-0.6,0.8); vv(0.2,0.0); vv(-0.6,-0.8); EP;
274   set_outline_color(col);
275   BC; vv(0.2,0.8); vv(0.6,0.8); vv(0.6,-0.8); vv(0.2,-0.8); EC;
276   BC; vv(-0.6,0.8); vv(0.2,0.0); vv(-0.6,-0.8); EC;
277 }
278 
draw_arrowbox(Fl_Color col)279 static void draw_arrowbox(Fl_Color col)
280 {
281   fl_color(col);
282   BP; vv(-0.6,0.8); vv(0.2,0.0); vv(-0.6,-0.8); EP;
283   BC; vv(0.2,0.8); vv(0.6,0.8); vv(0.6,-0.8); vv(0.2,-0.8); EC;
284   set_outline_color(col);
285   BC; vv(0.2,0.8); vv(0.6,0.8); vv(0.6,-0.8); vv(0.2,-0.8); EC;
286   BC; vv(-0.6,0.8); vv(0.2,0.0); vv(-0.6,-0.8); EC;
287 }
288 
draw_bararrow(Fl_Color col)289 static void draw_bararrow(Fl_Color col)
290 {
291   fl_color(col);
292   BP; vv(0.1,0.8); vv(0.9,0.0); vv(0.1,-0.8); EP;
293   BP; vv(-0.5,0.8); vv(-0.1,0.8); vv(-0.1,-0.8); vv(-0.5,-0.8); EP;
294   set_outline_color(col);
295   BC; vv(0.1,0.8); vv(0.9,0.0); vv(0.1,-0.8); EC;
296   BC; vv(-0.5,0.8); vv(-0.1,0.8); vv(-0.1,-0.8); vv(-0.5,-0.8); EC;
297 }
298 
draw_doublebar(Fl_Color col)299 static void draw_doublebar(Fl_Color col) {
300   rectangle(-0.6,-0.8,-.1,.8,col);
301   rectangle(.1,-0.8,.6,.8,col);
302 }
303 
draw_arrow01(Fl_Color col)304 static void draw_arrow01(Fl_Color col)
305   { fl_rotate(180); draw_arrow1(col); }
306 
draw_arrow02(Fl_Color col)307 static void draw_arrow02(Fl_Color col)
308   { fl_rotate(180); draw_arrow2(col); }
309 
draw_arrow03(Fl_Color col)310 static void draw_arrow03(Fl_Color col)
311   { fl_rotate(180); draw_arrow3(col); }
312 
draw_0arrowbar(Fl_Color col)313 static void draw_0arrowbar(Fl_Color col)
314   { fl_rotate(180); draw_arrowbar(col); }
315 
draw_0arrowbox(Fl_Color col)316 static void draw_0arrowbox(Fl_Color col)
317   { fl_rotate(180); draw_arrowbox(col); }
318 
draw_0bararrow(Fl_Color col)319 static void draw_0bararrow(Fl_Color col)
320   { fl_rotate(180); draw_bararrow(col); }
321 
draw_doublearrow(Fl_Color col)322 static void draw_doublearrow(Fl_Color col)
323 {
324   fl_color(col);
325   BP; vv(-0.35,-0.4); vv(-0.35,0.4); vv(0.35,0.4); vv(0.35,-0.4); EP;
326   BP; vv(0.15,0.8); vv(0.95,0.0); vv(0.15,-0.8); EP;
327   BP; vv(-0.15,0.8); vv(-0.95,0.0); vv(-0.15,-0.8); EP;
328   set_outline_color(col);
329   BC; vv(-0.15,0.4); vv(0.15,0.4); vv(0.15,0.8); vv(0.95,0.0);
330       vv(0.15,-0.8); vv(0.15,-0.4); vv(-0.15,-0.4); vv(-0.15,-0.8);
331       vv(-0.95,0.0); vv(-0.15,0.8); EC;
332 }
333 
draw_arrow(Fl_Color col)334 static void draw_arrow(Fl_Color col)
335 {
336   fl_color(col);
337   BP; vv(0.65,0.1); vv(1.0,0.0); vv(0.65,-0.1); EP;
338   BL; vv(-1.0,0.0); vv(0.65,0.0); EL;
339   set_outline_color(col);
340   BL; vv(-1.0,0.0); vv(0.65,0.0); EL;
341   BC; vv(0.65,0.1); vv(1.0,0.0); vv(0.65,-0.1); EC;
342 }
343 
draw_square(Fl_Color col)344 static void draw_square(Fl_Color col)
345   { rectangle(-1,-1,1,1,col); }
346 
draw_circle(Fl_Color col)347 static void draw_circle(Fl_Color col) {
348   fl_color(col); BP; fl_circle(0,0,1); EP;
349   set_outline_color(col);
350   BC; fl_circle(0,0,1); EC;
351 }
352 
draw_line(Fl_Color col)353 static void draw_line(Fl_Color col)
354   { fl_color(col); BL; vv(-1.0,0.0); vv(1.0,0.0); EL; }
355 
draw_plus(Fl_Color col)356 static void draw_plus(Fl_Color col)
357 {
358   fl_color(col);
359   BP; vv(-0.9,-0.15); vv(-0.9,0.15); vv(0.9,0.15); vv(0.9,-0.15); EP;
360   BP; vv(-0.15,-0.9); vv(-0.15,0.9); vv(0.15,0.9); vv(0.15,-0.9); EP;
361   set_outline_color(col);
362   BC;
363   vv(-0.9,-0.15); vv(-0.9,0.15); vv(-0.15,0.15); vv(-0.15,0.9);
364   vv(0.15,0.9); vv(0.15,0.15); vv(0.9,0.15); vv(0.9,-0.15);
365   vv(0.15,-0.15); vv(0.15,-0.9); vv(-0.15,-0.9); vv(-0.15,-0.15);
366   EC;
367 }
368 
draw_uparrow(Fl_Color)369 static void draw_uparrow(Fl_Color) {
370   fl_color(FL_LIGHT3);
371   BL; vv(-.8,.8); vv(-.8,-.8); vv(.8,0); EL;
372   fl_color(FL_DARK3);
373   BL; vv(-.8,.8); vv(.8, 0); EL;
374 }
375 
draw_downarrow(Fl_Color)376 static void draw_downarrow(Fl_Color) {
377   fl_color(FL_DARK3);
378   BL; vv(-.8,.8); vv(-.8,-.8); vv(.8,0); EL;
379   fl_color(FL_LIGHT3);
380   BL; vv(-.8,.8); vv(.8, 0); EL;
381 }
382 
draw_menu(Fl_Color col)383 static void draw_menu(Fl_Color col)
384 {
385   rectangle(-0.65, 0.85, 0.65, -0.25, col);
386   rectangle(-0.65, -0.6, 0.65, -1.0, col);
387 }
388 
389 // Standard UI icons...
draw_filenew(Fl_Color c)390 static void draw_filenew(Fl_Color c) {
391   fl_color(c);
392   BCP;
393     vv(-0.7, -1.0);
394     vv(0.1, -1.0);
395     vv(0.1, -0.4);
396     vv(0.7, -0.4);
397     vv(0.7, 1.0);
398     vv(-0.7, 1.0);
399   ECP;
400 
401   fl_color(fl_lighter(c));
402   BP;
403     vv(0.1, -1.0);
404     vv(0.1, -0.4);
405     vv(0.7, -0.4);
406   EP;
407 
408   fl_color(fl_darker(c));
409   BC;
410     vv(-0.7, -1.0);
411     vv(0.1, -1.0);
412     vv(0.1, -0.4);
413     vv(0.7, -0.4);
414     vv(0.7, 1.0);
415     vv(-0.7, 1.0);
416   EC;
417 
418   BL;
419     vv(0.1, -1.0);
420     vv(0.7, -0.4);
421   EL;
422 }
423 
draw_fileopen(Fl_Color c)424 static void draw_fileopen(Fl_Color c) {
425   fl_color(c);
426   BP;
427     vv(-1.0, -0.7);
428     vv(-0.9, -0.8);
429     vv(-0.4, -0.8);
430     vv(-0.3, -0.7);
431     vv(0.6, -0.7);
432     vv(0.6, 0.7);
433     vv(-1.0, 0.7);
434   EP;
435 
436   fl_color(fl_darker(c));
437   BC;
438     vv(-1.0, -0.7);
439     vv(-0.9, -0.8);
440     vv(-0.4, -0.8);
441     vv(-0.3, -0.7);
442     vv(0.6, -0.7);
443     vv(0.6, 0.7);
444     vv(-1.0, 0.7);
445   EC;
446 
447   fl_color(fl_lighter(c));
448   BP;
449     vv(-1.0, 0.7);
450     vv(-0.6, -0.3);
451     vv(1.0, -0.3);
452     vv(0.6, 0.7);
453   EP;
454 
455   fl_color(fl_darker(c));
456   BC;
457     vv(-1.0, 0.7);
458     vv(-0.6, -0.3);
459     vv(1.0, -0.3);
460     vv(0.6, 0.7);
461   EC;
462 }
463 
draw_filesave(Fl_Color c)464 static void draw_filesave(Fl_Color c) {
465   fl_color(c);
466   BP;
467     vv(-0.9, -1.0);
468     vv(0.9, -1.0);
469     vv(1.0, -0.9);
470     vv(1.0, 0.9);
471     vv(0.9, 1.0);
472     vv(-0.9, 1.0);
473     vv(-1.0, 0.9);
474     vv(-1.0, -0.9);
475   EP;
476 
477   fl_color(fl_lighter(c));
478   BP;
479     vv(-0.7, -1.0);
480     vv(0.7, -1.0);
481     vv(0.7, -0.4);
482     vv(-0.7, -0.4);
483   EP;
484 
485   BP;
486     vv(-0.7, 0.0);
487     vv(0.7, 0.0);
488     vv(0.7, 1.0);
489     vv(-0.7, 1.0);
490   EP;
491 
492   fl_color(c);
493   BP;
494     vv(-0.5, -0.9);
495     vv(-0.3, -0.9);
496     vv(-0.3, -0.5);
497     vv(-0.5, -0.5);
498   EP;
499 
500   fl_color(fl_darker(c));
501   BC;
502     vv(-0.9, -1.0);
503     vv(0.9, -1.0);
504     vv(1.0, -0.9);
505     vv(1.0, 0.9);
506     vv(0.9, 1.0);
507     vv(-0.9, 1.0);
508     vv(-1.0, 0.9);
509     vv(-1.0, -0.9);
510   EC;
511 }
512 
draw_filesaveas(Fl_Color c)513 static void draw_filesaveas(Fl_Color c) {
514   draw_filesave(c);
515 
516   fl_color(fl_color_average(c, FL_WHITE, 0.25f));
517   BP;
518     vv(0.6, -0.8);
519     vv(1.0, -0.4);
520     vv(0.0, 0.6);
521     vv(-0.4, 0.6);
522     vv(-0.4, 0.2);
523   EP;
524 
525   fl_color(fl_darker(c));
526   BC;
527     vv(0.6, -0.8);
528     vv(1.0, -0.4);
529     vv(0.0, 0.6);
530     vv(-0.4, 0.6);
531     vv(-0.4, 0.2);
532   EC;
533 
534   BP;
535     vv(-0.1, 0.6);
536     vv(-0.4, 0.6);
537     vv(-0.4, 0.3);
538   EP;
539 }
540 
draw_fileprint(Fl_Color c)541 static void draw_fileprint(Fl_Color c) {
542   fl_color(c);
543   BP;
544     vv(-0.8, 0.0);
545     vv(0.8, 0.0);
546     vv(1.0, 0.2);
547     vv(1.0, 1.0);
548     vv(-1.0, 1.0);
549     vv(-1.0, 0.2);
550   EP;
551 
552   fl_color(fl_color_average(c, FL_WHITE, 0.25f));
553   BP;
554     vv(-0.6, 0.0);
555     vv(-0.6, -1.0);
556     vv(0.6, -1.0);
557     vv(0.6, 0.0);
558   EP;
559 
560   fl_color(fl_lighter(c));
561   BP;
562     vv(-0.6, 0.6);
563     vv(0.6, 0.6);
564     vv(0.6, 1.0);
565     vv(-0.6, 1.0);
566   EP;
567 
568   fl_color(fl_darker(c));
569   BC;
570     vv(-0.8, 0.0);
571     vv(-0.6, 0.0);
572     vv(-0.6, -1.0);
573     vv(0.6, -1.0);
574     vv(0.6, 0.0);
575     vv(0.8, 0.0);
576     vv(1.0, 0.2);
577     vv(1.0, 1.0);
578     vv(-1.0, 1.0);
579     vv(-1.0, 0.2);
580   EC;
581 
582   BC;
583     vv(-0.6, 0.6);
584     vv(0.6, 0.6);
585     vv(0.6, 1.0);
586     vv(-0.6, 1.0);
587   EC;
588 }
589 
draw_round_arrow(Fl_Color c,float da=5.0)590 static void draw_round_arrow(Fl_Color c, float da=5.0) {
591   double a, r, dr1=0.005, dr2=0.015;
592   int i, j;
593   for (j=0; j<2; j++) {
594     if (j&1) {
595       fl_color(c);
596       set_outline_color(c);
597       BC;
598     } else {
599       fl_color(c);
600       BCP;
601     }
602     vv(-0.1, 0.0);
603     vv(-1.0, 0.0);
604     vv(-1.0, 0.9);
605     for (i=27, a=140.0, r=1.0; i>0; i--, a-=da, r-=dr1) {
606       double ar = a/180.0 * M_PI;
607       vv(cos(ar)*r, sin(ar)*r);
608     }
609     for (i=27; i>=0; a+=da, i--, r-=dr2) {
610       double ar = a/180.0 * M_PI;
611       vv(cos(ar)*r, sin(ar)*r);
612     }
613     if (j&1) {
614       EC;
615     } else {
616       ECP;
617     }
618   }
619 }
620 
draw_refresh(Fl_Color c)621 static void draw_refresh(Fl_Color c) {
622   draw_round_arrow(c);
623   fl_rotate(180.0);
624   draw_round_arrow(c);
625   fl_rotate(-180.0);
626 }
627 
draw_reload(Fl_Color c)628 static void draw_reload(Fl_Color c) {
629   fl_rotate(-135.0);
630   draw_round_arrow(c, 10);
631   fl_rotate(135.0);
632 }
633 
draw_undo(Fl_Color c)634 static void draw_undo(Fl_Color c) {
635   fl_translate(0.0, 0.2);
636   fl_scale(1.0, -1.0);
637   draw_round_arrow(c, 6);
638   fl_scale(1.0, -1.0);
639   fl_translate(0.0, -0.2);
640 }
641 
draw_redo(Fl_Color c)642 static void draw_redo(Fl_Color c) {
643   fl_scale(-1.0, 1.0);
644   draw_undo(c);
645   fl_scale(-1.0, 1.0);
646 }
647 
fl_init_symbols(void)648 static void fl_init_symbols(void) {
649   static char beenhere;
650   if (beenhere) return;
651   beenhere = 1;
652   symbnumb = 0;
653 
654   fl_add_symbol("",		draw_arrow1,		1);
655   fl_add_symbol("->",		draw_arrow1,		1);
656   fl_add_symbol(">",		draw_arrow2,		1);
657   fl_add_symbol(">>",		draw_arrow3,		1);
658   fl_add_symbol(">|",		draw_arrowbar,		1);
659   fl_add_symbol(">[]",		draw_arrowbox,		1);
660   fl_add_symbol("|>",		draw_bararrow,		1);
661   fl_add_symbol("<-",		draw_arrow01,		1);
662   fl_add_symbol("<",		draw_arrow02,		1);
663   fl_add_symbol("<<",		draw_arrow03,		1);
664   fl_add_symbol("|<",		draw_0arrowbar,		1);
665   fl_add_symbol("[]<",		draw_0arrowbox,		1);
666   fl_add_symbol("<|",		draw_0bararrow,		1);
667   fl_add_symbol("<->",		draw_doublearrow,	1);
668   fl_add_symbol("-->",		draw_arrow,		1);
669   fl_add_symbol("+",		draw_plus,		1);
670   fl_add_symbol("->|",		draw_arrow1bar,		1);
671   fl_add_symbol("arrow",	draw_arrow,		1);
672   fl_add_symbol("returnarrow",	0,			3);
673   fl_add_symbol("square",	draw_square,		1);
674   fl_add_symbol("circle",	draw_circle,		1);
675   fl_add_symbol("line",		draw_line,		1);
676   fl_add_symbol("plus",		draw_plus,		1);
677   fl_add_symbol("menu",		draw_menu,		1);
678   fl_add_symbol("UpArrow",	draw_uparrow,		1);
679   fl_add_symbol("DnArrow",	draw_downarrow,		1);
680   fl_add_symbol("||",		draw_doublebar,		1);
681   fl_add_symbol("search",       draw_search,            1);
682   fl_add_symbol("FLTK",         draw_fltk,              1);
683 
684   fl_add_symbol("filenew",      draw_filenew,           1);
685   fl_add_symbol("fileopen",     draw_fileopen,          1);
686   fl_add_symbol("filesave",     draw_filesave,          1);
687   fl_add_symbol("filesaveas",   draw_filesaveas,        1);
688   fl_add_symbol("fileprint",    draw_fileprint,         1);
689 
690   fl_add_symbol("refresh",      draw_refresh,           1);
691   fl_add_symbol("reload",       draw_reload,            1);
692   fl_add_symbol("undo",         draw_undo,              1);
693   fl_add_symbol("redo",         draw_redo,              1);
694 
695 //  fl_add_symbol("file",      draw_file,           1);
696 }
697 
698 //
699 // End of "$Id: fl_symbols.cxx 5190 2006-06-09 16:16:34Z mike $".
700 //
701