tioga 1.6 → 1.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. data/Tioga_README +35 -10
  2. data/split/Dvector/dvector.c +264 -22
  3. data/split/Dvector/lib/Dvector_extras.rb +30 -2
  4. data/split/Flate/extconf.rb +1 -1
  5. data/split/Function/function.c +112 -2
  6. data/split/Tioga/figures.c +76 -77
  7. data/split/Tioga/figures.h +375 -490
  8. data/split/Tioga/generic.c +254 -0
  9. data/split/Tioga/generic.h +236 -0
  10. data/split/Tioga/init.c +434 -320
  11. data/split/Tioga/lib/Creating_Paths.rb +11 -1
  12. data/split/Tioga/lib/FigMkr.rb +263 -65
  13. data/split/Tioga/lib/Legends.rb +4 -2
  14. data/split/Tioga/lib/Markers.rb +3 -2
  15. data/split/Tioga/lib/Special_Paths.rb +22 -23
  16. data/split/Tioga/lib/TeX_Text.rb +79 -1
  17. data/split/Tioga/lib/TexPreamble.rb +14 -0
  18. data/split/Tioga/lib/Utils.rb +5 -1
  19. data/split/Tioga/pdfs.h +7 -45
  20. data/split/Tioga/{axes.c → shared/axes.c} +210 -197
  21. data/split/Tioga/{makers.c → shared/makers.c} +442 -211
  22. data/split/Tioga/{pdf_font_dicts.c → shared/pdf_font_dicts.c} +0 -0
  23. data/split/Tioga/shared/pdfcolor.c +628 -0
  24. data/split/Tioga/shared/pdfcoords.c +443 -0
  25. data/split/Tioga/{pdffile.c → shared/pdffile.c} +56 -52
  26. data/split/Tioga/{pdfimage.c → shared/pdfimage.c} +103 -211
  27. data/split/Tioga/shared/pdfpath.c +766 -0
  28. data/split/Tioga/{pdftext.c → shared/pdftext.c} +121 -99
  29. data/split/Tioga/shared/texout.c +524 -0
  30. data/split/Tioga/wrappers.c +489 -0
  31. data/split/Tioga/wrappers.h +259 -0
  32. data/split/extconf.rb +4 -0
  33. data/split/mkmf2.rb +12 -1
  34. data/tests/benchmark_dvector_reads.rb +112 -0
  35. data/tests/tc_Dvector.rb +35 -3
  36. data/tests/tc_Function.rb +32 -0
  37. metadata +65 -52
  38. data/split/Tioga/pdfcolor.c +0 -486
  39. data/split/Tioga/pdfcoords.c +0 -523
  40. data/split/Tioga/pdfpath.c +0 -913
  41. data/split/Tioga/texout.c +0 -380
@@ -1,380 +0,0 @@
1
- /* texout.c */
2
- /*
3
- Copyright (C) 2005 Bill Paxton
4
-
5
- This file is part of Tioga.
6
-
7
- Tioga is free software; you can redistribute it and/or modify
8
- it under the terms of the GNU General Library Public License as published
9
- by the Free Software Foundation; either version 2 of the License, or
10
- (at your option) any later version.
11
-
12
- Tioga is distributed in the hope that it will be useful,
13
- but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
- GNU Library General Public License for more details.
16
-
17
- You should have received a copy of the GNU Library General Public License
18
- along with Tioga; if not, write to the Free Software
19
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
- */
21
-
22
- #include "figures.h"
23
-
24
- #define RADIANS_TO_DEGREES (180.0 / PI)
25
-
26
- static FILE *fp; // for the TeX file
27
-
28
- /* TeX text */
29
-
30
- void c_text_scale_set(FM *p, double scale)
31
- {
32
- double factor = scale / p->default_text_scale;
33
- if (factor <= 0) rb_raise(rb_eArgError, "Sorry: text scaling must be positive");
34
- p->default_text_height_dx *= factor;
35
- p->default_text_height_dy *= factor;
36
- p->default_text_scale = scale;
37
- }
38
-
39
- VALUE FM_rescale_text(VALUE fmkr, VALUE scaling_factor) // updates default text heights too
40
- {
41
- FM *p = Get_FM(fmkr);
42
- scaling_factor = rb_Float(scaling_factor);
43
- c_text_scale_set(p, NUM2DBL(scaling_factor) * p->default_text_scale);
44
- return fmkr;
45
- }
46
-
47
- int String_Is_Blank(char *str) {
48
- char c;
49
- if (str == NULL) return 1;
50
- while (1) {
51
- c = *str++;
52
- if (c == '\0') return 1;
53
- if (!isspace(c)) break;
54
- }
55
- return 0;
56
- }
57
-
58
- void tex_show_rotated_text(FM *p, char *text, double x, double y, double scale, double angle, int justification, int alignment)
59
- { // x and y are the device coords for the reference point of the text
60
- char ref, jst;
61
- double ft_ht, sz;
62
- if (String_Is_Blank(text)) return; /* blank strings break TeX! */
63
- scale *= p->default_text_scale;
64
- ft_ht = scale * p->default_font_size;
65
- sz = ft_ht * ENLARGE;
66
- ref = (alignment == ALIGNED_AT_BASELINE)? 'B' :
67
- (alignment == ALIGNED_AT_BOTTOM)? 'b' :
68
- (alignment == ALIGNED_AT_TOP)? 't' : 'c';
69
- if (justification == 0) jst = 'c';
70
- else if (justification > 0) jst = 'r';
71
- else jst = 'l';
72
- bbox_llx = MIN(bbox_llx, x - sz);
73
- bbox_lly = MIN(bbox_lly, y - sz);
74
- bbox_urx = MAX(bbox_urx, x + sz);
75
- bbox_ury = MAX(bbox_ury, y + sz);
76
- if (angle != 0.0)
77
- fprintf(fp,"\\put(%d,%d){\\rotatebox{%.1f}{\\scalebox{%.2f}{\\makebox(0,0)[%c%c]{\\tiogasetfont",
78
- ROUND(x), ROUND(y), angle, scale, jst, ref);
79
- else
80
- fprintf(fp,"\\put(%d,%d){\\scalebox{%.2f}{\\makebox(0,0)[%c%c]{\\tiogasetfont",
81
- ROUND(x), ROUND(y), scale, jst, ref);
82
- fprintf(fp, (alignment == ALIGNED_AT_BASELINE)? "{%s\\BS" : "{%s", text);
83
- fprintf(fp, angle != 0? "}}}}}\n" : "}}}}\n");
84
- }
85
-
86
- static void Convert_Frame_Text_Position_To_Output_Location(FM *p, int frame_side, double offset,
87
- double fraction, double *xp, double *yp, double *base_angle, char *text)
88
- {
89
- double page_x, page_y;
90
- switch (frame_side) {
91
- case LEFT:
92
- page_x = p->page_width * p->frame_left - offset;
93
- page_y = p->page_height * (p->frame_bottom + fraction * p->frame_height);
94
- *base_angle = 90;
95
- break;
96
- case RIGHT:
97
- page_x = p->page_width * p->frame_right + offset;
98
- page_y = p->page_height * (p->frame_bottom + fraction * p->frame_height);
99
- *base_angle = 90;
100
- break;
101
- case AT_X_ORIGIN:
102
- if (0.0 > p->bounds_xmax || 0.0 < p->bounds_xmin)
103
- rb_raise(rb_eArgError, "Sorry: x origin is not part of plot for (%s)", text);
104
- page_x = convert_figure_to_output_x(p, 0.0);
105
- if (p->xaxis_reversed) offset = -offset;
106
- page_x += offset;
107
- page_y = p->page_height * (p->frame_bottom + fraction * p->frame_height);
108
- *base_angle = 90;
109
- break;
110
- case TOP:
111
- page_y = p->page_height * p->frame_top + offset;
112
- page_x = p->page_width * (p->frame_left + fraction * p->frame_width);
113
- *base_angle = 0;
114
- break;
115
- case BOTTOM:
116
- page_y = p->page_height * p->frame_bottom - offset;
117
- page_x = p->page_width * (p->frame_left + fraction * p->frame_width);
118
- *base_angle = 0;
119
- break;
120
- case AT_Y_ORIGIN:
121
- if (0.0 > p->bounds_ymax || 0.0 < p->bounds_ymin)
122
- rb_raise(rb_eArgError, "Sorry: y origin is not part of plot for (%s)", text);
123
- page_y = convert_figure_to_output_y(p, 0.0);
124
- if (p->yaxis_reversed) offset = -offset;
125
- page_y += offset;
126
- page_x = p->page_width * (p->frame_left + fraction * p->frame_width);
127
- *base_angle = 0;
128
- break;
129
- default: rb_raise(rb_eArgError, "Sorry: invalid parameter for frame side in show text (%s)", text);
130
- }
131
- *xp = p->page_left + page_x; *yp = p->page_bottom + page_y;
132
- }
133
-
134
- void c_show_rotated_text(FM *p, char *text, int frame_side, double shift, double fraction,
135
- double scale, double angle, int justification, int alignment)
136
- {
137
- double x, y, base_angle, ft_ht = p->default_text_scale * scale * p->default_font_size;
138
- Convert_Frame_Text_Position_To_Output_Location(p, frame_side, shift*ft_ht*ENLARGE, fraction, &x, &y, &base_angle, text);
139
- tex_show_rotated_text(p, text, x, y, scale, angle + base_angle, justification, alignment);
140
- }
141
-
142
- VALUE FM_show_rotated_text(VALUE fmkr, VALUE text, VALUE frame_side, VALUE shift,
143
- VALUE fraction, VALUE scale, VALUE angle, VALUE justification, VALUE alignment)
144
- {
145
- FM *p = Get_FM(fmkr);
146
- text = rb_String(text);
147
- frame_side = rb_Integer(frame_side);
148
- shift = rb_Float(shift);
149
- fraction = rb_Float(fraction);
150
- scale = rb_Float(scale);
151
- angle = rb_Float(angle);
152
- justification = rb_Integer(justification);
153
- alignment = rb_Integer(alignment);
154
- c_show_rotated_text(p, RSTRING_PTR(text), NUM2INT(frame_side), NUM2DBL(shift),
155
- NUM2DBL(fraction), NUM2DBL(scale), NUM2DBL(angle), NUM2INT(justification), NUM2INT(alignment));
156
- return fmkr;
157
- }
158
-
159
- void c_show_rotated_label(FM *p, char *text,
160
- double xloc, double yloc, double scale, double angle, int justification, int alignment)
161
- {
162
- tex_show_rotated_text(p, text, convert_figure_to_output_x(p, xloc), convert_figure_to_output_y(p, yloc),
163
- scale, angle, justification, alignment);
164
- }
165
-
166
- VALUE FM_show_rotated_label(VALUE fmkr, VALUE text,
167
- VALUE xloc, VALUE yloc, VALUE scale, VALUE angle, VALUE justification, VALUE alignment)
168
- {
169
- FM *p = Get_FM(fmkr);
170
- text = rb_String(text);
171
- xloc = rb_Float(xloc);
172
- yloc = rb_Float(yloc);
173
- scale = rb_Float(scale);
174
- angle = rb_Float(angle);
175
- justification = rb_Integer(justification);
176
- alignment = rb_Integer(alignment);
177
- c_show_rotated_label(p, RSTRING_PTR(text), NUM2DBL(xloc), NUM2DBL(yloc),
178
- NUM2DBL(scale), NUM2DBL(angle), NUM2INT(justification), NUM2INT(alignment));
179
- return fmkr;
180
- }
181
-
182
- VALUE FM_check_label_clip(VALUE fmkr, VALUE xloc, VALUE yloc)
183
- {
184
- FM *p = Get_FM(fmkr);
185
- xloc = rb_Float(xloc);
186
- yloc = rb_Float(yloc);
187
- double x = NUM2DBL(xloc), y = NUM2DBL(yloc);
188
- x = convert_figure_to_frame_x(p,x);
189
- y = convert_figure_to_frame_y(p,y);
190
- if (x < p->label_left_margin || y < p->label_bottom_margin ||
191
- 1.0 - x < p->label_right_margin || 1.0 - y < p->label_top_margin) return Qfalse;
192
- return Qtrue;
193
- }
194
-
195
- /* TeX File Management */
196
-
197
- static long cur_pos;
198
-
199
- static void Get_tex_name(char *ofile, char *filename, int maxlen)
200
- {
201
- char *dot;
202
- strncpy(ofile, filename, maxlen);
203
- dot = strrchr(ofile,'.');
204
- if (dot != NULL) dot[0] = '\0';
205
- strcat(ofile, "_figure.txt");
206
- }
207
-
208
- void Open_tex(VALUE fmkr, char *filename, bool quiet_mode)
209
- {
210
- char ofile[300];
211
- Get_tex_name(ofile, filename, 300);
212
- fp = fopen(ofile, "w");
213
- fprintf(fp,"\\setlength{\\unitlength}{%fbp}%%\n", 1.0/ENLARGE);
214
- cur_pos = ftell(fp);
215
- fprintf(fp,"\\begin{picture}(xxxxxx,xxxxxx) %% (width,height)(xoffset,yoffset) -- Adjust the 2nd pair for registration adjustments\n"); /* this line is rewritten at the end */
216
- fprintf(fp,"\\def\\BS{\\phantom{\\Huge\\scalebox{0}[2]{\\hbox{\\rotatebox{180}{O}O}}}}\n");
217
- // graphicx seems to vertically align baseline (B) like center (c),
218
- // so we add BS (Big Strut) to make them look the same
219
- fmkr = Qnil; // unused
220
- }
221
-
222
- void Close_tex(VALUE fmkr, bool quiet_mode)
223
- {
224
- double x, y, xoff, yoff;
225
- x = bbox_urx - bbox_llx; if (x < 0) x = bbox_urx = bbox_llx = 0;
226
- y = bbox_ury - bbox_lly; if (y < 0) y = bbox_ury = bbox_lly = 0;
227
- xoff = bbox_llx + Get_tex_xoffset(fmkr)*ENLARGE;
228
- yoff = bbox_lly + Get_tex_yoffset(fmkr)*ENLARGE;
229
- fprintf(fp,"\\end{picture}");
230
- fseek(fp, cur_pos, SEEK_SET);
231
- fprintf(fp,"\\begin{picture}(%03d,%03d)(%02d,%d)", ROUND(x), ROUND(y), ROUND(xoff), ROUND(yoff));
232
- fclose(fp);
233
- }
234
-
235
-
236
- void Write_preview_header(VALUE fmkr, FILE *file) {
237
- VALUE tmp;
238
- fprintf(file, "\\documentclass{%s}\n\n", Get_tex_preview_documentclass(fmkr));
239
- /* we print out the preamble generated from tioga.sty.in */
240
- fprintf(file, "%% Tioga preamble generated from tioga.sty.in\n");
241
- fprintf(file, "%s\n", Get_tex_preview_generated_preamble(fmkr));
242
- fprintf(file, "%% User-specified preamble\n");
243
- fprintf(file, "%s\n\n", Get_tex_preamble(fmkr));
244
- fprintf(file, "%% Command to format numeric labels on xaxis\n");
245
- fprintf(file, "\\newcommand{\\tiogaxaxisnumericlabel}[1]{%s}\n\n", Get_xaxis_numeric_label_tex(fmkr));
246
- fprintf(file, "%% Command to format numeric labels on yaxis\n");
247
- fprintf(file, "\\newcommand{\\tiogayaxisnumericlabel}[1]{%s}\n\n", Get_yaxis_numeric_label_tex(fmkr));
248
- fprintf(file, "%% Color constants definitions\n");
249
- tmp = rb_const_get(CLASS_OF(fmkr), rb_intern("COLOR_PREAMBLE"));
250
- fprintf(file, "%s\n\n", StringValueCStr(tmp));
251
- fprintf(file, "%% Set page margins, page size and orientation.\n");
252
- fprintf(file, "\t\\usepackage[pdftex,tmargin=0pt,lmargin=0pt,"
253
- "rmargin=0pt,bmargin=0pt,\n");
254
- fprintf(file, "\tpaperwidth=%s,paperheight=%s,\n",
255
- Get_tex_preview_paper_width(fmkr),
256
- Get_tex_preview_paper_height(fmkr));
257
- fprintf(file, "\thoffset=%s,voffset=%s\n",
258
- Get_tex_preview_hoffset(fmkr),
259
- Get_tex_preview_voffset(fmkr));
260
- fprintf(file, "\t]{geometry}\n");
261
-
262
- fprintf(file, "\n%% We need the graphicx package and the calc package.\n");
263
- fprintf(file, "\t\\usepackage{graphicx}\n");
264
- fprintf(file, "\t\\usepackage{calc}\n\n");
265
- fprintf(file, "\t%% This is necessary to avoid getting the picture on the second page\n");
266
- fprintf(file, "\t\\topskip=0pt\n\n");
267
-
268
- /* now, the commands to customize the font used */
269
- fprintf(file, "\\settiogafontsize[10pt]{%s}\n", Get_tex_fontsize(fmkr));
270
- fprintf(file, "\\settiogafontfamily{\\%s}\n", Get_tex_fontfamily(fmkr));
271
- fprintf(file, "\\settiogafontseries{\\%s}\n", Get_tex_fontseries(fmkr));
272
- fprintf(file, "\\settiogafontshape{\\%s}\n", Get_tex_fontshape(fmkr));
273
- }
274
-
275
-
276
- void Write_figure_command(VALUE fmkr, char *simple_name, FILE *file) {
277
- char *minwhitespace;
278
-
279
- if (Get_tex_preview_fullpage(fmkr)) {
280
- minwhitespace = Get_tex_preview_minwhitespace(fmkr);
281
- if (minwhitespace == NULL) {
282
- fprintf(file, "\\tiogafigurefullpage{%s}\n", simple_name);
283
- } else {
284
- fprintf(file, "\\tiogafigurefullpage[%s]{%s}\n", minwhitespace, simple_name);
285
- }
286
- } else {
287
- const char * command = Get_tex_preview_tiogafigure_command(fmkr);
288
- if(strcmp(command, "tiogafigureshow")) {
289
- fprintf(file, "\\%s{%s}{%s}{%s}\n", Get_tex_preview_tiogafigure_command(fmkr), simple_name,
290
- Get_tex_preview_figure_width(fmkr), Get_tex_preview_figure_height(fmkr));
291
- } else { /* no need for extra arguments for tiogafigureshow */
292
- fprintf(file, "\\%s{%s}\n", Get_tex_preview_tiogafigure_command(fmkr), simple_name);
293
- }
294
- }
295
- }
296
-
297
-
298
- void Create_wrapper(VALUE fmkr, char *fname, bool quiet_mode)
299
- { // create the wrapper TeX file to combine the text and graphics to make a figure
300
- char *dot;
301
- char tex_fname[100], base_name[100], simple_name[100];
302
- FILE *file;
303
- if ((dot=strrchr(fname,'.')) != NULL) {
304
- strncpy(base_name, fname, dot-fname); base_name[dot-fname] = '\0';
305
- sprintf(tex_fname, "%s.tex", base_name);
306
- }
307
- else {
308
- strcpy(base_name, fname);
309
- sprintf(tex_fname, "%s.tex", fname);
310
- }
311
- if ((dot=strrchr(base_name,'/')) != NULL) {
312
- strcpy(simple_name, dot+1);
313
- }
314
- else {
315
- strcpy(simple_name, base_name);
316
- }
317
- file = fopen(tex_fname, "w");
318
- fprintf(file, "%% Tioga preview LaTeX file for %s_figure.pdf and %s_figure.txt\n\n", base_name, base_name);
319
-
320
- Write_preview_header(fmkr, file);
321
-
322
- fprintf(file, "\n%% Here's the page with the figure.\n");
323
- fprintf(file, "\\begin{document}\n");
324
- fprintf(file, "\\pagestyle{%s}\n", Get_tex_preview_pagestyle(fmkr));
325
- /* necessary to get the position right */
326
- fprintf(file, "\\noindent");
327
- Write_figure_command(fmkr, simple_name, file);
328
- fprintf(file, "\\end{document}\n");
329
- fclose(file);
330
- }
331
-
332
- void Init_tex(void)
333
- {
334
- }
335
-
336
- void Rename_tex(char *oldname, char *newname)
337
- {
338
- char old_ofile[300], new_ofile[300];
339
- Get_tex_name(old_ofile, oldname, 300);
340
- Get_tex_name(new_ofile, newname, 300);
341
- rename(old_ofile, new_ofile); // from stdio.h
342
- }
343
-
344
- void private_make_portfolio(char *name, VALUE fignums, VALUE fignames)
345
- {
346
- FILE *file;
347
- int i, len, numfigs, j;
348
- char tex_fname[256];
349
- sprintf(tex_fname, "%s.tex", name);
350
- file = fopen(tex_fname, "w");
351
- if (file == NULL)
352
- rb_raise(rb_eArgError, "Sorry: can't open %s.\n", tex_fname);
353
- fprintf(file, "%% Tioga Portfolio %s\n\n", name);
354
- fprintf(file, "\\documentclass{article}\n");
355
- fprintf(file, "\\usepackage{pdfpages}\n");
356
- fprintf(file, "\\begin{document}\n");
357
- fprintf(file, "%% Start of figures, one per page\n\n");
358
- fignames = rb_Array(fignames);
359
- len = RARRAY(fignames)->len;
360
- if (fignums == Qnil) {
361
- for (i=0; i < len; i++) {
362
- fprintf(file, "\\includepdf{%s.pdf}\n", Get_String(fignames, i));
363
- }
364
- } else {
365
- fignums = rb_Array(fignums);
366
- numfigs = RARRAY(fignums)->len;
367
- for (i=0; i < numfigs; i++) {
368
- j = NUM2INT(RARRAY(fignums)->ptr[i]);
369
- if (j >= 0 && j < len) fprintf(file, "\\includepdf{%s.pdf}\n", Get_String(fignames, j));
370
- else {
371
- fclose(file);
372
- rb_raise(rb_eArgError, "Requested figure numbers must be >= 0 and < num_figures.");
373
- }
374
- }
375
- }
376
- fprintf(file, "\n\\end{document}\n");
377
- fclose(file);
378
- }
379
-
380
-