ruby-vips 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,4 +1,31 @@
1
- # master
1
+ # master
2
+ ...
3
+
4
+ # Version 0.2.0
5
+
6
+ Release date: 2012-06-29
7
+
8
+ ### Added
9
+
10
+ * Add tile_cache [John Cupitt]
11
+ * Add :sequential option to tiff, jpeg and png readers [John Cupitt]
12
+ * Add raise if suitable pkg_config for libvips is not found, thanks to Pierre
13
+ Chapuis [Stanislaw Pankevich]
14
+ * Add backward compatibility of 0.1.x ruby-vips with libvips versions less than 7.28 [John Cupitt]
15
+ * Add Travis. ruby-vips now is being tested on travis-ci.org. [Stanislaw Pankevich]
16
+
17
+ ### Changed
18
+
19
+ * Disable the vips8 operation cache to save some memory [John Cupitt]
20
+ * Update example shrinker [John Cupitt]
21
+
22
+ ### Fixed
23
+
24
+ * #8: Memory allocation-free issues [Grigoriy Chudnov]
25
+
26
+ # Version 0.1.1
27
+
28
+ Release date: 2012-06-22
2
29
 
3
30
  ### Changed
4
31
 
data/README.md CHANGED
@@ -1,11 +1,35 @@
1
- ## ruby-vips : A fast image processing extension for Ruby.
2
-
3
- note: this fork aims to track the latest stable vips. There are no plans to
4
- add more features, just to keep it working.
5
-
6
- ruby-vips is a ruby extension for [vips](http://www.vips.ecs.soton.ac.uk). It is
7
- extremely fast and it can process huge images without requiring the entire image
8
- to be loaded into memory.
1
+ # ruby-vips : A fast image processing extension for Ruby.
2
+
3
+ *Note*: ruby-vips git master is the development version and uses features
4
+ from git master of libvips (the unreleased 7.29) as well. You may prefer
5
+ the stable 0.2 branch of ruby-vips.
6
+
7
+ ruby-vips is a ruby extension for [vips](http://www.vips.ecs.soton.ac.uk).
8
+ It is extremely fast and it can process huge images without requiring the
9
+ entire image to be loaded into memory. For example, the benchmark at
10
+ [vips-benchmarks](https://github.com/stanislaw/vips-benchmarks) loads a large
11
+ image, crops, shrinks, sharpens and saves again:
12
+
13
+ [![Build Status](https://secure.travis-ci.org/jcupitt/ruby-vips.png)](http://travis-ci.org/jcupitt/ruby-vips)
14
+
15
+ <pre>
16
+ real time in seconds, fastest of three runs
17
+ benchmark tiff jpeg
18
+ ruby-vips.rb 0.45 0.56
19
+ rmagick.rb 1.69 1.90
20
+ netpbm.sh 1.74 1.63
21
+ image-magick 2.87 3.02
22
+ image_sci.rb 3.19 2.90
23
+
24
+ peak memory use in kilobytes
25
+ benchmark peak RSS
26
+ ruby-vips.rb 160400
27
+ image_sci.rb 546992
28
+ rmagick.rb 1370064
29
+ </pre>
30
+
31
+ See also [benchmarks at the official libvips
32
+ website](http://www.vips.ecs.soton.ac.uk/index.php?title=Speed_and_Memory_Use).
9
33
 
10
34
  ruby-vips allows you to set up pipelines that don't get executed until you
11
35
  output the image to disk or to a string. This means you can create,
@@ -16,27 +40,30 @@ or to disk.
16
40
  ## Requirements.
17
41
 
18
42
  * OS X or Linux
19
- * MRI 1.8.6, 1.8.7, 1.9.2 or Rubinius 1.0.1
20
- * libvips 7.12.x, 7.20.x, 7.22.x, or 7.23.x
43
+ * MRI 1.8.7, 1.9.2
44
+ * libvips 7.29 and later (it will work with earlier libvips, but some
45
+ features may not be functional -- you may prefer the stable 0.1 branch)
21
46
 
22
47
  ## Installation.
23
48
 
24
49
  ### Ubuntu Prerequisites.
25
50
 
26
- $ apt-get install libvips-dev
27
-
28
- The above installs libvips 7.20.x in Ubuntu 10.04 and 7.12.x in Ubuntu 8.04.
29
- Though ruby-vips will work with libvips 7.12.x, many features are disabled, and
30
- there are a few caveats.
51
+ ```bash
52
+ $ apt-get install libvips-dev
53
+ ```
31
54
 
32
55
  ### OS X Prerequisites.
33
56
 
34
- $ brew install vips -HEAD
35
-
36
- The above installs libvips 7.22.x
57
+ ```bash
58
+ $ brew install vips -HEAD
59
+ ```
37
60
 
38
61
  TODO: Describe & test with macports.
39
62
 
63
+ ### Other platforms
64
+
65
+ See [Installiation on various platforms](https://github.com/jcupitt/ruby-vips/wiki/installiation-on-various-platforms).
66
+
40
67
  ### Installing the gem.
41
68
 
42
69
  ```bash
@@ -51,46 +78,71 @@ gem 'ruby-vips'
51
78
 
52
79
  ## Documentation.
53
80
 
54
- ruby-vips has [rdoc documentation](http://rubyvips.holymonkey.com).
81
+ ruby-vips has [rdoc
82
+ documentation](http://rubydoc.info/gems/ruby-vips/0.1.1/frames). Also
83
+ see [Wiki page](https://github.com/jcupitt/ruby-vips/wiki)
84
+
85
+ ## Small example
55
86
 
56
- ## Example.
87
+ See also the
88
+ [examples](https://github.com/jcupitt/ruby-vips/tree/master/examples)
89
+ directory.
57
90
 
58
- require 'rubygems'
59
- require 'vips'
60
- include VIPS
91
+ ```ruby
92
+ require 'rubygems'
93
+ require 'vips'
94
+
95
+ include VIPS
96
+
97
+ # Create an image object. It will not actually load the image until needed.
98
+ im = Image.jpeg('mypic.jpg')
61
99
 
62
- # Create an image object. It will not actually load the image until needed.
63
- im = Image.jpeg('mypic.jpg')
100
+ # Shrink the jpeg by a factor of four when loading -- huge speed and CPU
101
+ # improvements on large images.
102
+ im = Image.jpeg('mypic.jpg', :shrink_factor => 4)
64
103
 
65
- # Shrink the jpeg by a factor of four when loading -- huge speed and CPU
66
- # improvements on large images.
67
- im = Image.jpeg('mypic.jpg', :shrink_factor => 4)
104
+ # Add a shrink by a factor of two to the pipeline. This will not actually be
105
+ # executed yet.
106
+ im_shrink_by_two = im.shrink(2)
68
107
 
69
- # Add a shrink by a factor of two to the pipeline. This will not actually be
70
- # executed yet.
71
- im_shrink_by_two = im.shrink(2)
108
+ # Write out the shrunk image to a PNG file. This is where the image is
109
+ # actually loaded and resized. With images that allow for random access from
110
+ # the hard drive (VIPS native format, tiled OpenEXR, ppm/pbm/pgm/pfm, tiled
111
+ # tiff, and RAW images), the entire image is never read into memory.
112
+ im_shrink_by_two.png('out.png', :interlace => true)
72
113
 
73
- # Write out the shrunk image to a PNG file. This is where the image is
74
- # actually loaded and resized. With images that allow for random access from
75
- # the hard drive (VIPS native format, tiled OpenEXR, ppm/pbm/pgm/pfm, tiled
76
- # tiff, and RAW images), the entire image is never read into memory.
77
- im_shrink_by_two.png('out.png', :interlace => true)
114
+ # All ruby-vips image commands can be chained, so the above sequence could
115
+ # be written as:
116
+ Image.jpeg('mypic.jpg', :shrink_factor => 4).shrink(2).png('out.png')
117
+
118
+ # The statement above will load the jpeg (pre-shrunk by a factor of four),
119
+ # shrink the image again by a factor of two, and then save as a png image.
120
+
121
+ # If you want to let vips determine file formats, you can use the generic
122
+ # reader and writer:
123
+ Image.new('mypic.jpg').shrink(2).write('out.png')
124
+ ```
78
125
 
79
- # All ruby-vips image commands can be chained, so the above sequence could
80
- # be written as:
81
- Image.jpeg('mypic.jpg', :shrink_factor => 4).shrink(2).png('out.png')
126
+ ## Gotchas
127
+
128
+ ### Contain memuse
129
+
130
+ ruby-vips only finalises vips images on GC. In other words:
131
+
132
+ ```ruby
133
+ a = Image.new(filename)
134
+ a = nil
135
+ ```
82
136
 
83
- # The statement above will load the jpeg (pre-shrunk by a factor of four),
84
- # shrink the image again by a factor of two, and then save as a png image.
137
+ will not release the resources associated with a, you have to
138
+ either request a GC explicitly or wait for Ruby to GC for you. This can
139
+ be a problem if you're processing many images.
85
140
 
86
- # If you want to let vips determine file formats, you can use the generic
87
- # reader and writer:
88
- Image.new('mypic.jpg').shrink(2).write('out.png')
141
+ We suggest you schedule a GC every 100 images processed.
89
142
 
90
143
  ## Why use ruby-vips?
91
144
 
92
145
  - It supports over 250 low-level image and color manipulation operations.
93
- - Operations are chainable, and do not get executed until the image is sent to
94
- an output.
95
- - Fastest ruby library for resizing large images. See [benchmarks at the
96
- official libvips website](http://www.vips.ecs.soton.ac.uk/index.php?title=Speed_and_Memory_Use).
146
+ - Operations are chainable, and do not get executed until the image is sent to an output.
147
+ - Memory use is low, even for very, very large images.
148
+ - Fastest ruby library for resizing large images. See [benchmarks at the official libvips website](http://www.vips.ecs.soton.ac.uk/index.php?title=Speed_and_Memory_Use) and [vips-benchmarks](https://github.com/stanislaw/vips-benchmarks)
data/ext/extconf.rb CHANGED
@@ -4,7 +4,8 @@ require "mkmf"
4
4
 
5
5
  File::unlink("Makefile") if (File::exist?("Makefile"))
6
6
 
7
- %w{7.28 7.27 7.26 7.24 7.23 7.22 7.20}.each{|x| break if pkg_config("vips-#{x}")}
7
+ VIPS_VERSIONS = %w[7.29 7.28 7.27 7.26 7.24 7.23 7.22 7.20]
8
+
9
+ raise("There is no pkg_config for any of following libvips versions: #{VIPS_VERSIONS.join(', ')}") unless VIPS_VERSIONS.detect {|x| pkg_config("vips-#{x}") }
8
10
 
9
- have_header('vips/vips.h')
10
11
  create_makefile('vips_ext')
data/ext/image.c CHANGED
@@ -27,8 +27,8 @@ img_free(vipsImg *im)
27
27
  if(im->in)
28
28
  im_close(im->in);
29
29
 
30
- if(im->deps)
31
- xfree(im->deps);
30
+ if(im->deps)
31
+ free(im->deps);
32
32
 
33
33
  xfree(im);
34
34
  }
@@ -36,10 +36,10 @@ img_free(vipsImg *im)
36
36
  static void
37
37
  img_mark(vipsImg *im)
38
38
  {
39
- int i;
39
+ int i;
40
40
 
41
- for (i = 0; i < im->deps_len; i++)
42
- rb_gc_mark(im->deps[i]);
41
+ for (i = 0; i < im->deps_len; i++)
42
+ rb_gc_mark(im->deps[i]);
43
43
  }
44
44
 
45
45
  VALUE
@@ -49,7 +49,7 @@ img_alloc(VALUE klass)
49
49
  VALUE new = Data_Make_Struct(klass, vipsImg, img_mark, img_free, im);
50
50
  im->in = NULL;
51
51
  im->deps = NULL;
52
- im->deps_len = 0;
52
+ im->deps_len = 0;
53
53
 
54
54
  return new;
55
55
  }
@@ -57,15 +57,15 @@ img_alloc(VALUE klass)
57
57
  void
58
58
  img_add_dep(vipsImg *im, VALUE dep)
59
59
  {
60
- int i;
61
-
62
- for (i = 0; i < im->deps_len; i++)
63
- if (im->deps[i] == dep)
64
- return;
65
-
66
- im->deps_len++;
67
- im->deps = realloc(im->deps, im->deps_len * sizeof(VALUE*));
68
- im->deps[im->deps_len - 1] = dep;
60
+ int i;
61
+
62
+ for (i = 0; i < im->deps_len; i++)
63
+ if (im->deps[i] == dep)
64
+ return;
65
+
66
+ im->deps_len++;
67
+ im->deps = (VALUE*)realloc(im->deps, im->deps_len * sizeof(VALUE));
68
+ im->deps[im->deps_len - 1] = dep;
69
69
  }
70
70
 
71
71
  VALUE
@@ -112,7 +112,7 @@ img_spawn(VALUE parent)
112
112
  VALUE
113
113
  img_spawn2(VALUE parent1, VALUE parent2)
114
114
  {
115
- VALUE new = img_spawn(parent1);
115
+ VALUE new = img_spawn(parent1);
116
116
  vipsImg *im;
117
117
  Data_Get_Struct(new, vipsImg, im);
118
118
 
@@ -123,7 +123,7 @@ img_spawn2(VALUE parent1, VALUE parent2)
123
123
  VALUE
124
124
  img_spawn3(VALUE parent1, VALUE parent2, VALUE parent3)
125
125
  {
126
- VALUE new = img_spawn2(parent1, parent2);
126
+ VALUE new = img_spawn2(parent1, parent2);
127
127
  vipsImg *im;
128
128
  Data_Get_Struct(new, vipsImg, im);
129
129
 
@@ -179,10 +179,10 @@ img_coding_to_id(VipsCoding coding)
179
179
  static VALUE
180
180
  img_vtype(VALUE obj)
181
181
  {
182
- GetImg(obj, data, im);
182
+ GetImg(obj, data, im);
183
183
 
184
184
  if (im)
185
- return ID2SYM(img_vtype_to_id(im->Type));
185
+ return ID2SYM(img_vtype_to_id(im->Type));
186
186
 
187
187
  return Qnil;
188
188
  }
@@ -198,7 +198,7 @@ img_vtype(VALUE obj)
198
198
  static VALUE
199
199
  img_coding(VALUE obj)
200
200
  {
201
- GetImg(obj, data, im);
201
+ GetImg(obj, data, im);
202
202
 
203
203
  if (im)
204
204
  return ID2SYM(img_coding_to_id(im->Coding));
@@ -216,7 +216,7 @@ img_coding(VALUE obj)
216
216
  static VALUE
217
217
  img_kill(VALUE obj)
218
218
  {
219
- GetImg(obj, data, im);
219
+ GetImg(obj, data, im);
220
220
  return INT2FIX(im->kill);
221
221
  }
222
222
 
@@ -230,7 +230,7 @@ img_kill(VALUE obj)
230
230
  static VALUE
231
231
  img_filename(VALUE obj)
232
232
  {
233
- GetImg(obj, data, im);
233
+ GetImg(obj, data, im);
234
234
 
235
235
  if (im)
236
236
  return rb_tainted_str_new2(im->filename);
@@ -240,50 +240,50 @@ img_filename(VALUE obj)
240
240
 
241
241
 
242
242
  #define GETPIX( TYPE, CONVERSION ) { \
243
- TYPE *p = (TYPE *) IM_IMAGE_ADDR(im, x, y); \
243
+ TYPE *p = (TYPE *) IM_IMAGE_ADDR(im, x, y); \
244
244
  \
245
- if (sz == 1) \
246
- return CONVERSION(*p); \
245
+ if (sz == 1) \
246
+ return CONVERSION(*p); \
247
247
  \
248
- ary = rb_ary_new2(sz); \
249
- for (i = 0; i < sz; i++) \
250
- rb_ary_push(ary, CONVERSION(p[i])); \
248
+ ary = rb_ary_new2(sz); \
249
+ for (i = 0; i < sz; i++) \
250
+ rb_ary_push(ary, CONVERSION(p[i])); \
251
251
  \
252
- return ary; \
252
+ return ary; \
253
253
  }
254
254
 
255
255
  #define CGETPIX( TYPE, CONVERSION ) { \
256
- TYPE *p = (TYPE *) IM_IMAGE_ADDR(im, x, y); \
256
+ TYPE *p = (TYPE *) IM_IMAGE_ADDR(im, x, y); \
257
257
  \
258
- ary = rb_ary_new2(sz); \
259
- for (i = 0; i < sz; i++) { \
260
- rb_ary_push(ary, rb_ary_new3(2, CONVERSION(p[0]), CONVERSION(p[1]))); \
261
- p += 2; \
262
- } \
258
+ ary = rb_ary_new2(sz); \
259
+ for (i = 0; i < sz; i++) { \
260
+ rb_ary_push(ary, rb_ary_new3(2, CONVERSION(p[0]), CONVERSION(p[1]))); \
261
+ p += 2; \
262
+ } \
263
263
  \
264
- return ary; \
264
+ return ary; \
265
265
  }
266
266
 
267
267
  static VALUE
268
268
  img_pixel_to_rb(VipsImage *im, int x, int y)
269
269
  {
270
- const int sz = im->Bands;
271
- int i;
272
- VALUE ary;
273
-
274
- switch( im->BandFmt ) {
275
- case IM_BANDFMT_UCHAR: GETPIX( unsigned char, UINT2NUM ); break;
276
- case IM_BANDFMT_CHAR: GETPIX( signed char, INT2NUM ); break;
277
- case IM_BANDFMT_USHORT: GETPIX( unsigned short, UINT2NUM ); break;
278
- case IM_BANDFMT_SHORT: GETPIX( signed short, INT2NUM ); break;
279
- case IM_BANDFMT_UINT: GETPIX( unsigned int, UINT2NUM ); break;
280
- case IM_BANDFMT_INT: GETPIX( signed int, INT2FIX ); break;
281
- case IM_BANDFMT_FLOAT: GETPIX( float, rb_float_new ); break;
282
-
283
- case IM_BANDFMT_DOUBLE: GETPIX( double, rb_float_new ); break;
284
- case IM_BANDFMT_COMPLEX: CGETPIX( float, rb_float_new ); break;
285
- case IM_BANDFMT_DPCOMPLEX: CGETPIX( double, rb_float_new ); break;
286
- }
270
+ const int sz = im->Bands;
271
+ int i;
272
+ VALUE ary;
273
+
274
+ switch( im->BandFmt ) {
275
+ case IM_BANDFMT_UCHAR: GETPIX( unsigned char, UINT2NUM ); break;
276
+ case IM_BANDFMT_CHAR: GETPIX( signed char, INT2NUM ); break;
277
+ case IM_BANDFMT_USHORT: GETPIX( unsigned short, UINT2NUM ); break;
278
+ case IM_BANDFMT_SHORT: GETPIX( signed short, INT2NUM ); break;
279
+ case IM_BANDFMT_UINT: GETPIX( unsigned int, UINT2NUM ); break;
280
+ case IM_BANDFMT_INT: GETPIX( signed int, INT2FIX ); break;
281
+ case IM_BANDFMT_FLOAT: GETPIX( float, rb_float_new ); break;
282
+
283
+ case IM_BANDFMT_DOUBLE: GETPIX( double, rb_float_new ); break;
284
+ case IM_BANDFMT_COMPLEX: CGETPIX( float, rb_float_new ); break;
285
+ case IM_BANDFMT_DPCOMPLEX: CGETPIX( double, rb_float_new ); break;
286
+ }
287
287
  }
288
288
 
289
289
  /*
@@ -301,17 +301,17 @@ img_pixel_to_rb(VipsImage *im, int x, int y)
301
301
  static VALUE
302
302
  img_aref(VALUE obj, VALUE v_x, VALUE v_y)
303
303
  {
304
- int x = NUM2INT(v_x);
305
- int y = NUM2INT(v_y);
306
- GetImg(obj, data, im);
304
+ int x = NUM2INT(v_x);
305
+ int y = NUM2INT(v_y);
306
+ GetImg(obj, data, im);
307
307
 
308
- if (im_incheck(im) || im_check_uncoded("img_aref", im))
309
- vips_lib_error();
308
+ if (im_incheck(im) || im_check_uncoded("img_aref", im))
309
+ vips_lib_error();
310
310
 
311
- if (x >= im->Xsize || x < 0 || y >= im->Ysize || y < 0)
312
- rb_raise(rb_eIndexError, "Index out of bounds");
311
+ if (x >= im->Xsize || x < 0 || y >= im->Ysize || y < 0)
312
+ rb_raise(rb_eIndexError, "Index out of bounds");
313
313
 
314
- return img_pixel_to_rb(im, x, y);
314
+ return img_pixel_to_rb(im, x, y);
315
315
  }
316
316
 
317
317
  /*
@@ -324,21 +324,21 @@ img_aref(VALUE obj, VALUE v_x, VALUE v_y)
324
324
  static VALUE
325
325
  img_each_pixel(VALUE obj)
326
326
  {
327
- int x, y;
328
- VALUE pixel;
329
- GetImg(obj, data, im);
327
+ int x, y;
328
+ VALUE pixel;
329
+ GetImg(obj, data, im);
330
330
 
331
- if (im_incheck(im) || im_check_uncoded("img_each_pixel", im))
332
- return( Qnil );
331
+ if (im_incheck(im) || im_check_uncoded("img_each_pixel", im))
332
+ return( Qnil );
333
333
 
334
334
  for(y = 0; y < im->Ysize; y++) {
335
- for(x = 0; x < im->Xsize; x++) {
336
- pixel = img_pixel_to_rb(im, x, y);
337
- rb_yield(rb_ary_new3(3, pixel, INT2FIX(x), INT2FIX(y)));
338
- }
339
- }
335
+ for(x = 0; x < im->Xsize; x++) {
336
+ pixel = img_pixel_to_rb(im, x, y);
337
+ rb_yield(rb_ary_new3(3, pixel, INT2FIX(x), INT2FIX(y)));
338
+ }
339
+ }
340
340
 
341
- return obj;
341
+ return obj;
342
342
  }
343
343
 
344
344
  /*
@@ -351,12 +351,12 @@ img_each_pixel(VALUE obj)
351
351
  static VALUE
352
352
  img_data(VALUE obj)
353
353
  {
354
- GetImg(obj, data, im);
354
+ GetImg(obj, data, im);
355
355
 
356
- if (im_incheck(im) || im_check_uncoded("img_aref", im))
357
- return( Qnil );
356
+ if (im_incheck(im) || im_check_uncoded("img_aref", im))
357
+ return( Qnil );
358
358
 
359
- return rb_tainted_str_new(im->data, IM_IMAGE_SIZEOF_LINE(im) * im->Ysize);
359
+ return rb_tainted_str_new(im->data, IM_IMAGE_SIZEOF_LINE(im) * im->Ysize);
360
360
  }
361
361
 
362
362
  /*
@@ -398,8 +398,8 @@ init_Image(void)
398
398
  rb_define_singleton_method(cVIPSImage, "fractsurf", img_s_fractsurf, 2); // in image_freq_filt.c
399
399
  rb_define_singleton_method(cVIPSImage, "identity", img_s_identity, 1); // in image_histograms_lut.c
400
400
  rb_define_singleton_method(cVIPSImage, "identity_ushort", img_s_identity_ushort, 2); // in image_histograms_lut.c
401
- rb_define_singleton_method(cVIPSImage, "invertlut", img_s_invertlut, 2); // in image_histograms_lut.c
402
- rb_define_singleton_method(cVIPSImage, "buildlut", img_s_buildlut, 1); // in image_histograms_lut.c
401
+ rb_define_singleton_method(cVIPSImage, "invertlut", img_s_invertlut, 2); // in image_histograms_lut.c
402
+ rb_define_singleton_method(cVIPSImage, "buildlut", img_s_buildlut, 1); // in image_histograms_lut.c
403
403
  rb_define_singleton_method(cVIPSImage, "tone_build_range", img_s_tone_build_range, 10); // in image_histograms_lut.c
404
404
  rb_define_singleton_method(cVIPSImage, "tone_build", img_s_tone_build, 8); // in image_histograms_lut.c
405
405
 
@@ -410,47 +410,47 @@ init_Image(void)
410
410
  rb_define_method(cVIPSImage, "coding", img_coding, 0);
411
411
  rb_define_method(cVIPSImage, "filename", img_filename, 0);
412
412
  rb_define_method(cVIPSImage, "kill", img_kill, 0);
413
- rb_define_method(cVIPSImage, "measure_area", img_measure_area, 7); // in image_arithmetic.c
414
- rb_define_method(cVIPSImage, "stats", img_stats, 0); // in image_arithmetic.c
415
- rb_define_method(cVIPSImage, "max", img_max, 0); // in image_arithmetic.c
416
- rb_define_method(cVIPSImage, "min", img_min, 0); // in image_arithmetic.c
417
- rb_define_method(cVIPSImage, "avg", img_avg, 0); // in image_arithmetic.c
418
- rb_define_method(cVIPSImage, "deviate", img_deviate, 0); // in image_arithmetic.c
419
- rb_define_method(cVIPSImage, "maxpos", img_maxpos, -1); // in image_arithmetic.c
420
- rb_define_method(cVIPSImage, "minpos", img_minpos, -1); // in image_arithmetic.c
421
- rb_define_method(cVIPSImage, "maxpos_avg", img_maxpos_avg, 0); // in image_arithmetic.c
422
- rb_define_method(cVIPSImage, "bandmean", img_bandmean, 0); // in image_arithmetic.c
423
- rb_define_method(cVIPSImage, "add", img_add, 1); // in image_arithmetic.c
424
- rb_define_alias(cVIPSImage, "+", "add");
425
- rb_define_method(cVIPSImage, "subtract", img_subtract, 1); // in image_arithmetic.c
426
- rb_define_alias(cVIPSImage, "-", "subtract");
427
- rb_define_method(cVIPSImage, "invert", img_invert, 0); // in image_arithmetic.c
428
- rb_define_method(cVIPSImage, "lin", img_lin, 2); // in image_arithmetic.c
429
- rb_define_method(cVIPSImage, "multiply", img_multiply, 1); // in image_arithmetic.c
430
- rb_define_alias(cVIPSImage, "*", "multiply");
431
- rb_define_method(cVIPSImage, "divide", img_divide, 1); // in image_arithmetic.c
432
- rb_define_alias(cVIPSImage, "/", "divide");
433
- rb_define_method(cVIPSImage, "remainder", img_remainder, -1); // in image_arithmetic.c
434
- rb_define_method(cVIPSImage, "%", img_remainder_binop, 1);
435
- rb_define_method(cVIPSImage, "recomb", img_recomb, 1); // in image_arithmetic.c
436
- rb_define_method(cVIPSImage, "sign", img_sign, 0); // in image_arithmetic.c
437
- rb_define_method(cVIPSImage, "abs", img_abs, 0); // in image_arithmetic.c
438
- rb_define_method(cVIPSImage, "floor", img_floor, 0); // in image_arithmetic.c
439
- rb_define_method(cVIPSImage, "rint", img_rint, 0); // in image_arithmetic.c
440
- rb_define_method(cVIPSImage, "ceil", img_ceil, 0); // in image_arithmetic.c
441
- rb_define_method(cVIPSImage, "point", img_point, 4); // in image_arithmetic.c
442
- rb_define_method(cVIPSImage, "pow", img_pow, -1); // in image_arithmetic.c
443
- rb_define_method(cVIPSImage, "**", img_pow_binop, 1); // in image_arithmetic.c
444
- rb_define_method(cVIPSImage, "expn", img_expn, -1); // in image_arithmetic.c
445
- rb_define_method(cVIPSImage, "log", img_log, 0); // in image_arithmetic.c
446
- rb_define_method(cVIPSImage, "log10", img_log10, 0); // in image_arithmetic.c
447
- rb_define_method(cVIPSImage, "sin", img_sin, 0); // in image_arithmetic.c
448
- rb_define_method(cVIPSImage, "cos", img_cos, 0); // in image_arithmetic.c
449
- rb_define_method(cVIPSImage, "tan", img_tan, 0); // in image_arithmetic.c
450
- rb_define_method(cVIPSImage, "asin", img_asin, 0); // in image_arithmetic.c
451
- rb_define_method(cVIPSImage, "acos", img_acos, 0); // in image_arithmetic.c
452
- rb_define_method(cVIPSImage, "atan", img_atan, 0); // in image_arithmetic.c
453
- rb_define_method(cVIPSImage, "cross_phase", img_cross_phase, 1); // in image_arithmetic.c
413
+ rb_define_method(cVIPSImage, "measure_area", img_measure_area, 7); // in image_arithmetic.c
414
+ rb_define_method(cVIPSImage, "stats", img_stats, 0); // in image_arithmetic.c
415
+ rb_define_method(cVIPSImage, "max", img_max, 0); // in image_arithmetic.c
416
+ rb_define_method(cVIPSImage, "min", img_min, 0); // in image_arithmetic.c
417
+ rb_define_method(cVIPSImage, "avg", img_avg, 0); // in image_arithmetic.c
418
+ rb_define_method(cVIPSImage, "deviate", img_deviate, 0); // in image_arithmetic.c
419
+ rb_define_method(cVIPSImage, "maxpos", img_maxpos, -1); // in image_arithmetic.c
420
+ rb_define_method(cVIPSImage, "minpos", img_minpos, -1); // in image_arithmetic.c
421
+ rb_define_method(cVIPSImage, "maxpos_avg", img_maxpos_avg, 0); // in image_arithmetic.c
422
+ rb_define_method(cVIPSImage, "bandmean", img_bandmean, 0); // in image_arithmetic.c
423
+ rb_define_method(cVIPSImage, "add", img_add, 1); // in image_arithmetic.c
424
+ rb_define_alias(cVIPSImage, "+", "add");
425
+ rb_define_method(cVIPSImage, "subtract", img_subtract, 1); // in image_arithmetic.c
426
+ rb_define_alias(cVIPSImage, "-", "subtract");
427
+ rb_define_method(cVIPSImage, "invert", img_invert, 0); // in image_arithmetic.c
428
+ rb_define_method(cVIPSImage, "lin", img_lin, 2); // in image_arithmetic.c
429
+ rb_define_method(cVIPSImage, "multiply", img_multiply, 1); // in image_arithmetic.c
430
+ rb_define_alias(cVIPSImage, "*", "multiply");
431
+ rb_define_method(cVIPSImage, "divide", img_divide, 1); // in image_arithmetic.c
432
+ rb_define_alias(cVIPSImage, "/", "divide");
433
+ rb_define_method(cVIPSImage, "remainder", img_remainder, -1); // in image_arithmetic.c
434
+ rb_define_method(cVIPSImage, "%", img_remainder_binop, 1);
435
+ rb_define_method(cVIPSImage, "recomb", img_recomb, 1); // in image_arithmetic.c
436
+ rb_define_method(cVIPSImage, "sign", img_sign, 0); // in image_arithmetic.c
437
+ rb_define_method(cVIPSImage, "abs", img_abs, 0); // in image_arithmetic.c
438
+ rb_define_method(cVIPSImage, "floor", img_floor, 0); // in image_arithmetic.c
439
+ rb_define_method(cVIPSImage, "rint", img_rint, 0); // in image_arithmetic.c
440
+ rb_define_method(cVIPSImage, "ceil", img_ceil, 0); // in image_arithmetic.c
441
+ rb_define_method(cVIPSImage, "point", img_point, 4); // in image_arithmetic.c
442
+ rb_define_method(cVIPSImage, "pow", img_pow, -1); // in image_arithmetic.c
443
+ rb_define_method(cVIPSImage, "**", img_pow_binop, 1); // in image_arithmetic.c
444
+ rb_define_method(cVIPSImage, "expn", img_expn, -1); // in image_arithmetic.c
445
+ rb_define_method(cVIPSImage, "log", img_log, 0); // in image_arithmetic.c
446
+ rb_define_method(cVIPSImage, "log10", img_log10, 0); // in image_arithmetic.c
447
+ rb_define_method(cVIPSImage, "sin", img_sin, 0); // in image_arithmetic.c
448
+ rb_define_method(cVIPSImage, "cos", img_cos, 0); // in image_arithmetic.c
449
+ rb_define_method(cVIPSImage, "tan", img_tan, 0); // in image_arithmetic.c
450
+ rb_define_method(cVIPSImage, "asin", img_asin, 0); // in image_arithmetic.c
451
+ rb_define_method(cVIPSImage, "acos", img_acos, 0); // in image_arithmetic.c
452
+ rb_define_method(cVIPSImage, "atan", img_atan, 0); // in image_arithmetic.c
453
+ rb_define_method(cVIPSImage, "cross_phase", img_cross_phase, 1); // in image_arithmetic.c
454
454
  rb_define_method(cVIPSImage, "and", img_and, -1); // in image_boolean.c
455
455
  rb_define_method(cVIPSImage, "&", img_and_binop, 1);
456
456
  rb_define_method(cVIPSImage, "or", img_or, -1); // in image_boolean.c
@@ -488,12 +488,12 @@ init_Image(void)
488
488
  rb_define_method(cVIPSImage, "de00_from_lab", img_de00_from_lab, 1); // in image_colour.c
489
489
  rb_define_method(cVIPSImage, "de_from_xyz", img_de_from_xyz, 1); // in image_colour.c
490
490
  rb_define_method(cVIPSImage, "de_from_lab", img_de_from_lab, 1); // in image_colour.c
491
- rb_define_method(cVIPSImage, "im_lab_morph", img_lab_morph, 5); // in image_colour.c
492
- rb_define_method(cVIPSImage, "icc_transform", img_icc_transform, 3); // in image_colour.c
493
- rb_define_method(cVIPSImage, "icc_import", img_icc_import, 2); // in image_colour.c
494
- rb_define_method(cVIPSImage, "icc_import_embedded", img_icc_import_embedded, 1); // in image_colour.c
495
- rb_define_method(cVIPSImage, "icc_export_depth", img_icc_export_depth, 3); // in image_colour.c
496
- rb_define_method(cVIPSImage, "icc_ac2rc", img_icc_ac2rc, 1); // in image_colour.c
491
+ rb_define_method(cVIPSImage, "im_lab_morph", img_lab_morph, 5); // in image_colour.c
492
+ rb_define_method(cVIPSImage, "icc_transform", img_icc_transform, 3); // in image_colour.c
493
+ rb_define_method(cVIPSImage, "icc_import", img_icc_import, 2); // in image_colour.c
494
+ rb_define_method(cVIPSImage, "icc_import_embedded", img_icc_import_embedded, 1); // in image_colour.c
495
+ rb_define_method(cVIPSImage, "icc_export_depth", img_icc_export_depth, 3); // in image_colour.c
496
+ rb_define_method(cVIPSImage, "icc_ac2rc", img_icc_ac2rc, 1); // in image_colour.c
497
497
  rb_define_method(cVIPSImage, "to_mask", img_to_mask, 0); // in image_conversion.c
498
498
  rb_define_method(cVIPSImage, "copy_file", img_copy_file, 0); // in image_conversion.c
499
499
  rb_define_method(cVIPSImage, "dup", img_dup, 0); // in image_conversion.c
@@ -512,6 +512,7 @@ init_Image(void)
512
512
  rb_define_method(cVIPSImage, "extract_band", img_extract_band, -1); // in image_conversion.c
513
513
  rb_define_method(cVIPSImage, "extract_area", img_extract_area, -1); // in image_conversion.c
514
514
  rb_define_method(cVIPSImage, "embed", img_embed, 5); // in image_conversion.c
515
+ rb_define_method(cVIPSImage, "tile_cache", img_tile_cache, 3); // in image_conversion.c
515
516
  rb_define_method(cVIPSImage, "bandjoin", img_bandjoin, -1); // in image_conversion.c
516
517
  rb_define_method(cVIPSImage, "insert", img_insert, -1); // in image_conversion.c
517
518
  rb_define_method(cVIPSImage, "insert_noexpand", img_insert_noexpand, 3); // in image_conversion.c
@@ -542,7 +543,7 @@ init_Image(void)
542
543
  rb_define_method(cVIPSImage, "addgnoise", img_addgnoise, 1); // in image_convolution.c
543
544
  rb_define_method(cVIPSImage, "fwfft", img_fwfft, 0); // in image_freq_filt.c
544
545
  rb_define_method(cVIPSImage, "invfft", img_invfft, 0); // in image_freq_filt.c
545
- rb_define_method(cVIPSImage, "rotquad", img_rotquad, 0); // in image_freq_filt.c
546
+ rb_define_method(cVIPSImage, "rotquad", img_rotquad, 0); // in image_freq_filt.c
546
547
  rb_define_method(cVIPSImage, "invfftr", img_invfftr, 0); // in image_freq_filt.c
547
548
  rb_define_method(cVIPSImage, "freqflt", img_freqflt, 1); // in image_freq_filt.c
548
549
  rb_define_method(cVIPSImage, "disp_ps", img_disp_ps, 0); // in image_freq_filt.c
@@ -565,20 +566,20 @@ init_Image(void)
565
566
  rb_define_method(cVIPSImage, "lhisteq", img_lhisteq, 2); // in image_histograms_lut.c
566
567
  rb_define_method(cVIPSImage, "stdif", img_stdif, 6); // in image_histograms_lut.c
567
568
  rb_define_method(cVIPSImage, "tone_analyze", img_tone_analyze, 6); // in image_histograms_lut.c
568
- rb_define_method(cVIPSImage, "maplut", img_maplut, 1); // in image_histograms_lut.c
569
- rb_define_method(cVIPSImage, "histplot", img_histplot, 0); // in image_histograms_lut.c
569
+ rb_define_method(cVIPSImage, "maplut", img_maplut, 1); // in image_histograms_lut.c
570
+ rb_define_method(cVIPSImage, "histplot", img_histplot, 0); // in image_histograms_lut.c
570
571
  rb_define_method(cVIPSImage, "dilate", img_dilate, 1); // in image_morphology.c
571
572
  rb_define_method(cVIPSImage, "erode", img_erode, 1); // in image_morphology.c
572
573
  rb_define_method(cVIPSImage, "rank", img_rank, 3); // in image_morphology.c
573
- rb_define_method(cVIPSImage, "rank_image", img_rank_image, -1); // in image_morphology.c
574
- rb_define_method(cVIPSImage, "maxvalue", img_maxvalue, -1); // in image_morphology.c
575
- rb_define_method(cVIPSImage, "cntlines_h", img_cntlines_h, 0); // in image_morphology.c
576
- rb_define_method(cVIPSImage, "cntlines_v", img_cntlines_v, 0); // in image_morphology.c
577
- rb_define_method(cVIPSImage, "zerox_pos", img_zerox_pos, 0); // in image_morphology.c
578
- rb_define_method(cVIPSImage, "zerox_neg", img_zerox_neg, 0); // in image_morphology.c
579
- rb_define_method(cVIPSImage, "profile_h", img_profile_h, 0); // in image_morphology.c
580
- rb_define_method(cVIPSImage, "profile_v", img_profile_v, 0); // in image_morphology.c
581
- rb_define_method(cVIPSImage, "label_regions", img_label_regions, 0); // in image_morphology.c
574
+ rb_define_method(cVIPSImage, "rank_image", img_rank_image, -1); // in image_morphology.c
575
+ rb_define_method(cVIPSImage, "maxvalue", img_maxvalue, -1); // in image_morphology.c
576
+ rb_define_method(cVIPSImage, "cntlines_h", img_cntlines_h, 0); // in image_morphology.c
577
+ rb_define_method(cVIPSImage, "cntlines_v", img_cntlines_v, 0); // in image_morphology.c
578
+ rb_define_method(cVIPSImage, "zerox_pos", img_zerox_pos, 0); // in image_morphology.c
579
+ rb_define_method(cVIPSImage, "zerox_neg", img_zerox_neg, 0); // in image_morphology.c
580
+ rb_define_method(cVIPSImage, "profile_h", img_profile_h, 0); // in image_morphology.c
581
+ rb_define_method(cVIPSImage, "profile_v", img_profile_v, 0); // in image_morphology.c
582
+ rb_define_method(cVIPSImage, "label_regions", img_label_regions, 0); // in image_morphology.c
582
583
  rb_define_method(cVIPSImage, "lrmerge", img_lrmerge, -1); // in image_mosaicing.c
583
584
  rb_define_method(cVIPSImage, "tbmerge", img_tbmerge, -1); // in image_mosaicing.c
584
585
  rb_define_method(cVIPSImage, "lrmerge1", img_lrmerge1, -1); // in image_mosaicing.c
@@ -590,8 +591,8 @@ init_Image(void)
590
591
  rb_define_method(cVIPSImage, "global_balance", img_global_balance, 1); // in image_mosaicing.c
591
592
  rb_define_method(cVIPSImage, "global_balancef", img_global_balancef, 1); // in image_mosaicing.c
592
593
  rb_define_method(cVIPSImage, "correl", img_correl, 7); // in image_mosaicing.c
593
- rb_define_method(cVIPSImage, "align_bands", img_align_bands, 0); // in image_mosaicing.c
594
- rb_define_method(cVIPSImage, "maxpos_subpel", img_maxpos_subpel, 0); // in image_mosaicing.c
594
+ rb_define_method(cVIPSImage, "align_bands", img_align_bands, 0); // in image_mosaicing.c
595
+ rb_define_method(cVIPSImage, "maxpos_subpel", img_maxpos_subpel, 0); // in image_mosaicing.c
595
596
  rb_define_method(cVIPSImage, "equal", img_equal, -1); // in image_relational.c
596
597
  rb_define_method(cVIPSImage, "notequal", img_notequal, -1); // in image_relational.c
597
598
  rb_define_method(cVIPSImage, "less", img_less, -1); // in image_relational.c
@@ -608,24 +609,24 @@ init_Image(void)
608
609
  rb_define_method(cVIPSImage, "match_linear", img_match_linear, 9); // in image_resample.c
609
610
  rb_define_method(cVIPSImage, "match_linear_search", img_match_linear_search, 11); // in image_resample.c
610
611
 
611
- id_b_w = rb_intern("B_W");
612
- id_histogram = rb_intern("HISTOGRAM");
613
- id_fourier = rb_intern("FOURIER");
614
- id_xyz = rb_intern("XYZ");
615
- id_lab = rb_intern("LAB");
616
- id_cmyk = rb_intern("CMYK");
617
- id_labq = rb_intern("LABQ");
618
- id_rgb = rb_intern("RGB");
619
- id_ucs = rb_intern("UCS");
620
- id_lch = rb_intern("LCH");
621
- id_labs = rb_intern("LABS");
622
- id_srgb = rb_intern("sRGB");
623
- id_yxy = rb_intern("YXY");
624
- id_rgb16 = rb_intern("RGB16");
625
- id_grey16 = rb_intern("GREY16");
626
-
627
- id_none = rb_intern("NONE");
628
- id_rad = rb_intern("RAD");
612
+ id_b_w = rb_intern("B_W");
613
+ id_histogram = rb_intern("HISTOGRAM");
614
+ id_fourier = rb_intern("FOURIER");
615
+ id_xyz = rb_intern("XYZ");
616
+ id_lab = rb_intern("LAB");
617
+ id_cmyk = rb_intern("CMYK");
618
+ id_labq = rb_intern("LABQ");
619
+ id_rgb = rb_intern("RGB");
620
+ id_ucs = rb_intern("UCS");
621
+ id_lch = rb_intern("LCH");
622
+ id_labs = rb_intern("LABS");
623
+ id_srgb = rb_intern("sRGB");
624
+ id_yxy = rb_intern("YXY");
625
+ id_rgb16 = rb_intern("RGB16");
626
+ id_grey16 = rb_intern("GREY16");
627
+
628
+ id_none = rb_intern("NONE");
629
+ id_rad = rb_intern("RAD");
629
630
 
630
631
  init_Image_colour();
631
632
  init_Image_conversion();
@@ -473,6 +473,30 @@ img_embed(VALUE obj, VALUE type_v, VALUE x, VALUE y, VALUE width, VALUE height)
473
473
  return new;
474
474
  }
475
475
 
476
+ /*
477
+ * call-seq:
478
+ * im.tile_cache(tile_width, tile_height, max_tiles) -> image
479
+ *
480
+ * This operation behaves rather like copy between images,
481
+ * except that it keeps a cache of computed pixels.
482
+ * This cache is made of up to max_tiles tiles (a value of -1 for
483
+ * means any number of tiles), and each tile is of size tile_width
484
+ * by tile_height pixels.
485
+ */
486
+
487
+ VALUE
488
+ img_tile_cache(VALUE obj, VALUE tile_width, VALUE tile_height, VALUE max_tiles)
489
+ {
490
+ GetImg(obj, data, im);
491
+ OutImg(obj, new, data_new, im_new);
492
+
493
+ if (im_tile_cache(im, im_new,
494
+ NUM2INT(tile_width), NUM2INT(tile_height), NUM2INT(max_tiles)))
495
+ vips_lib_error();
496
+
497
+ return new;
498
+ }
499
+
476
500
  /*
477
501
  * call-seq:
478
502
  * im.bandjoin(other_image, ...) -> image
@@ -19,6 +19,7 @@ VALUE img_s_text(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE);
19
19
  VALUE img_extract_band(int, VALUE*, VALUE);
20
20
  VALUE img_extract_area(int, VALUE*, VALUE);
21
21
  VALUE img_embed(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE);
22
+ VALUE img_tile_cache(VALUE, VALUE, VALUE, VALUE);
22
23
  VALUE img_bandjoin(int, VALUE *argv, VALUE);
23
24
  VALUE img_insert_noexpand(VALUE, VALUE, VALUE, VALUE);
24
25
  VALUE img_insert(int, VALUE *argv, VALUE);
@@ -34,4 +35,4 @@ VALUE img_rot180(VALUE);
34
35
  VALUE img_rot270(VALUE);
35
36
  VALUE img_subsample(int, VALUE*, VALUE);
36
37
  VALUE img_zoom(int, VALUE*, VALUE);
37
- void init_Image_conversion();
38
+ void init_Image_conversion();
data/ext/ruby_vips.c CHANGED
@@ -72,8 +72,8 @@ init_vips_library()
72
72
  argv_0 = rb_gv_get("0");
73
73
 
74
74
  if (NIL_P(argv_0))
75
- im_init_world("");
76
- else
75
+ im_init_world("");
76
+ else
77
77
  im_init_world(RSTRING_PTR(argv_0));
78
78
 
79
79
  argv_v = rb_const_get(rb_mKernel, rb_intern("ARGV"));
@@ -88,8 +88,6 @@ init_vips_library()
88
88
  for (i=0; i < argc - 1; i++)
89
89
  argv[i+1] = RSTRING_PTR(RARRAY_PTR(argv_v)[i]);
90
90
 
91
- im_init_world(argv[0]);
92
-
93
91
  context = g_option_context_new("- ruby-vips");
94
92
  g_option_context_set_ignore_unknown_options(context, TRUE);
95
93
 
@@ -100,6 +98,13 @@ init_vips_library()
100
98
 
101
99
  xfree(argv);
102
100
  }
101
+
102
+ /* We use the vips7 interface, so the vips8 cache will not help us.
103
+ * Disable it and save 100mb or so of memory in vips-7.28 and later.
104
+ */
105
+ #if IM_MAJOR_VERSION >= 7 && IM_MINOR_VERSION >= 28
106
+ vips_cache_set_max_mem( 0 );
107
+ #endif
103
108
  }
104
109
 
105
110
  /*
data/lib/vips/reader.rb CHANGED
@@ -69,6 +69,7 @@ module VIPS
69
69
  class JPEGReader < Reader
70
70
  attr_reader :shrink_factor
71
71
  attr_accessor :fail_on_warn
72
+ attr_accessor :sequential
72
73
 
73
74
  SHRINK_FACTOR = [1, 2, 4, 8]
74
75
 
@@ -76,9 +77,11 @@ module VIPS
76
77
  def initialize(path, options={})
77
78
  @shrink_factor = 1
78
79
  @fail_on_warn = false
80
+ @sequential = false
79
81
 
80
82
  self.shrink_factor = options[:shrink_factor] if options.has_key?(:shrink_factor)
81
83
  self.fail_on_warn = options[:fail_on_warn] if options.has_key?(:fail_on_warn)
84
+ self.sequential = options[:sequential] if options.has_key?(:sequential)
82
85
 
83
86
  super path, options
84
87
  end
@@ -86,7 +89,10 @@ module VIPS
86
89
  # Read the jpeg file from disk and return a VIPS Image object.
87
90
  def read
88
91
  str = "#{@path}:#{shrink_factor}"
89
- str << ",fail" if @fail_on_warn
92
+ str << ","
93
+ str << "fail" if @fail_on_warn
94
+ str << ","
95
+ str << "sequential" if @sequential
90
96
 
91
97
  read_internal str
92
98
  end
@@ -105,17 +111,24 @@ module VIPS
105
111
 
106
112
  class TIFFReader < Reader
107
113
  attr_reader :page_number
114
+ attr_accessor :sequential
108
115
 
109
116
  # Create a tiff image file reader.
110
117
  def initialize(path, options={})
118
+ @page_number = nil
119
+ @sequential = false
120
+
111
121
  self.page_number = options[:page_number] if options.has_key?(:page_number)
122
+ self.sequential = options[:sequential] if options.has_key?(:sequential)
112
123
  super path, options
113
124
  end
114
125
 
115
126
  # Read the tiff file from disk and return a VIPS Image object.
116
127
  def read
117
- str = @path
118
- str << ":#{@page_number}" if @page_number
128
+ str = "#{@path}:"
129
+ str << "#{@page_number}" if @page_number
130
+ str << ","
131
+ str << "sequential" if @sequential
119
132
 
120
133
  read_internal str
121
134
  end
@@ -131,6 +144,27 @@ module VIPS
131
144
  end
132
145
  end
133
146
 
147
+ class PNGReader < Reader
148
+ attr_accessor :sequential
149
+
150
+ # Create a png image file reader.
151
+ def initialize(path, options={})
152
+ @sequential = false
153
+
154
+ self.sequential = options[:sequential] if options.has_key?(:sequential)
155
+ super path, options
156
+ end
157
+
158
+ # Read the png file from disk and return a VIPS Image object.
159
+ def read
160
+ str = @path
161
+ str << ":"
162
+ str << "sequential" if @sequential
163
+
164
+ read_internal str
165
+ end
166
+ end
167
+
134
168
  class Image
135
169
 
136
170
  # Load a ppm file straight to a VIPS Image.
data/lib/vips/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module VIPS
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
data/ruby-vips.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "ruby-vips"
8
- s.version = "0.1.1"
8
+ s.version = "0.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Timothy Elliott", "John Cupitt"]
12
- s.date = "2012-06-21"
12
+ s.date = "2012-06-29"
13
13
  s.description = "Ruby extension for the vips image processing library."
14
14
  s.email = "jcupitt@gmail.com"
15
15
  s.extensions = ["ext/extconf.rb"]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-vips
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-06-21 00:00:00.000000000 Z
13
+ date: 2012-06-29 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rdoc
@@ -146,7 +146,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
146
146
  version: '0'
147
147
  segments:
148
148
  - 0
149
- hash: -88150975
149
+ hash: -423159501
150
150
  required_rubygems_version: !ruby/object:Gem::Requirement
151
151
  none: false
152
152
  requirements: