texplay 0.3.1 → 0.3.3pre2
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/.gemtest +0 -0
- data/Rakefile +37 -13
- data/ext/texplay/graphics_utils.c +95 -26
- data/ext/texplay/texplay.h +62 -57
- data/lib/texplay-contrib.rb +111 -118
- data/lib/texplay.rb +36 -14
- data/lib/texplay/alone.rb +20 -0
- data/lib/texplay/c_function_docs.rb +3 -2
- data/lib/texplay/version.rb +1 -1
- data/live/live.rb +85 -0
- data/test/image_spec.rb +45 -0
- data/test/texplay_spec.rb +141 -0
- metadata +36 -13
- data/spec/image_spec.rb +0 -7
- data/spec/texplay_spec.rb +0 -80
data/lib/texplay.rb
CHANGED
@@ -4,7 +4,6 @@
|
|
4
4
|
direc = File.expand_path(File.dirname(__FILE__))
|
5
5
|
|
6
6
|
# include gosu first
|
7
|
-
require 'rbconfig'
|
8
7
|
require 'gosu'
|
9
8
|
require "#{direc}/texplay/version"
|
10
9
|
|
@@ -14,13 +13,12 @@ module TexPlay
|
|
14
13
|
class << self
|
15
14
|
def on_setup(&block)
|
16
15
|
raise "need a block" if !block
|
17
|
-
|
18
16
|
@__init_procs__ ||= []
|
19
17
|
@__init_procs__.push(block)
|
20
18
|
end
|
21
19
|
|
22
20
|
def setup(receiver)
|
23
|
-
if @__init_procs__
|
21
|
+
if @__init_procs__
|
24
22
|
@__init_procs__.each do |init_proc|
|
25
23
|
receiver.instance_eval(&init_proc)
|
26
24
|
end
|
@@ -36,7 +34,12 @@ module TexPlay
|
|
36
34
|
raise ArgumentError, "Height and width must be positive" if height <= 0 or width <= 0
|
37
35
|
|
38
36
|
img = Gosu::Image.new(window, EmptyImageStub.new(width, height), :caching => options[:caching])
|
39
|
-
|
37
|
+
|
38
|
+
# this should be a major speedup (avoids both a cache and a sync
|
39
|
+
# if color is alpha (default)
|
40
|
+
if options[:color] != :alpha
|
41
|
+
img.rect 0, 0, img.width - 1, img.height - 1, :color => options[:color], :fill => true
|
42
|
+
end
|
40
43
|
|
41
44
|
img
|
42
45
|
end
|
@@ -46,7 +49,7 @@ module TexPlay
|
|
46
49
|
# Image can be :tileable, but it will break if it is tileable AND gets modified after creation.
|
47
50
|
def from_blob(window, blob_data, width, height, options={})
|
48
51
|
options = {
|
49
|
-
:caching =>
|
52
|
+
:caching => false,
|
50
53
|
:tileable => false,
|
51
54
|
}.merge!(options)
|
52
55
|
|
@@ -71,7 +74,7 @@ module TexPlay
|
|
71
74
|
# default values defined here
|
72
75
|
def set_defaults
|
73
76
|
@options = {
|
74
|
-
:caching =>
|
77
|
+
:caching => :lazy
|
75
78
|
}
|
76
79
|
end
|
77
80
|
|
@@ -121,6 +124,7 @@ module TexPlay
|
|
121
124
|
#
|
122
125
|
# This object duck-types an RMagick image (#rows, #columns, #to_blob), so that Gosu will import it.
|
123
126
|
class ImageStub
|
127
|
+
|
124
128
|
# @return [Integer]
|
125
129
|
attr_reader :rows, :columns
|
126
130
|
|
@@ -153,14 +157,15 @@ module TexPlay
|
|
153
157
|
end
|
154
158
|
|
155
159
|
# bring in user-defined extensions to TexPlay
|
156
|
-
dlext = Config::CONFIG['DLEXT']
|
157
160
|
begin
|
158
161
|
if RUBY_VERSION && RUBY_VERSION =~ /1.9/
|
159
|
-
require "#{direc}/1.9/texplay
|
162
|
+
require "#{direc}/1.9/texplay"
|
160
163
|
else
|
161
|
-
require "#{direc}/1.8/texplay
|
164
|
+
require "#{direc}/1.8/texplay"
|
162
165
|
end
|
163
166
|
rescue LoadError => e
|
167
|
+
require 'rbconfig'
|
168
|
+
dlext = Config::CONFIG['DLEXT']
|
164
169
|
require "#{direc}/texplay.#{dlext}"
|
165
170
|
end
|
166
171
|
|
@@ -203,16 +208,33 @@ module Gosu
|
|
203
208
|
options = {
|
204
209
|
:caching => TexPlay.get_options[:caching]
|
205
210
|
}.merge!(options)
|
206
|
-
|
207
|
-
|
211
|
+
|
212
|
+
caching_mode = options[:caching]
|
213
|
+
|
214
|
+
# we can't manipulate large images, so skip them.
|
208
215
|
if obj.width <= (TexPlay::TP_MAX_QUAD_SIZE) &&
|
209
|
-
obj.height <= (TexPlay::TP_MAX_QUAD_SIZE)
|
210
|
-
|
216
|
+
obj.height <= (TexPlay::TP_MAX_QUAD_SIZE)
|
217
|
+
|
218
|
+
if caching_mode
|
219
|
+
if caching_mode == :lazy
|
220
|
+
|
221
|
+
# only cache if quad already cached (to refresh old data)
|
222
|
+
# otherwise cache lazily at point of first TexPlay call
|
223
|
+
obj.refresh_cache if obj.quad_cached?
|
224
|
+
|
225
|
+
else
|
226
|
+
|
227
|
+
# force a cache - this obviates the need for a
|
228
|
+
# potentialy expensive runtime cache of the image by
|
229
|
+
# moving the cache to load-time
|
230
|
+
obj.refresh_cache
|
231
|
+
end
|
232
|
+
end
|
211
233
|
end
|
212
234
|
|
213
235
|
# run custom setup
|
214
236
|
TexPlay.setup(obj)
|
215
|
-
|
237
|
+
|
216
238
|
obj.instance_variable_set(:@__window__, window)
|
217
239
|
|
218
240
|
obj
|
@@ -0,0 +1,20 @@
|
|
1
|
+
direc = File.dirname(__FILE__)
|
2
|
+
|
3
|
+
require "#{direc}/../texplay"
|
4
|
+
|
5
|
+
module TexPlay
|
6
|
+
Win = Gosu::Window.new(0, 0, false)
|
7
|
+
|
8
|
+
set_options :sync_mode => :no_sync
|
9
|
+
|
10
|
+
class << self
|
11
|
+
def load(name)
|
12
|
+
Gosu::Image.new(Win, name)
|
13
|
+
end
|
14
|
+
|
15
|
+
alias_method :original_create_image, :create_image
|
16
|
+
def create_image(width, height, options={})
|
17
|
+
original_create_image(Win, width, height, options)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- coding: iso-8859-1 -*-
|
1
2
|
# This code is never run; it is just here so we can document the C functions.
|
2
3
|
|
3
4
|
|
@@ -44,7 +45,7 @@ module TexPlay
|
|
44
45
|
def each(&block)
|
45
46
|
end
|
46
47
|
|
47
|
-
# Fill at a given position.
|
48
|
+
# Perform a Flood Fill at a given position.
|
48
49
|
#
|
49
50
|
# @param [Number] x
|
50
51
|
# @param [Number] y
|
@@ -186,4 +187,4 @@ module TexPlay
|
|
186
187
|
# @return [String] Raw binary data (blob) in RGBA byte order.
|
187
188
|
def to_blob
|
188
189
|
end
|
189
|
-
end
|
190
|
+
end
|
data/lib/texplay/version.rb
CHANGED
data/live/live.rb
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
direc = File.dirname(__FILE__)
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require "#{direc}/../lib/texplay"
|
5
|
+
require 'pry'
|
6
|
+
|
7
|
+
WIDTH = 640
|
8
|
+
HEIGHT = 480
|
9
|
+
|
10
|
+
class Gosu::Image
|
11
|
+
attr_accessor :x, :y
|
12
|
+
|
13
|
+
alias_method :orig_init, :initialize
|
14
|
+
def initialize(*args)
|
15
|
+
@x = WIDTH / 2
|
16
|
+
@y = HEIGHT / 2
|
17
|
+
orig_init(*args)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class WinClass < Gosu::Window
|
22
|
+
|
23
|
+
class View
|
24
|
+
attr_accessor :zoom, :rotate
|
25
|
+
|
26
|
+
def initialize
|
27
|
+
@zoom = 1
|
28
|
+
@rotate = 0
|
29
|
+
end
|
30
|
+
|
31
|
+
def reset
|
32
|
+
@zoom = 1
|
33
|
+
@rotate = 0
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
attr_reader :images, :view
|
38
|
+
|
39
|
+
def initialize
|
40
|
+
super(WIDTH, HEIGHT, false)
|
41
|
+
Gosu.enable_undocumented_retrofication
|
42
|
+
|
43
|
+
@images = []
|
44
|
+
@view = View.new
|
45
|
+
@pry_instance = Pry.new :prompt => [Proc.new { "(live)> " }, Proc.new { "(live)* " }]
|
46
|
+
|
47
|
+
@img = TexPlay.create_image(self, 200, 200)
|
48
|
+
@img.rect 0, 0, @img.width - 1, @img.height - 1
|
49
|
+
|
50
|
+
images << @img
|
51
|
+
@binding = binding
|
52
|
+
end
|
53
|
+
|
54
|
+
def create_image(width, height, options={})
|
55
|
+
TexPlay.create_image(self, width, height, options)
|
56
|
+
end
|
57
|
+
|
58
|
+
def load_image(file)
|
59
|
+
Gosu::Image.new(self, file)
|
60
|
+
end
|
61
|
+
|
62
|
+
def show_image(image)
|
63
|
+
images << image
|
64
|
+
end
|
65
|
+
|
66
|
+
def hide_image(image)
|
67
|
+
images.delete(image)
|
68
|
+
end
|
69
|
+
|
70
|
+
def draw
|
71
|
+
images.uniq!
|
72
|
+
images.each do |v|
|
73
|
+
v.draw_rot(v.x, v.y, 1, view.rotate, 0.5, 0.5, view.zoom, view.zoom)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def update
|
78
|
+
@pry_instance.rep(@binding)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
w = WinClass.new
|
83
|
+
|
84
|
+
w.show
|
85
|
+
|
data/test/image_spec.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
direc = File.dirname(__FILE__)
|
2
|
+
|
3
|
+
require "#{direc}/../lib/texplay"
|
4
|
+
|
5
|
+
class Module
|
6
|
+
public :remove_const
|
7
|
+
end
|
8
|
+
|
9
|
+
describe Gosu::Image do
|
10
|
+
before do
|
11
|
+
@window = Gosu::Window.new(640, 480, false)
|
12
|
+
NormalImageSize = [Gosu::MAX_TEXTURE_SIZE - 2, Gosu::MAX_TEXTURE_SIZE - 2]
|
13
|
+
TooLargeImageSize = [2000, 2000]
|
14
|
+
end
|
15
|
+
|
16
|
+
after do
|
17
|
+
Object.remove_const(:NormalImageSize)
|
18
|
+
Object.remove_const(:TooLargeImageSize)
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "Gosu::Image#new (patched by TexPlay)" do
|
22
|
+
describe "caching option" do
|
23
|
+
it "should not cache image if :caching => false" do
|
24
|
+
source_image = TexPlay.create_image(@window, *NormalImageSize)
|
25
|
+
source_image.quad_cached?.should == false
|
26
|
+
|
27
|
+
image = Gosu::Image.new(@window, source_image, :caching => false)
|
28
|
+
image.width.should == NormalImageSize[0]
|
29
|
+
image.height.should == NormalImageSize[1]
|
30
|
+
|
31
|
+
image.quad_cached?.should == false
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should cache the image if :caching => true" do
|
35
|
+
source_image = TexPlay.create_image(@window, *NormalImageSize)
|
36
|
+
|
37
|
+
image = Gosu::Image.new(@window, source_image, :caching => true)
|
38
|
+
image.width.should == NormalImageSize[0]
|
39
|
+
image.height.should == NormalImageSize[1]
|
40
|
+
|
41
|
+
image.quad_cached?.should == true
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
$LOAD_PATH.unshift File.join(File.expand_path(__FILE__), '..', 'lib','texplay')
|
2
|
+
direc = File.dirname(__FILE__)
|
3
|
+
|
4
|
+
require "#{direc}/../lib/texplay"
|
5
|
+
|
6
|
+
describe TexPlay do
|
7
|
+
described_class = TexPlay
|
8
|
+
|
9
|
+
before do
|
10
|
+
@window = Gosu::Window.new(640, 480, false)
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "#create_image" do
|
14
|
+
it "should create a blank image of the correct size" do
|
15
|
+
width, height = 30, 10
|
16
|
+
image = described_class.create_image(@window, width, height)
|
17
|
+
|
18
|
+
image.width.should == width
|
19
|
+
image.height.should == height
|
20
|
+
|
21
|
+
width.times do |x|
|
22
|
+
height.times do |y|
|
23
|
+
image.get_pixel(x, y).should == [0.0, 0.0, 0.0, 0.0]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should create a coloured image of the correct size" do
|
29
|
+
width, height = 10, 30
|
30
|
+
color = [1.0, 1.0, 0.0, 1.0]
|
31
|
+
image = described_class.create_image(@window, width, height, :color => color)
|
32
|
+
|
33
|
+
image.width.should == width
|
34
|
+
image.height.should == height
|
35
|
+
|
36
|
+
width.times do |x|
|
37
|
+
height.times do |y|
|
38
|
+
image.get_pixel(x, y).should == color
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should raise an error if an image dimension is 0 or less" do
|
44
|
+
lambda { described_class.create_image(@window, 0, 0)}.should.raise ArgumentError
|
45
|
+
end
|
46
|
+
|
47
|
+
# TODO: Should probably be an ArgumentError.
|
48
|
+
it "should NOT raise an error if the image would be too large (as uses raw blobs, doesnt use TexPlay at all)" do
|
49
|
+
too_big = TexPlay::TP_MAX_QUAD_SIZE + 1
|
50
|
+
[[too_big, 5], [10, too_big], [too_big, too_big]].each do |width, height|
|
51
|
+
lambda { described_class.create_image(@window, width, height)}.should.not.raise Exception
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "#clear" do
|
57
|
+
it "should clear an image to the correct color" do
|
58
|
+
img = described_class.create_image(@window, 10, 10)
|
59
|
+
img.clear :color => :red
|
60
|
+
(0...img.width).each do |x|
|
61
|
+
(0...img.height).each do |y|
|
62
|
+
img.get_pixel(x,y).should == [1,0,0,1]
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe "#from_blob" do
|
69
|
+
# it "should create an image with the requested pixel data and size" do
|
70
|
+
# # 4 x 3, with columns of red, blue, green, transparent.
|
71
|
+
# gosu_colors = [[255, 0, 0, 255], [0, 255, 0, 255], [0, 0, 255, 255], [0, 0, 0, 0]]
|
72
|
+
# texplay_colors = gosu_colors.map {|a| a.map {|c| c / 255.0 } }
|
73
|
+
# width, height = gosu_colors.size, 3
|
74
|
+
|
75
|
+
# image = described_class.from_blob(@window, (gosu_colors * height).flatten.pack('C*'), width, height)
|
76
|
+
|
77
|
+
# image.width.should == width
|
78
|
+
# image.height.should == height
|
79
|
+
|
80
|
+
# texplay_colors.each_with_index do |color, x|
|
81
|
+
# 3.times do |y|
|
82
|
+
# image.get_pixel(x, y).should == color
|
83
|
+
# end
|
84
|
+
# end
|
85
|
+
# end
|
86
|
+
|
87
|
+
it "should raise an error if the image size is not correct for the blob data" do
|
88
|
+
lambda { described_class.from_blob(@window, [1, 1, 1, 1].pack("C*"), 2, 1) }.should.raise ArgumentError
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should raise an error if an image dimension is 0 or less" do
|
92
|
+
lambda { described_class.from_blob(@window, '', 0, 0) }.should.raise ArgumentError
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe "alpha_blend" do
|
97
|
+
it "should alpha blend using source alpha and not fixing alpha" do
|
98
|
+
img1 = described_class.create_image(@window, 10, 10).clear :color => [1, 0, 0, 1]
|
99
|
+
img1.clear :color => [0, 0, 1, 0.5], :alpha_blend => :source
|
100
|
+
img1.get_pixel(5, 5).should == [0.5, 0, 0.5, 0.75]
|
101
|
+
end
|
102
|
+
|
103
|
+
it "hash params true and :source should be equivalent" do
|
104
|
+
img1 = described_class.create_image(@window, 10, 10).clear :color => [1, 0, 0, 1]
|
105
|
+
img2 = img1.dup
|
106
|
+
img1.clear :color => [0, 0, 1, 0.5], :alpha_blend => :source
|
107
|
+
img2.clear :color => [0, 0, 1, 0.5], :alpha_blend => true
|
108
|
+
|
109
|
+
img1.get_pixel(5, 5).should == [0.5, 0, 0.5, 0.75]
|
110
|
+
img2.get_pixel(5, 5).should == [0.5, 0, 0.5, 0.75]
|
111
|
+
end
|
112
|
+
|
113
|
+
it "false or nil should prevent alpha blending" do
|
114
|
+
img1 = described_class.create_image(@window, 10, 10).clear :color => [1, 0, 0, 1]
|
115
|
+
img2 = img1.dup
|
116
|
+
img1.clear :color => [0, 0, 1, 0.5], :alpha_blend => false
|
117
|
+
img2.clear :color => [0, 0, 1, 0.5], :alpha_blend => nil
|
118
|
+
|
119
|
+
img1.get_pixel(5, 5).should == [0, 0, 1, 0.5]
|
120
|
+
img2.get_pixel(5, 5).should == [0, 0, 1, 0.5]
|
121
|
+
end
|
122
|
+
|
123
|
+
it "should alpha blend using dest alpha and not fixing alpha" do
|
124
|
+
img1 = described_class.create_image(@window, 10, 10).clear :color => [1, 0, 0, 0.5]
|
125
|
+
img1.clear :color => [0, 0, 1, 1], :alpha_blend => :dest
|
126
|
+
img1.get_pixel(5, 5).should == [0.5, 0, 0.5, 0.75]
|
127
|
+
end
|
128
|
+
|
129
|
+
it "should alpha blend using source alpha and fixing alpha" do
|
130
|
+
img1 = described_class.create_image(@window, 10, 10).clear :color => [1, 0, 0, 1]
|
131
|
+
img1.clear :color => [0, 0, 1, 0.5], :alpha_blend => :source_with_fixed_alpha
|
132
|
+
img1.get_pixel(5, 5).should == [0.5, 0, 0.5, 1]
|
133
|
+
end
|
134
|
+
|
135
|
+
it "should alpha blend using dest alpha and fixing alpha" do
|
136
|
+
img1 = described_class.create_image(@window, 10, 10).clear :color => [1, 0, 0, 0.5]
|
137
|
+
img1.clear :color => [0, 0, 1, 1], :alpha_blend => :dest_with_fixed_alpha
|
138
|
+
img1.get_pixel(5, 5).should == [0.5, 0, 0.5, 0.5]
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: texplay
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: -223651707
|
5
|
+
prerelease: 5
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
|
9
|
+
- 3
|
10
|
+
- pre
|
11
|
+
- 2
|
12
|
+
version: 0.3.3pre2
|
11
13
|
platform: ruby
|
12
14
|
authors:
|
13
15
|
- John Mair (banisterfiend)
|
@@ -15,7 +17,7 @@ autorequire:
|
|
15
17
|
bindir: bin
|
16
18
|
cert_chain: []
|
17
19
|
|
18
|
-
date:
|
20
|
+
date: 2011-02-22 00:00:00 +13:00
|
19
21
|
default_executable:
|
20
22
|
dependencies:
|
21
23
|
- !ruby/object:Gem::Dependency
|
@@ -34,6 +36,22 @@ dependencies:
|
|
34
36
|
version: 0.7.25
|
35
37
|
type: :runtime
|
36
38
|
version_requirements: *id001
|
39
|
+
- !ruby/object:Gem::Dependency
|
40
|
+
name: bacon
|
41
|
+
prerelease: false
|
42
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
hash: 19
|
48
|
+
segments:
|
49
|
+
- 1
|
50
|
+
- 1
|
51
|
+
- 0
|
52
|
+
version: 1.1.0
|
53
|
+
type: :development
|
54
|
+
version_requirements: *id002
|
37
55
|
description: TexPlay is a light-weight image manipulation framework for Ruby and Gosu
|
38
56
|
email: jrmair@gmail.com
|
39
57
|
executables: []
|
@@ -46,6 +64,7 @@ files:
|
|
46
64
|
- Rakefile
|
47
65
|
- README.markdown
|
48
66
|
- CHANGELOG
|
67
|
+
- lib/texplay/alone.rb
|
49
68
|
- lib/texplay/c_function_docs.rb
|
50
69
|
- lib/texplay/version.rb
|
51
70
|
- lib/texplay-contrib.rb
|
@@ -122,9 +141,11 @@ files:
|
|
122
141
|
- examples/media/sand1.png
|
123
142
|
- examples/media/sunset.png
|
124
143
|
- examples/media/texplay.png
|
125
|
-
-
|
126
|
-
-
|
127
|
-
|
144
|
+
- test/image_spec.rb
|
145
|
+
- test/texplay_spec.rb
|
146
|
+
- live/live.rb
|
147
|
+
- .gemtest
|
148
|
+
has_rdoc: true
|
128
149
|
homepage: http://banisterfiend.wordpress.com/2008/08/23/texplay-an-image-manipulation-tool-for-ruby-and-gosu/
|
129
150
|
licenses: []
|
130
151
|
|
@@ -145,16 +166,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
145
166
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
146
167
|
none: false
|
147
168
|
requirements:
|
148
|
-
- - "
|
169
|
+
- - ">"
|
149
170
|
- !ruby/object:Gem::Version
|
150
|
-
hash:
|
171
|
+
hash: 25
|
151
172
|
segments:
|
152
|
-
-
|
153
|
-
|
173
|
+
- 1
|
174
|
+
- 3
|
175
|
+
- 1
|
176
|
+
version: 1.3.1
|
154
177
|
requirements: []
|
155
178
|
|
156
179
|
rubyforge_project:
|
157
|
-
rubygems_version: 1.
|
180
|
+
rubygems_version: 1.5.2
|
158
181
|
signing_key:
|
159
182
|
specification_version: 3
|
160
183
|
summary: TexPlay is a light-weight image manipulation framework for Ruby and Gosu
|