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