1 /* Functions: symbol_save, symbol_draw
2  **
3  ** Author: Radim Blazek
4  */
5 
6 #include <grass/vector.h>
7 #include <grass/symbol.h>
8 #include "clr.h"
9 #include "local_proto.h"
10 #include "vector.h"
11 
12 /* draw chain */
draw_chain(SYMBCHAIN * chain,double s)13 int draw_chain(SYMBCHAIN * chain, double s)
14 {
15     int k, l;
16     char *mvcmd;
17     SYMBEL *elem;
18 
19     for (k = 0; k < chain->count; k++) {
20 	elem = chain->elem[k];
21 	switch (elem->type) {
22 	case S_LINE:
23 	    for (l = 0; l < elem->coor.line.count; l++) {
24 		if (k == 0 && l == 0)
25 		    mvcmd = "M";
26 		else
27 		    mvcmd = "LN";
28 		fprintf(PS.fp, "%.4f %.4f %s\n",
29 			s * elem->coor.line.x[l],
30 			s * elem->coor.line.y[l], mvcmd);
31 	    }
32 	    break;
33 	case S_ARC:
34 	    if (elem->coor.arc.clock)
35 		mvcmd = "arcn";
36 	    else
37 		mvcmd = "arc";
38 	    fprintf(PS.fp, "%.4f %.4f %.4f %.4f %.4f %s\n",
39 		    s * elem->coor.arc.x,
40 		    s * elem->coor.arc.y,
41 		    s * elem->coor.arc.r,
42 		    elem->coor.arc.a1, elem->coor.arc.a2, mvcmd);
43 	    break;
44 	}
45     }
46 
47     return 0;
48 }
49 
50 int
symbol_draw(char * name,double x,double y,double size,double rotate,double width)51 symbol_draw(char *name, double x, double y, double size, double rotate,
52 	    double width)
53 {
54     fprintf(PS.fp, "gsave\n");
55     fprintf(PS.fp, "%.5f %.5f translate\n", x, y);
56     fprintf(PS.fp, "%.5f %.5f scale\n", size, size);
57     fprintf(PS.fp, "%.5f rotate\n", rotate);
58     fprintf(PS.fp, "%.8f W\n", width / size);
59     fprintf(PS.fp, "%s\n", name);
60     fprintf(PS.fp, "grestore\n");
61 
62     return 0;
63 }
64 
65 /* store symbol in PS file, scaled to final size and drawn with final colors */
symbol_save(SYMBOL * Symb,PSCOLOR * color,PSCOLOR * fcolor,char * name)66 int symbol_save(SYMBOL * Symb, PSCOLOR * color, PSCOLOR * fcolor, char *name)
67 {
68     SYMBPART *part;
69     SYMBCHAIN *chain;
70     int points;
71     int i, j;
72     double s, xo[4], yo[4];
73 
74     points = 4;
75     xo[0] = 0.0;
76     yo[0] = 0.5;
77     xo[1] = -0.5;
78     yo[1] = 0.0;
79     xo[2] = 0.0;
80     yo[2] = -0.5;
81     xo[3] = 0.5;
82     yo[3] = 0.0;
83 
84     s = 1;
85 
86     fprintf(PS.fp, "\n/%s {\n", name);
87     if (Symb != NULL) {
88 	s *= Symb->scale;
89 	for (i = 0; i < Symb->count; i++) {
90 	    part = Symb->part[i];
91 	    switch (part->type) {
92 	    case S_POLYGON:
93 		fprintf(PS.fp, "NP\n");	/* Start ring */
94 		for (j = 0; j < part->count; j++) {	/* RINGS */
95 		    chain = part->chain[j];
96 		    draw_chain(chain, s);
97 		    fprintf(PS.fp, "CP\n");	/* Close one ring */
98 		}
99 		/* Fill */
100 		if (part->fcolor.color == S_COL_DEFAULT &&
101 		    !color_none(fcolor)) {
102 		    set_ps_color(fcolor);
103 		    fprintf(PS.fp, "F\n");	/* Fill polygon */
104 		}
105 		else if (part->fcolor.color == S_COL_DEFINED) {
106 		    fprintf(PS.fp, "%.3f %.3f %.3f C\n", part->fcolor.fr,
107 			    part->fcolor.fg, part->fcolor.fb);
108 		    fprintf(PS.fp, "F\n");
109 		}
110 		/* Outline */
111 		if (part->color.color == S_COL_DEFAULT && !color_none(color)) {
112 		    set_ps_color(color);
113 		    fprintf(PS.fp, "D\n");	/* Draw boundary */
114 		}
115 		else if (part->color.color == S_COL_DEFINED) {
116 		    fprintf(PS.fp, "%.3f %.3f %.3f C\n", part->color.fr,
117 			    part->color.fg, part->color.fb);
118 		    fprintf(PS.fp, "D\n");
119 		}
120 		break;
121 	    case S_STRING:	/* string has 1 chain */
122 		if (part->color.color != S_COL_NONE) {
123 		    fprintf(PS.fp, "NP\n");
124 		    chain = part->chain[0];
125 		    draw_chain(chain, s);
126 		    /* Color */
127 		    if (part->color.color == S_COL_DEFAULT &&
128 			!color_none(color)) {
129 			set_ps_color(color);
130 			fprintf(PS.fp, "D\n");
131 		    }
132 		    else {
133 			fprintf(PS.fp, "%.3f %.3f %.3f C\n", part->color.fr,
134 				part->color.fg, part->color.fb);
135 			fprintf(PS.fp, "D\n");
136 		    }
137 		}
138 		break;
139 	    }
140 	}
141     }
142     else {
143 	fprintf(PS.fp, "%.4f %.4f NM\n", s * xo[0], s * yo[0]);
144 	for (j = 1; j < points; j++)
145 	    fprintf(PS.fp, "%.4f %.4f LN\n", s * xo[j], s * yo[j]);
146 	fprintf(PS.fp, "CP\n");
147 
148 	set_ps_color(fcolor);
149 	fprintf(PS.fp, "F\n");
150 	set_ps_color(color);
151 	fprintf(PS.fp, "D\n");
152     }
153     fprintf(PS.fp, "} def\n");
154 
155     return 0;
156 }
157