ctioga2 0.0 → 0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Changelog +25 -1
- data/lib/ctioga2/commands/commands.rb +13 -2
- data/lib/ctioga2/commands/doc/doc.rb +13 -17
- data/lib/ctioga2/commands/doc/documentation-commands.rb +14 -1
- data/lib/ctioga2/commands/doc/help.rb +136 -25
- data/lib/ctioga2/commands/doc/html.rb +56 -4
- data/lib/ctioga2/commands/doc/introspection.rb +45 -9
- data/lib/ctioga2/commands/doc/man.rb +7 -5
- data/lib/ctioga2/commands/doc/markup.rb +39 -12
- data/lib/ctioga2/commands/doc/wordwrap.rb +70 -0
- data/lib/ctioga2/commands/general-commands.rb +7 -4
- data/lib/ctioga2/commands/general-types.rb +27 -12
- data/lib/ctioga2/commands/interpreter.rb +2 -2
- data/lib/ctioga2/commands/parsers/command-line.rb +9 -5
- data/lib/ctioga2/commands/parsers/file.rb +5 -3
- data/lib/ctioga2/commands/type.rb +10 -3
- data/lib/ctioga2/commands/variables.rb +2 -2
- data/lib/ctioga2/data/backends/backend.rb +17 -15
- data/lib/ctioga2/data/backends/backends.rb +2 -2
- data/lib/ctioga2/data/backends/backends/gnuplot.rb +20 -5
- data/lib/ctioga2/data/backends/backends/math.rb +2 -2
- data/lib/ctioga2/data/backends/backends/text.rb +112 -17
- data/lib/ctioga2/data/backends/description.rb +10 -11
- data/lib/ctioga2/data/datacolumn.rb +73 -14
- data/lib/ctioga2/data/dataset.rb +305 -9
- data/lib/ctioga2/data/filters.rb +49 -1
- data/lib/ctioga2/data/indexed-dtable.rb +137 -0
- data/lib/ctioga2/data/point.rb +98 -7
- data/lib/ctioga2/data/stack.rb +98 -21
- data/lib/ctioga2/graphics/coordinates.rb +19 -2
- data/lib/ctioga2/graphics/elements.rb +12 -2
- data/lib/ctioga2/graphics/elements/containers.rb +14 -2
- data/lib/ctioga2/graphics/elements/contour.rb +67 -0
- data/lib/ctioga2/graphics/elements/curve2d.rb +103 -42
- data/lib/ctioga2/graphics/elements/element.rb +12 -2
- data/lib/ctioga2/graphics/elements/gradient-region.rb +94 -0
- data/lib/ctioga2/graphics/elements/parametric2d.rb +172 -0
- data/lib/ctioga2/graphics/elements/primitive.rb +37 -21
- data/lib/ctioga2/graphics/elements/region.rb +143 -0
- data/lib/ctioga2/graphics/elements/subplot.rb +92 -32
- data/lib/ctioga2/graphics/elements/tangent.rb +99 -0
- data/lib/ctioga2/graphics/elements/xyz-map.rb +126 -0
- data/lib/ctioga2/graphics/generator.rb +91 -6
- data/lib/ctioga2/graphics/legends.rb +26 -21
- data/lib/ctioga2/graphics/legends/area.rb +8 -8
- data/lib/ctioga2/graphics/legends/items.rb +5 -5
- data/lib/ctioga2/graphics/legends/storage.rb +4 -2
- data/lib/ctioga2/graphics/root.rb +24 -2
- data/lib/ctioga2/graphics/styles.rb +8 -0
- data/lib/ctioga2/graphics/styles/axes.rb +49 -23
- data/lib/ctioga2/graphics/styles/base.rb +2 -2
- data/lib/ctioga2/graphics/styles/carrays.rb +9 -2
- data/lib/ctioga2/graphics/styles/colormap.rb +272 -0
- data/lib/ctioga2/graphics/styles/curve.rb +64 -4
- data/lib/ctioga2/graphics/styles/drawable.rb +68 -9
- data/lib/ctioga2/graphics/styles/errorbar.rb +73 -0
- data/lib/ctioga2/graphics/styles/factory.rb +133 -17
- data/lib/ctioga2/graphics/styles/gradients.rb +60 -0
- data/lib/ctioga2/graphics/styles/location.rb +64 -0
- data/lib/ctioga2/graphics/styles/map-axes.rb +164 -0
- data/lib/ctioga2/graphics/styles/plot.rb +165 -62
- data/lib/ctioga2/graphics/styles/sets.rb +14 -1
- data/lib/ctioga2/graphics/styles/texts.rb +44 -34
- data/lib/ctioga2/graphics/subplot-commands.rb +94 -6
- data/lib/ctioga2/graphics/types.rb +113 -35
- data/lib/ctioga2/graphics/types/bijection.rb +3 -3
- data/lib/ctioga2/graphics/types/boundaries.rb +120 -1
- data/lib/ctioga2/graphics/types/dimensions.rb +8 -1
- data/lib/ctioga2/graphics/types/grid.rb +196 -0
- data/lib/ctioga2/graphics/types/location.rb +228 -0
- data/lib/ctioga2/graphics/types/point.rb +2 -2
- data/lib/ctioga2/log.rb +18 -18
- data/lib/ctioga2/metabuilder/type.rb +15 -3
- data/lib/ctioga2/metabuilder/types.rb +2 -2
- data/lib/ctioga2/metabuilder/types/coordinates.rb +13 -1
- data/lib/ctioga2/metabuilder/types/data.rb +50 -0
- data/lib/ctioga2/metabuilder/types/generic.rb +60 -0
- data/lib/ctioga2/metabuilder/types/lists.rb +53 -16
- data/lib/ctioga2/metabuilder/types/styles.rb +26 -45
- data/lib/ctioga2/plotmaker.rb +91 -20
- data/lib/ctioga2/postprocess.rb +8 -8
- data/lib/ctioga2/utils.rb +23 -4
- metadata +107 -75
- data/lib/ctioga2/data/merge.rb +0 -43
@@ -0,0 +1,172 @@
|
|
1
|
+
# -*- coding: undecided -*-
|
2
|
+
# parametric2d.rb: a 2D curve whose parameters depend on Z values
|
3
|
+
# copyright (c) 2006, 2007, 2008, 2009, 2010 by Vincent Fourmond
|
4
|
+
|
5
|
+
# This program is free software; you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU General Public License as published by
|
7
|
+
# the Free Software Foundation; either version 2 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
|
10
|
+
# This program is distributed in the hope that it will be useful, but
|
11
|
+
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
13
|
+
# General Public License for more details (in the COPYING file).
|
14
|
+
|
15
|
+
require 'ctioga2/utils'
|
16
|
+
require 'ctioga2/log'
|
17
|
+
|
18
|
+
require 'Dobjects/Function'
|
19
|
+
|
20
|
+
|
21
|
+
module CTioga2
|
22
|
+
|
23
|
+
Version::register_svn_info('$Revision: 229 $', '$Date: 2011-01-17 17:34:57 +0100 (Mon, 17 Jan 2011) $')
|
24
|
+
|
25
|
+
module Graphics
|
26
|
+
|
27
|
+
module Elements
|
28
|
+
|
29
|
+
# This class represents a 3D (or more, to be seen later) dataset
|
30
|
+
# as markers with various parameters parametrized (color,
|
31
|
+
# transparency, marker scale, marker type (discrete), possibly
|
32
|
+
# stroke and fill colors ?
|
33
|
+
#
|
34
|
+
# @todo What would be interesting here would be to have indexed
|
35
|
+
# plots, ie draw one curve for each value of Z, with a color
|
36
|
+
# indexed by Z.
|
37
|
+
class Parametric2D < TiogaElement
|
38
|
+
|
39
|
+
include Log
|
40
|
+
include Dobjects
|
41
|
+
|
42
|
+
# The Data::Dataset object that should get plotted.
|
43
|
+
attr_accessor :dataset
|
44
|
+
|
45
|
+
# A Styles::CurveStyle object saying how the curve should be
|
46
|
+
# drawn.
|
47
|
+
#
|
48
|
+
# Some of the elements will be overridden.
|
49
|
+
attr_accessor :curve_style
|
50
|
+
|
51
|
+
# For convenience only: xy functions
|
52
|
+
attr_accessor :function
|
53
|
+
|
54
|
+
# A hash Z value -> corresponding XY functions.
|
55
|
+
attr_accessor :planes
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
undef :location=, :location
|
60
|
+
|
61
|
+
# Creates a new Curve2D object with the given _dataset_ and
|
62
|
+
# _style_.
|
63
|
+
def initialize(dataset, style = nil)
|
64
|
+
@dataset = dataset
|
65
|
+
@curve_style = style
|
66
|
+
prepare_data
|
67
|
+
end
|
68
|
+
|
69
|
+
# Prepares the internal storage of the data, from the @dataset
|
70
|
+
def prepare_data
|
71
|
+
@function = Function.new(@dataset.x.values.dup,
|
72
|
+
@dataset.y.values.dup)
|
73
|
+
|
74
|
+
## @todo this should eventually use Dataset::index_on_cols.
|
75
|
+
@planes = {}
|
76
|
+
@dataset.each_values do |i, x,y,*zs|
|
77
|
+
@planes[zs[0]] ||= Function.new(Dvector.new, Dvector.new)
|
78
|
+
@planes[zs[0]].x << x
|
79
|
+
@planes[zs[0]].y << y
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
protected :prepare_data
|
84
|
+
|
85
|
+
# Returns the LocationStyle object of the curve. Returns the
|
86
|
+
# one from #curve_style.
|
87
|
+
def location
|
88
|
+
return @curve_style.location
|
89
|
+
end
|
90
|
+
|
91
|
+
# Returns the Types::Boundaries of this curve.
|
92
|
+
def get_boundaries
|
93
|
+
return Types::Boundaries.bounds(@function.x, @function.y)
|
94
|
+
end
|
95
|
+
|
96
|
+
# Draws the markers, if applicable.
|
97
|
+
def draw_path(t)
|
98
|
+
min = @dataset.z.values.min
|
99
|
+
max = @dataset.z.values.max
|
100
|
+
if @curve_style.has_line?
|
101
|
+
# We use a default color map for the lines
|
102
|
+
@curve_style.color_map ||=
|
103
|
+
Styles::ColorMap.from_text("Red--Green")
|
104
|
+
cmap = @curve_style.color_map
|
105
|
+
|
106
|
+
for zs in @planes.keys.sort ## \todo have the sort
|
107
|
+
## direction configurable.
|
108
|
+
f = @planes[zs]
|
109
|
+
color = cmap.z_color(zs, min, max)
|
110
|
+
t.context do
|
111
|
+
@curve_style.line.set_stroke_style(t)
|
112
|
+
t.stroke_color = color
|
113
|
+
t.show_polyline(f.x, f.y)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
|
120
|
+
# Draws the markers, if applicable.
|
121
|
+
def draw_markers(t)
|
122
|
+
min = @dataset.z.values.min
|
123
|
+
max = @dataset.z.values.max
|
124
|
+
if @curve_style.has_marker?
|
125
|
+
# We use a default color map for the markers
|
126
|
+
@curve_style.marker_color_map ||=
|
127
|
+
Styles::ColorMap.from_text("Red--Green")
|
128
|
+
cmap = @curve_style.marker_color_map
|
129
|
+
for zs in @planes.keys.sort ## \todo have the sort
|
130
|
+
## direction configurable.
|
131
|
+
f = @planes[zs]
|
132
|
+
color = cmap.z_color(zs, min, max)
|
133
|
+
@curve_style.marker.draw_markers_at(t, f.x, f.y,
|
134
|
+
{ 'color' => color})
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
## Actually draws the curve
|
140
|
+
def real_do(t)
|
141
|
+
debug { "Plotting curve #{inspect}" }
|
142
|
+
t.context do
|
143
|
+
## \todo allow customization of the order of drawing,
|
144
|
+
## using a simple user-specificable array of path,
|
145
|
+
## markers... and use the corresponding #draw_path or
|
146
|
+
## #draw_markers... Ideally, any string could be used, and
|
147
|
+
## warnings should be issued on missing symbols.
|
148
|
+
|
149
|
+
# draw_fill(t)
|
150
|
+
# draw_errorbars(t)
|
151
|
+
draw_path(t)
|
152
|
+
draw_markers(t)
|
153
|
+
|
154
|
+
if @curve_style.zaxis
|
155
|
+
begin
|
156
|
+
@parent.style.get_axis_style(@curve_style.zaxis).
|
157
|
+
set_color_map(@curve_style.marker_color_map,
|
158
|
+
@dataset.z.values.min,
|
159
|
+
@dataset.z.values.max)
|
160
|
+
rescue
|
161
|
+
error { "Could not set Z info to non-existent axis #{@curve_style.zaxis}" }
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
# draw_error_bars(t) ??
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
@@ -21,7 +21,7 @@ require 'shellwords'
|
|
21
21
|
# This module contains all the classes used by ctioga
|
22
22
|
module CTioga2
|
23
23
|
|
24
|
-
Version::register_svn_info('$Revision:
|
24
|
+
Version::register_svn_info('$Revision: 151 $', '$Date: 2010-06-19 23:45:20 +0200 (Sat, 19 Jun 2010) $')
|
25
25
|
|
26
26
|
module Graphics
|
27
27
|
|
@@ -54,6 +54,7 @@ module CTioga2
|
|
54
54
|
@optional_arguments = opts
|
55
55
|
@funcall = code
|
56
56
|
end
|
57
|
+
|
57
58
|
end
|
58
59
|
|
59
60
|
# A TiogaPrimitive object describing the current primitive
|
@@ -65,6 +66,9 @@ module CTioga2
|
|
65
66
|
# A hash containing the values of the optional arguments
|
66
67
|
attr_accessor :options
|
67
68
|
|
69
|
+
# The last curve's style...
|
70
|
+
attr_accessor :last_curve_style
|
71
|
+
|
68
72
|
|
69
73
|
# Creates a new TiogaPrimitiveCall object.
|
70
74
|
def initialize(primitive, arguments, options)
|
@@ -103,6 +107,7 @@ module CTioga2
|
|
103
107
|
call = Elements::
|
104
108
|
TiogaPrimitiveCall.new(primitive,
|
105
109
|
rest, options)
|
110
|
+
call.last_curve_style = plotmaker.curve_style_stack.last
|
106
111
|
plotmaker.root_object.current_plot.
|
107
112
|
add_element(call)
|
108
113
|
end
|
@@ -128,16 +133,21 @@ module CTioga2
|
|
128
133
|
'angle' => 'float',
|
129
134
|
'justification' => 'justification',
|
130
135
|
'alignment' => 'alignment',
|
136
|
+
'font' => 'latex-font',
|
131
137
|
}
|
132
138
|
) do |t, point, string, options|
|
133
|
-
#
|
139
|
+
# @todo add a way to specify fonts ???
|
134
140
|
options ||= {}
|
141
|
+
if options['font']
|
142
|
+
string = options['font'].fontify(string)
|
143
|
+
options.delete('font')
|
144
|
+
end
|
135
145
|
options['text'] = string
|
136
146
|
options['at'] = point.to_figure_xy(t)
|
137
147
|
t.show_text(options)
|
138
148
|
end
|
139
149
|
|
140
|
-
#
|
150
|
+
# @todo add rendering mode !!
|
141
151
|
MarkerOptions = {
|
142
152
|
'color' => 'color',
|
143
153
|
'stroke_color' => 'color',
|
@@ -152,7 +162,7 @@ module CTioga2
|
|
152
162
|
|
153
163
|
primitive("marker", "marker", [ 'point', 'marker' ],
|
154
164
|
MarkerOptions) do |t, point, marker, options|
|
155
|
-
|
165
|
+
## \todo add a way to specify fonts ???
|
156
166
|
options ||= {}
|
157
167
|
options['marker'] = marker
|
158
168
|
options['at'] = point.to_figure_xy(t)
|
@@ -162,26 +172,30 @@ module CTioga2
|
|
162
172
|
primitive("string-marker", "marker", [ 'point', 'text' ],
|
163
173
|
{'font' => 'pdf-font' }.update(MarkerOptions)
|
164
174
|
) do |t, point, string, options|
|
165
|
-
|
175
|
+
## \todo add a way to specify fonts ???
|
166
176
|
options ||= {}
|
167
177
|
options['text'] = string
|
168
178
|
options['at'] = point.to_figure_xy(t)
|
169
179
|
t.show_marker(options)
|
170
180
|
end
|
171
181
|
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
182
|
+
# options for arrows (and therefore tangents)
|
183
|
+
ArrowOptions = {
|
184
|
+
'color' => 'color',
|
185
|
+
'head_scale' => 'float',
|
186
|
+
'head_marker' => 'marker',
|
187
|
+
'head_color' => 'color',
|
188
|
+
'tail_scale' => 'float',
|
189
|
+
'tail_marker' => 'marker',
|
190
|
+
'tail_color' => 'color',
|
191
|
+
'line_width' => 'float',
|
192
|
+
'line_style' => 'line-style',
|
193
|
+
}
|
194
|
+
|
195
|
+
primitive("arrow", "arrow", [ 'point', 'point' ],
|
196
|
+
ArrowOptions) do |t, tail,head, options|
|
197
|
+
## \todo a scale or marker_scale option that sets the scale
|
198
|
+
## of both head and tail
|
185
199
|
options ||= {}
|
186
200
|
options['head'] = head.to_figure_xy(t)
|
187
201
|
options['tail'] = tail.to_figure_xy(t)
|
@@ -210,6 +224,9 @@ module CTioga2
|
|
210
224
|
# Draws the primitive
|
211
225
|
def real_do(t)
|
212
226
|
args = @arguments + [@options]
|
227
|
+
## @todo this is a really ugly hack for passing
|
228
|
+
## last_curve_style around
|
229
|
+
$last_curve_style = @last_curve_style
|
213
230
|
primitive.funcall.call(t, *args)
|
214
231
|
end
|
215
232
|
|
@@ -219,7 +236,6 @@ A ctioga 1 --draw specification.
|
|
219
236
|
EOD
|
220
237
|
|
221
238
|
|
222
|
-
|
223
239
|
# An emulation of the old ctioga behavior
|
224
240
|
CmdDraw = Cmd.new('draw', nil, '--draw',
|
225
241
|
[CmdArg.new('drawing-spec')]) do |plotmaker, spec|
|
@@ -235,12 +251,12 @@ EOD
|
|
235
251
|
if a =~ /^\s*([^=]+)=(.*)/
|
236
252
|
opts[$1] = $2
|
237
253
|
else
|
238
|
-
plotmaker.error "Argument found where a option= was expected: #{a}"
|
254
|
+
plotmaker.error { "Argument found where a option= was expected: #{a}" }
|
239
255
|
end
|
240
256
|
end
|
241
257
|
plotmaker.interpreter.run_command(cmd, comp, opts)
|
242
258
|
else
|
243
|
-
plotmaker.error "Unkown graphics primitive: #{name}"
|
259
|
+
plotmaker.error { "Unkown graphics primitive: #{name}" }
|
244
260
|
end
|
245
261
|
end
|
246
262
|
|
@@ -0,0 +1,143 @@
|
|
1
|
+
# region.rb: draw curves-delimited fills
|
2
|
+
# copyright (c) 2010 by Vincent Fourmond
|
3
|
+
|
4
|
+
# This program is free software; you can redistribute it and/or modify
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
6
|
+
# the Free Software Foundation; either version 2 of the License, or
|
7
|
+
# (at your option) any later version.
|
8
|
+
|
9
|
+
# This program 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 General Public License for more details (in the COPYING file).
|
13
|
+
|
14
|
+
|
15
|
+
require 'ctioga2/utils'
|
16
|
+
require 'ctioga2/log'
|
17
|
+
|
18
|
+
module CTioga2
|
19
|
+
|
20
|
+
Version::register_svn_info('$Revision: 139 $', '$Date: 2010-01-22 00:12:17 +0100 (Fri, 22 Jan 2010) $')
|
21
|
+
|
22
|
+
module Graphics
|
23
|
+
|
24
|
+
module Elements
|
25
|
+
|
26
|
+
# A Region is an object that draws filled regions among its
|
27
|
+
# "elements". It is a fake container in the sense that all the
|
28
|
+
# elements are actually forwarded to the parent.
|
29
|
+
class Region < Container
|
30
|
+
|
31
|
+
undef :elements
|
32
|
+
undef :subframe
|
33
|
+
|
34
|
+
# The curves which delimit the region
|
35
|
+
attr_accessor :curves
|
36
|
+
|
37
|
+
# The fill style
|
38
|
+
attr_accessor :fill_style
|
39
|
+
|
40
|
+
# The fill style for reversed polarity
|
41
|
+
attr_accessor :reversed_fill_style
|
42
|
+
|
43
|
+
# Creates a new empty region
|
44
|
+
def initialize(parent = nil, root = nil)
|
45
|
+
@parent = parent
|
46
|
+
|
47
|
+
# elements to be given to tioga
|
48
|
+
@curves = []
|
49
|
+
|
50
|
+
@root_object = root
|
51
|
+
|
52
|
+
@legend_area = nil
|
53
|
+
|
54
|
+
@fill_style = Styles::FillStyle.new
|
55
|
+
@fill_style.color = [0.7,0.7,0.7]
|
56
|
+
|
57
|
+
# For reversed polarity
|
58
|
+
@reversed_fill_style = Styles::FillStyle.new
|
59
|
+
end
|
60
|
+
|
61
|
+
# Adds an element. Actually forwards it to the parent.
|
62
|
+
def add_element(element)
|
63
|
+
parent.add_element(element)
|
64
|
+
if element.respond_to?(:curve_style) &&
|
65
|
+
element.curve_style.region_position
|
66
|
+
@curves << element
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# Sets the various things from hash.
|
71
|
+
def set_from_hash(hash)
|
72
|
+
@fill_style.set_from_hash(hash)
|
73
|
+
# Reversed isn't what I want...
|
74
|
+
@reversed_fill_style.set_from_hash(hash, 'reversed_%s')
|
75
|
+
end
|
76
|
+
|
77
|
+
# Redirects to the parent's style
|
78
|
+
def style(*a)
|
79
|
+
return parent.style(*a)
|
80
|
+
end
|
81
|
+
|
82
|
+
protected
|
83
|
+
|
84
|
+
# Creates the appropriate subfigure and draws all its elements
|
85
|
+
# within.
|
86
|
+
#
|
87
|
+
# \todo: attempt to work fine while mixing curves with
|
88
|
+
# different axes. That won't be easy.
|
89
|
+
#
|
90
|
+
# \todo: enable to do positive and negative. The only thing to
|
91
|
+
# do is to swap above for below and call again.
|
92
|
+
def real_do(t)
|
93
|
+
# This function will be called with the proper figure
|
94
|
+
# coordinates.
|
95
|
+
|
96
|
+
if @fill_style.color
|
97
|
+
t.context do
|
98
|
+
@fill_style.setup_fill(t)
|
99
|
+
prepare_path(t)
|
100
|
+
@fill_style.do_fill(t)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
if @reversed_fill_style.color
|
105
|
+
t.context do
|
106
|
+
@reversed_fill_style.setup_fill(t)
|
107
|
+
prepare_path(t, :reversed)
|
108
|
+
@reversed_fill_style.do_fill(t)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
113
|
+
|
114
|
+
# Prepares the path that will be filled, according to the
|
115
|
+
# given polarity.
|
116
|
+
def prepare_path(t, polarity = :normal)
|
117
|
+
# We clip the path for the given
|
118
|
+
case polarity
|
119
|
+
when :normal
|
120
|
+
conversion = {
|
121
|
+
:above => :bottom,
|
122
|
+
:below => :top
|
123
|
+
}
|
124
|
+
when :reversed
|
125
|
+
conversion = {
|
126
|
+
:above => :top,
|
127
|
+
:below => :bottom
|
128
|
+
}
|
129
|
+
end
|
130
|
+
# We clip for the first ones...
|
131
|
+
for c in @curves[0..-2]
|
132
|
+
c.make_closed_path(t, conversion[c.curve_style.region_position])
|
133
|
+
t.clip
|
134
|
+
end
|
135
|
+
# We don't clip on the last one !
|
136
|
+
c = @curves.last
|
137
|
+
c.make_closed_path(t, conversion[c.curve_style.region_position])
|
138
|
+
end
|
139
|
+
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|