tioga 1.4

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 (116) hide show
  1. data/Tioga_README +372 -0
  2. data/lgpl.txt +504 -0
  3. data/split/Dtable/defs.h +33 -0
  4. data/split/Dtable/dtable.c +1928 -0
  5. data/split/Dtable/dtable_intern.h +144 -0
  6. data/split/Dtable/dvector.h +61 -0
  7. data/split/Dtable/extconf.rb +4 -0
  8. data/split/Dtable/include/dtable.h +35 -0
  9. data/split/Dtable/lib/Dtable_extras.rb +90 -0
  10. data/split/Dtable/namespace.h +47 -0
  11. data/split/Dtable/safe_double.h +104 -0
  12. data/split/Dtable/symbols.c +92 -0
  13. data/split/Dtable/symbols.h +52 -0
  14. data/split/Dvector/defs.h +33 -0
  15. data/split/Dvector/dvector.c +5486 -0
  16. data/split/Dvector/dvector_intern.h +142 -0
  17. data/split/Dvector/extconf.rb +4 -0
  18. data/split/Dvector/include/dvector.h +61 -0
  19. data/split/Dvector/lib/Dvector_extras.rb +328 -0
  20. data/split/Dvector/lib/Numeric_extras.rb +134 -0
  21. data/split/Dvector/namespace.h +47 -0
  22. data/split/Dvector/safe_double.h +104 -0
  23. data/split/Dvector/symbols.c +92 -0
  24. data/split/Dvector/symbols.h +52 -0
  25. data/split/Flate/defs.h +33 -0
  26. data/split/Flate/extconf.rb +19 -0
  27. data/split/Flate/flate.c +156 -0
  28. data/split/Flate/flate_intern.h +97 -0
  29. data/split/Flate/include/flate.h +98 -0
  30. data/split/Flate/namespace.h +47 -0
  31. data/split/Flate/safe_double.h +104 -0
  32. data/split/Flate/symbols.c +92 -0
  33. data/split/Flate/symbols.h +52 -0
  34. data/split/Function/defs.h +33 -0
  35. data/split/Function/dvector.h +61 -0
  36. data/split/Function/extconf.rb +4 -0
  37. data/split/Function/function.c +988 -0
  38. data/split/Function/joint_qsort.c +258 -0
  39. data/split/Function/lib/Function_extras.rb +44 -0
  40. data/split/Function/namespace.h +47 -0
  41. data/split/Function/safe_double.h +104 -0
  42. data/split/Function/symbols.c +92 -0
  43. data/split/Function/symbols.h +52 -0
  44. data/split/Tioga/axes.c +774 -0
  45. data/split/Tioga/defs.h +33 -0
  46. data/split/Tioga/dtable.h +35 -0
  47. data/split/Tioga/dvector.h +61 -0
  48. data/split/Tioga/extconf.rb +4 -0
  49. data/split/Tioga/figures.c +672 -0
  50. data/split/Tioga/figures.h +855 -0
  51. data/split/Tioga/flate.h +98 -0
  52. data/split/Tioga/init.c +524 -0
  53. data/split/Tioga/lib/Arcs_and_Circles.rb +64 -0
  54. data/split/Tioga/lib/ColorConstants.rb +274 -0
  55. data/split/Tioga/lib/Colorbars.rb +10 -0
  56. data/split/Tioga/lib/Colormaps.rb +105 -0
  57. data/split/Tioga/lib/Coordinate_Conversions.rb +194 -0
  58. data/split/Tioga/lib/Creating_Paths.rb +94 -0
  59. data/split/Tioga/lib/Doc.rb +91 -0
  60. data/split/Tioga/lib/Executive.rb +515 -0
  61. data/split/Tioga/lib/FigMkr.rb +2224 -0
  62. data/split/Tioga/lib/FigureConstants.rb +125 -0
  63. data/split/Tioga/lib/Figures_and_Plots.rb +268 -0
  64. data/split/Tioga/lib/Images.rb +278 -0
  65. data/split/Tioga/lib/Legends.rb +190 -0
  66. data/split/Tioga/lib/MarkerConstants.rb +122 -0
  67. data/split/Tioga/lib/Markers.rb +129 -0
  68. data/split/Tioga/lib/Page_Frame_Bounds.rb +567 -0
  69. data/split/Tioga/lib/Rectangles.rb +94 -0
  70. data/split/Tioga/lib/Shading.rb +100 -0
  71. data/split/Tioga/lib/Special_Paths.rb +307 -0
  72. data/split/Tioga/lib/Strokes.rb +129 -0
  73. data/split/Tioga/lib/TeX_Text.rb +454 -0
  74. data/split/Tioga/lib/TexPreamble.rb +358 -0
  75. data/split/Tioga/lib/Titles_and_Labels.rb +306 -0
  76. data/split/Tioga/lib/Transparency.rb +89 -0
  77. data/split/Tioga/lib/Using_Paths.rb +164 -0
  78. data/split/Tioga/lib/Utils.rb +74 -0
  79. data/split/Tioga/lib/X_and_Y_Axes.rb +749 -0
  80. data/split/Tioga/lib/irb_tioga.rb +122 -0
  81. data/split/Tioga/lib/tioga.rb +1 -0
  82. data/split/Tioga/lib/tioga_ui.rb +5 -0
  83. data/split/Tioga/lib/tioga_ui_cmds.rb +793 -0
  84. data/split/Tioga/makers.c +989 -0
  85. data/split/Tioga/mk_tioga_sty.rb +53 -0
  86. data/split/Tioga/namespace.h +47 -0
  87. data/split/Tioga/pdf_font_dicts.c +18253 -0
  88. data/split/Tioga/pdfcolor.c +486 -0
  89. data/split/Tioga/pdfcoords.c +505 -0
  90. data/split/Tioga/pdffile.c +342 -0
  91. data/split/Tioga/pdfimage.c +536 -0
  92. data/split/Tioga/pdfpath.c +914 -0
  93. data/split/Tioga/pdfs.h +229 -0
  94. data/split/Tioga/pdftext.c +443 -0
  95. data/split/Tioga/safe_double.h +104 -0
  96. data/split/Tioga/symbols.c +92 -0
  97. data/split/Tioga/symbols.h +52 -0
  98. data/split/Tioga/texout.c +380 -0
  99. data/split/defs.h +33 -0
  100. data/split/extconf.rb +107 -0
  101. data/split/mkmf2.rb +1612 -0
  102. data/split/namespace.h +47 -0
  103. data/split/safe_double.h +104 -0
  104. data/split/scripts/tioga +4 -0
  105. data/split/symbols.c +92 -0
  106. data/split/symbols.h +52 -0
  107. data/tests/dtable_test.data +6 -0
  108. data/tests/dvector_read_test.data +1 -0
  109. data/tests/dvector_test.data +101 -0
  110. data/tests/tc_Dtable.rb +221 -0
  111. data/tests/tc_Dvector.rb +791 -0
  112. data/tests/tc_FMkr.rb +162 -0
  113. data/tests/tc_Flate.rb +45 -0
  114. data/tests/tc_Function.rb +111 -0
  115. data/tests/ts_Tioga.rb +38 -0
  116. metadata +163 -0
@@ -0,0 +1,98 @@
1
+ /* flate.h -- c interface for the Ruby Flate extension
2
+ */
3
+
4
+ /*
5
+ Copyright (C) 2005 Bill Paxton
6
+
7
+ Flate 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
+ Flate 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 Flate; if not, write to the Free Software
19
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
+ */
21
+
22
+
23
+ /* This file has been heavily modified by Vincent Fourmond for the 'RCR330'
24
+ symbol export scheme
25
+ */
26
+ #ifndef __flate_H__
27
+ #define __flate_H__
28
+
29
+ #include <symbols.h>
30
+
31
+ DECLARE_SYMBOL(int, flate_compress,
32
+ (unsigned char *new_ptr, unsigned long *new_len_ptr,
33
+ unsigned char *ptr, long len));
34
+ // source is given by ptr and is len bytes in length.
35
+ // new_ptr is destination buffer of size *new_len_ptr.
36
+ // NOTE: the destination buffer for flate_compress should be LARGER than the source buffer to be safe.
37
+ // The minimal extra is 0.1% larger than the source plus 12 bytes.
38
+ // My rule is to use (len * 11)/10 + 100 just to be sure.
39
+ DECLARE_SYMBOL(int, flate_expand,
40
+ (unsigned char **new_ptr_ptr, unsigned long *new_len_ptr,
41
+ unsigned char *ptr, long len));
42
+ // source is given by ptr and is len bytes in length.
43
+ // *new_ptr_ptr is destination buffer of size *new_len_ptr.
44
+ // NOTE: the destination buffer for flate_expand will be reallocated if it isn't large enough.
45
+ // So you MUST allocate a buffer rather than using a static one.
46
+ // And you MUST be prepared for the buffer to change location and size.
47
+
48
+ // Here are the return codes for the compression/expansion functions. Negative
49
+ // values are errors, positive values are used for special but normal events.
50
+
51
+ #define FLATE_OK 0
52
+ #define FLATE_STREAM_END 1
53
+ #define FLATE_NEED_DICT 2
54
+ #define FLATE_ERRNO (-1)
55
+ #define FLATE_STREAM_ERROR (-2)
56
+ #define FLATE_DATA_ERROR (-3)
57
+ #define FLATE_MEM_ERROR (-4)
58
+ #define FLATE_BUF_ERROR (-5)
59
+ #define FLATE_VERSION_ERROR (-6)
60
+
61
+ // If this simple interface isn't enough for your needs, the next stop is zlib.h
62
+ // for the full interface.
63
+
64
+ // The internals of this package come from the 'zlib' compression library which
65
+ // carries the following copyright:
66
+
67
+ /* 'zlib' general purpose compression library
68
+ version 1.2.2, October 3rd, 2004
69
+
70
+ Copyright (C) 1995-2004 Jean-loup Gailly and Mark Adler
71
+
72
+ This software is provided 'as-is', without any express or implied
73
+ warranty. In no event will the authors be held liable for any damages
74
+ arising from the use of this software.
75
+
76
+ Permission is granted to anyone to use this software for any purpose,
77
+ including commercial applications, and to alter it and redistribute it
78
+ freely, subject to the following restrictions:
79
+
80
+ 1. The origin of this software must not be misrepresented; you must not
81
+ claim that you wrote the original software. If you use this software
82
+ in a product, an acknowledgment in the product documentation would be
83
+ appreciated but is not required.
84
+ 2. Altered source versions must be plainly marked as such, and must not be
85
+ misrepresented as being the original software.
86
+ 3. This notice may not be removed or altered from any source distribution.
87
+
88
+ Jean-loup Gailly Mark Adler
89
+ jloup@gzip.org madler@alumni.caltech.edu
90
+
91
+
92
+ The data format used by the zlib library is described by RFCs (Request for
93
+ Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt
94
+ (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format).
95
+ */
96
+
97
+
98
+ #endif /* __flate_H__ */
@@ -0,0 +1,524 @@
1
+ /* init.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
+ #include "pdfs.h"
24
+
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;
34
+
35
+ void Init_IDs(void)
36
+ {
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");
42
+ // class variables
43
+ initialized_ID = rb_intern("@@initialized");
44
+ // 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");
54
+
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");
61
+
62
+ tex_preview_fullpage_ID = rb_intern("@tex_preview_fullpage");
63
+ tex_preview_minwhitespace_ID = rb_intern("@tex_preview_minwhitespace");
64
+
65
+ tex_preview_tiogafigure_command_ID = rb_intern("@tex_preview_tiogafigure_command");
66
+
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");
71
+ }
72
+
73
+ void c_set_device_pagesize(FM *p, double width, double height) { // sizes in units of 1/720 inch
74
+ p->page_left = 0;
75
+ p->page_right = width;
76
+ p->page_bottom = 0;
77
+ p->page_top = height;
78
+ p->page_width = p->page_right - p->page_left;
79
+ p->page_height = p->page_top - p->page_bottom;
80
+ p->clip_left = p->page_left;
81
+ p->clip_right = p->page_right;
82
+ p->clip_top = p->page_top;
83
+ p->clip_bottom = p->page_bottom;
84
+ }
85
+
86
+
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");
104
+ p->frame_left = left;
105
+ p->frame_right = right;
106
+ p->frame_bottom = bottom;
107
+ p->frame_top = top;
108
+ p->frame_width = right - left;
109
+ p->frame_height = top - bottom;
110
+ }
111
+
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
+
124
+ void Initialize_Figure(VALUE fmkr) {
125
+ FM *p = Get_FM(fmkr);
126
+ /* Page */
127
+ p->root_figure = true;
128
+ 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);
131
+ /* default frame */
132
+ c_set_frame_sides(p, 0.15, 0.85, 0.85, 0.15);
133
+ /* default bounds */
134
+ p->bounds_left = p->bounds_bottom = p->bounds_xmin = p->bounds_ymin = 0;
135
+ p->bounds_right = p->bounds_top = p->bounds_xmax = p->bounds_ymax = 1;
136
+ p->bounds_width = p->bounds_right - p->bounds_left;
137
+ p->bounds_height = p->bounds_top - p->bounds_bottom;
138
+ /* text attributes */
139
+ p->justification = CENTERED;
140
+ p->alignment = ALIGNED_AT_BASELINE;
141
+ p->label_left_margin = 0; // as fraction of frame width
142
+ p->label_right_margin = 0; // as fraction of frame width
143
+ p->label_top_margin = 0; // as fraction of frame height
144
+ p->label_bottom_margin = 0; // as fraction of frame height
145
+ p->text_shift_on_left = 1.8;
146
+ p->text_shift_on_right = 2.5;
147
+ p->text_shift_on_top = 0.7;
148
+ p->text_shift_on_bottom = 2.0;
149
+ p->text_shift_from_x_origin = 1.8;
150
+ p->text_shift_from_y_origin = 2.0;
151
+ p->default_text_scale = 1.0; Recalc_Font_Hts(p);
152
+ /* graphics attributes */
153
+ p->stroke_color = Qnil;
154
+ p->fill_color = Qnil;
155
+ p->default_line_scale = 1.0;
156
+ p->line_width = 1.2;
157
+ p->line_cap = LINE_CAP_ROUND;
158
+ p->line_join = LINE_JOIN_ROUND;
159
+ p->line_type = Qnil; // means solid line
160
+ p->miter_limit = 2.0;
161
+
162
+ p->stroke_opacity = 1.0;
163
+ p->fill_opacity = 1.0;
164
+
165
+ /* Title */
166
+ p->title_visible = true;
167
+ p->title = Qnil;
168
+ p->title_side = TOP;
169
+ p->title_position = 0.5;
170
+ 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)
172
+ p->title_angle = 0.0;
173
+ p->title_alignment = ALIGNED_AT_BASELINE;
174
+ p->title_justification = CENTERED;
175
+ p->title_color = Qnil;
176
+
177
+ /* X label */
178
+ p->xlabel_visible = true;
179
+ p->xlabel = Qnil;
180
+ p->xlabel_side = BOTTOM;
181
+ p->xlabel_position = 0.5;
182
+ 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)
184
+ p->xlabel_angle = 0.0;
185
+ p->xlabel_alignment = ALIGNED_AT_BASELINE;
186
+ p->xlabel_justification = CENTERED;
187
+ p->xlabel_color = Qnil;
188
+
189
+ /* Y label */
190
+ p->ylabel_visible = true;
191
+ p->ylabel = Qnil;
192
+ p->ylabel_side = LEFT;
193
+ p->ylabel_position = 0.5;
194
+ 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)
196
+ p->ylabel_angle = 0.0;
197
+ p->ylabel_alignment = ALIGNED_AT_BASELINE;
198
+ p->ylabel_justification = CENTERED;
199
+ p->ylabel_color = Qnil;
200
+
201
+ /* X axis */
202
+ p->xaxis_visible = true;
203
+ p->xaxis_type = AXIS_WITH_TICKS_AND_NUMERIC_LABELS;
204
+ p->xaxis_loc = BOTTOM;
205
+ // line
206
+ p->xaxis_line_width = 1.0; // for axis line
207
+ p->xaxis_stroke_color = Qnil; // for axis line and tick marks
208
+ // tick marks
209
+ p->xaxis_major_tick_width = 0.9; // same units as line_width
210
+ p->xaxis_minor_tick_width = 0.7; // same units as line_width
211
+ p->xaxis_major_tick_length = 0.6; // in units of numeric label char heights
212
+ p->xaxis_minor_tick_length = 0.3; // in units of numeric label char heights
213
+ 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
216
+ p->xaxis_tick_interval = 0.0; // set to 0 to use default
217
+ p->xaxis_min_between_major_ticks = 2; // in units of numeric label char heights
218
+ 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
+ // numeric labels on major ticks
222
+ p->xaxis_use_fixed_pt = false;
223
+ 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
+ p->xaxis_numeric_label_decimal_digits = -1; // set to negative to use default
226
+ 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)
228
+ p->xaxis_numeric_label_angle = 0.0;
229
+ p->xaxis_numeric_label_alignment = ALIGNED_AT_MIDHEIGHT;
230
+ p->xaxis_numeric_label_justification = CENTERED;
231
+ p->top_edge_type = EDGE_WITH_TICKS;
232
+ p->top_edge_visible = true;
233
+ p->bottom_edge_type = EDGE_WITH_TICKS;
234
+ p->bottom_edge_visible = true;
235
+
236
+ /* Y axis */
237
+ p->yaxis_visible = true;
238
+ p->yaxis_type = AXIS_WITH_TICKS_AND_NUMERIC_LABELS;
239
+ p->yaxis_loc = LEFT;
240
+ // line
241
+ p->yaxis_line_width = 1.0; // for axis line
242
+ p->yaxis_stroke_color = Qnil; // for axis line and tick marks
243
+ // tick marks
244
+ p->yaxis_major_tick_width = 0.9; // same units as line_width
245
+ p->yaxis_minor_tick_width = 0.7; // same units as line_width
246
+ p->yaxis_major_tick_length = 0.6; // in units of numeric label char heights
247
+ p->yaxis_minor_tick_length = 0.3; // in units of numeric label char heights
248
+ p->yaxis_log_values = false;
249
+ p->yaxis_ticks_inside = true; // inside frame or toward larger x or y value for specific location
250
+ p->yaxis_ticks_outside = false; // inside frame or toward smaller x or y value for specific location
251
+ p->yaxis_tick_interval = 0.0; // set to 0 to use default
252
+ p->yaxis_min_between_major_ticks = 2; // in units of numeric label char heights
253
+ p->yaxis_number_of_minor_intervals = 0; // set to 0 to use default
254
+ p->yaxis_locations_for_major_ticks = Qnil; // set to nil to use defaults
255
+ p->yaxis_locations_for_minor_ticks = Qnil; // set to nil to use defaults
256
+ // numeric labels on major ticks
257
+ p->yaxis_use_fixed_pt = false;
258
+ p->yaxis_digits_max = 0;
259
+ p->yaxis_tick_labels = Qnil; // set to nil to use defaults. else must have a label for each major tick
260
+ p->yaxis_numeric_label_decimal_digits = -1; // set to negative to use default
261
+ p->yaxis_numeric_label_scale = 0.7;
262
+ p->yaxis_numeric_label_shift = 0.5; // in char heights, positive for out from edge (or toward larger x or y value)
263
+ p->yaxis_numeric_label_angle = 0.0;
264
+ p->yaxis_numeric_label_alignment = ALIGNED_AT_MIDHEIGHT;
265
+ p->yaxis_numeric_label_justification = CENTERED;
266
+ p->left_edge_type = EDGE_WITH_TICKS;
267
+ p->left_edge_visible = true;
268
+ p->right_edge_type = EDGE_WITH_TICKS;
269
+ p->right_edge_visible = true;
270
+ /* Legend */
271
+ p->legend_line_x0 = 0.5;
272
+ p->legend_line_x1 = 2.0;
273
+ p->legend_line_dy = 0.4;
274
+ p->legend_text_width = -1;
275
+ p->legend_text_xstart = 2.8;
276
+ p->legend_text_ystart = 2.0;
277
+ p->legend_text_dy = 1.9;
278
+ p->legend_line_width = -1;
279
+ p->legend_scale = 0.6;
280
+ p->legend_alignment = ALIGNED_AT_BASELINE;
281
+ p->legend_justification = LEFT_JUSTIFIED;
282
+ p->debug_verbosity_level = 0;
283
+
284
+ /* emit a warning by default */
285
+ p->croak_on_nonok_numbers = 1;
286
+ }
287
+
288
+ VALUE do_cmd(VALUE fmkr, VALUE cmd) { return rb_funcall(fmkr, do_cmd_ID, 1, cmd); }
289
+
290
+ static void Type_Error(VALUE obj, ID name_ID, char *expected)
291
+ {
292
+ char *name = rb_id2name(name_ID);
293
+ while (name[0] == '@') name++;
294
+ rb_raise(rb_eArgError, "Require %s value for '%s'", expected, name);
295
+ }
296
+
297
+ bool Get_bool(VALUE obj, ID name_ID) {
298
+ VALUE v = rb_ivar_get(obj, name_ID);
299
+ if (v != Qfalse && v != Qtrue && v != Qnil)
300
+ Type_Error(v, name_ID, "true or false");
301
+ return v == Qtrue;
302
+ }
303
+
304
+ int Get_int(VALUE obj, ID name_ID) {
305
+ VALUE v = rb_ivar_get(obj, name_ID);
306
+ if (!rb_obj_is_kind_of(v,rb_Integer_class))
307
+ Type_Error(v, name_ID, "Integer");
308
+ v = rb_Integer(v);
309
+ return NUM2INT(v);
310
+ }
311
+
312
+ double Get_double(VALUE obj, ID name_ID) {
313
+ VALUE v = rb_ivar_get(obj, name_ID);
314
+ if (!rb_obj_is_kind_of(v,rb_Numeric_class))
315
+ Type_Error(v, name_ID, "Numeric");
316
+ v = rb_Float(v);
317
+ return NUM2DBL(v);
318
+ }
319
+
320
+
321
+ char *Get_tex_preview_paper_width(VALUE fmkr) {
322
+ VALUE v = rb_ivar_get(fmkr, tex_preview_paper_width_ID);
323
+ if (v == Qnil) return NULL;
324
+ return StringValuePtr(v);
325
+ }
326
+
327
+ char *Get_tex_preview_paper_height(VALUE fmkr) {
328
+ VALUE v = rb_ivar_get(fmkr, tex_preview_paper_height_ID);
329
+ if (v == Qnil) return NULL;
330
+ return StringValuePtr(v);
331
+ }
332
+
333
+ char *Get_tex_preview_hoffset(VALUE fmkr) {
334
+ VALUE v = rb_ivar_get(fmkr, tex_preview_hoffset_ID);
335
+ if (v == Qnil) return NULL;
336
+ return StringValuePtr(v);
337
+ }
338
+
339
+ char *Get_tex_preview_voffset(VALUE fmkr) {
340
+ VALUE v = rb_ivar_get(fmkr, tex_preview_voffset_ID);
341
+ if (v == Qnil) return NULL;
342
+ return StringValuePtr(v);
343
+ }
344
+
345
+ char *Get_tex_preview_figure_width(VALUE fmkr) {
346
+ VALUE v = rb_ivar_get(fmkr, tex_preview_figure_width_ID);
347
+ if (v == Qnil) return NULL;
348
+ return StringValuePtr(v);
349
+ }
350
+
351
+ char *Get_tex_preview_figure_height(VALUE fmkr) {
352
+ VALUE v = rb_ivar_get(fmkr, tex_preview_figure_height_ID);
353
+ if (v == Qnil) return NULL;
354
+ return StringValuePtr(v);
355
+ }
356
+
357
+
358
+ char *Get_tex_fontsize(VALUE fmkr) {
359
+ VALUE v = rb_ivar_get(fmkr, tex_fontsize_ID);
360
+ if (v == Qnil) return NULL;
361
+ return StringValuePtr(v);
362
+ }
363
+
364
+ char *Get_tex_fontfamily(VALUE fmkr) {
365
+ VALUE v = rb_ivar_get(fmkr, tex_fontfamily_ID);
366
+ if (v == Qnil) return NULL;
367
+ return StringValuePtr(v);
368
+ }
369
+
370
+ char *Get_tex_fontseries(VALUE fmkr) {
371
+ VALUE v = rb_ivar_get(fmkr, tex_fontseries_ID);
372
+ if (v == Qnil) return NULL;
373
+ return StringValuePtr(v);
374
+ }
375
+
376
+ char *Get_tex_fontshape(VALUE fmkr) {
377
+ VALUE v = rb_ivar_get(fmkr, tex_fontshape_ID);
378
+ if (v == Qnil) return NULL;
379
+ return StringValuePtr(v);
380
+ }
381
+
382
+ char *Get_tex_preview_minwhitespace(VALUE fmkr) {
383
+ VALUE v = rb_ivar_get(fmkr, tex_preview_minwhitespace_ID);
384
+ if (v == Qnil) return NULL;
385
+ return StringValuePtr(v);
386
+ }
387
+
388
+ bool Get_tex_preview_fullpage(VALUE fmkr) {
389
+ VALUE v = rb_ivar_get(fmkr, tex_preview_fullpage_ID);
390
+ return v != Qfalse && v != Qnil;
391
+ }
392
+
393
+ /* gets the generated preamble */
394
+ char *Get_tex_preview_generated_preamble(VALUE fmkr) {
395
+ /* it is a class constant... */
396
+ VALUE v = rb_const_get(CLASS_OF(fmkr),
397
+ rb_intern("TEX_PREAMBLE"));
398
+ if (v == Qnil) return NULL;
399
+ return StringValueCStr(v);
400
+ }
401
+
402
+
403
+ double Get_tex_xoffset(VALUE fmkr) { return Get_double(fmkr, tex_xoffset_ID); }
404
+ double Get_tex_yoffset(VALUE fmkr) { return Get_double(fmkr, tex_yoffset_ID); }
405
+
406
+ static char *Get_save_dir(VALUE fmkr) {
407
+ VALUE v = rb_ivar_get(fmkr, save_dir_ID);
408
+ if (v == Qnil) return NULL;
409
+ return StringValuePtr(v);
410
+ }
411
+
412
+ char *Get_tex_preview_documentclass(VALUE fmkr) {
413
+ VALUE v = rb_ivar_get(fmkr, tex_preview_documentclass_ID);
414
+ if (v == Qnil) return NULL;
415
+ return StringValuePtr(v);
416
+ }
417
+
418
+ char *Get_tex_preamble(VALUE fmkr) {
419
+ VALUE v = rb_ivar_get(fmkr, tex_preamble_ID);
420
+ if (v == Qnil) return NULL;
421
+ return StringValuePtr(v);
422
+ }
423
+
424
+ char *Get_xaxis_numeric_label_tex(VALUE fmkr) {
425
+ VALUE v = rb_ivar_get(fmkr, xaxis_numeric_label_tex_ID);
426
+ if (v == Qnil) return NULL;
427
+ return StringValuePtr(v);
428
+ }
429
+
430
+ char *Get_yaxis_numeric_label_tex(VALUE fmkr) {
431
+ VALUE v = rb_ivar_get(fmkr, yaxis_numeric_label_tex_ID);
432
+ if (v == Qnil) return NULL;
433
+ return StringValuePtr(v);
434
+ }
435
+
436
+ char *Get_tex_preview_pagestyle(VALUE fmkr) {
437
+ VALUE v = rb_ivar_get(fmkr, tex_preview_pagestyle_ID);
438
+ if (v == Qnil) return NULL;
439
+ return StringValuePtr(v);
440
+ }
441
+
442
+ char *Get_tex_preview_tiogafigure_command(VALUE fmkr) {
443
+ VALUE v = rb_ivar_get(fmkr, tex_preview_tiogafigure_command_ID);
444
+ if (v == Qnil) return NULL;
445
+ return StringValuePtr(v);
446
+ }
447
+
448
+ static bool Get_quiet_mode(VALUE fmkr) {
449
+ VALUE v = rb_ivar_get(fmkr, quiet_mode_ID);
450
+ return v != Qfalse && v != Qnil;
451
+ }
452
+
453
+ static bool Get_initialized() {
454
+ VALUE v = rb_cvar_get(cFM, initialized_ID);
455
+ return v != Qfalse && v != Qnil;
456
+ }
457
+
458
+ static void Set_initialized() {
459
+ rb_cv_set(cFM, "@@initialized", Qtrue);
460
+ }
461
+
462
+ static void Make_Save_Fname(VALUE fmkr, char *full_name, char *f_name,
463
+ bool with_save_dir, bool with_pdf_extension) {
464
+ int i, j, k, len, mod_len, mod_num, did_mod_num = false;
465
+ char c, *fmt, model[STRLEN], *save=NULL;
466
+ if (with_save_dir) save = Get_save_dir(fmkr);
467
+ if (with_save_dir && save != NULL && strlen(save) > 0) {
468
+ sprintf(full_name, "%s/", save); j = strlen(full_name); }
469
+ else j = 0;
470
+ if (f_name == NULL) f_name = "plot";
471
+ len = strlen(f_name);
472
+ for (i=0; i < len; i++) {
473
+ c = f_name[i];
474
+ full_name[j++] = c;
475
+ }
476
+ full_name[j] = '\0';
477
+ char *dot = strrchr(full_name,'.');
478
+ if (dot == NULL || strcmp(dot+1,"pdf") != 0) { /* add pdf extension */
479
+ full_name[j] = '\0';
480
+ if (!with_pdf_extension) return;
481
+ strcpy(full_name+j, ".pdf");
482
+ }
483
+ }
484
+
485
+ VALUE FM_get_save_filename(VALUE fmkr, VALUE name) {
486
+ char full_name[STRLEN];
487
+ Make_Save_Fname(fmkr, full_name, (name == Qnil)? NULL : StringValuePtr(name), false, false);
488
+ return rb_str_new2(full_name);
489
+ }
490
+
491
+ VALUE FM_private_make(VALUE fmkr, VALUE name, VALUE cmd) {
492
+ char full_name[STRLEN], mod_num_name[STRLEN];
493
+ FM *p = Get_FM(fmkr);
494
+ FM saved = *p;
495
+ VALUE result;
496
+ bool quiet = Get_quiet_mode(fmkr);
497
+ if (!Get_initialized()) {
498
+ Init_pdf();
499
+ Init_tex();
500
+ Set_initialized();
501
+ }
502
+ Make_Save_Fname(fmkr, full_name, (name == Qnil)? NULL : StringValuePtr(name), true, true);
503
+ Open_pdf(fmkr, full_name, quiet);
504
+ Open_tex(fmkr, full_name, quiet);
505
+ Write_gsave();
506
+ p->root_figure = true;
507
+ p->in_subplot = false;
508
+ result = rb_funcall(fmkr, make_page_ID, 1, cmd);
509
+ Write_grestore();
510
+ if (result == Qfalse) quiet = true;
511
+ Close_pdf(fmkr, quiet);
512
+ Close_tex(fmkr, quiet);
513
+ Create_wrapper(fmkr, full_name, quiet);
514
+ *p = saved;
515
+ return result;
516
+ }
517
+
518
+ VALUE FM_private_make_portfolio(VALUE fmkr, VALUE name, VALUE fignums, VALUE fignames) {
519
+ char full_name[STRLEN];
520
+ Make_Save_Fname(fmkr, full_name, (name == Qnil)? NULL : StringValuePtr(name), true, false);
521
+ private_make_portfolio(full_name, fignums, fignames);
522
+ return rb_str_new2(full_name);
523
+ }
524
+