tioga 1.6 → 1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
@@ -0,0 +1,443 @@
|
|
1
|
+
/* pdfcoords.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
|
+
/* Frame and Bounds */
|
26
|
+
void Recalc_Font_Hts(FM *p)
|
27
|
+
{
|
28
|
+
double dx, dy;
|
29
|
+
dx = dy = ENLARGE * p->default_font_size * p->default_text_scale; // font height in output coords
|
30
|
+
dx = convert_output_to_page_dx(p,dx);
|
31
|
+
dx = convert_page_to_frame_dx(p,dx);
|
32
|
+
p->default_text_height_dx = convert_frame_to_figure_dx(p,dx);
|
33
|
+
dy = convert_output_to_page_dy(p,dy);
|
34
|
+
dy = convert_page_to_frame_dy(p,dy);
|
35
|
+
p->default_text_height_dy = convert_frame_to_figure_dy(p,dy);
|
36
|
+
}
|
37
|
+
|
38
|
+
void c_set_subframe(OBJ_PTR fmkr, FM *p,
|
39
|
+
double left_margin, double right_margin, double top_margin, double bottom_margin, int *ierr)
|
40
|
+
{
|
41
|
+
double x, y, w, h;
|
42
|
+
if (left_margin < 0 || right_margin < 0 || top_margin < 0 || bottom_margin < 0) {
|
43
|
+
RAISE_ERROR("Sorry: margins for set_subframe must be non-negative", ierr); return; }
|
44
|
+
if (left_margin + right_margin >= 1.0) {
|
45
|
+
RAISE_ERROR_gg("Sorry: margins too large: left_margin (%g) right_margin (%g)", left_margin, right_margin, ierr); return; }
|
46
|
+
if (top_margin + bottom_margin >= 1.0) {
|
47
|
+
RAISE_ERROR_gg("Sorry: margins too large: top_margin (%g) bottom_margin (%g)", top_margin, bottom_margin, ierr); return; }
|
48
|
+
x = p->frame_left += left_margin * p->frame_width;
|
49
|
+
p->frame_right -= right_margin * p->frame_width;
|
50
|
+
p->frame_top -= top_margin * p->frame_height;
|
51
|
+
y = p->frame_bottom += bottom_margin * p->frame_height;
|
52
|
+
w = p->frame_width = p->frame_right - p->frame_left;
|
53
|
+
h = p->frame_height = p->frame_top - p->frame_bottom;
|
54
|
+
Recalc_Font_Hts(p);
|
55
|
+
}
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
static void c_set_bounds(FM *p, double left, double right, double top, double bottom, int *ierr)
|
60
|
+
{
|
61
|
+
if (constructing_path) {
|
62
|
+
RAISE_ERROR("Sorry: must finish with current path before calling set_bounds", ierr); return; }
|
63
|
+
p->bounds_left = left; p->bounds_right = right;
|
64
|
+
p->bounds_bottom = bottom; p->bounds_top = top;
|
65
|
+
if (left < right) {
|
66
|
+
p->xaxis_reversed = false;
|
67
|
+
p->bounds_xmin = left; p->bounds_xmax = right;
|
68
|
+
} else if (right < left) {
|
69
|
+
p->xaxis_reversed = true;
|
70
|
+
p->bounds_xmin = right; p->bounds_xmax = left;
|
71
|
+
} else { // left == right
|
72
|
+
p->xaxis_reversed = false;
|
73
|
+
if (left > 0.0) {
|
74
|
+
p->bounds_xmin = left * (1.0 - 1e-6); p->bounds_xmax = left * (1.0 + 1e-6);
|
75
|
+
} else if (left < 0.0) {
|
76
|
+
p->bounds_xmin = left * (1.0 + 1e-6); p->bounds_xmax = left * (1.0 - 1e-6);
|
77
|
+
} else {
|
78
|
+
p->bounds_xmin = -1e-6; p->bounds_xmax = 1e-6;
|
79
|
+
}
|
80
|
+
}
|
81
|
+
if (bottom < top) {
|
82
|
+
p->yaxis_reversed = false;
|
83
|
+
p->bounds_ymin = bottom; p->bounds_ymax = top;
|
84
|
+
} else if (top < bottom) {
|
85
|
+
p->yaxis_reversed = true;
|
86
|
+
p->bounds_ymin = top; p->bounds_ymax = bottom;
|
87
|
+
} else { // top == bottom
|
88
|
+
p->yaxis_reversed = false;
|
89
|
+
if (bottom > 0.0) {
|
90
|
+
p->bounds_ymin = bottom * (1.0 - 1e-6); p->bounds_ymax = bottom * (1.0 + 1e-6);
|
91
|
+
} else if (bottom < 0.0) {
|
92
|
+
p->bounds_ymin = bottom * (1.0 + 1e-6); p->bounds_ymax = bottom * (1.0 - 1e-6);
|
93
|
+
} else {
|
94
|
+
p->bounds_xmin = -1e-6; p->bounds_xmax = 1e-6;
|
95
|
+
}
|
96
|
+
}
|
97
|
+
p->bounds_width = p->bounds_xmax - p->bounds_xmin;
|
98
|
+
p->bounds_height = p->bounds_ymax - p->bounds_ymin;
|
99
|
+
Recalc_Font_Hts(p);
|
100
|
+
}
|
101
|
+
|
102
|
+
void c_private_set_bounds(OBJ_PTR fmkr, FM *p,
|
103
|
+
double left, double right, double top, double bottom, int *ierr)
|
104
|
+
{
|
105
|
+
if (constructing_path) {
|
106
|
+
RAISE_ERROR("Sorry: must finish with current path before calling set_bounds", ierr); return; }
|
107
|
+
p->bounds_left = left; p->bounds_right = right;
|
108
|
+
p->bounds_bottom = bottom; p->bounds_top = top;
|
109
|
+
if (left < right) {
|
110
|
+
p->xaxis_reversed = false;
|
111
|
+
p->bounds_xmin = left; p->bounds_xmax = right;
|
112
|
+
} else if (right < left) {
|
113
|
+
p->xaxis_reversed = true;
|
114
|
+
p->bounds_xmin = right; p->bounds_xmax = left;
|
115
|
+
} else { // left == right
|
116
|
+
p->xaxis_reversed = false;
|
117
|
+
if (left > 0.0) {
|
118
|
+
p->bounds_xmin = left * (1.0 - 1e-6); p->bounds_xmax = left * (1.0 + 1e-6);
|
119
|
+
} else if (left < 0.0) {
|
120
|
+
p->bounds_xmin = left * (1.0 + 1e-6); p->bounds_xmax = left * (1.0 - 1e-6);
|
121
|
+
} else {
|
122
|
+
p->bounds_xmin = -1e-6; p->bounds_xmax = 1e-6;
|
123
|
+
}
|
124
|
+
}
|
125
|
+
if (bottom < top) {
|
126
|
+
p->yaxis_reversed = false;
|
127
|
+
p->bounds_ymin = bottom; p->bounds_ymax = top;
|
128
|
+
} else if (top < bottom) {
|
129
|
+
p->yaxis_reversed = true;
|
130
|
+
p->bounds_ymin = top; p->bounds_ymax = bottom;
|
131
|
+
} else { // top == bottom
|
132
|
+
p->yaxis_reversed = false;
|
133
|
+
if (bottom > 0.0) {
|
134
|
+
p->bounds_ymin = bottom * (1.0 - 1e-6); p->bounds_ymax = bottom * (1.0 + 1e-6);
|
135
|
+
} else if (bottom < 0.0) {
|
136
|
+
p->bounds_ymin = bottom * (1.0 + 1e-6); p->bounds_ymax = bottom * (1.0 - 1e-6);
|
137
|
+
} else {
|
138
|
+
p->bounds_xmin = -1e-6; p->bounds_xmax = 1e-6;
|
139
|
+
}
|
140
|
+
}
|
141
|
+
p->bounds_width = p->bounds_xmax - p->bounds_xmin;
|
142
|
+
p->bounds_height = p->bounds_ymax - p->bounds_ymin;
|
143
|
+
Recalc_Font_Hts(p);
|
144
|
+
}
|
145
|
+
|
146
|
+
|
147
|
+
// Conversions
|
148
|
+
|
149
|
+
|
150
|
+
OBJ_PTR c_convert_to_degrees(OBJ_PTR fmkr, FM *p, double dx, double dy, int *ierr) { // dx and dy in figure coords
|
151
|
+
double angle;
|
152
|
+
if (dx == 0.0 && dy == 0.0) angle = 0.0;
|
153
|
+
else if (dx > 0.0 && dy == 0.0) angle = (p->bounds_left > p->bounds_right)? 180.0 : 0.0;
|
154
|
+
else if (dx < 0.0 && dy == 0.0) angle = (p->bounds_left > p->bounds_right)? 0.0 : 180.0;
|
155
|
+
else if (dx == 0.0 && dy > 0.0) angle = (p->bounds_bottom > p->bounds_top)? -90.0 : 90.0;
|
156
|
+
else if (dx == 0.0 && dy < 0.0) angle = (p->bounds_bottom > p->bounds_top)? 90.0 : -90.0;
|
157
|
+
else angle = atan2(convert_figure_to_output_dy(p,dy),convert_figure_to_output_dx(p,dx))*RADIANS_TO_DEGREES;
|
158
|
+
return Float_New(angle);
|
159
|
+
}
|
160
|
+
|
161
|
+
OBJ_PTR c_convert_inches_to_output(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
162
|
+
{
|
163
|
+
val = convert_inches_to_output(val);
|
164
|
+
return Float_New(val);
|
165
|
+
}
|
166
|
+
|
167
|
+
OBJ_PTR c_convert_output_to_inches(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
168
|
+
{
|
169
|
+
val = convert_output_to_inches(val);
|
170
|
+
return Float_New(val);
|
171
|
+
}
|
172
|
+
|
173
|
+
OBJ_PTR c_convert_mm_to_output(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
174
|
+
{
|
175
|
+
val = convert_mm_to_output(val);
|
176
|
+
return Float_New(val);
|
177
|
+
}
|
178
|
+
|
179
|
+
OBJ_PTR c_convert_output_to_mm(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
180
|
+
{
|
181
|
+
val = convert_output_to_mm(val);
|
182
|
+
return Float_New(val);
|
183
|
+
}
|
184
|
+
|
185
|
+
OBJ_PTR c_convert_page_to_output_x(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
186
|
+
{
|
187
|
+
val = convert_page_to_output_x(p,val);
|
188
|
+
return Float_New(val);
|
189
|
+
}
|
190
|
+
|
191
|
+
OBJ_PTR c_convert_page_to_output_y(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
192
|
+
{
|
193
|
+
val = convert_page_to_output_y(p,val);
|
194
|
+
return Float_New(val);
|
195
|
+
}
|
196
|
+
|
197
|
+
OBJ_PTR c_convert_page_to_output_dx(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
198
|
+
{
|
199
|
+
val = convert_page_to_output_dx(p,val);
|
200
|
+
return Float_New(val);
|
201
|
+
}
|
202
|
+
|
203
|
+
OBJ_PTR c_convert_page_to_output_dy(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
204
|
+
{
|
205
|
+
val = convert_page_to_output_dy(p,val);
|
206
|
+
return Float_New(val);
|
207
|
+
}
|
208
|
+
|
209
|
+
OBJ_PTR c_convert_output_to_page_x(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
210
|
+
{
|
211
|
+
val = convert_output_to_page_x(p,val);
|
212
|
+
return Float_New(val);
|
213
|
+
}
|
214
|
+
|
215
|
+
OBJ_PTR c_convert_output_to_page_y(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
216
|
+
{
|
217
|
+
val = convert_output_to_page_y(p,val);
|
218
|
+
return Float_New(val);
|
219
|
+
}
|
220
|
+
|
221
|
+
OBJ_PTR c_convert_output_to_page_dx(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
222
|
+
{
|
223
|
+
val = convert_output_to_page_dx(p,val);
|
224
|
+
return Float_New(val);
|
225
|
+
}
|
226
|
+
|
227
|
+
OBJ_PTR c_convert_output_to_page_dy(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
228
|
+
{
|
229
|
+
val = convert_output_to_page_dy(p,val);
|
230
|
+
return Float_New(val);
|
231
|
+
}
|
232
|
+
|
233
|
+
OBJ_PTR c_convert_frame_to_page_x(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
234
|
+
{
|
235
|
+
val = convert_frame_to_page_x(p,val);
|
236
|
+
return Float_New(val);
|
237
|
+
}
|
238
|
+
|
239
|
+
OBJ_PTR c_convert_frame_to_page_y(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
240
|
+
{
|
241
|
+
val = convert_frame_to_page_y(p,val);
|
242
|
+
return Float_New(val);
|
243
|
+
}
|
244
|
+
|
245
|
+
OBJ_PTR c_convert_frame_to_page_dx(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
246
|
+
{
|
247
|
+
val = convert_frame_to_page_dx(p,val);
|
248
|
+
return Float_New(val);
|
249
|
+
}
|
250
|
+
|
251
|
+
OBJ_PTR c_convert_frame_to_page_dy(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
252
|
+
{
|
253
|
+
val = convert_frame_to_page_dy(p,val);
|
254
|
+
return Float_New(val);
|
255
|
+
}
|
256
|
+
|
257
|
+
OBJ_PTR c_convert_page_to_frame_x(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
258
|
+
{
|
259
|
+
val = convert_page_to_frame_x(p,val);
|
260
|
+
return Float_New(val);
|
261
|
+
}
|
262
|
+
|
263
|
+
OBJ_PTR c_convert_page_to_frame_y(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
264
|
+
{
|
265
|
+
val = convert_page_to_frame_y(p,val);
|
266
|
+
return Float_New(val);
|
267
|
+
}
|
268
|
+
|
269
|
+
OBJ_PTR c_convert_page_to_frame_dx(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
270
|
+
{
|
271
|
+
val = convert_page_to_frame_dx(p,val);
|
272
|
+
return Float_New(val);
|
273
|
+
}
|
274
|
+
|
275
|
+
OBJ_PTR c_convert_page_to_frame_dy(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
276
|
+
{
|
277
|
+
val = convert_page_to_frame_dy(p,val);
|
278
|
+
return Float_New(val);
|
279
|
+
}
|
280
|
+
|
281
|
+
OBJ_PTR c_convert_figure_to_frame_x(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
282
|
+
{
|
283
|
+
val = convert_figure_to_frame_x(p,val);
|
284
|
+
return Float_New(val);
|
285
|
+
}
|
286
|
+
|
287
|
+
OBJ_PTR c_convert_figure_to_frame_y(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
288
|
+
{
|
289
|
+
val = convert_figure_to_frame_y(p,val);
|
290
|
+
return Float_New(val);
|
291
|
+
}
|
292
|
+
|
293
|
+
OBJ_PTR c_convert_figure_to_frame_dx(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
294
|
+
{
|
295
|
+
val = convert_figure_to_frame_dx(p,val);
|
296
|
+
return Float_New(val);
|
297
|
+
}
|
298
|
+
|
299
|
+
OBJ_PTR c_convert_figure_to_frame_dy(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
300
|
+
{
|
301
|
+
val = convert_figure_to_frame_dy(p,val);
|
302
|
+
return Float_New(val);
|
303
|
+
}
|
304
|
+
|
305
|
+
OBJ_PTR c_convert_frame_to_figure_x(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
306
|
+
{
|
307
|
+
val = convert_frame_to_figure_x(p,val);
|
308
|
+
return Float_New(val);
|
309
|
+
}
|
310
|
+
|
311
|
+
OBJ_PTR c_convert_frame_to_figure_y(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
312
|
+
{
|
313
|
+
val = convert_frame_to_figure_y(p,val);
|
314
|
+
return Float_New(val);
|
315
|
+
}
|
316
|
+
|
317
|
+
OBJ_PTR c_convert_frame_to_figure_dx(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
318
|
+
{
|
319
|
+
val = convert_frame_to_figure_dx(p,val);
|
320
|
+
return Float_New(val);
|
321
|
+
}
|
322
|
+
|
323
|
+
OBJ_PTR c_convert_frame_to_figure_dy(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
324
|
+
{
|
325
|
+
val = convert_frame_to_figure_dy(p,val);
|
326
|
+
return Float_New(val);
|
327
|
+
}
|
328
|
+
|
329
|
+
double convert_figure_to_output_x(FM *p, double x)
|
330
|
+
{
|
331
|
+
x = convert_figure_to_frame_x(p,x);
|
332
|
+
x = convert_frame_to_page_x(p,x);
|
333
|
+
x = convert_page_to_output_x(p,x);
|
334
|
+
return x;
|
335
|
+
}
|
336
|
+
|
337
|
+
double convert_figure_to_output_dy(FM *p, double dy)
|
338
|
+
{
|
339
|
+
dy = convert_figure_to_frame_dy(p,dy);
|
340
|
+
dy = convert_frame_to_page_dy(p,dy);
|
341
|
+
dy = convert_page_to_output_dy(p,dy);
|
342
|
+
return dy;
|
343
|
+
}
|
344
|
+
|
345
|
+
double convert_figure_to_output_dx(FM *p, double dx)
|
346
|
+
{
|
347
|
+
dx = convert_figure_to_frame_dx(p,dx);
|
348
|
+
dx = convert_frame_to_page_dx(p,dx);
|
349
|
+
dx = convert_page_to_output_dx(p,dx);
|
350
|
+
return dx;
|
351
|
+
}
|
352
|
+
|
353
|
+
double convert_figure_to_output_y(FM *p, double y)
|
354
|
+
{
|
355
|
+
y = convert_figure_to_frame_y(p,y);
|
356
|
+
y = convert_frame_to_page_y(p,y);
|
357
|
+
y = convert_page_to_output_y(p,y);
|
358
|
+
return y;
|
359
|
+
}
|
360
|
+
|
361
|
+
OBJ_PTR c_convert_figure_to_output_x(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
362
|
+
{
|
363
|
+
return Float_New(convert_figure_to_output_x(p,val));
|
364
|
+
}
|
365
|
+
|
366
|
+
OBJ_PTR c_convert_figure_to_output_y(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
367
|
+
{
|
368
|
+
return Float_New(convert_figure_to_output_y(p,val));
|
369
|
+
}
|
370
|
+
|
371
|
+
OBJ_PTR c_convert_figure_to_output_dx(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
372
|
+
{
|
373
|
+
return Float_New(convert_figure_to_output_dx(p,val));
|
374
|
+
}
|
375
|
+
|
376
|
+
OBJ_PTR c_convert_figure_to_output_dy(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
377
|
+
{
|
378
|
+
return Float_New(convert_figure_to_output_dy(p,val));
|
379
|
+
}
|
380
|
+
|
381
|
+
double convert_output_to_figure_x(FM *p, double x)
|
382
|
+
{
|
383
|
+
x = convert_output_to_page_x(p,x);
|
384
|
+
x = convert_page_to_frame_x(p,x);
|
385
|
+
x = convert_frame_to_figure_x(p,x);
|
386
|
+
return x;
|
387
|
+
}
|
388
|
+
|
389
|
+
double convert_output_to_figure_dy(FM *p, double dy)
|
390
|
+
{
|
391
|
+
dy = convert_output_to_page_dy(p,dy);
|
392
|
+
dy = convert_page_to_frame_dy(p,dy);
|
393
|
+
dy = convert_frame_to_figure_dy(p,dy);
|
394
|
+
return dy;
|
395
|
+
}
|
396
|
+
|
397
|
+
double convert_output_to_figure_dx(FM *p, double dx)
|
398
|
+
{
|
399
|
+
dx = convert_output_to_page_dx(p,dx);
|
400
|
+
dx = convert_page_to_frame_dx(p,dx);
|
401
|
+
dx = convert_frame_to_figure_dx(p,dx);
|
402
|
+
return dx;
|
403
|
+
}
|
404
|
+
|
405
|
+
double convert_output_to_figure_y(FM *p, double y)
|
406
|
+
{
|
407
|
+
y = convert_output_to_page_y(p,y);
|
408
|
+
y = convert_page_to_frame_y(p,y);
|
409
|
+
y = convert_frame_to_figure_y(p,y);
|
410
|
+
return y;
|
411
|
+
}
|
412
|
+
|
413
|
+
OBJ_PTR c_convert_output_to_figure_x(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
414
|
+
{
|
415
|
+
return Float_New(convert_output_to_figure_x(p,val));
|
416
|
+
}
|
417
|
+
|
418
|
+
OBJ_PTR c_convert_output_to_figure_y(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
419
|
+
{
|
420
|
+
return Float_New(convert_output_to_figure_y(p,val));
|
421
|
+
}
|
422
|
+
|
423
|
+
OBJ_PTR c_convert_output_to_figure_dx(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
424
|
+
{ return Float_New(convert_output_to_figure_dx(p,val)); }
|
425
|
+
|
426
|
+
OBJ_PTR c_convert_output_to_figure_dy(OBJ_PTR fmkr, FM *p, double val, int *ierr)
|
427
|
+
{ return Float_New(convert_output_to_figure_dy(p,val)); }
|
428
|
+
|
429
|
+
void c_private_set_default_font_size(OBJ_PTR fmkr, FM *p, double size, int *ierr) {
|
430
|
+
p->default_font_size = size;
|
431
|
+
Recalc_Font_Hts(p);
|
432
|
+
}
|
433
|
+
|
434
|
+
void c_doing_subplot(OBJ_PTR fmkr, FM *p, int *ierr)
|
435
|
+
{
|
436
|
+
p->in_subplot = true;
|
437
|
+
}
|
438
|
+
|
439
|
+
void c_doing_subfigure(OBJ_PTR fmkr, FM *p, int *ierr)
|
440
|
+
{
|
441
|
+
p->root_figure = false;
|
442
|
+
}
|
443
|
+
|
@@ -48,9 +48,9 @@ char *predefined_Fonts[] = { /* must match the font numbers in FigureConstants.r
|
|
48
48
|
int num_predefined_fonts = 14;
|
49
49
|
int num_pdf_standard_fonts = 14;
|
50
50
|
|
51
|
-
long
|
52
|
-
|
53
|
-
|
51
|
+
long *obj_offsets, capacity_obj_offsets, stream_start, stream_end, length_offset, xref_offset;
|
52
|
+
long num_objects, next_available_object_number, next_available_gs_number, next_available_xo_number;
|
53
|
+
long next_available_shade_number, next_available_font_number;
|
54
54
|
Stroke_Opacity_State *stroke_opacities = NULL;
|
55
55
|
Fill_Opacity_State *fill_opacities = NULL;
|
56
56
|
XObject_Info *xobj_list = NULL;
|
@@ -63,7 +63,7 @@ FILE *TF = NULL; // for the temp file
|
|
63
63
|
|
64
64
|
/* PDF File Management */
|
65
65
|
|
66
|
-
void Free_XObjects(
|
66
|
+
static void Free_XObjects(int *ierr)
|
67
67
|
{
|
68
68
|
XObject_Info *xo;
|
69
69
|
while (xobj_list != NULL) {
|
@@ -72,19 +72,19 @@ void Free_XObjects(void)
|
|
72
72
|
switch (xo->xobj_subtype) {
|
73
73
|
case JPG_SUBTYPE: Free_JPG((JPG_Info *)xo); break;
|
74
74
|
case SAMPLED_SUBTYPE: Free_Sampled((Sampled_Info *)xo); break;
|
75
|
-
default:
|
75
|
+
default: RAISE_ERROR_i("Invalid XObject subtype (%i)", xo->xobj_subtype, ierr); return;
|
76
76
|
}
|
77
77
|
free(xo);
|
78
78
|
}
|
79
79
|
}
|
80
80
|
|
81
|
-
void Init_pdf(
|
81
|
+
void Init_pdf(int *ierr)
|
82
82
|
{
|
83
83
|
int i;
|
84
84
|
writing_file = false;
|
85
85
|
capacity_obj_offsets = 1000;
|
86
86
|
num_objects = 0;
|
87
|
-
obj_offsets =
|
87
|
+
obj_offsets = ALLOC_N_long(capacity_obj_offsets);
|
88
88
|
for (i=0; i < capacity_obj_offsets; i++) obj_offsets[i] = 0;
|
89
89
|
}
|
90
90
|
|
@@ -93,7 +93,7 @@ void Record_Object_Offset(int obj_number)
|
|
93
93
|
long int offset = ftell(OF);
|
94
94
|
if (obj_number >= capacity_obj_offsets) {
|
95
95
|
int size_increment = 50, i;
|
96
|
-
|
96
|
+
REALLOC_long(&obj_offsets, obj_number + size_increment);
|
97
97
|
capacity_obj_offsets = obj_number + size_increment;
|
98
98
|
for (i=num_objects; i < capacity_obj_offsets; i++) obj_offsets[i] = 0;
|
99
99
|
}
|
@@ -101,17 +101,18 @@ void Record_Object_Offset(int obj_number)
|
|
101
101
|
if (obj_number >= num_objects) num_objects = obj_number + 1;
|
102
102
|
}
|
103
103
|
|
104
|
-
static void Write_XObjects(
|
104
|
+
static void Write_XObjects(int *ierr)
|
105
105
|
{
|
106
106
|
XObject_Info *xo;
|
107
107
|
for (xo = xobj_list; xo != NULL; xo = xo->next) {
|
108
108
|
Record_Object_Offset(xo->obj_num);
|
109
109
|
fprintf(OF, "%i 0 obj << /Type /XObject ", xo->obj_num);
|
110
110
|
switch (xo->xobj_subtype) {
|
111
|
-
case JPG_SUBTYPE: Write_JPG((JPG_Info *)xo); break;
|
112
|
-
case SAMPLED_SUBTYPE: Write_Sampled((Sampled_Info *)xo); break;
|
113
|
-
default:
|
111
|
+
case JPG_SUBTYPE: Write_JPG((JPG_Info *)xo, ierr); break;
|
112
|
+
case SAMPLED_SUBTYPE: Write_Sampled((Sampled_Info *)xo, ierr); break;
|
113
|
+
default: RAISE_ERROR_i("Invalid XObject subtype (%i)", xo->xobj_subtype, ierr);
|
114
114
|
}
|
115
|
+
if (*ierr != 0) return;
|
115
116
|
fprintf(OF, ">> endobj\n");
|
116
117
|
}
|
117
118
|
}
|
@@ -123,9 +124,9 @@ static void Write_XObjects(void)
|
|
123
124
|
#define CATALOG_OBJ 5
|
124
125
|
#define FIRST_OTHER_OBJ 6
|
125
126
|
|
126
|
-
static void Free_Records()
|
127
|
+
static void Free_Records(int *ierr)
|
127
128
|
{
|
128
|
-
Free_Stroke_Opacities(); Free_Fill_Opacities(); Free_XObjects(); Free_Shadings(); Free_Functions();
|
129
|
+
Free_Stroke_Opacities(); Free_Fill_Opacities(); Free_XObjects(ierr); Free_Shadings(); Free_Functions();
|
129
130
|
}
|
130
131
|
|
131
132
|
static void Get_pdf_name(char *ofile, char *filename, int maxlen)
|
@@ -137,13 +138,13 @@ static void Get_pdf_name(char *ofile, char *filename, int maxlen)
|
|
137
138
|
strcat(ofile, "_figure.pdf");
|
138
139
|
}
|
139
140
|
|
140
|
-
void Open_pdf(
|
141
|
-
{
|
142
|
-
FM *p = Get_FM(fmkr);
|
141
|
+
void Open_pdf(OBJ_PTR fmkr, FM *p, char *filename, bool quiet_mode, int *ierr) {
|
143
142
|
int i;
|
144
|
-
if (writing_file)
|
143
|
+
if (writing_file) {
|
144
|
+
RAISE_ERROR("Sorry: cannot start a new output file until finish current one.", ierr); return; }
|
145
145
|
Clear_Fonts_In_Use_Flags();
|
146
|
-
Free_Records();
|
146
|
+
Free_Records(ierr);
|
147
|
+
if (*ierr != 0) return;
|
147
148
|
next_available_object_number = FIRST_OTHER_OBJ;
|
148
149
|
next_available_font_number = num_predefined_fonts + 1;
|
149
150
|
next_available_gs_number = 1;
|
@@ -153,10 +154,10 @@ void Open_pdf(VALUE fmkr, char *filename, bool quiet_mode)
|
|
153
154
|
time_t now = time(NULL);
|
154
155
|
char ofile[300], timestring[100];
|
155
156
|
Get_pdf_name(ofile, filename, 300);
|
156
|
-
if ((OF = fopen(ofile, "w")) == NULL)
|
157
|
-
|
158
|
-
if ((TF = tmpfile()) == NULL)
|
159
|
-
|
157
|
+
if ((OF = fopen(ofile, "w")) == NULL) {
|
158
|
+
RAISE_ERROR_s("Sorry: can't open %s.\n", filename, ierr); return; }
|
159
|
+
if ((TF = tmpfile()) == NULL) {
|
160
|
+
RAISE_ERROR_s("Sorry: can't create temp file for writing PDF file %s.\n", filename, ierr); return; }
|
160
161
|
/* open PDF file and write header */
|
161
162
|
fprintf(OF, "%%PDF-1.4\n");
|
162
163
|
strcpy(timestring, ctime(&now));
|
@@ -178,25 +179,22 @@ void Open_pdf(VALUE fmkr, char *filename, bool quiet_mode)
|
|
178
179
|
Get_pdf_xoffset(), Get_pdf_yoffset());
|
179
180
|
/* set stroke and fill colors to black */
|
180
181
|
have_current_point = constructing_path = false;
|
181
|
-
c_line_width_set(p, p->line_width);
|
182
|
-
c_line_cap_set(p, p->line_cap);
|
183
|
-
c_line_join_set(p, p->line_join);
|
184
|
-
c_miter_limit_set(p, p->miter_limit);
|
185
|
-
|
186
|
-
|
187
|
-
|
182
|
+
c_line_width_set(fmkr, p, p->line_width, ierr);
|
183
|
+
c_line_cap_set(fmkr, p, p->line_cap, ierr);
|
184
|
+
c_line_join_set(fmkr, p, p->line_join, ierr);
|
185
|
+
c_miter_limit_set(fmkr, p, p->miter_limit, ierr);
|
186
|
+
c_line_type_set(fmkr, p, Get_line_type(fmkr, ierr), ierr);
|
187
|
+
c_stroke_color_set_RGB(fmkr, p, p->stroke_color_R, p->stroke_color_G, p->stroke_color_B, ierr);
|
188
|
+
c_fill_color_set_RGB(fmkr, p, p->fill_color_R, p->fill_color_G, p->fill_color_B, ierr);
|
188
189
|
// initialize clip region
|
189
190
|
bbox_llx = bbox_lly = 1e5;
|
190
191
|
bbox_urx = bbox_ury = -1e5;
|
191
192
|
}
|
192
193
|
|
193
|
-
void Start_Axis_Standard_State(FM *p,
|
194
|
+
void Start_Axis_Standard_State(OBJ_PTR fmkr, FM *p, double r, double g, double b, double line_width, int *ierr) {
|
194
195
|
fprintf(TF, "q 2 J [] 0 d\n");
|
195
|
-
c_line_width_set(p, line_width);
|
196
|
-
|
197
|
-
FM_stroke_color_set(p->fm, color);
|
198
|
-
else
|
199
|
-
fprintf(TF, "0 0 0 RG\n"); // black
|
196
|
+
c_line_width_set(fmkr, p, line_width, ierr);
|
197
|
+
c_stroke_color_set_RGB(fmkr, p, r, g, b, ierr);
|
200
198
|
/* 2 J sets the line cap style to square cap */
|
201
199
|
/* set stroke and fill colors to black. set line type to solid */
|
202
200
|
}
|
@@ -213,29 +211,33 @@ void Write_grestore(void)
|
|
213
211
|
fprintf(TF, "Q\n");
|
214
212
|
}
|
215
213
|
|
216
|
-
void
|
214
|
+
void c_pdf_gsave(OBJ_PTR fmkr, FM *p, int *ierr) { Write_gsave(); }
|
215
|
+
void c_pdf_grestore(OBJ_PTR fmkr, FM *p, int *ierr) { Write_grestore(); }
|
216
|
+
|
217
|
+
static void Print_Xref(long int offset) {
|
217
218
|
char line[80];
|
218
219
|
int i, len;
|
219
|
-
|
220
|
+
snprintf(line,sizeof(line), "%li", offset);
|
220
221
|
len = strlen(line);
|
221
222
|
for (i=0; i < 10-len; i++) fputc('0', OF);
|
222
223
|
fprintf(OF, "%s 00000 n \n", line);
|
223
224
|
}
|
224
225
|
|
225
|
-
static void Write_Stream(
|
226
|
+
static void Write_Stream(int *ierr)
|
226
227
|
{
|
227
228
|
long int len = ftell(TF);
|
228
229
|
unsigned long int new_len = (len * 11) / 10 + 100;
|
229
230
|
unsigned char *buffer, *dest_buffer;
|
230
231
|
rewind(TF);
|
231
|
-
buffer =
|
232
|
-
dest_buffer =
|
232
|
+
buffer = ALLOC_N_unsigned_char(len+1);
|
233
|
+
dest_buffer = ALLOC_N_unsigned_char(new_len+1);
|
233
234
|
fread(buffer, 1, len, TF);
|
234
235
|
fclose(TF);
|
235
236
|
if (FLATE_ENCODE) {
|
236
|
-
if (
|
237
|
+
if (do_flate_compress(dest_buffer, &new_len, buffer, len) != FLATE_OK) {
|
237
238
|
free(buffer); free(dest_buffer);
|
238
|
-
|
239
|
+
RAISE_ERROR("Error compressing PDF stream data", ierr);
|
240
|
+
return;
|
239
241
|
}
|
240
242
|
fwrite(dest_buffer, 1, new_len, OF);
|
241
243
|
} else {
|
@@ -244,15 +246,15 @@ static void Write_Stream(void)
|
|
244
246
|
free(buffer); free(dest_buffer);
|
245
247
|
}
|
246
248
|
|
247
|
-
void Close_pdf(
|
249
|
+
void Close_pdf(OBJ_PTR fmkr, FM *p, bool quiet_mode, int *ierr)
|
248
250
|
{
|
249
|
-
FM *p = Get_FM(fmkr);
|
250
251
|
int i;
|
251
252
|
double llx, lly, urx, ury, xoff, yoff;
|
252
|
-
if (!writing_file)
|
253
|
+
if (!writing_file) { RAISE_ERROR("Sorry: cannot End_Output if not writing file.", ierr); return; }
|
253
254
|
writing_file = false;
|
254
|
-
if (constructing_path)
|
255
|
-
Write_Stream();
|
255
|
+
if (constructing_path) { RAISE_ERROR("Sorry: must finish with current path before ending file", ierr); return; }
|
256
|
+
Write_Stream(ierr);
|
257
|
+
if (*ierr != 0) return;
|
256
258
|
stream_end = ftell(OF);
|
257
259
|
fprintf(OF, "endstream\nendobj\n");
|
258
260
|
Record_Object_Offset(PAGE_OBJ);
|
@@ -269,7 +271,7 @@ void Close_pdf(VALUE fmkr, bool quiet_mode)
|
|
269
271
|
lly = bbox_lly / ENLARGE + yoff - MARGIN;
|
270
272
|
urx = bbox_urx / ENLARGE + xoff + MARGIN;
|
271
273
|
ury = bbox_ury / ENLARGE + yoff + MARGIN;
|
272
|
-
if (urx < llx || ury < lly)
|
274
|
+
if (urx < llx || ury < lly) { RAISE_ERROR("Sorry: Empty plot!", ierr); return; }
|
273
275
|
fprintf(OF, "%d %d %d %d", ROUND(llx), ROUND(lly), ROUND(urx), ROUND(ury));
|
274
276
|
fprintf(OF, " ]\n/Contents %i 0 R\n/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]\n", STREAM_OBJ);
|
275
277
|
if (Used_Any_Fonts()) {
|
@@ -318,8 +320,10 @@ void Close_pdf(VALUE fmkr, bool quiet_mode)
|
|
318
320
|
Write_Font_Widths();
|
319
321
|
Write_Stroke_Opacity_Objects();
|
320
322
|
Write_Fill_Opacity_Objects();
|
321
|
-
Write_XObjects();
|
322
|
-
|
323
|
+
Write_XObjects(ierr);
|
324
|
+
if (*ierr != 0) return;
|
325
|
+
Write_Functions(ierr);
|
326
|
+
if (*ierr != 0) return;
|
323
327
|
Write_Shadings();
|
324
328
|
xref_offset = ftell(OF);
|
325
329
|
fprintf(OF, "xref\n0 %i\n0000000000 65535 f \n", num_objects);
|
@@ -329,7 +333,7 @@ void Close_pdf(VALUE fmkr, bool quiet_mode)
|
|
329
333
|
fseek(OF, length_offset, SEEK_SET);
|
330
334
|
fprintf(OF, "%li", stream_end - stream_start);
|
331
335
|
fclose(OF);
|
332
|
-
Free_Records();
|
336
|
+
Free_Records(ierr);
|
333
337
|
}
|
334
338
|
|
335
339
|
void Rename_pdf(char *oldname, char *newname)
|