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,92 @@
1
+ /*
2
+ Copyright (C) 2006 Vincent Fourmond
3
+
4
+ Symbols is free software; you can redistribute it and/or modify
5
+ it under the terms of the GNU General Library Public License as published
6
+ by the Free Software Foundation; either version 2 of the License, or
7
+ (at your option) any later version.
8
+
9
+ Symbols is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU Library General Public License for more details.
13
+
14
+ You should have received a copy of the GNU Library General Public License
15
+ along with Dvector; if not, write to the Free Software
16
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
+ */
18
+
19
+
20
+ /* Simple code for sharing C symbols across different Ruby libraries */
21
+
22
+ #include <ruby.h>
23
+ #include <intern.h>
24
+
25
+ #include <namespace.h>
26
+
27
+
28
+ /* MV stands for Module Variable */
29
+ #define MV_SYMBOLS "@_exported_C_symbols"
30
+ /* modified to use instance variables instead of global class variables:
31
+ this way, children don't overwrite the parent's export table
32
+ */
33
+
34
+
35
+ /* makes sure that the hash is registered for the given
36
+ module and returns it */
37
+ static VALUE get_symbol_hash(VALUE module)
38
+ {
39
+ VALUE hash;
40
+ ID mv_id = rb_intern(MV_SYMBOLS);
41
+ if(RTEST(rb_ivar_defined(module, mv_id)))
42
+ {
43
+ hash = rb_ivar_get(module, mv_id);
44
+ Check_Type(hash, T_HASH);
45
+ return hash;
46
+ }
47
+ else
48
+ {
49
+ /* module variable uninitialized, we need to make sure it's here */
50
+ hash = rb_hash_new();
51
+ rb_ivar_set(module, mv_id, hash);
52
+ return hash;
53
+ }
54
+ }
55
+
56
+ /* registers a symbol in the given module. This one is the internal
57
+ function */
58
+ PRIVATE void rb_export_symbol(VALUE module, const char * symbol_name,
59
+ void * symbol)
60
+ {
61
+ VALUE hash = get_symbol_hash(module);
62
+ rb_hash_aset(hash, rb_str_new2(symbol_name),LONG2NUM((long) symbol));
63
+ }
64
+
65
+ PRIVATE void * rb_import_symbol_no_raise(VALUE module,
66
+ const char * symbol_name)
67
+ {
68
+ VALUE hash = rb_iv_get(module, MV_SYMBOLS);
69
+ if(TYPE(hash) != T_HASH)
70
+ return NULL; /* doesn't fail, but the importing module
71
+ should definitely check the return value. Beware
72
+ of segfaults ! */
73
+ VALUE symbol = rb_hash_aref(hash, rb_str_new2(symbol_name));
74
+
75
+ if(TYPE(symbol) == T_FIXNUM || TYPE(symbol) == T_BIGNUM)
76
+ return (void *) NUM2LONG(symbol);
77
+ return NULL;
78
+ }
79
+
80
+ /* same as before, but raises something is the return value is NULL,
81
+ which is probably best as a default behavior*/
82
+ PRIVATE void * rb_import_symbol(VALUE module, const char * symbol_name)
83
+ {
84
+ void * symbol = rb_import_symbol_no_raise(module, symbol_name);
85
+ if(symbol)
86
+ return symbol;
87
+ /* we get the name of the module: */
88
+ VALUE module_name = rb_funcall(module, rb_intern("to_s"), 0);
89
+ rb_raise(rb_eRuntimeError, "The symbol %s was not found in "
90
+ "module %s", symbol_name,
91
+ rb_string_value_cstr(&module_name));
92
+ }
@@ -0,0 +1,52 @@
1
+ #ifndef _SYMBOLS_H
2
+ #define _SYMBOLS_H
3
+
4
+ #include <ruby.h>
5
+ /* A small layer for exporting and importing symbols from
6
+ a compiled module */
7
+
8
+ #include <namespace.h>
9
+
10
+
11
+ PRIVATE void rb_export_symbol(VALUE module, const char * symbol_name,
12
+ void * symbol);
13
+ PRIVATE void * rb_import_symbol(VALUE module, const char * symbol_name);
14
+ PRIVATE void * rb_import_symbol_no_raise(VALUE module,
15
+ const char * symbol_name);
16
+
17
+ /* a shortcut for exporting something with the same name */
18
+ #define RB_EXPORT_SYMBOL(module, name) \
19
+ rb_export_symbol(module, #name, name)
20
+
21
+ /* A shortcut for getting a symbol */
22
+
23
+ #define DECLARE_SYMBOL(ret_type,name,args) \
24
+ typedef ret_type (*rb_export_##name##_type) args;\
25
+ PRIVATE rb_export_##name##_type name
26
+
27
+ #define IMPLEMENT_SYMBOL(name)\
28
+ PRIVATE rb_export_##name##_type name = 0;
29
+
30
+ #define RB_IMPORT_SYMBOL(module, name) \
31
+ name = (rb_export_##name##_type) rb_import_symbol(module, #name)
32
+
33
+
34
+ /* These three macro enable a simple use of function declaration: this way,
35
+ you can type in a header file that is used by the importer:
36
+
37
+ DECLARE_SYMBOL(int, biniou, (int, int));
38
+
39
+ in one file of the importer code, you write
40
+
41
+ IMPLEMENT_SYMBOL(biniou);
42
+
43
+ and in the Init_... function, you write:
44
+
45
+ RB_IMPORT_SYMBOL(module, biniou);
46
+
47
+ and you can just use biniou as if it was a function declared as
48
+ usual in the header file
49
+ */
50
+ #endif
51
+
52
+
@@ -0,0 +1,774 @@
1
+ /* axes.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
+ #include "figures.h"
22
+ #include "pdfs.h"
23
+
24
+ typedef struct {
25
+ int type;
26
+ int other_axis_type;
27
+ double line_width;
28
+ VALUE stroke_color;
29
+ double major_tick_width; // same units as line_width
30
+ double minor_tick_width; // same units as line_width
31
+ double major_tick_length; // in units of numeric label char heights
32
+ double minor_tick_length; // in units of numeric label char heights
33
+ bool log_values;
34
+ bool ticks_inside; // inside frame or toward larger x or y value for specific location
35
+ bool ticks_outside; // inside frame or toward smaller x or y value for specific location
36
+ double tick_interval; // set to 0 to use default
37
+ double min_between_major_ticks; // in units of numeric label char heights
38
+ int number_of_minor_intervals; // set to 0 to use default
39
+ VALUE locations_for_major_ticks; // set to nil to use defaults
40
+ VALUE locations_for_minor_ticks; // set to nil to use defaults
41
+ bool use_fixed_pt;
42
+ int digits_max;
43
+ VALUE tick_labels; // set to nil to use defaults
44
+ double numeric_label_scale;
45
+ double numeric_label_shift; // in char heights, positive for out from edge (or toward larger x or y value)
46
+ double numeric_label_angle;
47
+ int numeric_label_alignment;
48
+ int numeric_label_justification;
49
+ int numeric_label_decimal_digits; // set to 0 to use default
50
+ double *majors; /* if not NULL, then points to array of places where major ticks should appear (in figure coords) */
51
+ int nmajors; /* if majors != NULL, then this tells how many entries it contains */
52
+ bool free_majors;
53
+ char **labels; /* if not null, then points to array of strings to use for labels at major ticks */
54
+ /* labels[i] goes with majors[i], so this is only valid if majors is not null */
55
+ bool free_strings_for_labels;
56
+ double x0, y0, x1, y1, length, axis_min, axis_max; // in figure coords
57
+ bool vertical;
58
+ bool reversed;
59
+ bool top_or_right;
60
+ bool other_axis_reversed;
61
+ int num_minors; // number of minor intervals
62
+ double interval; // tick interval
63
+ int location;
64
+ } PlotAxis;
65
+
66
+ static void Init_PlotAxis_struct(PlotAxis *s) {
67
+ s->free_majors = s->free_strings_for_labels = false;
68
+ s->stroke_color = s->locations_for_major_ticks = s->locations_for_minor_ticks = s->tick_labels = Qnil;
69
+ s->majors = NULL;
70
+ s->labels = NULL;
71
+ }
72
+
73
+ static void axis_stroke(FM *p);
74
+ void figure_moveto(FM *p, double x, double y) // figure coords
75
+ {
76
+ c_moveto(p, convert_figure_to_output_x(p,x), convert_figure_to_output_y(p,y));
77
+ }
78
+
79
+ void figure_lineto(FM *p, double x, double y) // figure coords
80
+ {
81
+ c_lineto(p, convert_figure_to_output_x(p,x), convert_figure_to_output_y(p,y));
82
+ }
83
+
84
+ void figure_join(FM *p, double x0, double y0, double x1, double y1) // figure coords
85
+ {
86
+ figure_moveto(p, x0, y0);
87
+ figure_lineto(p, x1, y1);
88
+ }
89
+
90
+ static void axis_stroke(FM *p)
91
+ {
92
+ FM_stroke(p->fm);
93
+ }
94
+
95
+ void figure_join_and_stroke(FM *p, double x0, double y0, double x1, double y1) // figure coords
96
+ {
97
+ figure_join(p, x0, y0, x1, y1);
98
+ FM_stroke(p->fm);
99
+ }
100
+
101
+ static void Get_xaxis_Specs(FM *p, PlotAxis *s)
102
+ {
103
+ s->type = p->xaxis_type;
104
+ s->other_axis_type = p->yaxis_type;
105
+ s->line_width = p->xaxis_line_width; // for axis line
106
+ s->stroke_color = p->xaxis_stroke_color; // for axis line and tick marks
107
+ s->major_tick_width = p->xaxis_major_tick_width; // same units as line_width
108
+ s->minor_tick_width = p->xaxis_minor_tick_width; // same units as line_width
109
+ s->major_tick_length = p->xaxis_major_tick_length; // in units of numeric label char heights
110
+ s->minor_tick_length = p->xaxis_minor_tick_length; // in units of numeric label char heights
111
+ s->log_values = p->xaxis_log_values;
112
+ s->ticks_inside = p->xaxis_ticks_inside; // inside frame or toward larger x or y value for specific location
113
+ s->ticks_outside = p->xaxis_ticks_outside; // inside frame or toward smaller x or y value for specific location
114
+ s->tick_interval = p->xaxis_tick_interval; // set to 0 to use default
115
+ s->min_between_major_ticks = p->xaxis_min_between_major_ticks; // in units of numeric label char heights
116
+ s->number_of_minor_intervals = p->xaxis_number_of_minor_intervals; // set to 0 to use default
117
+ s->locations_for_major_ticks = p->xaxis_locations_for_major_ticks; // set to nil to use defaults
118
+ s->locations_for_minor_ticks = p->xaxis_locations_for_minor_ticks; // set to nil to use defaults
119
+ s->use_fixed_pt = p->xaxis_use_fixed_pt;
120
+ s->digits_max = p->xaxis_digits_max;
121
+ s->tick_labels = p->xaxis_tick_labels; // set to nil to use defaults. else must have a label for each major tick
122
+ s->numeric_label_decimal_digits = p->xaxis_numeric_label_decimal_digits; // set to negative to use default
123
+ s->numeric_label_scale = p->xaxis_numeric_label_scale;
124
+ s->numeric_label_shift = p->xaxis_numeric_label_shift; // in char heights, positive for out from edge (or toward larger x or y value)
125
+ s->numeric_label_angle = p->xaxis_numeric_label_angle;
126
+ s->numeric_label_alignment = p->xaxis_numeric_label_alignment;
127
+ s->numeric_label_justification = p->xaxis_numeric_label_justification;
128
+ }
129
+
130
+ static void Get_yaxis_Specs(FM *p, PlotAxis *s)
131
+ {
132
+ s->type = p->yaxis_type;
133
+ s->other_axis_type = p->xaxis_type;
134
+ s->line_width = p->yaxis_line_width; // for axis line
135
+ s->stroke_color = p->yaxis_stroke_color; // for axis line and tick marks
136
+ s->major_tick_width = p->yaxis_major_tick_width; // same units as line_width
137
+ s->minor_tick_width = p->yaxis_minor_tick_width; // same units as line_width
138
+ s->major_tick_length = p->yaxis_major_tick_length; // in units of numeric label char heights
139
+ s->minor_tick_length = p->yaxis_minor_tick_length; // in units of numeric label char heights
140
+ s->log_values = p->yaxis_log_values;
141
+ s->ticks_inside = p->yaxis_ticks_inside; // inside frame or toward larger x or y value for specific location
142
+ s->ticks_outside = p->yaxis_ticks_outside; // inside frame or toward smaller x or y value for specific location
143
+ s->tick_interval = p->yaxis_tick_interval; // set to 0 to use default
144
+ s->min_between_major_ticks = p->yaxis_min_between_major_ticks; // in units of numeric label char heights
145
+ s->number_of_minor_intervals = p->yaxis_number_of_minor_intervals; // set to 0 to use default
146
+ s->locations_for_major_ticks = p->yaxis_locations_for_major_ticks; // set to nil to use defaults
147
+ s->locations_for_minor_ticks = p->yaxis_locations_for_minor_ticks; // set to nil to use defaults
148
+ s->use_fixed_pt = p->yaxis_use_fixed_pt;
149
+ s->digits_max = p->yaxis_digits_max;
150
+ s->tick_labels = p->yaxis_tick_labels; // set to nil to use defaults. else must have a label for each major tick
151
+ s->numeric_label_decimal_digits = p->yaxis_numeric_label_decimal_digits; // set to negative to use default
152
+ s->numeric_label_scale = p->yaxis_numeric_label_scale;
153
+ s->numeric_label_shift = p->yaxis_numeric_label_shift; // in char heights, positive for out from edge (or toward larger x or y value)
154
+ s->numeric_label_angle = p->yaxis_numeric_label_angle;
155
+ s->numeric_label_alignment = p->yaxis_numeric_label_alignment;
156
+ s->numeric_label_justification = p->yaxis_numeric_label_justification;
157
+ }
158
+
159
+ /*======================================================================*/
160
+
161
+ static void draw_axis_line(FM *p, int location, PlotAxis *s)
162
+ {
163
+ switch (location) {
164
+ case LEFT:
165
+ s->x0 = p->bounds_left;
166
+ s->x1 = p->bounds_left;
167
+ s->y0 = p->bounds_bottom;
168
+ s->y1 = p->bounds_top;
169
+ s->length = p->bounds_height;
170
+ s->axis_min = p->bounds_ymin;
171
+ s->axis_max = p->bounds_ymax;
172
+ s->vertical = true;
173
+ s->reversed = p->yaxis_reversed;
174
+ s->other_axis_reversed = p->xaxis_reversed;
175
+ s->top_or_right = false;
176
+ break;
177
+ case RIGHT:
178
+ s->x0 = p->bounds_right;
179
+ s->x1 = p->bounds_right;
180
+ s->y0 = p->bounds_bottom;
181
+ s->y1 = p->bounds_top;
182
+ s->length = p->bounds_height;
183
+ s->axis_min = p->bounds_ymin;
184
+ s->axis_max = p->bounds_ymax;
185
+ s->vertical = true;
186
+ s->reversed = p->yaxis_reversed;
187
+ s->other_axis_reversed = p->xaxis_reversed;
188
+ s->top_or_right = true;
189
+ break;
190
+ case TOP:
191
+ s->x0 = p->bounds_left;
192
+ s->x1 = p->bounds_right;
193
+ s->y0 = p->bounds_top;
194
+ s->y1 = p->bounds_top;
195
+ s->length = p->bounds_width;
196
+ s->axis_min = p->bounds_xmin;
197
+ s->axis_max = p->bounds_xmax;
198
+ s->vertical = false;
199
+ s->reversed = p->xaxis_reversed;
200
+ s->other_axis_reversed = p->yaxis_reversed;
201
+ s->top_or_right = true;
202
+ break;
203
+ case BOTTOM:
204
+ s->x0 = p->bounds_left;
205
+ s->x1 = p->bounds_right;
206
+ s->y0 = p->bounds_bottom;
207
+ s->y1 = p->bounds_bottom;
208
+ s->length = p->bounds_width;
209
+ s->axis_min = p->bounds_xmin;
210
+ s->axis_max = p->bounds_xmax;
211
+ s->vertical = false;
212
+ s->reversed = p->xaxis_reversed;
213
+ s->other_axis_reversed = p->yaxis_reversed;
214
+ s->top_or_right = false;
215
+ break;
216
+ case AT_X_ORIGIN:
217
+ s->x0 = 0.0;
218
+ s->x1 = 0.0;
219
+ s->y0 = p->bounds_bottom;
220
+ s->y1 = p->bounds_top;
221
+ s->length = p->bounds_height;
222
+ s->axis_min = p->bounds_ymin;
223
+ s->axis_max = p->bounds_ymax;
224
+ s->vertical = true;
225
+ s->reversed = p->yaxis_reversed;
226
+ s->other_axis_reversed = p->xaxis_reversed;
227
+ s->top_or_right = false;
228
+ break;
229
+ case AT_Y_ORIGIN:
230
+ s->x0 = p->bounds_left;
231
+ s->x1 = p->bounds_right;
232
+ s->y0 = 0.0;
233
+ s->y1 = 0.0;
234
+ s->length = p->bounds_width;
235
+ s->axis_min = p->bounds_xmin;
236
+ s->axis_max = p->bounds_xmax;
237
+ s->vertical = false;
238
+ s->reversed = p->xaxis_reversed;
239
+ s->other_axis_reversed = p->yaxis_reversed;
240
+ s->top_or_right = false;
241
+ break;
242
+ }
243
+ c_line_width_set(p, s->line_width);
244
+ figure_join_and_stroke(p, s->x0, s->y0, s->x1, s->y1);
245
+ }
246
+
247
+ static char *Create_Label(double value, int scale, int prec, bool log_values, bool use_fixed_pt, char *postfix, PlotAxis *s)
248
+ { // value in figure coords
249
+ char buff[100], *string;
250
+ int exponent = ROUND(value);
251
+ buff[0] = 0;
252
+ if (log_values && use_fixed_pt) { /* Logarithmic */
253
+ double sav_val = value, pow_val;
254
+ value = pow(10.0, exponent);
255
+ pow_val = pow(10.0, sav_val);
256
+ if (exponent < 0) {
257
+ char form[60];
258
+ int numdig = ABS(exponent)+1;
259
+ sprintf(form, (s->vertical)? "\\tiogayaxisnumericlabel{%%.%df}" : "\\tiogaxaxisnumericlabel{%%.%df}", numdig);
260
+ sprintf(buff, form, pow_val);
261
+ } else if (abs(value - pow_val) > 0.1) {
262
+ sprintf(buff, (s->vertical)? "\\tiogayaxisnumericlabel{%0.2f}" : "\\tiogaxaxisnumericlabel{%0.2f}", pow_val);
263
+ } else {
264
+ sprintf(buff, (s->vertical)? "\\tiogayaxisnumericlabel{%d}" : "\\tiogaxaxisnumericlabel{%d}", (int) value);
265
+ }
266
+ } else if (log_values) {
267
+ /* Exponential, i.e. 10^-1, 1, 10, 10^2, etc */
268
+ double abs_diff = fabs(value - exponent);
269
+ if (abs_diff > 0.1) sprintf(buff, (s->vertical)? "\\tiogayaxisnumericlabel{10^{%0.1f}}" : "\\tiogaxaxisnumericlabel{10^{%0.1f}}", value);
270
+ else if (exponent == 0) strcpy(buff, "1");
271
+ else if (exponent == 1) strcpy(buff, "10");
272
+ else sprintf(buff, (s->vertical)? "\\tiogayaxisnumericlabel{10^{%d}}" : "\\tiogaxaxisnumericlabel{10^{%d}}", exponent);
273
+ } else { /* Linear */
274
+ char form[10];
275
+ double scale2;
276
+ int precis = s->numeric_label_decimal_digits; // use this precision if it is >= 0
277
+ if (precis >= 0) prec = precis;
278
+ if (scale) value /= pow(10.,(double)scale);
279
+ /* This is necessary to prevent labels like "-0.0" on some systems */
280
+ scale2 = pow(10., prec);
281
+ value = floor((value * scale2) + .5) / scale2;
282
+ sprintf(form, (s->vertical)? "\\tiogayaxisnumericlabel{%%.%df}" : "\\tiogaxaxisnumericlabel{%%.%df}", (int) prec);
283
+ sprintf(buff, form, value);
284
+ }
285
+ int len = strlen(buff);
286
+ if (postfix != NULL) { strcpy(buff+len, postfix); len = strlen(buff); }
287
+ string = ALLOC_N(char, len+1);
288
+ strcpy(string, buff);
289
+ return string;
290
+ }
291
+
292
+ char *Get_String(VALUE ary, int index) {
293
+ VALUE string = rb_ary_entry(ary, index);
294
+ return StringValuePtr(string);
295
+ }
296
+
297
+ #define MIN_FLTDIG 3
298
+ #define MAX_FIXDIG_POS 6
299
+ #define MAX_FIXDIG_NEG 4
300
+ #define DIGMAX_DEF 5
301
+
302
+ static void Pick_Label_Precision(double vmin, double vmax, double tick, bool use_fixed_pt,
303
+ int *mode, int *prec, int digmax, int *scale) {
304
+ double chosen, notchosen, vmod, t0, shifted;
305
+ int msd, notmsd, np, digmin, digfix;
306
+ *mode = *scale = 0;
307
+ if (digmax == 0) digmax = DIGMAX_DEF;
308
+ /* Choose vmin or vmax depending on magnitudes of vmin and vmax. */
309
+ if (ABS(vmax) >= ABS(vmin)) { chosen = vmax; notchosen = vmin; }
310
+ else { chosen = vmin; notchosen = vmax; }
311
+ /* Magnitute of chosen to get number of significant digits */
312
+
313
+ if(ABS(chosen) > 0.) {
314
+ vmod = ABS(chosen);
315
+ t0 = (double) log10(vmod);
316
+ msd = (int) floor(t0);
317
+ }
318
+ else {
319
+ /* this branch occurs only when 0. --- 0. range put in */
320
+ vmod = 1.;
321
+ t0 = (double) log10(vmod);
322
+ msd = (int) floor(t0);
323
+ }
324
+ if (ABS(notchosen) > 0.) notmsd = (int) floor( (double) log10(ABS(notchosen)));
325
+ else notmsd = msd;
326
+ /* Autoselect the mode flag */
327
+ /* 'digmin' is the minimum number of places taken up by the label */
328
+
329
+ if (msd >= 0) {
330
+ /* n.b. no decimal point in the minimal case */
331
+ digmin = msd + 1;
332
+ digfix = MAX_FIXDIG_POS;
333
+ if (digmax > 0) digfix = MIN(digmax, MAX_FIXDIG_POS);
334
+ }
335
+ else {
336
+ /* adjust digmin to account for leading 0 and decimal point */
337
+ digmin = -msd + 2;
338
+ digfix = MAX_FIXDIG_NEG;
339
+ if (digmax > 0) digfix = MIN(digmax, MAX_FIXDIG_NEG);
340
+ }
341
+ /* adjust digmin to account for sign on the chosen end of axis or sign on the
342
+ * nonchosen end of axis if notmsd = msd or (msd <= 0 and notmsd < 0)
343
+ * For the latter case the notchosen label starts with "-0."
344
+ * For checking for the latter case, the notmsd < 0 condition is redundant
345
+ * since notmsd <= msd always and the equal part is selected by the first
346
+ * condition.
347
+ */
348
+ if(chosen < 0.0 || (notchosen < 0. && (notmsd == msd || msd <= 0))) digmin++;
349
+
350
+ if (digmin > digfix && !use_fixed_pt) { *mode = 1; *scale = msd; }
351
+
352
+ /* Establish precision. */
353
+ /* It must be fine enough to resolve the tick spacing */
354
+
355
+ shifted = tick; np = 0;
356
+ while (ABS(shifted) < 1.0 && np > -6) { np--; shifted *= 10.0; }
357
+ for (; np > -6; np--, shifted *= 10.0) {
358
+ if (ABS(shifted - floor(shifted)) < 0.1) break;
359
+ }
360
+
361
+ if (*mode != 0) *prec = msd - np;
362
+ else *prec = MAX(-np, 0);
363
+
364
+ /* One last hack required: if exponent < 0, i.e. number has leading '0.',
365
+ * it's better to change to floating point form if the number of digits
366
+ * is insufficient to represent the tick spacing.
367
+ */
368
+ if (*mode == 0 && digmax > 0 && !use_fixed_pt) {
369
+ if (t0 < 0.0) {
370
+ if (digmax - 2 - *prec < 0) { *mode = 1; *scale = msd; }
371
+ } else *prec = MAX(MIN(*prec, digmax - msd - 1), 0);
372
+ }
373
+ if (*mode != 0) {
374
+ *prec = msd - np;
375
+ *prec = *scale - floor(log10(tick));
376
+ *prec = MIN(*prec,MAX(0,*prec));
377
+ }
378
+
379
+ }
380
+
381
+ static char **Get_Labels(FM *p, PlotAxis *s)
382
+ {
383
+ char **labels = (char **)ALLOC_N(char *, s->nmajors);
384
+ char postfix[50], *ps;
385
+ int i;
386
+ if (s->tick_labels==Qnil) { // create label strings
387
+ int mode, prec, scale;
388
+ Pick_Label_Precision(s->axis_min, s->axis_max, s->interval, s->use_fixed_pt, &mode, &prec, s->digits_max, &scale);
389
+ int i, upper_right = (s->reversed)? 0 : s->nmajors-1, lower_left = (s->reversed)? s->nmajors-1 : 0;
390
+ for (i = 0; i < s->nmajors; i++) {
391
+ ps = NULL;
392
+ if (i == upper_right && !s->log_values && mode && scale)
393
+ sprintf(ps = postfix,
394
+ (s->vertical)? " (x\\tiogayaxisnumericlabel{10^{%d}})" : " (x\\tiogaxaxisnumericlabel{10^{%d}})",
395
+ scale);
396
+ if (i == lower_left && s->nmajors >= 2 && s->vertical &&
397
+ (s->majors[i] == ((s->reversed)? s->axis_max : s->axis_min)) &&
398
+ (s->other_axis_type == AXIS_WITH_MAJOR_TICKS_AND_NUMERIC_LABELS ||
399
+ s->other_axis_type == AXIS_WITH_TICKS_AND_NUMERIC_LABELS)) {
400
+ labels[i] = NULL;
401
+ } else {
402
+ labels[i] = Create_Label(s->majors[i], scale, prec, s->log_values, s->use_fixed_pt, ps, s);
403
+ }
404
+ }
405
+ s->free_strings_for_labels = true;
406
+ } else { // use the given label strings
407
+ VALUE ary = rb_Array(s->tick_labels);
408
+ if (RARRAY(ary)->len != s->nmajors)
409
+ rb_raise(rb_eArgError, "Sorry: must have same number of labels as major ticks");
410
+ for (i = 0; i < s->nmajors; i++) {
411
+ labels[i] = Get_String(ary, i);
412
+ }
413
+ s->free_strings_for_labels = false;
414
+ }
415
+ return labels;
416
+ }
417
+
418
+ static double *Pick_Locations_for_Major_Ticks(double interval, double axis_min, double axis_max, int *num_locations)
419
+ {
420
+ double next_tick, prev_tick, starting_tick;
421
+ double *majors;
422
+ int nmajors, i;
423
+ while (true) {
424
+ nmajors = 0;
425
+ starting_tick = interval * floor(axis_min / interval);
426
+ if (starting_tick == axis_min) starting_tick -= interval;
427
+ prev_tick = starting_tick;
428
+ while (true) {
429
+ next_tick = prev_tick + interval;
430
+ if (next_tick > axis_max) break;
431
+ nmajors++;
432
+ prev_tick = next_tick;
433
+ }
434
+ if (nmajors > 1) break;
435
+ interval *= 0.5;
436
+ }
437
+ majors = ALLOC_N(double, nmajors);
438
+ prev_tick = starting_tick;
439
+ for (i=0; i < nmajors; i++) {
440
+ majors[i] = prev_tick += interval;
441
+ }
442
+ *num_locations = nmajors;
443
+ return majors;
444
+ }
445
+
446
+ static int Pick_Number_of_Minor_Intervals(double length)
447
+ {
448
+ double t1, fuzz, newlen;
449
+ int np, num_subintervals, inewlen;
450
+ t1 = (double) log10(length);
451
+ np = (int) floor(t1);
452
+ t1 -= np;
453
+ newlen = pow(10.0, t1);
454
+ inewlen = (int) floor(newlen + 0.5);
455
+ fuzz = newlen - inewlen;
456
+ fuzz = abs(fuzz);
457
+ num_subintervals = 4;
458
+ if (fuzz < 1e-2) {
459
+ switch (inewlen) {
460
+ case 0: case 1: case 2: num_subintervals = 4; break;
461
+ case 4: break;
462
+ case 8: case 10: num_subintervals = 2; break;
463
+ case 3: case 6: case 9: num_subintervals = 3; break;
464
+ default: num_subintervals = 5;
465
+ }
466
+ } else {
467
+ if (newlen > 5.0) num_subintervals = 4;
468
+ else if (newlen > 3.0) num_subintervals = 5;
469
+ else if (newlen > 1.5) num_subintervals = 5;
470
+ }
471
+ return num_subintervals;
472
+ }
473
+
474
+ static void Pick_Major_Tick_Interval(FM *p, double tick_min, double tick_gap, double length, bool log_values, double *tick)
475
+ {
476
+ double t1, t2, tick_reasonable, base_interval;
477
+ int np, i;
478
+ /* Magnitude of min/max difference to get tick spacing */
479
+ t1 = (double) log10(length);
480
+ np = (int) floor(t1);
481
+ t1 -= np;
482
+ t1 = pow(10.0, t1);
483
+ /* Get tick spacing. */
484
+ if (t1 > 6.0) t2 = 2.0;
485
+ else if (t1 > 3.0) t2 = 1.0;
486
+ else if (t1 > 1.5) { t2 = 5.0; np--; }
487
+ else { t2 = 2.0; np--; }
488
+ /* Now compute reasonable tick spacing */
489
+ if (log_values) {
490
+ tick_reasonable = 1.0;
491
+ } else {
492
+ base_interval = pow(10.0, (double) np);
493
+ if (t2 == 2.0 && t2 * base_interval < tick_gap) t2 = 1.0;
494
+ i = 0;
495
+ while (i < 100) {
496
+ tick_reasonable = t2 * base_interval;
497
+ if (tick_reasonable >= tick_min) break;
498
+ t2++; i++;
499
+ }
500
+ }
501
+ if (*tick == 0) *tick = tick_reasonable;
502
+ else { // check the given interval compared to the default
503
+ *tick = ABS(*tick);
504
+ if(*tick < 1.e-4*tick_reasonable) {
505
+ rb_raise(rb_eArgError, "Sorry: magnitude of specified tick interval (%g) is too small", *tick);
506
+ }
507
+ }
508
+ }
509
+
510
+ static void draw_major_ticks(FM *p, PlotAxis *s)
511
+ {
512
+ s->num_minors = s->number_of_minor_intervals;
513
+ if (s->locations_for_major_ticks != Qnil) {
514
+ long len;
515
+ s->majors = Dvector_Data_for_Read(s->locations_for_major_ticks, &len);
516
+ s->nmajors = len;
517
+ if (len > 1) {
518
+ s->interval = s->majors[1] - s->majors[0];
519
+ if (s->interval < 0.0) { s->interval = -s->interval; }
520
+ }
521
+ } else { // calculate major tick locations
522
+ s->interval = s->tick_interval;
523
+ double height = ((s->vertical)? p->default_text_height_dy : p->default_text_height_dx);
524
+ double tick_min = s->min_between_major_ticks * height;
525
+ double tick_gap = 10.0 * height;
526
+ Pick_Major_Tick_Interval(p, tick_min, tick_gap, s->length, s->log_values, &s->interval);
527
+ s->majors = Pick_Locations_for_Major_Ticks(s->interval, s->axis_min, s->axis_max, &s->nmajors);
528
+ s->free_majors = true;
529
+ }
530
+ int i;
531
+ double inside=0.0, outside=0.0, length;
532
+ bool did_line = false;
533
+ length = s->major_tick_length * ((s->vertical)? p->default_text_height_dx : p->default_text_height_dy);
534
+ if (s->ticks_inside) inside = length;
535
+ if (s->ticks_outside) outside = length;
536
+ if (s->top_or_right) { inside = -inside; outside = -outside; }
537
+ if (s->line_width != s->major_tick_width)
538
+ c_line_width_set(p, s->line_width = s->major_tick_width);
539
+ for (i=0; i < s->nmajors; i++) {
540
+ if (s->vertical)
541
+ figure_join(p, s->x0+inside, s->majors[i], s->x0+outside, s->majors[i]);
542
+ else
543
+ figure_join(p, s->majors[i], s->y0+inside, s->majors[i], s->y0+outside);
544
+ did_line = true;
545
+ }
546
+ if (did_line) axis_stroke(p);
547
+ }
548
+
549
+ static double log_subintervals[8] =
550
+ {
551
+ 0.301030, 0.477121, 0.602060, 0.698970,
552
+ 0.778151, 0.845098, 0.903090, 0.954243
553
+ };
554
+
555
+ static void draw_minor_ticks(FM *p, PlotAxis *s)
556
+ {
557
+ if (s->number_of_minor_intervals <= 0) {
558
+ if (s->log_values) {
559
+ double interval = s->majors[1] - s->majors[0];
560
+ s->number_of_minor_intervals = (abs(interval) != 1.0 || s->nmajors > 4)? 1 : 9;
561
+ } else s->number_of_minor_intervals = Pick_Number_of_Minor_Intervals(s->interval);
562
+ }
563
+ int i, j, nsub = s->number_of_minor_intervals;
564
+ double inside=0.0, outside=0.0, length;
565
+ bool did_line = false;
566
+ if (s->log_values && nsub > 9) nsub = 9;
567
+ length = s->minor_tick_length * ((s->vertical)? p->default_text_height_dx : p->default_text_height_dy);
568
+ if (s->ticks_inside) inside = length;
569
+ if (s->ticks_outside) outside = length;
570
+ if (s->top_or_right) { inside = -inside; outside = -outside; }
571
+ if (s->line_width != s->minor_tick_width)
572
+ c_line_width_set(p, s->line_width = s->minor_tick_width);
573
+ if (s->locations_for_minor_ticks != Qnil) {
574
+ long cnt;
575
+ double *locs = Dvector_Data_for_Read(s->locations_for_minor_ticks, &cnt);
576
+ for (i=0; i < cnt; i++) {
577
+ if (s->vertical)
578
+ figure_join(p, s->x0+inside, locs[i], s->x0+outside, locs[i]);
579
+ else
580
+ figure_join(p, locs[i], s->y0+inside, locs[i], s->y0+outside);
581
+ did_line = true;
582
+ }
583
+ } else {
584
+ for (i=0; i <= s->nmajors; i++) {
585
+ double loc = (i==0)? s->majors[0] - s->interval : s->majors[i-1];
586
+ double next_loc = (i==s->nmajors)? loc + s->interval : s->majors[i];
587
+ double subinterval = (next_loc - loc) / nsub;
588
+ if (subinterval <= 0.0) continue;
589
+ for (j = 1; j < nsub; j++) {
590
+ double subloc = loc + ((!s->log_values) ? (j * subinterval) : log_subintervals[j-1]);
591
+ if (subloc >= next_loc) break;
592
+ if (subloc <= s->axis_min || subloc >= s->axis_max) continue;
593
+ if (s->vertical)
594
+ figure_join(p, s->x0+inside, subloc, s->x0+outside, subloc);
595
+ else
596
+ figure_join(p, subloc, s->y0+inside, subloc, s->y0+outside);
597
+ did_line = true;
598
+ }
599
+ }
600
+ }
601
+ if (did_line) axis_stroke(p);
602
+ }
603
+
604
+ static void show_numeric_label(FM *p , VALUE fmkr, PlotAxis *s, char *text, int location, double position, double shift)
605
+ { // position is in figure coords and must be converted to frame coords
606
+ double pos = ((!s->reversed)? (position - s->axis_min) : (s->axis_max - position)) / s->length;
607
+ c_show_rotated_text(p, text, location, shift, pos,
608
+ s->numeric_label_scale, s->numeric_label_angle, s->numeric_label_justification, s->numeric_label_alignment);
609
+ }
610
+
611
+ static void draw_numeric_labels(FM *p , VALUE fmkr, int location, PlotAxis *s)
612
+ {
613
+ int i;
614
+ double shift = (s->ticks_outside) ? s->major_tick_length : 0.5; // default shift
615
+ shift += s->numeric_label_shift;
616
+ s->labels = Get_Labels(p, s);
617
+ for (i=0; i < s->nmajors; i++) {
618
+ if (s->labels[i] != NULL) show_numeric_label(p, fmkr, s, s->labels[i], location, s->majors[i], shift);
619
+ }
620
+ }
621
+
622
+ static void c_show_side(VALUE fmkr, FM *p, PlotAxis *s) {
623
+ int i;
624
+ if (s->type == AXIS_HIDDEN) return;
625
+ Start_Axis_Standard_State(p, s->stroke_color, s->line_width * p->default_line_scale);
626
+ // gsave, set line type and stroke color
627
+ draw_axis_line(p, s->location, s);
628
+ if (s->type == AXIS_LINE_ONLY) goto done;
629
+ draw_major_ticks(p, s);
630
+ if (s->type == AXIS_WITH_MAJOR_TICKS_ONLY) goto done;
631
+ if (s->type == AXIS_WITH_MAJOR_TICKS_AND_NUMERIC_LABELS) {
632
+ draw_numeric_labels(p, fmkr, s->location, s);
633
+ goto done;
634
+ }
635
+ draw_minor_ticks(p, s);
636
+ if (s->type == AXIS_WITH_TICKS_ONLY) goto done;
637
+ draw_numeric_labels(p, fmkr, s->location, s);
638
+ done:
639
+ End_Axis_Standard_State(); // grestore
640
+ if (s->free_majors) free(s->majors);
641
+ if (s->labels != NULL) {
642
+ if (s->free_strings_for_labels) {
643
+ for (i = 0; i < s->nmajors; i++)
644
+ if (s->labels[i] != NULL) free(s->labels[i]);
645
+ }
646
+ free(s->labels);
647
+ }
648
+ }
649
+
650
+ VALUE FM_show_axis(VALUE fmkr, VALUE loc)
651
+ {
652
+ FM *p = Get_FM(fmkr);
653
+ PlotAxis axis;
654
+ int location;
655
+ Init_PlotAxis_struct(&axis);
656
+ loc = rb_Integer(loc);
657
+ location = NUM2INT(loc);
658
+ if (location == LEFT || location == RIGHT || location == AT_X_ORIGIN) {
659
+ if (!p->yaxis_visible) goto done;
660
+ Get_yaxis_Specs(p, &axis);
661
+ } else if (location == TOP || location == BOTTOM || location == AT_Y_ORIGIN) {
662
+ if (!p->xaxis_visible) goto done;
663
+ Get_xaxis_Specs(p, &axis);
664
+ } else rb_raise(rb_eArgError,
665
+ "Sorry: invalid 'loc' for axis: must be one of LEFT, RIGHT, TOP, BOTTOM, AT_X_ORIGIN, or AT_Y_ORIGIN: is (%i)", location);
666
+ axis.location = location;
667
+ c_show_side(fmkr, p, &axis);
668
+ done:
669
+ return fmkr;
670
+ }
671
+
672
+ VALUE FM_show_edge(VALUE fmkr, VALUE loc) {
673
+ FM *p = Get_FM(fmkr);
674
+ PlotAxis axis;
675
+ int location;
676
+ Init_PlotAxis_struct(&axis);
677
+ loc = rb_Integer(loc);
678
+ location = NUM2INT(loc);
679
+ switch (location) {
680
+ case LEFT:
681
+ if (!p->left_edge_visible) goto done;
682
+ Get_yaxis_Specs(p, &axis); axis.type = p->left_edge_type;
683
+ break;
684
+ case RIGHT:
685
+ if (!p->right_edge_visible) goto done;
686
+ Get_yaxis_Specs(p, &axis); axis.type = p->right_edge_type;
687
+ break;
688
+ case BOTTOM:
689
+ if (!p->bottom_edge_visible) goto done;
690
+ Get_xaxis_Specs(p, &axis); axis.type = p->bottom_edge_type;
691
+ break;
692
+ case TOP:
693
+ if (!p->top_edge_visible) goto done;
694
+ Get_xaxis_Specs(p, &axis); axis.type = p->top_edge_type;
695
+ break;
696
+ default: rb_raise(rb_eArgError,
697
+ "Sorry: invalid 'loc' for edge: must be one of LEFT, RIGHT, TOP, or BOTTOM: is (%i)", location);
698
+ }
699
+ axis.location = location;
700
+ c_show_side(fmkr, p, &axis);
701
+ done:
702
+ return fmkr;
703
+ }
704
+
705
+
706
+ VALUE FM_no_title(VALUE fmkr)
707
+ {
708
+ FM *p = Get_FM(fmkr);
709
+ p->title_visible = false;
710
+ return fmkr;
711
+ }
712
+
713
+ VALUE FM_no_xlabel(VALUE fmkr)
714
+ {
715
+ FM *p = Get_FM(fmkr);
716
+ p->xlabel_visible = false;
717
+ return fmkr;
718
+ }
719
+
720
+
721
+ VALUE FM_no_ylabel(VALUE fmkr)
722
+ {
723
+ FM *p = Get_FM(fmkr);
724
+ p->ylabel_visible = false;
725
+ return fmkr;
726
+ }
727
+
728
+
729
+ VALUE FM_no_xaxis(VALUE fmkr)
730
+ {
731
+ FM *p = Get_FM(fmkr);
732
+ p->xaxis_visible = false;
733
+ return fmkr;
734
+ }
735
+
736
+
737
+ VALUE FM_no_yaxis(VALUE fmkr)
738
+ {
739
+ FM *p = Get_FM(fmkr);
740
+ p->yaxis_visible = false;
741
+ return fmkr;
742
+ }
743
+
744
+
745
+ VALUE FM_no_left_edge(VALUE fmkr)
746
+ {
747
+ FM *p = Get_FM(fmkr);
748
+ p->left_edge_visible = false;
749
+ return fmkr;
750
+ }
751
+
752
+
753
+ VALUE FM_no_right_edge(VALUE fmkr)
754
+ {
755
+ FM *p = Get_FM(fmkr);
756
+ p->right_edge_visible = false;
757
+ return fmkr;
758
+ }
759
+
760
+
761
+ VALUE FM_no_top_edge(VALUE fmkr)
762
+ {
763
+ FM *p = Get_FM(fmkr);
764
+ p->top_edge_visible = false;
765
+ return fmkr;
766
+ }
767
+
768
+ VALUE FM_no_bottom_edge(VALUE fmkr)
769
+ {
770
+ FM *p = Get_FM(fmkr);
771
+ p->bottom_edge_visible = false;
772
+ return fmkr;
773
+ }
774
+