tioga 1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. data/Tioga_README +372 -0
  2. data/lgpl.txt +504 -0
  3. data/split/Dtable/defs.h +33 -0
  4. data/split/Dtable/dtable.c +1928 -0
  5. data/split/Dtable/dtable_intern.h +144 -0
  6. data/split/Dtable/dvector.h +61 -0
  7. data/split/Dtable/extconf.rb +4 -0
  8. data/split/Dtable/include/dtable.h +35 -0
  9. data/split/Dtable/lib/Dtable_extras.rb +90 -0
  10. data/split/Dtable/namespace.h +47 -0
  11. data/split/Dtable/safe_double.h +104 -0
  12. data/split/Dtable/symbols.c +92 -0
  13. data/split/Dtable/symbols.h +52 -0
  14. data/split/Dvector/defs.h +33 -0
  15. data/split/Dvector/dvector.c +5486 -0
  16. data/split/Dvector/dvector_intern.h +142 -0
  17. data/split/Dvector/extconf.rb +4 -0
  18. data/split/Dvector/include/dvector.h +61 -0
  19. data/split/Dvector/lib/Dvector_extras.rb +328 -0
  20. data/split/Dvector/lib/Numeric_extras.rb +134 -0
  21. data/split/Dvector/namespace.h +47 -0
  22. data/split/Dvector/safe_double.h +104 -0
  23. data/split/Dvector/symbols.c +92 -0
  24. data/split/Dvector/symbols.h +52 -0
  25. data/split/Flate/defs.h +33 -0
  26. data/split/Flate/extconf.rb +19 -0
  27. data/split/Flate/flate.c +156 -0
  28. data/split/Flate/flate_intern.h +97 -0
  29. data/split/Flate/include/flate.h +98 -0
  30. data/split/Flate/namespace.h +47 -0
  31. data/split/Flate/safe_double.h +104 -0
  32. data/split/Flate/symbols.c +92 -0
  33. data/split/Flate/symbols.h +52 -0
  34. data/split/Function/defs.h +33 -0
  35. data/split/Function/dvector.h +61 -0
  36. data/split/Function/extconf.rb +4 -0
  37. data/split/Function/function.c +988 -0
  38. data/split/Function/joint_qsort.c +258 -0
  39. data/split/Function/lib/Function_extras.rb +44 -0
  40. data/split/Function/namespace.h +47 -0
  41. data/split/Function/safe_double.h +104 -0
  42. data/split/Function/symbols.c +92 -0
  43. data/split/Function/symbols.h +52 -0
  44. data/split/Tioga/axes.c +774 -0
  45. data/split/Tioga/defs.h +33 -0
  46. data/split/Tioga/dtable.h +35 -0
  47. data/split/Tioga/dvector.h +61 -0
  48. data/split/Tioga/extconf.rb +4 -0
  49. data/split/Tioga/figures.c +672 -0
  50. data/split/Tioga/figures.h +855 -0
  51. data/split/Tioga/flate.h +98 -0
  52. data/split/Tioga/init.c +524 -0
  53. data/split/Tioga/lib/Arcs_and_Circles.rb +64 -0
  54. data/split/Tioga/lib/ColorConstants.rb +274 -0
  55. data/split/Tioga/lib/Colorbars.rb +10 -0
  56. data/split/Tioga/lib/Colormaps.rb +105 -0
  57. data/split/Tioga/lib/Coordinate_Conversions.rb +194 -0
  58. data/split/Tioga/lib/Creating_Paths.rb +94 -0
  59. data/split/Tioga/lib/Doc.rb +91 -0
  60. data/split/Tioga/lib/Executive.rb +515 -0
  61. data/split/Tioga/lib/FigMkr.rb +2224 -0
  62. data/split/Tioga/lib/FigureConstants.rb +125 -0
  63. data/split/Tioga/lib/Figures_and_Plots.rb +268 -0
  64. data/split/Tioga/lib/Images.rb +278 -0
  65. data/split/Tioga/lib/Legends.rb +190 -0
  66. data/split/Tioga/lib/MarkerConstants.rb +122 -0
  67. data/split/Tioga/lib/Markers.rb +129 -0
  68. data/split/Tioga/lib/Page_Frame_Bounds.rb +567 -0
  69. data/split/Tioga/lib/Rectangles.rb +94 -0
  70. data/split/Tioga/lib/Shading.rb +100 -0
  71. data/split/Tioga/lib/Special_Paths.rb +307 -0
  72. data/split/Tioga/lib/Strokes.rb +129 -0
  73. data/split/Tioga/lib/TeX_Text.rb +454 -0
  74. data/split/Tioga/lib/TexPreamble.rb +358 -0
  75. data/split/Tioga/lib/Titles_and_Labels.rb +306 -0
  76. data/split/Tioga/lib/Transparency.rb +89 -0
  77. data/split/Tioga/lib/Using_Paths.rb +164 -0
  78. data/split/Tioga/lib/Utils.rb +74 -0
  79. data/split/Tioga/lib/X_and_Y_Axes.rb +749 -0
  80. data/split/Tioga/lib/irb_tioga.rb +122 -0
  81. data/split/Tioga/lib/tioga.rb +1 -0
  82. data/split/Tioga/lib/tioga_ui.rb +5 -0
  83. data/split/Tioga/lib/tioga_ui_cmds.rb +793 -0
  84. data/split/Tioga/makers.c +989 -0
  85. data/split/Tioga/mk_tioga_sty.rb +53 -0
  86. data/split/Tioga/namespace.h +47 -0
  87. data/split/Tioga/pdf_font_dicts.c +18253 -0
  88. data/split/Tioga/pdfcolor.c +486 -0
  89. data/split/Tioga/pdfcoords.c +505 -0
  90. data/split/Tioga/pdffile.c +342 -0
  91. data/split/Tioga/pdfimage.c +536 -0
  92. data/split/Tioga/pdfpath.c +914 -0
  93. data/split/Tioga/pdfs.h +229 -0
  94. data/split/Tioga/pdftext.c +443 -0
  95. data/split/Tioga/safe_double.h +104 -0
  96. data/split/Tioga/symbols.c +92 -0
  97. data/split/Tioga/symbols.h +52 -0
  98. data/split/Tioga/texout.c +380 -0
  99. data/split/defs.h +33 -0
  100. data/split/extconf.rb +107 -0
  101. data/split/mkmf2.rb +1612 -0
  102. data/split/namespace.h +47 -0
  103. data/split/safe_double.h +104 -0
  104. data/split/scripts/tioga +4 -0
  105. data/split/symbols.c +92 -0
  106. data/split/symbols.h +52 -0
  107. data/tests/dtable_test.data +6 -0
  108. data/tests/dvector_read_test.data +1 -0
  109. data/tests/dvector_test.data +101 -0
  110. data/tests/tc_Dtable.rb +221 -0
  111. data/tests/tc_Dvector.rb +791 -0
  112. data/tests/tc_FMkr.rb +162 -0
  113. data/tests/tc_Flate.rb +45 -0
  114. data/tests/tc_Function.rb +111 -0
  115. data/tests/ts_Tioga.rb +38 -0
  116. metadata +163 -0
@@ -0,0 +1,104 @@
1
+ /**********************************************************************
2
+
3
+ safe_double.h: small abstraction for storing double without endianess
4
+ problems
5
+
6
+ Copyright (C) 2006 Vincent Fourmond
7
+
8
+ This program is free software; you can redistribute it and/or modify
9
+ it under the terms of the GNU General Library Public License as published
10
+ by the Free Software Foundation; either version 2 of the License, or
11
+ (at your option) any later version.
12
+
13
+ This program is distributed in the hope that it will be useful,
14
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ GNU Library General Public License for more details.
17
+
18
+ You should have received a copy of the GNU Library General Public License
19
+ along with this program; if not, write to the Free Software
20
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
+
22
+ **********************************************************************/
23
+
24
+ /* This file provides two functions: store_double and get_double, which
25
+ can be used in a 'safe' way to store doubles and retrive them
26
+ in a hopefully platform-independent form. However, it just
27
+ stores it without regards to that if ieee754.h isn't found...
28
+ */
29
+
30
+ #ifndef _DOUBLE_H
31
+ #define _DOUBLE_H
32
+
33
+ #define STORE_LOWER_BYTE(a,p) do {\
34
+ *(p++) = (a) & 0xFF; (a) >>= 8; }\
35
+ while(0)
36
+ #define STORE_UNSIGNED(a,p) for(i = 0; i < 4; i++) STORE_LOWER_BYTE(a,p);
37
+ #define GET_UNSIGNED(a,p) do { a = 0; for(i = 0; i < 4; i++) \
38
+ (a) |= *(p++) << (i * 8); } while (0)
39
+
40
+ #ifdef HAVE_IEEE754_H
41
+ #include <ieee754.h>
42
+
43
+
44
+ static inline void store_double(double a, unsigned char * p)
45
+ {
46
+ unsigned int tmp;
47
+ int i;
48
+ union ieee754_double d;
49
+ d.d = a;
50
+ /* we store it with lower bytes firts */
51
+ tmp = d.ieee.mantissa1;
52
+ STORE_UNSIGNED(tmp, p);
53
+ tmp = d.ieee.negative << 31 |
54
+ d.ieee.exponent << 20 |
55
+ d.ieee.mantissa0;
56
+ STORE_UNSIGNED(tmp, p);
57
+ }
58
+
59
+
60
+ static inline double get_double(const unsigned char * p)
61
+ {
62
+ unsigned int tmp;
63
+ int i;
64
+ union ieee754_double d;
65
+ GET_UNSIGNED(tmp, p);
66
+ d.ieee.mantissa1 = tmp;
67
+ GET_UNSIGNED(tmp, p);
68
+ d.ieee.mantissa0 = tmp & 0xFFFFF;
69
+ d.ieee.exponent = (tmp >> 20) & 0x7FF;
70
+ d.ieee.negative = (tmp >> 31) & 0x1;
71
+ return d.d;
72
+ }
73
+
74
+ #else
75
+
76
+ union basic_double{
77
+ double d;
78
+ struct {
79
+ unsigned int a:32;
80
+ unsigned int b:32;
81
+ } i;
82
+ };
83
+
84
+ static inline void store_double(double a, unsigned char * p)
85
+ {
86
+ union basic_double d;
87
+ int i;
88
+ d.d = a;
89
+ STORE_UNSIGNED(d.i.a, p);
90
+ STORE_UNSIGNED(d.i.b, p);
91
+ }
92
+
93
+ static inline double get_double(const unsigned char * p)
94
+ {
95
+ union basic_double d;
96
+ int i;
97
+ GET_UNSIGNED(d.i.a, p);
98
+ GET_UNSIGNED(d.i.b, p);
99
+ return d.d;
100
+ }
101
+
102
+ #endif /* HAVE_IEEE754_H */
103
+
104
+ #endif /* _DOUBLE_H */
@@ -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,380 @@
1
+ /* texout.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
+
24
+ #define RADIANS_TO_DEGREES (180.0 / PI)
25
+
26
+ static FILE *fp; // for the TeX file
27
+
28
+ /* TeX text */
29
+
30
+ void c_text_scale_set(FM *p, double scale)
31
+ {
32
+ double factor = scale / p->default_text_scale;
33
+ if (factor <= 0) rb_raise(rb_eArgError, "Sorry: text scaling must be positive");
34
+ p->default_text_height_dx *= factor;
35
+ p->default_text_height_dy *= factor;
36
+ p->default_text_scale = scale;
37
+ }
38
+
39
+ VALUE FM_rescale_text(VALUE fmkr, VALUE scaling_factor) // updates default text heights too
40
+ {
41
+ FM *p = Get_FM(fmkr);
42
+ scaling_factor = rb_Float(scaling_factor);
43
+ c_text_scale_set(p, NUM2DBL(scaling_factor) * p->default_text_scale);
44
+ return fmkr;
45
+ }
46
+
47
+ int String_Is_Blank(char *str) {
48
+ char c;
49
+ if (str == NULL) return 1;
50
+ while (1) {
51
+ c = *str++;
52
+ if (c == '\0') return 1;
53
+ if (!isspace(c)) break;
54
+ }
55
+ return 0;
56
+ }
57
+
58
+ void tex_show_rotated_text(FM *p, char *text, double x, double y, double scale, double angle, int justification, int alignment)
59
+ { // x and y are the device coords for the reference point of the text
60
+ char ref, jst;
61
+ double ft_ht, sz;
62
+ if (String_Is_Blank(text)) return; /* blank strings break TeX! */
63
+ scale *= p->default_text_scale;
64
+ ft_ht = scale * p->default_font_size;
65
+ sz = ft_ht * ENLARGE;
66
+ ref = (alignment == ALIGNED_AT_BASELINE)? 'B' :
67
+ (alignment == ALIGNED_AT_BOTTOM)? 'b' :
68
+ (alignment == ALIGNED_AT_TOP)? 't' : 'c';
69
+ if (justification == 0) jst = 'c';
70
+ else if (justification > 0) jst = 'r';
71
+ else jst = 'l';
72
+ bbox_llx = MIN(bbox_llx, x - sz);
73
+ bbox_lly = MIN(bbox_lly, y - sz);
74
+ bbox_urx = MAX(bbox_urx, x + sz);
75
+ bbox_ury = MAX(bbox_ury, y + sz);
76
+ if (angle != 0.0)
77
+ fprintf(fp,"\\put(%d,%d){\\rotatebox{%.1f}{\\scalebox{%.2f}{\\makebox(0,0)[%c%c]{\\tiogasetfont",
78
+ ROUND(x), ROUND(y), angle, scale, jst, ref);
79
+ else
80
+ fprintf(fp,"\\put(%d,%d){\\scalebox{%.2f}{\\makebox(0,0)[%c%c]{\\tiogasetfont",
81
+ ROUND(x), ROUND(y), scale, jst, ref);
82
+ fprintf(fp, (alignment == ALIGNED_AT_BASELINE)? "{%s\\BS" : "{%s", text);
83
+ fprintf(fp, angle != 0? "}}}}}\n" : "}}}}\n");
84
+ }
85
+
86
+ static void Convert_Frame_Text_Position_To_Output_Location(FM *p, int frame_side, double offset,
87
+ double fraction, double *xp, double *yp, double *base_angle, char *text)
88
+ {
89
+ double page_x, page_y;
90
+ switch (frame_side) {
91
+ case LEFT:
92
+ page_x = p->page_width * p->frame_left - offset;
93
+ page_y = p->page_height * (p->frame_bottom + fraction * p->frame_height);
94
+ *base_angle = 90;
95
+ break;
96
+ case RIGHT:
97
+ page_x = p->page_width * p->frame_right + offset;
98
+ page_y = p->page_height * (p->frame_bottom + fraction * p->frame_height);
99
+ *base_angle = 90;
100
+ break;
101
+ case AT_X_ORIGIN:
102
+ if (0.0 > p->bounds_xmax || 0.0 < p->bounds_xmin)
103
+ rb_raise(rb_eArgError, "Sorry: x origin is not part of plot for (%s)", text);
104
+ page_x = convert_figure_to_output_x(p, 0.0);
105
+ if (p->xaxis_reversed) offset = -offset;
106
+ page_x += offset;
107
+ page_y = p->page_height * (p->frame_bottom + fraction * p->frame_height);
108
+ *base_angle = 90;
109
+ break;
110
+ case TOP:
111
+ page_y = p->page_height * p->frame_top + offset;
112
+ page_x = p->page_width * (p->frame_left + fraction * p->frame_width);
113
+ *base_angle = 0;
114
+ break;
115
+ case BOTTOM:
116
+ page_y = p->page_height * p->frame_bottom - offset;
117
+ page_x = p->page_width * (p->frame_left + fraction * p->frame_width);
118
+ *base_angle = 0;
119
+ break;
120
+ case AT_Y_ORIGIN:
121
+ if (0.0 > p->bounds_ymax || 0.0 < p->bounds_ymin)
122
+ rb_raise(rb_eArgError, "Sorry: y origin is not part of plot for (%s)", text);
123
+ page_y = convert_figure_to_output_y(p, 0.0);
124
+ if (p->yaxis_reversed) offset = -offset;
125
+ page_y += offset;
126
+ page_x = p->page_width * (p->frame_left + fraction * p->frame_width);
127
+ *base_angle = 0;
128
+ break;
129
+ default: rb_raise(rb_eArgError, "Sorry: invalid parameter for frame side in show text (%s)", text);
130
+ }
131
+ *xp = p->page_left + page_x; *yp = p->page_bottom + page_y;
132
+ }
133
+
134
+ void c_show_rotated_text(FM *p, char *text, int frame_side, double shift, double fraction,
135
+ double scale, double angle, int justification, int alignment)
136
+ {
137
+ double x, y, base_angle, ft_ht = p->default_text_scale * scale * p->default_font_size;
138
+ Convert_Frame_Text_Position_To_Output_Location(p, frame_side, shift*ft_ht*ENLARGE, fraction, &x, &y, &base_angle, text);
139
+ tex_show_rotated_text(p, text, x, y, scale, angle + base_angle, justification, alignment);
140
+ }
141
+
142
+ VALUE FM_show_rotated_text(VALUE fmkr, VALUE text, VALUE frame_side, VALUE shift,
143
+ VALUE fraction, VALUE scale, VALUE angle, VALUE justification, VALUE alignment)
144
+ {
145
+ FM *p = Get_FM(fmkr);
146
+ text = rb_String(text);
147
+ frame_side = rb_Integer(frame_side);
148
+ shift = rb_Float(shift);
149
+ fraction = rb_Float(fraction);
150
+ scale = rb_Float(scale);
151
+ angle = rb_Float(angle);
152
+ justification = rb_Integer(justification);
153
+ alignment = rb_Integer(alignment);
154
+ c_show_rotated_text(p, RSTRING(text)->ptr, NUM2INT(frame_side), NUM2DBL(shift),
155
+ NUM2DBL(fraction), NUM2DBL(scale), NUM2DBL(angle), NUM2INT(justification), NUM2INT(alignment));
156
+ return fmkr;
157
+ }
158
+
159
+ void c_show_rotated_label(FM *p, char *text,
160
+ double xloc, double yloc, double scale, double angle, int justification, int alignment)
161
+ {
162
+ tex_show_rotated_text(p, text, convert_figure_to_output_x(p, xloc), convert_figure_to_output_y(p, yloc),
163
+ scale, angle, justification, alignment);
164
+ }
165
+
166
+ VALUE FM_show_rotated_label(VALUE fmkr, VALUE text,
167
+ VALUE xloc, VALUE yloc, VALUE scale, VALUE angle, VALUE justification, VALUE alignment)
168
+ {
169
+ FM *p = Get_FM(fmkr);
170
+ text = rb_String(text);
171
+ xloc = rb_Float(xloc);
172
+ yloc = rb_Float(yloc);
173
+ scale = rb_Float(scale);
174
+ angle = rb_Float(angle);
175
+ justification = rb_Integer(justification);
176
+ alignment = rb_Integer(alignment);
177
+ c_show_rotated_label(p, RSTRING(text)->ptr, NUM2DBL(xloc), NUM2DBL(yloc),
178
+ NUM2DBL(scale), NUM2DBL(angle), NUM2INT(justification), NUM2INT(alignment));
179
+ return fmkr;
180
+ }
181
+
182
+ VALUE FM_check_label_clip(VALUE fmkr, VALUE xloc, VALUE yloc)
183
+ {
184
+ FM *p = Get_FM(fmkr);
185
+ xloc = rb_Float(xloc);
186
+ yloc = rb_Float(yloc);
187
+ double x = NUM2DBL(xloc), y = NUM2DBL(yloc);
188
+ x = convert_figure_to_frame_x(p,x);
189
+ y = convert_figure_to_frame_y(p,y);
190
+ if (x < p->label_left_margin || y < p->label_bottom_margin ||
191
+ 1.0 - x < p->label_right_margin || 1.0 - y < p->label_top_margin) return Qfalse;
192
+ return Qtrue;
193
+ }
194
+
195
+ /* TeX File Management */
196
+
197
+ static long cur_pos;
198
+
199
+ static void Get_tex_name(char *ofile, char *filename, int maxlen)
200
+ {
201
+ char *dot;
202
+ strncpy(ofile, filename, maxlen);
203
+ dot = strrchr(ofile,'.');
204
+ if (dot != NULL) dot[0] = '\0';
205
+ strcat(ofile, "_figure.txt");
206
+ }
207
+
208
+ void Open_tex(VALUE fmkr, char *filename, bool quiet_mode)
209
+ {
210
+ char ofile[300];
211
+ Get_tex_name(ofile, filename, 300);
212
+ fp = fopen(ofile, "w");
213
+ fprintf(fp,"\\setlength{\\unitlength}{%fbp}%%\n", 1.0/ENLARGE);
214
+ cur_pos = ftell(fp);
215
+ fprintf(fp,"\\begin{picture}(xxxxxx,xxxxxx) %% (width,height)(xoffset,yoffset) -- Adjust the 2nd pair for registration adjustments\n"); /* this line is rewritten at the end */
216
+ fprintf(fp,"\\def\\BS{\\phantom{\\Huge\\scalebox{0}[2]{\\hbox{\\rotatebox{180}{O}O}}}}\n");
217
+ // graphicx seems to vertically align baseline (B) like center (c),
218
+ // so we add BS (Big Strut) to make them look the same
219
+ fmkr = Qnil; // unused
220
+ }
221
+
222
+ void Close_tex(VALUE fmkr, bool quiet_mode)
223
+ {
224
+ double x, y, xoff, yoff;
225
+ x = bbox_urx - bbox_llx; if (x < 0) x = bbox_urx = bbox_llx = 0;
226
+ y = bbox_ury - bbox_lly; if (y < 0) y = bbox_ury = bbox_lly = 0;
227
+ xoff = bbox_llx + Get_tex_xoffset(fmkr)*ENLARGE;
228
+ yoff = bbox_lly + Get_tex_yoffset(fmkr)*ENLARGE;
229
+ fprintf(fp,"\\end{picture}");
230
+ fseek(fp, cur_pos, SEEK_SET);
231
+ fprintf(fp,"\\begin{picture}(%03d,%03d)(%02d,%d)", ROUND(x), ROUND(y), ROUND(xoff), ROUND(yoff));
232
+ fclose(fp);
233
+ }
234
+
235
+
236
+ void Write_preview_header(VALUE fmkr, FILE *file) {
237
+ VALUE tmp;
238
+ fprintf(file, "\\documentclass{%s}\n\n", Get_tex_preview_documentclass(fmkr));
239
+ /* we print out the preamble generated from tioga.sty.in */
240
+ fprintf(file, "%% Tioga preamble generated from tioga.sty.in\n");
241
+ fprintf(file, "%s\n", Get_tex_preview_generated_preamble(fmkr));
242
+ fprintf(file, "%% User-specified preamble\n");
243
+ fprintf(file, "%s\n\n", Get_tex_preamble(fmkr));
244
+ fprintf(file, "%% Command to format numeric labels on xaxis\n");
245
+ fprintf(file, "\\newcommand{\\tiogaxaxisnumericlabel}[1]{%s}\n\n", Get_xaxis_numeric_label_tex(fmkr));
246
+ fprintf(file, "%% Command to format numeric labels on yaxis\n");
247
+ fprintf(file, "\\newcommand{\\tiogayaxisnumericlabel}[1]{%s}\n\n", Get_yaxis_numeric_label_tex(fmkr));
248
+ fprintf(file, "%% Color constants definitions\n");
249
+ tmp = rb_const_get(CLASS_OF(fmkr), rb_intern("COLOR_PREAMBLE"));
250
+ fprintf(file, "%s\n\n", StringValueCStr(tmp));
251
+ fprintf(file, "%% Set page margins, page size and orientation.\n");
252
+ fprintf(file, "\t\\usepackage[pdftex,tmargin=0pt,lmargin=0pt,"
253
+ "rmargin=0pt,bmargin=0pt,\n");
254
+ fprintf(file, "\tpaperwidth=%s,paperheight=%s,\n",
255
+ Get_tex_preview_paper_width(fmkr),
256
+ Get_tex_preview_paper_height(fmkr));
257
+ fprintf(file, "\thoffset=%s,voffset=%s\n",
258
+ Get_tex_preview_hoffset(fmkr),
259
+ Get_tex_preview_voffset(fmkr));
260
+ fprintf(file, "\t]{geometry}\n");
261
+
262
+ fprintf(file, "\n%% We need the graphicx package and the calc package.\n");
263
+ fprintf(file, "\t\\usepackage{graphicx}\n");
264
+ fprintf(file, "\t\\usepackage{calc}\n\n");
265
+ fprintf(file, "\t%% This is necessary to avoid getting the picture on the second page\n");
266
+ fprintf(file, "\t\\topskip=0pt\n\n");
267
+
268
+ /* now, the commands to customize the font used */
269
+ fprintf(file, "\\settiogafontsize[10pt]{%s}\n", Get_tex_fontsize(fmkr));
270
+ fprintf(file, "\\settiogafontfamily{\\%s}\n", Get_tex_fontfamily(fmkr));
271
+ fprintf(file, "\\settiogafontseries{\\%s}\n", Get_tex_fontseries(fmkr));
272
+ fprintf(file, "\\settiogafontshape{\\%s}\n", Get_tex_fontshape(fmkr));
273
+ }
274
+
275
+
276
+ void Write_figure_command(VALUE fmkr, char *simple_name, FILE *file) {
277
+ char *minwhitespace;
278
+
279
+ if (Get_tex_preview_fullpage(fmkr)) {
280
+ minwhitespace = Get_tex_preview_minwhitespace(fmkr);
281
+ if (minwhitespace == NULL) {
282
+ fprintf(file, "\\tiogafigurefullpage{%s}\n", simple_name);
283
+ } else {
284
+ fprintf(file, "\\tiogafigurefullpage[%s]{%s}\n", minwhitespace, simple_name);
285
+ }
286
+ } else {
287
+ const char * command = Get_tex_preview_tiogafigure_command(fmkr);
288
+ if(strcmp(command, "tiogafigureshow")) {
289
+ fprintf(file, "\\%s{%s}{%s}{%s}\n", Get_tex_preview_tiogafigure_command(fmkr), simple_name,
290
+ Get_tex_preview_figure_width(fmkr), Get_tex_preview_figure_height(fmkr));
291
+ } else { /* no need for extra arguments for tiogafigureshow */
292
+ fprintf(file, "\\%s{%s}\n", Get_tex_preview_tiogafigure_command(fmkr), simple_name);
293
+ }
294
+ }
295
+ }
296
+
297
+
298
+ void Create_wrapper(VALUE fmkr, char *fname, bool quiet_mode)
299
+ { // create the wrapper TeX file to combine the text and graphics to make a figure
300
+ char *dot;
301
+ char tex_fname[100], base_name[100], simple_name[100];
302
+ FILE *file;
303
+ if ((dot=strrchr(fname,'.')) != NULL) {
304
+ strncpy(base_name, fname, dot-fname); base_name[dot-fname] = '\0';
305
+ sprintf(tex_fname, "%s.tex", base_name);
306
+ }
307
+ else {
308
+ strcpy(base_name, fname);
309
+ sprintf(tex_fname, "%s.tex", fname);
310
+ }
311
+ if ((dot=strrchr(base_name,'/')) != NULL) {
312
+ strcpy(simple_name, dot+1);
313
+ }
314
+ else {
315
+ strcpy(simple_name, base_name);
316
+ }
317
+ file = fopen(tex_fname, "w");
318
+ fprintf(file, "%% Tioga preview LaTeX file for %s_figure.pdf and %s_figure.txt\n\n", base_name, base_name);
319
+
320
+ Write_preview_header(fmkr, file);
321
+
322
+ fprintf(file, "\n%% Here's the page with the figure.\n");
323
+ fprintf(file, "\\begin{document}\n");
324
+ fprintf(file, "\\pagestyle{%s}\n", Get_tex_preview_pagestyle(fmkr));
325
+ /* necessary to get the position right */
326
+ fprintf(file, "\\noindent");
327
+ Write_figure_command(fmkr, simple_name, file);
328
+ fprintf(file, "\\end{document}\n");
329
+ fclose(file);
330
+ }
331
+
332
+ void Init_tex(void)
333
+ {
334
+ }
335
+
336
+ void Rename_tex(char *oldname, char *newname)
337
+ {
338
+ char old_ofile[300], new_ofile[300];
339
+ Get_tex_name(old_ofile, oldname, 300);
340
+ Get_tex_name(new_ofile, newname, 300);
341
+ rename(old_ofile, new_ofile); // from stdio.h
342
+ }
343
+
344
+ void private_make_portfolio(char *name, VALUE fignums, VALUE fignames)
345
+ {
346
+ FILE *file;
347
+ int i, len, numfigs, j;
348
+ char tex_fname[256];
349
+ sprintf(tex_fname, "%s.tex", name);
350
+ file = fopen(tex_fname, "w");
351
+ if (file == NULL)
352
+ rb_raise(rb_eArgError, "Sorry: can't open %s.\n", tex_fname);
353
+ fprintf(file, "%% Tioga Portfolio %s\n\n", name);
354
+ fprintf(file, "\\documentclass{article}\n");
355
+ fprintf(file, "\\usepackage{pdfpages}\n");
356
+ fprintf(file, "\\begin{document}\n");
357
+ fprintf(file, "%% Start of figures, one per page\n\n");
358
+ fignames = rb_Array(fignames);
359
+ len = RARRAY(fignames)->len;
360
+ if (fignums == Qnil) {
361
+ for (i=0; i < len; i++) {
362
+ fprintf(file, "\\includepdf{%s.pdf}\n", Get_String(fignames, i));
363
+ }
364
+ } else {
365
+ fignums = rb_Array(fignums);
366
+ numfigs = RARRAY(fignums)->len;
367
+ for (i=0; i < numfigs; i++) {
368
+ j = NUM2INT(RARRAY(fignums)->ptr[i]);
369
+ if (j >= 0 && j < len) fprintf(file, "\\includepdf{%s.pdf}\n", Get_String(fignames, j));
370
+ else {
371
+ fclose(file);
372
+ rb_raise(rb_eArgError, "Requested figure numbers must be >= 0 and < num_figures.");
373
+ }
374
+ }
375
+ }
376
+ fprintf(file, "\n\\end{document}\n");
377
+ fclose(file);
378
+ }
379
+
380
+