retrograph 0.5-x86-mswin32
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.
- data/COPYING +19 -0
- data/README +264 -0
- data/Rakefile +71 -0
- data/ext/retrograph/extconf.rb +6 -0
- data/ext/retrograph/retrograph.c +324 -0
- data/lib/retrograph/sdl.rb +26 -0
- data/lib/retrograph.rb +29 -0
- data/lib/retrograph.so +0 -0
- data/spec/image-specs/color-blue-bits.case +2 -0
- data/spec/image-specs/color-blue-bits.png +0 -0
- data/spec/image-specs/color-green-bits.case +2 -0
- data/spec/image-specs/color-green-bits.png +0 -0
- data/spec/image-specs/color-red-bits.case +2 -0
- data/spec/image-specs/color-red-bits.png +0 -0
- data/spec/image-specs/default-screen-black.case +1 -0
- data/spec/image-specs/default-screen-black.png +0 -0
- data/spec/image-specs/default-screen-color-0.case +2 -0
- data/spec/image-specs/default-screen-color-0.png +0 -0
- data/spec/image-specs/scroll-mode1.case +7 -0
- data/spec/image-specs/scroll-mode1.png +0 -0
- data/spec/image-specs/scroll-mode2.case +10 -0
- data/spec/image-specs/scroll-mode2.png +0 -0
- data/spec/image-specs/scroll-mode3.case +10 -0
- data/spec/image-specs/scroll-mode3.png +0 -0
- data/spec/image-specs/sprites-doubling.case +5 -0
- data/spec/image-specs/sprites-doubling.png +0 -0
- data/spec/image-specs/sprites-mode2.case +8 -0
- data/spec/image-specs/sprites-mode2.png +0 -0
- data/spec/image-specs/sprites-mode3.case +8 -0
- data/spec/image-specs/sprites-mode3.png +0 -0
- data/spec/image-specs/sprites-ordering.case +5 -0
- data/spec/image-specs/sprites-ordering.png +0 -0
- data/spec/image-specs/text-colors.case +5 -0
- data/spec/image-specs/text-colors.png +0 -0
- data/spec/image-specs/tile-attributes-mode2.case +9 -0
- data/spec/image-specs/tile-attributes-mode2.png +0 -0
- data/spec/image-specs/tile-attributes-mode3.case +9 -0
- data/spec/image-specs/tile-attributes-mode3.png +0 -0
- data/spec/retrograph_spec.rb +134 -0
- data/src/retrograph.c +697 -0
- data/src/retrograph.h +67 -0
- metadata +99 -0
@@ -0,0 +1,26 @@
|
|
1
|
+
# retrograph/sdl
|
2
|
+
#
|
3
|
+
# Copyright (c) 2009 MenTaLguY <mental@rydia.net>
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
# of this software and associated documentation files (the "Software"), to deal
|
7
|
+
# in the Software without restriction, including without limitation the rights
|
8
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
# copies of the Software, and to permit persons to whom the Software is
|
10
|
+
# furnished to do so, subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be included in
|
13
|
+
# all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
# THE SOFTWARE.
|
22
|
+
|
23
|
+
require 'retrograph'
|
24
|
+
require 'sdl'
|
25
|
+
|
26
|
+
Retrograph._init_sdl
|
data/lib/retrograph.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# retrograph
|
2
|
+
#
|
3
|
+
# Copyright (c) 2009 MenTaLguY <mental@rydia.net>
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
# of this software and associated documentation files (the "Software"), to deal
|
7
|
+
# in the Software without restriction, including without limitation the rights
|
8
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
# copies of the Software, and to permit persons to whom the Software is
|
10
|
+
# furnished to do so, subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be included in
|
13
|
+
# all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
# THE SOFTWARE.
|
22
|
+
#
|
23
|
+
|
24
|
+
# augment search path for fat binary gems
|
25
|
+
ruby_version = /^\d+\.\d+/.match(RUBY_VERSION)[0]
|
26
|
+
base_dir = File.dirname(__FILE__)
|
27
|
+
$:.push File.join(base_dir, ruby_version)
|
28
|
+
|
29
|
+
require 'retrograph.so'
|
data/lib/retrograph.so
ADDED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
should fill the screen with black by default
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,10 @@
|
|
1
|
+
should support smooth scrolling in mode 2
|
2
|
+
7ff8: 06
|
3
|
+
7ffc: 0c 84
|
4
|
+
7f00: 00 ff
|
5
|
+
0010: 0001 0005 0015 0055 0155 0555 1555 5555
|
6
|
+
0020: 5555 1555 0555 0155 0055 0015 0005 0001
|
7
|
+
0030: 1111 4444 1111 4444 1111 4444 1111 4444
|
8
|
+
0c00: 0002
|
9
|
+
0ac0: 0001
|
10
|
+
0b00: 0003
|
Binary file
|
@@ -0,0 +1,10 @@
|
|
1
|
+
should support smooth scrolling in mode 3
|
2
|
+
7ff8: 07
|
3
|
+
7ffc: 0c 84
|
4
|
+
7f00: 00 ff
|
5
|
+
0020: 00000001 00000011 00000111 00001111 00011111 00111111 01111111 11111111
|
6
|
+
0040: 11111111 01111111 00111111 00011111 00001111 00000111 00000011 00000001
|
7
|
+
0060: 01010101 10101010 01010101 10101010 01010101 10101010 01010101 10101010
|
8
|
+
0c00: 0002
|
9
|
+
0ac0: 0001
|
10
|
+
0b00: 0003
|
Binary file
|
Binary file
|
@@ -0,0 +1,8 @@
|
|
1
|
+
should show first 8 sprites per line in mode 2
|
2
|
+
7ff8: 0a
|
3
|
+
7f10: 00 02 08 0a 20 22 38 2a 15 17 1d 1f 35 37 3d 3f
|
4
|
+
7e00: 00 01 0001 08 01 0002 10 01 0101 18 01 0102
|
5
|
+
7e10: 20 01 0201 28 01 0202 30 01 0301 38 01 0302
|
6
|
+
7e20: 40 01 0001 48 01 0002 50 01 0001 58 01 0002
|
7
|
+
2020: 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111
|
8
|
+
2040: 20202020 02020202 20202020 02020202 20202020 02020202 20202020 02020202
|
Binary file
|
@@ -0,0 +1,8 @@
|
|
1
|
+
should show first 8 sprites per line in mode 3
|
2
|
+
7ff8: 0b
|
3
|
+
7f10: 00 02 08 0a 20 22 38 2a 15 17 1d 1f 35 37 3d 3f
|
4
|
+
7e00: 00 01 0001 08 01 0002 10 01 0101 18 01 0102
|
5
|
+
7e10: 20 01 0201 28 01 0202 30 01 0301 38 01 0302
|
6
|
+
7e20: 40 01 0001 48 01 0002 50 01 0001 58 01 0002
|
7
|
+
2020: 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111
|
8
|
+
2040: 20202020 02020202 20202020 02020202 20202020 02020202 20202020 02020202
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,9 @@
|
|
1
|
+
should implement tile attributes in mode 2
|
2
|
+
7ff8: 06
|
3
|
+
7f00: 00 02 08 0a 20 22 38 2a 15 17 1d 1f 35 37 3d 3f
|
4
|
+
7f10: 3f 3d 37 35 1f 1d 17 15 2a 38 22 20 0a 08 02 00
|
5
|
+
0010: 5500 5500 5500 5500 ffaa ffaa ffaa ffaa
|
6
|
+
0800: 0001 0201 0401 0601 0801 0a01 0c01 0e01
|
7
|
+
0840: 1001 1201 1401 1601 1801 1a01 1c01 1e01
|
8
|
+
0880: 2001 2201 2401 2601 2801 2a01 2c01 2e01
|
9
|
+
08c0: 3001 3201 3401 3601 3801 3a01 3c01 3e01
|
Binary file
|
@@ -0,0 +1,9 @@
|
|
1
|
+
should implement tile attributes in mode 3
|
2
|
+
7ff8: 07
|
3
|
+
7f00: 00 02 08 0a 20 22 38 2a 15 17 1d 1f 35 37 3d 3f
|
4
|
+
7f10: 3f 3d 37 35 1f 1d 17 15 2a 38 22 20 0a 08 02 00
|
5
|
+
0020: 33221100 33221100 77665544 77665544 bbaa9988 bbaa9988 ffeeddcc ffeeddcc
|
6
|
+
0800: 0001 0201 0401 0601 0801 0a01 0c01 0e01
|
7
|
+
0840: 1001 1201 1401 1601 1801 1a01 1c01 1e01
|
8
|
+
0880: 2001 2201 2401 2601 2801 2a01 2c01 2e01
|
9
|
+
08c0: 3001 3201 3401 3601 3801 3a01 3c01 3e01
|
Binary file
|
@@ -0,0 +1,134 @@
|
|
1
|
+
require 'retrograph/sdl'
|
2
|
+
|
3
|
+
describe Retrograph do
|
4
|
+
constants = [
|
5
|
+
[:DISPLAY_WIDTH, 256],
|
6
|
+
[:DISPLAY_HEIGHT, 224],
|
7
|
+
[:OUTPUT_WIDTH, 512],
|
8
|
+
[:OUTPUT_HEIGHT, 448],
|
9
|
+
[:BYTES_PER_PIXEL, 4],
|
10
|
+
[:BITS_PER_PIXEL, 32],
|
11
|
+
[:RED_SHIFT, 16],
|
12
|
+
[:GREEN_SHIFT, 8],
|
13
|
+
[:BLUE_SHIFT, 0],
|
14
|
+
[:RED_MASK, 0x00ff0000],
|
15
|
+
[:GREEN_MASK, 0x0000ff00],
|
16
|
+
[:BLUE_MASK, 0x000000ff],
|
17
|
+
[:ALPHA_MASK, 0x00000000]
|
18
|
+
]
|
19
|
+
for name, value in constants
|
20
|
+
it "should define #{name} as #{value}" do
|
21
|
+
Retrograph.const_get(name).should == value
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
module ImageTests
|
27
|
+
RMASK = Retrograph::RED_MASK
|
28
|
+
GMASK = Retrograph::GREEN_MASK
|
29
|
+
BMASK = Retrograph::BLUE_MASK
|
30
|
+
AMASK = Retrograph::ALPHA_MASK
|
31
|
+
|
32
|
+
def build_image_specs(spec_dir)
|
33
|
+
Dir.open(spec_dir) do |dir|
|
34
|
+
dir.each do |name|
|
35
|
+
parts = name.split('.')
|
36
|
+
extension = parts.pop
|
37
|
+
next unless extension == 'case'
|
38
|
+
case_file = File.join(spec_dir, name)
|
39
|
+
parts.push 'png'
|
40
|
+
image_file = File.join(spec_dir, parts.join('.'))
|
41
|
+
build_image_spec(case_file, image_file)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def build_image_spec(case_file, image_file)
|
47
|
+
description = nil
|
48
|
+
writes = []
|
49
|
+
|
50
|
+
File.open(case_file, "r") do |stream|
|
51
|
+
description = stream.readline.strip
|
52
|
+
stream.each_line do |line|
|
53
|
+
offset, data = line.split(':').map { |t| t.strip }
|
54
|
+
data, offset = offset, nil unless data
|
55
|
+
data = data.split(/\s+/).map { |w| w.scan(/[a-zA-Z0-9]{2}/).reverse }
|
56
|
+
data = data.map { |w| [w.join('')].pack("H*") }.join('')
|
57
|
+
offset = Integer("0x#{offset}")
|
58
|
+
unless data.empty?
|
59
|
+
if offset
|
60
|
+
writes << [offset, data]
|
61
|
+
else
|
62
|
+
writes.last[1] << data
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
it description do
|
69
|
+
vdu = Retrograph::VDU.new
|
70
|
+
for offset, data in writes
|
71
|
+
vdu.write(offset, data)
|
72
|
+
end
|
73
|
+
output_image = vdu.render_frame_sdl
|
74
|
+
output_file = image_file.sub(/\.[^.]*$/, '-output.bmp')
|
75
|
+
output_image.save_bmp(output_file)
|
76
|
+
|
77
|
+
raw_image = SDL::Surface.load(image_file)
|
78
|
+
raw_image.set_alpha(0, SDL::ALPHA_OPAQUE)
|
79
|
+
raw_image.set_color_key(0, 0)
|
80
|
+
reference_image = SDL::Surface.new(0, raw_image.w, raw_image.h, 32,
|
81
|
+
RMASK, GMASK, BMASK, AMASK)
|
82
|
+
SDL::Surface.blit(raw_image, 0, 0, 0, 0, reference_image, 0, 0)
|
83
|
+
raw_image = nil
|
84
|
+
if output_image.pixels != reference_image.pixels
|
85
|
+
raise "Output does not match."
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe Retrograph::VDU do
|
92
|
+
before do
|
93
|
+
@vdu = Retrograph::VDU.new
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should render to a surface with the right characteristics" do
|
97
|
+
surface = @vdu.render_frame_sdl
|
98
|
+
surface.should be_an_instance_of(SDL::Surface)
|
99
|
+
surface.flags.should == 0
|
100
|
+
surface.w.should == Retrograph::OUTPUT_WIDTH
|
101
|
+
surface.h.should == Retrograph::OUTPUT_HEIGHT
|
102
|
+
surface.bpp.should == Retrograph::BITS_PER_PIXEL
|
103
|
+
surface.Rmask.should == Retrograph::RED_MASK
|
104
|
+
surface.Gmask.should == Retrograph::GREEN_MASK
|
105
|
+
surface.Bmask.should == Retrograph::BLUE_MASK
|
106
|
+
surface.Amask.should == Retrograph::ALPHA_MASK
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should have a write method which takes an offset and a byte string" do
|
110
|
+
@vdu.write(0x0001, "foobar")
|
111
|
+
end
|
112
|
+
|
113
|
+
it "should have a write_bytes method which takes an offset and a byte" do
|
114
|
+
@vdu.write_byte(0x0001, 42)
|
115
|
+
end
|
116
|
+
|
117
|
+
it "should not allow nested calls to #render_frame_sdl" do
|
118
|
+
lambda {
|
119
|
+
@vdu.render_frame_sdl { @vdu.render_frame_sdl }
|
120
|
+
}.should raise_error(Retrograph::RenderError, "Already in frame")
|
121
|
+
end
|
122
|
+
|
123
|
+
it "should allow naked calls to #wait_scanlines (as a noop)" do
|
124
|
+
@vdu.wait_scanlines(30)
|
125
|
+
end
|
126
|
+
|
127
|
+
it "should allow calls to #wait_scanlines within a frame" do
|
128
|
+
@vdu.render_frame_sdl { @vdu.wait_scanlines(30) }
|
129
|
+
end
|
130
|
+
|
131
|
+
extend ImageTests
|
132
|
+
spec_dir = File.join(File.split(__FILE__).first, 'image-specs')
|
133
|
+
build_image_specs(spec_dir)
|
134
|
+
end
|