tioga 1.6 → 1.7
Sign up to get free protection for your applications and to get access to all the features.
- data/Tioga_README +35 -10
- data/split/Dvector/dvector.c +264 -22
- data/split/Dvector/lib/Dvector_extras.rb +30 -2
- data/split/Flate/extconf.rb +1 -1
- data/split/Function/function.c +112 -2
- data/split/Tioga/figures.c +76 -77
- data/split/Tioga/figures.h +375 -490
- data/split/Tioga/generic.c +254 -0
- data/split/Tioga/generic.h +236 -0
- data/split/Tioga/init.c +434 -320
- data/split/Tioga/lib/Creating_Paths.rb +11 -1
- data/split/Tioga/lib/FigMkr.rb +263 -65
- data/split/Tioga/lib/Legends.rb +4 -2
- data/split/Tioga/lib/Markers.rb +3 -2
- data/split/Tioga/lib/Special_Paths.rb +22 -23
- data/split/Tioga/lib/TeX_Text.rb +79 -1
- data/split/Tioga/lib/TexPreamble.rb +14 -0
- data/split/Tioga/lib/Utils.rb +5 -1
- data/split/Tioga/pdfs.h +7 -45
- data/split/Tioga/{axes.c → shared/axes.c} +210 -197
- data/split/Tioga/{makers.c → shared/makers.c} +442 -211
- data/split/Tioga/{pdf_font_dicts.c → shared/pdf_font_dicts.c} +0 -0
- data/split/Tioga/shared/pdfcolor.c +628 -0
- data/split/Tioga/shared/pdfcoords.c +443 -0
- data/split/Tioga/{pdffile.c → shared/pdffile.c} +56 -52
- data/split/Tioga/{pdfimage.c → shared/pdfimage.c} +103 -211
- data/split/Tioga/shared/pdfpath.c +766 -0
- data/split/Tioga/{pdftext.c → shared/pdftext.c} +121 -99
- data/split/Tioga/shared/texout.c +524 -0
- data/split/Tioga/wrappers.c +489 -0
- data/split/Tioga/wrappers.h +259 -0
- data/split/extconf.rb +4 -0
- data/split/mkmf2.rb +12 -1
- data/tests/benchmark_dvector_reads.rb +112 -0
- data/tests/tc_Dvector.rb +35 -3
- data/tests/tc_Function.rb +32 -0
- metadata +65 -52
- data/split/Tioga/pdfcolor.c +0 -486
- data/split/Tioga/pdfcoords.c +0 -523
- data/split/Tioga/pdfpath.c +0 -913
- data/split/Tioga/texout.c +0 -380
@@ -56,6 +56,33 @@ module Dobjects
|
|
56
56
|
'remove_space' => true ,# removes spaces at the beginning of the lines
|
57
57
|
}
|
58
58
|
|
59
|
+
# This function is a wrapper for #fast_fancy_read that reflects the
|
60
|
+
# look-and-feel of #old_fancy_read
|
61
|
+
def Dvector.fancy_read(stream, cols = nil, opts = {}) # :doc:
|
62
|
+
o = FANCY_READ_DEFAULTS.dup
|
63
|
+
o.update(opts)
|
64
|
+
|
65
|
+
if stream.is_a?(String)
|
66
|
+
stream = File.open(stream)
|
67
|
+
end
|
68
|
+
raise ArgumentError.new("'stream' should have a gets method") unless
|
69
|
+
stream.respond_to? :gets
|
70
|
+
|
71
|
+
o['sep'] = Regexp.new(o['sep']) unless o['sep'].is_a? Regexp
|
72
|
+
|
73
|
+
res = Dvector.fast_fancy_read(stream, o)
|
74
|
+
|
75
|
+
# Adding the index columns if necessary
|
76
|
+
if o["index_col"]
|
77
|
+
res.unshift(Dvector.new(res[0].length) { |i| i})
|
78
|
+
end
|
79
|
+
|
80
|
+
if cols
|
81
|
+
return cols.map {|i| res[i] }
|
82
|
+
else
|
83
|
+
return res
|
84
|
+
end
|
85
|
+
end
|
59
86
|
|
60
87
|
# This function reads in +stream+ (can an IO object or a String,
|
61
88
|
# in which case it represents the name of a file to be opened)
|
@@ -70,9 +97,10 @@ module Dobjects
|
|
70
97
|
# 'skip_first':: how many lines to skip at the beginning of the file,
|
71
98
|
# 'default':: the value taken for missing elements
|
72
99
|
# 'index_col':: if set to true, the first column contains the
|
73
|
-
# indices of the
|
100
|
+
# indices of the elements (starting from 0 for
|
101
|
+
# first and so on)
|
74
102
|
|
75
|
-
def Dvector.
|
103
|
+
def Dvector.old_fancy_read(stream, cols = nil, opts = {}) # :doc:
|
76
104
|
# first, we turn the stream into a real IO stream
|
77
105
|
if stream.is_a?(String)
|
78
106
|
stream = File.open(stream)
|
data/split/Flate/extconf.rb
CHANGED
data/split/Function/function.c
CHANGED
@@ -687,8 +687,13 @@ static VALUE function_split_monotonic(VALUE self)
|
|
687
687
|
rb_ary_push(ret, f);
|
688
688
|
cur_x = Dvector_Create();
|
689
689
|
cur_y = Dvector_Create();
|
690
|
-
|
691
|
-
|
690
|
+
/* We don't store the previous point if
|
691
|
+
the X value is the same*/
|
692
|
+
if(x[i] != last_x)
|
693
|
+
{
|
694
|
+
Dvector_Push_Double(cur_x, x[i-1]);
|
695
|
+
Dvector_Push_Double(cur_y, y[i-1]);
|
696
|
+
}
|
692
697
|
direction *= -1;
|
693
698
|
}
|
694
699
|
/* store the current point */
|
@@ -927,6 +932,99 @@ static VALUE function_size(VALUE self)
|
|
927
932
|
return LONG2NUM(size);
|
928
933
|
}
|
929
934
|
|
935
|
+
/*
|
936
|
+
Fuzzy substraction of two curves. Substracts the Y values of _op_ to
|
937
|
+
the current Function, by making sure that the Y value substracted to
|
938
|
+
a given point corresponds to the closest X_ value of the point in _op_.
|
939
|
+
This function somehow assumes that the data is reasonably organised,
|
940
|
+
and will never go backwards to find a matching X value in _op_.
|
941
|
+
|
942
|
+
In any case, you really should consider using split_monotonic on it first.
|
943
|
+
*/
|
944
|
+
|
945
|
+
static VALUE function_fuzzy_substract(VALUE self, VALUE op)
|
946
|
+
{
|
947
|
+
long ss = function_sanity_check(self);
|
948
|
+
const double *xs = Dvector_Data_for_Read(get_x_vector(self),NULL);
|
949
|
+
double *ys = Dvector_Data_for_Write(get_y_vector(self),NULL);
|
950
|
+
long so = function_sanity_check(op);
|
951
|
+
const double *xo = Dvector_Data_for_Read(get_x_vector(op),NULL);
|
952
|
+
const double *yo = Dvector_Data_for_Read(get_y_vector(op),NULL);
|
953
|
+
long i,j = 0;
|
954
|
+
double diff;
|
955
|
+
double fuzz = 0; /* The actual sum of the terms */
|
956
|
+
|
957
|
+
for(i = 0; i < ss; i++)
|
958
|
+
{
|
959
|
+
/* We first look for the closest point */
|
960
|
+
diff = fabs(xs[i] - xo[j]);
|
961
|
+
while((j < (so - 1)) && (fabs(xs[i] - xo[j+1]) < diff))
|
962
|
+
diff = fabs(xs[i] - xo[++j]);
|
963
|
+
fuzz += diff;
|
964
|
+
ys[i] -= yo[j];
|
965
|
+
}
|
966
|
+
return rb_float_new(fuzz);
|
967
|
+
}
|
968
|
+
|
969
|
+
/*
|
970
|
+
call-seq:
|
971
|
+
f.bound_values(xmin, xmax, ymin, ymax)
|
972
|
+
|
973
|
+
This function browses the points inside the Function and stores in
|
974
|
+
the resulting new function only points which are within boundaries,
|
975
|
+
and the points just next to them (so the general direction on the sides
|
976
|
+
looks fine).
|
977
|
+
|
978
|
+
Make sure _xmin_ < _xmax_ and _ymin_ < _ymax_, else you simply won't
|
979
|
+
get any output.
|
980
|
+
*/
|
981
|
+
static VALUE function_bound_values(VALUE self,
|
982
|
+
VALUE vxmin, VALUE vxmax,
|
983
|
+
VALUE vymin, VALUE vymax)
|
984
|
+
{
|
985
|
+
long ss = function_sanity_check(self);
|
986
|
+
const double *xs = Dvector_Data_for_Read(get_x_vector(self),NULL);
|
987
|
+
const double *ys = Dvector_Data_for_Read(get_y_vector(self),NULL);
|
988
|
+
double xmin = NUM2DBL(vxmin);
|
989
|
+
double xmax = NUM2DBL(vxmax);
|
990
|
+
double ymin = NUM2DBL(vymin);
|
991
|
+
double ymax = NUM2DBL(vymax);
|
992
|
+
|
993
|
+
/* Now, two dvectors for writing: */
|
994
|
+
VALUE x_out = rb_funcall(cDvector, idNew, 0);
|
995
|
+
VALUE y_out = rb_funcall(cDvector, idNew, 0);
|
996
|
+
|
997
|
+
/* No forward computation of the size of the targets, meaning
|
998
|
+
memory allocation penalty.
|
999
|
+
*/
|
1000
|
+
|
1001
|
+
int last_point_in = 0; /* Whether the last point was in */
|
1002
|
+
long i;
|
1003
|
+
for(i = 0; i < ss; i++) {
|
1004
|
+
double x = xs[i];
|
1005
|
+
double y = ys[i];
|
1006
|
+
if( (xmin <= x) && (xmax >= x) && (ymin <= y) && (ymax >= y)) {
|
1007
|
+
if(! last_point_in) {
|
1008
|
+
last_point_in = 1;
|
1009
|
+
if(i) { /* Not for the first element */
|
1010
|
+
Dvector_Push_Double(x_out, xs[i-1]);
|
1011
|
+
Dvector_Push_Double(y_out, ys[i-1]);
|
1012
|
+
}
|
1013
|
+
}
|
1014
|
+
Dvector_Push_Double(x_out, x);
|
1015
|
+
Dvector_Push_Double(y_out, y);
|
1016
|
+
}
|
1017
|
+
else { /* Outside boundaries */
|
1018
|
+
if(last_point_in) {
|
1019
|
+
last_point_in = 0;
|
1020
|
+
Dvector_Push_Double(x_out, x);
|
1021
|
+
Dvector_Push_Double(y_out, y);
|
1022
|
+
}
|
1023
|
+
}
|
1024
|
+
}
|
1025
|
+
return Function_Create(x_out, y_out);
|
1026
|
+
}
|
1027
|
+
|
930
1028
|
/*
|
931
1029
|
Document-class: Dobjects::Function
|
932
1030
|
|
@@ -941,6 +1039,9 @@ static VALUE function_size(VALUE self)
|
|
941
1039
|
- some utiliy functions: #split_monotonic, #strip_nan;
|
942
1040
|
- data inspection: #min, #max;
|
943
1041
|
- some computational functions: #integrate, #primitive, #derivative.
|
1042
|
+
- utility for fuzzy operations, when the X values of two functions
|
1043
|
+
differ, but only slightly, of when points are missing:
|
1044
|
+
#fuzzy_sub!
|
944
1045
|
|
945
1046
|
And getting bigger everyday...
|
946
1047
|
*/
|
@@ -1003,6 +1104,15 @@ void Init_Function()
|
|
1003
1104
|
/* distance to a point */
|
1004
1105
|
rb_define_method(cFunction, "distance", function_distance, -1);
|
1005
1106
|
|
1107
|
+
/* Fuzzy operations */
|
1108
|
+
rb_define_method(cFunction, "fuzzy_sub!",
|
1109
|
+
function_fuzzy_substract, 1); /* Substraction */
|
1110
|
+
|
1111
|
+
|
1112
|
+
/* Boundary operations */
|
1113
|
+
rb_define_method(cFunction, "bound_values",
|
1114
|
+
function_bound_values, 4); /* Substraction */
|
1115
|
+
|
1006
1116
|
|
1007
1117
|
/* a few more methods better written in pure Ruby */
|
1008
1118
|
rb_require("Dobjects/Function_extras.rb");
|
data/split/Tioga/figures.c
CHANGED
@@ -25,6 +25,9 @@
|
|
25
25
|
|
26
26
|
#include "figures.h"
|
27
27
|
#include "pdfs.h"
|
28
|
+
#include "wrappers.h"
|
29
|
+
#include "dvector.h"
|
30
|
+
#include "dtable.h"
|
28
31
|
#include "flate.h"
|
29
32
|
|
30
33
|
#include <symbols.h>
|
@@ -32,46 +35,47 @@
|
|
32
35
|
|
33
36
|
#include <stdio.h>
|
34
37
|
|
35
|
-
char *data_dir = NULL;
|
36
38
|
|
37
|
-
|
38
|
-
|
39
|
-
static
|
40
|
-
|
41
|
-
rb_gc_mark(p->fill_color);
|
42
|
-
rb_gc_mark(p->line_type);
|
43
|
-
rb_gc_mark(p->title);
|
44
|
-
rb_gc_mark(p->title_color);
|
45
|
-
rb_gc_mark(p->xlabel);
|
46
|
-
rb_gc_mark(p->xlabel_color);
|
47
|
-
rb_gc_mark(p->ylabel);
|
48
|
-
rb_gc_mark(p->ylabel_color);
|
49
|
-
rb_gc_mark(p->xaxis_stroke_color);
|
50
|
-
rb_gc_mark(p->xaxis_locations_for_major_ticks);
|
51
|
-
rb_gc_mark(p->xaxis_locations_for_minor_ticks);
|
52
|
-
rb_gc_mark(p->yaxis_stroke_color);
|
53
|
-
rb_gc_mark(p->yaxis_locations_for_major_ticks);
|
54
|
-
rb_gc_mark(p->yaxis_locations_for_minor_ticks);
|
55
|
-
rb_gc_mark(p->fm);
|
56
|
-
}
|
39
|
+
#define DBL_ATTR(attr) \
|
40
|
+
static VALUE FM_##attr##_get(VALUE fmkr) { int ierr=0; FM *p = Get_FM(fmkr,&ierr); return (ierr != 0)? OBJ_NIL : rb_float_new(p->attr); } \
|
41
|
+
static VALUE FM_##attr##_set(VALUE fmkr, VALUE val) { \
|
42
|
+
int ierr=0; FM *p = Get_FM(fmkr,&ierr); if (ierr != 0) RETURN_NIL; VALUE v = rb_Float(val); p->attr = NUM2DBL(v); return val; }
|
57
43
|
|
58
|
-
|
59
|
-
|
60
|
-
|
44
|
+
#define INT_ATTR(attr) \
|
45
|
+
static VALUE FM_##attr##_get(VALUE fmkr) { int ierr=0; FM *p = Get_FM(fmkr,&ierr); return (ierr != 0)? OBJ_NIL : INT2FIX(p->attr); } \
|
46
|
+
static VALUE FM_##attr##_set(VALUE fmkr, VALUE val) { \
|
47
|
+
int ierr=0; FM *p = Get_FM(fmkr,&ierr); if (ierr != 0) RETURN_NIL; VALUE v = rb_Integer(val); p->attr = NUM2INT(v); return val; }
|
61
48
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
}
|
49
|
+
#define VAL_ATTR(attr) \
|
50
|
+
static VALUE FM_##attr##_get(VALUE fmkr) { int ierr=0; FM *p = Get_FM(fmkr,&ierr); return (ierr != 0)? OBJ_NIL : p->attr; } \
|
51
|
+
static VALUE FM_##attr##_set(VALUE fmkr, VALUE val) { \
|
52
|
+
int ierr=0; FM *p = Get_FM(fmkr,&ierr); if (ierr != 0) RETURN_NIL; p->attr = val; return val; }
|
53
|
+
|
54
|
+
#define BOOL_ATTR(attr) \
|
55
|
+
static VALUE FM_##attr##_get(VALUE fmkr) { int ierr=0; FM *p = Get_FM(fmkr,&ierr); return (ierr != 0)? OBJ_NIL : ((p->attr)? Qtrue : Qfalse); } \
|
56
|
+
static VALUE FM_##attr##_set(VALUE fmkr, VALUE val) { \
|
57
|
+
int ierr=0; FM *p = Get_FM(fmkr,&ierr); if (ierr != 0) RETURN_NIL; p->attr = (val != Qfalse); return val; }
|
58
|
+
|
59
|
+
#define RO_DBL_ATTR(attr) \
|
60
|
+
static VALUE FM_##attr##_get(VALUE fmkr) { int ierr=0; FM *p = Get_FM(fmkr,&ierr); return (ierr != 0)? OBJ_NIL : rb_float_new(p->attr); }
|
69
61
|
|
70
|
-
|
62
|
+
#define RO_INT_ATTR(attr) \
|
63
|
+
static VALUE FM_##attr##_get(VALUE fmkr) { int ierr=0; FM *p = Get_FM(fmkr,&ierr); return (ierr != 0)? OBJ_NIL : INT2FIX(p->attr); }
|
64
|
+
|
65
|
+
#define RO_VAL_ATTR(attr) \
|
66
|
+
static VALUE FM_##attr##_get(VALUE fmkr) { int ierr=0; FM *p = Get_FM(fmkr,&ierr); return (ierr != 0)? OBJ_NIL : p->attr; }
|
67
|
+
|
68
|
+
#define RO_BOOL_ATTR(attr) \
|
69
|
+
static VALUE FM_##attr##_get(VALUE fmkr) { int ierr=0; FM *p = Get_FM(fmkr,&ierr); return (ierr != 0)? OBJ_NIL : ((p->attr)? Qtrue : Qfalse); }
|
70
|
+
|
71
|
+
|
72
|
+
char *data_dir = NULL;
|
71
73
|
|
72
|
-
|
73
|
-
|
74
|
-
|
74
|
+
OBJ_PTR cFM; /* the Tioga/FigureMaker class object */
|
75
|
+
|
76
|
+
FM *Get_FM(OBJ_PTR fmkr, int *ierr) {
|
77
|
+
FM *p = (FM *)Dvector_Data_for_Write(Get_fm_data_attr(fmkr, ierr), NULL);
|
78
|
+
if (*ierr != 0) RAISE_ERROR("FigMkr is missing @fm_data", ierr);
|
75
79
|
return p;
|
76
80
|
}
|
77
81
|
|
@@ -129,19 +133,15 @@ FM *Get_FM(VALUE fmkr) {
|
|
129
133
|
|
130
134
|
/* graphics attribute accessors */
|
131
135
|
RO_DBL_ATTR(default_line_scale)
|
132
|
-
RO_VAL_ATTR(stroke_color)
|
133
|
-
RO_VAL_ATTR(fill_color)
|
134
136
|
RO_DBL_ATTR(line_width)
|
135
137
|
RO_INT_ATTR(line_cap)
|
136
138
|
RO_INT_ATTR(line_join)
|
137
139
|
RO_DBL_ATTR(miter_limit)
|
138
140
|
RO_DBL_ATTR(stroke_opacity)
|
139
141
|
RO_DBL_ATTR(fill_opacity)
|
140
|
-
RO_VAL_ATTR(line_type)
|
141
142
|
|
142
143
|
/* Title */
|
143
144
|
RO_BOOL_ATTR(title_visible)
|
144
|
-
VAL_ATTR(title)
|
145
145
|
INT_ATTR(title_side)
|
146
146
|
DBL_ATTR(title_position)
|
147
147
|
DBL_ATTR(title_scale)
|
@@ -149,11 +149,10 @@ FM *Get_FM(VALUE fmkr) {
|
|
149
149
|
DBL_ATTR(title_angle)
|
150
150
|
INT_ATTR(title_alignment)
|
151
151
|
INT_ATTR(title_justification)
|
152
|
-
VAL_ATTR(title_color)
|
152
|
+
//VAL_ATTR(title_color)
|
153
153
|
|
154
154
|
/* X label */
|
155
155
|
RO_BOOL_ATTR(xlabel_visible)
|
156
|
-
VAL_ATTR(xlabel)
|
157
156
|
DBL_ATTR(xlabel_position)
|
158
157
|
DBL_ATTR(xlabel_scale)
|
159
158
|
DBL_ATTR(xlabel_shift)
|
@@ -161,11 +160,9 @@ FM *Get_FM(VALUE fmkr) {
|
|
161
160
|
INT_ATTR(xlabel_side)
|
162
161
|
INT_ATTR(xlabel_alignment)
|
163
162
|
INT_ATTR(xlabel_justification)
|
164
|
-
VAL_ATTR(xlabel_color)
|
165
163
|
|
166
164
|
/* Y label */
|
167
165
|
RO_BOOL_ATTR(ylabel_visible)
|
168
|
-
VAL_ATTR(ylabel)
|
169
166
|
DBL_ATTR(ylabel_position)
|
170
167
|
DBL_ATTR(ylabel_scale)
|
171
168
|
DBL_ATTR(ylabel_shift)
|
@@ -173,14 +170,12 @@ FM *Get_FM(VALUE fmkr) {
|
|
173
170
|
INT_ATTR(ylabel_side)
|
174
171
|
INT_ATTR(ylabel_alignment)
|
175
172
|
INT_ATTR(ylabel_justification)
|
176
|
-
VAL_ATTR(ylabel_color)
|
177
173
|
|
178
174
|
/* X axis */
|
179
175
|
RO_BOOL_ATTR(xaxis_visible)
|
180
176
|
INT_ATTR(xaxis_loc)
|
181
177
|
INT_ATTR(xaxis_type)
|
182
178
|
DBL_ATTR(xaxis_line_width)
|
183
|
-
VAL_ATTR(xaxis_stroke_color)
|
184
179
|
DBL_ATTR(xaxis_major_tick_width)
|
185
180
|
DBL_ATTR(xaxis_minor_tick_width)
|
186
181
|
DBL_ATTR(xaxis_major_tick_length)
|
@@ -191,11 +186,8 @@ FM *Get_FM(VALUE fmkr) {
|
|
191
186
|
DBL_ATTR(xaxis_tick_interval)
|
192
187
|
DBL_ATTR(xaxis_min_between_major_ticks)
|
193
188
|
INT_ATTR(xaxis_number_of_minor_intervals)
|
194
|
-
VAL_ATTR(xaxis_locations_for_major_ticks)
|
195
|
-
VAL_ATTR(xaxis_locations_for_minor_ticks)
|
196
189
|
BOOL_ATTR(xaxis_use_fixed_pt)
|
197
190
|
INT_ATTR(xaxis_digits_max)
|
198
|
-
VAL_ATTR(xaxis_tick_labels)
|
199
191
|
INT_ATTR(xaxis_numeric_label_decimal_digits)
|
200
192
|
DBL_ATTR(xaxis_numeric_label_scale)
|
201
193
|
DBL_ATTR(xaxis_numeric_label_shift)
|
@@ -214,7 +206,6 @@ FM *Get_FM(VALUE fmkr) {
|
|
214
206
|
INT_ATTR(yaxis_loc)
|
215
207
|
INT_ATTR(yaxis_type)
|
216
208
|
DBL_ATTR(yaxis_line_width)
|
217
|
-
VAL_ATTR(yaxis_stroke_color)
|
218
209
|
DBL_ATTR(yaxis_major_tick_width)
|
219
210
|
DBL_ATTR(yaxis_minor_tick_width)
|
220
211
|
DBL_ATTR(yaxis_major_tick_length)
|
@@ -225,11 +216,8 @@ FM *Get_FM(VALUE fmkr) {
|
|
225
216
|
DBL_ATTR(yaxis_tick_interval)
|
226
217
|
DBL_ATTR(yaxis_min_between_major_ticks)
|
227
218
|
INT_ATTR(yaxis_number_of_minor_intervals)
|
228
|
-
VAL_ATTR(yaxis_locations_for_major_ticks)
|
229
|
-
VAL_ATTR(yaxis_locations_for_minor_ticks)
|
230
219
|
BOOL_ATTR(yaxis_use_fixed_pt)
|
231
220
|
INT_ATTR(yaxis_digits_max)
|
232
|
-
VAL_ATTR(yaxis_tick_labels)
|
233
221
|
INT_ATTR(yaxis_numeric_label_decimal_digits)
|
234
222
|
DBL_ATTR(yaxis_numeric_label_scale)
|
235
223
|
DBL_ATTR(yaxis_numeric_label_shift)
|
@@ -262,12 +250,26 @@ FM *Get_FM(VALUE fmkr) {
|
|
262
250
|
/* Warning on non-ok numbers */
|
263
251
|
BOOL_ATTR(croak_on_nonok_numbers)
|
264
252
|
|
253
|
+
bool Get_initialized() {
|
254
|
+
OBJ_PTR v = rb_cv_get(cFM, "@@initialized");
|
255
|
+
return v != OBJ_FALSE && v != OBJ_NIL;
|
256
|
+
}
|
257
|
+
|
258
|
+
void Set_initialized() {
|
259
|
+
rb_cv_set(cFM, "@@initialized", OBJ_TRUE);
|
260
|
+
}
|
261
|
+
|
262
|
+
static void Set_fm_data_size() {
|
263
|
+
rb_cv_set(cFM, "@@fm_data_size", Integer_New(1 + (sizeof(FM) / sizeof(double))));
|
264
|
+
// size is number of doubles needed to hold FM data
|
265
|
+
}
|
266
|
+
|
265
267
|
#define attr_reader(attr) rb_define_method(cFM, #attr , FM_##attr##_get, 0);
|
266
268
|
#define attr_writer(attr) rb_define_method(cFM, #attr "=", FM_##attr##_set, 1);
|
267
269
|
#define attr_accessors(attr) attr_reader(attr) attr_writer(attr)
|
268
270
|
|
269
271
|
void Init_FigureMaker(void) {
|
270
|
-
|
272
|
+
/* called by Ruby when the extension is loaded */
|
271
273
|
|
272
274
|
/* this function has been modified by Vincent Fourmond for the splitting
|
273
275
|
out of libraries more general than Tioga */
|
@@ -286,12 +288,12 @@ void Init_FigureMaker(void) {
|
|
286
288
|
rb_require("Flate");
|
287
289
|
|
288
290
|
|
289
|
-
|
291
|
+
OBJ_PTR mTioga = rb_define_module("Tioga");
|
290
292
|
|
291
293
|
|
292
294
|
/* and now, we need to import Dobjects and Flate modules*/
|
293
|
-
|
294
|
-
|
295
|
+
OBJ_PTR mDobjects = rb_define_module("Dobjects");
|
296
|
+
OBJ_PTR mFlate = rb_define_module("Flate");
|
295
297
|
rb_include_module(mTioga, mDobjects);
|
296
298
|
rb_include_module(mTioga, mFlate);
|
297
299
|
|
@@ -304,13 +306,13 @@ void Init_FigureMaker(void) {
|
|
304
306
|
rb_include_module(cFM, mDobjects);
|
305
307
|
rb_include_module(cFM, mFlate);
|
306
308
|
|
307
|
-
rb_define_alloc_func(cFM, FM_alloc);
|
308
309
|
Init_IDs();
|
309
310
|
Init_Font_Dictionary();
|
310
311
|
rb_define_method(cFM, "private_make", FM_private_make, 2);
|
311
312
|
rb_define_method(cFM, "get_save_filename", FM_get_save_filename, 1);
|
312
313
|
rb_define_method(cFM, "private_make_portfolio", FM_private_make_portfolio, 3);
|
313
|
-
|
314
|
+
rb_define_method(cFM, "private_init_fm_data", FM_private_init_fm_data, 0);
|
315
|
+
|
314
316
|
/* page attribute accessors */
|
315
317
|
attr_reader(root_figure)
|
316
318
|
attr_reader(in_subplot)
|
@@ -364,15 +366,16 @@ void Init_FigureMaker(void) {
|
|
364
366
|
attr_accessors(line_width)
|
365
367
|
attr_accessors(line_cap)
|
366
368
|
attr_accessors(line_join)
|
369
|
+
rb_define_method(cFM, "line_type_set", FM_line_type_set, 1);
|
367
370
|
attr_accessors(miter_limit)
|
368
371
|
attr_accessors(stroke_opacity)
|
369
372
|
attr_accessors(fill_opacity)
|
370
|
-
attr_accessors(line_type)
|
371
373
|
/* croak on non ok */
|
372
374
|
attr_accessors(croak_on_nonok_numbers)
|
373
375
|
|
374
376
|
/* methods */
|
375
|
-
rb_define_method(cFM, "
|
377
|
+
rb_define_method(cFM, "pdf_gsave", FM_pdf_gsave, 0);
|
378
|
+
rb_define_method(cFM, "pdf_grestore", FM_pdf_grestore, 0);
|
376
379
|
rb_define_method(cFM, "private_set_bounds", FM_private_set_bounds, 4);
|
377
380
|
rb_define_method(cFM, "private_set_subframe", FM_private_set_subframe, 4);
|
378
381
|
rb_define_method(cFM, "doing_subfigure", FM_doing_subfigure, 0);
|
@@ -415,17 +418,20 @@ void Init_FigureMaker(void) {
|
|
415
418
|
rb_define_method(cFM, "convert_output_to_figure_x", FM_convert_output_to_figure_x, 1);
|
416
419
|
rb_define_method(cFM, "convert_output_to_figure_y", FM_convert_output_to_figure_y, 1);
|
417
420
|
rb_define_method(cFM, "convert_output_to_figure_dx", FM_convert_output_to_figure_dx, 1);
|
418
|
-
rb_define_method(cFM, "
|
421
|
+
rb_define_method(cFM, "convert_output_to_figure_dy", FM_convert_output_to_figure_dy, 1);
|
419
422
|
rb_define_method(cFM, "convert_to_degrees", FM_convert_to_degrees, 2);
|
420
423
|
/* text */
|
421
424
|
rb_define_method(cFM, "private_set_default_font_size", FM_private_set_default_font_size, 1);
|
422
425
|
rb_define_method(cFM, "rescale_text", FM_rescale_text, 1);
|
423
|
-
rb_define_method(cFM, "show_rotated_text", FM_show_rotated_text,
|
424
|
-
rb_define_method(cFM, "show_rotated_label", FM_show_rotated_label,
|
426
|
+
rb_define_method(cFM, "show_rotated_text", FM_show_rotated_text, 9);
|
427
|
+
rb_define_method(cFM, "show_rotated_label", FM_show_rotated_label, 8);
|
425
428
|
rb_define_method(cFM, "check_label_clip", FM_check_label_clip, 2);
|
429
|
+
/* text measurements */
|
430
|
+
rb_define_method(cFM, "private_save_measure", FM_save_measure, 4);
|
426
431
|
/* path construction */
|
427
432
|
rb_define_method(cFM, "move_to_point", FM_move_to_point, 2);
|
428
433
|
rb_define_method(cFM, "append_point_to_path", FM_append_point_to_path, 2);
|
434
|
+
rb_define_method(cFM, "bezier_control_points", FM_bezier_control_points, 6);
|
429
435
|
rb_define_method(cFM, "append_curve_to_path", FM_append_curve_to_path, 6);
|
430
436
|
rb_define_method(cFM, "close_path", FM_close_path, 0);
|
431
437
|
rb_define_method(cFM, "append_points_to_path", FM_append_points_to_path, 2);
|
@@ -512,13 +518,12 @@ void Init_FigureMaker(void) {
|
|
512
518
|
rb_define_method(cFM, "no_top_edge", FM_no_top_edge, 0);
|
513
519
|
rb_define_method(cFM, "no_bottom_edge", FM_no_bottom_edge, 0);
|
514
520
|
/* makers */
|
515
|
-
rb_define_method(cFM, "private_make_contour", FM_private_make_contour,
|
516
|
-
rb_define_method(cFM, "private_make_spline_interpolated_points", FM_private_make_spline_interpolated_points,
|
517
|
-
rb_define_method(cFM, "private_make_steps", FM_private_make_steps,
|
521
|
+
rb_define_method(cFM, "private_make_contour", FM_private_make_contour, 7);
|
522
|
+
rb_define_method(cFM, "private_make_spline_interpolated_points", FM_private_make_spline_interpolated_points, 5);
|
523
|
+
rb_define_method(cFM, "private_make_steps", FM_private_make_steps, 6);
|
518
524
|
|
519
525
|
/* Title */
|
520
526
|
attr_reader(title_visible)
|
521
|
-
attr_accessors(title)
|
522
527
|
attr_accessors(title_side)
|
523
528
|
attr_accessors(title_position)
|
524
529
|
attr_accessors(title_scale)
|
@@ -530,7 +535,6 @@ void Init_FigureMaker(void) {
|
|
530
535
|
|
531
536
|
/* X label */
|
532
537
|
attr_reader(xlabel_visible)
|
533
|
-
attr_accessors(xlabel)
|
534
538
|
attr_accessors(xlabel_position)
|
535
539
|
attr_accessors(xlabel_scale)
|
536
540
|
attr_accessors(xlabel_shift)
|
@@ -542,7 +546,6 @@ void Init_FigureMaker(void) {
|
|
542
546
|
|
543
547
|
/* Y label */
|
544
548
|
attr_reader(ylabel_visible)
|
545
|
-
attr_accessors(ylabel)
|
546
549
|
attr_accessors(ylabel_position)
|
547
550
|
attr_accessors(ylabel_scale)
|
548
551
|
attr_accessors(ylabel_shift)
|
@@ -568,11 +571,8 @@ void Init_FigureMaker(void) {
|
|
568
571
|
attr_accessors(xaxis_tick_interval)
|
569
572
|
attr_accessors(xaxis_min_between_major_ticks)
|
570
573
|
attr_accessors(xaxis_number_of_minor_intervals)
|
571
|
-
attr_accessors(xaxis_locations_for_major_ticks)
|
572
|
-
attr_accessors(xaxis_locations_for_minor_ticks)
|
573
574
|
attr_accessors(xaxis_use_fixed_pt)
|
574
575
|
attr_accessors(xaxis_digits_max)
|
575
|
-
attr_accessors(xaxis_tick_labels)
|
576
576
|
attr_accessors(xaxis_numeric_label_decimal_digits)
|
577
577
|
attr_accessors(xaxis_numeric_label_scale)
|
578
578
|
attr_accessors(xaxis_numeric_label_shift)
|
@@ -602,11 +602,8 @@ void Init_FigureMaker(void) {
|
|
602
602
|
attr_accessors(yaxis_tick_interval)
|
603
603
|
attr_accessors(yaxis_min_between_major_ticks)
|
604
604
|
attr_accessors(yaxis_number_of_minor_intervals)
|
605
|
-
attr_accessors(yaxis_locations_for_major_ticks)
|
606
|
-
attr_accessors(yaxis_locations_for_minor_ticks)
|
607
605
|
attr_accessors(yaxis_use_fixed_pt)
|
608
606
|
attr_accessors(yaxis_digits_max)
|
609
|
-
attr_accessors(yaxis_tick_labels)
|
610
607
|
attr_accessors(yaxis_numeric_label_decimal_digits)
|
611
608
|
attr_accessors(yaxis_numeric_label_scale)
|
612
609
|
attr_accessors(yaxis_numeric_label_shift)
|
@@ -636,11 +633,13 @@ void Init_FigureMaker(void) {
|
|
636
633
|
/* Debugging */
|
637
634
|
attr_accessors(debug_verbosity_level)
|
638
635
|
|
636
|
+
|
637
|
+
Set_fm_data_size(); // must set this before create a FigureMaker instance
|
639
638
|
rb_require("Tioga/FigMkr.rb");
|
640
639
|
/* We now need to import the symbols */
|
641
640
|
|
642
641
|
/* imports from Dvector */
|
643
|
-
|
642
|
+
OBJ_PTR cDvector = rb_define_class_under(mDobjects, "Dvector", rb_cObject);
|
644
643
|
RB_IMPORT_SYMBOL(cDvector, Dvector_Create);
|
645
644
|
RB_IMPORT_SYMBOL(cDvector, Dvector_Data_Resize);
|
646
645
|
RB_IMPORT_SYMBOL(cDvector, Dvector_Data_Replace);
|
@@ -656,7 +655,7 @@ void Init_FigureMaker(void) {
|
|
656
655
|
RB_IMPORT_SYMBOL(mFlate, flate_expand);
|
657
656
|
|
658
657
|
/* imports from Dtable */
|
659
|
-
|
658
|
+
OBJ_PTR cDtable = rb_define_class_under(mDobjects, "Dtable", rb_cObject);
|
660
659
|
RB_IMPORT_SYMBOL(cDtable, Dtable_Ptr);
|
661
660
|
RB_IMPORT_SYMBOL(cDtable, Read_Dtable);
|
662
661
|
}
|