aalib-ruby 0.7.1
Sign up to get free protection for your applications and to get access to all the features.
- data/COPYING +55 -0
- data/ChangeLog +4 -0
- data/GPL +340 -0
- data/INSTALL +7 -0
- data/README +62 -0
- data/Rakefile +76 -0
- data/example/hello_world.rb +36 -0
- data/example/save.rb +45 -0
- data/lib/aalib.rb +1088 -0
- data/setup.rb +1585 -0
- data/spec/aalib_context_spec.rb +95 -0
- data/spec/aalib_format_spec.rb +89 -0
- data/spec/aalib_save_spec.rb +34 -0
- data/spec/aalib_savedata_spec.rb +27 -0
- data/spec/aalib_spec.rb +168 -0
- data/spec/hello_world.txt +25 -0
- data/spec/scratch/test_save +25 -0
- data/spec/spec_helper.rb +23 -0
- metadata +77 -0
@@ -0,0 +1,95 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
|
+
|
3
|
+
Spec::Runner.configure do |config|
|
4
|
+
config.before :each do
|
5
|
+
@aa = AAlib.init(AAlib.memory_driver)
|
6
|
+
end
|
7
|
+
|
8
|
+
config.after :each do
|
9
|
+
@aa.close if @aa
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "AAlib::Context#mulx" do
|
14
|
+
it "returns the ratio of image and screen widths" do
|
15
|
+
@aa.mulx.should == @aa.imgwidth / @aa.scrwidth
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "AAlib::Context#muly" do
|
20
|
+
it "returns the ratio of image and screen heights" do
|
21
|
+
@aa.mulx.should == @aa.imgwidth / @aa.scrwidth
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "AAlib::Context#imgwidth" do
|
26
|
+
it "returns the width of the image buffer" do
|
27
|
+
hp = AAlib::HardwareParams.new
|
28
|
+
hp.width = 100
|
29
|
+
aa = AAlib.init(AAlib.memory_driver, hp)
|
30
|
+
begin
|
31
|
+
aa.imgwidth.should == 100 * aa.mulx
|
32
|
+
ensure
|
33
|
+
aa.close
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "AAlib::Context#imgheight" do
|
39
|
+
it "returns the width of the image buffer" do
|
40
|
+
hp = AAlib::HardwareParams.new
|
41
|
+
hp.height = 100
|
42
|
+
aa = AAlib.init(AAlib.memory_driver, hp)
|
43
|
+
begin
|
44
|
+
aa.imgheight.should == 100 * aa.muly
|
45
|
+
ensure
|
46
|
+
aa.close
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "AAlib::Context#render" do
|
52
|
+
it "raises TypeError with wrong render_params" do
|
53
|
+
lambda { @aa.render(Object.new) }.should raise_error(TypeError)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "AAlib::Context#putpixel" do
|
58
|
+
it "puts a pixel to the image buffer" do
|
59
|
+
50.times do
|
60
|
+
color = rand(256)
|
61
|
+
x = rand(@aa.imgwidth)
|
62
|
+
y = rand(@aa.imgheight)
|
63
|
+
@aa.putpixel(x, y, color)
|
64
|
+
@aa.image[y*@aa.imgwidth + x].should == color
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe "AAlib::Context#copy_image_from" do
|
70
|
+
before :each do
|
71
|
+
@aa1 = AAlib.init(AAlib.memory_driver)
|
72
|
+
@aa2 = AAlib.init(AAlib.memory_driver)
|
73
|
+
end
|
74
|
+
|
75
|
+
after :each do
|
76
|
+
@aa1.close
|
77
|
+
@aa2.close
|
78
|
+
end
|
79
|
+
|
80
|
+
it "copies the image buffer from another AAlib::Context" do
|
81
|
+
pixels = Hash.new
|
82
|
+
100.times do
|
83
|
+
x = rand(@aa2.imgwidth)
|
84
|
+
y = rand(@aa2.imgheight)
|
85
|
+
color = rand(256)
|
86
|
+
@aa2.putpixel(x, y, color)
|
87
|
+
pixels[[x,y]] = color
|
88
|
+
end
|
89
|
+
|
90
|
+
@aa1.copy_image_from(@aa2)
|
91
|
+
pixels.each do |xy, color|
|
92
|
+
@aa1.image[@aa1.imgwidth*xy[1] + xy[0]].should == color
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
|
+
require 'aalib'
|
3
|
+
|
4
|
+
describe "AAlib::SaveFormat.find" do
|
5
|
+
it "finds formats when given the full formatname" do
|
6
|
+
format = AAlib::SaveFormat.find("Text file")
|
7
|
+
format.should be_an_instance_of(AAlib::SaveFormat)
|
8
|
+
format.formatname.should == "Text file"
|
9
|
+
format.extension.should == ".txt"
|
10
|
+
|
11
|
+
format = AAlib::SaveFormat.find("Pure html")
|
12
|
+
format.should be_an_instance_of(AAlib::SaveFormat)
|
13
|
+
format.formatname.should == "Pure html"
|
14
|
+
format.extension.should == ".html"
|
15
|
+
|
16
|
+
## NOTE: the "seqences" typo are hard coded into AA-lib v 1.4
|
17
|
+
format = AAlib::SaveFormat.find("ANSI escape seqences")
|
18
|
+
format.should be_an_instance_of(AAlib::SaveFormat)
|
19
|
+
format.formatname.should == "ANSI escape seqences"
|
20
|
+
format.extension.should == ".ansi"
|
21
|
+
end
|
22
|
+
|
23
|
+
it "finds formats when given the partial formatname" do
|
24
|
+
format = AAlib::SaveFormat.find("Text")
|
25
|
+
format.should be_an_instance_of(AAlib::SaveFormat)
|
26
|
+
format.formatname.should == "Text file"
|
27
|
+
format.extension.should == ".txt"
|
28
|
+
|
29
|
+
format = AAlib::SaveFormat.find("html")
|
30
|
+
format.should be_an_instance_of(AAlib::SaveFormat)
|
31
|
+
format.formatname.should == "Pure html"
|
32
|
+
format.extension.should == ".html"
|
33
|
+
|
34
|
+
format = AAlib::SaveFormat.find("ANSI")
|
35
|
+
format.should be_an_instance_of(AAlib::SaveFormat)
|
36
|
+
format.formatname.should == "ANSI escape seqences"
|
37
|
+
format.extension.should == ".ansi"
|
38
|
+
end
|
39
|
+
|
40
|
+
it "finds formats ignoring case" do
|
41
|
+
format = AAlib::SaveFormat.find("tEXT")
|
42
|
+
format.should be_an_instance_of(AAlib::SaveFormat)
|
43
|
+
format.formatname.should == "Text file"
|
44
|
+
format.extension.should == ".txt"
|
45
|
+
|
46
|
+
format = AAlib::SaveFormat.find("HTML")
|
47
|
+
format.should be_an_instance_of(AAlib::SaveFormat)
|
48
|
+
format.formatname.should == "Pure html"
|
49
|
+
format.extension.should == ".html"
|
50
|
+
|
51
|
+
format = AAlib::SaveFormat.find("ansi")
|
52
|
+
format.should be_an_instance_of(AAlib::SaveFormat)
|
53
|
+
format.formatname.should == "ANSI escape seqences"
|
54
|
+
format.extension.should == ".ansi"
|
55
|
+
end
|
56
|
+
|
57
|
+
it "finds formats when given a Regexp" do
|
58
|
+
format = AAlib::SaveFormat.find(/text/i)
|
59
|
+
format.should be_an_instance_of(AAlib::SaveFormat)
|
60
|
+
format.formatname.should == "Text file"
|
61
|
+
format.extension.should == ".txt"
|
62
|
+
|
63
|
+
format = AAlib::SaveFormat.find(/HP.*big/)
|
64
|
+
format.should be_an_instance_of(AAlib::SaveFormat)
|
65
|
+
format.formatname.should == "HP laser jet - A4 big font"
|
66
|
+
format.extension.should == ".hp"
|
67
|
+
|
68
|
+
format = AAlib::SaveFormat.find(/IRC.*II/)
|
69
|
+
format.should be_an_instance_of(AAlib::SaveFormat)
|
70
|
+
format.formatname.should == "For catting to an IRC channel II"
|
71
|
+
format.extension.should == ".irc"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "AAlib::SaveFormat.formatname" do
|
76
|
+
it "returns the formatname" do
|
77
|
+
format = AAlib::SaveFormat.find("text")
|
78
|
+
format.should be_an_instance_of(AAlib::SaveFormat)
|
79
|
+
format.formatname.should == "Text file"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe "AAlib::SaveFormat.extension" do
|
84
|
+
it "returns the file extension including the dot" do
|
85
|
+
format = AAlib::SaveFormat.find("text")
|
86
|
+
format.should be_an_instance_of(AAlib::SaveFormat)
|
87
|
+
format.extension.should == ".txt"
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
|
+
require 'aalib'
|
3
|
+
|
4
|
+
describe "The save procedure" do
|
5
|
+
before :each do
|
6
|
+
@file = File.join(File.dirname(__FILE__), "scratch", "test_save")
|
7
|
+
end
|
8
|
+
|
9
|
+
after :each do
|
10
|
+
# File.delete(@file) if File.exists?(@file)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "saves a graphics context as text using the save driver" do
|
14
|
+
format = AAlib::SaveFormat.find("text")
|
15
|
+
data = AAlib::SaveData.new(@file, format)
|
16
|
+
|
17
|
+
hp = AAlib::HardwareParams.new
|
18
|
+
rp = AAlib::RenderParams.new
|
19
|
+
|
20
|
+
context = AAlib.init(AAlib.save_driver, hp, data)
|
21
|
+
draw_diagonal_gradient(context)
|
22
|
+
context.render(rp)
|
23
|
+
puts_hello_world(context)
|
24
|
+
context.flush
|
25
|
+
|
26
|
+
context.close
|
27
|
+
|
28
|
+
efile = File.join(File.dirname(__FILE__), "hello_world.txt")
|
29
|
+
expected = File.open(efile) { |f| f.read }
|
30
|
+
result = File.open(@file) { |f| f.read }
|
31
|
+
|
32
|
+
result.should == expected
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
|
+
require 'aalib'
|
3
|
+
|
4
|
+
describe "AAlib::SaveData.new" do
|
5
|
+
it "Creates a new instance of SaveData" do
|
6
|
+
file = "file.txt"
|
7
|
+
data = AAlib::SaveData.new(file, "text")
|
8
|
+
data.should be_an_instance_of(AAlib::SaveData)
|
9
|
+
data.name.should == "file.txt"
|
10
|
+
end
|
11
|
+
|
12
|
+
it "Uses AAlib::SaveFormat.find when given a string format name" do
|
13
|
+
file = "file.txt"
|
14
|
+
data = AAlib::SaveData.new(file, "text")
|
15
|
+
data.should be_an_instance_of(AAlib::SaveData)
|
16
|
+
data.name.should == file
|
17
|
+
data.format.should == AAlib::SaveFormat.find("text")
|
18
|
+
end
|
19
|
+
|
20
|
+
it "Uses AAlib::SaveFormat.find when given a regexp format name" do
|
21
|
+
file = "file.txt"
|
22
|
+
data = AAlib::SaveData.new(file, /text/i)
|
23
|
+
data.should be_an_instance_of(AAlib::SaveData)
|
24
|
+
data.name.should == file
|
25
|
+
data.format.should == AAlib::SaveFormat.find(/text/i)
|
26
|
+
end
|
27
|
+
end
|
data/spec/aalib_spec.rb
ADDED
@@ -0,0 +1,168 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
|
+
require 'aalib'
|
3
|
+
|
4
|
+
describe "AAlib.autoinit" do
|
5
|
+
# We can't check this so much because it might initialize Curses on our terminal
|
6
|
+
#
|
7
|
+
it "raises TypeError with wrong hardware_params" do
|
8
|
+
clo = lambda { AAlib.autoinit(Object.new) }
|
9
|
+
clo.should raise_error(TypeError)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "AAlib.init" do
|
14
|
+
before :each do
|
15
|
+
@hp = AAlib::HardwareParams.new
|
16
|
+
end
|
17
|
+
|
18
|
+
# AAlib.init checks its arguments in violation of duck typing, but incorrect
|
19
|
+
# arguments can lead to segmentation faults if AAlib calls the C-library
|
20
|
+
# functions with incorrect arguments.
|
21
|
+
|
22
|
+
it "raises TypeError with wrong driver" do
|
23
|
+
clo = lambda { AAlib.init(Object.new) }
|
24
|
+
clo.should raise_error(TypeError)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "raises TypeError with wrong hardware_params" do
|
28
|
+
clo = lambda { AAlib.init(AAlib.memory_driver, Object.new) }
|
29
|
+
clo.should raise_error(TypeError)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "returns an AAlib::Context with memory driver" do
|
33
|
+
AAlib.init(AAlib.memory_driver, @hp).should be_an_instance_of(AAlib::Context)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "returns an AAlib::Context with memory driver and no hardware_params" do
|
37
|
+
AAlib.init(AAlib.memory_driver).should be_an_instance_of(AAlib::Context)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "returns an AAlib::Context when called with save driver" do
|
41
|
+
opts = AAlib::SaveData.new("test.txt", "text")
|
42
|
+
context = AAlib.init(AAlib.save_driver, @hp, opts)
|
43
|
+
context.should be_an_instance_of(AAlib::Context)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "raises ArgumentError when called with save driver and no driver_opts" do
|
47
|
+
clo = lambda { AAlib.init(AAlib.save_driver, @hp, nil) }
|
48
|
+
clo.should raise_error(ArgumentError)
|
49
|
+
end
|
50
|
+
|
51
|
+
it "raises TypeError when called with save driver and wrong driver_opts" do
|
52
|
+
opts = AAlib::SaveFormat.find("text")
|
53
|
+
clo = lambda { AAlib.init(AAlib.save_driver, @hp, opts) }
|
54
|
+
clo.should raise_error(TypeError)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# describe "AAlib.color_from_rgb" do
|
59
|
+
# it "converts an RGB color to greyscale" do
|
60
|
+
# AAlib.color_from_rgb(0, 0, 0).should == 0
|
61
|
+
# AAlib.color_from_rgb(255, 255, 255).should == 255
|
62
|
+
# AAlib.color_from_rgb(255, 0, 0).should == 29
|
63
|
+
# AAlib.color_from_rgb(0, 255, 0).should == 58
|
64
|
+
# AAlib.color_from_rgb(0, 0, 255).should == 10
|
65
|
+
# AAlib.color_from_rgb(47, 57, 98).should == 22
|
66
|
+
# end
|
67
|
+
#
|
68
|
+
# it "behaves stupidly when args are larger than 255" do
|
69
|
+
# AAlib.color_from_rgb(256, 0, 0).should == 30
|
70
|
+
# end
|
71
|
+
# end
|
72
|
+
|
73
|
+
describe "AAlib.help" do
|
74
|
+
it "returns a large help string" do
|
75
|
+
AAlib.help.should be_an_instance_of(String)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe "AAlib.formats" do
|
80
|
+
it "returns an array of formats" do
|
81
|
+
AAlib.formats.should be_an_instance_of(Array)
|
82
|
+
end
|
83
|
+
|
84
|
+
it "returns an array of AAlib::SaveFormat objects" do
|
85
|
+
AAlib.formats.each do |driver|
|
86
|
+
driver.should be_an_instance_of(AAlib::SaveFormat)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe "AAlib.drivers" do
|
92
|
+
it "returns an array of drivers" do
|
93
|
+
AAlib.drivers.should be_an_instance_of(Array)
|
94
|
+
end
|
95
|
+
|
96
|
+
it "returns an array of AAlib::Driver objects" do
|
97
|
+
AAlib.drivers.each do |driver|
|
98
|
+
driver.should be_an_instance_of(AAlib::Driver)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
describe "AAlib.save_driver" do
|
104
|
+
it "returns the driver to use for saving to disk" do
|
105
|
+
driver = AAlib.save_driver
|
106
|
+
driver.should be_an_instance_of(AAlib::Driver)
|
107
|
+
driver.shortname.should == 'save'
|
108
|
+
driver.name.should == 'Special driver for saving to files'
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
describe "AAlib.memory_driver" do
|
113
|
+
it "returns the driver to use for an in-memory context" do
|
114
|
+
driver = AAlib.memory_driver
|
115
|
+
driver.should be_an_instance_of(AAlib::Driver)
|
116
|
+
driver.shortname.should == 'mem'
|
117
|
+
# FIXME: may depend on AA-lib version?
|
118
|
+
driver.name.should == 'Dummy memory driver 1.0'
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
describe "AAlib.parseoptions" do
|
123
|
+
before :each do
|
124
|
+
@hp = AAlib::HardwareParams.new
|
125
|
+
@rp = AAlib::RenderParams.new
|
126
|
+
end
|
127
|
+
|
128
|
+
it "parses commandline options, setting values in RenderParams" do
|
129
|
+
argv = %w{-gamma 2.0 -contrast 5 -bright 100}
|
130
|
+
AAlib.parseoptions(@hp, @rp, argv).should be_true
|
131
|
+
@rp.gamma.should be_close(2.0, 0.01)
|
132
|
+
@rp.contrast.should == 5
|
133
|
+
@rp.bright.should == 100
|
134
|
+
end
|
135
|
+
|
136
|
+
it "parses commandline options, setting values in HardwareParams" do
|
137
|
+
argv = %w{-width 101 -height 57}
|
138
|
+
AAlib.parseoptions(@hp, @rp, argv).should be_true
|
139
|
+
@hp.width.should == 101
|
140
|
+
@hp.height.should == 57
|
141
|
+
end
|
142
|
+
|
143
|
+
it "leaves untouched other options" do
|
144
|
+
argv = %w{--verbose -gamma 2.0 -contrast 5 -bright 100 -other-option 70}
|
145
|
+
AAlib.parseoptions(@hp, @rp, argv).should be_true
|
146
|
+
argv.should == %w{--verbose -other-option 70}
|
147
|
+
end
|
148
|
+
|
149
|
+
it "uses ARGV by default" do
|
150
|
+
ARGV.replace %w{--verbose -gamma 2.0 -contrast 5 -bright 100 -other-option 70}
|
151
|
+
AAlib.parseoptions(@hp, @rp).should be_true
|
152
|
+
ARGV.should == %w{--verbose -other-option 70}
|
153
|
+
|
154
|
+
@rp.gamma.should be_close(2.0, 0.01)
|
155
|
+
@rp.contrast.should == 5
|
156
|
+
@rp.bright.should == 100
|
157
|
+
end
|
158
|
+
|
159
|
+
it "raises TypeError with wrong hardware_params" do
|
160
|
+
clo = lambda { AAlib.parseoptions(Object.new, @rp) }
|
161
|
+
clo.should raise_error(TypeError)
|
162
|
+
end
|
163
|
+
|
164
|
+
it "raises TypeError with wrong hardware_params" do
|
165
|
+
clo = lambda { AAlib.parseoptions(@hp, Object.new) }
|
166
|
+
clo.should raise_error(TypeError)
|
167
|
+
end
|
168
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
. . ........-.:.::::::::;:;;;=;=======+++++|+|+|||||||||i|iiiiiiilllllIIIvIv
|
2
|
+
. . .........:-::-:::::::;;;;=;=======++++++|+|+|||+|||||ii|iiiiiillllllIIvIvvv
|
3
|
+
. .........-:-:.::::::::;;;;=========++++|+||+||||+|||||ii|iiiiiilllllIIvIvvvvvv
|
4
|
+
........:.::.::::::::;;;=;========++|+|+|+|+||||||||iiiiiiiiillllllIIvvIvvvvvvnv
|
5
|
+
....--::-::::::::;;;=;=========++|+++|+|+|||||||||iii|iiiillllllIvvvvvvvvvvnvnnn
|
6
|
+
.--:-:-:::::::;;;=;=;======+++|+|=|||+|||||||||i|iiiiilillllIIvIvvIvvvvvnnnnnnnn
|
7
|
+
::-::::::::;;;=;========+++|+|++||+||||||||i|iiiiiiillllIIIvIvvvvvvvvnnnnnnnnooo
|
8
|
+
:-::::::;;;=;========++|++|++|+|||||||||iiiiiiiillllllIIvIvvvvvvvnvnnnnnnnnoo222
|
9
|
+
:::::;;;=;========++|+++|+|||||||||||i|iiiiiilllllIIvIvvvvvvvvnvnnnnnnnooo22222S
|
10
|
+
;:;=;=;=======+++|+++|||+|||||||||iiiiiiiiillllIIvIvvvvvvvvnvnnnnnnooo2o2222S2S2
|
11
|
+
;=;========+++++|=|||+|+|||||||iiiiiiiilllIlIIvIvvvvvvvvnvnnnnnnoooo2222S2SS2XSX
|
12
|
+
========+++|+|+|+||+||| nnnnoooo2o2S22S2S2SSSSSX
|
13
|
+
=====+++|+|++|+|||||||| AA-lib: the ascii-art library noooo2oSoS22SS2XSSXSXXXX
|
14
|
+
=++++|+|++|+|||||||||ii oo2222SoS2SSS2XXSXXXXXXZ
|
15
|
+
+++|+|+|+|||||||||iiiiiiiililIlIIvIvvvvvvvvvnnnnnnnnooo22222S2SSSSSSSXXXXXXXZZZU
|
16
|
+
|+|+|+||||||||i|iiiiiiiilllIIIvIvvvvvvvvvnnnnnnnooo2o22S2S2X2XS2XSXXXXXXZZZZ#Z#Z
|
17
|
+
|+|||||||||iiiiiiiiillllIIIvIvvvvvvvvnvnnnnnnoooo222S2S2S2SSSSSXXXXXXZZZZZ#ZUZ##
|
18
|
+
||||||||iiiiiiiillllllIvIvvvvvvvvvnnnnnnnoooo2o2S22S2S2SSSXSXXXXXXZZZZZ#Z#Z#####
|
19
|
+
|||||iiiiiiiiilllllIvIvIvvvvvvvnnnnnnnnooo2222S22SS2XSSXXXXXXXXZZZZUZ#UZ########
|
20
|
+
i|iiiiiiiiilllllIIvvvvvvvvvnvnnnnnnnooo22222S2S2XS2XXSXXXXXXZZZUZ#Z#UUU########m
|
21
|
+
iiiiiiiilllIlIvvvvvvvvvvnnnnnnnnoooo2222S2SS2SSSSSXXXXXXXZZZUZ#Z#Z#########mmmBB
|
22
|
+
iiiillllIIIvvvIvvvvvvnvnnnnnnooo2o2S22S2S2X2XXSXXXXXXZZZZ#Z#Z#Z#########mmmBBWmW
|
23
|
+
llllllIIvIvvvvvvvvnnnnnnnnooo2oSoS22S2SSSSXXXXXXXXZZZZUZ#Z#Z#########mmmBBWBWmWW
|
24
|
+
lllIvIvvvvvvvvvnnnnnnnnoo2o222SoS2SSSSSSXXXXXXXZZZZ#Z#Z#U########mmmBmWBWBWmWWWW
|
25
|
+
vIvvIvvvvvvnvnnnnnnnooo2222S2S2SSSSSSXXXXXXXZZZZ#Z#Z#U########mmmBBBWBWmWWBWWWWW
|
@@ -0,0 +1,25 @@
|
|
1
|
+
. . ........-.:.::::::::;:;;;=;=======+++++|+|+|||||||||i|iiiiiiilllllIIIvIv
|
2
|
+
. . .........:-::-:::::::;;;;=;=======++++++|+|+|||+|||||ii|iiiiiillllllIIvIvvv
|
3
|
+
. .........-:-:.::::::::;;;;=========++++|+||+||||+|||||ii|iiiiiilllllIIvIvvvvvv
|
4
|
+
........:.::.::::::::;;;=;========++|+|+|+|+||||||||iiiiiiiiillllllIIvvIvvvvvvnv
|
5
|
+
....--::-::::::::;;;=;=========++|+++|+|+|||||||||iii|iiiillllllIvvvvvvvvvvnvnnn
|
6
|
+
.--:-:-:::::::;;;=;=;======+++|+|=|||+|||||||||i|iiiiilillllIIvIvvIvvvvvnnnnnnnn
|
7
|
+
::-::::::::;;;=;========+++|+|++||+||||||||i|iiiiiiillllIIIvIvvvvvvvvnnnnnnnnooo
|
8
|
+
:-::::::;;;=;========++|++|++|+|||||||||iiiiiiiillllllIIvIvvvvvvvnvnnnnnnnnoo222
|
9
|
+
:::::;;;=;========++|+++|+|||||||||||i|iiiiiilllllIIvIvvvvvvvvnvnnnnnnnooo22222S
|
10
|
+
;:;=;=;=======+++|+++|||+|||||||||iiiiiiiiillllIIvIvvvvvvvvnvnnnnnnooo2o2222S2S2
|
11
|
+
;=;========+++++|=|||+|+|||||||iiiiiiiilllIlIIvIvvvvvvvvnvnnnnnnoooo2222S2SS2XSX
|
12
|
+
========+++|+|+|+||+||| nnnnoooo2o2S22S2S2SSSSSX
|
13
|
+
=====+++|+|++|+|||||||| AA-lib: the ascii-art library noooo2oSoS22SS2XSSXSXXXX
|
14
|
+
=++++|+|++|+|||||||||ii oo2222SoS2SSS2XXSXXXXXXZ
|
15
|
+
+++|+|+|+|||||||||iiiiiiiililIlIIvIvvvvvvvvvnnnnnnnnooo22222S2SSSSSSSXXXXXXXZZZU
|
16
|
+
|+|+|+||||||||i|iiiiiiiilllIIIvIvvvvvvvvvnnnnnnnooo2o22S2S2X2XS2XSXXXXXXZZZZ#Z#Z
|
17
|
+
|+|||||||||iiiiiiiiillllIIIvIvvvvvvvvnvnnnnnnoooo222S2S2S2SSSSSXXXXXXZZZZZ#ZUZ##
|
18
|
+
||||||||iiiiiiiillllllIvIvvvvvvvvvnnnnnnnoooo2o2S22S2S2SSSXSXXXXXXZZZZZ#Z#Z#####
|
19
|
+
|||||iiiiiiiiilllllIvIvIvvvvvvvnnnnnnnnooo2222S22SS2XSSXXXXXXXXZZZZUZ#UZ########
|
20
|
+
i|iiiiiiiiilllllIIvvvvvvvvvnvnnnnnnnooo22222S2S2XS2XXSXXXXXXZZZUZ#Z#UUU########m
|
21
|
+
iiiiiiiilllIlIvvvvvvvvvvnnnnnnnnoooo2222S2SS2SSSSSXXXXXXXZZZUZ#Z#Z#########mmmBB
|
22
|
+
iiiillllIIIvvvIvvvvvvnvnnnnnnooo2o2S22S2S2X2XXSXXXXXXZZZZ#Z#Z#Z#########mmmBBWmW
|
23
|
+
llllllIIvIvvvvvvvvnnnnnnnnooo2oSoS22S2SSSSXXXXXXXXZZZZUZ#Z#Z#########mmmBBWBWmWW
|
24
|
+
lllIvIvvvvvvvvvnnnnnnnnoo2o222SoS2SSSSSSXXXXXXXZZZZ#Z#Z#U########mmmBmWBWBWmWWWW
|
25
|
+
vIvvIvvvvvvnvnnnnnnnooo2222S2S2SSSSSSXXXXXXXZZZZ#Z#Z#U########mmmBBBWBWmWWBWWWWW
|