line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package PostScript::Graph::Style; |
2
|
|
|
|
|
|
|
our $VERSION = 1.02; |
3
|
14
|
|
|
14
|
|
184512
|
use strict; |
|
14
|
|
|
|
|
32
|
|
|
14
|
|
|
|
|
1214
|
|
4
|
14
|
|
|
14
|
|
95
|
use warnings; |
|
14
|
|
|
|
|
32
|
|
|
14
|
|
|
|
|
656
|
|
5
|
14
|
|
|
14
|
|
91
|
use PostScript::File 1.00 qw(str); |
|
14
|
|
|
|
|
349
|
|
|
14
|
|
|
|
|
1529
|
|
6
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
=head1 NAME |
8
|
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
PostScript::Graph::Style - style settings for postscript objects |
10
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
=head1 SYNOPSIS |
12
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
=head2 Simplest |
14
|
|
|
|
|
|
|
|
15
|
|
|
|
|
|
|
Each time a new object is created the default style will be slightly different. |
16
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
use PostScript::File; |
18
|
|
|
|
|
|
|
use PostScript::Graph::Style; |
19
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
my $file = new PostScript::File(); |
21
|
|
|
|
|
|
|
my $seq = new PostScript::Graph::Sequence(); |
22
|
|
|
|
|
|
|
|
23
|
|
|
|
|
|
|
while (...) { |
24
|
|
|
|
|
|
|
my $style = new PostScript::Graph::Style( |
25
|
|
|
|
|
|
|
sequence => $seq, |
26
|
|
|
|
|
|
|
point => {} |
27
|
|
|
|
|
|
|
); |
28
|
|
|
|
|
|
|
$style->write($file); |
29
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
$file->add_to_page( <
|
31
|
|
|
|
|
|
|
% code using point variables... |
32
|
|
|
|
|
|
|
|
33
|
|
|
|
|
|
|
% setting colour or grey shade |
34
|
|
|
|
|
|
|
gpaperdict begin |
35
|
|
|
|
|
|
|
pocolor gpapercolor |
36
|
|
|
|
|
|
|
end |
37
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
% choosing a line width |
39
|
|
|
|
|
|
|
powidth setlinewidth |
40
|
|
|
|
|
|
|
|
41
|
|
|
|
|
|
|
% scaled relative to point sizing |
42
|
|
|
|
|
|
|
0 ppsize rlineto |
43
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
% showing the chosen point shape |
45
|
|
|
|
|
|
|
100 200 ppshape |
46
|
|
|
|
|
|
|
END_OF_CODE |
47
|
|
|
|
|
|
|
} |
48
|
|
|
|
|
|
|
|
49
|
|
|
|
|
|
|
=head2 Typical |
50
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
It is possible to control how each new object varies. |
52
|
|
|
|
|
|
|
|
53
|
|
|
|
|
|
|
my $seq = new PostScript::Graph::Sequence(); |
54
|
|
|
|
|
|
|
$seq->setup( "red", [0, 1, 0.2, 0.8, 0.4, 0.6] ); |
55
|
|
|
|
|
|
|
$seq->auto( qw(red green blue); |
56
|
|
|
|
|
|
|
|
57
|
|
|
|
|
|
|
my $file = new PostScript::File(); |
58
|
|
|
|
|
|
|
while (...) { |
59
|
|
|
|
|
|
|
my $style = new PostScript::Graph::Style( |
60
|
|
|
|
|
|
|
sequence => $seq, |
61
|
|
|
|
|
|
|
bar => {}, |
62
|
|
|
|
|
|
|
); |
63
|
|
|
|
|
|
|
$style->write($file); |
64
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
... postscript using bar variables ... |
66
|
|
|
|
|
|
|
} |
67
|
|
|
|
|
|
|
|
68
|
|
|
|
|
|
|
Some of the styles may be overriden. |
69
|
|
|
|
|
|
|
|
70
|
|
|
|
|
|
|
my $style = new PostScript::Graph::Style( |
71
|
|
|
|
|
|
|
sequence => $seq, |
72
|
|
|
|
|
|
|
auto => [qw(color dashes)], |
73
|
|
|
|
|
|
|
line => { |
74
|
|
|
|
|
|
|
width => 4, |
75
|
|
|
|
|
|
|
outer_dashes => [], |
76
|
|
|
|
|
|
|
outer_color => [1, 0, 0], |
77
|
|
|
|
|
|
|
}, |
78
|
|
|
|
|
|
|
); |
79
|
|
|
|
|
|
|
|
80
|
|
|
|
|
|
|
Or the automatic default feature can be supressed and some or all details specified directly. |
81
|
|
|
|
|
|
|
|
82
|
|
|
|
|
|
|
my $style = new PostScript::Graph::Style( |
83
|
|
|
|
|
|
|
auto => "none", |
84
|
|
|
|
|
|
|
point => { |
85
|
|
|
|
|
|
|
shape => "circle", |
86
|
|
|
|
|
|
|
size => 12, |
87
|
|
|
|
|
|
|
}, |
88
|
|
|
|
|
|
|
); |
89
|
|
|
|
|
|
|
|
90
|
|
|
|
|
|
|
=head2 All options |
91
|
|
|
|
|
|
|
|
92
|
|
|
|
|
|
|
my $style = new PostScript::Graph::Style( |
93
|
|
|
|
|
|
|
sequence => $seq, |
94
|
|
|
|
|
|
|
auto => [qw(red green blue)], |
95
|
|
|
|
|
|
|
changes_only => 0, |
96
|
|
|
|
|
|
|
bgnd_outline => 1, |
97
|
|
|
|
|
|
|
|
98
|
|
|
|
|
|
|
line => { |
99
|
|
|
|
|
|
|
color => [0, 1, 0], |
100
|
|
|
|
|
|
|
inner_color => [1, 1, 0], |
101
|
|
|
|
|
|
|
outer_color => 0, |
102
|
|
|
|
|
|
|
dashes => [3, 3], |
103
|
|
|
|
|
|
|
inner_dashes => [5, 2, 5, 10], |
104
|
|
|
|
|
|
|
outer_dashes => [], |
105
|
|
|
|
|
|
|
width => 2, |
106
|
|
|
|
|
|
|
inner_width => 2, |
107
|
|
|
|
|
|
|
outer_width => 2.5, |
108
|
|
|
|
|
|
|
}, |
109
|
|
|
|
|
|
|
|
110
|
|
|
|
|
|
|
point => { |
111
|
|
|
|
|
|
|
size => 8, |
112
|
|
|
|
|
|
|
shape => "diamond", |
113
|
|
|
|
|
|
|
color => [0, 1, 0], |
114
|
|
|
|
|
|
|
inner_color => [1, 1, 0], |
115
|
|
|
|
|
|
|
outer_color => 0, |
116
|
|
|
|
|
|
|
width => 2, |
117
|
|
|
|
|
|
|
inner_width => 2, |
118
|
|
|
|
|
|
|
outer_width => 2.5, |
119
|
|
|
|
|
|
|
}, |
120
|
|
|
|
|
|
|
|
121
|
|
|
|
|
|
|
bar => { |
122
|
|
|
|
|
|
|
color => [0, 1, 0], |
123
|
|
|
|
|
|
|
inner_color => [1, 1, 0], |
124
|
|
|
|
|
|
|
outer_color => 0, |
125
|
|
|
|
|
|
|
width => 2, |
126
|
|
|
|
|
|
|
inner_width => 2, |
127
|
|
|
|
|
|
|
outer_width => 2.5, |
128
|
|
|
|
|
|
|
}, |
129
|
|
|
|
|
|
|
); |
130
|
|
|
|
|
|
|
|
131
|
|
|
|
|
|
|
=head1 DESCRIPTION |
132
|
|
|
|
|
|
|
|
133
|
|
|
|
|
|
|
This module is designed as a supporting part of the PostScript::Graph suite. For top level modules that output |
134
|
|
|
|
|
|
|
something useful, see |
135
|
|
|
|
|
|
|
|
136
|
|
|
|
|
|
|
PostScript::Graph::Bar |
137
|
|
|
|
|
|
|
PostScript::Graph::Stock |
138
|
|
|
|
|
|
|
PostScript::Graph::XY |
139
|
|
|
|
|
|
|
|
140
|
|
|
|
|
|
|
Style settings are provided for objects placed on a graph. Lines on the same graph need to be distinguishable |
141
|
|
|
|
|
|
|
from each other. Each line would have a PostScript::Graph::Style object holding its settings. Passing each line |
142
|
|
|
|
|
|
|
a reference to the same PostScript::Graph::Sequence object makes the styles vary. This can either use the defaults of be |
143
|
|
|
|
|
|
|
controlled to every last detail. |
144
|
|
|
|
|
|
|
|
145
|
|
|
|
|
|
|
Settings are provided for three types of object. A B is any unfilled path, a B is any filled path |
146
|
|
|
|
|
|
|
while a B is a filled path that may contain holes. |
147
|
|
|
|
|
|
|
|
148
|
|
|
|
|
|
|
They all have outer and inner components. The inner component provides the main shape and colour, while the outer |
149
|
|
|
|
|
|
|
'edge' is provided to insulate this from any background colour. Lines may be whole or broken and a variety of |
150
|
|
|
|
|
|
|
builtin shapes is provided. By default, repeated calls to B return styles that differ from one another |
151
|
|
|
|
|
|
|
although like everything else this can be under detailed user control if required. |
152
|
|
|
|
|
|
|
|
153
|
|
|
|
|
|
|
The settings are only useful once they have been written out to a PostScript::File object using B. The |
154
|
|
|
|
|
|
|
following functions return values set in the constructor. See L"new"> for more details. |
155
|
|
|
|
|
|
|
|
156
|
|
|
|
|
|
|
bar_outer_color() |
157
|
|
|
|
|
|
|
bar_outer_width() |
158
|
|
|
|
|
|
|
bar_inner_color() |
159
|
|
|
|
|
|
|
bar_inner_width() |
160
|
|
|
|
|
|
|
|
161
|
|
|
|
|
|
|
color() |
162
|
|
|
|
|
|
|
|
163
|
|
|
|
|
|
|
line_outer_color() |
164
|
|
|
|
|
|
|
line_outer_width() |
165
|
|
|
|
|
|
|
line_outer_dashes() |
166
|
|
|
|
|
|
|
line_inner_color() |
167
|
|
|
|
|
|
|
line_inner_width() |
168
|
|
|
|
|
|
|
line_inner_dashes() |
169
|
|
|
|
|
|
|
|
170
|
|
|
|
|
|
|
point_size() |
171
|
|
|
|
|
|
|
point_shape() |
172
|
|
|
|
|
|
|
point_outer_color() |
173
|
|
|
|
|
|
|
point_outer_width() |
174
|
|
|
|
|
|
|
point_inner_color() |
175
|
|
|
|
|
|
|
point_inner_width() |
176
|
|
|
|
|
|
|
|
177
|
|
|
|
|
|
|
bgnd_outline() |
178
|
|
|
|
|
|
|
sequence() |
179
|
|
|
|
|
|
|
|
180
|
|
|
|
|
|
|
=cut |
181
|
|
|
|
|
|
|
|
182
|
|
|
|
|
|
|
### PostScript::Graph::Sequence |
183
|
|
|
|
|
|
|
|
184
|
|
|
|
|
|
|
package PostScript::Graph::Sequence; |
185
|
14
|
|
|
14
|
|
85
|
use PostScript::File qw(str); |
|
14
|
|
|
|
|
33
|
|
|
14
|
|
|
|
|
58597
|
|
186
|
|
|
|
|
|
|
|
187
|
|
|
|
|
|
|
# Largely for testing |
188
|
|
|
|
|
|
|
our $sequence_id = 1; |
189
|
|
|
|
|
|
|
|
190
|
|
|
|
|
|
|
sub new { |
191
|
16
|
|
|
16
|
|
3004
|
my $class = shift; |
192
|
|
|
|
|
|
|
|
193
|
16
|
|
|
|
|
40
|
my $o= {}; |
194
|
16
|
|
|
|
|
50
|
bless( $o, $class ); |
195
|
16
|
|
|
|
|
143
|
$o->{id} = $sequence_id++; |
196
|
16
|
|
|
|
|
52
|
$o->{styleid} = 0; |
197
|
|
|
|
|
|
|
|
198
|
|
|
|
|
|
|
# Starting selections |
199
|
16
|
|
|
|
|
550
|
$o->{red} = [ 0.5, 1, 0 ], |
200
|
|
|
|
|
|
|
$o->{green} = [ 0, 0.5, 0.25, 0.75, 1 ], |
201
|
|
|
|
|
|
|
$o->{blue} = [ 0, 1, 0.5 ], |
202
|
|
|
|
|
|
|
$o->{gray} = [ 0.6, 0, 0.45, 0.15, 0.75, 0.3, 0.9 ], |
203
|
|
|
|
|
|
|
$o->{color} = [ [0.8,0.8,0], [0,0.5,0.5], [0.3,0,0.3], [0.9,0.3,0] ], |
204
|
|
|
|
|
|
|
$o->{shape} = [qw(dot cross square plus diamond circle)], |
205
|
|
|
|
|
|
|
$o->{width} = [ 0.5, 1, 3, 2 ], |
206
|
|
|
|
|
|
|
$o->{dashes} = [ [], [9, 9], [3, 3], [9, 3], [3, 9], [9, 3, 3, 3] ], |
207
|
|
|
|
|
|
|
$o->{size} = [ 2, 4, 6 ], |
208
|
|
|
|
|
|
|
|
209
|
|
|
|
|
|
|
|
210
|
|
|
|
|
|
|
$o->{initialized} = 0; # Ensure init_defaults is only called once |
211
|
16
|
|
|
|
|
53
|
$o->{auto} = undef; # requested choices |
212
|
16
|
|
|
|
|
50
|
$o->{choices} = []; # choices in use |
213
|
16
|
|
|
|
|
44
|
$o->{max} = []; # for resetting counts |
214
|
16
|
|
|
|
|
64
|
$o->{count} = []; # current position in each choice |
215
|
|
|
|
|
|
|
|
216
|
16
|
|
|
|
|
290
|
return $o; |
217
|
|
|
|
|
|
|
} |
218
|
|
|
|
|
|
|
|
219
|
|
|
|
|
|
|
=head2 Style Generation |
220
|
|
|
|
|
|
|
|
221
|
|
|
|
|
|
|
Although it is possible to specify styles directly, mostly the style just needs to be different from the last |
222
|
|
|
|
|
|
|
one. These dynamic defaults provide around 3600 variations which should be suitable for most cases. The values |
223
|
|
|
|
|
|
|
themselves can be replaced if desired. Permutations of these are then generated on demand and the permutation order |
224
|
|
|
|
|
|
|
is also under user control. |
225
|
|
|
|
|
|
|
|
226
|
|
|
|
|
|
|
=head3 PostScript::Graph::Sequence new |
227
|
|
|
|
|
|
|
|
228
|
|
|
|
|
|
|
Whenever a new PostScript::Graph::Style object is created, it uses certain defaults. These defaults can be made to |
229
|
|
|
|
|
|
|
vary if a sequence is declared as one of the options. This should be the value returned from: |
230
|
|
|
|
|
|
|
|
231
|
|
|
|
|
|
|
my $seq = new PostScript::Graph::Sequence(); |
232
|
|
|
|
|
|
|
|
233
|
|
|
|
|
|
|
=cut |
234
|
|
|
|
|
|
|
|
235
|
|
|
|
|
|
|
sub create { |
236
|
234
|
|
|
234
|
|
459
|
my ($o, $list) = @_; |
237
|
234
|
50
|
|
|
|
514
|
return defaults() if ($o->{none}); |
238
|
|
|
|
|
|
|
|
239
|
234
|
100
|
|
|
|
463
|
if (defined $list) { |
240
|
226
|
|
|
|
|
325
|
my $old = $o->{choices}; |
241
|
226
|
100
|
|
|
|
452
|
if ($#$old == $#$list) { |
242
|
216
|
|
|
|
|
4657
|
for (my $i = 0; $i <= $#$list; $i++) { |
243
|
691
|
50
|
|
|
|
3353
|
if($list->[$i] ne $old->[$i]) { |
244
|
0
|
|
|
|
|
0
|
$o->{initialized} = 0; |
245
|
0
|
|
|
|
|
0
|
last; |
246
|
|
|
|
|
|
|
} |
247
|
|
|
|
|
|
|
} |
248
|
|
|
|
|
|
|
} else { |
249
|
10
|
|
|
|
|
28
|
$o->{initialized} = 0; |
250
|
|
|
|
|
|
|
} |
251
|
|
|
|
|
|
|
} |
252
|
|
|
|
|
|
|
|
253
|
234
|
100
|
|
|
|
723
|
if ($o->{initialized}) { |
254
|
220
|
|
|
|
|
483
|
return $o->next_row(); |
255
|
|
|
|
|
|
|
} else { |
256
|
14
|
|
|
|
|
65
|
$o->doreset($list); |
257
|
14
|
|
|
|
|
140
|
return $o->output_row(); |
258
|
|
|
|
|
|
|
} |
259
|
|
|
|
|
|
|
} |
260
|
|
|
|
|
|
|
# Internal method |
261
|
|
|
|
|
|
|
# create a new set of values in this sequence |
262
|
|
|
|
|
|
|
# $opts is hash ref with {auto} key |
263
|
|
|
|
|
|
|
# Adds pstyle => previous_style on return |
264
|
|
|
|
|
|
|
|
265
|
|
|
|
|
|
|
sub doreset { |
266
|
14
|
|
|
14
|
|
30
|
my ($o, $list) = @_; |
267
|
14
|
100
|
|
|
|
63
|
if (defined $list) { |
268
|
10
|
50
|
|
|
|
107
|
$o->{auto} = $list unless defined $o->{auto}; |
269
|
|
|
|
|
|
|
} |
270
|
14
|
|
|
|
|
35
|
$list = $o->{auto}; |
271
|
14
|
|
|
|
|
33
|
$o->{initialized} = 1; |
272
|
14
|
|
|
|
|
25
|
@{$o->{choices}} = (); |
|
14
|
|
|
|
|
76
|
|
273
|
14
|
|
|
|
|
26
|
@{$o->{max}} = (); |
|
14
|
|
|
|
|
35
|
|
274
|
14
|
|
|
|
|
29
|
@{$o->{count}} = (); |
|
14
|
|
|
|
|
32
|
|
275
|
|
|
|
|
|
|
|
276
|
14
|
|
|
|
|
81
|
foreach my $ch (@$list) { |
277
|
28
|
50
|
33
|
|
|
187
|
push @{$o->{choices}}, $ch if ($ch and defined $o->{$ch}); |
|
28
|
|
|
|
|
79
|
|
278
|
|
|
|
|
|
|
} |
279
|
14
|
100
|
|
|
|
36
|
if (@{$o->{choices}} == 0) { |
|
14
|
|
|
|
|
64
|
|
280
|
4
|
|
|
|
|
26
|
$o->{choices} = [ qw(dashes shape width size) ]; |
281
|
|
|
|
|
|
|
} |
282
|
|
|
|
|
|
|
#print "choices = " . join(", ", @{$o->{choices}}) . "\n"; |
283
|
|
|
|
|
|
|
|
284
|
14
|
|
|
|
|
35
|
foreach my $key (@{$o->{choices}}) { |
|
14
|
|
|
|
|
47
|
|
285
|
44
|
50
|
|
|
|
143
|
if (defined $o->{$key}) { |
286
|
44
|
|
|
|
|
62
|
push @{$o->{max}}, $#{$o->{$key}}; |
|
44
|
|
|
|
|
250
|
|
|
44
|
|
|
|
|
93
|
|
287
|
44
|
|
|
|
|
59
|
push @{$o->{count}}, 0; |
|
44
|
|
|
|
|
107
|
|
288
|
|
|
|
|
|
|
} |
289
|
|
|
|
|
|
|
} |
290
|
14
|
|
|
|
|
36
|
return; |
291
|
|
|
|
|
|
|
} |
292
|
|
|
|
|
|
|
# Internal method |
293
|
|
|
|
|
|
|
# called by create() |
294
|
|
|
|
|
|
|
|
295
|
|
|
|
|
|
|
sub defaults { |
296
|
234
|
|
|
234
|
|
261
|
my %ref; |
297
|
234
|
|
|
|
|
441
|
$ref{red} = 0; |
298
|
234
|
|
|
|
|
477
|
$ref{green} = 0; |
299
|
234
|
|
|
|
|
356
|
$ref{blue} = 0; |
300
|
234
|
|
|
|
|
371
|
$ref{gray} = 0; |
301
|
234
|
|
|
|
|
621
|
$ref{color} = [0,0.5,0.5]; |
302
|
234
|
|
|
|
|
867
|
$ref{shape} = 'dot'; |
303
|
234
|
|
|
|
|
326
|
$ref{width} = 0.5; |
304
|
234
|
|
|
|
|
1841
|
$ref{dashes} = []; |
305
|
234
|
|
|
|
|
591
|
$ref{size} = 2; |
306
|
234
|
|
|
|
|
326
|
$ref{pstyle} = 0; # special signal for auto => 'none' |
307
|
234
|
|
|
|
|
1063
|
return \%ref; |
308
|
|
|
|
|
|
|
} |
309
|
|
|
|
|
|
|
# Internal function |
310
|
|
|
|
|
|
|
# ensuring all defaults have some value |
311
|
|
|
|
|
|
|
|
312
|
|
|
|
|
|
|
sub output_row { |
313
|
234
|
|
|
234
|
|
280
|
my $o = shift; |
314
|
234
|
|
|
|
|
424
|
my $r = defaults(); |
315
|
234
|
|
|
|
|
338
|
for (my $i = 0; $i < @{$o->{count}}; $i++) { |
|
985
|
|
|
|
|
2692
|
|
316
|
751
|
|
|
|
|
1638
|
my $key = $o->{choices}[$i]; |
317
|
751
|
|
|
|
|
1548
|
my $chosen = $o->{count}[$i]; |
318
|
751
|
|
|
|
|
2070
|
my $value = $o->{$key}[$chosen]; |
319
|
|
|
|
|
|
|
#warn "key=$key, chosen=$chosen, value=$value\n"; |
320
|
751
|
100
|
100
|
|
|
2916
|
if ($key eq 'color' or $key eq 'gray') { |
321
|
24
|
100
|
|
|
|
52
|
if (ref($value) eq "ARRAY") { |
322
|
14
|
|
|
|
|
28
|
$r->{red} = $value->[0]; |
323
|
14
|
|
|
|
|
25
|
$r->{green} = $value->[1]; |
324
|
14
|
|
|
|
|
40
|
$r->{blue} = $value->[2]; |
325
|
|
|
|
|
|
|
} else { |
326
|
10
|
|
|
|
|
18
|
$r->{red} = $value;# * 0.3; |
327
|
10
|
|
|
|
|
14
|
$r->{green} = $value;# * 0.59; |
328
|
10
|
|
|
|
|
24
|
$r->{blue} = $value;# * 0.11; |
329
|
|
|
|
|
|
|
} |
330
|
|
|
|
|
|
|
} else { |
331
|
727
|
50
|
33
|
|
|
10154
|
$r->{$key} = $value if (defined $r->{$key} and defined $value); |
332
|
|
|
|
|
|
|
} |
333
|
|
|
|
|
|
|
} |
334
|
234
|
|
|
|
|
467
|
$r->{pstyle} = $o->{pstyle}; |
335
|
|
|
|
|
|
|
#warn "count = " . join(", ", @{$o->{count}}) . "\n"; |
336
|
|
|
|
|
|
|
#warn "rgb=[$r->{red},$r->{green},$r->{blue}] ($r->{gray}) c=",str($r->{color})," '$r->{shape}'($r->{size}) w=$r->{width}, ",str($r->{dashes}),"\n"; |
337
|
234
|
|
|
|
|
662
|
return $r; |
338
|
|
|
|
|
|
|
} |
339
|
|
|
|
|
|
|
# Internal method |
340
|
|
|
|
|
|
|
# Returns a hash ref filled with suitable values |
341
|
|
|
|
|
|
|
|
342
|
|
|
|
|
|
|
sub next_row { |
343
|
220
|
|
|
220
|
|
804
|
my $o = shift; |
344
|
220
|
50
|
|
|
|
317
|
if (@{$o->{count}}) { |
|
220
|
|
|
|
|
668
|
|
345
|
220
|
|
|
|
|
264
|
my $i = 0; |
346
|
220
|
|
|
|
|
241
|
while (1) { |
347
|
287
|
100
|
|
|
|
853
|
if ($o->{count}[$i] < $o->{max}[$i]) { |
348
|
219
|
|
|
|
|
306
|
$o->{count}[$i]++; |
349
|
219
|
|
|
|
|
427
|
return $o->output_row(); |
350
|
|
|
|
|
|
|
} else { |
351
|
68
|
|
|
|
|
120
|
$o->{count}[$i] = 0; |
352
|
68
|
100
|
|
|
|
90
|
if ($i < $#{$o->{choices}}) { |
|
68
|
|
|
|
|
173
|
|
353
|
67
|
|
|
|
|
112
|
$i++; |
354
|
|
|
|
|
|
|
} else { |
355
|
1
|
|
|
|
|
2
|
$i = 0; |
356
|
1
|
|
|
|
|
4
|
return $o->output_row(); |
357
|
|
|
|
|
|
|
} |
358
|
|
|
|
|
|
|
} |
359
|
|
|
|
|
|
|
} |
360
|
|
|
|
|
|
|
} else { |
361
|
0
|
|
|
|
|
0
|
return defaults(); |
362
|
|
|
|
|
|
|
} |
363
|
|
|
|
|
|
|
} |
364
|
|
|
|
|
|
|
# Internal function returning next permutation |
365
|
|
|
|
|
|
|
# as output_row(), repeating indefinitely. |
366
|
|
|
|
|
|
|
|
367
|
|
|
|
|
|
|
sub setup { |
368
|
1
|
|
|
1
|
|
209
|
my ($o, $key, $aref) = @_; |
369
|
1
|
50
|
33
|
|
|
13
|
if (exists $o->{$key} and ref($aref) eq "ARRAY") { |
370
|
1
|
|
|
|
|
3
|
$o->{$key} = $aref; |
371
|
1
|
|
|
|
|
4
|
$o->{initialized} = 0; |
372
|
|
|
|
|
|
|
} |
373
|
1
|
|
|
|
|
4
|
return; |
374
|
|
|
|
|
|
|
} |
375
|
|
|
|
|
|
|
|
376
|
|
|
|
|
|
|
=head3 setup( key, array ) |
377
|
|
|
|
|
|
|
|
378
|
|
|
|
|
|
|
The defaults provided by the PostScript::Graph::Sequence are chosen from arrays which may be redefined using this method. Note |
379
|
|
|
|
|
|
|
that it is a B method and B a PostScript::Graph::Style method, and should typically be called |
380
|
|
|
|
|
|
|
directly after the PostScript::Graph::Sequence object is created. |
381
|
|
|
|
|
|
|
|
382
|
|
|
|
|
|
|
Example |
383
|
|
|
|
|
|
|
|
384
|
|
|
|
|
|
|
use PostScript::Graph::Style; |
385
|
|
|
|
|
|
|
|
386
|
|
|
|
|
|
|
my $seq = new PostScript::Graph::Sequence(); |
387
|
|
|
|
|
|
|
$seq->setup( "red", [0, 0.5, 1] ); |
388
|
|
|
|
|
|
|
|
389
|
|
|
|
|
|
|
C is always an array reference as in the example. C may be one of the following. |
390
|
|
|
|
|
|
|
|
391
|
|
|
|
|
|
|
red green blue |
392
|
|
|
|
|
|
|
gray color width |
393
|
|
|
|
|
|
|
dashes shape size |
394
|
|
|
|
|
|
|
|
395
|
|
|
|
|
|
|
Mostly, their arrays contain integers (0 to 1.0 for colours). The exceptions are C, C, C and |
396
|
|
|
|
|
|
|
possibly C. |
397
|
|
|
|
|
|
|
|
398
|
|
|
|
|
|
|
See L"inner_dashes"> for details on the arrays required for dashes. Suitable values for shape can be one of |
399
|
|
|
|
|
|
|
these entries, taken from the default array. |
400
|
|
|
|
|
|
|
|
401
|
|
|
|
|
|
|
my $seq = new PostScript::Graph::Sequence(); |
402
|
|
|
|
|
|
|
$seq->setup( "shape", |
403
|
|
|
|
|
|
|
[ qw(cross plus dot circle square diamond) ]); |
404
|
|
|
|
|
|
|
|
405
|
|
|
|
|
|
|
If the gray array is filled with decimals between 0 and 1 (inclusive), the result is varying shades |
406
|
|
|
|
|
|
|
of grey. It is also possible to use arrays of red-green-blue colours: |
407
|
|
|
|
|
|
|
|
408
|
|
|
|
|
|
|
my $seq = new PostScript::Graph::Sequence(); |
409
|
|
|
|
|
|
|
$seq->setup( "color", |
410
|
|
|
|
|
|
|
[ [ 0, 0, 0 ], # white |
411
|
|
|
|
|
|
|
[ 0, 0, 1 ], # blue |
412
|
|
|
|
|
|
|
[ 0, 1, 0 ], # green |
413
|
|
|
|
|
|
|
[ 0, 1, 1 ], # cyan |
414
|
|
|
|
|
|
|
[ 1, 0, 0 ], # red |
415
|
|
|
|
|
|
|
[ 1, 0, 1 ], # mauve |
416
|
|
|
|
|
|
|
[ 1, 1, 0 ], # yellow |
417
|
|
|
|
|
|
|
[ 1, 1, 1 ], ]); # black |
418
|
|
|
|
|
|
|
|
419
|
|
|
|
|
|
|
my $gs = new PostScript::Graph::Style( |
420
|
|
|
|
|
|
|
auto => [qw(color)], |
421
|
|
|
|
|
|
|
bar => {}, |
422
|
|
|
|
|
|
|
); |
423
|
|
|
|
|
|
|
|
424
|
|
|
|
|
|
|
The full range of colours may be used provided that the 'bgnd_outline' style option has not been set. By default each |
425
|
|
|
|
|
|
|
line, point and bar are outlined in the complementary colour to the background, making them stand out. |
426
|
|
|
|
|
|
|
|
427
|
|
|
|
|
|
|
More than one variable can be set of course. For example the following would ensure lines with 15 shades of |
428
|
|
|
|
|
|
|
red-orange-yellow, if 'auto' was set to some combination of red, blue and green. |
429
|
|
|
|
|
|
|
|
430
|
|
|
|
|
|
|
my $seq = new PostScript::Graph::Sequence(); |
431
|
|
|
|
|
|
|
$seq->setup("red", [ 0.2, 1, 0.4, 0.8, 0.6 ]); |
432
|
|
|
|
|
|
|
$seq->setup("green", [ 0, 0.8, 0.4 ]); |
433
|
|
|
|
|
|
|
$seq->setup("blue", [ 0 ]); |
434
|
|
|
|
|
|
|
|
435
|
|
|
|
|
|
|
=cut |
436
|
|
|
|
|
|
|
|
437
|
|
|
|
|
|
|
sub auto { |
438
|
0
|
|
|
0
|
|
0
|
my ($o, @list) = @_; |
439
|
0
|
|
|
|
|
0
|
$o->{auto} = [ @list ]; |
440
|
0
|
|
|
|
|
0
|
$o->{initialized} = 0; |
441
|
|
|
|
|
|
|
} |
442
|
|
|
|
|
|
|
|
443
|
|
|
|
|
|
|
=head3 auto( list ) |
444
|
|
|
|
|
|
|
|
445
|
|
|
|
|
|
|
Specify which defaults are changed for each new style. |
446
|
|
|
|
|
|
|
|
447
|
|
|
|
|
|
|
The first feature mentioned will vary fastest from one style to the next while the last varies slowest. Any |
448
|
|
|
|
|
|
|
features not mentioned will not be varied. See L"Style Generation"> for how to change the defaults for these |
449
|
|
|
|
|
|
|
features. |
450
|
|
|
|
|
|
|
|
451
|
|
|
|
|
|
|
red green blue |
452
|
|
|
|
|
|
|
gray color width |
453
|
|
|
|
|
|
|
dashes shape size |
454
|
|
|
|
|
|
|
|
455
|
|
|
|
|
|
|
If not set directly, it may be set from the C option given to the first PostScript::Graph::Style object created |
456
|
|
|
|
|
|
|
using this sequence. |
457
|
|
|
|
|
|
|
|
458
|
|
|
|
|
|
|
=cut |
459
|
|
|
|
|
|
|
|
460
|
|
|
|
|
|
|
sub reset { |
461
|
0
|
|
|
0
|
|
0
|
shift()->{initialized} = 0; |
462
|
|
|
|
|
|
|
} |
463
|
|
|
|
|
|
|
|
464
|
|
|
|
|
|
|
=head3 reset() |
465
|
|
|
|
|
|
|
|
466
|
|
|
|
|
|
|
Starts the sequence of defaults again. |
467
|
|
|
|
|
|
|
|
468
|
|
|
|
|
|
|
=cut |
469
|
|
|
|
|
|
|
|
470
|
|
|
|
|
|
|
sub new_style_id { |
471
|
234
|
|
|
234
|
|
296
|
my $o = shift; |
472
|
234
|
|
|
|
|
2470
|
$o->{styleid}++; |
473
|
234
|
|
|
|
|
642
|
return $o->{styleid}; |
474
|
|
|
|
|
|
|
} |
475
|
|
|
|
|
|
|
|
476
|
|
|
|
|
|
|
sub id { |
477
|
4
|
|
|
4
|
|
11
|
return shift()->{id}; |
478
|
|
|
|
|
|
|
} |
479
|
|
|
|
|
|
|
|
480
|
|
|
|
|
|
|
sub default { |
481
|
197
|
100
|
|
197
|
|
521
|
our $default_seq = new PostScript::Graph::Sequence() unless (defined $default_seq); |
482
|
197
|
|
|
|
|
304
|
return $default_seq; |
483
|
|
|
|
|
|
|
} |
484
|
|
|
|
|
|
|
|
485
|
|
|
|
|
|
|
=head3 default() |
486
|
|
|
|
|
|
|
|
487
|
|
|
|
|
|
|
Return a fallback PostScript::Graph::Sequence. Note that these are global settings possibly called by many, |
488
|
|
|
|
|
|
|
unrelated objects, so the sequences generated may not be predictable or even useful. |
489
|
|
|
|
|
|
|
|
490
|
|
|
|
|
|
|
=cut |
491
|
|
|
|
|
|
|
|
492
|
|
|
|
|
|
|
# The fallback sequence if none given |
493
|
|
|
|
|
|
|
our $default_seq; |
494
|
|
|
|
|
|
|
|
495
|
|
|
|
|
|
|
=head2 Class Methods |
496
|
|
|
|
|
|
|
|
497
|
|
|
|
|
|
|
### PostScript::Graph::Style |
498
|
|
|
|
|
|
|
|
499
|
|
|
|
|
|
|
=cut |
500
|
|
|
|
|
|
|
|
501
|
|
|
|
|
|
|
package PostScript::Graph::Style; |
502
|
|
|
|
|
|
|
|
503
|
|
|
|
|
|
|
our $default_style_id = 1; |
504
|
|
|
|
|
|
|
|
505
|
|
|
|
|
|
|
=head1 CONSTRUCTOR |
506
|
|
|
|
|
|
|
|
507
|
|
|
|
|
|
|
B |
508
|
|
|
|
|
|
|
|
509
|
|
|
|
|
|
|
C can either be a list of hash keys and values or a single hash reference. In both cases the hash must |
510
|
|
|
|
|
|
|
have the same structure. There are a few principal keys and most of these refer to hashes holding a group of |
511
|
|
|
|
|
|
|
options. |
512
|
|
|
|
|
|
|
|
513
|
|
|
|
|
|
|
It is B that at least one of C, C or C is given, even if the hashes are empty. |
514
|
|
|
|
|
|
|
Otherwise no style settings will actually be output. |
515
|
|
|
|
|
|
|
|
516
|
|
|
|
|
|
|
=cut |
517
|
|
|
|
|
|
|
|
518
|
|
|
|
|
|
|
sub new { |
519
|
234
|
|
|
234
|
1
|
5819
|
my $class = shift; |
520
|
234
|
|
|
|
|
345
|
my $opt = {}; |
521
|
234
|
50
|
|
|
|
560
|
if (@_ == 1) { $opt = $_[0]; } else { %$opt = @_; } |
|
234
|
|
|
|
|
335
|
|
|
0
|
|
|
|
|
0
|
|
522
|
|
|
|
|
|
|
|
523
|
234
|
|
|
|
|
786
|
my $o = {}; |
524
|
234
|
|
|
|
|
596
|
bless( $o, $class ); |
525
|
|
|
|
|
|
|
|
526
|
|
|
|
|
|
|
## collect the defaults |
527
|
234
|
|
|
|
|
265
|
my ($d, $seq); |
528
|
234
|
|
66
|
|
|
1480
|
$o->{none} = (defined($opt->{auto}) and ref($opt->{auto}) ne "ARRAY"); |
529
|
234
|
50
|
|
|
|
507
|
if ($o->{none}) { |
530
|
0
|
|
|
|
|
0
|
$d = PostScript::Graph::Sequence::defaults(); |
531
|
0
|
|
|
|
|
0
|
$o->{id} = $default_style_id++; |
532
|
|
|
|
|
|
|
} else { |
533
|
234
|
100
|
|
|
|
1749
|
$seq = defined($opt->{sequence}) ? $opt->{sequence} : PostScript::Graph::Sequence::default(); |
534
|
234
|
|
|
|
|
636
|
$d = $seq->create($opt->{auto}); |
535
|
234
|
|
|
|
|
447
|
$o->{seq} = $seq; |
536
|
234
|
|
|
|
|
521
|
$o->{id} = $seq->new_style_id(); |
537
|
|
|
|
|
|
|
} |
538
|
|
|
|
|
|
|
|
539
|
234
|
|
|
|
|
545
|
$o->{label} = $opt->{label}; # for debugging |
540
|
234
|
100
|
|
|
|
579
|
$o->{rel} = defined($opt->{changes_only}) ? $opt->{changes_only} : 1; # 'don't set everything' |
541
|
234
|
50
|
|
|
|
644
|
$o->{same} = defined($opt->{bgnd_outline}) ? $opt->{bgnd_outline} : 0; # 'don't complement bgnd' |
542
|
234
|
50
|
|
|
|
540
|
$o->{color} = defined($opt->{use_color}) ? $opt->{use_color} : 1; # 'not monochrome' |
543
|
234
|
50
|
|
|
|
1138
|
my $color = $o->{color} ? [ $d->{red}, $d->{green}, $d->{blue} ] : $d->{gray}; |
544
|
|
|
|
|
|
|
|
545
|
|
|
|
|
|
|
## common options |
546
|
234
|
100
|
|
|
|
1539
|
$color = defined($opt->{color}) ? $opt->{color} : $color; |
547
|
234
|
50
|
|
|
|
532
|
my $width = defined($opt->{width}) ? $opt->{width} : $d->{width}; |
548
|
234
|
50
|
|
|
|
1303
|
my $dashes = defined($opt->{dashes}) ? $opt->{dashes} : $d->{dashes}; |
549
|
|
|
|
|
|
|
|
550
|
|
|
|
|
|
|
## line options |
551
|
234
|
|
|
|
|
335
|
my $li = $opt->{line}; |
552
|
234
|
100
|
|
|
|
472
|
if ($li) { |
553
|
20
|
100
|
|
|
|
50
|
my $lwidth = defined($li->{width}) ? $li->{width} : $width; |
554
|
20
|
50
|
|
|
|
45
|
my $ldashes = defined($li->{dashes}) ? $li->{dashes} : $dashes; |
555
|
20
|
100
|
|
|
|
94
|
$o->{locolor} = defined($li->{outer_color}) ? $li->{outer_color} : -1; |
556
|
20
|
100
|
|
|
|
67
|
$o->{lowidth} = defined($li->{outer_width}) ? $li->{outer_width} : 2 * $lwidth; |
557
|
20
|
100
|
|
|
|
64
|
$o->{lostyle} = defined($li->{outer_dashes}) ? $li->{outer_dashes} : $ldashes; |
558
|
|
|
|
|
|
|
|
559
|
20
|
50
|
|
|
|
82
|
$o->{licolor} = defined($li->{color}) ? $li->{color} : $color; |
560
|
20
|
100
|
|
|
|
312
|
$o->{licolor} = defined($li->{inner_color}) ? $li->{inner_color} : $o->{licolor}; |
561
|
20
|
100
|
|
|
|
54
|
$o->{liwidth} = defined($li->{inner_width}) ? $li->{inner_width} : $lwidth; |
562
|
20
|
100
|
|
|
|
52
|
$o->{listyle} = defined($li->{inner_dashes}) ? $li->{inner_dashes} : $ldashes; |
563
|
20
|
|
|
|
|
52
|
$o->{use_line} = 1; |
564
|
|
|
|
|
|
|
} |
565
|
|
|
|
|
|
|
|
566
|
|
|
|
|
|
|
## bar options |
567
|
234
|
|
|
|
|
311
|
my $bl = $opt->{bar}; |
568
|
234
|
100
|
|
|
|
1301
|
if ($bl) { |
569
|
204
|
50
|
|
|
|
394
|
my $bwidth = defined($bl->{width}) ? $bl->{width} : $width; |
570
|
204
|
50
|
|
|
|
484
|
my $bdashes = defined($bl->{dashes}) ? $bl->{dashes} : []; |
571
|
204
|
50
|
|
|
|
661
|
$o->{bocolor} = defined($bl->{outer_color}) ? $bl->{outer_color} : -1; |
572
|
204
|
50
|
|
|
|
548
|
$o->{bowidth} = defined($bl->{outer_width}) ? $bl->{outer_width} : 2 * $bwidth; |
573
|
204
|
50
|
|
|
|
718
|
$o->{bostyle} = defined($li->{outer_dashes}) ? $li->{outer_dashes} : $bdashes; |
574
|
|
|
|
|
|
|
|
575
|
204
|
100
|
|
|
|
741
|
$o->{bicolor} = defined($bl->{color}) ? $bl->{color} : $color; |
576
|
204
|
50
|
|
|
|
428
|
$o->{bicolor} = defined($bl->{inner_color}) ? $bl->{inner_color} : $o->{bicolor}; |
577
|
204
|
50
|
|
|
|
484
|
$o->{biwidth} = defined($bl->{inner_width}) ? $bl->{inner_width} : $bwidth; |
578
|
204
|
50
|
|
|
|
449
|
$o->{bistyle} = defined($li->{inner_dashes}) ? $li->{inner_dashes} : $bdashes; |
579
|
204
|
|
|
|
|
450
|
$o->{use_bar} = 1; |
580
|
|
|
|
|
|
|
} |
581
|
|
|
|
|
|
|
|
582
|
|
|
|
|
|
|
## point options |
583
|
234
|
|
|
|
|
352
|
my $pp = $opt->{point}; |
584
|
234
|
100
|
|
|
|
455
|
if ($pp) { |
585
|
16
|
50
|
|
|
|
38
|
my $pwidth = defined($pp->{width}) ? $pp->{width} : $width; |
586
|
16
|
50
|
|
|
|
116
|
my $pdashes = defined($bl->{dashes}) ? $bl->{dashes} : []; |
587
|
16
|
100
|
|
|
|
136
|
$o->{ppsize} = defined($pp->{size}) ? $pp->{size} : $d->{size}; |
588
|
16
|
50
|
|
|
|
60
|
$o->{ppdx} = defined($pp->{x_offset}) ? $pp->{x_offset} : 0; |
589
|
16
|
50
|
|
|
|
60
|
$o->{ppdy} = defined($pp->{y_offset}) ? $pp->{y_offset} : 0; |
590
|
16
|
100
|
|
|
|
56
|
$o->{ppshape} = defined($pp->{shape}) ? $pp->{shape} : $d->{shape}; |
591
|
|
|
|
|
|
|
|
592
|
16
|
100
|
|
|
|
42
|
$o->{pocolor} = defined($pp->{outer_color}) ? $pp->{outer_color} : -1; |
593
|
16
|
100
|
|
|
|
133
|
$o->{powidth} = defined($pp->{outer_width}) ? $pp->{outer_width} : 2 * $pwidth; |
594
|
16
|
50
|
|
|
|
45
|
$o->{postyle} = defined($pp->{outer_dashes}) ? $pp->{outer_dashes} : $pdashes; |
595
|
|
|
|
|
|
|
|
596
|
16
|
50
|
|
|
|
41
|
$o->{picolor} = defined($pp->{color}) ? $pp->{color} : $color; |
597
|
16
|
100
|
|
|
|
43
|
$o->{picolor} = defined($pp->{inner_color}) ? $pp->{inner_color} : $o->{picolor}; |
598
|
16
|
100
|
|
|
|
50
|
$o->{piwidth} = defined($pp->{inner_width}) ? $pp->{inner_width} : $pwidth; |
599
|
16
|
50
|
|
|
|
40
|
$o->{pistyle} = defined($pp->{inner_dashes}) ? $pp->{inner_dashes} : $pdashes; |
600
|
16
|
|
|
|
|
32
|
$o->{use_point} = 1; |
601
|
|
|
|
|
|
|
} |
602
|
|
|
|
|
|
|
|
603
|
234
|
|
|
|
|
1371
|
return $o; |
604
|
|
|
|
|
|
|
} |
605
|
|
|
|
|
|
|
|
606
|
|
|
|
|
|
|
=head2 Global settings |
607
|
|
|
|
|
|
|
|
608
|
|
|
|
|
|
|
These are mainly concerned with how the defaults are generated for each new PostScript::Graph::Style object. |
609
|
|
|
|
|
|
|
|
610
|
|
|
|
|
|
|
=head3 auto |
611
|
|
|
|
|
|
|
|
612
|
|
|
|
|
|
|
Setting C to the string 'none' prevents the automatic generation of defaults. Of course the same result |
613
|
|
|
|
|
|
|
could be obtained by setting every option so the defaults are never needed. Otherwise this may be a list of |
614
|
|
|
|
|
|
|
features (see the B method for PostScript::Graph::Sequence, above). |
615
|
|
|
|
|
|
|
|
616
|
|
|
|
|
|
|
=head3 changes_only |
617
|
|
|
|
|
|
|
|
618
|
|
|
|
|
|
|
Set this to 0 if you need every style parameter written out to postscript. If this is 1, only the changes from |
619
|
|
|
|
|
|
|
the previous style settings are added to the file. (Default: 1) |
620
|
|
|
|
|
|
|
|
621
|
|
|
|
|
|
|
=head3 color |
622
|
|
|
|
|
|
|
|
623
|
|
|
|
|
|
|
Set default colour for lines, bars and points. |
624
|
|
|
|
|
|
|
|
625
|
|
|
|
|
|
|
=head3 label |
626
|
|
|
|
|
|
|
|
627
|
|
|
|
|
|
|
A string identifying the style, added to the id(). The interaction between styles can get quite complex, |
628
|
|
|
|
|
|
|
especially when using more than one sequence. This label becomes part of the C method and makes styles easier |
629
|
|
|
|
|
|
|
to track. |
630
|
|
|
|
|
|
|
|
631
|
|
|
|
|
|
|
=head3 bgnd_outline |
632
|
|
|
|
|
|
|
|
633
|
|
|
|
|
|
|
By default, the outer colour is the complement of the background (see L"outer_color">). Setting this to 1 makes |
634
|
|
|
|
|
|
|
the outer colour the same as the background. |
635
|
|
|
|
|
|
|
|
636
|
|
|
|
|
|
|
=head3 sequence |
637
|
|
|
|
|
|
|
|
638
|
|
|
|
|
|
|
This identifies a sequence of default values. If this is not defined (but 'auto' is not 'none'), a new sequence |
639
|
|
|
|
|
|
|
would be created with each call resulting in the same style every time. |
640
|
|
|
|
|
|
|
|
641
|
|
|
|
|
|
|
=head3 use_color |
642
|
|
|
|
|
|
|
|
643
|
|
|
|
|
|
|
Set this to 0 to use shades of grey for monochrome printers. |
644
|
|
|
|
|
|
|
|
645
|
|
|
|
|
|
|
This also must be set to 0 to cycle through user defined colours. See L"Style Generation"> for how to set |
646
|
|
|
|
|
|
|
those. This switch actually determines whether the colour value is taken from the gray array or a composite of |
647
|
|
|
|
|
|
|
the red, green and blue arrays. So putting the custom colours into 'gray' and setting C to 0 reads these. |
648
|
|
|
|
|
|
|
The internal postscript code handles each format interchangeably, so the result is coloured gray! |
649
|
|
|
|
|
|
|
|
650
|
|
|
|
|
|
|
=head3 width |
651
|
|
|
|
|
|
|
|
652
|
|
|
|
|
|
|
Set default line width for lines, bars and points. |
653
|
|
|
|
|
|
|
|
654
|
|
|
|
|
|
|
=head2 Graphic settings |
655
|
|
|
|
|
|
|
|
656
|
|
|
|
|
|
|
The options described below belong within C, C or C sub-hashes unless otherwise mentioned. |
657
|
|
|
|
|
|
|
For example, referring to the descriptions for C and C: |
658
|
|
|
|
|
|
|
|
659
|
|
|
|
|
|
|
line => { color => ... } valid |
660
|
|
|
|
|
|
|
point => { color => ... } valid |
661
|
|
|
|
|
|
|
|
662
|
|
|
|
|
|
|
line => { size => ... } NOT valid |
663
|
|
|
|
|
|
|
point => { size => ... } valid |
664
|
|
|
|
|
|
|
|
665
|
|
|
|
|
|
|
The sub-hashes are significant. B if that feature is to be used, even if the sub-hash is |
666
|
|
|
|
|
|
|
empty. Otherwise, no postscript values of that type will be defined. |
667
|
|
|
|
|
|
|
|
668
|
|
|
|
|
|
|
All C options within these sub-hashes take either a single greyscale decimal or a reference to an array |
669
|
|
|
|
|
|
|
holding decimals for red, green and blue components. All decimals should be between 0 and 1.0 inclusive. |
670
|
|
|
|
|
|
|
|
671
|
|
|
|
|
|
|
color => 1 white |
672
|
|
|
|
|
|
|
outer_color => 0 black |
673
|
|
|
|
|
|
|
inner_color => [1, 0, 0] red |
674
|
|
|
|
|
|
|
|
675
|
|
|
|
|
|
|
B |
676
|
|
|
|
|
|
|
|
677
|
|
|
|
|
|
|
$ps = new PostScript::Graph::Style( |
678
|
|
|
|
|
|
|
auto => "none", |
679
|
|
|
|
|
|
|
line => { |
680
|
|
|
|
|
|
|
width => 2, |
681
|
|
|
|
|
|
|
inner_color => [ 1, 0.6, 0.4 ], |
682
|
|
|
|
|
|
|
} |
683
|
|
|
|
|
|
|
point => { |
684
|
|
|
|
|
|
|
shape => "diamond", |
685
|
|
|
|
|
|
|
size => 12, |
686
|
|
|
|
|
|
|
color => [ 1, 0.8, 0.8 ], |
687
|
|
|
|
|
|
|
inner_width => 2, |
688
|
|
|
|
|
|
|
outer_width => 1, |
689
|
|
|
|
|
|
|
} |
690
|
|
|
|
|
|
|
); |
691
|
|
|
|
|
|
|
|
692
|
|
|
|
|
|
|
=head3 color |
693
|
|
|
|
|
|
|
|
694
|
|
|
|
|
|
|
A synonym for C. See L"new">. |
695
|
|
|
|
|
|
|
|
696
|
|
|
|
|
|
|
=head3 dashes |
697
|
|
|
|
|
|
|
|
698
|
|
|
|
|
|
|
Set both inner and outer dash patterns. See L"inner_dashes">. |
699
|
|
|
|
|
|
|
|
700
|
|
|
|
|
|
|
=head3 inner_color |
701
|
|
|
|
|
|
|
|
702
|
|
|
|
|
|
|
The main colour of the line or point. See L"new">. |
703
|
|
|
|
|
|
|
|
704
|
|
|
|
|
|
|
=head3 inner_dashes |
705
|
|
|
|
|
|
|
|
706
|
|
|
|
|
|
|
This array ref holds values that determine any dash pattern. They are repeated as needed to give the size 'on' |
707
|
|
|
|
|
|
|
then 'off'. Examples are the best way to describe this. |
708
|
|
|
|
|
|
|
|
709
|
|
|
|
|
|
|
inner_dashes => [] ------------------------- |
710
|
|
|
|
|
|
|
inner_dashes => [ 3,3 ] --- --- --- --- - |
711
|
|
|
|
|
|
|
inner_dashes => [ 5,2,1,2 ] ----- - ----- - ----- |
712
|
|
|
|
|
|
|
|
713
|
|
|
|
|
|
|
Only available for lines. |
714
|
|
|
|
|
|
|
|
715
|
|
|
|
|
|
|
=head3 inner_width |
716
|
|
|
|
|
|
|
|
717
|
|
|
|
|
|
|
The size of the central portion of the line. Although this can be set of points, C is more likely to be |
718
|
|
|
|
|
|
|
what you want. Probably should be no less than 0.1 to be visible - 0.24 on a 300dpi device or 1 on 72dpi. |
719
|
|
|
|
|
|
|
(Default: 0.5) |
720
|
|
|
|
|
|
|
|
721
|
|
|
|
|
|
|
When used in conjunction with C, setting inner and outer widths to the same value produces |
722
|
|
|
|
|
|
|
a two-colour dash. |
723
|
|
|
|
|
|
|
|
724
|
|
|
|
|
|
|
=head3 outer_color |
725
|
|
|
|
|
|
|
|
726
|
|
|
|
|
|
|
Colour for the 'edges' of the line or point. To be visible C must be greater than . |
727
|
|
|
|
|
|
|
(Default: -1) |
728
|
|
|
|
|
|
|
|
729
|
|
|
|
|
|
|
Note that the default is NOT a valid postscript value (although C handles it fine. See |
730
|
|
|
|
|
|
|
L. If B is called later, it fills all colours marked thus |
731
|
|
|
|
|
|
|
with a background colour now known. |
732
|
|
|
|
|
|
|
|
733
|
|
|
|
|
|
|
=head3 outer_dashes |
734
|
|
|
|
|
|
|
|
735
|
|
|
|
|
|
|
If this is unset, inner lines alternate with the outer colour. To get a dashed line, this should be the same |
736
|
|
|
|
|
|
|
value as C. (Default: "[]") |
737
|
|
|
|
|
|
|
|
738
|
|
|
|
|
|
|
Only available for lines. |
739
|
|
|
|
|
|
|
|
740
|
|
|
|
|
|
|
=head3 outer_width |
741
|
|
|
|
|
|
|
|
742
|
|
|
|
|
|
|
Total width of the line or point, including the border (which may be invisible, depending on colour). The edge is |
743
|
|
|
|
|
|
|
only visible if this is at least 0.5 greater than C. 2 or 3 times C is often best. |
744
|
|
|
|
|
|
|
(Default: 1.5) |
745
|
|
|
|
|
|
|
|
746
|
|
|
|
|
|
|
When using the C point shape, this should be quite small to allow the line to be visible inside the |
747
|
|
|
|
|
|
|
circle. |
748
|
|
|
|
|
|
|
|
749
|
|
|
|
|
|
|
=head3 shape |
750
|
|
|
|
|
|
|
|
751
|
|
|
|
|
|
|
This string specifies the built-in shape to use for points. Suitable values are: |
752
|
|
|
|
|
|
|
|
753
|
|
|
|
|
|
|
north south east west |
754
|
|
|
|
|
|
|
plus cross dot circle |
755
|
|
|
|
|
|
|
square diamond |
756
|
|
|
|
|
|
|
|
757
|
|
|
|
|
|
|
(Default: "dot") |
758
|
|
|
|
|
|
|
|
759
|
|
|
|
|
|
|
Only available for points. |
760
|
|
|
|
|
|
|
|
761
|
|
|
|
|
|
|
=head3 size |
762
|
|
|
|
|
|
|
|
763
|
|
|
|
|
|
|
Width across the inner part of a point shape. (Default: 5) |
764
|
|
|
|
|
|
|
|
765
|
|
|
|
|
|
|
Not available for lines. |
766
|
|
|
|
|
|
|
|
767
|
|
|
|
|
|
|
=head3 width |
768
|
|
|
|
|
|
|
|
769
|
|
|
|
|
|
|
Set the inner line width. The outer width is also set to twice this value. |
770
|
|
|
|
|
|
|
|
771
|
|
|
|
|
|
|
=head3 x_offset |
772
|
|
|
|
|
|
|
|
773
|
|
|
|
|
|
|
Move the active position of a point from the centre to somewhere else. Useful for arrows. |
774
|
|
|
|
|
|
|
|
775
|
|
|
|
|
|
|
Example |
776
|
|
|
|
|
|
|
|
777
|
|
|
|
|
|
|
By default, a left-pointing arrow will be drawn centrally over the specified point. However, specifying an |
778
|
|
|
|
|
|
|
C of 0.75 the size, it will now be drawn with the arrow tip at the point instead (the left edge of the |
779
|
|
|
|
|
|
|
icon). In practice, making the offset a little larger allows for the unbevelled point which becomes quite |
780
|
|
|
|
|
|
|
pronounced as the line width increases. |
781
|
|
|
|
|
|
|
|
782
|
|
|
|
|
|
|
point => { |
783
|
|
|
|
|
|
|
shape => 'east', |
784
|
|
|
|
|
|
|
size => 6, |
785
|
|
|
|
|
|
|
x_offset => -6, |
786
|
|
|
|
|
|
|
} |
787
|
|
|
|
|
|
|
|
788
|
|
|
|
|
|
|
=head3 y_offset |
789
|
|
|
|
|
|
|
|
790
|
|
|
|
|
|
|
Move the active position of a point from the centre to somewhere else. Useful for arrows. |
791
|
|
|
|
|
|
|
|
792
|
|
|
|
|
|
|
Example |
793
|
|
|
|
|
|
|
|
794
|
|
|
|
|
|
|
By default, an up-pointing arrow will be drawn centrally over the specified point. However, specifying an |
795
|
|
|
|
|
|
|
C of 0.75 the size, it will now be drawn with the arrow tip at the point instead (the top edge of the |
796
|
|
|
|
|
|
|
icon). |
797
|
|
|
|
|
|
|
|
798
|
|
|
|
|
|
|
point => { |
799
|
|
|
|
|
|
|
shape => 'north', |
800
|
|
|
|
|
|
|
size => 6, |
801
|
|
|
|
|
|
|
y_offset => 6, |
802
|
|
|
|
|
|
|
} |
803
|
|
|
|
|
|
|
|
804
|
|
|
|
|
|
|
=cut |
805
|
|
|
|
|
|
|
|
806
|
|
|
|
|
|
|
sub number_value { |
807
|
828
|
|
|
828
|
0
|
1193
|
my ($o, $name) = @_; |
808
|
828
|
|
|
|
|
22575
|
my $res = "/$name ". $o->{$name} . " def\n"; |
809
|
828
|
|
|
|
|
1323
|
my $prev = $o->{prev}; |
810
|
828
|
100
|
66
|
|
|
3501
|
if ($o->{rel} and $prev) { |
811
|
787
|
50
|
|
|
|
1998
|
my $new = defined($o->{$name}) ? $o->{$name} : 'undef'; |
812
|
787
|
50
|
|
|
|
1703
|
my $old = defined($prev->{$name}) ? $prev->{$name} : 'undef'; |
813
|
787
|
100
|
|
|
|
4772
|
$res = '' if ($new eq $old); |
814
|
|
|
|
|
|
|
} |
815
|
828
|
|
|
|
|
1670
|
return $res; |
816
|
|
|
|
|
|
|
} |
817
|
|
|
|
|
|
|
# Internal method |
818
|
|
|
|
|
|
|
# expects variable name and hash key |
819
|
|
|
|
|
|
|
# string to add to postscript code |
820
|
|
|
|
|
|
|
|
821
|
|
|
|
|
|
|
sub shape_value { |
822
|
16
|
|
|
16
|
0
|
24
|
my ($o, $name) = @_; |
823
|
16
|
|
|
|
|
49
|
my $res = "/$name /make_$o->{$name} cvx def\n"; |
824
|
16
|
|
|
|
|
29
|
my $prev = $o->{prev}; |
825
|
16
|
100
|
66
|
|
|
82
|
if ($o->{rel} and $prev) { |
826
|
13
|
|
50
|
|
|
40
|
my $new = $o->{$name} || ''; |
827
|
13
|
|
50
|
|
|
48
|
my $old = $prev->{$name} || ''; |
828
|
13
|
100
|
|
|
|
47
|
$res = '' if ($new eq $old); |
829
|
|
|
|
|
|
|
} |
830
|
16
|
|
|
|
|
37
|
return $res; |
831
|
|
|
|
|
|
|
} |
832
|
|
|
|
|
|
|
|
833
|
|
|
|
|
|
|
sub array_value { |
834
|
1560
|
|
|
1560
|
0
|
2164
|
my ($o, $name) = @_; |
835
|
1560
|
|
|
|
|
4971
|
my $res = "/$name ". str($o->{$name}) . " def\n"; |
836
|
1560
|
|
|
|
|
18506
|
my $prev = $o->{prev}; |
837
|
1560
|
100
|
66
|
|
|
7144
|
if ($o->{rel} and $prev) { |
838
|
1496
|
|
100
|
|
|
4007
|
my $new = str($o->{$name}) || ''; |
839
|
1496
|
|
100
|
|
|
31049
|
my $old = str($prev->{$name}) || ''; |
840
|
1496
|
100
|
100
|
|
|
39494
|
$res = '' if ($new eq $old and $old ne ''); |
841
|
|
|
|
|
|
|
} |
842
|
1560
|
|
|
|
|
3954
|
return $res; |
843
|
|
|
|
|
|
|
} |
844
|
|
|
|
|
|
|
|
845
|
|
|
|
|
|
|
=head1 OBJECT METHODS |
846
|
|
|
|
|
|
|
|
847
|
|
|
|
|
|
|
=cut |
848
|
|
|
|
|
|
|
|
849
|
|
|
|
|
|
|
sub write { |
850
|
384
|
|
|
384
|
1
|
591
|
my ($o, $ps) = @_; |
851
|
384
|
|
|
|
|
991
|
$o->ps_functions($ps); # only active on first call |
852
|
|
|
|
|
|
|
|
853
|
384
|
|
|
|
|
736232
|
$o->{prev} = $ps->get_page_variable('PostScript::Graph::Style'); |
854
|
|
|
|
|
|
|
#warn '% style=' . $o->id() . ', prev=' . ($o->{prev} ? $o->{prev}->id() : 'undef') . "\n"; |
855
|
|
|
|
|
|
|
|
856
|
384
|
|
|
|
|
2324
|
my $settings = "gstyledict begin\n"; |
857
|
384
|
100
|
|
|
|
1048
|
$settings .= $o->array_value ('locolor') if ($o->{use_line}); |
858
|
384
|
100
|
|
|
|
920
|
$settings .= $o->number_value('lowidth') if ($o->{use_line}); |
859
|
384
|
100
|
|
|
|
793
|
$settings .= $o->array_value ('lostyle') if ($o->{use_line}); |
860
|
384
|
100
|
|
|
|
6424
|
$settings .= $o->array_value ('licolor') if ($o->{use_line}); |
861
|
384
|
100
|
|
|
|
869
|
$settings .= $o->number_value('liwidth') if ($o->{use_line}); |
862
|
384
|
100
|
|
|
|
753
|
$settings .= $o->array_value ('listyle') if ($o->{use_line}); |
863
|
384
|
100
|
|
|
|
798
|
$settings .= $o->shape_value ('ppshape') if ($o->{use_point}); |
864
|
384
|
100
|
|
|
|
762
|
$settings .= $o->number_value('ppsize') if ($o->{use_point}); |
865
|
384
|
100
|
|
|
|
784
|
$settings .= $o->number_value('ppdx') if ($o->{use_point}); |
866
|
384
|
100
|
|
|
|
789
|
$settings .= $o->number_value('ppdy') if ($o->{use_point}); |
867
|
384
|
100
|
|
|
|
789
|
$settings .= $o->number_value('powidth') if ($o->{use_point}); |
868
|
384
|
100
|
|
|
|
753
|
$settings .= $o->array_value ('pocolor') if ($o->{use_point}); |
869
|
384
|
100
|
|
|
|
792
|
$settings .= $o->array_value ('postyle') if ($o->{use_point}); |
870
|
384
|
100
|
|
|
|
761
|
$settings .= $o->array_value ('picolor') if ($o->{use_point}); |
871
|
384
|
100
|
|
|
|
777
|
$settings .= $o->number_value('piwidth') if ($o->{use_point}); |
872
|
384
|
100
|
|
|
|
715
|
$settings .= $o->array_value ('pistyle') if ($o->{use_point}); |
873
|
384
|
100
|
|
|
|
1234
|
$settings .= $o->array_value ('bocolor') if ($o->{use_bar}); |
874
|
384
|
100
|
|
|
|
1450
|
$settings .= $o->number_value('bowidth') if ($o->{use_bar}); |
875
|
384
|
100
|
|
|
|
1264
|
$settings .= $o->array_value ('bostyle') if ($o->{use_bar}); |
876
|
384
|
100
|
|
|
|
1309
|
$settings .= $o->array_value ('bicolor') if ($o->{use_bar}); |
877
|
384
|
100
|
|
|
|
1392
|
$settings .= $o->number_value('biwidth') if ($o->{use_bar}); |
878
|
384
|
100
|
|
|
|
1265
|
$settings .= $o->array_value ('bistyle') if ($o->{use_bar}); |
879
|
384
|
|
|
|
|
564
|
$settings .= "end\n"; |
880
|
|
|
|
|
|
|
|
881
|
384
|
|
|
|
|
1209
|
$ps->add_to_page( $settings ); |
882
|
384
|
|
|
|
|
61947
|
$ps->set_page_variable('PostScript::Graph::Style', $o); |
883
|
|
|
|
|
|
|
} |
884
|
|
|
|
|
|
|
|
885
|
|
|
|
|
|
|
=head3 write( ps ) |
886
|
|
|
|
|
|
|
|
887
|
|
|
|
|
|
|
Write style settings to the PostScript::File object. This is a convenient way of setting all the postscript |
888
|
|
|
|
|
|
|
variables at the same time as it calls each of the line, point and bar variants below. |
889
|
|
|
|
|
|
|
|
890
|
|
|
|
|
|
|
All of the postscript variables are set if the constructor option C was |
891
|
|
|
|
|
|
|
set to 0. Otherwise, only those values that are different from the previous style are written out. |
892
|
|
|
|
|
|
|
|
893
|
|
|
|
|
|
|
See L for a list of the variables set. |
894
|
|
|
|
|
|
|
|
895
|
|
|
|
|
|
|
=cut |
896
|
|
|
|
|
|
|
|
897
|
|
|
|
|
|
|
sub background { |
898
|
370
|
|
|
370
|
1
|
604
|
my ($o, $col, $same) = @_; |
899
|
370
|
50
|
|
|
|
1326
|
$same = $o->{same} unless (defined $same); |
900
|
|
|
|
|
|
|
|
901
|
370
|
50
|
|
|
|
804
|
unless ($same) { |
902
|
370
|
100
|
|
|
|
786
|
if (ref($col) eq "ARRAY") { |
903
|
53
|
|
|
|
|
131
|
$col->[0] = 1 - $col->[0]; |
904
|
53
|
|
|
|
|
87
|
$col->[1] = 1 - $col->[1]; |
905
|
53
|
|
|
|
|
180
|
$col->[2] = 1 - $col->[2]; |
906
|
|
|
|
|
|
|
} else { |
907
|
317
|
|
|
|
|
473
|
$col = 1 - $col; |
908
|
|
|
|
|
|
|
} |
909
|
|
|
|
|
|
|
} |
910
|
370
|
100
|
100
|
|
|
1218
|
$o->{locolor} = $col if ($o->{use_line} and $o->{locolor} < 0); |
911
|
370
|
100
|
100
|
|
|
1273
|
$o->{pocolor} = $col if ($o->{use_point} and $o->{pocolor} < 0); |
912
|
370
|
100
|
100
|
|
|
4475
|
$o->{bocolor} = $col if ($o->{use_bar} and $o->{bocolor} < 0); |
913
|
|
|
|
|
|
|
} |
914
|
|
|
|
|
|
|
|
915
|
|
|
|
|
|
|
=head3 background( grey | arrayref [, same] ) |
916
|
|
|
|
|
|
|
|
917
|
|
|
|
|
|
|
The default outer colour setting (-1) is interpreted as 'use complement to graphpaper background'. Of course, it |
918
|
|
|
|
|
|
|
is not possible to bind that until the graphpaper object exists. Calling this function sets all outer colour |
919
|
|
|
|
|
|
|
values to be a complement of the colour given, unless C is set to non-zero. If not given, C takes on |
920
|
|
|
|
|
|
|
the value given to the constuctor or 0 by default. |
921
|
|
|
|
|
|
|
|
922
|
|
|
|
|
|
|
=cut |
923
|
|
|
|
|
|
|
|
924
|
|
|
|
|
|
|
sub sequence { |
925
|
0
|
|
|
0
|
1
|
0
|
shift()->{seq}; |
926
|
|
|
|
|
|
|
} |
927
|
|
|
|
|
|
|
|
928
|
|
|
|
|
|
|
sub id { |
929
|
4
|
|
|
4
|
0
|
39
|
my $o = shift; |
930
|
4
|
50
|
|
|
|
31
|
my $seqid = $o->{seq} ? $o->{seq}->id() : ""; |
931
|
4
|
50
|
|
|
|
11
|
my $ownid = $o->{id} ? $o->{id} : ""; |
932
|
4
|
50
|
|
|
|
12
|
my $label = $o->{label} ? " ($o->{label})" : ''; |
933
|
4
|
50
|
|
|
|
10
|
my $line = $o->{use_line} ? 'L' : '-'; |
934
|
4
|
50
|
|
|
|
12
|
my $point = $o->{use_point} ? 'P' : '-'; |
935
|
4
|
50
|
|
|
|
10
|
my $bar = $o->{use_bar} ? 'B' : '-'; |
936
|
4
|
|
|
|
|
17
|
return "$seqid.$ownid$label $line$point$bar"; |
937
|
|
|
|
|
|
|
} |
938
|
|
|
|
|
|
|
|
939
|
|
|
|
|
|
|
sub bgnd_outline { |
940
|
0
|
|
|
0
|
1
|
0
|
shift()->{same}; |
941
|
|
|
|
|
|
|
} |
942
|
|
|
|
|
|
|
|
943
|
|
|
|
|
|
|
sub color { |
944
|
0
|
|
|
0
|
1
|
0
|
shift()->{color}; |
945
|
|
|
|
|
|
|
} |
946
|
|
|
|
|
|
|
|
947
|
|
|
|
|
|
|
sub line_outer_color { |
948
|
0
|
|
|
0
|
0
|
0
|
shift()->{locolor}; |
949
|
|
|
|
|
|
|
} |
950
|
|
|
|
|
|
|
|
951
|
|
|
|
|
|
|
sub line_outer_width { |
952
|
16
|
|
|
16
|
0
|
48
|
shift()->{lowidth}; |
953
|
|
|
|
|
|
|
} |
954
|
|
|
|
|
|
|
|
955
|
|
|
|
|
|
|
sub line_outer_dashes { |
956
|
0
|
|
|
0
|
0
|
0
|
shift()->{lostyle}; |
957
|
|
|
|
|
|
|
} |
958
|
|
|
|
|
|
|
|
959
|
|
|
|
|
|
|
sub line_inner_color { |
960
|
0
|
|
|
0
|
0
|
0
|
shift()->{licolor}; |
961
|
|
|
|
|
|
|
} |
962
|
|
|
|
|
|
|
|
963
|
|
|
|
|
|
|
sub line_inner_width { |
964
|
0
|
|
|
0
|
0
|
0
|
shift()->{liwidth}; |
965
|
|
|
|
|
|
|
} |
966
|
|
|
|
|
|
|
|
967
|
|
|
|
|
|
|
sub line_inner_dashes { |
968
|
0
|
|
|
0
|
0
|
0
|
shift()->{listyle}; |
969
|
|
|
|
|
|
|
} |
970
|
|
|
|
|
|
|
|
971
|
|
|
|
|
|
|
sub bar_outer_color { |
972
|
0
|
|
|
0
|
0
|
0
|
shift()->{bocolor}; |
973
|
|
|
|
|
|
|
} |
974
|
|
|
|
|
|
|
|
975
|
|
|
|
|
|
|
sub bar_outer_width { |
976
|
354
|
|
|
354
|
0
|
1145
|
shift()->{bowidth}; |
977
|
|
|
|
|
|
|
} |
978
|
|
|
|
|
|
|
|
979
|
|
|
|
|
|
|
sub bar_inner_color { |
980
|
204
|
|
|
204
|
0
|
733
|
shift()->{bicolor}; |
981
|
|
|
|
|
|
|
} |
982
|
|
|
|
|
|
|
|
983
|
|
|
|
|
|
|
sub bar_inner_width { |
984
|
0
|
|
|
0
|
0
|
0
|
shift()->{biwidth}; |
985
|
|
|
|
|
|
|
} |
986
|
|
|
|
|
|
|
|
987
|
|
|
|
|
|
|
sub point_size { |
988
|
16
|
|
|
16
|
0
|
48
|
shift()->{ppsize}; |
989
|
|
|
|
|
|
|
} |
990
|
|
|
|
|
|
|
|
991
|
|
|
|
|
|
|
sub point_shape { |
992
|
0
|
|
|
0
|
0
|
0
|
shift()->{ppshape}; |
993
|
|
|
|
|
|
|
} |
994
|
|
|
|
|
|
|
|
995
|
|
|
|
|
|
|
sub point_outer_color { |
996
|
0
|
|
|
0
|
0
|
0
|
shift()->{pocolor}; |
997
|
|
|
|
|
|
|
} |
998
|
|
|
|
|
|
|
|
999
|
|
|
|
|
|
|
sub point_outer_width { |
1000
|
0
|
|
|
0
|
0
|
0
|
shift()->{powidth}; |
1001
|
|
|
|
|
|
|
} |
1002
|
|
|
|
|
|
|
|
1003
|
|
|
|
|
|
|
sub point_inner_color { |
1004
|
0
|
|
|
0
|
0
|
0
|
shift()->{picolor}; |
1005
|
|
|
|
|
|
|
} |
1006
|
|
|
|
|
|
|
sub point_inner_width { |
1007
|
0
|
|
|
0
|
0
|
0
|
shift()->{piwidth}; |
1008
|
|
|
|
|
|
|
} |
1009
|
|
|
|
|
|
|
|
1010
|
|
|
|
|
|
|
sub use_line { |
1011
|
0
|
|
|
0
|
1
|
0
|
return shift()->{use_line}; |
1012
|
|
|
|
|
|
|
} |
1013
|
|
|
|
|
|
|
|
1014
|
|
|
|
|
|
|
=head2 use_line |
1015
|
|
|
|
|
|
|
|
1016
|
|
|
|
|
|
|
Return 1 if line settings are used. |
1017
|
|
|
|
|
|
|
|
1018
|
|
|
|
|
|
|
=cut |
1019
|
|
|
|
|
|
|
|
1020
|
|
|
|
|
|
|
sub use_point { |
1021
|
0
|
|
|
0
|
1
|
0
|
return shift()->{use_point}; |
1022
|
|
|
|
|
|
|
} |
1023
|
|
|
|
|
|
|
|
1024
|
|
|
|
|
|
|
=head2 use_point |
1025
|
|
|
|
|
|
|
|
1026
|
|
|
|
|
|
|
Return 1 if point settings are used. |
1027
|
|
|
|
|
|
|
|
1028
|
|
|
|
|
|
|
=cut |
1029
|
|
|
|
|
|
|
|
1030
|
|
|
|
|
|
|
sub use_bar { |
1031
|
0
|
|
|
0
|
1
|
0
|
return shift()->{use_bar}; |
1032
|
|
|
|
|
|
|
} |
1033
|
|
|
|
|
|
|
|
1034
|
|
|
|
|
|
|
=head2 use_bar |
1035
|
|
|
|
|
|
|
|
1036
|
|
|
|
|
|
|
Return 1 if bar settings are used. |
1037
|
|
|
|
|
|
|
|
1038
|
|
|
|
|
|
|
=cut |
1039
|
|
|
|
|
|
|
|
1040
|
|
|
|
|
|
|
=head1 POSTSCRIPT CODE |
1041
|
|
|
|
|
|
|
|
1042
|
|
|
|
|
|
|
=head2 PostScript variables |
1043
|
|
|
|
|
|
|
|
1044
|
|
|
|
|
|
|
These are set within the 'gstyledict' dictionary. All C<...color> variables are either a decimal or an array |
1045
|
|
|
|
|
|
|
holding red, green and blue values. They are best passed to L. |
1046
|
|
|
|
|
|
|
|
1047
|
|
|
|
|
|
|
PostScript Perl method |
1048
|
|
|
|
|
|
|
========== =========== |
1049
|
|
|
|
|
|
|
locolor line_outer_color |
1050
|
|
|
|
|
|
|
lowidth line_outer_width |
1051
|
|
|
|
|
|
|
lostyle line_outer_dashes |
1052
|
|
|
|
|
|
|
licolor line_inner_color |
1053
|
|
|
|
|
|
|
liwidth line_inner_width |
1054
|
|
|
|
|
|
|
listyle line_inner_dashes |
1055
|
|
|
|
|
|
|
|
1056
|
|
|
|
|
|
|
ppshape point_shape |
1057
|
|
|
|
|
|
|
ppsize point_size |
1058
|
|
|
|
|
|
|
pocolor point_outer_color |
1059
|
|
|
|
|
|
|
powidth point_outer_width |
1060
|
|
|
|
|
|
|
picolor point_inner_color |
1061
|
|
|
|
|
|
|
piwidth point_inner_width |
1062
|
|
|
|
|
|
|
|
1063
|
|
|
|
|
|
|
bocolor bar_outer_color |
1064
|
|
|
|
|
|
|
bowidth bar_outer_width |
1065
|
|
|
|
|
|
|
bicolor bar_inner_color |
1066
|
|
|
|
|
|
|
biwidth bar_inner_width |
1067
|
|
|
|
|
|
|
|
1068
|
|
|
|
|
|
|
=head2 Setting Styles |
1069
|
|
|
|
|
|
|
|
1070
|
|
|
|
|
|
|
Once B has been called to update the postscript variables, the graphic environment must be set to use them. |
1071
|
|
|
|
|
|
|
The GraphStyle resource provides a number of functions for this. |
1072
|
|
|
|
|
|
|
|
1073
|
|
|
|
|
|
|
=head3 line_inner |
1074
|
|
|
|
|
|
|
|
1075
|
|
|
|
|
|
|
Sets the colour, width and dash pattern for a line. |
1076
|
|
|
|
|
|
|
|
1077
|
|
|
|
|
|
|
=head3 line_outer |
1078
|
|
|
|
|
|
|
|
1079
|
|
|
|
|
|
|
Sets the colour, width and dash pattern for a line's edge. |
1080
|
|
|
|
|
|
|
|
1081
|
|
|
|
|
|
|
=head3 point_inner |
1082
|
|
|
|
|
|
|
|
1083
|
|
|
|
|
|
|
Sets the colour and width for a point. |
1084
|
|
|
|
|
|
|
|
1085
|
|
|
|
|
|
|
=head3 point_outer |
1086
|
|
|
|
|
|
|
|
1087
|
|
|
|
|
|
|
Sets the colour and width for a point's edge. |
1088
|
|
|
|
|
|
|
|
1089
|
|
|
|
|
|
|
=head3 bar_inner |
1090
|
|
|
|
|
|
|
|
1091
|
|
|
|
|
|
|
Sets the colour and width for a bar. |
1092
|
|
|
|
|
|
|
|
1093
|
|
|
|
|
|
|
=head3 bar_outer |
1094
|
|
|
|
|
|
|
|
1095
|
|
|
|
|
|
|
Sets the colour and width for a bar's edge. |
1096
|
|
|
|
|
|
|
|
1097
|
|
|
|
|
|
|
=head2 Drawing Functions |
1098
|
|
|
|
|
|
|
|
1099
|
|
|
|
|
|
|
The functions which draw the shapes all remove 'x y' from the stack. They use a variable 'ppsize' which should be |
1100
|
|
|
|
|
|
|
the total width of the shape, although the elongated shapes are 1.5 times this on the longer side. |
1101
|
|
|
|
|
|
|
|
1102
|
|
|
|
|
|
|
make_plus make_north |
1103
|
|
|
|
|
|
|
make_cross make_south |
1104
|
|
|
|
|
|
|
make_dot make_east |
1105
|
|
|
|
|
|
|
make_circle make_west |
1106
|
|
|
|
|
|
|
make_square |
1107
|
|
|
|
|
|
|
make_diamond |
1108
|
|
|
|
|
|
|
|
1109
|
|
|
|
|
|
|
=cut |
1110
|
|
|
|
|
|
|
|
1111
|
|
|
|
|
|
|
sub ps_functions { |
1112
|
384
|
|
|
384
|
1
|
512
|
my ($class, $ps) = @_; |
1113
|
|
|
|
|
|
|
|
1114
|
384
|
|
|
|
|
526
|
my $name = "GraphStyle"; |
1115
|
384
|
100
|
|
|
|
1334
|
$ps->add_function( $name, <has_function($name)); |
1116
|
|
|
|
|
|
|
/gstyledict 22 dict def |
1117
|
|
|
|
|
|
|
gstyledict begin |
1118
|
|
|
|
|
|
|
/ppdx 0 def |
1119
|
|
|
|
|
|
|
/ppdy 0 def |
1120
|
|
|
|
|
|
|
|
1121
|
|
|
|
|
|
|
% _ => _ |
1122
|
|
|
|
|
|
|
/line_outer { |
1123
|
|
|
|
|
|
|
gpaperdict begin gstyledict begin |
1124
|
|
|
|
|
|
|
locolor gpapercolor |
1125
|
|
|
|
|
|
|
lowidth setlinewidth |
1126
|
|
|
|
|
|
|
lostyle 0 setdash |
1127
|
|
|
|
|
|
|
2 setlinejoin |
1128
|
|
|
|
|
|
|
end end |
1129
|
|
|
|
|
|
|
} bind def |
1130
|
|
|
|
|
|
|
|
1131
|
|
|
|
|
|
|
% _ => _ |
1132
|
|
|
|
|
|
|
/line_inner { |
1133
|
|
|
|
|
|
|
gpaperdict begin gstyledict begin |
1134
|
|
|
|
|
|
|
licolor gpapercolor |
1135
|
|
|
|
|
|
|
liwidth setlinewidth |
1136
|
|
|
|
|
|
|
listyle 0 setdash |
1137
|
|
|
|
|
|
|
2 setlinejoin |
1138
|
|
|
|
|
|
|
end end |
1139
|
|
|
|
|
|
|
} bind def |
1140
|
|
|
|
|
|
|
|
1141
|
|
|
|
|
|
|
% _ => _ |
1142
|
|
|
|
|
|
|
/point_outer { |
1143
|
|
|
|
|
|
|
gpaperdict begin gstyledict begin |
1144
|
|
|
|
|
|
|
pocolor gpapercolor |
1145
|
|
|
|
|
|
|
powidth setlinewidth |
1146
|
|
|
|
|
|
|
[ ] 0 setdash |
1147
|
|
|
|
|
|
|
0 setlinejoin |
1148
|
|
|
|
|
|
|
end end |
1149
|
|
|
|
|
|
|
} bind def |
1150
|
|
|
|
|
|
|
|
1151
|
|
|
|
|
|
|
% _ => _ |
1152
|
|
|
|
|
|
|
/point_inner { |
1153
|
|
|
|
|
|
|
gpaperdict begin gstyledict begin |
1154
|
|
|
|
|
|
|
picolor gpapercolor |
1155
|
|
|
|
|
|
|
piwidth setlinewidth |
1156
|
|
|
|
|
|
|
[ ] 0 setdash |
1157
|
|
|
|
|
|
|
0 setlinejoin |
1158
|
|
|
|
|
|
|
end end |
1159
|
|
|
|
|
|
|
} bind def |
1160
|
|
|
|
|
|
|
|
1161
|
|
|
|
|
|
|
% _ => _ |
1162
|
|
|
|
|
|
|
/bar_outer { |
1163
|
|
|
|
|
|
|
gpaperdict begin gstyledict begin |
1164
|
|
|
|
|
|
|
bocolor gpapercolor |
1165
|
|
|
|
|
|
|
bowidth setlinewidth |
1166
|
|
|
|
|
|
|
[ ] 0 setdash |
1167
|
|
|
|
|
|
|
end end |
1168
|
|
|
|
|
|
|
} bind def |
1169
|
|
|
|
|
|
|
|
1170
|
|
|
|
|
|
|
% _ => _ |
1171
|
|
|
|
|
|
|
/bar_inner { |
1172
|
|
|
|
|
|
|
gpaperdict begin gstyledict begin |
1173
|
|
|
|
|
|
|
bicolor gpapercolor |
1174
|
|
|
|
|
|
|
biwidth setlinewidth |
1175
|
|
|
|
|
|
|
[ ] 0 setdash |
1176
|
|
|
|
|
|
|
end end |
1177
|
|
|
|
|
|
|
} bind def |
1178
|
|
|
|
|
|
|
|
1179
|
|
|
|
|
|
|
% _ x y => _ |
1180
|
|
|
|
|
|
|
/make_plus { |
1181
|
|
|
|
|
|
|
gpaperdict begin gstyledict begin |
1182
|
|
|
|
|
|
|
newpath |
1183
|
|
|
|
|
|
|
exch ppdx add exch ppdy add |
1184
|
|
|
|
|
|
|
moveto |
1185
|
|
|
|
|
|
|
/dx ppsize 0.5 mul def |
1186
|
|
|
|
|
|
|
/dy ppsize 0.5 mul def |
1187
|
|
|
|
|
|
|
1 -1 rmoveto |
1188
|
|
|
|
|
|
|
dx 0 rlineto |
1189
|
|
|
|
|
|
|
0 1 rlineto |
1190
|
|
|
|
|
|
|
dx neg 0 rlineto |
1191
|
|
|
|
|
|
|
0 dy rlineto |
1192
|
|
|
|
|
|
|
-1 0 rlineto |
1193
|
|
|
|
|
|
|
0 dy neg rlineto |
1194
|
|
|
|
|
|
|
dx neg 0 rlineto |
1195
|
|
|
|
|
|
|
0 -1 rlineto |
1196
|
|
|
|
|
|
|
dx 0 rlineto |
1197
|
|
|
|
|
|
|
0 dy neg rlineto |
1198
|
|
|
|
|
|
|
1 0 rlineto |
1199
|
|
|
|
|
|
|
0 dy rlineto |
1200
|
|
|
|
|
|
|
closepath |
1201
|
|
|
|
|
|
|
end end |
1202
|
|
|
|
|
|
|
} bind def |
1203
|
|
|
|
|
|
|
|
1204
|
|
|
|
|
|
|
% x y => _ |
1205
|
|
|
|
|
|
|
/make_cross { |
1206
|
|
|
|
|
|
|
gpaperdict begin gstyledict begin |
1207
|
|
|
|
|
|
|
newpath |
1208
|
|
|
|
|
|
|
exch ppdx add exch ppdy add |
1209
|
|
|
|
|
|
|
moveto |
1210
|
|
|
|
|
|
|
/dx ppsize 0.7071 mul def |
1211
|
|
|
|
|
|
|
/dy ppsize 0.7071 mul def |
1212
|
|
|
|
|
|
|
dx dy rlineto |
1213
|
|
|
|
|
|
|
dx neg dy neg rlineto |
1214
|
|
|
|
|
|
|
dx neg dy rlineto |
1215
|
|
|
|
|
|
|
dx dy neg rlineto |
1216
|
|
|
|
|
|
|
dx neg dy neg rlineto |
1217
|
|
|
|
|
|
|
dx dy rlineto |
1218
|
|
|
|
|
|
|
dx dy neg rlineto |
1219
|
|
|
|
|
|
|
dx neg dy rlineto |
1220
|
|
|
|
|
|
|
closepath |
1221
|
|
|
|
|
|
|
end end |
1222
|
|
|
|
|
|
|
} bind def |
1223
|
|
|
|
|
|
|
|
1224
|
|
|
|
|
|
|
% x y => _ |
1225
|
|
|
|
|
|
|
/make_dot { |
1226
|
|
|
|
|
|
|
gpaperdict begin gstyledict begin |
1227
|
|
|
|
|
|
|
newpath |
1228
|
|
|
|
|
|
|
exch ppdx add exch ppdy add |
1229
|
|
|
|
|
|
|
1 index ppsize 2 div add 1 index moveto |
1230
|
|
|
|
|
|
|
ppsize 2 div 0 360 arc |
1231
|
|
|
|
|
|
|
closepath |
1232
|
|
|
|
|
|
|
end end |
1233
|
|
|
|
|
|
|
} bind def |
1234
|
|
|
|
|
|
|
|
1235
|
|
|
|
|
|
|
% x y => _ |
1236
|
|
|
|
|
|
|
/make_circle { |
1237
|
|
|
|
|
|
|
gpaperdict begin gstyledict begin |
1238
|
|
|
|
|
|
|
newpath |
1239
|
|
|
|
|
|
|
exch ppdx add exch ppdy add |
1240
|
|
|
|
|
|
|
1 index ppsize 0.6 mul add 1 index moveto |
1241
|
|
|
|
|
|
|
2 copy ppsize 0.6 mul 0 360 arc |
1242
|
|
|
|
|
|
|
1 index ppsize 0.5 mul add 1 index moveto |
1243
|
|
|
|
|
|
|
ppsize 0.5 mul 0 360 arc |
1244
|
|
|
|
|
|
|
closepath |
1245
|
|
|
|
|
|
|
end end |
1246
|
|
|
|
|
|
|
} bind def |
1247
|
|
|
|
|
|
|
|
1248
|
|
|
|
|
|
|
% x y => _ |
1249
|
|
|
|
|
|
|
/make_square { |
1250
|
|
|
|
|
|
|
gpaperdict begin gstyledict begin |
1251
|
|
|
|
|
|
|
newpath |
1252
|
|
|
|
|
|
|
exch ppdx add exch ppdy add |
1253
|
|
|
|
|
|
|
ppsize 2 div add exch |
1254
|
|
|
|
|
|
|
ppsize 2 div add exch moveto |
1255
|
|
|
|
|
|
|
0 ppsize neg rlineto |
1256
|
|
|
|
|
|
|
ppsize neg 0 rlineto |
1257
|
|
|
|
|
|
|
0 ppsize rlineto |
1258
|
|
|
|
|
|
|
closepath |
1259
|
|
|
|
|
|
|
end end |
1260
|
|
|
|
|
|
|
} bind def |
1261
|
|
|
|
|
|
|
|
1262
|
|
|
|
|
|
|
% x y => _ |
1263
|
|
|
|
|
|
|
/make_diamond { |
1264
|
|
|
|
|
|
|
gpaperdict begin gstyledict begin |
1265
|
|
|
|
|
|
|
newpath |
1266
|
|
|
|
|
|
|
exch ppdx add exch ppdy add |
1267
|
|
|
|
|
|
|
/dx ppsize 0.5 mul def |
1268
|
|
|
|
|
|
|
/dy ppsize 0.75 mul def |
1269
|
|
|
|
|
|
|
dy add moveto |
1270
|
|
|
|
|
|
|
dx neg dy neg rlineto |
1271
|
|
|
|
|
|
|
dx dy neg rlineto |
1272
|
|
|
|
|
|
|
dx dy rlineto |
1273
|
|
|
|
|
|
|
closepath |
1274
|
|
|
|
|
|
|
end end |
1275
|
|
|
|
|
|
|
} bind def |
1276
|
|
|
|
|
|
|
|
1277
|
|
|
|
|
|
|
% x y => _ |
1278
|
|
|
|
|
|
|
/make_north { |
1279
|
|
|
|
|
|
|
gpaperdict begin gstyledict begin |
1280
|
|
|
|
|
|
|
newpath |
1281
|
|
|
|
|
|
|
exch ppdx add exch ppdy add |
1282
|
|
|
|
|
|
|
/dx ppsize 0.3333 mul def |
1283
|
|
|
|
|
|
|
/dy ppsize 0.5 mul def |
1284
|
|
|
|
|
|
|
exch dx add exch moveto |
1285
|
|
|
|
|
|
|
dx neg dy rlineto |
1286
|
|
|
|
|
|
|
dx neg dy neg rlineto |
1287
|
|
|
|
|
|
|
dx 2 div 0 rlineto |
1288
|
|
|
|
|
|
|
0 dy neg rlineto |
1289
|
|
|
|
|
|
|
dx 0 rlineto |
1290
|
|
|
|
|
|
|
0 dy rlineto |
1291
|
|
|
|
|
|
|
closepath |
1292
|
|
|
|
|
|
|
end end |
1293
|
|
|
|
|
|
|
} bind def |
1294
|
|
|
|
|
|
|
|
1295
|
|
|
|
|
|
|
% x y => _ |
1296
|
|
|
|
|
|
|
/make_south { |
1297
|
|
|
|
|
|
|
gpaperdict begin gstyledict begin |
1298
|
|
|
|
|
|
|
newpath |
1299
|
|
|
|
|
|
|
exch ppdx add exch ppdy add |
1300
|
|
|
|
|
|
|
/dx ppsize 0.3333 mul def |
1301
|
|
|
|
|
|
|
/dy ppsize 0.5 mul def |
1302
|
|
|
|
|
|
|
exch dx sub exch moveto |
1303
|
|
|
|
|
|
|
dx dy neg rlineto |
1304
|
|
|
|
|
|
|
dx dy rlineto |
1305
|
|
|
|
|
|
|
dx neg 2 div 0 rlineto |
1306
|
|
|
|
|
|
|
0 dy rlineto |
1307
|
|
|
|
|
|
|
dx neg 0 rlineto |
1308
|
|
|
|
|
|
|
0 dy neg rlineto |
1309
|
|
|
|
|
|
|
closepath |
1310
|
|
|
|
|
|
|
end end |
1311
|
|
|
|
|
|
|
} bind def |
1312
|
|
|
|
|
|
|
|
1313
|
|
|
|
|
|
|
% x y => _ |
1314
|
|
|
|
|
|
|
/make_east { |
1315
|
|
|
|
|
|
|
gpaperdict begin gstyledict begin |
1316
|
|
|
|
|
|
|
newpath |
1317
|
|
|
|
|
|
|
exch ppdx add exch ppdy add |
1318
|
|
|
|
|
|
|
/dx ppsize 0.5 mul def |
1319
|
|
|
|
|
|
|
/dy ppsize 0.3333 mul def |
1320
|
|
|
|
|
|
|
dy add moveto |
1321
|
|
|
|
|
|
|
dx dy neg rlineto |
1322
|
|
|
|
|
|
|
dx neg dy neg rlineto |
1323
|
|
|
|
|
|
|
0 dy 2 div rlineto |
1324
|
|
|
|
|
|
|
dx neg 0 rlineto |
1325
|
|
|
|
|
|
|
0 dy rlineto |
1326
|
|
|
|
|
|
|
dx 0 rlineto |
1327
|
|
|
|
|
|
|
closepath |
1328
|
|
|
|
|
|
|
end end |
1329
|
|
|
|
|
|
|
} bind def |
1330
|
|
|
|
|
|
|
|
1331
|
|
|
|
|
|
|
% x y => _ |
1332
|
|
|
|
|
|
|
/make_west { |
1333
|
|
|
|
|
|
|
gpaperdict begin gstyledict begin |
1334
|
|
|
|
|
|
|
newpath |
1335
|
|
|
|
|
|
|
exch ppdx add exch ppdy add |
1336
|
|
|
|
|
|
|
/dx ppsize 0.5 mul def |
1337
|
|
|
|
|
|
|
/dy ppsize 0.3333 mul def |
1338
|
|
|
|
|
|
|
dy add moveto |
1339
|
|
|
|
|
|
|
dx neg dy neg rlineto |
1340
|
|
|
|
|
|
|
dx dy neg rlineto |
1341
|
|
|
|
|
|
|
0 dy 2 div rlineto |
1342
|
|
|
|
|
|
|
dx 0 rlineto |
1343
|
|
|
|
|
|
|
0 dy rlineto |
1344
|
|
|
|
|
|
|
dx neg 0 rlineto |
1345
|
|
|
|
|
|
|
closepath |
1346
|
|
|
|
|
|
|
end end |
1347
|
|
|
|
|
|
|
} bind def |
1348
|
|
|
|
|
|
|
|
1349
|
|
|
|
|
|
|
end |
1350
|
|
|
|
|
|
|
END_FUNCTIONS |
1351
|
|
|
|
|
|
|
} |
1352
|
|
|
|
|
|
|
|
1353
|
|
|
|
|
|
|
=head2 ps_functions |
1354
|
|
|
|
|
|
|
|
1355
|
|
|
|
|
|
|
This class function provides the PostScript dictionary C and code defining the specialist Style functions. |
1356
|
|
|
|
|
|
|
|
1357
|
|
|
|
|
|
|
=cut |
1358
|
|
|
|
|
|
|
|
1359
|
|
|
|
|
|
|
=head1 BUGS |
1360
|
|
|
|
|
|
|
|
1361
|
|
|
|
|
|
|
Please report any you find to the author. |
1362
|
|
|
|
|
|
|
|
1363
|
|
|
|
|
|
|
=head1 AUTHOR |
1364
|
|
|
|
|
|
|
|
1365
|
|
|
|
|
|
|
Chris Willmot, chris@willmot.org.uk |
1366
|
|
|
|
|
|
|
|
1367
|
|
|
|
|
|
|
=head1 SEE ALSO |
1368
|
|
|
|
|
|
|
|
1369
|
|
|
|
|
|
|
L, L and L for the other modules in this suite. |
1370
|
|
|
|
|
|
|
|
1371
|
|
|
|
|
|
|
L, L and L for modules that use this one. |
1372
|
|
|
|
|
|
|
|
1373
|
|
|
|
|
|
|
=cut |
1374
|
|
|
|
|
|
|
|
1375
|
|
|
|
|
|
|
1; |