xrvg 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES ADDED
@@ -0,0 +1,34 @@
1
+ = CHANGES
2
+ == => v 0.0.2
3
+ === Content
4
+ ==== New features
5
+ - bezier curve !!
6
+ ==== Refactoring
7
+ - replace Vector extension (which was incoherent as some methods were specific 2D) by new 2D class V2D
8
+ - Color no longer inherits from Vector
9
+ - optimize bezier point computation
10
+ - optimize sampling by using result "containers" (must be consolidated)
11
+ - simplify Bezier builders, by defining new builders and removing previous builder versatility
12
+ - refactor Style to be less SVG-mapped
13
+ ==== Bug fixing
14
+ - range examples correction, and added to unitary tests
15
+ - Range .complement correction
16
+ - Range split correction
17
+ === TODO
18
+ - unitary tests to be completed (generate them from doc ?)
19
+ - Shape Line and Circle interfaces must be completed to fill Curve abstract interface.
20
+ - mabe bezier tutorial
21
+
22
+
23
+ == => 0.0.1
24
+ === Content
25
+ - First delivery. Contains utilitary classes (utils, samplable, interpolation, attributable), render, color, style, shape.
26
+ - But no bezier yet.
27
+ - Rakefile nearly ready.
28
+ - Some unitary tests
29
+ === TODO for 0.0.2
30
+ - unitary tests to be completed (generate them from doc ?)
31
+ - Shape Line and Circle interfaces must be completed to fill Curve abstract interface.
32
+ - add bezier services, and make bezier documentation (both rdoc and tutorials)
33
+
34
+
data/README CHANGED
@@ -1,6 +1,6 @@
1
1
  = XRVG -- X Ruby Vector Graphics
2
2
 
3
- Supporting XRVG version: 0.0.1
3
+ Supporting XRVG version: 0.0.2
4
4
 
5
5
  This package contains XRVG, a Ruby vector graphic programming library.
6
6
 
@@ -35,7 +35,7 @@ XRVG comes with a Rakefile. To launch XRVG tests, simply go into XRVG install di
35
35
 
36
36
  === Road Map
37
37
 
38
- TO BE DEFINED
38
+ See CHANGES
39
39
 
40
40
  == Simple Example
41
41
 
data/Rakefile CHANGED
@@ -25,6 +25,7 @@ RUBYFORGE_USER = ENV["RUBYFORGE_USER"] || "jblondinet"
25
25
 
26
26
  # Directory on RubyForge where your website's files should be uploaded.
27
27
  WEBSITE_DIR = "www"
28
+ WEBSITE_DIR_IMAGES = "#{WEBSITE_DIR}/images"
28
29
 
29
30
  # Output directory for the rdoc html files.
30
31
  # If you don't have a custom homepage, and want to use the RDoc
@@ -45,13 +46,7 @@ $LOAD_PATH.concat(REQUIRE_PATHS)
45
46
  # This library file defines the RAKEVERSION constant.
46
47
  require "#{UNIX_NAME}"
47
48
  PROJECT_VERSION = eval("\"#{XRVG_VERSION}\"") # e.g. "1.0.2"
48
- #---
49
- # Clobber object files and Makefiles generated by extconf.rb.
50
- CLOBBER.include("#{EXT_DIR}/**/*.{so,dll,o}", "#{EXT_DIR}/**/Makefile")
51
- # Clobber .config generated by setup.rb.
52
- CLOBBER.include(".config")
53
49
 
54
- CLEAN.include("test/**/*.svg", "examples/**/*.svg")
55
50
  #---
56
51
  # Options common to RDocTask AND Gem::Specification.
57
52
  # The --main argument specifies which file appears on the index.html page
@@ -61,27 +56,33 @@ GENERAL_RDOC_OPTS = {
61
56
  }
62
57
 
63
58
  # Additional RDoc formatted files, besides the Ruby source files.
64
- RDOC_FILES = FileList["README"]
59
+ RDOC_FILES = FileList["README", "CHANGES"]
65
60
  # Remove the following line if you don't want to extract RDoc from
66
61
  # the extension C sources.
67
62
  # RDOC_FILES.include(EXT_SOURCES)
68
63
 
69
64
  # Ruby library code.
70
65
  LIB_DIR = "lib"
71
- PRE_LIB_FILES = FileList["assertion.rb", "attributable.rb", "color.rb", "frame.rb", "geometry2D.rb", "interpolation.rb", "render.rb", "samplation.rb", "shape.rb", "style.rb", "trace.rb", "utils.rb", "xrvg.rb"]
66
+ PRE_LIB_FILES = FileList["assertion.rb", "attributable.rb", "color.rb", "frame.rb", "geometry2D.rb", "interpolation.rb", "render.rb", "samplation.rb", "shape.rb", "style.rb", "trace.rb", "utils.rb", "bezier.rb", "bezierspline.rb", "xrvg.rb"]
72
67
  LIB_FILES = FileList["#{LIB_DIR}/*.rb"]
73
68
 
69
+ # Example code.
70
+ EXAMPLE_DIR = "examples"
71
+ EXAMPLE_FILES = FileList["#{EXAMPLE_DIR}/*.rb"]
72
+
74
73
  # Filelist with Test::Unit test cases.
75
- TEST_FILES = FileList["test/test_*.rb"]
74
+ TEST_DIR = "test"
75
+ PRE_TEST_FILES = FileList["test_bezier.rb", "test_attributable.rb", "test_color.rb", "test_frame.rb", "test_geometry2D.rb", "test_render.rb", "test_style.rb", "test_utils.rb", "test_shape.rb"]
76
+ TEST_FILES = FileList["test/*.rb"]
76
77
 
77
78
  # Executable scripts, all non-garbage files under bin/.
78
79
  BIN_FILES = FileList["bin/*"]
79
80
 
80
81
  # This filelist is used to create source packages.
81
82
  # Include all Ruby and RDoc files.
82
- DIST_FILES = FileList["./examples/*.rb"]
83
+ DIST_FILES = FileList["Rakefile", "LICENCE"]
83
84
  DIST_FILES.include(LIB_FILES)
84
- DIST_FILES.include("Rakefile", "LICENCE")
85
+ DIST_FILES.include(EXAMPLE_FILES)
85
86
  DIST_FILES.include(BIN_FILES)
86
87
  # DIST_FILES.include("data/**/*", "test/data/**/*")
87
88
  # DIST_FILES.include("#{WEBSITE_DIR}/**/*.{html,css}", "man/*.[0-9]")
@@ -97,11 +98,19 @@ DIST_FILES.exclude(/^(\.\/)?pkg(\/|$)/)
97
98
  # Run the tests if rake is invoked without arguments.
98
99
  task "default" => ["test"]
99
100
 
100
- test_task_name = HAVE_EXT ? "run-tests" : "test"
101
- Rake::TestTask.new(test_task_name) do |t|
101
+ Rake::TestTask.new("run-tests") do |t|
102
102
  t.test_files = TEST_FILES
103
103
  t.libs = REQUIRE_PATHS
104
104
  end
105
+
106
+ task "test" => ["lib"] do
107
+ remove_dir TEST_DIR
108
+ mkdir TEST_DIR
109
+ PRE_TEST_FILES.to_a.each {|fn| cp( fn, TEST_DIR ) }
110
+ Rake::Task["run-tests"].invoke
111
+ end
112
+
113
+
105
114
  #---
106
115
  # Set an environment variable with any configuration options you want to
107
116
  # be passed through to "setup.rb config".
@@ -124,6 +133,16 @@ if HAVE_EXT
124
133
  Rake::Task["run-tests"].invoke
125
134
  end
126
135
  end
136
+
137
+ #---
138
+ # Clobber object files and Makefiles generated by extconf.rb.
139
+ CLOBBER.include("#{EXT_DIR}/**/*.{so,dll,o}", "#{EXT_DIR}/**/Makefile")
140
+ # Clobber .config generated by setup.rb.
141
+ CLOBBER.include(".config")
142
+ CLOBBER.include("#{WEBSITE_DIR}/*.html", "#{WEBSITE_DIR}/images/*.png", "#{WEBSITE_DIR}/images", "#{WEBSITE_DIR}/example_list.rb")
143
+
144
+ CLEAN.include("test/**/*.svg", "#{WEBSITE_DIR}/*~", "#{WEBSITE_DIR}/example_list.rb", "#{EXAMPLE_DIR}/**/*.svg")
145
+
127
146
  #---
128
147
  # The "rdoc" task generates API documentation.
129
148
  Rake::RDocTask.new("rdoc") do |t|
@@ -155,17 +174,35 @@ end
155
174
 
156
175
  # Now we can generate the package-related tasks.
157
176
  Rake::GemPackageTask.new(GEM_SPEC) do |pkg|
158
- # pkg.need_zip = true
159
- # pkg.need_tar = true
177
+ pkg.need_zip = false
178
+ pkg.need_tar = false
160
179
  end
180
+
161
181
  #---
162
- desc "Upload website to RubyForge. " +
163
- "scp will prompt for your RubyForge password."
164
- task "publish-website" => ["rdoc"] do
165
- rubyforge_path = "/var/www/gforge-projects/#{UNIX_NAME}/"
166
- sh "scp -r #{WEBSITE_DIR}/* " +
167
- "#{RUBYFORGE_USER}@rubyforge.org:#{rubyforge_path}",
168
- :verbose => true
182
+ desc "Upload website to RubyForge with WinSCP"
183
+ task "upload-website" do
184
+ sh "winscp.exe /console /script=winscp_script.txt"
185
+ end
186
+
187
+ #---
188
+ desc "Regenerate website"
189
+ task "gen-website" do
190
+ Rake::Task["clobber"].invoke
191
+ Rake::Task["muse"].invoke
192
+ Rake::Task["examples"].invoke
193
+ Rake::Task["rdoc"].invoke
194
+ Rake::Task["finish"].invoke
195
+ end
196
+
197
+ #---
198
+ desc "Regenerate website and upload it to RubyForge"
199
+ task "publish-website" do
200
+ # rubyforge_path = "/var/www/gforge-projects/#{UNIX_NAME}/"
201
+ # sh "scp -r #{WEBSITE_DIR}/* " +
202
+ # "#{RUBYFORGE_USER}@rubyforge.org:#{rubyforge_path}",
203
+ # :verbose => true
204
+ Rake::Task["gen-website"].invoke
205
+ Rake::Task["upload-website"].invoke
169
206
  end
170
207
  #---
171
208
  task "rubyforge-setup" do
@@ -175,7 +212,7 @@ task "rubyforge-setup" do
175
212
  puts "to your RubyForge username and RubyForge password!"
176
213
  puts "Press ENTER to continue."
177
214
  $stdin.gets
178
- sh "rubyforge setup", :verbose => true
215
+ sh "ruby rubyforge setup", :verbose => true
179
216
  end
180
217
  end
181
218
 
@@ -198,10 +235,11 @@ task "publish-packages" => ["package", "rubyforge-login"] do
198
235
  "#{PROJECT_VERSION} #{UNIX_NAME}-#{PROJECT_VERSION}"
199
236
  cd "pkg" do
200
237
  sh(cmd + ".gem", :verbose => true)
201
- sh(cmd + ".tgz", :verbose => true)
202
- sh(cmd + ".zip", :verbose => true)
238
+ # sh(cmd + ".tgz", :verbose => true)
239
+ # sh(cmd + ".zip", :verbose => true)
203
240
  end
204
241
  end
242
+
205
243
  #---
206
244
  # The "lib" task copy selected files in PRE_LIB_FILES into LIB_DIR directory
207
245
  desc "Copy source files to create ./lib directory"
@@ -211,16 +249,62 @@ task "lib" do
211
249
  PRE_LIB_FILES.to_a.each {|fn| cp( fn, LIB_DIR ) }
212
250
  end
213
251
 
252
+ #---
253
+ # The "muse" task generates html documentation by using emacs
254
+ # It also generates a "example_list.txt" file, that must list every XRVG example used in the doc
255
+ # This list is used in "examples" task, to generate and copy example sources
256
+ desc "Copy example source files to create ./examples directory"
257
+ task "muse" do
258
+ sh "emacs -u \"\" g:/emacs/emacs/plans/xrvgwebsite.muse -l g:/emacs/emacs/perso/xrvg-publish-exe.el -kill", :verbose => true
259
+ end
260
+
261
+ #---
262
+ # The "finish" task removes some generated files
263
+ task "finish" do
264
+ FINISH_FILES = FileList["#{WEBSITE_DIR}/example_list.rb", "#{EXAMPLE_DIR}/**/*.svg" ]
265
+ FINISH_FILES.include( "#{WEBSITE_DIR}/*o" )
266
+ FINISH_FILES.each do |fn|
267
+ puts "try to remove #{fn}"
268
+ if File.exists? fn
269
+ rm_r fn
270
+ end
271
+ end
272
+ end
273
+
274
+ #---
275
+ # The "example" task copy selected example files into EXAMPLE_DIR directory
276
+ desc "Copy example source files to create ./examples directory"
277
+ task "examples" => ["muse"] do
278
+ remove_dir EXAMPLE_DIR
279
+ mkdir EXAMPLE_DIR
280
+ mkdir "#{WEBSITE_DIR}/images"
281
+ require 'www/example_list'
282
+ example_list.each do |fn|
283
+ source = fn
284
+ svg = String.new(fn)
285
+ svg["\.rb"] = ".svg"
286
+ png = String.new(fn)
287
+ png["\.rb"] = ".png"
288
+ cp( fn, EXAMPLE_DIR )
289
+ sh "ruby #{fn}"
290
+ if File.exist?(svg)
291
+ sh "ruby svg2png.rb #{svg} 2.0"
292
+ cp( png, WEBSITE_DIR_IMAGES )
293
+ end
294
+ end
295
+ end
296
+
214
297
  #---
215
298
  # The "prepare-release" task makes sure your tests run, and then generates
216
299
  # files for a new release.
217
300
  desc "Run tests, generate RDoc and create packages."
218
- task "prepare-release" => ["clobber"] do
301
+ task "prepare-release" do
219
302
  puts "Preparing release of #{PROJECT} version #{VERSION}"
303
+ Rake::Task["clobber"].invoke
220
304
  Rake::Task["lib"].invoke
221
305
  Rake::Task["test"].invoke
222
- Rake::Task["rdoc"].invoke
223
306
  Rake::Task["package"].invoke
307
+ Rake::Task["gen-website"].invoke
224
308
  end
225
309
 
226
310
  # The "publish" task is the overarching task for the whole project. It
@@ -258,6 +342,4 @@ end
258
342
  #---
259
343
 
260
344
  # TODO
261
- # - add task example checking
262
345
  # - add effective upload with winscp
263
- # - add xrvg tutorial documentation publishing (emacs process ?)
@@ -0,0 +1,7 @@
1
+ require 'xrvg'
2
+
3
+ render = SVGRender[ :filename, "bezierbasic.svg" ]
4
+ bezier = Bezier.raw( V2D[0.0, 1.0], V2D[1.0, 1.0], V2D[0.0, 0.0], V2D[1.0, 0.0] )
5
+ render.add( bezier, Style[ :stroke, "blue", :strokewidth, 0.1 ] )
6
+ bezier.gdebug( render )
7
+ render.end
@@ -0,0 +1,7 @@
1
+ require 'xrvg'
2
+
3
+ render = SVGRender[ :filename, "bezierbasicvector.svg" ]
4
+ bezier = Bezier.vector( V2D[0.0, 1.0], V2D[1.0, 0.0], V2D[1.0, 0.0], V2D[-1.0, 0.0] )
5
+ render.add( bezier, Style[ :stroke, "blue", :strokewidth, 0.1 ] )
6
+ bezier.gdebug( render )
7
+ render.end
data/examples/foreach.rb CHANGED
@@ -2,8 +2,8 @@ require 'xrvg'
2
2
 
3
3
  render = SVGRender[ :filename, "foreach.svg", :background, "white" ]
4
4
  Circle[].samples(10).foreach do |p1,p2|
5
+ render.add( Line[ :points, [p1,p2] ], Style[ :stroke, "black", :strokewidth, 0.1 ] )
5
6
  render.add( Circle[:center, p1, :radius, 0.1], Style[ :fill, Color.red ] )
6
7
  render.add( Circle[:center, p2, :radius, 0.2], Style[ :fill, Color.blue ] )
7
- render.add( Line[ :exts, [p1,p2] ] )
8
8
  end
9
9
  render.end
@@ -0,0 +1,8 @@
1
+ require 'xrvg'
2
+
3
+ render = SVGRender[ :filename, "geodash.svg" ]
4
+ bezier = Bezier.raw( V2D[0.0, 1.0], V2D[1.0, 1.0], V2D[0.0, 0.0], V2D[1.0, 0.0] )
5
+ bezier.geo(2.0).splits( 30 ).foreach do |drawn,dum|
6
+ render.add( drawn, Style[ :stroke, "blue", :strokewidth, 0.1 ] )
7
+ end
8
+ render.end
@@ -0,0 +1,8 @@
1
+ require 'xrvg'
2
+
3
+ render = SVGRender[ :filename, "geodash2.svg" ]
4
+ bezier = Bezier.raw( V2D[0.0, 1.0], V2D[1.0, 1.0], V2D[0.0, 0.0], V2D[1.0, 0.0] )
5
+ [bezier.geo(2.0).splits( 30 ), (0.1..0.0).samples(30)].forzip do |drawn,width,dum,dum|
6
+ render.add( drawn, Style[ :stroke, "blue", :strokewidth, width ] )
7
+ end
8
+ render.end
@@ -2,6 +2,6 @@ require 'xrvg'
2
2
 
3
3
  render = SVGRender[ :filename, "hellocrown.svg" ]
4
4
  Circle[].samples( 8 ) do |point|
5
- render.add( Circle[:center, point, :radius, 0.2 ], Style[ :fill, Color.black ] )
5
+ render.add( Circle[:center, point, :radius, 0.2 ], Style[ :fill, Color.blue ] )
6
6
  end
7
7
  render.end
@@ -2,6 +2,6 @@ require 'xrvg'
2
2
 
3
3
  render = SVGRender[ :filename, "hellocrown2.svg" ]
4
4
  [Circle[], (0.2..0.1)].samples( 10 ) do |point, radius|
5
- render.add( Circle[:center, point, :radius, radius ], Style[ :fill, Color.black( 0.5 ) ] )
5
+ render.add( Circle[:center, point, :radius, radius ], Style[ :fill, Color.blue( 0.5 ) ] )
6
6
  end
7
7
  render.end
@@ -3,7 +3,7 @@ require 'xrvg'
3
3
  render = SVGRender[ :filename, "hellocrownrecurse.svg" ]
4
4
  Circle[].samples( 8 ) do |point|
5
5
  Circle[:center, point, :radius, 0.2 ].samples( 8 ) do |point|
6
- render.add( Circle[:center, point, :radius, 0.05 ], Style[ :fill, Color.black ] )
6
+ render.add( Circle[:center, point, :radius, 0.05 ], Style[ :fill, Color.blue ] )
7
7
  end
8
8
  end
9
9
  render.end
@@ -0,0 +1,8 @@
1
+ require 'xrvg'
2
+
3
+ render = SVGRender[ :filename, "multibezierbasic.svg" ]
4
+ bezier = Bezier.multi( [[:vector, V2D[0.0, 1.0], V2D[1.0, 0.0], V2D[1.0, 0.0], V2D[-1.0, 0.0]],
5
+ [:vector, V2D[1.0, 0.0], V2D[1.0, 0.0], V2D[2.0, 1.0], V2D[-1.0, 0.0]]] )
6
+ render.add( bezier, Style[ :stroke, "blue", :strokewidth, 0.1 ] )
7
+ bezier.gdebug( render )
8
+ render.end
@@ -0,0 +1,8 @@
1
+ require 'xrvg'
2
+
3
+ render = SVGRender[ :filename, "randomdash.svg" ]
4
+ bezier = Bezier.raw( V2D[0.0, 1.0], V2D[1.0, 1.0], V2D[0.0, 0.0], V2D[1.0, 0.0] )
5
+ [bezier.ssort.random.splits( 30 ), (0.1..0.0).rand(30)].forzip do |drawn,width,dum,dum|
6
+ render.add( drawn, Style[ :stroke, "blue", :strokewidth, width ] )
7
+ end
8
+ render.end
@@ -0,0 +1,16 @@
1
+ require 'xrvg'
2
+
3
+ # Samplable module
4
+ (1.0..2.0).sample(0.5); #=> 1.5
5
+ (1.0..2.0).samples( 3 ); #=> [1.0, 1.5, 2.0]
6
+ (1.0..2.0).mean; #=> 1.5; equiv to sample(0.5)
7
+ (1.0..2.0).middle; #=> alias for previous
8
+ (1.0..2.0).rand; #=> random value in range
9
+ (1.0..2.0).rand( 2 ); #=> [rand1, rand2] in range
10
+ (1.0..2.0).complement(1.2); #=> 1.8
11
+ (1.0..2.0).abscissa(1.2); #=> 0.2; inverse of sample
12
+
13
+ # Splittable module
14
+ (1.0..2.0).split(0.2,0.3); #=> (1.2..1.3)
15
+ (1.0..2.0).splits( 2 ); #=> [(1.0..1.5),(1.5..2.0)]
16
+
@@ -0,0 +1,10 @@
1
+ require 'xrvg'
2
+
3
+ Range.O; #=> (0.0..1.0)
4
+ Range.Angle; #=> (0.0..2*Math::PI)
5
+ (1.0..2.0).reverse; #=> (2.0..1.0)
6
+ (1.0..2.0).sym; #=> (0.0..2.0)
7
+ (1.0..2.0).symend; #=> (1.0..3.0)
8
+ (1.0..2.0).size; #=> 1.0
9
+ (1.0..2.0).translate(0.3); #=> (1.3..2.3)
10
+
data/examples/sample.rb CHANGED
@@ -1,8 +1,10 @@
1
1
  require 'xrvg'
2
2
 
3
- render = SVGRender[ :filename, "palette_circle.svg", :background, "white" ]
3
+ render = SVGRender[ :filename, "sample.svg" ]
4
4
 
5
- palette = Palette[ :colorlist, [ Color.black, 0.0, Color.blue, 1.0 ] ]
5
+ palette = Palette[ :colorlist, [ Color.blue, 0.0, Color.orange, 0.25,
6
+ Color.yellow, 0.5, Color.green, 0.75,
7
+ Color.blue, 1.0 ] ]
6
8
  [Circle[], palette, (0.1..0.02).random()].samples(25) do |point, color, radius|
7
9
  render.add( Circle[ :center, point, :radius, radius ], Style[ :fill, color ])
8
10
  end
@@ -0,0 +1,8 @@
1
+ require 'xrvg'
2
+
3
+ render = SVGRender[ :filename, "simpledash.svg" ]
4
+ bezier = Bezier.raw( V2D[0.0, 1.0], V2D[1.0, 1.0], V2D[0.0, 0.0], V2D[1.0, 0.0] )
5
+ bezier.splits( 30 ).foreach do |drawn,dummy|
6
+ render.add( drawn, Style[ :stroke, "blue", :strokewidth, 0.1 ] )
7
+ end
8
+ render.end
data/examples/uplets.rb CHANGED
@@ -2,8 +2,8 @@ require 'xrvg'
2
2
 
3
3
  render = SVGRender[ :filename, "uplets.svg", :background, "white" ]
4
4
  Circle[].samples(10).uplets do |p1,p2|
5
+ render.add( Line[ :points, [p1,p2]], Style[ :stroke, "black", :strokewidth, 0.1 ] )
5
6
  render.add( Circle[:center, p1, :radius, 0.1], Style[ :fill, Color.red ] )
6
7
  render.add( Circle[:center, p2, :radius, 0.2], Style[ :fill, Color.blue ] )
7
- render.add( Line[ :exts, [p1,p2] ] )
8
8
  end
9
9
  render.end