devil 0.1.2 → 0.1.6
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/README +16 -8
- data/Rakefile +22 -6
- data/ext/devil/extconf.rb +14 -4
- data/ext/devil/ruby_il.c +91 -26
- data/ext/devil/ruby_ilu.c +33 -0
- data/lib/devil.rb +97 -25
- data/lib/devil/gosu.rb +96 -0
- data/test/tank.png +0 -0
- data/test/test_clone_and_crop.rb +25 -0
- data/test/test_gosu_load.rb +26 -0
- data/test/test_gosu_save.rb +26 -0
- data/test/test_gosu_show.rb +10 -0
- data/test/test_new_api.rb +3 -2
- data/test/test_screenshot.rb +33 -0
- data/test/test_thumbnail.rb +8 -16
- data/test/texture.jpg +0 -0
- data/test/texture.png +0 -0
- metadata +11 -2
data/README
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
Devil version 0.1.
|
1
|
+
Devil version 0.1.6
|
2
|
+
===================
|
2
3
|
|
3
4
|
* Original author: Jaroslaw Tworek <dev.jrx@gmail.com>
|
4
5
|
* Current maintainer: John Mair (banisterfiend) http://banisterfiend.wordpress.com
|
@@ -6,20 +7,27 @@ Devil version 0.1.2
|
|
6
7
|
Ruby bindings for the Developer's Image Library
|
7
8
|
You need DevIL installed to build this extension
|
8
9
|
|
10
|
+
Installation Instructions:
|
11
|
+
==========================
|
12
|
+
|
9
13
|
For debian:
|
10
14
|
* install the libdevil and libdevil-dev packages
|
11
15
|
|
12
|
-
|
13
|
-
http://openil.sourceforge.net
|
14
|
-
|
15
|
-
It's also worth having Ruby OpenGL bindings to use the extensions.
|
16
|
+
For windows:
|
17
|
+
* download devil.dll and ilu.dll from here http://openil.sourceforge.net
|
18
|
+
* and copy devil.dll and ilu.dll to c:\windows\system\
|
16
19
|
|
17
|
-
|
20
|
+
For other systems:
|
21
|
+
* install libdevil and lib-devil-dev using your package manager
|
22
|
+
* OR download and install the libraries from http://openil.sourceforge.net
|
18
23
|
|
19
|
-
|
24
|
+
If you wish to use the Gosu and TexPlay extensions, it is necessary to also have:
|
25
|
+
* the Gosu gem (gem install gosu)
|
26
|
+
* the TexPlay gem (gem install texplay)
|
27
|
+
* ruby-opengl (gem install ruby-opengl)
|
20
28
|
|
21
29
|
For now, there is support for just a subset of DevIL functions, but it is enough
|
22
30
|
for 95% things you may want to do.
|
23
31
|
|
24
32
|
For example uses, see test/ directory
|
25
|
-
|
33
|
+
(note: that many of the examples use the Gosu library...this is often just for visualization purposes. Alot of the functionality does not depend on Gosu being present)
|
data/Rakefile
CHANGED
@@ -4,7 +4,7 @@ require 'rake/gempackagetask'
|
|
4
4
|
require 'rake/testtask'
|
5
5
|
require 'rake/rdoctask'
|
6
6
|
|
7
|
-
DEVIL_VERSION = "0.1.
|
7
|
+
DEVIL_VERSION = "0.1.6"
|
8
8
|
|
9
9
|
dlext = Config::CONFIG['DLEXT']
|
10
10
|
|
@@ -21,13 +21,27 @@ spec = Gem::Specification.new do |s|
|
|
21
21
|
s.date = Time.now.strftime '%Y-%m-%d'
|
22
22
|
s.require_path = 'lib'
|
23
23
|
s.homepage = "http://banisterfiend.wordpress.com"
|
24
|
-
|
25
|
-
|
24
|
+
|
25
|
+
if RUBY_PLATFORM =~ /win/
|
26
|
+
s.platform = Gem::Platform::CURRENT
|
27
|
+
else
|
28
|
+
s.platform = Gem::Platform::RUBY
|
29
|
+
end
|
30
|
+
|
31
|
+
if RUBY_PLATFORM !~ /win/
|
32
|
+
s.extensions = FileList["ext/**/extconf.rb"]
|
33
|
+
end
|
34
|
+
|
26
35
|
s.has_rdoc = true
|
27
36
|
s.extra_rdoc_files = ["README"]
|
28
37
|
s.rdoc_options << '--main' << 'README'
|
29
|
-
s.files = ["Rakefile", "README", "LICENSE", "lib/devil.rb"] +
|
30
|
-
FileList["ext/**/extconf.rb", "ext/**/*.h", "ext/**/*.c", "test/test*.rb"].to_a
|
38
|
+
s.files = ["Rakefile", "README", "LICENSE", "lib/devil.rb", "lib/devil/gosu.rb"] +
|
39
|
+
FileList["ext/**/extconf.rb", "ext/**/*.h", "ext/**/*.c", "test/test*.rb", "test/*.png", "test/*.jpg"].to_a
|
40
|
+
|
41
|
+
if RUBY_PLATFORM =~ /win/
|
42
|
+
s.files += ["lib/1.8/devil.so", "lib/1.9/devil.so"]
|
43
|
+
end
|
44
|
+
|
31
45
|
end
|
32
46
|
|
33
47
|
Rake::GemPackageTask.new(spec) do |pkg|
|
@@ -35,6 +49,8 @@ Rake::GemPackageTask.new(spec) do |pkg|
|
|
35
49
|
pkg.need_tar = false
|
36
50
|
end
|
37
51
|
|
52
|
+
task :compile => :clean
|
53
|
+
|
38
54
|
Rake::ExtensionTask.new('devil', spec) do |ext|
|
39
55
|
ext.config_script = 'extconf.rb'
|
40
56
|
ext.cross_compile = true
|
@@ -49,6 +65,6 @@ end
|
|
49
65
|
|
50
66
|
Rake::RDocTask.new do |rd|
|
51
67
|
rd.main = "README"
|
52
|
-
rd.rdoc_files.include("README", "lib/devil.rb")
|
68
|
+
rd.rdoc_files.include("README", "lib/devil.rb", "lib/devil/gosu.rb")
|
53
69
|
end
|
54
70
|
|
data/ext/devil/extconf.rb
CHANGED
@@ -1,9 +1,19 @@
|
|
1
1
|
require 'mkmf'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
if RUBY_PLATFORM =~ /mingw/
|
4
|
+
$CFLAGS += ' -I/home/john/.rake-compiler/ruby/ruby-1.8.6-p287/include/'
|
5
|
+
$LDFLAGS += ' -L/home/john/.rake-compiler/ruby/ruby-1.8.6-p287/lib/'
|
6
|
+
end
|
7
|
+
|
8
|
+
puts "platform is #{RUBY_PLATFORM}"
|
9
|
+
if RUBY_PLATFORM =~ /win/ || RUBY_PLATFORM =~ /mingw/
|
10
|
+
exit unless have_library("DevIL");
|
11
|
+
else
|
12
|
+
exit unless have_library("IL");
|
13
|
+
end
|
14
|
+
|
15
|
+
exit unless have_library("ILU");
|
16
|
+
|
7
17
|
#have_library("ILUT", "ilutInit");
|
8
18
|
|
9
19
|
create_makefile('devil')
|
data/ext/devil/ruby_il.c
CHANGED
@@ -131,28 +131,28 @@ static VALUE il_GetData(VALUE obj) {
|
|
131
131
|
return MakeImageData(data);
|
132
132
|
}
|
133
133
|
|
134
|
-
ILuint ilCopyPixels(ILuint XOff, ILuint YOff, ILuint ZOff, ILuint Width,
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
static VALUE il_CopyPixels(VALUE obj, VALUE rb_XOff, VALUE rb_YOff, VALUE rb_ZOff,
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
}
|
134
|
+
/* ILuint ilCopyPixels(ILuint XOff, ILuint YOff, ILuint ZOff, ILuint Width, */
|
135
|
+
/* /\* changed from ILvoid *\/ */
|
136
|
+
/* ILuint Height, ILuint Depth, ILenum Format, ILenum Type, void */
|
137
|
+
/* *Data); */
|
138
|
+
|
139
|
+
/* static VALUE il_CopyPixels(VALUE obj, VALUE rb_XOff, VALUE rb_YOff, VALUE rb_ZOff, */
|
140
|
+
/* VALUE rb_Width, VALUE rb_Height, VALUE rb_Depth, VALUE rb_Format, */
|
141
|
+
/* VALUE rb_Type, VALUE rb_data) { */
|
142
|
+
/* ILuint XOff = NUM2INT(rb_XOff); */
|
143
|
+
/* ILuint YOff = NUM2INT(rb_YOff); */
|
144
|
+
/* ILuint ZOff = NUM2INT(rb_ZOff); */
|
145
|
+
/* ILuint Width = NUM2INT(rb_Width); */
|
146
|
+
/* ILuint Height = NUM2INT(rb_Height); */
|
147
|
+
/* ILuint Depth = NUM2INT(rb_Depth); */
|
148
|
+
/* ILenum Format = NUM2INT(rb_Format); */
|
149
|
+
/* ILenum Type = NUM2INT(rb_Type); */
|
150
|
+
/* /\* ILvoid *\/ */
|
151
|
+
/* void* data = ImageData2Arr(rb_data); */
|
152
|
+
|
153
|
+
/* ILuint uint = ilCopyPixels(XOff, YOff, ZOff, Width, Height, Depth, Format, Type, data); */
|
154
|
+
/* return INT2FIX(uint); */
|
155
|
+
/* } */
|
156
156
|
|
157
157
|
static VALUE il_SetData(VALUE obj, VALUE rb_Data) {
|
158
158
|
/* ILvoid */
|
@@ -234,7 +234,7 @@ static VALUE il_ActiveImage(VALUE obj, VALUE rb_Number){
|
|
234
234
|
return flag ? Qtrue : Qfalse;
|
235
235
|
}
|
236
236
|
|
237
|
-
/* added by banisterfiend */
|
237
|
+
/* methods below added by banisterfiend */
|
238
238
|
static VALUE il_Enable(VALUE obj, VALUE rb_mode) {
|
239
239
|
ILenum mode = NUM2INT(rb_mode);
|
240
240
|
|
@@ -248,6 +248,60 @@ static VALUE il_GetInteger(VALUE obj, VALUE rb_mode) {
|
|
248
248
|
ILint result = ilGetInteger(mode);
|
249
249
|
return INT2NUM(result);
|
250
250
|
}
|
251
|
+
|
252
|
+
static VALUE il_ConvertImage(VALUE obj, VALUE rb_destformat, VALUE rb_desttype)
|
253
|
+
{
|
254
|
+
ILenum destformat = NUM2INT(rb_destformat);
|
255
|
+
ILenum desttype = NUM2INT(rb_desttype);
|
256
|
+
|
257
|
+
ILboolean flag = ilConvertImage(destformat, desttype);
|
258
|
+
return flag ? Qtrue : Qfalse;
|
259
|
+
}
|
260
|
+
|
261
|
+
/* this function is not actualy in the DevIL API, but im adding it here for convenience */
|
262
|
+
static VALUE bf_ToBlob(VALUE obj)
|
263
|
+
{
|
264
|
+
ILuint width, height;
|
265
|
+
char * img_ptr;
|
266
|
+
VALUE blob;
|
267
|
+
|
268
|
+
ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE);
|
269
|
+
|
270
|
+
width = ilGetInteger(IL_IMAGE_WIDTH);
|
271
|
+
height = ilGetInteger(IL_IMAGE_HEIGHT);
|
272
|
+
|
273
|
+
img_ptr = (char *)ilGetData();
|
274
|
+
|
275
|
+
blob = rb_str_new(img_ptr, 4 * width * height);
|
276
|
+
|
277
|
+
return blob;
|
278
|
+
}
|
279
|
+
|
280
|
+
static VALUE bf_FromBlob(VALUE obj, VALUE blob, VALUE rb_width, VALUE rb_height)
|
281
|
+
{
|
282
|
+
ILubyte * data;
|
283
|
+
ILuint width, height;
|
284
|
+
ILuint image;
|
285
|
+
|
286
|
+
width = NUM2INT(rb_width);
|
287
|
+
height = NUM2INT(rb_height);
|
288
|
+
|
289
|
+
data = (ILubyte *) RSTRING_PTR(blob);
|
290
|
+
|
291
|
+
ilGenImages(1, &image);
|
292
|
+
ilBindImage(image);
|
293
|
+
|
294
|
+
ilTexImage(width, height, 1, 4, IL_RGBA, IL_UNSIGNED_BYTE, data);
|
295
|
+
|
296
|
+
return INT2NUM(image);
|
297
|
+
}
|
298
|
+
|
299
|
+
static VALUE il_CloneCurImage(VALUE obj)
|
300
|
+
{
|
301
|
+
ILuint clone = ilCloneCurImage();
|
302
|
+
|
303
|
+
return INT2NUM(clone);
|
304
|
+
}
|
251
305
|
/* end of banisterfiend additions */
|
252
306
|
|
253
307
|
void
|
@@ -272,7 +326,7 @@ InitializeIL() {
|
|
272
326
|
rb_define_module_function(mIL, "Save", il_Save, 2);
|
273
327
|
rb_define_module_function(mIL, "TexImage", il_TexImage, 7);
|
274
328
|
rb_define_module_function(mIL, "GetData", il_GetData, 0);
|
275
|
-
rb_define_module_function(mIL, "CopyPixels", il_CopyPixels, 9);
|
329
|
+
/* rb_define_module_function(mIL, "CopyPixels", il_CopyPixels, 9); */
|
276
330
|
rb_define_module_function(mIL, "SetData", il_SetData, 1);
|
277
331
|
rb_define_module_function(mIL, "SetPixels", il_SetPixels, 9);
|
278
332
|
rb_define_module_function(mIL, "CopyImage", il_CopyImage, 1);
|
@@ -282,10 +336,14 @@ InitializeIL() {
|
|
282
336
|
rb_define_module_function(mIL, "ActiveMipmap", il_ActiveMipmap, 1);
|
283
337
|
rb_define_module_function(mIL, "ActiveImage", il_ActiveImage, 1);
|
284
338
|
|
285
|
-
|
339
|
+
/* methods added by baniterfiend */
|
286
340
|
rb_define_module_function(mIL, "Enable", il_Enable, 1);
|
287
341
|
rb_define_module_function(mIL, "GetInteger", il_GetInteger, 1);
|
288
|
-
|
342
|
+
rb_define_module_function(mIL, "ConvertImage", il_ConvertImage, 2);
|
343
|
+
rb_define_module_function(mIL, "ToBlob", bf_ToBlob, 0);
|
344
|
+
rb_define_module_function(mIL, "FromBlob", bf_FromBlob, 3);
|
345
|
+
rb_define_module_function(mIL, "CloneCurImage", il_CloneCurImage, 0);
|
346
|
+
/* end of methods added by banisterfiend */
|
289
347
|
|
290
348
|
//////////////////////////////////
|
291
349
|
//CONSTANTS
|
@@ -298,7 +356,13 @@ InitializeIL() {
|
|
298
356
|
rb_define_const(mIL, "ICO", INT2NUM(IL_ICO));
|
299
357
|
rb_define_const(mIL, "JPG", INT2NUM(IL_JPG));
|
300
358
|
rb_define_const(mIL, "JFIF", INT2NUM(IL_JFIF));
|
359
|
+
|
360
|
+
#ifdef _WIN32
|
361
|
+
rb_define_const(mIL, "LBM", INT2NUM(IL_ILBM));
|
362
|
+
#else
|
301
363
|
rb_define_const(mIL, "LBM", INT2NUM(IL_LBM));
|
364
|
+
#endif
|
365
|
+
|
302
366
|
rb_define_const(mIL, "PCD", INT2NUM(IL_PCD));
|
303
367
|
rb_define_const(mIL, "PCX", INT2NUM(IL_PCX));
|
304
368
|
rb_define_const(mIL, "PIC", INT2NUM(IL_PIC));
|
@@ -373,6 +437,7 @@ InitializeIL() {
|
|
373
437
|
// CONSTANTS BELOW ADDED BY BANISTERFIEND
|
374
438
|
rb_define_const(mIL, "IMAGE_WIDTH", INT2NUM(IL_IMAGE_WIDTH));
|
375
439
|
rb_define_const(mIL, "IMAGE_HEIGHT", INT2NUM(IL_IMAGE_HEIGHT));
|
440
|
+
rb_define_const(mIL, "IMAGE_FORMAT", INT2NUM(IL_IMAGE_FORMAT));
|
376
441
|
rb_define_const(mIL, "FILE_OVERWRITE", INT2NUM(IL_FILE_OVERWRITE));
|
377
442
|
}
|
378
443
|
//////////////////////////////////////////
|
data/ext/devil/ruby_ilu.c
CHANGED
@@ -89,6 +89,33 @@ static VALUE ilu_BuildMipmaps(VALUE obj) {
|
|
89
89
|
return flag ? Qtrue : Qfalse;
|
90
90
|
}
|
91
91
|
|
92
|
+
/* functions added by banisterfiend */
|
93
|
+
static VALUE ilu_FlipImage(VALUE obj) {
|
94
|
+
ILboolean flag = iluFlipImage();
|
95
|
+
return flag ? Qtrue : Qfalse;
|
96
|
+
}
|
97
|
+
|
98
|
+
static VALUE ilu_Rotate(VALUE obj, VALUE rb_angle) {
|
99
|
+
ILfloat angle = NUM2DBL(rb_angle);
|
100
|
+
|
101
|
+
ILboolean flag = iluRotate(angle);
|
102
|
+
|
103
|
+
return flag ? Qtrue : Qfalse;
|
104
|
+
}
|
105
|
+
|
106
|
+
static VALUE ilu_Crop(VALUE obj, VALUE rb_XOff, VALUE rb_YOff, VALUE rb_width, VALUE rb_height)
|
107
|
+
{
|
108
|
+
ILuint XOff = NUM2INT(rb_XOff);
|
109
|
+
ILuint YOff = NUM2INT(rb_YOff);
|
110
|
+
ILuint width = NUM2INT(rb_width);
|
111
|
+
ILuint height = NUM2INT(rb_height);
|
112
|
+
|
113
|
+
ILboolean flag = iluCrop(XOff, YOff, 1, width, height, 1);
|
114
|
+
|
115
|
+
return flag ? Qtrue : Qfalse;
|
116
|
+
}
|
117
|
+
/* end of functions added by banisterfiend */
|
118
|
+
|
92
119
|
void
|
93
120
|
InitializeILU() {
|
94
121
|
mILU = rb_define_module("ILU");
|
@@ -108,6 +135,12 @@ InitializeILU() {
|
|
108
135
|
rb_define_module_function(mILU, "ImageParameter", ilu_ImageParameter , 2);
|
109
136
|
rb_define_module_function(mILU, "BuildMipmaps", ilu_BuildMipmaps, 0);
|
110
137
|
|
138
|
+
/* methods added by banisterfiend */
|
139
|
+
rb_define_module_function(mILU, "FlipImage", ilu_FlipImage, 0);
|
140
|
+
rb_define_module_function(mILU, "Rotate", ilu_Rotate, 1);
|
141
|
+
rb_define_module_function(mILU, "Crop", ilu_Crop, 4);
|
142
|
+
/* end of functions added by banisterfiend */
|
143
|
+
|
111
144
|
rb_define_const(mILU, "FILTER", INT2NUM(ILU_FILTER));
|
112
145
|
rb_define_const(mILU, "NEAREST", INT2NUM(ILU_NEAREST));
|
113
146
|
rb_define_const(mILU, "LINEAR", INT2NUM(ILU_LINEAR));
|
data/lib/devil.rb
CHANGED
@@ -14,39 +14,49 @@ end
|
|
14
14
|
|
15
15
|
# Provides a high level wrapper for the low-level DevIL Ruby bindings
|
16
16
|
module Devil
|
17
|
-
VERSION = '0.1.
|
17
|
+
VERSION = '0.1.6'
|
18
18
|
|
19
|
-
|
20
|
-
# Optionally accepts a block and yields the newly created image to the block.
|
21
|
-
def self.load_image(file, &block)
|
22
|
-
name = IL.GenImages(1).first
|
23
|
-
IL.BindImage(name)
|
24
|
-
IL.LoadImage(file)
|
19
|
+
class << self
|
25
20
|
|
26
|
-
|
27
|
-
|
28
|
-
|
21
|
+
# loads +file+ and returns a new image
|
22
|
+
# Optionally accepts a block and yields the newly created image to the block.
|
23
|
+
def load_image(file, &block)
|
24
|
+
name = IL.GenImages(1).first
|
25
|
+
IL.BindImage(name)
|
26
|
+
IL.LoadImage(file)
|
27
|
+
|
28
|
+
img = Image.new(name, file)
|
29
|
+
if block
|
30
|
+
block.call(img)
|
31
|
+
end
|
32
|
+
|
33
|
+
img
|
34
|
+
end
|
35
|
+
|
36
|
+
# convert an image +blob+ with +width+ and +height+
|
37
|
+
# to a bona fide image
|
38
|
+
def from_blob(blob, width, height)
|
39
|
+
Image.new(IL.FromBlob(blob, width, height), nil)
|
29
40
|
end
|
30
|
-
|
31
|
-
img
|
32
|
-
end
|
33
41
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
42
|
+
# initializes Devil and sets defaults
|
43
|
+
# This method should never need to be called directly.
|
44
|
+
def init
|
45
|
+
# initialize DevIL
|
46
|
+
IL.Init
|
39
47
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
48
|
+
# default options
|
49
|
+
IL.Enable(IL::FILE_OVERWRITE)
|
50
|
+
ILU.ImageParameter(ILU::FILTER, ILU::BILINEAR)
|
51
|
+
end
|
44
52
|
|
45
|
-
class << self
|
46
53
|
alias_method :with_image, :load_image
|
54
|
+
alias_method :load, :load_image
|
47
55
|
end
|
48
56
|
|
49
57
|
class Image
|
58
|
+
attr_reader :name, :file
|
59
|
+
|
50
60
|
def initialize(name, file)
|
51
61
|
@name = name
|
52
62
|
@file = file
|
@@ -70,25 +80,56 @@ module Devil
|
|
70
80
|
def save(file = @file)
|
71
81
|
set_binding
|
72
82
|
IL.SaveImage(file)
|
83
|
+
self
|
73
84
|
end
|
74
|
-
|
75
85
|
|
76
86
|
# resize the image to +width+ and +height+. Aspect ratios of the image do not have to be the same.
|
77
87
|
def resize(width, height)
|
78
88
|
set_binding
|
79
89
|
ILU.Scale(width, height, 1)
|
90
|
+
self
|
91
|
+
end
|
92
|
+
|
93
|
+
# Creates a proportional thumbnail of the image scaled so its longest
|
94
|
+
# edge is resized to +size+
|
95
|
+
def thumbnail(size)
|
96
|
+
# this thumbnail code from image_science.rb
|
97
|
+
|
98
|
+
w, h = width, height
|
99
|
+
scale = size.to_f / (w > h ? w : h)
|
100
|
+
resize((w * scale).to_i, (h * scale).to_i)
|
101
|
+
self
|
102
|
+
end
|
103
|
+
|
104
|
+
# return a deep copy of the current image
|
105
|
+
def dup
|
106
|
+
set_binding
|
107
|
+
Image.new(IL.CloneCurImage, nil)
|
108
|
+
end
|
109
|
+
|
110
|
+
# crop the current image
|
111
|
+
# +xoff+ number of pixels to skip in x direction
|
112
|
+
# +yoff+ number of pixels to skip in y direction
|
113
|
+
# +width+ number of pixels to preserve in x direction
|
114
|
+
# +height+ number of pixels to preserve in y direction
|
115
|
+
def crop(xoff, yoff, width, height)
|
116
|
+
set_binding
|
117
|
+
ILU.Crop(xoff, yoff, width, height)
|
118
|
+
self
|
80
119
|
end
|
81
120
|
|
82
121
|
# performs a gaussian blur on the image. The blur is performed +iter+ times.
|
83
122
|
def blur(iter)
|
84
123
|
set_binding
|
85
124
|
ILU.BlurGaussian(iter)
|
125
|
+
self
|
86
126
|
end
|
87
127
|
|
88
128
|
# 'pixelize' the image using a pixel size of +pixel_size+
|
89
129
|
def pixelize(pixel_size)
|
90
130
|
set_binding
|
91
131
|
ILU.Pixelize(pixel_size)
|
132
|
+
self
|
92
133
|
end
|
93
134
|
|
94
135
|
# add random noise to the image. +factor+ is the tolerance to use.
|
@@ -96,6 +137,7 @@ module Devil
|
|
96
137
|
def noisify(factor)
|
97
138
|
set_binding
|
98
139
|
ILU.Noisify(factor)
|
140
|
+
self
|
99
141
|
end
|
100
142
|
|
101
143
|
# The sharpening +factor+ must be in the range of 0.0 - 2.5. A value of 1.0 for the sharpening
|
@@ -109,6 +151,7 @@ module Devil
|
|
109
151
|
def sharpen(factor, iter)
|
110
152
|
set_binding
|
111
153
|
ILU.Sharpen(factor, iter)
|
154
|
+
self
|
112
155
|
end
|
113
156
|
|
114
157
|
# applies gamma correction to an image using an exponential curve.
|
@@ -119,12 +162,14 @@ module Devil
|
|
119
162
|
def gamma_correct(factor)
|
120
163
|
set_binding
|
121
164
|
ILU.GammaCorrect(factor)
|
165
|
+
self
|
122
166
|
end
|
123
167
|
|
124
168
|
# invert the color of every pixel in the image.
|
125
169
|
def negative
|
126
170
|
set_binding
|
127
171
|
ILU.Negative
|
172
|
+
self
|
128
173
|
end
|
129
174
|
|
130
175
|
# +factor+ describes desired contrast to use
|
@@ -134,6 +179,7 @@ module Devil
|
|
134
179
|
def contrast(factor)
|
135
180
|
set_binding
|
136
181
|
ILU.Contrast(factor)
|
182
|
+
self
|
137
183
|
end
|
138
184
|
|
139
185
|
# darkens the bright colours and lightens the dark
|
@@ -141,13 +187,39 @@ module Devil
|
|
141
187
|
def equalize
|
142
188
|
set_binding
|
143
189
|
ILU.Equalize
|
190
|
+
self
|
144
191
|
end
|
145
|
-
|
192
|
+
|
193
|
+
# returns the image data in the form of a ruby string
|
194
|
+
# The image data is formatted to RGBA / UNSIGNED BYTE
|
195
|
+
def to_blob
|
196
|
+
set_binding
|
197
|
+
IL.ToBlob
|
198
|
+
end
|
199
|
+
|
200
|
+
# flip the image about its x axis
|
201
|
+
def flip
|
202
|
+
set_binding
|
203
|
+
ILU.FlipImage
|
204
|
+
self
|
205
|
+
end
|
206
|
+
|
207
|
+
# rotate an image about its central point by +angle+ degrees
|
208
|
+
def rotate(angle)
|
209
|
+
set_binding
|
210
|
+
ILU.Rotate(angle)
|
211
|
+
self
|
212
|
+
end
|
213
|
+
|
214
|
+
alias_method :columns, :width
|
215
|
+
alias_method :rows, :height
|
216
|
+
|
146
217
|
private
|
147
218
|
|
148
219
|
def set_binding
|
149
220
|
IL.BindImage(@name)
|
150
221
|
end
|
222
|
+
|
151
223
|
end
|
152
224
|
end
|
153
225
|
|
data/lib/devil/gosu.rb
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'texplay'
|
2
|
+
require 'devil'
|
3
|
+
|
4
|
+
module TexPlay
|
5
|
+
|
6
|
+
# save a Gosu::Image to +file+
|
7
|
+
# This method is only available if require 'devil/gosu' is used
|
8
|
+
def save(file)
|
9
|
+
capture {
|
10
|
+
save_image = Devil.from_blob(self.to_blob, self.width, self.height)
|
11
|
+
save_image.flip
|
12
|
+
save_image.save(file)
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
# convert a Gosu::Image to a Devil::Image
|
17
|
+
# This method is only available if require 'devil/gosu' is used
|
18
|
+
def to_devil
|
19
|
+
devil_img = nil
|
20
|
+
capture {
|
21
|
+
devil_img = Devil.from_blob(self.to_blob, self.width, self.height)
|
22
|
+
devil_img.flip
|
23
|
+
}
|
24
|
+
devil_img
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
class Gosu::Window
|
29
|
+
|
30
|
+
# return a screenshot of the framebuffer as a Devil::Image
|
31
|
+
# This method is only available if require 'devil/gosu' is used
|
32
|
+
def screenshot
|
33
|
+
require 'opengl'
|
34
|
+
|
35
|
+
canvas_texture_id = glGenTextures(1).first
|
36
|
+
|
37
|
+
img = nil
|
38
|
+
self.gl do
|
39
|
+
glEnable(GL_TEXTURE_2D)
|
40
|
+
glBindTexture(GL_TEXTURE_2D, canvas_texture_id)
|
41
|
+
|
42
|
+
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, 1)
|
43
|
+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)
|
44
|
+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)
|
45
|
+
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, self.width, self.height, 0, GL_RGB, GL_UNSIGNED_BYTE, "\0" * self.width * self.height * 3)
|
46
|
+
|
47
|
+
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 0, 0, self.width, self.height, 0)
|
48
|
+
|
49
|
+
data = glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE)
|
50
|
+
img = Devil.from_blob(data, self.width, self.height)
|
51
|
+
end
|
52
|
+
|
53
|
+
img
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
class Devil::Image
|
58
|
+
|
59
|
+
# convert a Devil::Image to a Gosu::Image.
|
60
|
+
# Must provide a +window+ parameter, as per Gosu::Image#new()
|
61
|
+
def to_gosu(window)
|
62
|
+
Gosu::Image.new(window, self)
|
63
|
+
end
|
64
|
+
|
65
|
+
# display the Devil images on screen utilizing the Gosu library for visualization
|
66
|
+
# if +x+ and +y+ are specified then show the image centered at this location, otherwise
|
67
|
+
# draw the image at the center of the screen
|
68
|
+
# This method is only available if require 'devil/gosu' is used
|
69
|
+
def show(x = 512, y = 384)
|
70
|
+
if !Devil.const_defined?(:Window)
|
71
|
+
c = Class.new(Gosu::Window) do
|
72
|
+
attr_accessor :show_list
|
73
|
+
|
74
|
+
def initialize
|
75
|
+
super(1024, 768, false)
|
76
|
+
@show_list = []
|
77
|
+
end
|
78
|
+
|
79
|
+
def draw # :nodoc:
|
80
|
+
@show_list.each { |v| v[:image].draw_rot(v[:x], v[:y], 1, 0) }
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
Devil.const_set :Window, c
|
85
|
+
end
|
86
|
+
|
87
|
+
if !defined? @@window
|
88
|
+
@@window ||= Devil::Window.new
|
89
|
+
|
90
|
+
at_exit { @@window.show }
|
91
|
+
end
|
92
|
+
|
93
|
+
@@window.show_list.push :image => Gosu::Image.new(@@window, self), :x => x, :y => y
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
data/test/tank.png
ADDED
Binary file
|
@@ -0,0 +1,25 @@
|
|
1
|
+
direc = File.dirname(__FILE__)
|
2
|
+
|
3
|
+
$LOAD_PATH.push("#{direc}/../lib/")
|
4
|
+
|
5
|
+
require 'rubygems'
|
6
|
+
require "devil/gosu"
|
7
|
+
|
8
|
+
img = Devil.load_image("#{direc}/texture.png")
|
9
|
+
|
10
|
+
img.crop(100,100, 200, 200)
|
11
|
+
img_dup = img.dup
|
12
|
+
|
13
|
+
img.negative
|
14
|
+
|
15
|
+
img.show(200,200)
|
16
|
+
img_dup.show(450, 200)
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
$direc = File.dirname(__FILE__)
|
2
|
+
|
3
|
+
$LOAD_PATH.push("#{$direc}/../lib/")
|
4
|
+
|
5
|
+
require 'rubygems'
|
6
|
+
require 'gosu'
|
7
|
+
require 'devil'
|
8
|
+
|
9
|
+
class W < Gosu::Window
|
10
|
+
def initialize
|
11
|
+
super(1024, 768, false, 20)
|
12
|
+
|
13
|
+
img = Devil.load_image("#{$direc}/texture.jpg")
|
14
|
+
|
15
|
+
@img = Gosu::Image.new(self, img)
|
16
|
+
end
|
17
|
+
|
18
|
+
def draw
|
19
|
+
@img.draw 100, 50,1
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
w = W.new
|
25
|
+
w.show
|
26
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
$direc = File.dirname(__FILE__)
|
2
|
+
|
3
|
+
$LOAD_PATH.push("#{$direc}/../lib/")
|
4
|
+
|
5
|
+
require 'rubygems'
|
6
|
+
require 'devil/gosu'
|
7
|
+
|
8
|
+
class W < Gosu::Window
|
9
|
+
def initialize
|
10
|
+
super(1024, 768, false, 20)
|
11
|
+
|
12
|
+
@img = Gosu::Image.new(self, "tank.png")
|
13
|
+
@img.circle 100, 100, 50, :color => :purple, :filled => true
|
14
|
+
|
15
|
+
@img.save("tank-modified.png")
|
16
|
+
end
|
17
|
+
|
18
|
+
def draw
|
19
|
+
@img.draw 100, 50,1
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
w = W.new
|
25
|
+
w.show
|
26
|
+
|
data/test/test_new_api.rb
CHANGED
@@ -0,0 +1,33 @@
|
|
1
|
+
$direc = File.dirname(__FILE__)
|
2
|
+
|
3
|
+
$LOAD_PATH.push("#{$direc}/../lib/")
|
4
|
+
|
5
|
+
require 'rubygems'
|
6
|
+
require 'devil/gosu'
|
7
|
+
|
8
|
+
class W < Gosu::Window
|
9
|
+
def initialize
|
10
|
+
super(1024, 768, false, 20)
|
11
|
+
|
12
|
+
@img = Gosu::Image.new(self, "tank.png")
|
13
|
+
@img2 = @img.dup
|
14
|
+
@img.circle 100, 100, 50, :color => :purple, :filled => true
|
15
|
+
end
|
16
|
+
|
17
|
+
def draw
|
18
|
+
@img.draw 100, 50,1
|
19
|
+
@img.draw 300, 50, 1
|
20
|
+
@img2.draw 300, 400, 1
|
21
|
+
end
|
22
|
+
|
23
|
+
def update
|
24
|
+
if button_down?(Gosu::KbEscape)
|
25
|
+
screenshot.rotate(45).save("screenshot.png")
|
26
|
+
exit
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
w = W.new
|
32
|
+
w.show
|
33
|
+
|
data/test/test_thumbnail.rb
CHANGED
@@ -1,20 +1,12 @@
|
|
1
|
-
|
2
|
-
require 'devil'
|
3
|
-
|
4
|
-
IL.Init
|
5
|
-
|
6
|
-
name = IL.GenImages(1)[0]
|
7
|
-
IL.BindImage(name)
|
8
|
-
IL.LoadImage("texture.png")
|
1
|
+
$direc = File.dirname(__FILE__)
|
9
2
|
|
10
|
-
|
11
|
-
puts IL.GetInteger(IL::IMAGE_WIDTH)
|
12
|
-
puts IL.GetInteger(IL::IMAGE_HEIGHT)
|
3
|
+
$LOAD_PATH.push("#{$direc}/../lib/")
|
13
4
|
|
14
|
-
|
15
|
-
|
16
|
-
IL.Enable(IL::FILE_OVERWRITE)
|
17
|
-
|
18
|
-
IL.SaveImage("desert_thumb.png")
|
5
|
+
require 'rubygems'
|
6
|
+
require 'devil/gosu'
|
19
7
|
|
8
|
+
Devil.load("texture.png") do |img|
|
9
|
+
img.thumbnail(300)
|
10
|
+
img.show
|
11
|
+
end
|
20
12
|
|
data/test/texture.jpg
ADDED
Binary file
|
data/test/texture.png
ADDED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: devil
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jaroslaw Tworek, John Mair (banisterfiend)
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-10-
|
12
|
+
date: 2009-10-12 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -26,13 +26,22 @@ files:
|
|
26
26
|
- README
|
27
27
|
- LICENSE
|
28
28
|
- lib/devil.rb
|
29
|
+
- lib/devil/gosu.rb
|
29
30
|
- ext/devil/extconf.rb
|
30
31
|
- ext/devil/ruby_devil_ext.h
|
31
32
|
- ext/devil/ruby_devil_ext.c
|
32
33
|
- ext/devil/ruby_il.c
|
33
34
|
- ext/devil/ruby_ilu.c
|
35
|
+
- test/test_gosu_load.rb
|
34
36
|
- test/test_new_api.rb
|
37
|
+
- test/test_clone_and_crop.rb
|
38
|
+
- test/test_gosu_show.rb
|
39
|
+
- test/test_screenshot.rb
|
40
|
+
- test/test_gosu_save.rb
|
35
41
|
- test/test_thumbnail.rb
|
42
|
+
- test/tank.png
|
43
|
+
- test/texture.png
|
44
|
+
- test/texture.jpg
|
36
45
|
has_rdoc: true
|
37
46
|
homepage: http://banisterfiend.wordpress.com
|
38
47
|
post_install_message:
|