retrograph 0.2.1 → 0.5
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 +83 -67
- data/Rakefile +43 -26
- data/ext/retrograph/extconf.rb +6 -0
- data/ext/{retrograph.c → retrograph/retrograph.c} +78 -29
- data/lib/retrograph/sdl.rb +26 -0
- data/lib/retrograph.rb +29 -0
- data/spec/image-specs/color-blue-bits.png +0 -0
- data/spec/image-specs/color-green-bits.png +0 -0
- data/spec/image-specs/color-red-bits.png +0 -0
- data/spec/image-specs/default-screen-black.png +0 -0
- data/spec/image-specs/default-screen-color-0.png +0 -0
- data/spec/image-specs/scroll-mode1.png +0 -0
- data/spec/image-specs/scroll-mode2.png +0 -0
- data/spec/image-specs/scroll-mode3.png +0 -0
- data/spec/image-specs/sprites-doubling.png +0 -0
- data/spec/image-specs/sprites-mode2.png +0 -0
- data/spec/image-specs/sprites-mode3.png +0 -0
- data/spec/image-specs/sprites-ordering.png +0 -0
- data/spec/image-specs/text-colors.png +0 -0
- data/spec/image-specs/tile-attributes-mode2.png +0 -0
- data/spec/image-specs/tile-attributes-mode3.png +0 -0
- data/spec/retrograph_spec.rb +23 -22
- data/src/retrograph.c +22 -20
- data/src/retrograph.h +2 -1
- metadata +14 -19
- data/ext/extconf.rb +0 -3
data/COPYING
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Copyright (c) 2009 MenTaLguY <mental@rydia.net>
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
5
|
+
in the Software without restriction, including without limitation the rights
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in
|
11
|
+
all copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
THE SOFTWARE.
|
data/README
CHANGED
@@ -6,19 +6,18 @@ console. It is similar in capability to the Sega Master
|
|
6
6
|
System's VDP, with some additional features and direct
|
7
7
|
support for text modes.
|
8
8
|
|
9
|
-
Retrograph
|
10
|
-
|
9
|
+
Retrograph currently supports Ruby/SDL for output; other
|
10
|
+
output targets may be added in the future.
|
11
11
|
|
12
12
|
== Feature Overview ==
|
13
13
|
|
14
14
|
* 256x244 pixel display
|
15
15
|
* 16k VRAM
|
16
|
-
* 40x25 and 32x28 text modes
|
17
|
-
* 2bpp and 4bpp graphics modes
|
18
16
|
* 64 colors total
|
19
|
-
* 31 simultaneous colors (16 background, 15 sprite)
|
20
|
-
*
|
21
|
-
*
|
17
|
+
* max 31 simultaneous colors (16 background, 15 sprite)
|
18
|
+
* 40x25 and 32x28 text modes
|
19
|
+
* 32x32 tile background, 8x8 pixel tiles
|
20
|
+
* 64 8x8 sprites, max 8 per scanline
|
22
21
|
|
23
22
|
== Usage ==
|
24
23
|
|
@@ -27,65 +26,54 @@ represented by an instance of the Retrograph::VDU class.
|
|
27
26
|
You can interact with the VDU by writing byte strings
|
28
27
|
into its memory using Retrograph::VDU#write, which takes
|
29
28
|
a start address (in the VDU's 16-bit address space) and
|
30
|
-
a string to write.
|
29
|
+
a string to write. The method Retrograph::VDU#write_byte
|
30
|
+
is also provided for writing individual bytes.
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
32
|
+
(See the end of this document for a map of registers and
|
33
|
+
memory locations within the VDU's address space.)
|
34
|
+
|
35
|
+
To render a frame of video with SDL, use
|
36
|
+
Retrograph::VDU#render_frame_sdl, which returns an
|
37
|
+
SDL::Surface containing the VDU output. The returned
|
38
|
+
surface remains valid until the next call to
|
39
|
+
Retrograph::VDU#render_frame_sdl on the same VDU instance.
|
36
40
|
|
37
41
|
Scanline-based effects are possible if you provide a block
|
38
|
-
to Retrograph::VDU#
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
42
|
+
to Retrograph::VDU#render_frame_sdl. Ordinarily, rendering
|
43
|
+
will not begin until the block completes, but within the
|
44
|
+
block you can call Retrograph::VDU#wait_scanlines to render
|
45
|
+
a given number of scanlines before continuing. This allows
|
46
|
+
you to make changes to the VDU state part-way through
|
47
|
+
rendering a frame.
|
48
|
+
|
49
|
+
For example, if we wanted palette entry 0 to be blue within
|
50
|
+
the top half of the display and red within the bottom half
|
51
|
+
of the display, we could write:
|
52
|
+
|
53
|
+
require 'retrograph/sdl'
|
54
|
+
|
55
|
+
output = vdu.render_frame_sdl do
|
56
|
+
vdu.write_byte(0x7f00, 0x03)
|
57
|
+
vdu.wait_scanlines(Retrograph::DISPLAY_HEIGHT/2)
|
58
|
+
vdu.write_byte(0x7f00, 0x30)
|
49
59
|
end
|
50
60
|
|
51
|
-
The integer passed to Retrograph::VDU#render_scanlines is
|
52
|
-
an integer count of scanlines to render; each call renders
|
53
|
-
an additional number of scanlines. Any remaining scanlines
|
54
|
-
not rendered by calls to Retrograph::VDU#render_scanlines
|
55
|
-
are rendered by Retrograph::VDU#render_frame when the block
|
56
|
-
completes.
|
57
|
-
|
58
|
-
See the end of this document for a map of registers and
|
59
|
-
memory locations within the VDU's address space.
|
60
|
-
|
61
61
|
== Important Notes ==
|
62
62
|
|
63
|
-
|
64
|
-
|
65
|
-
|
63
|
+
Nothing is displayed by default. To be shown, the
|
64
|
+
background layer (and the sprite, in graphical modes) must
|
65
|
+
be explicitly enabled by setting bit 2 (bit 3 for sprites)
|
66
|
+
of register $7FF8.
|
66
67
|
|
67
|
-
Patterns and name tables may overlap in memory (
|
68
|
-
|
69
|
-
simultaneously valid pattern and name data at
|
70
|
-
location, so in
|
71
|
-
particular name or pattern entries.
|
72
|
-
|
73
|
-
Unlike most authentic 8-bit systems, any register or memory
|
74
|
-
location may be changed in between scanlines, including the
|
75
|
-
vertical scroll register and even the video mode. This
|
76
|
-
permits fairly powerful split-screen effects, and in some
|
77
|
-
cases may be used to exceed simultaneous color, sprite, or
|
78
|
-
pattern limitations.
|
68
|
+
Patterns and name tables may overlap in memory (which is
|
69
|
+
in fact unavoidable in graphics modes); typically you
|
70
|
+
cannot have simultaneously valid pattern and name data at
|
71
|
+
the same location, so in such cases you will need to
|
72
|
+
sacrifice particular name or pattern entries.
|
79
73
|
|
80
74
|
In text modes, you will need to load your own font into the
|
81
75
|
pattern table; the VDU does not provide one by default.
|
82
76
|
|
83
|
-
Also unlike most authentic 8-bit systems, Retrograph uses a
|
84
|
-
packed rather than a planar representation for pattern
|
85
|
-
data. Additionally, within each byte of pattern data, the
|
86
|
-
leftmost pixels are in the least significant position,
|
87
|
-
which may be backwards from what you expect.
|
88
|
-
|
89
77
|
Sprites patterns are always 4bpp, even in the 2bpp mode.
|
90
78
|
In Graphics A, one half of VRAM is occupied by 512 2bpp
|
91
79
|
patterns (for the background), and the other half by 256
|
@@ -94,7 +82,28 @@ of VRAM is occupied by just 512 4bpp patterns, with the
|
|
94
82
|
upper half of those available to sprites.
|
95
83
|
|
96
84
|
When scrolling horizontally, the leftmost background
|
97
|
-
column will not be displayed if it is partway offscreen
|
85
|
+
column will not be displayed if it is partway offscreen,
|
86
|
+
a (mis)feature shared with the Sega Master System.
|
87
|
+
|
88
|
+
Unlike most authentic 8-bit systems, any register or memory
|
89
|
+
location may be changed in between scanlines, including the
|
90
|
+
vertical scroll register and even the video mode. This
|
91
|
+
permits fairly powerful split-screen effects.
|
92
|
+
|
93
|
+
Also unlike most authentic 8-bit systems, Retrograph uses a
|
94
|
+
packed rather than a planar representation for pattern
|
95
|
+
data. Additionally, within each byte of pattern data, the
|
96
|
+
leftmost pixels are in the least significant position,
|
97
|
+
which may be backwards from what you expect.
|
98
|
+
|
99
|
+
Lastly, unlike a real 8-bit system, there is no deadline
|
100
|
+
imposed on code running in between scanlines or in between
|
101
|
+
frames. On real hardware, if you have code running
|
102
|
+
in between scanlines (that is, during horizontal retrace)
|
103
|
+
you will only have a short period of time available before
|
104
|
+
the next scanline will begin rendering, whether or not you
|
105
|
+
are finished what you are doing. However, such a
|
106
|
+
limitation would be very difficult to recreate in Ruby.
|
98
107
|
|
99
108
|
== VDU Memory Map ==
|
100
109
|
|
@@ -117,19 +126,17 @@ $7FF8 - $7FFF: VDU Registers (8 bytes)
|
|
117
126
|
$7FF9: Pattern Table Base
|
118
127
|
Text A + B:
|
119
128
|
addr = (base & 0b00110000) << 8
|
120
|
-
|
121
|
-
|
122
|
-
$3000
|
129
|
+
addr may be one of:
|
130
|
+
$0000, $1000, $2000, or $3000
|
123
131
|
Graphics A + B:
|
124
132
|
addr = (base & 0b00100000) << 8
|
125
|
-
|
126
|
-
|
133
|
+
addr may be one of:
|
134
|
+
$0000 or $2000
|
127
135
|
$7FFA: Name Table Base
|
128
136
|
addr = ((base & 0b00110000) |
|
129
137
|
0b00001000) << 8
|
130
|
-
|
131
|
-
|
132
|
-
$3800
|
138
|
+
addr may be one of:
|
139
|
+
$0800, $1800, $2800, or $3800
|
133
140
|
$7FFB: unused
|
134
141
|
$7FFC: BG scroll X*
|
135
142
|
$7FFD: BG scroll Y**
|
@@ -149,7 +156,16 @@ register $7FF9.
|
|
149
156
|
|
150
157
|
The rows constituting each pattern in the table are given
|
151
158
|
in sequence from top to bottom. Within each byte, the
|
152
|
-
leftmost pixel is in the least significant position.
|
159
|
+
leftmost pixel is in the least significant position. For
|
160
|
+
example, for a 4bpp tile, the following row would display
|
161
|
+
with the pixels of color 1 on the *left* side, and the
|
162
|
+
pixels of color 0 on the *right* side:
|
163
|
+
|
164
|
+
0x00001111
|
165
|
+
|
166
|
+
(little-endian byte ordering is assumed)
|
167
|
+
|
168
|
+
Different display modes have different pattern bit depths:
|
153
169
|
|
154
170
|
Text A: 256 patterns * 8 bytes per pattern = 2k
|
155
171
|
6x8 pixel patterns
|
@@ -209,9 +225,9 @@ regardless of the high color bits.)
|
|
209
225
|
|
210
226
|
=== Sprite Table ===
|
211
227
|
|
212
|
-
Sprite patterns start
|
213
|
-
address specified in register $7FF9. The sprite
|
214
|
-
itself always begins at $7E00.
|
228
|
+
Sprite patterns start 2048 bytes after the pattern table
|
229
|
+
base address specified in register $7FF9. The sprite
|
230
|
+
table itself always begins at $7E00.
|
215
231
|
|
216
232
|
4 bytes * 64 sprites = 256 bytes
|
217
233
|
|
data/Rakefile
CHANGED
@@ -1,54 +1,71 @@
|
|
1
1
|
require 'rake'
|
2
2
|
require 'rake/gempackagetask'
|
3
|
-
|
3
|
+
begin
|
4
|
+
require 'rake/extensiontask'
|
5
|
+
have_rake_compiler = true
|
6
|
+
rescue LoadError
|
7
|
+
$stderr.puts "*** The rake-compiler gem is required to compile. ***"
|
8
|
+
have_rake_compiler = false
|
9
|
+
end
|
10
|
+
begin
|
11
|
+
require 'spec/rake/spectask'
|
12
|
+
have_rspec = true
|
13
|
+
rescue LoadError
|
14
|
+
$stderr.puts "*** The rspec gem is required to run specs. ***"
|
15
|
+
have_rspec = false
|
16
|
+
end
|
4
17
|
require 'rake/clean'
|
5
18
|
|
6
|
-
GEM_VERSION = '0.
|
19
|
+
GEM_VERSION = '0.5'
|
7
20
|
|
8
|
-
CLEAN.include("**/*.o")
|
9
|
-
CLEAN.include("**/*.so")
|
10
21
|
CLEAN.include("spec/**/*-output.bmp")
|
11
|
-
CLOBBER.include("
|
22
|
+
CLOBBER.include("lib/1.8")
|
23
|
+
CLOBBER.include("lib/1.9")
|
12
24
|
|
13
25
|
task :clobber => [:clean]
|
14
26
|
|
15
|
-
Spec::Rake::SpecTask.new do |task|
|
16
|
-
task.ruby_opts << '-rrubygems'
|
17
|
-
task.libs << 'ext'
|
18
|
-
task.spec_files = FileList["spec/**/*_spec.rb"]
|
19
|
-
end
|
20
|
-
|
21
|
-
task :build do
|
22
|
-
sh "cd ext && #{Gem.ruby} extconf.rb && make"
|
23
|
-
end
|
24
|
-
|
25
27
|
gemspec = Gem::Specification.new do |gemspec|
|
26
28
|
gemspec.name = "retrograph"
|
27
29
|
gemspec.version = GEM_VERSION
|
28
30
|
gemspec.author = "MenTaLguY <mental@rydia.net>"
|
29
31
|
gemspec.summary = "Retrograph, a retrodisplay."
|
30
32
|
gemspec.description = <<EOS
|
31
|
-
Retrograph is a software scanline renderer which simulates a late-era 8-bit
|
32
|
-
Its graphical capabilities are similar to those of the Sega Master
|
33
|
+
Retrograph is a software scanline renderer which simulates a late-era 8-bit
|
34
|
+
display. Its graphical capabilities are similar to those of the Sega Master
|
35
|
+
System.
|
33
36
|
EOS
|
34
37
|
gemspec.homepage = "http://rubyforge.org/projects/retrograph"
|
35
38
|
gemspec.email = "mental@rydia.net"
|
36
39
|
gemspec.rubyforge_project = 'retrograph'
|
37
|
-
gemspec.files = FileList['Rakefile', 'README',
|
38
|
-
'src
|
39
|
-
'ext
|
40
|
+
gemspec.files = FileList['Rakefile', 'README', 'COPYING',
|
41
|
+
'src/**/*.h', 'src/**/*.c', 'lib/**/*.rb',
|
42
|
+
'ext/**/extconf.rb', 'ext/**/*.c', 'ext/**/*.h',
|
40
43
|
'spec/**/*_spec.rb', 'spec/**/*.case',
|
41
44
|
'spec/**/*.png']
|
42
|
-
gemspec.extensions = ['ext
|
43
|
-
gemspec.require_paths = ['
|
45
|
+
gemspec.extensions = FileList['ext/**/extconf.rb']
|
46
|
+
gemspec.require_paths = ['lib']
|
44
47
|
gemspec.platform = Gem::Platform::RUBY
|
45
|
-
gemspec.add_dependency("rubysdl", ">= 1.3.0")
|
46
48
|
end
|
47
49
|
|
48
50
|
Rake::GemPackageTask.new(gemspec) do |pkg|
|
49
51
|
pkg.need_tar = true
|
50
52
|
end
|
51
53
|
|
52
|
-
|
53
|
-
|
54
|
-
|
54
|
+
if have_rake_compiler
|
55
|
+
Rake::ExtensionTask.new('retrograph', gemspec) do |ext|
|
56
|
+
ext.cross_compile = true
|
57
|
+
ext.cross_platform = 'i386-mswin32'
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
if have_rspec
|
62
|
+
Spec::Rake::SpecTask.new do |task|
|
63
|
+
task.ruby_opts << '-rrubygems'
|
64
|
+
task.libs << 'lib'
|
65
|
+
task.spec_files = FileList["spec/**/*_spec.rb"]
|
66
|
+
end
|
67
|
+
task :spec => [:compile]
|
68
|
+
task :default => [:clean, :spec]
|
69
|
+
elsif have_rake_compiler
|
70
|
+
task :default => [:clean, :compile]
|
71
|
+
end
|
@@ -21,11 +21,24 @@
|
|
21
21
|
* THE SOFTWARE.
|
22
22
|
*/
|
23
23
|
#include <ruby.h>
|
24
|
+
#ifdef RUBY_1_8
|
24
25
|
#include <intern.h>
|
26
|
+
#else
|
27
|
+
#include <ruby/intern.h>
|
28
|
+
#endif
|
25
29
|
#include <string.h>
|
26
30
|
|
27
|
-
#include "
|
28
|
-
#include "
|
31
|
+
#include "../../src/retrograph.h"
|
32
|
+
#include "../../src/retrograph.c"
|
33
|
+
|
34
|
+
#ifndef RSTRING_LEN
|
35
|
+
#define RSTRING_LEN(str) RSTRING(str)->len
|
36
|
+
#define RSTRING_PTR(str) RSTRING(str)->ptr
|
37
|
+
#endif
|
38
|
+
|
39
|
+
#define UPSCALE_FACTOR 2
|
40
|
+
#define UPSCALE_REPEAT(stmts) stmts; stmts;
|
41
|
+
#define UPSCALE_REPEAT_MINUS1(stmts) stmts;
|
29
42
|
|
30
43
|
/* First few fields of SDL_Surface */
|
31
44
|
typedef struct surface_header_tag {
|
@@ -44,6 +57,7 @@ typedef struct rubysdl2_surface_tag {
|
|
44
57
|
typedef struct vdu_wrapper_tag {
|
45
58
|
retrograph_vdu_t vdu;
|
46
59
|
VALUE surface;
|
60
|
+
retrograph_pixel_t buffer[RETROGRAPH_DISPLAY_WIDTH];
|
47
61
|
int scanline;
|
48
62
|
} vdu_wrapper_t;
|
49
63
|
|
@@ -107,7 +121,6 @@ static VALUE alloc_vdu2(VALUE data);
|
|
107
121
|
|
108
122
|
static VALUE alloc_vdu(VALUE klass) {
|
109
123
|
vdu_wrapper_t *vdu;
|
110
|
-
VALUE vdu_r;
|
111
124
|
vdu = ALLOC(vdu_wrapper_t);
|
112
125
|
vdu->vdu = NULL;
|
113
126
|
vdu->surface = Qnil;
|
@@ -120,20 +133,23 @@ static VALUE alloc_vdu(VALUE klass) {
|
|
120
133
|
|
121
134
|
VALUE alloc_vdu2(VALUE data) {
|
122
135
|
vdu_wrapper_t *vdu=(vdu_wrapper_t *)data;
|
136
|
+
vdu->vdu = retrograph_new();
|
137
|
+
check_errors(vdu->vdu);
|
138
|
+
return Qnil;
|
139
|
+
}
|
140
|
+
|
141
|
+
void alloc_sdl_surface(vdu_wrapper_t *vdu) {
|
123
142
|
VALUE surface;
|
124
143
|
surface = rb_funcall(cSurface, SYM2ID(CREATE_SURFACE_METHOD_NAME), 8,
|
125
144
|
INT2FIX(0), /* flags */
|
126
|
-
INT2FIX(RETROGRAPH_DISPLAY_WIDTH),
|
127
|
-
INT2FIX(RETROGRAPH_DISPLAY_HEIGHT),
|
145
|
+
INT2FIX(RETROGRAPH_DISPLAY_WIDTH * UPSCALE_FACTOR),
|
146
|
+
INT2FIX(RETROGRAPH_DISPLAY_HEIGHT * UPSCALE_FACTOR),
|
128
147
|
INT2FIX(RETROGRAPH_BITS_PER_PIXEL),
|
129
148
|
INT2FIX(RETROGRAPH_RED_MASK),
|
130
149
|
INT2FIX(RETROGRAPH_GREEN_MASK),
|
131
150
|
INT2FIX(RETROGRAPH_BLUE_MASK),
|
132
151
|
INT2FIX(RETROGRAPH_ALPHA_MASK));
|
133
152
|
vdu->surface = surface;
|
134
|
-
vdu->vdu = retrograph_new();
|
135
|
-
check_errors(vdu->vdu);
|
136
|
-
return Qnil;
|
137
153
|
}
|
138
154
|
|
139
155
|
static VALUE vdu_write(VALUE self, VALUE start_address_r, VALUE data_r) {
|
@@ -142,15 +158,30 @@ static VALUE vdu_write(VALUE self, VALUE start_address_r, VALUE data_r) {
|
|
142
158
|
Check_Type(data_r, T_STRING);
|
143
159
|
Data_Get_Struct(self, vdu_wrapper_t, vdu);
|
144
160
|
start_address = (retrograph_addr_t)NUM2INT(start_address_r);
|
145
|
-
retrograph_write(vdu->vdu, start_address,
|
146
|
-
(size_t)
|
161
|
+
retrograph_write(vdu->vdu, start_address, RSTRING_PTR(data_r),
|
162
|
+
(size_t)RSTRING_LEN(data_r));
|
147
163
|
return Qnil;
|
148
164
|
}
|
149
165
|
|
150
|
-
static VALUE
|
166
|
+
static VALUE vdu_write_byte(VALUE self, VALUE start_address_r, VALUE byte_r) {
|
151
167
|
vdu_wrapper_t *vdu;
|
168
|
+
uint8_t byte;
|
169
|
+
retrograph_addr_t start_address;
|
152
170
|
Data_Get_Struct(self, vdu_wrapper_t, vdu);
|
153
|
-
|
171
|
+
start_address = (retrograph_addr_t)NUM2INT(start_address_r);
|
172
|
+
byte = (uint8_t)NUM2INT(byte_r);
|
173
|
+
retrograph_write(vdu->vdu, start_address, &byte, 1);
|
174
|
+
return Qnil;
|
175
|
+
}
|
176
|
+
|
177
|
+
static inline copy_upscale(uint8_t *output, uint8_t const * input, size_t count) {
|
178
|
+
for (; count; count--) {
|
179
|
+
UPSCALE_REPEAT(
|
180
|
+
memcpy(output, input, RETROGRAPH_BYTES_PER_PIXEL);
|
181
|
+
output += RETROGRAPH_BYTES_PER_PIXEL;
|
182
|
+
)
|
183
|
+
input += RETROGRAPH_BYTES_PER_PIXEL;
|
184
|
+
}
|
154
185
|
}
|
155
186
|
|
156
187
|
static VALUE vdu_render_scanlines(VALUE self, VALUE n_scanlines_r) {
|
@@ -162,7 +193,7 @@ static VALUE vdu_render_scanlines(VALUE self, VALUE n_scanlines_r) {
|
|
162
193
|
Data_Get_Struct(self, vdu_wrapper_t, vdu);
|
163
194
|
|
164
195
|
if (vdu->scanline == NOT_IN_FRAME) {
|
165
|
-
|
196
|
+
return Qnil;
|
166
197
|
}
|
167
198
|
|
168
199
|
surface = get_rubysdl_surface(vdu->surface);
|
@@ -172,13 +203,21 @@ static VALUE vdu_render_scanlines(VALUE self, VALUE n_scanlines_r) {
|
|
172
203
|
max_scanline = RETROGRAPH_DISPLAY_HEIGHT;
|
173
204
|
}
|
174
205
|
|
175
|
-
current_line = (uint8_t *)surface->pixels + vdu->scanline * surface->pitch;
|
206
|
+
current_line = (uint8_t *)surface->pixels + vdu->scanline * surface->pitch * UPSCALE_FACTOR;
|
176
207
|
for (; vdu->scanline < max_scanline; vdu->scanline++) {
|
177
|
-
|
178
|
-
|
179
|
-
|
208
|
+
uint8_t *output;
|
209
|
+
uint8_t const *input;
|
210
|
+
retrograph_render_scanline(vdu->vdu, vdu->buffer, sizeof(vdu->buffer));
|
180
211
|
check_errors(vdu->vdu);
|
212
|
+
copy_upscale(current_line, (uint8_t const *)vdu->buffer,
|
213
|
+
RETROGRAPH_DISPLAY_WIDTH);
|
181
214
|
current_line += surface->pitch;
|
215
|
+
UPSCALE_REPEAT_MINUS1(
|
216
|
+
memcpy(current_line, current_line - surface->pitch,
|
217
|
+
RETROGRAPH_DISPLAY_WIDTH * RETROGRAPH_BYTES_PER_PIXEL *
|
218
|
+
UPSCALE_FACTOR);
|
219
|
+
current_line += surface->pitch;
|
220
|
+
)
|
182
221
|
}
|
183
222
|
|
184
223
|
return Qnil;
|
@@ -206,27 +245,22 @@ static VALUE vdu_render_frame_cleanup(VALUE self) {
|
|
206
245
|
|
207
246
|
static VALUE vdu_render_frame(VALUE self) {
|
208
247
|
vdu_wrapper_t *vdu;
|
209
|
-
int block_given;
|
210
248
|
Data_Get_Struct(self, vdu_wrapper_t, vdu);
|
211
|
-
block_given = rb_block_given_p();
|
212
249
|
if (vdu->scanline != NOT_IN_FRAME) {
|
213
250
|
rb_raise(eRenderError, "Already in frame");
|
214
251
|
}
|
252
|
+
if (vdu->surface == Qnil) {
|
253
|
+
alloc_sdl_surface(vdu);
|
254
|
+
}
|
215
255
|
rb_ensure(vdu_render_frame_inner, self, vdu_render_frame_cleanup, self);
|
216
256
|
return vdu->surface;
|
217
257
|
}
|
218
258
|
|
219
|
-
|
259
|
+
static VALUE init_sdl(VALUE self) {
|
220
260
|
VALUE rubysdl_version;
|
221
|
-
rb_require("sdl");
|
222
|
-
|
223
|
-
rb_global_variable(&mSDL);
|
224
261
|
mSDL = rb_const_get(rb_cObject, rb_intern("SDL"));
|
225
|
-
rb_global_variable(&cSurface);
|
226
|
-
cSurface = rb_const_get(mSDL, rb_intern("Surface"));
|
227
262
|
|
228
263
|
rubysdl_version = rb_const_get(mSDL, rb_intern("VERSION"));
|
229
|
-
rb_global_variable(&CREATE_SURFACE_METHOD_NAME);
|
230
264
|
if (!strncmp(StringValueCStr(rubysdl_version), "1.", 2)) {
|
231
265
|
CREATE_SURFACE_METHOD_NAME = ID2SYM(rb_intern("new"));
|
232
266
|
get_rubysdl_surface = get_rubysdl_surface_1_x;
|
@@ -237,6 +271,15 @@ void Init_retrograph(void) {
|
|
237
271
|
rb_raise(rb_eLoadError, "Unrecognized Ruby/SDL version");
|
238
272
|
}
|
239
273
|
|
274
|
+
cSurface = rb_const_get(mSDL, rb_intern("Surface"));
|
275
|
+
rb_define_method(cVDU, "render_frame_sdl", vdu_render_frame, 0);
|
276
|
+
}
|
277
|
+
|
278
|
+
void Init_retrograph(void) {
|
279
|
+
rb_global_variable(&mSDL);
|
280
|
+
rb_global_variable(&cSurface);
|
281
|
+
rb_global_variable(&CREATE_SURFACE_METHOD_NAME);
|
282
|
+
|
240
283
|
rb_global_variable(&mRetrograph);
|
241
284
|
mRetrograph = rb_define_module("Retrograph");
|
242
285
|
|
@@ -260,6 +303,11 @@ void Init_retrograph(void) {
|
|
260
303
|
|
261
304
|
#undef DEFINE_CONSTANT
|
262
305
|
|
306
|
+
rb_const_set(mRetrograph, rb_intern("OUTPUT_WIDTH"),
|
307
|
+
INT2FIX(RETROGRAPH_DISPLAY_WIDTH * UPSCALE_FACTOR));
|
308
|
+
rb_const_set(mRetrograph, rb_intern("OUTPUT_HEIGHT"),
|
309
|
+
INT2FIX(RETROGRAPH_DISPLAY_HEIGHT * UPSCALE_FACTOR));
|
310
|
+
|
263
311
|
rb_global_variable(&cVDU);
|
264
312
|
cVDU = rb_define_class_under(mRetrograph, "VDU", rb_cObject);
|
265
313
|
|
@@ -269,7 +317,8 @@ void Init_retrograph(void) {
|
|
269
317
|
|
270
318
|
rb_define_alloc_func(cVDU, alloc_vdu);
|
271
319
|
rb_define_method(cVDU, "write", vdu_write, 2);
|
272
|
-
rb_define_method(cVDU, "
|
273
|
-
rb_define_method(cVDU, "
|
274
|
-
|
320
|
+
rb_define_method(cVDU, "write_byte", vdu_write_byte, 2);
|
321
|
+
rb_define_method(cVDU, "wait_scanlines", vdu_render_scanlines, 1);
|
322
|
+
|
323
|
+
rb_define_singleton_method(mRetrograph, "_init_sdl", init_sdl, 0);
|
275
324
|
}
|
@@ -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'
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/spec/retrograph_spec.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
|
-
require 'sdl'
|
2
|
-
require 'retrograph'
|
1
|
+
require 'retrograph/sdl'
|
3
2
|
|
4
3
|
describe Retrograph do
|
5
4
|
constants = [
|
6
5
|
[:DISPLAY_WIDTH, 256],
|
7
6
|
[:DISPLAY_HEIGHT, 224],
|
7
|
+
[:OUTPUT_WIDTH, 512],
|
8
|
+
[:OUTPUT_HEIGHT, 448],
|
8
9
|
[:BYTES_PER_PIXEL, 4],
|
9
10
|
[:BITS_PER_PIXEL, 32],
|
10
11
|
[:RED_SHIFT, 16],
|
@@ -69,16 +70,16 @@ module ImageTests
|
|
69
70
|
for offset, data in writes
|
70
71
|
vdu.write(offset, data)
|
71
72
|
end
|
72
|
-
output_image = vdu.
|
73
|
+
output_image = vdu.render_frame_sdl
|
73
74
|
output_file = image_file.sub(/\.[^.]*$/, '-output.bmp')
|
74
75
|
output_image.save_bmp(output_file)
|
75
76
|
|
76
77
|
raw_image = SDL::Surface.load(image_file)
|
77
78
|
raw_image.set_alpha(0, SDL::ALPHA_OPAQUE)
|
78
79
|
raw_image.set_color_key(0, 0)
|
79
|
-
reference_image = SDL::Surface.new(0,
|
80
|
+
reference_image = SDL::Surface.new(0, raw_image.w, raw_image.h, 32,
|
80
81
|
RMASK, GMASK, BMASK, AMASK)
|
81
|
-
SDL::Surface.blit(raw_image, 0, 0,
|
82
|
+
SDL::Surface.blit(raw_image, 0, 0, 0, 0, reference_image, 0, 0)
|
82
83
|
raw_image = nil
|
83
84
|
if output_image.pixels != reference_image.pixels
|
84
85
|
raise "Output does not match."
|
@@ -92,12 +93,12 @@ describe Retrograph::VDU do
|
|
92
93
|
@vdu = Retrograph::VDU.new
|
93
94
|
end
|
94
95
|
|
95
|
-
it "should
|
96
|
-
surface = @vdu.
|
96
|
+
it "should render to a surface with the right characteristics" do
|
97
|
+
surface = @vdu.render_frame_sdl
|
97
98
|
surface.should be_an_instance_of(SDL::Surface)
|
98
99
|
surface.flags.should == 0
|
99
|
-
surface.w.should == Retrograph::
|
100
|
-
surface.h.should == Retrograph::
|
100
|
+
surface.w.should == Retrograph::OUTPUT_WIDTH
|
101
|
+
surface.h.should == Retrograph::OUTPUT_HEIGHT
|
101
102
|
surface.bpp.should == Retrograph::BITS_PER_PIXEL
|
102
103
|
surface.Rmask.should == Retrograph::RED_MASK
|
103
104
|
surface.Gmask.should == Retrograph::GREEN_MASK
|
@@ -105,29 +106,29 @@ describe Retrograph::VDU do
|
|
105
106
|
surface.Amask.should == Retrograph::ALPHA_MASK
|
106
107
|
end
|
107
108
|
|
108
|
-
it "should
|
109
|
-
|
110
|
-
output.should == @vdu.surface
|
109
|
+
it "should have a write method which takes an offset and a byte string" do
|
110
|
+
@vdu.write(0x0001, "foobar")
|
111
111
|
end
|
112
112
|
|
113
|
-
it "should
|
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
|
114
118
|
lambda {
|
115
|
-
@vdu.
|
119
|
+
@vdu.render_frame_sdl { @vdu.render_frame_sdl }
|
116
120
|
}.should raise_error(Retrograph::RenderError, "Already in frame")
|
117
121
|
end
|
118
122
|
|
119
|
-
it "should
|
120
|
-
|
121
|
-
@vdu.render_scanlines(30)
|
122
|
-
}.should raise_error(Retrograph::RenderError, "Not in frame")
|
123
|
+
it "should allow naked calls to #wait_scanlines (as a noop)" do
|
124
|
+
@vdu.wait_scanlines(30)
|
123
125
|
end
|
124
126
|
|
125
|
-
it "should allow calls to #
|
126
|
-
@vdu.
|
127
|
+
it "should allow calls to #wait_scanlines within a frame" do
|
128
|
+
@vdu.render_frame_sdl { @vdu.wait_scanlines(30) }
|
127
129
|
end
|
128
130
|
|
129
131
|
extend ImageTests
|
130
|
-
spec_dir = File.join(File.split(__FILE__).first,
|
131
|
-
'image-specs')
|
132
|
+
spec_dir = File.join(File.split(__FILE__).first, 'image-specs')
|
132
133
|
build_image_specs(spec_dir)
|
133
134
|
end
|
data/src/retrograph.c
CHANGED
@@ -91,9 +91,9 @@ struct retrograph_vdu_tag {
|
|
91
91
|
uint8_t bg_scroll_y;
|
92
92
|
|
93
93
|
unsigned current_scanline;
|
94
|
-
|
94
|
+
retrograph_pixel_t palette_cache[32];
|
95
95
|
/* +16 to accomodate double-width sprites */
|
96
|
-
|
96
|
+
retrograph_pixel_t row_buffer[RETROGRAPH_DISPLAY_WIDTH + 16];
|
97
97
|
};
|
98
98
|
|
99
99
|
static retrograph_error_t no_memory_error = RETROGRAPH_NO_MEMORY;
|
@@ -283,7 +283,9 @@ static void update_palette_cache(retrograph_vdu_t vdu) {
|
|
283
283
|
}
|
284
284
|
}
|
285
285
|
|
286
|
-
static void clear_row_buffer(
|
286
|
+
static void clear_row_buffer(retrograph_pixel_t * const out_buffer,
|
287
|
+
retrograph_pixel_t const color)
|
288
|
+
{
|
287
289
|
int i;
|
288
290
|
for (i = 0; i < RETROGRAPH_DISPLAY_WIDTH; i++) {
|
289
291
|
out_buffer[i] = color;
|
@@ -291,14 +293,14 @@ static void clear_row_buffer(uint32_t * const out_buffer, uint32_t const color)
|
|
291
293
|
}
|
292
294
|
|
293
295
|
#define DEFINE_RENDER_CHAR(width) \
|
294
|
-
static inline void render_char ## width(
|
296
|
+
static inline void render_char ## width(retrograph_pixel_t * const out_buffer, \
|
295
297
|
uint8_t const c, \
|
296
298
|
uint8_t const attrs, \
|
297
299
|
uint8_t const * const patterns, \
|
298
|
-
|
300
|
+
retrograph_pixel_t const * const palette) \
|
299
301
|
{ \
|
300
302
|
uint8_t pattern_row; \
|
301
|
-
|
303
|
+
retrograph_pixel_t colors[2]; \
|
302
304
|
int i; \
|
303
305
|
colors[1] = palette[attrs % 16]; \
|
304
306
|
colors[0] = palette[attrs / 16]; \
|
@@ -312,9 +314,9 @@ static inline void render_char ## width(uint32_t * const out_buffer, \
|
|
312
314
|
DEFINE_RENDER_CHAR(6)
|
313
315
|
DEFINE_RENDER_CHAR(8)
|
314
316
|
|
315
|
-
static void render_line_text_a(
|
317
|
+
static void render_line_text_a(retrograph_pixel_t *out_buffer, uint8_t const *names,
|
316
318
|
uint8_t y_fine, uint8_t const *patterns,
|
317
|
-
|
319
|
+
retrograph_pixel_t const *palette, char enable_bg)
|
318
320
|
{
|
319
321
|
int i;
|
320
322
|
|
@@ -333,9 +335,9 @@ static void render_line_text_a(uint32_t *out_buffer, uint8_t const *names,
|
|
333
335
|
}
|
334
336
|
}
|
335
337
|
|
336
|
-
static void render_line_text_b(
|
338
|
+
static void render_line_text_b(retrograph_pixel_t *out_buffer, uint8_t const *names,
|
337
339
|
uint8_t y_fine, uint8_t const *patterns,
|
338
|
-
|
340
|
+
retrograph_pixel_t const *palette, char enable_bg)
|
339
341
|
{
|
340
342
|
int i;
|
341
343
|
if (enable_bg) {
|
@@ -361,10 +363,10 @@ static inline uint32_t unpack_uint32(uint8_t const * const bytes) {
|
|
361
363
|
out_buffer[i*2+1] = palette[color | base_color]
|
362
364
|
|
363
365
|
#define DEFINE_RENDER_TILE(bpp, suffix, RENDER_PIXEL, row_type, unpack_row) \
|
364
|
-
static inline void render_ ## suffix ## bpp(
|
366
|
+
static inline void render_ ## suffix ## bpp(retrograph_pixel_t *out_buffer, \
|
365
367
|
uint16_t cell, \
|
366
368
|
uint8_t const *vflip_patterns[2], \
|
367
|
-
|
369
|
+
retrograph_pixel_t const *palette) \
|
368
370
|
{ \
|
369
371
|
row_type pattern_row; \
|
370
372
|
uint8_t base_color; \
|
@@ -405,12 +407,12 @@ DEFINE_RENDER_TILE(4, tile, RENDER_SINGLE_PIXEL, uint32_t, unpack_uint32)
|
|
405
407
|
DEFINE_RENDER_TILE(4, tile_double, RENDER_DOUBLE_PIXEL, uint32_t, unpack_uint32)
|
406
408
|
|
407
409
|
#define DEFINE_RENDER_BG_LINE(bpp) \
|
408
|
-
static void render_bg_line ## bpp(
|
410
|
+
static void render_bg_line ## bpp(retrograph_pixel_t *out_buffer, \
|
409
411
|
uint8_t x_coarse, uint8_t x_fine, \
|
410
412
|
uint8_t const *names, \
|
411
413
|
uint8_t const *vflip_patterns[2], \
|
412
414
|
uint16_t toggle_bits, \
|
413
|
-
|
415
|
+
retrograph_pixel_t const *palette) \
|
414
416
|
{ \
|
415
417
|
int i; \
|
416
418
|
uint8_t const *name_cursor; \
|
@@ -457,10 +459,10 @@ static inline unsigned compute_sprite_line(uint8_t row, uint8_t const *sprite) {
|
|
457
459
|
return sprite_line;
|
458
460
|
}
|
459
461
|
|
460
|
-
static void render_sprites_line(
|
462
|
+
static void render_sprites_line(retrograph_pixel_t *out_buffer, uint8_t row,
|
461
463
|
uint8_t const *sprites,
|
462
464
|
uint8_t const *patterns,
|
463
|
-
|
465
|
+
retrograph_pixel_t const *palette)
|
464
466
|
{
|
465
467
|
unsigned sprite_lines[MAX_SPRITES];
|
466
468
|
int i, n_sprites;
|
@@ -509,14 +511,14 @@ static void render_sprites_line(uint32_t *out_buffer, uint8_t row,
|
|
509
511
|
}
|
510
512
|
}
|
511
513
|
|
512
|
-
static void render_line_graphics_a(
|
514
|
+
static void render_line_graphics_a(retrograph_pixel_t *out_buffer,
|
513
515
|
uint8_t const * const names,
|
514
516
|
uint8_t x_coarse, uint8_t x_fine,
|
515
517
|
uint8_t y_fine, uint8_t row,
|
516
518
|
uint8_t const *patterns,
|
517
519
|
retrograph_addr_t pattern_base,
|
518
520
|
uint8_t const *sprites,
|
519
|
-
|
521
|
+
retrograph_pixel_t const *palette,
|
520
522
|
char enable_bg, char enable_sprites)
|
521
523
|
{
|
522
524
|
uint8_t const *vflip_patterns[2];
|
@@ -540,13 +542,13 @@ static void render_line_graphics_a(uint32_t *out_buffer,
|
|
540
542
|
}
|
541
543
|
}
|
542
544
|
|
543
|
-
static void render_line_graphics_b(
|
545
|
+
static void render_line_graphics_b(retrograph_pixel_t *out_buffer, uint8_t const *names,
|
544
546
|
uint8_t x_coarse, uint8_t x_fine,
|
545
547
|
uint8_t y_fine, uint8_t row,
|
546
548
|
uint8_t const *patterns,
|
547
549
|
retrograph_addr_t pattern_base,
|
548
550
|
uint8_t const *sprites,
|
549
|
-
|
551
|
+
retrograph_pixel_t const *palette,
|
550
552
|
char enable_bg, char enable_sprites)
|
551
553
|
{
|
552
554
|
uint8_t const *vflip_patterns[2];
|
data/src/retrograph.h
CHANGED
@@ -29,7 +29,8 @@
|
|
29
29
|
#define RETROGRAPH_DISPLAY_WIDTH 256
|
30
30
|
#define RETROGRAPH_DISPLAY_HEIGHT 224
|
31
31
|
|
32
|
-
|
32
|
+
typedef uint32_t retrograph_pixel_t;
|
33
|
+
#define RETROGRAPH_BYTES_PER_PIXEL sizeof(retrograph_pixel_t)
|
33
34
|
#define RETROGRAPH_BITS_PER_PIXEL (RETROGRAPH_BYTES_PER_PIXEL * 8)
|
34
35
|
|
35
36
|
#define RETROGRAPH_RED_SHIFT 16
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: retrograph
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: "0.5"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- MenTaLguY <mental@rydia.net>
|
@@ -9,37 +9,32 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-07-24 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
|
-
dependencies:
|
15
|
-
|
16
|
-
name: rubysdl
|
17
|
-
type: :runtime
|
18
|
-
version_requirement:
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">="
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 1.3.0
|
24
|
-
version:
|
14
|
+
dependencies: []
|
15
|
+
|
25
16
|
description: |
|
26
|
-
Retrograph is a software scanline renderer which simulates a late-era 8-bit
|
27
|
-
Its graphical capabilities are similar to those of the Sega Master
|
17
|
+
Retrograph is a software scanline renderer which simulates a late-era 8-bit
|
18
|
+
display. Its graphical capabilities are similar to those of the Sega Master
|
19
|
+
System.
|
28
20
|
|
29
21
|
email: mental@rydia.net
|
30
22
|
executables: []
|
31
23
|
|
32
24
|
extensions:
|
33
|
-
- ext/extconf.rb
|
25
|
+
- ext/retrograph/extconf.rb
|
34
26
|
extra_rdoc_files: []
|
35
27
|
|
36
28
|
files:
|
37
29
|
- Rakefile
|
38
30
|
- README
|
31
|
+
- COPYING
|
39
32
|
- src/retrograph.h
|
40
33
|
- src/retrograph.c
|
41
|
-
-
|
42
|
-
-
|
34
|
+
- lib/retrograph.rb
|
35
|
+
- lib/retrograph/sdl.rb
|
36
|
+
- ext/retrograph/extconf.rb
|
37
|
+
- ext/retrograph/retrograph.c
|
43
38
|
- spec/retrograph_spec.rb
|
44
39
|
- spec/image-specs/sprites-doubling.case
|
45
40
|
- spec/image-specs/text-colors.case
|
@@ -79,7 +74,7 @@ post_install_message:
|
|
79
74
|
rdoc_options: []
|
80
75
|
|
81
76
|
require_paths:
|
82
|
-
-
|
77
|
+
- lib
|
83
78
|
required_ruby_version: !ruby/object:Gem::Requirement
|
84
79
|
requirements:
|
85
80
|
- - ">="
|
data/ext/extconf.rb
DELETED