source: trunk/Jgraph/printline.c@ 670

Last change on this file since 670 was 420, checked in by Nicholas Riley, 17 years ago

Jgraph: my changes - ANSIfication, few minor bug fixes; works on OS X 10.5 now

File size: 7.3 KB
Line 
1/*
2 * $Source: /tmp_mnt/n/fs/grad1/jsp/src/jgraph/RCS/printline.c,v $
3 * $Revision: 8.3 $
4 * $Date: 92/11/30 11:42:31 $
5 * $Author: jsp $
6 */
7
8#include "jgraph.h"
9#include <stdio.h>
10#include <assert.h> //by pzn@debian.org
11#include <string.h>
12
13#define LINEWIDTHFACTOR 0.700
14#define MAX(a, b) ((a > b) ? (a) : (b))
15
16typedef struct fontlist {
17 struct fontlist *flink;
18 struct fontlist *blink;
19 int level;
20 float s;
21 char *f;
22} *Fontlist;
23
24static Fontlist Jgraph_fonts;
25static int Jgraph_gsave_level = -100;
26static int Jgraph_comment;
27
28void gsave(void)
29{
30 if (Jgraph_gsave_level == -100) {
31 Jgraph_gsave_level = 0;
32 Jgraph_fonts = (Fontlist) make_list(sizeof(struct fontlist));
33 }
34 Jgraph_gsave_level++;
35 printf(" gsave ");
36}
37
38void grestore(void)
39{
40 Fontlist l;
41
42 if (last(Jgraph_fonts) != nil(Jgraph_fonts)) {
43 l = last(Jgraph_fonts);
44 if (l->level == Jgraph_gsave_level) {
45 delete_item(l);
46 free_node(l, Jgraph_fonts);
47 }
48 }
49 Jgraph_gsave_level--;
50 printf(" grestore ");
51}
52
53void setfont(char *f, float s)
54{
55 Fontlist l;
56 int ins;
57
58 if (last(Jgraph_fonts) != nil(Jgraph_fonts)) {
59 l = last(Jgraph_fonts);
60 ins = (strcmp(l->f, f) != 0 || s != l->s);
61 if (ins) {
62 delete_item(l);
63 free_node(l, Jgraph_fonts);
64 }
65 } else {
66 ins = 1;
67 }
68 if (ins) {
69 l = (Fontlist) get_node(Jgraph_fonts);
70 l->level = Jgraph_gsave_level;
71 l->s = s;
72 l->f = f;
73 insert(l, Jgraph_fonts);
74 printf("/%s findfont %f scalefont setfont\n", f, s);
75 }
76}
77
78void setfill(float x, float y, char t, float f[], char p, float a)
79{
80/* fprintf(stderr, "Hello? %c %f %c %f\n", t, f[0], p, a); */
81 if (t == 'g' && f[0] < 0.0) return;
82 printf("gsave ");
83
84 if ( t == 'g' ) {
85 if( f[0] >= 0.0 ) printf("%f setgray ", f[0] );
86 } else if ( t == 'c' ) {
87 printf("%f %f %f setrgbcolor ", f[0], f[1], f[2] );
88 }
89
90 if (p == 's') {
91 printf(" fill");
92 } else if (p == '/') {
93 printf(" 6.1 10 %f %f %f 1 JSTR", a, x, y);
94 } else if (p == 'e') {
95 printf(" 6.1 10 %f %f %f 0 JSTR", a, x, y);
96 }
97 printf(" grestore\n");
98}
99
100void setgray(char t, float f[])
101{
102 if ( t == 'g' ) {
103 if( f[0] >= 0.0 ) printf("%f setgray\n", f[0] );
104 } else if ( t == 'c' ) {
105 printf("%f %f %f setrgbcolor\n", f[0], f[1], f[2] );
106 }
107}
108
109void printline(float x1, float y1, float x2, float y2, char orientation)
110{
111 if (orientation == 'x')
112 printf("newpath %f %f moveto %f %f lineto stroke\n", x1, y1, x2, y2);
113 else
114 printf("newpath %f %f moveto %f %f lineto stroke\n", y1, x1, y2, x2);
115 fflush(stdout);
116}
117
118void print_ebar(float x1, float y1, float x2, float ms, char orientation)
119{
120 printline(x1, y1, x2, y1, orientation);
121 printline(x2, y1-ms, x2, y1+ms, orientation);
122}
123
124void start_line(float x1, float y1, Curve c)
125{
126 setlinewidth(c->linethick);
127 setlinestyle(c->linetype, c->gen_linetype);
128 printf("%f %f moveto ", x1, y1);
129}
130
131void cont_line(float x1, float y1)
132{
133 printf(" %f %f lineto\n", x1, y1);
134}
135
136void end_line(void)
137{
138 printf("stroke\n");
139 setlinewidth(1.0);
140 setlinestyle('s', (Flist) 0);
141 fflush(stdout);
142
143}
144
145void bezier_control(float x1, float y1)
146{
147 printf(" %f %f ", x1, y1);
148}
149
150void bezier_end(float x1, float y1)
151{
152 printf(" %f %f curveto\n", x1, y1);
153}
154
155
156void start_poly(float x1, float y1)
157{
158 printf(" newpath %f %f moveto", x1, y1);
159}
160
161void cont_poly(float x1, float y1)
162{
163 printf(" %f %f lineto\n", x1, y1);
164}
165
166void end_poly(float x, float y, char ftype, float fill[],
167 char pattern, float parg)
168{
169 printf("closepath ");
170 setfill( x, y, ftype, fill, pattern, parg );
171 printf("stroke\n");
172 fflush(stdout);
173}
174
175/* Ellipse at 0, 0 -- assumes that you've already translated to x, y */
176
177void printellipse(float x, float y, float radius1, float radius2,
178 char ftype, float fill[], char pattern, float parg)
179{
180 printf("newpath %f %f JDE\n", radius1, radius2);
181 setfill( x, y, ftype, fill, pattern, parg );
182 printf("stroke\n");
183 fflush(stdout);
184}
185
186void set_comment(int c)
187{
188 Jgraph_comment = c;
189}
190
191void comment(char *s)
192{
193 if (Jgraph_comment) printf("%% %s\n", s);
194}
195
196void printline_c(float x1, float y1, float x2, float y2, Graph g)
197{
198 printline(ctop(x1, g->x_axis), ctop(y1, g->y_axis),
199 ctop(x2, g->x_axis), ctop(y2, g->y_axis), 'x');
200}
201
202void print_label(Label l)
203{
204 int f, i, nlines;
205 float fnl;
206 char *s;
207 char *s_7bit; // added by pzn@debian.org
208
209 if (l->label == CNULL) return;
210
211 nlines = 0;
212 for (i = 0; l->label[i] != '\0'; i++) {
213 if (l->label[i] == '\n') {
214 l->label[i] = '\0';
215 nlines++;
216 }
217 }
218 fnl = (float) nlines;
219
220 setfont(l->font, l->fontsize);
221 printf("gsave %f %f translate %f rotate\n", l->x, l->y, l->rotate);
222 if (l->graytype == 'g') {
223 printf(" %f setgray\n", l->gray[0]);
224 } else if (l->graytype == 'c') {
225 printf(" %f %f %f setrgbcolor\n", l->gray[0], l->gray[1],
226 l->gray[2]);
227 }
228
229 if (l->vj == 'b') {
230 printf("0 %f translate ", fnl * (l->fontsize + l->linesep) * FCPI / FPPI);
231 } else if (l->vj == 'c') {
232 if (nlines % 2 == 0) {
233 printf("0 %f translate ",
234 (fnl/2.0*(l->fontsize + l->linesep) - l->fontsize/2.0)
235 * FCPI / FPPI);
236 } else {
237 printf("0 %f translate ",
238 ((fnl-1.0)/2.0*(l->fontsize + l->linesep) + l->linesep/2.0)
239 * FCPI / FPPI);
240 }
241 } else {
242 printf("0 %f translate ", -l->fontsize * FCPI / FPPI);
243 }
244
245 s = l->label;
246
247 for (i = 0; i <= nlines; i++) {
248 // BEGIN added by pzn@debian.org
249 // converts 8bit ascii chars to octal value;
250 // 7bit are not converted
251 {
252 int i, j=0, len;
253 len=strlen(s);
254 s_7bit=malloc(len*4+1);
255 assert(s_7bit!=NULL);
256 for (i=0; i<=len; i++) {
257 if((unsigned char)s[i]<128) {
258 //char is ascii 7bit
259 s_7bit[j]=s[i];
260 j++;
261 } else {
262 //char must be converted to octal
263 sprintf(s_7bit+j,"\\%03o",(unsigned char)s[i]);
264 j+=4;
265 }
266 }
267 s_7bit[j-1]=0;
268 }
269 //printf("(%s) dup stringwidth pop ", s); //disabled by pzn
270 printf("(%s) dup stringwidth pop ", s_7bit); free(s_7bit);
271 // END added by pzn
272 if (l->hj == 'c') {
273 printf("2 div neg 0 moveto\n");
274 } else if (l->hj == 'r') {
275 printf("neg 0 moveto\n");
276 } else {
277 printf("pop 0 0 moveto\n");
278 }
279 /* I would put string blanking in here if I had the time... */
280
281 if (i != nlines) {
282 f = strlen(s);
283 s[f] = '\n';
284 s = &(s[f+1]);
285 printf("show 0 %f translate\n",
286 - (l->fontsize + l->linesep) * FCPI / FPPI);
287 } else {
288 printf("show\n");
289 }
290 }
291 printf("grestore\n");
292}
293
294void setlinewidth(float size)
295{
296 printf("%f setlinewidth ", size * LINEWIDTHFACTOR);
297}
298
299void setlinestyle(char style, Flist glist)
300{
301 Flist fl;
302
303 switch(style) {
304 case '0': printf(" [0 2] setdash\n"); break;
305 case 's': printf(" [] 0 setdash\n"); break;
306 case '.': printf(" [1 3.200000] 0 setdash\n"); break;
307 case '-': printf(" [4.00000] 0 setdash\n"); break;
308 case 'l': printf(" [7 2] 0 setdash\n"); break;
309 case 'd': printf(" [5 3 1 3] 0 setdash\n"); break;
310 case 'D': printf(" [5 3 1 2 1 3] 0 setdash\n"); break;
311 case '2': printf(" [5 3 5 3 1 2 1 3] 0 setdash\n"); break;
312 case 'g':
313 printf(" [");
314 for (fl = first(glist); fl != nil(glist); fl = next(fl))
315 printf("%f ", fl->f);
316 printf("] 0 setdash\n");
317 break;
318 default: fprintf(stderr, "Error: Unknown line type: %c\n", style);
319 exit(1);
320 break;
321 }
322}
323
Note: See TracBrowser for help on using the repository browser.