File: symbol.c

package info (click to toggle)
grass 6.0.2-6
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 40,044 kB
  • ctags: 31,303
  • sloc: ansic: 321,125; tcl: 25,676; sh: 11,176; cpp: 10,098; makefile: 5,025; fortran: 1,846; yacc: 493; lex: 462; perl: 133; sed: 1
file content (145 lines) | stat: -rw-r--r-- 3,854 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/* Functions: symbol_save, symbol_draw 
**
** Author: Radim Blazek
*/

#include "Vect.h"
#include "symbol.h"
#include "clr.h"
#include "ps_info.h"
#include "local_proto.h"
#include "vector.h"

/* draw chain */
int 
draw_chain ( SYMBCHAIN *chain, double s ) 
{ 
    int k, l;
    char *mvcmd;
    SYMBEL *elem;

    for ( k = 0; k < chain->count; k++ ) {
	elem = chain->elem[k];
	switch ( elem->type ) {
	    case S_LINE:
		for (l = 0; l < elem->coor.line.count; l++) {
		    if ( k == 0 && l == 0 ) mvcmd = "M";
		    else mvcmd = "LN";
		    fprintf(PS.fp, "%.4f %.4f %s\n", 
			s * elem->coor.line.x[l],
			s * elem->coor.line.y[l],
			mvcmd);
		}
		break;
	    case S_ARC:
		if ( elem->coor.arc.clock ) mvcmd = "arcn"; 
		else mvcmd = "arc";
		fprintf(PS.fp, "%.4f %.4f %.4f %.4f %.4f %s\n", 
			s * elem->coor.arc.x,
			s * elem->coor.arc.y,
			s * elem->coor.arc.r,
			elem->coor.arc.a1, elem->coor.arc.a2,
			mvcmd );
		break;
	}
    }

    return 0;
}

int 
symbol_draw ( char *name, double x, double y, double size, double rotate, double width ) 
{
    fprintf( PS.fp, "gsave\n");
    fprintf( PS.fp, "%.5f %.5f translate\n", x, y);
    fprintf( PS.fp, "%.5f %.5f scale\n", size, size);
    fprintf(PS.fp, "%.5f rotate\n", rotate);
    fprintf(PS.fp, "%.8f W\n", width / size );
    fprintf(PS.fp, "%s\n", name);
    fprintf( PS.fp, "grestore\n");

    return 0;
}

/* store symbol in PS file, scaled to final size and drawn with final colors */
int 
symbol_save ( SYMBOL *Symb, double size, PSCOLOR *color, PSCOLOR *fcolor,
              char *name  ) 
{
    SYMBPART *part; 
    SYMBCHAIN *chain;
    int points;
    int i, j;
    double s, xo[4], yo[4];

    points = 4;
    xo[0] =  0.0;  yo[0] =  0.5; xo[1] = -0.5;  yo[1] =  0.0;
    xo[2] =  0.0;  yo[2] = -0.5; xo[3] =  0.5;  yo[3] =  0.0;

    s = 1;

    fprintf(PS.fp, "\n/%s {\n", name);
    if ( Symb != NULL ) {
        s *= Symb->scale;
	for ( i = 0; i < Symb->count; i++ ) { 
	    part = Symb->part[i];
	    switch ( part->type ) {
		case S_POLYGON: 
		    fprintf(PS.fp, "NP\n"); /* Start ring */
		    for ( j = 0; j < part->count; j++ ) { /* RINGS */
			chain = part->chain[j];
                        draw_chain ( chain, s );
			fprintf(PS.fp, "CP\n"); /* Close one ring */
		    }
		    /* Fill */
		    if ( part->fcolor.color == S_COL_DEFAULT && !color_none(fcolor) ) {
			    set_ps_color( fcolor );
			    fprintf(PS.fp, "F\n"); /* Fill polygon */
		    } else if ( part->fcolor.color == S_COL_DEFINED ) {
			    fprintf(PS.fp, "%.2f %.2f %.2f C\n", part->fcolor.fr,
					      part->fcolor.fg, part->fcolor.fb);
			    fprintf(PS.fp, "F\n");
		    }
		    /* Outline */
		    if ( part->color.color == S_COL_DEFAULT && !color_none(color) ) {
			set_ps_color( color );
			fprintf(PS.fp, "D\n"); /* Draw boundary */
		    } else if ( part->color.color == S_COL_DEFINED ) { 
		        fprintf(PS.fp, "%.2f %.2f %.2f C\n", part->color.fr,
					      part->color.fg, part->color.fb);
			fprintf(PS.fp, "D\n");
		    }
		    break;
		case S_STRING: /* string has 1 chain */
		    if ( part->color.color != S_COL_NONE ) {
			fprintf(PS.fp, "NP\n"); 
			chain = part->chain[0];
			draw_chain ( chain, s );
			/* Color */
			if ( part->color.color == S_COL_DEFAULT && !color_none(color) ) {
			    set_ps_color( color );
			    fprintf(PS.fp, "D\n");
			} else {
			    fprintf(PS.fp, "%.2f %.2f %.2f C\n", part->color.fr,
					      part->color.fg, part->color.fb);
			    fprintf(PS.fp, "D\n");
			}
		    }
		    break;
	    }
	}
    } else { 
	fprintf(PS.fp, "%.4f %.4f NM\n", s * xo[0], s * yo[0]);
	for (j = 1; j < points; j++) 
	   fprintf(PS.fp, "%.4f %.4f LN\n", s * xo[j], s * yo[j]);
	fprintf(PS.fp, "CP\n");

	set_ps_color( fcolor );
	fprintf(PS.fp, "F\n");
        set_ps_color( color );
	fprintf(PS.fp, "D\n");
    }
    fprintf(PS.fp, "} def\n");

    return 0;
}