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
data/tests/tc_Function.rb
CHANGED
@@ -107,5 +107,37 @@ class TestFunction < Test::Unit::TestCase
|
|
107
107
|
assert_equal(f.distance(1,0), 1.0)
|
108
108
|
end
|
109
109
|
|
110
|
+
def test_fuzzy_ops
|
111
|
+
f = Function.new(Dvector[1,2,3,4],Dvector[1,2,3,4])
|
112
|
+
g = Function.new(Dvector[1,2,4],Dvector[1,2,3])
|
113
|
+
a = g.fuzzy_sub!(f)
|
114
|
+
assert_equal(a,0.0)
|
115
|
+
assert_equal(g.y, Dvector[0,0,-1])
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_bounds
|
119
|
+
x = Dvector[1,2,3,4,5]
|
120
|
+
y = Dvector[0,4,3,4,2]
|
121
|
+
|
122
|
+
f = Function.new(x,y)
|
123
|
+
|
124
|
+
# First, big boundaries
|
125
|
+
g = f.bound_values(0, 10, 0, 10)
|
126
|
+
assert_equal(f.x, g.x)
|
127
|
+
assert_equal(f.y, g.y)
|
128
|
+
|
129
|
+
# Too small boundaries
|
130
|
+
g = f.bound_values(0,0,0,0)
|
131
|
+
assert_equal(0, g.size)
|
132
|
+
|
133
|
+
# Real boundaries, but taking the sides make so
|
134
|
+
# that we have the same in the end that at the beginning
|
135
|
+
g = f.bound_values(2,4,0,10)
|
136
|
+
assert_equal(f.x, g.x)
|
137
|
+
assert_equal(f.y, g.y)
|
138
|
+
|
139
|
+
# It really should be fine.
|
140
|
+
end
|
141
|
+
|
110
142
|
# There is unfortunately no simple way to test the interpolations...
|
111
143
|
end
|
metadata
CHANGED
@@ -1,53 +1,54 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.0
|
3
|
-
specification_version: 1
|
4
2
|
name: tioga
|
5
3
|
version: !ruby/object:Gem::Version
|
6
|
-
version: "1.
|
7
|
-
date: 2007-05-23 00:00:00 +02:00
|
8
|
-
summary: Tioga - a powerful scientific plotting library
|
9
|
-
require_paths:
|
10
|
-
- lib
|
11
|
-
email:
|
12
|
-
homepage: http://www.kitp.ucsb.edu/~paxton/tioga.html
|
13
|
-
rubyforge_project:
|
14
|
-
description:
|
15
|
-
autorequire:
|
16
|
-
default_executable:
|
17
|
-
bindir: split/scripts
|
18
|
-
has_rdoc: false
|
19
|
-
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">"
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 0.0.0
|
24
|
-
version:
|
4
|
+
version: "1.7"
|
25
5
|
platform: ruby
|
26
|
-
signing_key:
|
27
|
-
cert_chain:
|
28
|
-
post_install_message:
|
29
6
|
authors: []
|
30
7
|
|
8
|
+
autorequire:
|
9
|
+
bindir: split/scripts
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-01-28 00:00:00 +01:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description:
|
17
|
+
email:
|
18
|
+
executables:
|
19
|
+
- tioga
|
20
|
+
extensions:
|
21
|
+
- split/Flate/extconf.rb
|
22
|
+
- split/Tioga/extconf.rb
|
23
|
+
- split/Dvector/extconf.rb
|
24
|
+
- split/Dtable/extconf.rb
|
25
|
+
- split/Function/extconf.rb
|
26
|
+
extra_rdoc_files: []
|
27
|
+
|
31
28
|
files:
|
32
|
-
- split/Tioga/
|
33
|
-
- split/Tioga/makers.c
|
34
|
-
- split/Tioga/axes.c
|
29
|
+
- split/Tioga/wrappers.c
|
35
30
|
- split/Tioga/init.c
|
31
|
+
- split/Tioga/shared/pdf_font_dicts.c
|
32
|
+
- split/Tioga/shared/pdfcoords.c
|
33
|
+
- split/Tioga/shared/pdftext.c
|
34
|
+
- split/Tioga/shared/axes.c
|
35
|
+
- split/Tioga/shared/makers.c
|
36
|
+
- split/Tioga/shared/pdfpath.c
|
37
|
+
- split/Tioga/shared/pdfcolor.c
|
38
|
+
- split/Tioga/shared/texout.c
|
39
|
+
- split/Tioga/shared/pdffile.c
|
40
|
+
- split/Tioga/shared/pdfimage.c
|
36
41
|
- split/Tioga/figures.c
|
37
|
-
- split/Tioga/
|
38
|
-
- split/Tioga/pdffile.c
|
39
|
-
- split/Tioga/pdf_font_dicts.c
|
40
|
-
- split/Tioga/pdfimage.c
|
41
|
-
- split/Tioga/pdftext.c
|
42
|
-
- split/Tioga/pdfpath.c
|
43
|
-
- split/Tioga/texout.c
|
42
|
+
- split/Tioga/generic.c
|
44
43
|
- split/Function/function.c
|
45
44
|
- split/Function/joint_qsort.c
|
46
45
|
- split/Dvector/dvector.c
|
47
46
|
- split/Dtable/dtable.c
|
48
47
|
- split/Flate/flate.c
|
49
48
|
- split/symbols.c
|
49
|
+
- split/Tioga/generic.h
|
50
50
|
- split/Tioga/pdfs.h
|
51
|
+
- split/Tioga/wrappers.h
|
51
52
|
- split/Tioga/figures.h
|
52
53
|
- split/Tioga/symbols.h
|
53
54
|
- split/Tioga/defs.h
|
@@ -84,7 +85,6 @@ files:
|
|
84
85
|
- split/Flate/namespace.h
|
85
86
|
- split/symbols.h
|
86
87
|
- split/safe_double.h
|
87
|
-
- split/Tioga/mk_tioga_sty.rb
|
88
88
|
- split/Tioga/lib/Rectangles.rb
|
89
89
|
- split/Tioga/lib/Colorbars.rb
|
90
90
|
- split/Tioga/lib/Shading.rb
|
@@ -117,6 +117,7 @@ files:
|
|
117
117
|
- split/Tioga/lib/Transparency.rb
|
118
118
|
- split/Tioga/lib/ColorConstants.rb
|
119
119
|
- split/Tioga/lib/TexPreamble.rb
|
120
|
+
- split/Tioga/mk_tioga_sty.rb
|
120
121
|
- split/Tioga/extconf.rb
|
121
122
|
- split/Function/lib/Function_extras.rb
|
122
123
|
- split/Function/extconf.rb
|
@@ -128,32 +129,44 @@ files:
|
|
128
129
|
- split/Flate/extconf.rb
|
129
130
|
- split/extconf.rb
|
130
131
|
- split/mkmf2.rb
|
131
|
-
- tests/
|
132
|
+
- tests/profile_Dvector
|
133
|
+
- tests/benchmark_dvector_reads.rb
|
134
|
+
- tests/dvector_read_test.data
|
132
135
|
- tests/dtable_test.data
|
133
136
|
- tests/tc_Dtable.rb
|
134
137
|
- tests/tc_Flate.rb
|
138
|
+
- tests/tc_Function.rb
|
135
139
|
- tests/tc_FMkr.rb
|
140
|
+
- tests/dvector_test.data
|
136
141
|
- tests/ts_Tioga.rb
|
137
|
-
- tests/dvector_read_test.data
|
138
|
-
- tests/tc_Function.rb
|
139
142
|
- tests/tc_Dvector.rb
|
140
143
|
- Tioga_README
|
141
144
|
- lgpl.txt
|
142
|
-
|
143
|
-
|
145
|
+
has_rdoc: false
|
146
|
+
homepage: http://tioga.rubyforge.org
|
147
|
+
post_install_message:
|
144
148
|
rdoc_options: []
|
145
149
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
150
|
+
require_paths:
|
151
|
+
- lib
|
152
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
153
|
+
requirements:
|
154
|
+
- - ">="
|
155
|
+
- !ruby/object:Gem::Version
|
156
|
+
version: "0"
|
157
|
+
version:
|
158
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
159
|
+
requirements:
|
160
|
+
- - ">="
|
161
|
+
- !ruby/object:Gem::Version
|
162
|
+
version: "0"
|
163
|
+
version:
|
156
164
|
requirements: []
|
157
165
|
|
158
|
-
|
159
|
-
|
166
|
+
rubyforge_project:
|
167
|
+
rubygems_version: 1.0.1
|
168
|
+
signing_key:
|
169
|
+
specification_version: 2
|
170
|
+
summary: Tioga - a powerful scientific plotting library
|
171
|
+
test_files:
|
172
|
+
- tests/ts_Tioga.rb
|
data/split/Tioga/pdfcolor.c
DELETED
@@ -1,486 +0,0 @@
|
|
1
|
-
/* pdfcolor.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
|
-
/* functions */
|
26
|
-
|
27
|
-
void Free_Functions()
|
28
|
-
{
|
29
|
-
Function_Info *fo;
|
30
|
-
while (functions_list != NULL) {
|
31
|
-
fo = functions_list;
|
32
|
-
functions_list = fo->next;
|
33
|
-
if (fo->lookup != NULL) free(fo->lookup);
|
34
|
-
free(fo);
|
35
|
-
}
|
36
|
-
}
|
37
|
-
|
38
|
-
static void Write_Sampled_Function(Function_Info *fo)
|
39
|
-
{
|
40
|
-
fprintf(OF, "%i 0 obj << /FunctionType 0\n", fo->obj_num);
|
41
|
-
fprintf(OF, "\t/Domain [0 1]\n");
|
42
|
-
fprintf(OF, "\t/Range [0 1 0 1 0 1]\n");
|
43
|
-
fprintf(OF, "\t/Size [%i]\n", fo->hival + 1);
|
44
|
-
fprintf(OF, "\t/BitsPerSample 8\n");
|
45
|
-
fprintf(OF, "\t/Order 1\n");
|
46
|
-
fprintf(OF, "\t/Length %i\n\t>>\nstream\n", fo->lookup_len);
|
47
|
-
if (fwrite(fo->lookup, 1, fo->lookup_len, OF) < fo->lookup_len)
|
48
|
-
rb_raise(rb_eArgError, "Error writing function sample data");
|
49
|
-
fprintf(OF, "\nendstream\nendobj\n");
|
50
|
-
}
|
51
|
-
|
52
|
-
void Write_Functions(void)
|
53
|
-
{
|
54
|
-
Function_Info *fo;
|
55
|
-
for (fo = functions_list; fo != NULL; fo = fo->next) {
|
56
|
-
Record_Object_Offset(fo->obj_num);
|
57
|
-
Write_Sampled_Function(fo);
|
58
|
-
}
|
59
|
-
}
|
60
|
-
|
61
|
-
static int create_function(int hival, int lookup_len, unsigned char *lookup)
|
62
|
-
{
|
63
|
-
Function_Info *fo = ALLOC(Function_Info);
|
64
|
-
fo->next = functions_list;
|
65
|
-
functions_list = fo;
|
66
|
-
fo->lookup = ALLOC_N(unsigned char, lookup_len);
|
67
|
-
MEMCPY(fo->lookup, lookup, unsigned char, lookup_len);
|
68
|
-
fo->lookup_len = lookup_len;
|
69
|
-
fo->hival = hival;
|
70
|
-
fo->obj_num = next_available_object_number++;
|
71
|
-
return fo->obj_num;
|
72
|
-
}
|
73
|
-
|
74
|
-
/* Opacity */
|
75
|
-
|
76
|
-
void Free_Stroke_Opacities(void)
|
77
|
-
{
|
78
|
-
Stroke_Opacity_State *p;
|
79
|
-
while (stroke_opacities != NULL) {
|
80
|
-
p = stroke_opacities; stroke_opacities = p->next; free(p);
|
81
|
-
}
|
82
|
-
}
|
83
|
-
|
84
|
-
static int Get_Stroke_Opacity_XGS(double stroke_opacity)
|
85
|
-
{
|
86
|
-
Stroke_Opacity_State *p;
|
87
|
-
for (p = stroke_opacities; p != NULL; p = p->next) {
|
88
|
-
if (p->stroke_opacity == stroke_opacity) return p->gs_num;
|
89
|
-
}
|
90
|
-
p = ALLOC(Stroke_Opacity_State);
|
91
|
-
p->stroke_opacity = stroke_opacity;
|
92
|
-
p->gs_num = next_available_gs_number++;
|
93
|
-
p->obj_num = next_available_object_number++;
|
94
|
-
p->next = stroke_opacities;
|
95
|
-
stroke_opacities = p;
|
96
|
-
return p->gs_num;
|
97
|
-
}
|
98
|
-
|
99
|
-
VALUE FM_stroke_opacity_set(VALUE fmkr, VALUE value)
|
100
|
-
{ // /GSi gs for ExtGState obj with /CS set to stroke opacity value
|
101
|
-
FM *p = Get_FM(fmkr);
|
102
|
-
if (constructing_path) rb_raise(rb_eArgError, "Sorry: must not be constructing a path when change stroke opacity");
|
103
|
-
value = rb_Float(value);
|
104
|
-
double stroke_opacity = NUM2DBL(value);
|
105
|
-
if (stroke_opacity == p->stroke_opacity) return value;
|
106
|
-
int gs_num = Get_Stroke_Opacity_XGS(stroke_opacity);
|
107
|
-
fprintf(TF, "/GS%i gs\n", gs_num);
|
108
|
-
p->stroke_opacity = stroke_opacity;
|
109
|
-
return value;
|
110
|
-
}
|
111
|
-
|
112
|
-
void Free_Fill_Opacities(void)
|
113
|
-
{
|
114
|
-
Fill_Opacity_State *p;
|
115
|
-
while (fill_opacities != NULL) {
|
116
|
-
p = fill_opacities; fill_opacities = p->next; free(p);
|
117
|
-
}
|
118
|
-
}
|
119
|
-
|
120
|
-
static int Get_Fill_Opacity_XGS(double fill_opacity)
|
121
|
-
{
|
122
|
-
Fill_Opacity_State *p;
|
123
|
-
for (p = fill_opacities; p != NULL; p = p->next) {
|
124
|
-
if (p->fill_opacity == fill_opacity) return p->gs_num;
|
125
|
-
}
|
126
|
-
p = ALLOC(Fill_Opacity_State);
|
127
|
-
p->fill_opacity = fill_opacity;
|
128
|
-
p->gs_num = next_available_gs_number++;
|
129
|
-
p->obj_num = next_available_object_number++;
|
130
|
-
p->next = fill_opacities;
|
131
|
-
fill_opacities = p;
|
132
|
-
return p->gs_num;
|
133
|
-
}
|
134
|
-
|
135
|
-
VALUE FM_fill_opacity_set(VALUE fmkr, VALUE value)
|
136
|
-
{ // /GSi gs for ExtGState obj with /cs set to fill opacity value
|
137
|
-
FM *p = Get_FM(fmkr);
|
138
|
-
if (constructing_path) rb_raise(rb_eArgError, "Sorry: must not be constructing a path when change fill opacity");
|
139
|
-
value = rb_Float(value);
|
140
|
-
double fill_opacity = NUM2DBL(value);
|
141
|
-
if (fill_opacity == p->fill_opacity) return value;
|
142
|
-
int gs_num = Get_Fill_Opacity_XGS(fill_opacity);
|
143
|
-
fprintf(TF, "/GS%i gs\n", gs_num);
|
144
|
-
p->fill_opacity = fill_opacity;
|
145
|
-
return value;
|
146
|
-
}
|
147
|
-
|
148
|
-
void Write_Stroke_Opacity_Objects(void)
|
149
|
-
{
|
150
|
-
Stroke_Opacity_State *p;
|
151
|
-
for (p = stroke_opacities; p != NULL; p = p->next) {
|
152
|
-
Record_Object_Offset(p->obj_num);
|
153
|
-
fprintf(OF, "%2i 0 obj << /Type /ExtGState /CA %g >> endobj\n", p->obj_num, p->stroke_opacity);
|
154
|
-
}
|
155
|
-
}
|
156
|
-
|
157
|
-
void Write_Fill_Opacity_Objects(void)
|
158
|
-
{
|
159
|
-
Fill_Opacity_State *p;
|
160
|
-
for (p = fill_opacities; p != NULL; p = p->next) {
|
161
|
-
Record_Object_Offset(p->obj_num);
|
162
|
-
fprintf(OF, "%2i 0 obj << /Type /ExtGState /ca %g >> endobj\n", p->obj_num, p->fill_opacity);
|
163
|
-
}
|
164
|
-
}
|
165
|
-
|
166
|
-
/* Shading */
|
167
|
-
|
168
|
-
void Free_Shadings()
|
169
|
-
{
|
170
|
-
Shading_Info *so;
|
171
|
-
while (shades_list != NULL) {
|
172
|
-
so = shades_list;
|
173
|
-
shades_list = so->next;
|
174
|
-
free(so);
|
175
|
-
}
|
176
|
-
}
|
177
|
-
|
178
|
-
void Write_Shadings(void)
|
179
|
-
{
|
180
|
-
Shading_Info *so;
|
181
|
-
for (so = shades_list; so != NULL; so = so->next) {
|
182
|
-
Record_Object_Offset(so->obj_num);
|
183
|
-
fprintf(OF, "%i 0 obj <<\n", so->obj_num);
|
184
|
-
if (so->axial) {
|
185
|
-
fprintf(OF, "\t/ShadingType 2\n\t/Coords [%0.2f %0.2f %0.2f %0.2f]\n",
|
186
|
-
so->x0, so->y0, so->x1, so->y1);
|
187
|
-
} else {
|
188
|
-
fprintf(OF, "\t/ShadingType 3\n\t/Coords [%0.2f %0.2f %0.2f %0.2f %0.2f %0.2f]\n",
|
189
|
-
so->x0, so->y0, so->r0, so->x1, so->y1, so->r1);
|
190
|
-
}
|
191
|
-
if (so->extend_start || so->extend_end) fprintf(OF, "\t/Extend [ %s %s ]\n",
|
192
|
-
(so->extend_start)? "true" : "false", (so->extend_end)? "true" : "false");
|
193
|
-
fprintf(OF, "\t/ColorSpace /DeviceRGB\n");
|
194
|
-
fprintf(OF, "\t/Function %i 0 R\n", so->function);
|
195
|
-
fprintf(OF, ">> endobj\n");
|
196
|
-
}
|
197
|
-
}
|
198
|
-
|
199
|
-
|
200
|
-
void c_axial_shading(FM *p, double x0, double y0, double x1, double y1,
|
201
|
-
int hival, int lookup_len, unsigned char *lookup, bool extend_start, bool extend_end)
|
202
|
-
{
|
203
|
-
Shading_Info *so = ALLOC(Shading_Info);
|
204
|
-
so->next = shades_list;
|
205
|
-
shades_list = so;
|
206
|
-
so->shade_num = next_available_shade_number++;
|
207
|
-
so->obj_num = next_available_object_number++;
|
208
|
-
so->function = create_function(hival, lookup_len, lookup);
|
209
|
-
so->axial = true;
|
210
|
-
so->x0 = x0;
|
211
|
-
so->y0 = y0;
|
212
|
-
so->x1 = x1;
|
213
|
-
so->y1 = y1;
|
214
|
-
so->extend_start = extend_start;
|
215
|
-
so->extend_end = extend_end;
|
216
|
-
fprintf(TF, "/Shade%i sh\n", so->shade_num);
|
217
|
-
}
|
218
|
-
|
219
|
-
VALUE FM_private_axial_shading(VALUE fmkr, VALUE x0, VALUE y0, VALUE x1, VALUE y1,
|
220
|
-
VALUE colormap, VALUE extend_start, VALUE extend_end)
|
221
|
-
{
|
222
|
-
FM *p = Get_FM(fmkr);
|
223
|
-
x0 = rb_Float(x0);
|
224
|
-
y0 = rb_Float(y0);
|
225
|
-
x1 = rb_Float(x1);
|
226
|
-
y1 = rb_Float(y1);
|
227
|
-
colormap = rb_Array(colormap);
|
228
|
-
if (RARRAY(colormap)->len != 2)
|
229
|
-
rb_raise(rb_eArgError, "Sorry: colormap must be array [hivalue, lookup]");
|
230
|
-
VALUE hival = rb_ary_entry(colormap, 0);
|
231
|
-
hival = rb_Integer(hival);
|
232
|
-
VALUE lookup = rb_ary_entry(colormap, 1);
|
233
|
-
lookup = rb_String(lookup);
|
234
|
-
c_axial_shading(p, convert_figure_to_output_x(p,NUM2DBL(x0)), convert_figure_to_output_y(p,NUM2DBL(y0)),
|
235
|
-
convert_figure_to_output_x(p,NUM2DBL(x1)), convert_figure_to_output_y(p,NUM2DBL(y1)),
|
236
|
-
NUM2INT(hival), RSTRING_LEN(lookup), (unsigned char *)(RSTRING_PTR(lookup)),
|
237
|
-
extend_start == Qtrue, extend_end == Qtrue);
|
238
|
-
return fmkr;
|
239
|
-
}
|
240
|
-
|
241
|
-
void c_radial_shading(FM *p, double x0, double y0, double r0, double x1, double y1, double r1,
|
242
|
-
int hival, int lookup_len, unsigned char *lookup,
|
243
|
-
double a, double b, double c, double d, double e, double f, bool extend_start, bool extend_end)
|
244
|
-
{
|
245
|
-
Shading_Info *so = ALLOC(Shading_Info);
|
246
|
-
so->next = shades_list;
|
247
|
-
shades_list = so;
|
248
|
-
so->shade_num = next_available_shade_number++;
|
249
|
-
so->obj_num = next_available_object_number++;
|
250
|
-
so->function = create_function(hival, lookup_len, lookup);
|
251
|
-
so->axial = false;
|
252
|
-
so->x0 = x0;
|
253
|
-
so->y0 = y0;
|
254
|
-
so->r0 = r0;
|
255
|
-
so->x1 = x1;
|
256
|
-
so->y1 = y1;
|
257
|
-
so->r1 = r1;
|
258
|
-
so->extend_start = extend_start;
|
259
|
-
so->extend_end = extend_end;
|
260
|
-
if (a != 1.0 || b != 0.0 || c != 0.0 || d != 1.0 || e != 0 || f != 0) {
|
261
|
-
fprintf(TF, "q %0.2f %0.2f %0.2f %0.2f %0.2f %0.2f cm /Shade%i sh Q\n",
|
262
|
-
a, b, c, d, e, f, so->shade_num);
|
263
|
-
} else {
|
264
|
-
fprintf(TF, "/Shade%i sh\n", so->shade_num);
|
265
|
-
}
|
266
|
-
}
|
267
|
-
|
268
|
-
VALUE FM_private_radial_shading(VALUE fmkr,
|
269
|
-
VALUE x0, VALUE y0, VALUE r0,
|
270
|
-
VALUE x1, VALUE y1, VALUE r1, VALUE colormap,
|
271
|
-
VALUE a, VALUE b, VALUE c, VALUE d, VALUE extend_start, VALUE extend_end)
|
272
|
-
{
|
273
|
-
FM *p = Get_FM(fmkr);
|
274
|
-
x0 = rb_Float(x0);
|
275
|
-
y0 = rb_Float(y0);
|
276
|
-
r0 = rb_Float(r0);
|
277
|
-
x1 = rb_Float(x1);
|
278
|
-
y1 = rb_Float(y1);
|
279
|
-
r1 = rb_Float(r1);
|
280
|
-
a = rb_Float(a);
|
281
|
-
b = rb_Float(b);
|
282
|
-
c = rb_Float(c);
|
283
|
-
d = rb_Float(d);
|
284
|
-
colormap = rb_Array(colormap);
|
285
|
-
if (RARRAY(colormap)->len != 2)
|
286
|
-
rb_raise(rb_eArgError, "Sorry: colormap must be array [hivalue, lookup]");
|
287
|
-
VALUE hival = rb_ary_entry(colormap, 0);
|
288
|
-
hival = rb_Integer(hival);
|
289
|
-
VALUE lookup = rb_ary_entry(colormap, 1);
|
290
|
-
lookup = rb_String(lookup);
|
291
|
-
c_radial_shading(p,
|
292
|
-
NUM2DBL(x0), NUM2DBL(y0), NUM2DBL(r0),
|
293
|
-
NUM2DBL(x1), NUM2DBL(y1), NUM2DBL(r1),
|
294
|
-
NUM2INT(hival), RSTRING_LEN(lookup), (unsigned char *)(RSTRING_PTR(lookup)),
|
295
|
-
convert_figure_to_output_dx(p,NUM2DBL(a)), convert_figure_to_output_dy(p,NUM2DBL(b)),
|
296
|
-
convert_figure_to_output_dx(p,NUM2DBL(c)), convert_figure_to_output_dy(p,NUM2DBL(d)),
|
297
|
-
convert_figure_to_output_x(p,0.0), convert_figure_to_output_y(p,0.0),
|
298
|
-
extend_start == Qtrue, extend_end == Qtrue);
|
299
|
-
return fmkr;
|
300
|
-
}
|
301
|
-
|
302
|
-
/* Colormaps
|
303
|
-
*/
|
304
|
-
|
305
|
-
VALUE c_create_colormap(FM *p, bool rgb_flag, int length,
|
306
|
-
int num_pts, double *ps, double *c1s, double *c2s, double *c3s)
|
307
|
-
{
|
308
|
-
int i;
|
309
|
-
if (ps[0] != 0.0 || ps[num_pts-1] != 1.0)
|
310
|
-
rb_raise(rb_eArgError, "Sorry: first control point for create colormap must be at 0.0 and last must be at 1.0");
|
311
|
-
for (i = 1; i < num_pts; i++) {
|
312
|
-
if (ps[i-1] > ps[i])
|
313
|
-
rb_raise(rb_eArgError, "Sorry: control points for create colormap must be increasing from 0 to 1");
|
314
|
-
}
|
315
|
-
int j, buff_len = length * 3, hival = length-1;
|
316
|
-
unsigned char *buff;
|
317
|
-
buff = ALLOC_N(unsigned char, buff_len);
|
318
|
-
for (j = 0, i = 0; j < length; j++) {
|
319
|
-
double x = j; x /= (length-1);
|
320
|
-
double c1, c2, c3, r, g, b;
|
321
|
-
c1 = c_dvector_linear_interpolate(num_pts, ps, c1s, x);
|
322
|
-
c2 = c_dvector_linear_interpolate(num_pts, ps, c2s, x);
|
323
|
-
c3 = c_dvector_linear_interpolate(num_pts, ps, c3s, x);
|
324
|
-
if (rgb_flag) { r = c1; g = c2; b = c3; }
|
325
|
-
else c_hls_to_rgb(c1, c2, c3, &r, &g, &b);
|
326
|
-
buff[i++] = ROUND(hival * r);
|
327
|
-
buff[i++] = ROUND(hival * g);
|
328
|
-
buff[i++] = ROUND(hival * b);
|
329
|
-
}
|
330
|
-
VALUE lookup = rb_str_new((char *)buff, buff_len);
|
331
|
-
free(buff);
|
332
|
-
VALUE result = rb_ary_new2(2);
|
333
|
-
rb_ary_store(result, 0, INT2FIX(hival));
|
334
|
-
rb_ary_store(result, 1, lookup);
|
335
|
-
return result;
|
336
|
-
}
|
337
|
-
|
338
|
-
VALUE FM_private_create_colormap(VALUE fmkr, VALUE rgb_flag,
|
339
|
-
VALUE length, VALUE Ps, VALUE C1s, VALUE C2s, VALUE C3s)
|
340
|
-
{
|
341
|
-
FM *p = Get_FM(fmkr);
|
342
|
-
bool rgb = rgb_flag != Qfalse;
|
343
|
-
length = rb_Integer(length);
|
344
|
-
long p_len, c1_len, c2_len, c3_len;
|
345
|
-
double *p_ptr = Dvector_Data_for_Read(Ps, &p_len);
|
346
|
-
double *c1_ptr = Dvector_Data_for_Read(C1s, &c1_len);
|
347
|
-
double *c2_ptr = Dvector_Data_for_Read(C2s, &c2_len);
|
348
|
-
double *c3_ptr = Dvector_Data_for_Read(C3s, &c3_len);
|
349
|
-
if (p_len < 2 || p_len != c1_len || p_len != c2_len || p_len != c3_len)
|
350
|
-
rb_raise(rb_eArgError, "Sorry: vectors for create colormap must all be os same length (with at least 2 entries)");
|
351
|
-
return c_create_colormap(p, rgb, NUM2INT(length), p_len, p_ptr, c1_ptr, c2_ptr, c3_ptr);
|
352
|
-
}
|
353
|
-
|
354
|
-
VALUE FM_get_color_from_colormap(VALUE fmkr, VALUE color_map, VALUE color_position)
|
355
|
-
{
|
356
|
-
color_position = rb_Float(color_position);
|
357
|
-
double x = NUM2DBL(color_position);
|
358
|
-
color_map = rb_String(color_map);
|
359
|
-
unsigned char *buff = (unsigned char *)(RSTRING_PTR(color_map)), r, g, b, i;
|
360
|
-
int len = RSTRING_LEN(color_map);
|
361
|
-
if (len % 3 != 0) rb_raise(rb_eArgError, "Sorry: color_map length must be a multiple of 3 (for R G B components)");
|
362
|
-
i = 3 * ROUND(x * ((len/3)-1));
|
363
|
-
r = buff[i]; g = buff[i+1]; b = buff[i+2];
|
364
|
-
VALUE result = rb_ary_new2(3);
|
365
|
-
rb_ary_store(result, 0, rb_float_new(r/255.0));
|
366
|
-
rb_ary_store(result, 1, rb_float_new(g/255.0));
|
367
|
-
rb_ary_store(result, 2, rb_float_new(b/255.0));
|
368
|
-
return result;
|
369
|
-
fmkr = Qnil;
|
370
|
-
}
|
371
|
-
|
372
|
-
VALUE FM_convert_to_colormap(VALUE fmkr, VALUE Rs, VALUE Gs, VALUE Bs)
|
373
|
-
{
|
374
|
-
long r_len, g_len, b_len;
|
375
|
-
double *r_ptr = Dvector_Data_for_Read(Rs, &r_len);
|
376
|
-
double *g_ptr = Dvector_Data_for_Read(Gs, &g_len);
|
377
|
-
double *b_ptr = Dvector_Data_for_Read(Bs, &b_len);
|
378
|
-
if (r_len <= 0 || r_len != g_len || b_len != g_len)
|
379
|
-
rb_raise(rb_eArgError, "Sorry: vectors for convert_to_colormap must all be of same length");
|
380
|
-
int i, j, buff_len = r_len * 3;
|
381
|
-
unsigned char *buff;
|
382
|
-
buff = ALLOC_N(unsigned char, buff_len);
|
383
|
-
for (i = 0, j = 0; j < r_len; j++) {
|
384
|
-
buff[i++] = ROUND(r_ptr[j]*255);
|
385
|
-
buff[i++] = ROUND(g_ptr[j]*255);
|
386
|
-
buff[i++] = ROUND(b_ptr[j]*255);
|
387
|
-
}
|
388
|
-
VALUE lookup = rb_str_new((char *)buff, buff_len);
|
389
|
-
free(buff);
|
390
|
-
VALUE result = rb_ary_new2(2);
|
391
|
-
rb_ary_store(result, 0, INT2FIX(r_len-1));
|
392
|
-
rb_ary_store(result, 1, lookup);
|
393
|
-
return result;
|
394
|
-
}
|
395
|
-
|
396
|
-
static double value(double n1, double n2, double hue) // from plplot plctrl.c
|
397
|
-
{
|
398
|
-
double val;
|
399
|
-
while (hue >= 360.) hue -= 360.;
|
400
|
-
while (hue < 0.) hue += 360.;
|
401
|
-
if (hue < 60.) val = n1 + (n2 - n1) * hue / 60.;
|
402
|
-
else if (hue < 180.) val = n2;
|
403
|
-
else if (hue < 240.) val = n1 + (n2 - n1) * (240. - hue) / 60.;
|
404
|
-
else val = n1;
|
405
|
-
return (val);
|
406
|
-
}
|
407
|
-
|
408
|
-
void c_hls_to_rgb(double h, double l, double s, double *p_r, double *p_g, double *p_b) // from plplot plctrl.c
|
409
|
-
{
|
410
|
-
double m1, m2;
|
411
|
-
if (l <= .5) m2 = l * (s + 1.);
|
412
|
-
else m2 = l + s - l * s;
|
413
|
-
m1 = 2 * l - m2;
|
414
|
-
*p_r = value(m1, m2, h + 120.);
|
415
|
-
*p_g = value(m1, m2, h);
|
416
|
-
*p_b = value(m1, m2, h - 120.);
|
417
|
-
}
|
418
|
-
|
419
|
-
void c_rgb_to_hls(double r, double g, double b, double *p_h, double *p_l, double *p_s) // from plplot plctrl.c
|
420
|
-
{
|
421
|
-
double h, l, s, d, rc, gc, bc, rgb_min, rgb_max;
|
422
|
-
rgb_min = MIN( r, MIN( g, b ));
|
423
|
-
rgb_max = MAX( r, MAX( g, b ));
|
424
|
-
l = (rgb_min+rgb_max) / 2.0;
|
425
|
-
if (rgb_min == rgb_max) s = h = 0;
|
426
|
-
else {
|
427
|
-
d = rgb_max - rgb_min;
|
428
|
-
if (l < 0.5) s = 0.5 * d / l;
|
429
|
-
else s = 0.5* d / (1.-l);
|
430
|
-
rc = (rgb_max-r) / d;
|
431
|
-
gc = (rgb_max-g) / d;
|
432
|
-
bc = (rgb_max-b) / d;
|
433
|
-
if (r == rgb_max) h = bc-gc;
|
434
|
-
else if (g == rgb_max) h = rc-bc+2;
|
435
|
-
else h = gc-rc-2;
|
436
|
-
h = h*60;
|
437
|
-
if (h < 0) h = h+360;
|
438
|
-
else if (h >= 360) h = h-360;
|
439
|
-
}
|
440
|
-
*p_h = h;
|
441
|
-
*p_l = l;
|
442
|
-
*p_s = s;
|
443
|
-
}
|
444
|
-
|
445
|
-
static void Unpack_HLS(VALUE hls, double *hp, double *lp, double *sp)
|
446
|
-
{
|
447
|
-
hls = rb_Array(hls);
|
448
|
-
if (RARRAY(hls)->len != 3) rb_raise(rb_eArgError, "Sorry: invalid hls array: must have 3 entries");
|
449
|
-
VALUE entry = rb_ary_entry(hls, 0);
|
450
|
-
entry = rb_Float(entry);
|
451
|
-
double h = NUM2DBL(entry);
|
452
|
-
entry = rb_ary_entry(hls, 1);
|
453
|
-
entry = rb_Float(entry);
|
454
|
-
double l = NUM2DBL(entry);
|
455
|
-
entry = rb_ary_entry(hls, 2);
|
456
|
-
entry = rb_Float(entry);
|
457
|
-
double s = NUM2DBL(entry);
|
458
|
-
if (l < 0.0 || l > 1.0) rb_raise(rb_eArgError, "Sorry: invalid lightness (%g) for hls: must be between 0 and 1", l);
|
459
|
-
if (s < 0.0 || s > 1.0) rb_raise(rb_eArgError, "Sorry: invalid saturation (%g) for hls: must be between 0 and 1", s);
|
460
|
-
*hp = h; *lp = l; *sp = s;
|
461
|
-
}
|
462
|
-
|
463
|
-
VALUE FM_hls_to_rgb(VALUE fmkr, VALUE hls_vec)
|
464
|
-
{
|
465
|
-
double h, l, s, r, g, b;
|
466
|
-
Unpack_HLS(hls_vec, &h, &l, &s);
|
467
|
-
c_hls_to_rgb(h, l, s, &r, &g, &b);
|
468
|
-
VALUE result = rb_ary_new2(3);
|
469
|
-
rb_ary_store(result, 0, rb_float_new(r));
|
470
|
-
rb_ary_store(result, 1, rb_float_new(g));
|
471
|
-
rb_ary_store(result, 2, rb_float_new(b));
|
472
|
-
return result;
|
473
|
-
}
|
474
|
-
|
475
|
-
VALUE FM_rgb_to_hls(VALUE fmkr, VALUE rgb_vec)
|
476
|
-
{
|
477
|
-
double h, l, s, r, g, b;
|
478
|
-
Unpack_RGB(rgb_vec, &r, &g, &b);
|
479
|
-
c_rgb_to_hls(r, g, b, &h, &l, &s);
|
480
|
-
VALUE result = rb_ary_new2(3);
|
481
|
-
rb_ary_store(result, 0, rb_float_new(h));
|
482
|
-
rb_ary_store(result, 1, rb_float_new(l));
|
483
|
-
rb_ary_store(result, 2, rb_float_new(s));
|
484
|
-
return result;
|
485
|
-
}
|
486
|
-
|