oil 0.0.2 → 0.0.3
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.rdoc +7 -4
- data/Rakefile +17 -4
- data/ext/oil.c +160 -63
- data/ext/oil.jar +0 -0
- data/test/helper.rb +12 -0
- data/test/test_jpeg.rb +40 -24
- data/test/test_png.rb +37 -25
- metadata +43 -34
data/README.rdoc
CHANGED
@@ -4,7 +4,8 @@ http://github.com/ender672/oil
|
|
4
4
|
|
5
5
|
== DESCRIPTION:
|
6
6
|
|
7
|
-
Oil resizes JPEG and PNG images.
|
7
|
+
Oil resizes JPEG and PNG images. It aims for fast performance and low memory
|
8
|
+
use.
|
8
9
|
|
9
10
|
== INSTALLATION:
|
10
11
|
|
@@ -23,6 +24,8 @@ Oil resizes JPEG and PNG images.
|
|
23
24
|
|
24
25
|
== REQUIREMENTS:
|
25
26
|
|
27
|
+
These requirements do not apply to the JRuby gem.
|
28
|
+
|
26
29
|
* IJG JPEG Library or libjpeg-turbo.
|
27
30
|
* libpng
|
28
31
|
|
@@ -43,8 +46,8 @@ Compile & run unit tests. Should show no warnings and no failing tests:
|
|
43
46
|
|
44
47
|
Valgrind should not complain (ruby-1.9.3p125, compiled with -O3):
|
45
48
|
|
46
|
-
$ valgrind /path/to/ruby -Iext test/test_jpeg.rb
|
47
|
-
$ valgrind --suppressions=test/valgrind_suppressions.txt /path/to/ruby -Iext test/test_png.rb
|
49
|
+
$ valgrind /path/to/ruby -Iext:test test/test_jpeg.rb
|
50
|
+
$ valgrind --suppressions=test/valgrind_suppressions.txt /path/to/ruby -Iext:test test/test_png.rb
|
48
51
|
|
49
52
|
Tests should not leak memory:
|
50
53
|
|
@@ -56,7 +59,7 @@ Changes to the interpolator should be analyzed using ResampleScope:
|
|
56
59
|
|
57
60
|
== TODO:
|
58
61
|
|
59
|
-
*
|
62
|
+
* Windows
|
60
63
|
|
61
64
|
== LICENSE:
|
62
65
|
|
data/Rakefile
CHANGED
@@ -1,6 +1,14 @@
|
|
1
1
|
require 'rake/clean'
|
2
2
|
require 'rake/testtask'
|
3
3
|
|
4
|
+
file 'ext/oil.jar' => FileList['ext/*.java'] do
|
5
|
+
cd 'ext' do
|
6
|
+
sh "javac -g -cp #{Config::CONFIG['prefix']}/lib/jruby.jar #{FileList['*.java']}"
|
7
|
+
quoted_files = (FileList.new('*.class').to_a.map { |f| "'#{f}'" }).join(' ')
|
8
|
+
sh "jar cf oil.jar #{quoted_files}"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
4
12
|
file 'ext/Makefile' do
|
5
13
|
cd 'ext' do
|
6
14
|
ruby "extconf.rb #{ENV['EXTOPTS']}"
|
@@ -14,15 +22,20 @@ file 'ext/oil.so' => FileList.new('ext/Makefile', 'ext/oil.c') do
|
|
14
22
|
end
|
15
23
|
|
16
24
|
Rake::TestTask.new do |t|
|
17
|
-
t.libs = ['ext']
|
18
|
-
t.test_files = FileList['test/
|
25
|
+
t.libs = ['ext', 'test']
|
26
|
+
t.test_files = FileList['test/test_*.rb']
|
19
27
|
end
|
20
28
|
|
21
|
-
CLEAN.add('ext/*{.o,.so,.log}', 'ext/Makefile')
|
29
|
+
CLEAN.add('ext/*{.o,.so,.log,.class,.jar}', 'ext/Makefile')
|
22
30
|
CLOBBER.add('*.gem')
|
23
31
|
|
32
|
+
desc 'Build the gem and include the java library'
|
33
|
+
task :gem => "ext/oil.jar" do
|
34
|
+
system "gem build oil.gemspec"
|
35
|
+
end
|
36
|
+
|
24
37
|
desc 'Compile the extension'
|
25
|
-
task :compile => "ext/oil
|
38
|
+
task :compile => "ext/oil.#{RUBY_PLATFORM =~ /java/ ? 'jar' : 'so'}"
|
26
39
|
|
27
40
|
task :test => :compile
|
28
41
|
task :default => :test
|
data/ext/oil.c
CHANGED
@@ -8,8 +8,8 @@ static ID id_read, id_seek;
|
|
8
8
|
|
9
9
|
struct thumbdata {
|
10
10
|
VALUE io;
|
11
|
-
|
12
|
-
|
11
|
+
unsigned int width;
|
12
|
+
unsigned int height;
|
13
13
|
};
|
14
14
|
|
15
15
|
static struct jpeg_error_mgr jerr;
|
@@ -31,16 +31,32 @@ struct png_src {
|
|
31
31
|
};
|
32
32
|
|
33
33
|
struct interpolation {
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
34
|
+
long sw;
|
35
|
+
long sh;
|
36
|
+
long dw;
|
37
|
+
long dh;
|
38
|
+
int cmp;
|
39
|
+
void (*read)(char *, void *);
|
40
|
+
void (*write)(char *, void *);
|
41
|
+
void *read_data;
|
42
|
+
void *write_data;
|
42
43
|
};
|
43
44
|
|
45
|
+
struct bitmap {
|
46
|
+
long rowlen;
|
47
|
+
char *cur;
|
48
|
+
};
|
49
|
+
|
50
|
+
/* bitmap source callback */
|
51
|
+
|
52
|
+
static void
|
53
|
+
bitmap_read(char *sl, void *data)
|
54
|
+
{
|
55
|
+
struct bitmap *b = (struct bitmap *)data;
|
56
|
+
memcpy(sl, b->cur, b->rowlen);
|
57
|
+
b->cur += b->rowlen;
|
58
|
+
}
|
59
|
+
|
44
60
|
/* jpeglib error callbacks */
|
45
61
|
|
46
62
|
static void output_message(j_common_ptr cinfo) {}
|
@@ -147,17 +163,19 @@ png_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
|
|
147
163
|
void
|
148
164
|
png_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
|
149
165
|
{
|
150
|
-
VALUE
|
166
|
+
VALUE ret, buf;
|
151
167
|
png_size_t rlen;
|
152
168
|
struct png_src *io_ptr;
|
153
169
|
|
154
170
|
if (!png_ptr) return;
|
155
171
|
io_ptr = (struct png_src *)png_get_io_ptr(png_ptr);
|
156
|
-
|
157
|
-
rb_funcall(io_ptr->io, id_read, 2, INT2FIX(length),
|
158
|
-
|
159
|
-
|
160
|
-
|
172
|
+
buf = io_ptr->buffer;
|
173
|
+
ret = rb_funcall(io_ptr->io, id_read, 2, INT2FIX(length), buf);
|
174
|
+
|
175
|
+
rlen = RSTRING_LEN(buf);
|
176
|
+
if (rlen > length)
|
177
|
+
rb_raise(rb_eRuntimeError, "IO return buffer is too big.");
|
178
|
+
if (!NIL_P(ret)) memcpy(data, RSTRING_PTR(buf), rlen);
|
161
179
|
}
|
162
180
|
|
163
181
|
/* png read/write callbacks */
|
@@ -165,15 +183,13 @@ png_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
|
|
165
183
|
static void
|
166
184
|
png_read(char *sl, void *data)
|
167
185
|
{
|
168
|
-
|
169
|
-
png_read_row((png_structp)data_ary[2], (png_bytep)sl, (png_bytep)NULL);
|
186
|
+
png_read_row((png_structp)data, (png_bytep)sl, (png_bytep)NULL);
|
170
187
|
}
|
171
188
|
|
172
189
|
static void
|
173
190
|
png_write(char *sl, void *data)
|
174
191
|
{
|
175
|
-
|
176
|
-
png_write_row((png_structp)*data_ary, (png_bytep)sl);
|
192
|
+
png_write_row((png_structp)data, (png_bytep)sl);
|
177
193
|
}
|
178
194
|
|
179
195
|
/* Bilinear Interpolation */
|
@@ -189,12 +205,12 @@ bilinear_get_scanlines(struct interpolation *bi, char **sl1, char **sl2,
|
|
189
205
|
n = line + 1 - *next;
|
190
206
|
if (line < bi->sh - 1) n++;
|
191
207
|
*next += n;
|
192
|
-
|
208
|
+
|
193
209
|
for (i=0; i<n; i++) {
|
194
210
|
tmp = *sl1;
|
195
211
|
*sl1 = *sl2;
|
196
212
|
*sl2 = tmp;
|
197
|
-
bi->read(*sl2, bi->
|
213
|
+
bi->read(*sl2, bi->read_data);
|
198
214
|
|
199
215
|
for (j=0; j<bi->cmp; j++)
|
200
216
|
sl2[0][len + bi->cmp - j] = sl2[0][len - j];
|
@@ -212,12 +228,15 @@ bilinear3(char *sl1, char *sl2, char *sl_out, size_t sw, size_t dw, int cmp,
|
|
212
228
|
size_t xsmp_i, i, j;
|
213
229
|
double xscale_inv, xscale_ctr, ty;
|
214
230
|
|
231
|
+
if (ysmp < 0) ysmp = 0;
|
232
|
+
|
215
233
|
xscale_inv = sw / (float)dw;
|
216
234
|
xscale_ctr = (xscale_inv - 1) / 2;
|
217
235
|
ty = ysmp - (int)ysmp;
|
218
236
|
|
219
237
|
for (i = 0; i < dw; i++) {
|
220
238
|
xsmp = i * xscale_inv + xscale_ctr;
|
239
|
+
if (xsmp < 0) xsmp = 0;
|
221
240
|
xsmp_i = (int)xsmp;
|
222
241
|
|
223
242
|
tx = xsmp - xsmp_i;
|
@@ -255,7 +274,7 @@ bilinear2(VALUE _args)
|
|
255
274
|
|
256
275
|
bilinear_get_scanlines(bi, &sl1, &sl2, &line, ysmp);
|
257
276
|
bilinear3(sl1, sl2, sl_out, bi->sw, bi->dw, bi->cmp, ysmp);
|
258
|
-
bi->write(sl_out, bi->
|
277
|
+
bi->write(sl_out, bi->write_data);
|
259
278
|
}
|
260
279
|
|
261
280
|
return Qnil;
|
@@ -286,20 +305,22 @@ bilinear(struct interpolation *bi)
|
|
286
305
|
if (state) rb_jump_tag(state);
|
287
306
|
}
|
288
307
|
|
289
|
-
/*
|
308
|
+
/* helper functions */
|
290
309
|
|
291
310
|
static void
|
292
|
-
|
311
|
+
fix_ratio(unsigned int sw, unsigned int sh, unsigned int *dw, unsigned int *dh)
|
293
312
|
{
|
294
313
|
double x, y;
|
295
|
-
|
296
|
-
|
297
|
-
y =
|
298
|
-
|
299
|
-
if (
|
300
|
-
|
314
|
+
x = *dw / (float)sw;
|
315
|
+
y = *dh / (float)sh;
|
316
|
+
if (x<y) *dh = sh * x;
|
317
|
+
else *dw = sw * y;
|
318
|
+
if (!*dh) *dh = 1;
|
319
|
+
if (!*dw) *dw = 1;
|
301
320
|
}
|
302
321
|
|
322
|
+
/* jpeg helper functions */
|
323
|
+
|
303
324
|
static void
|
304
325
|
jpeg_set_output_header(j_compress_ptr cinfo, j_decompress_ptr dinfo)
|
305
326
|
{
|
@@ -322,15 +343,13 @@ jpeg_pre_scale(j_compress_ptr cinfo, j_decompress_ptr dinfo)
|
|
322
343
|
static void
|
323
344
|
jpeg_read(char *sl, void *data)
|
324
345
|
{
|
325
|
-
|
326
|
-
jpeg_read_scanlines((j_decompress_ptr)*data_ary, (JSAMPROW *)&sl, 1);
|
346
|
+
jpeg_read_scanlines((j_decompress_ptr)data, (JSAMPROW *)&sl, 1);
|
327
347
|
}
|
328
348
|
|
329
349
|
static void
|
330
350
|
jpeg_write(char *sl, void *data)
|
331
351
|
{
|
332
|
-
|
333
|
-
jpeg_write_scanlines((j_compress_ptr)data_ary[1], (JSAMPROW *)&sl, 1);
|
352
|
+
jpeg_write_scanlines((j_compress_ptr)data, (JSAMPROW *)&sl, 1);
|
334
353
|
}
|
335
354
|
|
336
355
|
static VALUE
|
@@ -340,12 +359,12 @@ jpeg_each3(VALUE _args)
|
|
340
359
|
j_decompress_ptr dinfo = (j_decompress_ptr)args[0];
|
341
360
|
j_compress_ptr cinfo = (j_compress_ptr)args[1];
|
342
361
|
struct interpolation intrp;
|
343
|
-
void *data[2];
|
344
362
|
|
345
363
|
jpeg_read_header(dinfo, TRUE);
|
346
364
|
jpeg_calc_output_dimensions(dinfo);
|
347
365
|
jpeg_set_output_header(cinfo, dinfo);
|
348
|
-
|
366
|
+
fix_ratio(dinfo->output_width, dinfo->output_height, &cinfo->image_width,
|
367
|
+
&cinfo->image_height);
|
349
368
|
jpeg_pre_scale(cinfo, dinfo);
|
350
369
|
|
351
370
|
jpeg_start_compress(cinfo, TRUE);
|
@@ -358,12 +377,10 @@ jpeg_each3(VALUE _args)
|
|
358
377
|
intrp.cmp = dinfo->output_components;
|
359
378
|
intrp.read = jpeg_read;
|
360
379
|
intrp.write = jpeg_write;
|
361
|
-
|
362
|
-
|
363
|
-
intrp.data = (void *)data;
|
380
|
+
intrp.read_data = dinfo;
|
381
|
+
intrp.write_data = cinfo;
|
364
382
|
|
365
383
|
bilinear(&intrp);
|
366
|
-
//nearest(&intrp);
|
367
384
|
|
368
385
|
jpeg_abort_decompress(dinfo);
|
369
386
|
jpeg_finish_compress(cinfo);
|
@@ -485,6 +502,71 @@ jpeg_each(VALUE self)
|
|
485
502
|
return self;
|
486
503
|
}
|
487
504
|
|
505
|
+
static void
|
506
|
+
png_normalize_input(png_structp read_ptr, png_infop read_i_ptr)
|
507
|
+
{
|
508
|
+
png_byte ctype;
|
509
|
+
int bit_depth;
|
510
|
+
|
511
|
+
bit_depth = png_get_bit_depth(read_ptr, read_i_ptr);
|
512
|
+
ctype = png_get_color_type(read_ptr, read_i_ptr);
|
513
|
+
|
514
|
+
if (ctype == PNG_COLOR_TYPE_GRAY && bit_depth < 8)
|
515
|
+
png_set_gray_1_2_4_to_8(read_ptr);
|
516
|
+
|
517
|
+
if (bit_depth < 8)
|
518
|
+
png_set_packing(read_ptr);
|
519
|
+
else if (bit_depth == 16)
|
520
|
+
#if PNG_LIBPNG_VER >= 10504
|
521
|
+
png_set_scale_16(read_ptr);
|
522
|
+
#else
|
523
|
+
png_set_strip_16(read_ptr);
|
524
|
+
#endif
|
525
|
+
|
526
|
+
if (png_get_valid(read_ptr, read_i_ptr, PNG_INFO_tRNS))
|
527
|
+
png_set_tRNS_to_alpha(read_ptr);
|
528
|
+
|
529
|
+
if (ctype == PNG_COLOR_TYPE_PALETTE)
|
530
|
+
png_set_palette_to_rgb(read_ptr);
|
531
|
+
|
532
|
+
png_read_update_info(read_ptr, read_i_ptr);
|
533
|
+
}
|
534
|
+
|
535
|
+
static VALUE
|
536
|
+
png_interlaced2(VALUE arg)
|
537
|
+
{
|
538
|
+
bilinear((struct interpolation *)arg);
|
539
|
+
}
|
540
|
+
|
541
|
+
static void
|
542
|
+
png_interlaced(png_structp rpng, struct interpolation *intrp)
|
543
|
+
{
|
544
|
+
struct bitmap b;
|
545
|
+
png_bytep *rows;
|
546
|
+
char *data;
|
547
|
+
int i, state;
|
548
|
+
|
549
|
+
b.rowlen = intrp->sw * intrp->cmp;
|
550
|
+
data = malloc(b.rowlen * intrp->sh);
|
551
|
+
b.cur = data;
|
552
|
+
|
553
|
+
rows = malloc(intrp->sh * sizeof(png_bytep));
|
554
|
+
for (i=0; i<intrp->sh; i++)
|
555
|
+
rows[i] = data + (i * b.rowlen);
|
556
|
+
|
557
|
+
png_read_image(rpng, rows);
|
558
|
+
|
559
|
+
intrp->read = bitmap_read;
|
560
|
+
intrp->read_data = (void *)&b;
|
561
|
+
|
562
|
+
rb_protect(png_interlaced2, (VALUE)intrp, &state);
|
563
|
+
|
564
|
+
free(rows);
|
565
|
+
free(data);
|
566
|
+
|
567
|
+
if (state) rb_jump_tag(state);
|
568
|
+
}
|
569
|
+
|
488
570
|
static VALUE
|
489
571
|
png_each2(VALUE _args)
|
490
572
|
{
|
@@ -494,33 +576,48 @@ png_each2(VALUE _args)
|
|
494
576
|
png_structp read_ptr=(png_structp)args[2];
|
495
577
|
png_infop read_i_ptr=(png_infop)args[3];
|
496
578
|
struct thumbdata *thumb=(struct thumbdata *)args[4];
|
497
|
-
void *data[4];
|
498
579
|
struct interpolation intrp;
|
580
|
+
png_byte ctype;
|
499
581
|
|
500
582
|
png_read_info(read_ptr, read_i_ptr);
|
583
|
+
png_normalize_input(read_ptr, read_i_ptr);
|
584
|
+
ctype = png_get_color_type(read_ptr, read_i_ptr);
|
585
|
+
|
586
|
+
intrp.sw = png_get_image_width(read_ptr, read_i_ptr);
|
587
|
+
intrp.sh = png_get_image_height(read_ptr, read_i_ptr);
|
588
|
+
fix_ratio(intrp.sw, intrp.sh, &thumb->width, &thumb->height);
|
501
589
|
png_set_IHDR(write_ptr, write_i_ptr, thumb->width, thumb->height, 8,
|
502
|
-
|
503
|
-
|
590
|
+
ctype, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT,
|
591
|
+
PNG_FILTER_TYPE_DEFAULT);
|
504
592
|
png_write_info(write_ptr, write_i_ptr);
|
505
593
|
|
506
|
-
|
507
|
-
|
594
|
+
switch (ctype) {
|
595
|
+
case PNG_COLOR_TYPE_GRAY: intrp.cmp = 1; break;
|
596
|
+
case PNG_COLOR_TYPE_GRAY_ALPHA: intrp.cmp = 2; break;
|
597
|
+
case PNG_COLOR_TYPE_RGB: intrp.cmp = 3; break;
|
598
|
+
case PNG_COLOR_TYPE_RGB_ALPHA: intrp.cmp = 4; break;
|
599
|
+
default: rb_raise(rb_eRuntimeError, "png color type not supported.");
|
600
|
+
}
|
601
|
+
|
508
602
|
intrp.dw = thumb->width;
|
509
603
|
intrp.dh = thumb->height;
|
510
|
-
intrp.cmp = 3;
|
511
|
-
intrp.read = png_read;
|
512
604
|
intrp.write = png_write;
|
513
|
-
|
514
|
-
data[1] = write_i_ptr;
|
515
|
-
data[2] = read_ptr;
|
516
|
-
data[3] = read_i_ptr;
|
517
|
-
intrp.data = (void *)data;
|
518
|
-
|
519
|
-
bilinear(&intrp);
|
605
|
+
intrp.write_data = write_ptr;
|
520
606
|
|
521
|
-
|
607
|
+
switch (png_get_interlace_type(read_ptr, read_i_ptr)) {
|
608
|
+
case PNG_INTERLACE_NONE:
|
609
|
+
intrp.read = png_read;
|
610
|
+
intrp.read_data = read_ptr;
|
611
|
+
bilinear(&intrp);
|
612
|
+
break;
|
613
|
+
case PNG_INTERLACE_ADAM7:
|
614
|
+
png_interlaced(read_ptr, &intrp);
|
615
|
+
break;
|
616
|
+
default: rb_raise(rb_eRuntimeError, "png interlace type not supported.");
|
617
|
+
}
|
618
|
+
|
522
619
|
png_write_end(write_ptr, write_i_ptr);
|
523
|
-
|
620
|
+
|
524
621
|
return Qnil;
|
525
622
|
}
|
526
623
|
|
@@ -543,17 +640,17 @@ png_each(VALUE self)
|
|
543
640
|
Data_Get_Struct(self, struct thumbdata, thumb);
|
544
641
|
|
545
642
|
write_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, (png_voidp)NULL,
|
546
|
-
|
547
|
-
|
643
|
+
(png_error_ptr)png_error_fn,
|
644
|
+
(png_error_ptr)png_warning_fn);
|
548
645
|
write_i_ptr = png_create_info_struct(write_ptr);
|
549
646
|
png_set_write_fn(write_ptr, NULL, png_write_data, png_flush_data);
|
550
647
|
|
551
648
|
src.io = thumb->io;
|
552
|
-
src.buffer = rb_str_new(0, 0);
|
649
|
+
src.buffer = rb_str_new(0, 0);
|
553
650
|
|
554
651
|
read_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, (png_voidp)NULL,
|
555
|
-
|
556
|
-
|
652
|
+
(png_error_ptr)png_error_fn,
|
653
|
+
(png_error_ptr)png_warning_fn);
|
557
654
|
read_i_ptr = png_create_info_struct(read_ptr);
|
558
655
|
png_set_read_fn(read_ptr, (void *)&src, png_read_data);
|
559
656
|
|
@@ -572,7 +669,7 @@ png_each(VALUE self)
|
|
572
669
|
}
|
573
670
|
|
574
671
|
void
|
575
|
-
Init_oil()
|
672
|
+
Init_oil(void)
|
576
673
|
{
|
577
674
|
VALUE mOil = rb_define_module("Oil");
|
578
675
|
|
data/ext/oil.jar
ADDED
Binary file
|
data/test/helper.rb
ADDED
data/test/test_jpeg.rb
CHANGED
@@ -2,6 +2,7 @@ require 'rubygems'
|
|
2
2
|
require 'minitest/autorun'
|
3
3
|
require 'oil'
|
4
4
|
require 'stringio'
|
5
|
+
require 'helper'
|
5
6
|
|
6
7
|
module Oil
|
7
8
|
class TestJPEG < MiniTest::Unit::TestCase
|
@@ -63,8 +64,14 @@ module Oil
|
|
63
64
|
|
64
65
|
def test_io_returns_too_much_data
|
65
66
|
proc = Proc.new do |io, size, buf|
|
66
|
-
|
67
|
-
|
67
|
+
str = io.read(size)
|
68
|
+
str = str[0..-2] * 2 if str
|
69
|
+
if buf
|
70
|
+
buf.slice!(0,0) # this empties the buffer
|
71
|
+
buf << str
|
72
|
+
else
|
73
|
+
str
|
74
|
+
end
|
68
75
|
end
|
69
76
|
assert_raises(RuntimeError) { custom_io proc, JPEG_DATA }
|
70
77
|
end
|
@@ -88,7 +95,11 @@ module Oil
|
|
88
95
|
proc = Proc.new do |parent, size, buf|
|
89
96
|
raise CustomError if flag
|
90
97
|
flag = true
|
91
|
-
|
98
|
+
if buf
|
99
|
+
parent.read(size, buf)
|
100
|
+
else
|
101
|
+
parent.read(size)
|
102
|
+
end
|
92
103
|
end
|
93
104
|
assert_raises(CustomError) { custom_io proc, big_jpeg }
|
94
105
|
end
|
@@ -98,25 +109,44 @@ module Oil
|
|
98
109
|
proc = Proc.new do |parent, size, buf|
|
99
110
|
throw :foo if flag
|
100
111
|
flag = true
|
101
|
-
|
112
|
+
if buf
|
113
|
+
parent.read(size, buf)
|
114
|
+
else
|
115
|
+
parent.read(size)
|
116
|
+
end
|
102
117
|
end
|
103
118
|
catch(:foo){ custom_io proc, big_jpeg }
|
104
119
|
end
|
105
120
|
|
106
121
|
def test_io_shrinks_buffer
|
107
122
|
proc = Proc.new do |parent, size, buf|
|
108
|
-
|
109
|
-
|
123
|
+
if buf
|
124
|
+
parent.read(size, buf)
|
125
|
+
buf.slice!(0, 10)
|
126
|
+
else
|
127
|
+
res = parent.read(size)
|
128
|
+
res[10, -1]
|
129
|
+
end
|
110
130
|
end
|
111
131
|
assert_raises(RuntimeError) { custom_io(proc, big_jpeg) }
|
112
132
|
end
|
113
133
|
|
114
|
-
def
|
134
|
+
def test_io_enlarges_buffer_with_eof
|
115
135
|
proc = Proc.new do |parent, size, buf|
|
116
|
-
|
117
|
-
|
136
|
+
if buf
|
137
|
+
parent.read(size, buf)
|
138
|
+
buf << buf
|
139
|
+
else
|
140
|
+
str = parent.read(size)
|
141
|
+
str * 2
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
if(RUBY_PLATFORM =~ /java/)
|
146
|
+
assert_raises(RuntimeError) { custom_io(proc, big_jpeg) }
|
147
|
+
else
|
148
|
+
validate_jpeg custom_io(proc, big_jpeg) # libjpeg stops when reaches eof
|
118
149
|
end
|
119
|
-
validate_jpeg custom_io(proc, big_jpeg) # how is this okay?
|
120
150
|
end
|
121
151
|
|
122
152
|
def test_io_seek
|
@@ -187,18 +217,4 @@ module Oil
|
|
187
217
|
io
|
188
218
|
end
|
189
219
|
end
|
190
|
-
|
191
|
-
class CustomError < RuntimeError; end
|
192
|
-
|
193
|
-
class CustomIO
|
194
|
-
def initialize(proc, *args)
|
195
|
-
@parent = StringIO.new(*args)
|
196
|
-
@proc = proc
|
197
|
-
end
|
198
|
-
|
199
|
-
def read(size, buf)
|
200
|
-
@proc.call(@parent, size, buf) if @proc
|
201
|
-
end
|
202
|
-
end
|
203
220
|
end
|
204
|
-
|
data/test/test_png.rb
CHANGED
@@ -2,6 +2,7 @@ require 'rubygems'
|
|
2
2
|
require 'minitest/autorun'
|
3
3
|
require 'oil'
|
4
4
|
require 'stringio'
|
5
|
+
require 'helper'
|
5
6
|
|
6
7
|
module Oil
|
7
8
|
class TestPNG < MiniTest::Unit::TestCase
|
@@ -31,7 +32,7 @@ module Oil
|
|
31
32
|
def test_bogus_end_chunk
|
32
33
|
str = PNG_DATA.dup
|
33
34
|
str[-6] = "\x10"
|
34
|
-
|
35
|
+
validate_png resize_string(str)
|
35
36
|
end
|
36
37
|
|
37
38
|
def test_calls_each_during_yield
|
@@ -61,8 +62,14 @@ module Oil
|
|
61
62
|
|
62
63
|
def test_io_returns_too_much_data
|
63
64
|
proc = Proc.new do |io, size, buf|
|
64
|
-
|
65
|
-
|
65
|
+
str = io.read(size)
|
66
|
+
str = str[0..-2] * 2 if str
|
67
|
+
if buf
|
68
|
+
buf.slice!(0,0) # this empties the buffer
|
69
|
+
buf << str
|
70
|
+
else
|
71
|
+
str
|
72
|
+
end
|
66
73
|
end
|
67
74
|
assert_raises(RuntimeError) { custom_io proc, PNG_DATA }
|
68
75
|
end
|
@@ -86,7 +93,11 @@ module Oil
|
|
86
93
|
proc = Proc.new do |parent, size, buf|
|
87
94
|
raise CustomError if flag
|
88
95
|
flag = true
|
89
|
-
|
96
|
+
if buf
|
97
|
+
parent.read(size, buf)
|
98
|
+
else
|
99
|
+
parent.read(size)
|
100
|
+
end
|
90
101
|
end
|
91
102
|
assert_raises(CustomError) { custom_io proc, big_png }
|
92
103
|
end
|
@@ -96,25 +107,40 @@ module Oil
|
|
96
107
|
proc = Proc.new do |parent, size, buf|
|
97
108
|
throw :foo if flag
|
98
109
|
flag = true
|
99
|
-
|
110
|
+
if buf
|
111
|
+
parent.read(size, buf)
|
112
|
+
else
|
113
|
+
parent.read(size)
|
114
|
+
end
|
100
115
|
end
|
101
116
|
catch(:foo){ custom_io proc, big_png }
|
102
117
|
end
|
103
118
|
|
104
119
|
def test_io_shrinks_buffer
|
105
120
|
proc = Proc.new do |parent, size, buf|
|
106
|
-
|
107
|
-
|
121
|
+
if buf
|
122
|
+
parent.read(size, buf)
|
123
|
+
buf.slice!(0, 10)
|
124
|
+
else
|
125
|
+
res = parent.read(size)
|
126
|
+
res[10, -1]
|
127
|
+
end
|
108
128
|
end
|
109
129
|
assert_raises(RuntimeError) { custom_io(proc, big_png) }
|
110
130
|
end
|
111
131
|
|
112
|
-
def
|
132
|
+
def test_io_enlarges_buffer_with_eof
|
113
133
|
proc = Proc.new do |parent, size, buf|
|
114
|
-
|
115
|
-
|
134
|
+
if buf
|
135
|
+
parent.read(size, buf)
|
136
|
+
buf << buf
|
137
|
+
else
|
138
|
+
str = parent.read(size)
|
139
|
+
str * 2
|
140
|
+
end
|
116
141
|
end
|
117
|
-
|
142
|
+
|
143
|
+
assert_raises(RuntimeError) { custom_io(proc, big_png) }
|
118
144
|
end
|
119
145
|
|
120
146
|
# Test yielding
|
@@ -180,18 +206,4 @@ module Oil
|
|
180
206
|
io
|
181
207
|
end
|
182
208
|
end
|
183
|
-
|
184
|
-
class CustomError < RuntimeError; end
|
185
|
-
|
186
|
-
class CustomIO
|
187
|
-
def initialize(proc, *args)
|
188
|
-
@parent = StringIO.new(*args)
|
189
|
-
@proc = proc
|
190
|
-
end
|
191
|
-
|
192
|
-
def read(size, buf)
|
193
|
-
@proc.call(@parent, size, buf) if @proc
|
194
|
-
end
|
195
|
-
end
|
196
209
|
end
|
197
|
-
|
metadata
CHANGED
@@ -1,54 +1,63 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: oil
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.2
|
3
|
+
version: !ruby/object:Gem::Version
|
5
4
|
prerelease:
|
5
|
+
version: 0.0.3
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
8
|
-
- Timothy Elliott
|
7
|
+
authors:
|
8
|
+
- Timothy Elliott
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
12
|
+
|
13
|
+
date: 2012-03-28 00:00:00 Z
|
13
14
|
dependencies: []
|
14
|
-
|
15
|
+
|
16
|
+
description: Oil resizes JPEG and PNG images. It aims for fast performance and low memory use.
|
15
17
|
email: tle@holymonkey.com
|
16
18
|
executables: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
-
|
24
|
-
-
|
25
|
-
- ext/
|
26
|
-
-
|
27
|
-
-
|
19
|
+
|
20
|
+
extensions:
|
21
|
+
- ext/extconf.rb
|
22
|
+
extra_rdoc_files:
|
23
|
+
- README.rdoc
|
24
|
+
files:
|
25
|
+
- Rakefile
|
26
|
+
- README.rdoc
|
27
|
+
- ext/oil.c
|
28
|
+
- ext/extconf.rb
|
29
|
+
- ext/oil.jar
|
30
|
+
- test/helper.rb
|
31
|
+
- test/test_jpeg.rb
|
32
|
+
- test/test_png.rb
|
28
33
|
homepage: http://github.com/ender672/oil
|
29
34
|
licenses: []
|
35
|
+
|
30
36
|
post_install_message:
|
31
37
|
rdoc_options: []
|
32
|
-
|
33
|
-
|
34
|
-
|
38
|
+
|
39
|
+
require_paths:
|
40
|
+
- ext
|
41
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
35
42
|
none: false
|
36
|
-
requirements:
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: "0"
|
47
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
41
48
|
none: false
|
42
|
-
requirements:
|
43
|
-
|
44
|
-
|
45
|
-
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: "0"
|
46
53
|
requirements: []
|
54
|
+
|
47
55
|
rubyforge_project:
|
48
|
-
rubygems_version: 1.8.
|
56
|
+
rubygems_version: 1.8.21
|
49
57
|
signing_key:
|
50
58
|
specification_version: 3
|
51
59
|
summary: Oil resizes JPEG and PNG images.
|
52
|
-
test_files:
|
53
|
-
- test/
|
54
|
-
- test/
|
60
|
+
test_files:
|
61
|
+
- test/helper.rb
|
62
|
+
- test/test_jpeg.rb
|
63
|
+
- test/test_png.rb
|