spiro 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +31 -0
- data/Rakefile +9 -0
- data/ext/spiro/_spiro.c +995 -0
- data/ext/spiro/_spiro.h +37 -0
- data/ext/spiro/bezctx.c +68 -0
- data/ext/spiro/bezctx.h +23 -0
- data/ext/spiro/bezctx_intf.h +23 -0
- data/ext/spiro/bezctx_rb.c +91 -0
- data/ext/spiro/bezctx_rb.h +32 -0
- data/ext/spiro/extconf.rb +6 -0
- data/ext/spiro/spiro.c +121 -0
- data/ext/spiro/spiroentrypoints.c +83 -0
- data/ext/spiro/spiroentrypoints.h +53 -0
- data/ext/spiro/zmisc.h +17 -0
- data/lib/spiro.rb +6 -0
- data/lib/spiro/version.rb +3 -0
- data/spiro.gemspec +27 -0
- data/test/test_spiro.rb +69 -0
- metadata +126 -0
@@ -0,0 +1,53 @@
|
|
1
|
+
#ifndef _SPIROENTRYPOINTS_H
|
2
|
+
# define _SPIROENTRYPOINTS_H
|
3
|
+
# include "bezctx_intf.h"
|
4
|
+
# include "_spiro.h"
|
5
|
+
|
6
|
+
/* Possible values of the "ty" field. */
|
7
|
+
#define SPIRO_CORNER 'v'
|
8
|
+
#define SPIRO_G4 'o'
|
9
|
+
#define SPIRO_G2 'c'
|
10
|
+
#define SPIRO_LEFT '['
|
11
|
+
#define SPIRO_RIGHT ']'
|
12
|
+
|
13
|
+
/* For a closed contour add an extra cp with a ty set to */
|
14
|
+
#define SPIRO_END 'z'
|
15
|
+
/* For an open contour the first cp must have a ty set to*/
|
16
|
+
#define SPIRO_OPEN_CONTOUR '{'
|
17
|
+
/* For an open contour the last cp must have a ty set to */
|
18
|
+
#define SPIRO_END_OPEN_CONTOUR '}'
|
19
|
+
|
20
|
+
/* These 2 functions are kept for backwards compatibility for older */
|
21
|
+
/* programs. Please use the functions listed afterwards that return */
|
22
|
+
/* success/failure replies when done. */
|
23
|
+
extern void TaggedSpiroCPsToBezier(spiro_cp *spiros,bezctx *bc);
|
24
|
+
extern void SpiroCPsToBezier(spiro_cp *spiros,int n,int isclosed,bezctx *bc);
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
/* These functions are available in libspiro-0.2.20130930 or higher */
|
29
|
+
|
30
|
+
/* The two functions below return 1 upon success and 0 upon failure */
|
31
|
+
|
32
|
+
/* The spiros array should indicate it's own end... So */
|
33
|
+
/* Open contours must have the ty field of the first cp set to '{' */
|
34
|
+
/* and have the ty field of the last cp set to '}' */
|
35
|
+
/* Closed contours must have an extra cp at the end whose ty is 'z' */
|
36
|
+
/* the x&y values of this extra cp are ignored */
|
37
|
+
extern int TaggedSpiroCPsToBezier0(spiro_cp *spiros,bezctx *bc);
|
38
|
+
|
39
|
+
/* The first argument is an array of spiro control points. */
|
40
|
+
/* Open contours do not need to start with '{', nor to end with '}' */
|
41
|
+
/* Close contours do not need to end with 'z' */
|
42
|
+
extern int SpiroCPsToBezier0(spiro_cp *spiros,int n,int isclosed,bezctx *bc);
|
43
|
+
|
44
|
+
|
45
|
+
|
46
|
+
/* These functions are available in libspiro-0.3.20150131 or higher */
|
47
|
+
|
48
|
+
/* If you can't use TaggedSpiroCPsToBezier0(), SpiroCPsToBezier0(), */
|
49
|
+
/* these functions are enhanced versions of the original functions, */
|
50
|
+
/* where spiro success/failure replies are passd back through *done */
|
51
|
+
extern void TaggedSpiroCPsToBezier1(spiro_cp *spiros,bezctx *bc,int *done);
|
52
|
+
extern void SpiroCPsToBezier1(spiro_cp *spiros,int n,int isclosed,bezctx *bc,int *done);
|
53
|
+
#endif
|
data/ext/spiro/zmisc.h
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#ifndef _ZMISC_H
|
2
|
+
# define _ZMISC_H
|
3
|
+
/**
|
4
|
+
* Misc portability and convenience macros.
|
5
|
+
**/
|
6
|
+
|
7
|
+
#include <stdlib.h>
|
8
|
+
|
9
|
+
#define zalloc malloc
|
10
|
+
#define zrealloc realloc
|
11
|
+
#define zfree free
|
12
|
+
|
13
|
+
#define znew(type, n) (type *)zalloc(sizeof(type) * (n))
|
14
|
+
#define zrenew(type, p, n) (type *)zrealloc((p), sizeof(type) * (n))
|
15
|
+
#endif
|
16
|
+
|
17
|
+
|
data/lib/spiro.rb
ADDED
data/spiro.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'spiro/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "spiro"
|
8
|
+
spec.version = Spiro::VERSION
|
9
|
+
spec.authors = ["Raph Levien", "George Williams", "Simon George"]
|
10
|
+
spec.email = ["simon@sfcgeorge.co.uk"]
|
11
|
+
spec.summary = %q{Ruby bindings for Spiro}
|
12
|
+
spec.description = %q{Bundle the C library.}
|
13
|
+
spec.homepage = ""
|
14
|
+
spec.license = "GNU GPL 3+"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
spec.extensions = "ext/spiro/extconf.rb"
|
21
|
+
|
22
|
+
|
23
|
+
spec.add_development_dependency "bundler", "~> 1.7"
|
24
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
25
|
+
spec.add_development_dependency "hoe-debugging", "~> 1.2"
|
26
|
+
spec.add_development_dependency "hoe", "~> 3.13"
|
27
|
+
end
|
data/test/test_spiro.rb
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'spiro'
|
3
|
+
|
4
|
+
class TestSpiro < Minitest::Test
|
5
|
+
def rand_n
|
6
|
+
[
|
7
|
+
Random.rand(-100..100),
|
8
|
+
Random.rand(-100..100),
|
9
|
+
[:node, :g2, :g4, :left, :right].sample
|
10
|
+
]
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_spiros_to_splines_raises_on_bad_input
|
14
|
+
assert_raises TypeError do
|
15
|
+
Spiro.spiros_to_splines(nil, true)
|
16
|
+
end
|
17
|
+
assert_raises TypeError do
|
18
|
+
Spiro.spiros_to_splines([1, 2, 3], true)
|
19
|
+
end
|
20
|
+
assert_raises TypeError do
|
21
|
+
Spiro.spiros_to_splines([[1, 2, 3]], true)
|
22
|
+
end
|
23
|
+
assert_raises ArgumentError do
|
24
|
+
Spiro.spiros_to_splines([[1, 2, :foo]], true)
|
25
|
+
end
|
26
|
+
assert_raises ArgumentError do
|
27
|
+
Spiro.spiros_to_splines([[1, 2, :node, 4]], true)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_spiros_to_splines_returns_array
|
32
|
+
splines = Spiro.spiros_to_splines(
|
33
|
+
[[0, 0, :node], [100, 50, :g2], [-50, 300, :node]],
|
34
|
+
true)
|
35
|
+
assert_kind_of Array, splines
|
36
|
+
end
|
37
|
+
|
38
|
+
#def test_spiros_to_splines_with_random_data_stress_test
|
39
|
+
## It will crash after a while, see below
|
40
|
+
#while true do
|
41
|
+
#path = Random.rand(5..50).times.map{rand_n}
|
42
|
+
#p path
|
43
|
+
#splines = Spiro.spiros_to_splines(path, true)
|
44
|
+
#assert_includes [Array, NilClass], splines.class
|
45
|
+
#end
|
46
|
+
#end
|
47
|
+
|
48
|
+
def test_this_one_crashes
|
49
|
+
# I sometimes get "pointer being freed was not allocated" but it takes a while.
|
50
|
+
# I thought it might be some nodes that Spiro doesn't like, but these are fine
|
51
|
+
# sometimes, it's only after running several times that it crashes.
|
52
|
+
# There must be a bad bit of memory management somewhere :-/
|
53
|
+
#
|
54
|
+
# Other times I get "Segmentation fault".
|
55
|
+
#
|
56
|
+
# It can crash very quickly, or it can take several seconds. So I'm guessing
|
57
|
+
# that there a piece of memory is being freed when it shouldn't somewhere,
|
58
|
+
# and it depends where that memory is whether it hurts anything. Not good.
|
59
|
+
#
|
60
|
+
# Anyway, I don't really know C and because all of the Ruby stacktrace
|
61
|
+
# thrown in I can't figure out if the problem is in my code or Spiro.
|
62
|
+
# Does anyone know C well enough to fix this?
|
63
|
+
path = [[-39, -57, :g2], [-59, 20, :right], [37, -14, :g2], [-67, -40, :g2], [-83, 20, :g2], [56, -87, :left], [-11, 86, :left], [11, 29, :left], [-87, 54, :left]]
|
64
|
+
while true do
|
65
|
+
splines = Spiro.spiros_to_splines(path, true)
|
66
|
+
assert_includes [Array, NilClass], splines.class
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
metadata
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: spiro
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Raph Levien
|
8
|
+
- George Williams
|
9
|
+
- Simon George
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2015-04-05 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: bundler
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
requirements:
|
19
|
+
- - "~>"
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '1.7'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - "~>"
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
version: '1.7'
|
29
|
+
- !ruby/object:Gem::Dependency
|
30
|
+
name: rake
|
31
|
+
requirement: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - "~>"
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '10.0'
|
36
|
+
type: :development
|
37
|
+
prerelease: false
|
38
|
+
version_requirements: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - "~>"
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '10.0'
|
43
|
+
- !ruby/object:Gem::Dependency
|
44
|
+
name: hoe-debugging
|
45
|
+
requirement: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '1.2'
|
50
|
+
type: :development
|
51
|
+
prerelease: false
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - "~>"
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '1.2'
|
57
|
+
- !ruby/object:Gem::Dependency
|
58
|
+
name: hoe
|
59
|
+
requirement: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - "~>"
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '3.13'
|
64
|
+
type: :development
|
65
|
+
prerelease: false
|
66
|
+
version_requirements: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - "~>"
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '3.13'
|
71
|
+
description: Bundle the C library.
|
72
|
+
email:
|
73
|
+
- simon@sfcgeorge.co.uk
|
74
|
+
executables: []
|
75
|
+
extensions:
|
76
|
+
- ext/spiro/extconf.rb
|
77
|
+
extra_rdoc_files: []
|
78
|
+
files:
|
79
|
+
- ".gitignore"
|
80
|
+
- Gemfile
|
81
|
+
- LICENSE.txt
|
82
|
+
- README.md
|
83
|
+
- Rakefile
|
84
|
+
- ext/spiro/_spiro.c
|
85
|
+
- ext/spiro/_spiro.h
|
86
|
+
- ext/spiro/bezctx.c
|
87
|
+
- ext/spiro/bezctx.h
|
88
|
+
- ext/spiro/bezctx_intf.h
|
89
|
+
- ext/spiro/bezctx_rb.c
|
90
|
+
- ext/spiro/bezctx_rb.h
|
91
|
+
- ext/spiro/extconf.rb
|
92
|
+
- ext/spiro/spiro.c
|
93
|
+
- ext/spiro/spiroentrypoints.c
|
94
|
+
- ext/spiro/spiroentrypoints.h
|
95
|
+
- ext/spiro/zmisc.h
|
96
|
+
- lib/spiro.rb
|
97
|
+
- lib/spiro/version.rb
|
98
|
+
- spiro.gemspec
|
99
|
+
- test/test_spiro.rb
|
100
|
+
homepage: ''
|
101
|
+
licenses:
|
102
|
+
- GNU GPL 3+
|
103
|
+
metadata: {}
|
104
|
+
post_install_message:
|
105
|
+
rdoc_options: []
|
106
|
+
require_paths:
|
107
|
+
- lib
|
108
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
109
|
+
requirements:
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '0'
|
113
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
requirements: []
|
119
|
+
rubyforge_project:
|
120
|
+
rubygems_version: 2.4.5
|
121
|
+
signing_key:
|
122
|
+
specification_version: 4
|
123
|
+
summary: Ruby bindings for Spiro
|
124
|
+
test_files:
|
125
|
+
- test/test_spiro.rb
|
126
|
+
has_rdoc:
|