tioga 1.6 → 1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -19,58 +19,379 @@
19
19
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
20
  */
21
21
 
22
+ #include "generic.h"
22
23
  #include "figures.h"
23
24
  #include "pdfs.h"
24
25
 
25
- VALUE rb_Integer_class, rb_Numeric_class;
26
- ID save_dir_ID, quiet_mode_ID;
27
- ID tex_preview_documentclass_ID, tex_preamble_ID, xaxis_numeric_label_tex_ID, yaxis_numeric_label_tex_ID, tex_preview_pagestyle_ID;
28
- ID tex_preview_paper_width_ID, tex_preview_paper_height_ID;
29
- ID tex_preview_hoffset_ID, tex_preview_voffset_ID;
30
- ID tex_preview_figure_width_ID, tex_preview_figure_height_ID, tex_preview_tiogafigure_command_ID;
31
- ID tex_preview_fullpage_ID, tex_preview_minwhitespace_ID;
32
- ID do_cmd_ID, make_page_ID, initialized_ID, tex_xoffset_ID, tex_yoffset_ID;
33
- ID tex_fontsize_ID, tex_fontfamily_ID, tex_fontseries_ID, tex_fontshape_ID;
26
+ long trace_cnt; // counter for debugging traces
27
+ long trace_lvl; // set to 0 to turn tracing off. higher values turn on more tracing.
28
+ #define TRACE(fn) if (trace_lvl > 0) printf("%i %s\n",++trace_cnt,fn)
29
+
30
+ static ID_PTR fm_data_ID;
31
+ static ID_PTR save_dir_ID;
32
+ static ID_PTR quiet_mode_ID;
33
+ static ID_PTR tex_preview_documentclass_ID;
34
+ static ID_PTR tex_preamble_ID;
35
+ static ID_PTR xaxis_numeric_label_tex_ID;
36
+ static ID_PTR yaxis_numeric_label_tex_ID;
37
+ static ID_PTR tex_preview_pagestyle_ID;
38
+ static ID_PTR tex_preview_paper_width_ID;
39
+ static ID_PTR tex_preview_paper_height_ID;
40
+ static ID_PTR tex_preview_hoffset_ID;
41
+ static ID_PTR tex_preview_voffset_ID;
42
+ static ID_PTR tex_preview_figure_width_ID;
43
+ static ID_PTR tex_preview_figure_height_ID;
44
+ static ID_PTR tex_preview_tiogafigure_command_ID;
45
+ static ID_PTR tex_preview_fullpage_ID;
46
+ static ID_PTR tex_preview_minwhitespace_ID;
47
+ static ID_PTR do_cmd_ID;
48
+ static ID_PTR make_page_ID;
49
+ static ID_PTR initialized_ID;
50
+ static ID_PTR tex_xoffset_ID;
51
+ static ID_PTR tex_yoffset_ID;
52
+ static ID_PTR tex_fontsize_ID;
53
+ static ID_PTR tex_fontfamily_ID;
54
+ static ID_PTR tex_fontseries_ID;
55
+ static ID_PTR tex_fontshape_ID;
56
+ static ID_PTR line_type_ID;
57
+ static ID_PTR title_ID;
58
+ static ID_PTR xlabel_ID;
59
+ static ID_PTR ylabel_ID;
60
+ static ID_PTR xaxis_locations_for_major_ticks_ID;
61
+ static ID_PTR xaxis_locations_for_minor_ticks_ID;
62
+ static ID_PTR xaxis_tick_labels_ID;
63
+ static ID_PTR yaxis_locations_for_major_ticks_ID;
64
+ static ID_PTR yaxis_locations_for_minor_ticks_ID;
65
+ static ID_PTR yaxis_tick_labels_ID;
66
+ ID_PTR measures_info_ID;
67
+
34
68
 
35
69
  void Init_IDs(void)
36
70
  {
37
-
38
- rb_Numeric_class = rb_define_class("Numeric", rb_cObject);
39
- rb_Integer_class = rb_define_class("Integer", rb_Numeric_class);
40
- do_cmd_ID = rb_intern("do_cmd");
41
- make_page_ID = rb_intern("make_page");
71
+
72
+ Init_generic();
73
+
74
+ do_cmd_ID = ID_Get("do_cmd");
75
+ make_page_ID = ID_Get("make_page");
42
76
  // class variables
43
- initialized_ID = rb_intern("@@initialized");
77
+ initialized_ID = ID_Get("@@initialized");
44
78
  // instance variables
45
- save_dir_ID = rb_intern("@save_dir");
46
- quiet_mode_ID = rb_intern("@quiet_mode");
47
- tex_xoffset_ID = rb_intern("@tex_xoffset");
48
- tex_yoffset_ID = rb_intern("@tex_yoffset");
49
- tex_preview_documentclass_ID = rb_intern("@tex_preview_documentclass");
50
- tex_preamble_ID = rb_intern("@tex_preamble");
51
- xaxis_numeric_label_tex_ID = rb_intern("@xaxis_numeric_label_tex");
52
- yaxis_numeric_label_tex_ID = rb_intern("@yaxis_numeric_label_tex");
53
- tex_preview_pagestyle_ID = rb_intern("@tex_preview_pagestyle");
79
+ fm_data_ID = ID_Get("@fm_data");
80
+ save_dir_ID = ID_Get("@save_dir");
81
+ quiet_mode_ID = ID_Get("@quiet_mode");
82
+ tex_xoffset_ID = ID_Get("@tex_xoffset");
83
+ tex_yoffset_ID = ID_Get("@tex_yoffset");
84
+ tex_preview_documentclass_ID = ID_Get("@tex_preview_documentclass");
85
+ tex_preamble_ID = ID_Get("@tex_preamble");
86
+ xaxis_numeric_label_tex_ID = ID_Get("@xaxis_numeric_label_tex");
87
+ yaxis_numeric_label_tex_ID = ID_Get("@yaxis_numeric_label_tex");
88
+ tex_preview_pagestyle_ID = ID_Get("@tex_preview_pagestyle");
54
89
 
55
- tex_preview_paper_width_ID = rb_intern("@tex_preview_paper_width");
56
- tex_preview_paper_height_ID = rb_intern("@tex_preview_paper_height");
57
- tex_preview_hoffset_ID = rb_intern("@tex_preview_hoffset");
58
- tex_preview_voffset_ID = rb_intern("@tex_preview_voffset");
59
- tex_preview_figure_width_ID = rb_intern("@tex_preview_figure_width");
60
- tex_preview_figure_height_ID = rb_intern("@tex_preview_figure_height");
90
+ tex_preview_paper_width_ID = ID_Get("@tex_preview_paper_width");
91
+ tex_preview_paper_height_ID = ID_Get("@tex_preview_paper_height");
92
+ tex_preview_hoffset_ID = ID_Get("@tex_preview_hoffset");
93
+ tex_preview_voffset_ID = ID_Get("@tex_preview_voffset");
94
+ tex_preview_figure_width_ID = ID_Get("@tex_preview_figure_width");
95
+ tex_preview_figure_height_ID = ID_Get("@tex_preview_figure_height");
61
96
 
62
- tex_preview_fullpage_ID = rb_intern("@tex_preview_fullpage");
63
- tex_preview_minwhitespace_ID = rb_intern("@tex_preview_minwhitespace");
97
+ tex_preview_fullpage_ID = ID_Get("@tex_preview_fullpage");
98
+ tex_preview_minwhitespace_ID = ID_Get("@tex_preview_minwhitespace");
64
99
 
65
- tex_preview_tiogafigure_command_ID = rb_intern("@tex_preview_tiogafigure_command");
100
+ tex_preview_tiogafigure_command_ID = ID_Get("@tex_preview_tiogafigure_command");
66
101
 
67
- tex_fontsize_ID = rb_intern("@tex_fontsize");
68
- tex_fontfamily_ID = rb_intern("@tex_fontfamily");
69
- tex_fontseries_ID = rb_intern("@tex_fontseries");
70
- tex_fontshape_ID = rb_intern("@tex_fontshape");
102
+ tex_fontsize_ID = ID_Get("@tex_fontsize");
103
+ tex_fontfamily_ID = ID_Get("@tex_fontfamily");
104
+ tex_fontseries_ID = ID_Get("@tex_fontseries");
105
+ tex_fontshape_ID = ID_Get("@tex_fontshape");
106
+
107
+ line_type_ID = ID_Get("@line_type");
108
+ xaxis_locations_for_major_ticks_ID = ID_Get("@xaxis_locations_for_major_ticks");
109
+ xaxis_locations_for_minor_ticks_ID = ID_Get("@xaxis_locations_for_minor_ticks");
110
+ xaxis_tick_labels_ID = ID_Get("@xaxis_tick_labels");
111
+ yaxis_locations_for_major_ticks_ID = ID_Get("@yaxis_locations_for_major_ticks");
112
+ yaxis_locations_for_minor_ticks_ID = ID_Get("@yaxis_locations_for_minor_ticks");
113
+ yaxis_tick_labels_ID = ID_Get("@yaxis_tick_labels");
114
+ measures_info_ID = ID_Get("@measures_info");
115
+ }
116
+
117
+ void do_cmd(OBJ_PTR fmkr, OBJ_PTR cmd, int *ierr) {
118
+ Call_Function(fmkr, do_cmd_ID, cmd, ierr); }
119
+
120
+ static void Type_Error(OBJ_PTR obj, ID_PTR name_ID, char *expected, int *ierr)
121
+ {
122
+ char *name = ID_Name(name_ID, ierr);
123
+ if (*ierr != 0) return;
124
+ while (name[0] == '@') name++;
125
+ RAISE_ERROR_ss("Require %s OBJ_PTR for '%s'", expected, name, ierr);
126
+ }
127
+
128
+ bool Get_bool(OBJ_PTR obj, ID_PTR name_ID, int *ierr) {
129
+ OBJ_PTR v = Obj_Attr_Get(obj, name_ID, ierr);
130
+ if (*ierr != 0) return false;
131
+ if (v != OBJ_FALSE && v != OBJ_TRUE && v != OBJ_NIL) {
132
+ Type_Error(v, name_ID, "true or false", ierr);
133
+ return false;
134
+ }
135
+ return v == OBJ_TRUE;
136
+ }
137
+
138
+ int Get_int(OBJ_PTR obj, ID_PTR name_ID, int *ierr) {
139
+ OBJ_PTR v = Obj_Attr_Get(obj, name_ID, ierr);
140
+ if (*ierr != 0) return 0;
141
+ if (!Is_Kind_of_Integer(v)) {
142
+ Type_Error(v, name_ID, "Integer", ierr);
143
+ return 0;
144
+ }
145
+ return Number_to_int(v, ierr);
146
+ }
147
+
148
+ double Get_double(OBJ_PTR obj, ID_PTR name_ID, int *ierr) {
149
+ OBJ_PTR v = Obj_Attr_Get(obj, name_ID, ierr);
150
+ if (*ierr != 0) return 0.0;
151
+ if (!Is_Kind_of_Number(v)) {
152
+ Type_Error(v, name_ID, "Numeric", ierr);
153
+ return 0.0;
154
+ }
155
+ return Number_to_double(v, ierr);
156
+ }
157
+
158
+ char *Get_tex_preview_paper_width(OBJ_PTR fmkr, int *ierr) {
159
+ OBJ_PTR v = Obj_Attr_Get(fmkr, tex_preview_paper_width_ID, ierr);
160
+ if (*ierr != 0) return NULL;
161
+ if (v == OBJ_NIL) return NULL;
162
+ return String_Ptr(v, ierr);
163
+ }
164
+
165
+ char *Get_tex_preview_paper_height(OBJ_PTR fmkr, int *ierr) {
166
+ OBJ_PTR v = Obj_Attr_Get(fmkr, tex_preview_paper_height_ID, ierr);
167
+ if (*ierr != 0) return NULL;
168
+ if (v == OBJ_NIL) return NULL;
169
+ return String_Ptr(v, ierr);
170
+ }
171
+
172
+ char *Get_tex_preview_hoffset(OBJ_PTR fmkr, int *ierr) {
173
+ OBJ_PTR v = Obj_Attr_Get(fmkr, tex_preview_hoffset_ID, ierr);
174
+ if (*ierr != 0) return NULL;
175
+ if (v == OBJ_NIL) return NULL;
176
+ return String_Ptr(v, ierr);
177
+ }
178
+
179
+ char *Get_tex_preview_voffset(OBJ_PTR fmkr, int *ierr) {
180
+ OBJ_PTR v = Obj_Attr_Get(fmkr, tex_preview_voffset_ID, ierr);
181
+ if (*ierr != 0) return NULL;
182
+ if (v == OBJ_NIL) return NULL;
183
+ return String_Ptr(v, ierr);
184
+ }
185
+
186
+ char *Get_tex_preview_figure_width(OBJ_PTR fmkr, int *ierr) {
187
+ OBJ_PTR v = Obj_Attr_Get(fmkr, tex_preview_figure_width_ID, ierr);
188
+ if (*ierr != 0) return NULL;
189
+ if (v == OBJ_NIL) return NULL;
190
+ return String_Ptr(v, ierr);
191
+ }
192
+
193
+ char *Get_tex_preview_figure_height(OBJ_PTR fmkr, int *ierr) {
194
+ OBJ_PTR v = Obj_Attr_Get(fmkr, tex_preview_figure_height_ID, ierr);
195
+ if (*ierr != 0) return NULL;
196
+ if (v == OBJ_NIL) return NULL;
197
+ return String_Ptr(v, ierr);
198
+ }
199
+
200
+
201
+ char *Get_tex_fontsize(OBJ_PTR fmkr, int *ierr) {
202
+ OBJ_PTR v = Obj_Attr_Get(fmkr, tex_fontsize_ID, ierr);
203
+ if (*ierr != 0) return NULL;
204
+ if (v == OBJ_NIL) return NULL;
205
+ return String_Ptr(v, ierr);
206
+ }
207
+
208
+ char *Get_tex_fontfamily(OBJ_PTR fmkr, int *ierr) {
209
+ OBJ_PTR v = Obj_Attr_Get(fmkr, tex_fontfamily_ID, ierr);
210
+ if (*ierr != 0) return NULL;
211
+ if (v == OBJ_NIL) return NULL;
212
+ return String_Ptr(v, ierr);
213
+ }
214
+
215
+ char *Get_tex_fontseries(OBJ_PTR fmkr, int *ierr) {
216
+ OBJ_PTR v = Obj_Attr_Get(fmkr, tex_fontseries_ID, ierr);
217
+ if (*ierr != 0) return NULL;
218
+ if (v == OBJ_NIL) return NULL;
219
+ return String_Ptr(v, ierr);
220
+ }
221
+
222
+ char *Get_tex_fontshape(OBJ_PTR fmkr, int *ierr) {
223
+ OBJ_PTR v = Obj_Attr_Get(fmkr, tex_fontshape_ID, ierr);
224
+ if (*ierr != 0) return NULL;
225
+ if (v == OBJ_NIL) return NULL;
226
+ return String_Ptr(v, ierr);
227
+ }
228
+
229
+ char *Get_tex_preview_minwhitespace(OBJ_PTR fmkr, int *ierr) {
230
+ OBJ_PTR v = Obj_Attr_Get(fmkr, tex_preview_minwhitespace_ID, ierr);
231
+ if (*ierr != 0) return NULL;
232
+ if (v == OBJ_NIL) return NULL;
233
+ return String_Ptr(v, ierr);
234
+ }
235
+
236
+ bool Get_tex_preview_fullpage(OBJ_PTR fmkr, int *ierr) {
237
+ OBJ_PTR v = Obj_Attr_Get(fmkr, tex_preview_fullpage_ID, ierr);
238
+ if (*ierr != 0) return false;
239
+ return v != OBJ_FALSE && v != OBJ_NIL;
240
+ }
241
+
242
+ /* gets the generated preamble */
243
+ char *Get_tex_preview_generated_preamble(OBJ_PTR fmkr, int *ierr) {
244
+ /* it is a class constant... */
245
+ OBJ_PTR v = TEX_PREAMBLE(fmkr, ierr);
246
+ if (*ierr != 0) return NULL;
247
+ if (v == OBJ_NIL) return NULL;
248
+ return CString_Ptr(v, ierr);
249
+ }
250
+
251
+ double Get_tex_xoffset(OBJ_PTR fmkr, int *ierr) { return Get_double(fmkr, tex_xoffset_ID, ierr); }
252
+ double Get_tex_yoffset(OBJ_PTR fmkr, int *ierr) { return Get_double(fmkr, tex_yoffset_ID, ierr); }
253
+
254
+
255
+ OBJ_PTR Get_fm_data_attr(OBJ_PTR fmkr, int *ierr) { return Obj_Attr_Get(fmkr, fm_data_ID, ierr); }
256
+
257
+
258
+ static char *Get_save_dir(OBJ_PTR fmkr, int *ierr) {
259
+ OBJ_PTR v = Obj_Attr_Get(fmkr, save_dir_ID, ierr);
260
+ if (*ierr != 0) return NULL;
261
+ if (v == OBJ_NIL) return NULL;
262
+ return String_Ptr(v, ierr);
263
+ }
264
+
265
+ char *Get_tex_preview_documentclass(OBJ_PTR fmkr, int *ierr) {
266
+ OBJ_PTR v = Obj_Attr_Get(fmkr, tex_preview_documentclass_ID, ierr);
267
+ if (*ierr != 0) return NULL;
268
+ if (v == OBJ_NIL) return NULL;
269
+ return String_Ptr(v, ierr);
270
+ }
271
+
272
+ char *Get_tex_preamble(OBJ_PTR fmkr, int *ierr) {
273
+ OBJ_PTR v = Obj_Attr_Get(fmkr, tex_preamble_ID, ierr);
274
+ if (*ierr != 0) return NULL;
275
+ if (v == OBJ_NIL) return NULL;
276
+ return String_Ptr(v, ierr);
277
+ }
278
+
279
+ char *Get_xaxis_numeric_label_tex(OBJ_PTR fmkr, int *ierr) {
280
+ OBJ_PTR v = Obj_Attr_Get(fmkr, xaxis_numeric_label_tex_ID, ierr);
281
+ if (*ierr != 0) return NULL;
282
+ if (v == OBJ_NIL) return NULL;
283
+ return String_Ptr(v, ierr);
284
+ }
285
+
286
+ char *Get_yaxis_numeric_label_tex(OBJ_PTR fmkr, int *ierr) {
287
+ OBJ_PTR v = Obj_Attr_Get(fmkr, yaxis_numeric_label_tex_ID, ierr);
288
+ if (*ierr != 0) return NULL;
289
+ if (v == OBJ_NIL) return NULL;
290
+ return String_Ptr(v, ierr);
291
+ }
292
+
293
+ char *Get_tex_preview_pagestyle(OBJ_PTR fmkr, int *ierr) {
294
+ OBJ_PTR v = Obj_Attr_Get(fmkr, tex_preview_pagestyle_ID, ierr);
295
+ if (*ierr != 0) return NULL;
296
+ if (v == OBJ_NIL) return NULL;
297
+ return String_Ptr(v, ierr);
298
+ }
299
+
300
+ char *Get_tex_preview_tiogafigure_command(OBJ_PTR fmkr, int *ierr) {
301
+ OBJ_PTR v = Obj_Attr_Get(fmkr, tex_preview_tiogafigure_command_ID, ierr);
302
+ if (*ierr != 0) return NULL;
303
+ if (v == OBJ_NIL) return NULL;
304
+ return String_Ptr(v, ierr);
305
+ }
306
+
307
+ static bool Get_quiet_mode(OBJ_PTR fmkr, int *ierr) {
308
+ OBJ_PTR v = Obj_Attr_Get(fmkr, quiet_mode_ID, ierr);
309
+ if (*ierr != 0) return false;
310
+ return v != OBJ_FALSE && v != OBJ_NIL;
311
+ }
312
+
313
+
314
+ static void Make_Save_Fname(OBJ_PTR fmkr, char *full_name, char *f_name,
315
+ bool with_save_dir, bool with_pdf_extension, int *ierr) {
316
+ int i, j, k, len, mod_len, mod_num, did_mod_num = false;
317
+ char c, *fmt, model[STRLEN], *save=NULL;
318
+ if (with_save_dir) { save = Get_save_dir(fmkr,ierr); if (*ierr != 0) return; }
319
+ if (with_save_dir && save != NULL && strlen(save) > 0) {
320
+ sprintf(full_name, "%s/", save); j = strlen(full_name); }
321
+ else j = 0;
322
+ if (f_name == NULL) f_name = "plot";
323
+ len = strlen(f_name);
324
+ for (i=0; i < len; i++) {
325
+ c = f_name[i];
326
+ full_name[j++] = c;
327
+ }
328
+ full_name[j] = '\0';
329
+ char *dot = strrchr(full_name,'.');
330
+ if (dot == NULL || strcmp(dot+1,"pdf") != 0) { /* add pdf extension */
331
+ full_name[j] = '\0';
332
+ if (!with_pdf_extension) return;
333
+ strcpy(full_name+j, ".pdf");
334
+ }
335
+ }
336
+
337
+
338
+ OBJ_PTR c_get_save_filename(OBJ_PTR fmkr, FM *p, OBJ_PTR name, int *ierr) {
339
+ char full_name[STRLEN];
340
+ char *fname = (name == OBJ_NIL)? NULL : String_Ptr(name, ierr);
341
+ if (*ierr != 0) RETURN_NIL;
342
+ Make_Save_Fname(fmkr, full_name, fname, false, false, ierr);
343
+ if (*ierr != 0) RETURN_NIL;
344
+ return String_From_Cstring(full_name);
345
+ }
346
+
347
+
348
+ void c_private_make(OBJ_PTR fmkr, FM *p, OBJ_PTR name, OBJ_PTR cmd, int *ierr) {
349
+ char full_name[STRLEN], mod_num_name[STRLEN];
350
+ OBJ_PTR result;
351
+ bool quiet = Get_quiet_mode(fmkr, ierr);
352
+ if (*ierr != 0) return;
353
+ if (!Get_initialized()) {
354
+ Init_pdf(ierr); if (*ierr != 0) return;
355
+ Init_tex(ierr); if (*ierr != 0) return;
356
+ Set_initialized();
357
+ }
358
+ char *fn = (name == OBJ_NIL)? NULL : String_Ptr(name,ierr);
359
+ if (*ierr != 0) return;
360
+ Make_Save_Fname(fmkr, full_name, fn, true, true, ierr);
361
+ if (*ierr != 0) return;
362
+ Open_pdf(fmkr, p, full_name, quiet, ierr);
363
+ if (*ierr != 0) return;
364
+ Open_tex(fmkr, full_name, quiet, ierr);
365
+ if (*ierr != 0) return;
366
+ Write_gsave();
367
+ p->root_figure = true;
368
+ p->in_subplot = false;
369
+ Call_Function(fmkr, make_page_ID, cmd, ierr);
370
+ if (*ierr != 0) return;
371
+ Write_grestore();
372
+ if (result == OBJ_FALSE) quiet = true;
373
+ Close_pdf(fmkr, p, quiet, ierr);
374
+ if (*ierr != 0) return;
375
+ Close_tex(fmkr, quiet, ierr);
376
+ if (*ierr != 0) return;
377
+ Create_wrapper(fmkr, full_name, quiet, ierr);
378
+ }
379
+
380
+
381
+ OBJ_PTR c_private_make_portfolio(OBJ_PTR fmkr, FM *p, OBJ_PTR name, OBJ_PTR fignums, OBJ_PTR fignames, int *ierr) {
382
+ char full_name[STRLEN];
383
+ char *fn = (name == OBJ_NIL)? NULL : String_Ptr(name,ierr);
384
+ if (*ierr != 0) RETURN_NIL;
385
+ Make_Save_Fname(fmkr, full_name, fn, true, false, ierr);
386
+ if (*ierr != 0) RETURN_NIL;
387
+ private_make_portfolio(full_name, fignums, fignames, ierr);
388
+ if (*ierr != 0) RETURN_NIL;
389
+ return String_From_Cstring(full_name);
71
390
  }
72
391
 
73
- void c_set_device_pagesize(FM *p, double width, double height) { // sizes in units of 1/720 inch
392
+
393
+ void c_set_device_pagesize(OBJ_PTR fmkr, FM *p, double width, double height, int *ierr) {
394
+ // sizes in units of 1/720 inch
74
395
  p->page_left = 0;
75
396
  p->page_right = width;
76
397
  p->page_bottom = 0;
@@ -84,23 +405,14 @@ void c_set_device_pagesize(FM *p, double width, double height) { // sizes in uni
84
405
  }
85
406
 
86
407
 
87
- VALUE FM_set_device_pagesize(VALUE fmkr, VALUE width, VALUE height)
88
- {
89
- FM *p = Get_FM(fmkr);
90
- width = rb_Float(width);
91
- height = rb_Float(height);
92
- c_set_device_pagesize(p, NUM2DBL(width), NUM2DBL(height));
93
- return fmkr;
94
- }
95
-
96
-
97
- void c_set_frame_sides(FM *p, double left, double right, double top, double bottom) { // sizes in page coords [0..1]
98
- if (left > 1.0 || left < 0.0) rb_raise(rb_eArgError, "Sorry: value of left must be between 0 and 1 for set_frame_sides");
99
- if (right > 1.0 || right < 0.0) rb_raise(rb_eArgError, "Sorry: value of right must be between 0 and 1 for set_frame_sides");
100
- if (top > 1.0 || top < 0.0) rb_raise(rb_eArgError, "Sorry: value of top must be between 0 and 1 for set_frame_sides");
101
- if (bottom > 1.0 || bottom < 0.0) rb_raise(rb_eArgError, "Sorry: value of bottom must be between 0 and 1 for set_frame_sides");
102
- if (left >= right) rb_raise(rb_eArgError, "Sorry: value of left must be smaller than value of right for set_frame_sides");
103
- if (bottom >= top) rb_raise(rb_eArgError, "Sorry: value of bottom must be smaller than value of top for set_frame_sides");
408
+ void c_set_frame_sides(OBJ_PTR fmkr, FM *p, double left, double right, double top, double bottom, int *ierr) { // sizes in page coords [0..1]
409
+ if (left > 1.0 || left < 0.0) RAISE_ERROR("Sorry: OBJ_PTR of left must be between 0 and 1 for set_frame_sides", ierr);
410
+ if (right > 1.0 || right < 0.0) RAISE_ERROR("Sorry: OBJ_PTR of right must be between 0 and 1 for set_frame_sides", ierr);
411
+ if (top > 1.0 || top < 0.0) RAISE_ERROR("Sorry: OBJ_PTR of top must be between 0 and 1 for set_frame_sides", ierr);
412
+ if (bottom > 1.0 || bottom < 0.0) RAISE_ERROR("Sorry: OBJ_PTR of bottom must be between 0 and 1 for set_frame_sides", ierr);
413
+ if (left >= right) RAISE_ERROR("Sorry: OBJ_PTR of left must be smaller than OBJ_PTR of right for set_frame_sides", ierr);
414
+ if (bottom >= top) RAISE_ERROR("Sorry: OBJ_PTR of bottom must be smaller than OBJ_PTR of top for set_frame_sides", ierr);
415
+ if (*ierr != 0) return;
104
416
  p->frame_left = left;
105
417
  p->frame_right = right;
106
418
  p->frame_bottom = bottom;
@@ -109,27 +421,18 @@ void c_set_frame_sides(FM *p, double left, double right, double top, double bott
109
421
  p->frame_height = top - bottom;
110
422
  }
111
423
 
112
- VALUE FM_set_frame_sides(VALUE fmkr, VALUE left, VALUE right, VALUE top, VALUE bottom)
113
- {
114
- FM *p = Get_FM(fmkr);
115
- left = rb_Float(left);
116
- right = rb_Float(right);
117
- top = rb_Float(top);
118
- bottom = rb_Float(bottom);
119
- c_set_frame_sides(p, NUM2DBL(left), NUM2DBL(right), NUM2DBL(top), NUM2DBL(bottom));
120
- return fmkr;
121
- }
122
-
123
424
 
124
- void Initialize_Figure(VALUE fmkr) {
125
- FM *p = Get_FM(fmkr);
425
+ void c_private_init_fm_data(OBJ_PTR fmkr, FM *p, int *ierr) {
126
426
  /* Page */
127
427
  p->root_figure = true;
128
428
  p->in_subplot = false;
129
- c_private_set_default_font_size(p, 12.0);
130
- c_set_device_pagesize(p, 5 * 72.0 * ENLARGE, 5 * 72.0 * ENLARGE);
429
+ c_private_set_default_font_size(fmkr, p, 12.0, ierr);
430
+ if (*ierr != 0) return;
431
+ c_set_device_pagesize(fmkr, p, 5 * 72.0 * ENLARGE, 5 * 72.0 * ENLARGE, ierr);
432
+ if (*ierr != 0) return;
131
433
  /* default frame */
132
- c_set_frame_sides(p, 0.15, 0.85, 0.85, 0.15);
434
+ c_set_frame_sides(fmkr, p, 0.15, 0.85, 0.85, 0.15, ierr);
435
+ if (*ierr != 0) return;
133
436
  /* default bounds */
134
437
  p->bounds_left = p->bounds_bottom = p->bounds_xmin = p->bounds_ymin = 0;
135
438
  p->bounds_right = p->bounds_top = p->bounds_xmax = p->bounds_ymax = 1;
@@ -150,13 +453,16 @@ void Initialize_Figure(VALUE fmkr) {
150
453
  p->text_shift_from_y_origin = 2.0;
151
454
  p->default_text_scale = 1.0; Recalc_Font_Hts(p);
152
455
  /* graphics attributes */
153
- p->stroke_color = Qnil;
154
- p->fill_color = Qnil;
456
+ p->stroke_color_R = 0.0;
457
+ p->stroke_color_G = 0.0;
458
+ p->stroke_color_B = 0.0;
459
+ p->fill_color_R = 0.0;
460
+ p->fill_color_G = 0.0;
461
+ p->fill_color_B = 0.0;
155
462
  p->default_line_scale = 1.0;
156
463
  p->line_width = 1.2;
157
464
  p->line_cap = LINE_CAP_ROUND;
158
465
  p->line_join = LINE_JOIN_ROUND;
159
- p->line_type = Qnil; // means solid line
160
466
  p->miter_limit = 2.0;
161
467
 
162
468
  p->stroke_opacity = 1.0;
@@ -164,39 +470,42 @@ void Initialize_Figure(VALUE fmkr) {
164
470
 
165
471
  /* Title */
166
472
  p->title_visible = true;
167
- p->title = Qnil;
168
473
  p->title_side = TOP;
169
474
  p->title_position = 0.5;
170
475
  p->title_scale = 1.1;
171
- p->title_shift = 0.7; // in char heights, positive for out from edge (or toward larger x or y value)
476
+ p->title_shift = 0.7; // in char heights, positive for out from edge (or toward larger x or y OBJ_PTR)
172
477
  p->title_angle = 0.0;
173
478
  p->title_alignment = ALIGNED_AT_BASELINE;
174
479
  p->title_justification = CENTERED;
175
- p->title_color = Qnil;
480
+ p->title_color_R = 0.0;
481
+ p->title_color_G = 0.0;
482
+ p->title_color_B = 0.0;
176
483
 
177
484
  /* X label */
178
485
  p->xlabel_visible = true;
179
- p->xlabel = Qnil;
180
486
  p->xlabel_side = BOTTOM;
181
487
  p->xlabel_position = 0.5;
182
488
  p->xlabel_scale = 1.0;
183
- p->xlabel_shift = 2.0; // in char heights, positive for out from edge (or toward larger x or y value)
489
+ p->xlabel_shift = 2.0; // in char heights, positive for out from edge (or toward larger x or y OBJ_PTR)
184
490
  p->xlabel_angle = 0.0;
185
491
  p->xlabel_alignment = ALIGNED_AT_BASELINE;
186
492
  p->xlabel_justification = CENTERED;
187
- p->xlabel_color = Qnil;
493
+ p->xlabel_color_R = 0.0;
494
+ p->xlabel_color_G = 0.0;
495
+ p->xlabel_color_B = 0.0;
188
496
 
189
497
  /* Y label */
190
498
  p->ylabel_visible = true;
191
- p->ylabel = Qnil;
192
499
  p->ylabel_side = LEFT;
193
500
  p->ylabel_position = 0.5;
194
501
  p->ylabel_scale = 1.0;
195
- p->ylabel_shift = 1.8; // in char heights, positive for out from edge (or toward larger x or y value)
502
+ p->ylabel_shift = 1.8; // in char heights, positive for out from edge (or toward larger x or y OBJ_PTR)
196
503
  p->ylabel_angle = 0.0;
197
504
  p->ylabel_alignment = ALIGNED_AT_BASELINE;
198
505
  p->ylabel_justification = CENTERED;
199
- p->ylabel_color = Qnil;
506
+ p->ylabel_color_R = 0.0;
507
+ p->ylabel_color_G = 0.0;
508
+ p->ylabel_color_B = 0.0;
200
509
 
201
510
  /* X axis */
202
511
  p->xaxis_visible = true;
@@ -204,27 +513,26 @@ void Initialize_Figure(VALUE fmkr) {
204
513
  p->xaxis_loc = BOTTOM;
205
514
  // line
206
515
  p->xaxis_line_width = 1.0; // for axis line
207
- p->xaxis_stroke_color = Qnil; // for axis line and tick marks
516
+ p->xaxis_stroke_color_R = 0.0; // for axis line and tick marks
517
+ p->xaxis_stroke_color_G = 0.0;
518
+ p->xaxis_stroke_color_B = 0.0;
208
519
  // tick marks
209
520
  p->xaxis_major_tick_width = 0.9; // same units as line_width
210
521
  p->xaxis_minor_tick_width = 0.7; // same units as line_width
211
522
  p->xaxis_major_tick_length = 0.6; // in units of numeric label char heights
212
523
  p->xaxis_minor_tick_length = 0.3; // in units of numeric label char heights
213
524
  p->xaxis_log_values = false;
214
- p->xaxis_ticks_inside = true; // inside frame or toward larger x or y value for specific location
215
- p->xaxis_ticks_outside = false; // inside frame or toward smaller x or y value for specific location
525
+ p->xaxis_ticks_inside = true; // inside frame or toward larger x or y OBJ_PTR for specific location
526
+ p->xaxis_ticks_outside = false; // inside frame or toward smaller x or y OBJ_PTR for specific location
216
527
  p->xaxis_tick_interval = 0.0; // set to 0 to use default
217
528
  p->xaxis_min_between_major_ticks = 2; // in units of numeric label char heights
218
529
  p->xaxis_number_of_minor_intervals = 0; // set to 0 to use default
219
- p->xaxis_locations_for_major_ticks = Qnil; // set to nil to use defaults
220
- p->xaxis_locations_for_minor_ticks = Qnil; // set to nil to use defaults
221
530
  // numeric labels on major ticks
222
531
  p->xaxis_use_fixed_pt = false;
223
532
  p->xaxis_digits_max = 0;
224
- p->xaxis_tick_labels = Qnil; // set to nil to use defaults. else must have a label for each major tick
225
533
  p->xaxis_numeric_label_decimal_digits = -1; // set to negative to use default
226
534
  p->xaxis_numeric_label_scale = 0.7;
227
- p->xaxis_numeric_label_shift = 0.3; // in char heights, positive for out from edge (or toward larger x or y value)
535
+ p->xaxis_numeric_label_shift = 0.3; // in char heights, positive for out from edge (or toward larger x or y OBJ_PTR)
228
536
  p->xaxis_numeric_label_angle = 0.0;
229
537
  p->xaxis_numeric_label_alignment = ALIGNED_AT_MIDHEIGHT;
230
538
  p->xaxis_numeric_label_justification = CENTERED;
@@ -241,27 +549,26 @@ void Initialize_Figure(VALUE fmkr) {
241
549
  p->yaxis_loc = LEFT;
242
550
  // line
243
551
  p->yaxis_line_width = 1.0; // for axis line
244
- p->yaxis_stroke_color = Qnil; // for axis line and tick marks
552
+ p->yaxis_stroke_color_R = 0.0; // for axis line and tick marks
553
+ p->yaxis_stroke_color_G = 0.0;
554
+ p->yaxis_stroke_color_B = 0.0;
245
555
  // tick marks
246
556
  p->yaxis_major_tick_width = 0.9; // same units as line_width
247
557
  p->yaxis_minor_tick_width = 0.7; // same units as line_width
248
558
  p->yaxis_major_tick_length = 0.6; // in units of numeric label char heights
249
559
  p->yaxis_minor_tick_length = 0.3; // in units of numeric label char heights
250
560
  p->yaxis_log_values = false;
251
- p->yaxis_ticks_inside = true; // inside frame or toward larger x or y value for specific location
252
- p->yaxis_ticks_outside = false; // inside frame or toward smaller x or y value for specific location
561
+ p->yaxis_ticks_inside = true; // inside frame or toward larger x or y OBJ_PTR for specific location
562
+ p->yaxis_ticks_outside = false; // inside frame or toward smaller x or y OBJ_PTR for specific location
253
563
  p->yaxis_tick_interval = 0.0; // set to 0 to use default
254
564
  p->yaxis_min_between_major_ticks = 2; // in units of numeric label char heights
255
565
  p->yaxis_number_of_minor_intervals = 0; // set to 0 to use default
256
- p->yaxis_locations_for_major_ticks = Qnil; // set to nil to use defaults
257
- p->yaxis_locations_for_minor_ticks = Qnil; // set to nil to use defaults
258
566
  // numeric labels on major ticks
259
567
  p->yaxis_use_fixed_pt = false;
260
568
  p->yaxis_digits_max = 0;
261
- p->yaxis_tick_labels = Qnil; // set to nil to use defaults. else must have a label for each major tick
262
569
  p->yaxis_numeric_label_decimal_digits = -1; // set to negative to use default
263
570
  p->yaxis_numeric_label_scale = 0.7;
264
- p->yaxis_numeric_label_shift = 0.5; // in char heights, positive for out from edge (or toward larger x or y value)
571
+ p->yaxis_numeric_label_shift = 0.5; // in char heights, positive for out from edge (or toward larger x or y OBJ_PTR)
265
572
  p->yaxis_numeric_label_angle = 0.0;
266
573
  p->yaxis_numeric_label_alignment = ALIGNED_AT_MIDHEIGHT;
267
574
  p->yaxis_numeric_label_justification = CENTERED;
@@ -284,245 +591,52 @@ void Initialize_Figure(VALUE fmkr) {
284
591
  p->legend_alignment = ALIGNED_AT_BASELINE;
285
592
  p->legend_justification = LEFT_JUSTIFIED;
286
593
  p->debug_verbosity_level = 0;
287
-
288
594
  /* emit a warning by default */
289
595
  p->croak_on_nonok_numbers = 1;
290
596
  }
291
597
 
292
- VALUE do_cmd(VALUE fmkr, VALUE cmd) { return rb_funcall(fmkr, do_cmd_ID, 1, cmd); }
293
-
294
- static void Type_Error(VALUE obj, ID name_ID, char *expected)
295
- {
296
- char *name = rb_id2name(name_ID);
297
- while (name[0] == '@') name++;
298
- rb_raise(rb_eArgError, "Require %s value for '%s'", expected, name);
299
- }
300
-
301
- bool Get_bool(VALUE obj, ID name_ID) {
302
- VALUE v = rb_ivar_get(obj, name_ID);
303
- if (v != Qfalse && v != Qtrue && v != Qnil)
304
- Type_Error(v, name_ID, "true or false");
305
- return v == Qtrue;
306
- }
307
-
308
- int Get_int(VALUE obj, ID name_ID) {
309
- VALUE v = rb_ivar_get(obj, name_ID);
310
- if (!rb_obj_is_kind_of(v,rb_Integer_class))
311
- Type_Error(v, name_ID, "Integer");
312
- v = rb_Integer(v);
313
- return NUM2INT(v);
314
- }
315
-
316
- double Get_double(VALUE obj, ID name_ID) {
317
- VALUE v = rb_ivar_get(obj, name_ID);
318
- if (!rb_obj_is_kind_of(v,rb_Numeric_class))
319
- Type_Error(v, name_ID, "Numeric");
320
- v = rb_Float(v);
321
- return NUM2DBL(v);
598
+ OBJ_PTR Get_line_type(OBJ_PTR fmkr, int *ierr) {
599
+ OBJ_PTR v = Obj_Attr_Get(fmkr, line_type_ID, ierr);
600
+ if (*ierr != 0) RETURN_NIL;
601
+ return v;
322
602
  }
323
603
 
324
-
325
- char *Get_tex_preview_paper_width(VALUE fmkr) {
326
- VALUE v = rb_ivar_get(fmkr, tex_preview_paper_width_ID);
327
- if (v == Qnil) return NULL;
328
- return StringValuePtr(v);
329
- }
330
-
331
- char *Get_tex_preview_paper_height(VALUE fmkr) {
332
- VALUE v = rb_ivar_get(fmkr, tex_preview_paper_height_ID);
333
- if (v == Qnil) return NULL;
334
- return StringValuePtr(v);
604
+ void Set_line_type(OBJ_PTR fmkr, OBJ_PTR v, int *ierr) {
605
+ Obj_Attr_Set(fmkr, line_type_ID, v, ierr);
335
606
  }
336
607
 
337
- char *Get_tex_preview_hoffset(VALUE fmkr) {
338
- VALUE v = rb_ivar_get(fmkr, tex_preview_hoffset_ID);
339
- if (v == Qnil) return NULL;
340
- return StringValuePtr(v);
608
+ OBJ_PTR Get_xaxis_locations_for_major_ticks(OBJ_PTR fmkr, int *ierr) {
609
+ OBJ_PTR v = Obj_Attr_Get(fmkr, xaxis_locations_for_major_ticks_ID, ierr);
610
+ if (*ierr != 0) RETURN_NIL;
611
+ return v;
341
612
  }
342
613
 
343
- char *Get_tex_preview_voffset(VALUE fmkr) {
344
- VALUE v = rb_ivar_get(fmkr, tex_preview_voffset_ID);
345
- if (v == Qnil) return NULL;
346
- return StringValuePtr(v);
614
+ OBJ_PTR Get_xaxis_locations_for_minor_ticks(OBJ_PTR fmkr, int *ierr) {
615
+ OBJ_PTR v = Obj_Attr_Get(fmkr, xaxis_locations_for_minor_ticks_ID, ierr);
616
+ if (*ierr != 0) RETURN_NIL;
617
+ return v;
347
618
  }
348
619
 
349
- char *Get_tex_preview_figure_width(VALUE fmkr) {
350
- VALUE v = rb_ivar_get(fmkr, tex_preview_figure_width_ID);
351
- if (v == Qnil) return NULL;
352
- return StringValuePtr(v);
620
+ OBJ_PTR Get_xaxis_tick_labels(OBJ_PTR fmkr, int *ierr) {
621
+ OBJ_PTR v = Obj_Attr_Get(fmkr, xaxis_tick_labels_ID, ierr);
622
+ if (*ierr != 0) RETURN_NIL;
623
+ return v;
353
624
  }
354
625
 
355
- char *Get_tex_preview_figure_height(VALUE fmkr) {
356
- VALUE v = rb_ivar_get(fmkr, tex_preview_figure_height_ID);
357
- if (v == Qnil) return NULL;
358
- return StringValuePtr(v);
626
+ OBJ_PTR Get_yaxis_locations_for_major_ticks(OBJ_PTR fmkr, int *ierr) {
627
+ OBJ_PTR v = Obj_Attr_Get(fmkr, yaxis_locations_for_major_ticks_ID, ierr);
628
+ if (*ierr != 0) RETURN_NIL;
629
+ return v;
359
630
  }
360
-
361
-
362
- char *Get_tex_fontsize(VALUE fmkr) {
363
- VALUE v = rb_ivar_get(fmkr, tex_fontsize_ID);
364
- if (v == Qnil) return NULL;
365
- return StringValuePtr(v);
366
- }
367
-
368
- char *Get_tex_fontfamily(VALUE fmkr) {
369
- VALUE v = rb_ivar_get(fmkr, tex_fontfamily_ID);
370
- if (v == Qnil) return NULL;
371
- return StringValuePtr(v);
372
- }
373
-
374
- char *Get_tex_fontseries(VALUE fmkr) {
375
- VALUE v = rb_ivar_get(fmkr, tex_fontseries_ID);
376
- if (v == Qnil) return NULL;
377
- return StringValuePtr(v);
378
- }
379
-
380
- char *Get_tex_fontshape(VALUE fmkr) {
381
- VALUE v = rb_ivar_get(fmkr, tex_fontshape_ID);
382
- if (v == Qnil) return NULL;
383
- return StringValuePtr(v);
384
- }
385
-
386
- char *Get_tex_preview_minwhitespace(VALUE fmkr) {
387
- VALUE v = rb_ivar_get(fmkr, tex_preview_minwhitespace_ID);
388
- if (v == Qnil) return NULL;
389
- return StringValuePtr(v);
631
+ OBJ_PTR Get_yaxis_locations_for_minor_ticks(OBJ_PTR fmkr, int *ierr) {
632
+ OBJ_PTR v = Obj_Attr_Get(fmkr, yaxis_locations_for_minor_ticks_ID, ierr);
633
+ if (*ierr != 0) RETURN_NIL;
634
+ return v;
390
635
  }
391
-
392
- bool Get_tex_preview_fullpage(VALUE fmkr) {
393
- VALUE v = rb_ivar_get(fmkr, tex_preview_fullpage_ID);
394
- return v != Qfalse && v != Qnil;
395
- }
396
-
397
- /* gets the generated preamble */
398
- char *Get_tex_preview_generated_preamble(VALUE fmkr) {
399
- /* it is a class constant... */
400
- VALUE v = rb_const_get(CLASS_OF(fmkr),
401
- rb_intern("TEX_PREAMBLE"));
402
- if (v == Qnil) return NULL;
403
- return StringValueCStr(v);
404
- }
405
-
406
-
407
- double Get_tex_xoffset(VALUE fmkr) { return Get_double(fmkr, tex_xoffset_ID); }
408
- double Get_tex_yoffset(VALUE fmkr) { return Get_double(fmkr, tex_yoffset_ID); }
409
-
410
- static char *Get_save_dir(VALUE fmkr) {
411
- VALUE v = rb_ivar_get(fmkr, save_dir_ID);
412
- if (v == Qnil) return NULL;
413
- return StringValuePtr(v);
414
- }
415
-
416
- char *Get_tex_preview_documentclass(VALUE fmkr) {
417
- VALUE v = rb_ivar_get(fmkr, tex_preview_documentclass_ID);
418
- if (v == Qnil) return NULL;
419
- return StringValuePtr(v);
420
- }
421
-
422
- char *Get_tex_preamble(VALUE fmkr) {
423
- VALUE v = rb_ivar_get(fmkr, tex_preamble_ID);
424
- if (v == Qnil) return NULL;
425
- return StringValuePtr(v);
636
+ OBJ_PTR Get_yaxis_tick_labels(OBJ_PTR fmkr, int *ierr) {
637
+ OBJ_PTR v = Obj_Attr_Get(fmkr, yaxis_tick_labels_ID, ierr);
638
+ if (*ierr != 0) RETURN_NIL;
639
+ return v;
426
640
  }
427
641
 
428
- char *Get_xaxis_numeric_label_tex(VALUE fmkr) {
429
- VALUE v = rb_ivar_get(fmkr, xaxis_numeric_label_tex_ID);
430
- if (v == Qnil) return NULL;
431
- return StringValuePtr(v);
432
- }
433
-
434
- char *Get_yaxis_numeric_label_tex(VALUE fmkr) {
435
- VALUE v = rb_ivar_get(fmkr, yaxis_numeric_label_tex_ID);
436
- if (v == Qnil) return NULL;
437
- return StringValuePtr(v);
438
- }
439
-
440
- char *Get_tex_preview_pagestyle(VALUE fmkr) {
441
- VALUE v = rb_ivar_get(fmkr, tex_preview_pagestyle_ID);
442
- if (v == Qnil) return NULL;
443
- return StringValuePtr(v);
444
- }
445
-
446
- char *Get_tex_preview_tiogafigure_command(VALUE fmkr) {
447
- VALUE v = rb_ivar_get(fmkr, tex_preview_tiogafigure_command_ID);
448
- if (v == Qnil) return NULL;
449
- return StringValuePtr(v);
450
- }
451
-
452
- static bool Get_quiet_mode(VALUE fmkr) {
453
- VALUE v = rb_ivar_get(fmkr, quiet_mode_ID);
454
- return v != Qfalse && v != Qnil;
455
- }
456
-
457
- static bool Get_initialized() {
458
- VALUE v = rb_cvar_get(cFM, initialized_ID);
459
- return v != Qfalse && v != Qnil;
460
- }
461
-
462
- static void Set_initialized() {
463
- rb_cv_set(cFM, "@@initialized", Qtrue);
464
- }
465
-
466
- static void Make_Save_Fname(VALUE fmkr, char *full_name, char *f_name,
467
- bool with_save_dir, bool with_pdf_extension) {
468
- int i, j, k, len, mod_len, mod_num, did_mod_num = false;
469
- char c, *fmt, model[STRLEN], *save=NULL;
470
- if (with_save_dir) save = Get_save_dir(fmkr);
471
- if (with_save_dir && save != NULL && strlen(save) > 0) {
472
- sprintf(full_name, "%s/", save); j = strlen(full_name); }
473
- else j = 0;
474
- if (f_name == NULL) f_name = "plot";
475
- len = strlen(f_name);
476
- for (i=0; i < len; i++) {
477
- c = f_name[i];
478
- full_name[j++] = c;
479
- }
480
- full_name[j] = '\0';
481
- char *dot = strrchr(full_name,'.');
482
- if (dot == NULL || strcmp(dot+1,"pdf") != 0) { /* add pdf extension */
483
- full_name[j] = '\0';
484
- if (!with_pdf_extension) return;
485
- strcpy(full_name+j, ".pdf");
486
- }
487
- }
488
-
489
- VALUE FM_get_save_filename(VALUE fmkr, VALUE name) {
490
- char full_name[STRLEN];
491
- Make_Save_Fname(fmkr, full_name, (name == Qnil)? NULL : StringValuePtr(name), false, false);
492
- return rb_str_new2(full_name);
493
- }
494
-
495
- VALUE FM_private_make(VALUE fmkr, VALUE name, VALUE cmd) {
496
- char full_name[STRLEN], mod_num_name[STRLEN];
497
- FM *p = Get_FM(fmkr);
498
- FM saved = *p;
499
- VALUE result;
500
- bool quiet = Get_quiet_mode(fmkr);
501
- if (!Get_initialized()) {
502
- Init_pdf();
503
- Init_tex();
504
- Set_initialized();
505
- }
506
- Make_Save_Fname(fmkr, full_name, (name == Qnil)? NULL : StringValuePtr(name), true, true);
507
- Open_pdf(fmkr, full_name, quiet);
508
- Open_tex(fmkr, full_name, quiet);
509
- Write_gsave();
510
- p->root_figure = true;
511
- p->in_subplot = false;
512
- result = rb_funcall(fmkr, make_page_ID, 1, cmd);
513
- Write_grestore();
514
- if (result == Qfalse) quiet = true;
515
- Close_pdf(fmkr, quiet);
516
- Close_tex(fmkr, quiet);
517
- Create_wrapper(fmkr, full_name, quiet);
518
- *p = saved;
519
- return result;
520
- }
521
-
522
- VALUE FM_private_make_portfolio(VALUE fmkr, VALUE name, VALUE fignums, VALUE fignames) {
523
- char full_name[STRLEN];
524
- Make_Save_Fname(fmkr, full_name, (name == Qnil)? NULL : StringValuePtr(name), true, false);
525
- private_make_portfolio(full_name, fignums, fignames);
526
- return rb_str_new2(full_name);
527
- }
528
642