tioga 1.4

Sign up to get free protection for your applications and to get access to all the features.
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
+