ruby-vips 0.2.1 → 0.3.0

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.
@@ -1,11 +1,25 @@
1
1
  # master
2
2
 
3
+ # Version 0.3.0
4
+
5
+ Release date: 2012-07-20
6
+
7
+ ### Added
8
+
9
+ * More rspec tests [John Cupitt]
10
+ * Updated to libvips-7.30 [John Cupitt]
11
+
3
12
  ### Changed
4
13
 
14
+ * Reworked Reader class offers better performance and compatibility [John
15
+ Cupitt]
5
16
  * Don't use :sequential option for older libvipses [John Cupitt]
17
+ * Rename "tone_analyze" as "tone_analyse" for consistency with the rest of
18
+ vips [John CUpitt]
6
19
 
7
20
  ### Fixed
8
21
 
22
+ * Now passes rspec test suite cleanly in valgrind [John Cupitt]
9
23
  * Fixed check of sequential mode support [Stanislaw Pankevich]
10
24
 
11
25
  # Version 0.2.0
data/README.md CHANGED
@@ -1,24 +1,20 @@
1
1
  # ruby-vips : A fast image processing extension for Ruby.
2
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
3
  [![Build Status](https://secure.travis-ci.org/jcupitt/ruby-vips.png)](http://travis-ci.org/jcupitt/ruby-vips)
8
4
 
9
5
  ruby-vips is a ruby extension for [vips](http://www.vips.ecs.soton.ac.uk).
10
- It is extremely fast and it can process huge images without requiring the
6
+ It is fast and it can process images without requiring the
11
7
  entire image to be loaded into memory. For example, the benchmark at
12
8
  [vips-benchmarks](https://github.com/stanislaw/vips-benchmarks) loads a large
13
9
  image, crops, shrinks, sharpens and saves again:
14
10
 
15
- <pre>
11
+ ```text
16
12
  real time in seconds, fastest of three runs
17
13
  benchmark tiff jpeg
18
14
  ruby-vips.rb 0.45 0.56
19
15
  rmagick.rb 1.69 1.90
20
16
  netpbm.sh 1.74 1.63
21
- image-magick 2.87 3.02
17
+ image-magick.sh 2.87 3.02
22
18
  image_sci.rb 3.19 2.90
23
19
 
24
20
  peak memory use in kilobytes
@@ -26,7 +22,7 @@ benchmark peak RSS
26
22
  ruby-vips.rb 160400
27
23
  image_sci.rb 546992
28
24
  rmagick.rb 1370064
29
- </pre>
25
+ ```
30
26
 
31
27
  See also [benchmarks at the official libvips
32
28
  website](http://www.vips.ecs.soton.ac.uk/index.php?title=Speed_and_Memory_Use).
@@ -45,7 +41,7 @@ or to disk.
45
41
  * OS X or Linux
46
42
  * MRI 1.8.7, 1.9.2
47
43
  * libvips 7.29 and later (it will work with earlier libvips, but some
48
- features may not be functional -- you may prefer the stable 0.1 branch)
44
+ features may not be functional)
49
45
 
50
46
  ## Installation.
51
47
 
@@ -65,7 +61,8 @@ TODO: Describe & test with macports.
65
61
 
66
62
  ### Other platforms
67
63
 
68
- See [Installiation on various platforms](https://github.com/jcupitt/ruby-vips/wiki/installiation-on-various-platforms).
64
+ See [Installation on various
65
+ platforms](https://github.com/jcupitt/ruby-vips/wiki/installation-on-various-platforms).
69
66
 
70
67
  ### Installing the gem.
71
68
 
@@ -73,6 +70,16 @@ See [Installiation on various platforms](https://github.com/jcupitt/ruby-vips/wi
73
70
  $ gem install ruby-vips
74
71
  ```
75
72
 
73
+ Alternatively, for a debug build:
74
+
75
+ ```bash
76
+ $ gem install ruby-vips -- --enable-debug
77
+ ```
78
+
79
+ ```bash
80
+ $ gem install ruby-vips
81
+ ```
82
+
76
83
  or include it in Gemfile:
77
84
 
78
85
  ```ruby
@@ -82,7 +89,7 @@ gem 'ruby-vips'
82
89
  ## Documentation.
83
90
 
84
91
  ruby-vips has [rdoc
85
- documentation](http://rubydoc.info/gems/ruby-vips/0.1.1/frames). Also
92
+ documentation](http://rubydoc.info/gems/ruby-vips/0.2.0/frames). Also
86
93
  see [Wiki page](https://github.com/jcupitt/ruby-vips/wiki)
87
94
 
88
95
  ## Small example
@@ -97,12 +104,17 @@ require 'vips'
97
104
 
98
105
  include VIPS
99
106
 
100
- # Create an image object. It will not actually load the image until needed.
107
+ # Create an image object. It will not actually load the pixel data until
108
+ # needed.
101
109
  im = Image.jpeg('mypic.jpg')
102
110
 
111
+ # You can read all the header fields without triggering a pixel load.
112
+ puts "it's #{im.x_size} pixels across!"
113
+
103
114
  # Shrink the jpeg by a factor of four when loading -- huge speed and CPU
104
115
  # improvements on large images.
105
116
  im = Image.jpeg('mypic.jpg', :shrink_factor => 4)
117
+ puts "but only #{im.x_size} pixels when we shrink on load"
106
118
 
107
119
  # Add a shrink by a factor of two to the pipeline. This will not actually be
108
120
  # executed yet.
@@ -112,6 +124,9 @@ im_shrink_by_two = im.shrink(2)
112
124
  # actually loaded and resized. With images that allow for random access from
113
125
  # the hard drive (VIPS native format, tiled OpenEXR, ppm/pbm/pgm/pfm, tiled
114
126
  # tiff, and RAW images), the entire image is never read into memory.
127
+ # For other formats, the image is either decompressed to a temporary disc
128
+ # file and then processed from there, or, if you give the :sequential hint,
129
+ # streamed directly from the file.
115
130
  im_shrink_by_two.png('out.png', :interlace => true)
116
131
 
117
132
  # All ruby-vips image commands can be chained, so the above sequence could
@@ -126,18 +141,16 @@ Image.jpeg('mypic.jpg', :shrink_factor => 4).shrink(2).png('out.png')
126
141
  Image.new('mypic.jpg').shrink(2).write('out.png')
127
142
  ```
128
143
 
129
- ## Gotchas
130
-
131
- ### Contain memuse
144
+ ## Garbage collection
132
145
 
133
- ruby-vips only finalises vips images on GC. In other words:
146
+ ruby-vips only frees images on GC. In other words:
134
147
 
135
148
  ```ruby
136
149
  a = Image.new(filename)
137
150
  a = nil
138
151
  ```
139
152
 
140
- will not release the resources associated with a, you have to
153
+ will not release the resources associated with `a`, you have to
141
154
  either request a GC explicitly or wait for Ruby to GC for you. This can
142
155
  be a problem if you're processing many images.
143
156
 
@@ -4,8 +4,28 @@ require "mkmf"
4
4
 
5
5
  File::unlink("Makefile") if (File::exist?("Makefile"))
6
6
 
7
- VIPS_VERSIONS = %w[7.29 7.28 7.27 7.26 7.24 7.23 7.22 7.20]
7
+ # override normal build configuration to build debug friendly library
8
+ # if installed via 'gem install ruby-vips -- --enable-debug'
9
+ # see: http://jonforums.github.com/ruby/2011/01/27/debugging-native-gems-1.html
10
+ if enable_config('debug')
11
+ puts '[INFO] enabling debug library build configuration.'
12
+ if RUBY_VERSION < '1.9'
13
+ $CFLAGS = CONFIG['CFLAGS'].gsub(/\s\-O\d?\s/, ' -O0 ')
14
+ $CFLAGS.gsub!(/\s?\-g\w*\s/, ' -ggdb3 ')
15
+ CONFIG['LDSHARED'] = CONFIG['LDSHARED'].gsub(/\s\-s(\s|\z)/, ' ')
16
+ else
17
+ CONFIG['debugflags'] << ' -ggdb3 -O0'
18
+ end
19
+ end
8
20
 
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}") }
21
+ # vips-7.30 and later use plain "vips" for the pkg-config name: look for that
22
+ # first
23
+ if not pkg_config("vips")
24
+ VIPS_VERSIONS = %w[7.29 7.28 7.27 7.26 7.24 7.23 7.22 7.20]
25
+
26
+ if not VIPS_VERSIONS.detect {|x| pkg_config("vips-#{x}") }
27
+ raise("no pkg_config for any of following libvips versions: #{VIPS_VERSIONS.join(', ')}")
28
+ end
29
+ end
10
30
 
11
31
  create_makefile('vips_ext')
@@ -1,6 +1,4 @@
1
1
  #include "ruby_vips.h"
2
- #include "image.h"
3
- #include "header.h"
4
2
 
5
3
  VALUE mVIPSHeader;
6
4
 
@@ -22,8 +20,8 @@ header_band_fmt_to_id(VipsBandFmt band_fmt)
22
20
  case IM_BANDFMT_COMPLEX: return id_complex; // two floats
23
21
  case IM_BANDFMT_DOUBLE: return id_double;
24
22
  case IM_BANDFMT_DPCOMPLEX: return id_dbcomplex; // two doubles
23
+ default: return id_notset;
25
24
  }
26
- return id_notset;
27
25
  }
28
26
 
29
27
  VipsBandFmt
@@ -399,7 +397,7 @@ header_set(VALUE obj, VALUE name, VALUE value)
399
397
  */
400
398
 
401
399
  void
402
- init_Header()
400
+ init_Header( void )
403
401
  {
404
402
  mVIPSHeader = rb_define_module_under(mVIPS, "Header");
405
403
 
@@ -4,5 +4,6 @@
4
4
  extern VALUE mVIPSHeader;
5
5
 
6
6
  VipsBandFmt header_id_to_band_fmt(VALUE);
7
+ void init_Header( void );
7
8
 
8
9
  #endif
@@ -1,18 +1,4 @@
1
1
  #include "ruby_vips.h"
2
- #include "header.h"
3
-
4
- #include "image.h"
5
- #include "image_arithmetic.h"
6
- #include "image_boolean.h"
7
- #include "image_colour.h"
8
- #include "image_conversion.h"
9
- #include "image_convolution.h"
10
- #include "image_freq_filt.h"
11
- #include "image_histograms_lut.h"
12
- #include "image_morphology.h"
13
- #include "image_mosaicing.h"
14
- #include "image_relational.h"
15
- #include "image_resample.h"
16
2
 
17
3
  VALUE cVIPSImage;
18
4
 
@@ -150,8 +136,8 @@ img_vtype_to_id(VipsType vtype)
150
136
  case IM_TYPE_YXY: return id_yxy;
151
137
  case IM_TYPE_RGB16: return id_rgb16;
152
138
  case IM_TYPE_GREY16: return id_grey16;
139
+ default: return id_b_w;
153
140
  }
154
- return id_b_w;
155
141
  }
156
142
 
157
143
  ID
@@ -161,8 +147,8 @@ img_coding_to_id(VipsCoding coding)
161
147
  case IM_CODING_NONE: return id_none;
162
148
  case IM_CODING_LABQ: return id_labq;
163
149
  case IM_CODING_RAD: return id_rad;
150
+ default: return id_none;
164
151
  }
165
- return id_none;
166
152
  }
167
153
 
168
154
  /*
@@ -283,6 +269,8 @@ img_pixel_to_rb(VipsImage *im, int x, int y)
283
269
  case IM_BANDFMT_DOUBLE: GETPIX( double, rb_float_new ); break;
284
270
  case IM_BANDFMT_COMPLEX: CGETPIX( float, rb_float_new ); break;
285
271
  case IM_BANDFMT_DPCOMPLEX: CGETPIX( double, rb_float_new ); break;
272
+
273
+ default: GETPIX( unsigned char, UINT2NUM ); break;
286
274
  }
287
275
  }
288
276
 
@@ -356,7 +344,8 @@ img_data(VALUE obj)
356
344
  if (im_incheck(im) || im_check_uncoded("img_aref", im))
357
345
  return( Qnil );
358
346
 
359
- return rb_tainted_str_new(im->data, IM_IMAGE_SIZEOF_LINE(im) * im->Ysize);
347
+ return rb_tainted_str_new((const char *) im->data,
348
+ IM_IMAGE_SIZEOF_LINE(im) * im->Ysize);
360
349
  }
361
350
 
362
351
  /*
@@ -565,7 +554,7 @@ init_Image(void)
565
554
  rb_define_method(cVIPSImage, "heq", img_heq, -1); // in image_histograms_lut.c
566
555
  rb_define_method(cVIPSImage, "lhisteq", img_lhisteq, 2); // in image_histograms_lut.c
567
556
  rb_define_method(cVIPSImage, "stdif", img_stdif, 6); // in image_histograms_lut.c
568
- rb_define_method(cVIPSImage, "tone_analyze", img_tone_analyze, 6); // in image_histograms_lut.c
557
+ rb_define_method(cVIPSImage, "tone_analyse", img_tone_analyse, 6); // in image_histograms_lut.c
569
558
  rb_define_method(cVIPSImage, "maplut", img_maplut, 1); // in image_histograms_lut.c
570
559
  rb_define_method(cVIPSImage, "histplot", img_histplot, 0); // in image_histograms_lut.c
571
560
  rb_define_method(cVIPSImage, "dilate", img_dilate, 1); // in image_morphology.c
@@ -21,10 +21,11 @@ VALUE img_init(VALUE, VipsImage*);
21
21
  VALUE img_init_partial();
22
22
  VALUE img_init_partial_anyclass(VALUE);
23
23
  VipsBandFmt img_id_to_band_fmt(VALUE);
24
+ void init_Image(void);
24
25
 
25
26
  #define GetImg(obj, data, im) \
26
27
  vipsImg *data; \
27
- VipsImage *im; \
28
+ VipsImage *im __attribute__ ((unused)); \
28
29
  Data_Get_Struct(obj, vipsImg, data); \
29
30
  im = data->in;
30
31
 
@@ -1,7 +1,4 @@
1
1
  #include "ruby_vips.h"
2
- #include "image.h"
3
- #include "mask.h"
4
- #include "interpolator.h"
5
2
 
6
3
  /*
7
4
  * call-seq:
@@ -21,7 +18,6 @@ img_measure_area(VALUE obj, VALUE left, VALUE top, VALUE width, VALUE height,
21
18
  VALUE h, VALUE v, VALUE sel)
22
19
  {
23
20
  DOUBLEMASK *ret;
24
- VALUE results;
25
21
  int *a, i, len = RARRAY_LENINT(sel);
26
22
  GetImg(obj, data, im);
27
23
 
@@ -25,7 +25,7 @@ VALUE img_ceil(VALUE);
25
25
  VALUE img_s_linreg(int, VALUE*, VALUE);
26
26
  VALUE img_point(VALUE, VALUE, VALUE, VALUE, VALUE);
27
27
  VALUE img_pow(int, VALUE*, VALUE);
28
- VALUE img_pow_binop(int, VALUE*, VALUE);
28
+ VALUE img_pow_binop(VALUE obj, VALUE arg);
29
29
  VALUE img_expn(int, VALUE*, VALUE);
30
30
  VALUE img_log(VALUE);
31
31
  VALUE img_log10(VALUE);
@@ -1,5 +1,4 @@
1
1
  #include "ruby_vips.h"
2
- #include "image.h"
3
2
 
4
3
  static VALUE
5
4
  img_and_img(VALUE obj, VALUE obj2)
@@ -4,5 +4,5 @@ VALUE img_or(int, VALUE*, VALUE);
4
4
  VALUE img_or_binop(VALUE, VALUE arg);
5
5
  VALUE img_xor(int, VALUE*, VALUE);
6
6
  VALUE img_xor_binop(VALUE, VALUE arg);
7
- VALUE img_shiftleft(int, VALUE*, VALUE);
8
- VALUE img_shiftright(int, VALUE*, VALUE);
7
+ VALUE img_shiftleft(VALUE obj, VALUE arg);
8
+ VALUE img_shiftright(VALUE obj, VALUE arg);
@@ -1,7 +1,4 @@
1
1
  #include "ruby_vips.h"
2
- #include "image.h"
3
- #include "mask.h"
4
- #include "image_colour.h"
5
2
 
6
3
  static ID id_perceptual, id_relative_colorimetric, id_saturation,
7
4
  id_absolute_colorimetric;
@@ -1,7 +1,4 @@
1
1
  #include "ruby_vips.h"
2
- #include "image.h"
3
- #include "mask.h"
4
- #include "header.h"
5
2
 
6
3
  static ID id_black, id_extend, id_repeat, id_mirror, id_white;
7
4
 
@@ -591,8 +588,8 @@ img_insertset(int argc, VALUE *argv, VALUE obj, VALUE obj2)
591
588
  y = IM_ARRAY(im_new, argc - 1, int);
592
589
 
593
590
  for(i = 1; i < argc; i++) {
594
- x[i] = NUM2INT(RARRAY_PTR(argv[i])[0]);
595
- y[i] = NUM2INT(RARRAY_PTR(argv[i])[1]);
591
+ x[i - 1] = NUM2INT(RARRAY_PTR(argv[i])[0]);
592
+ y[i - 1] = NUM2INT(RARRAY_PTR(argv[i])[1]);
596
593
  }
597
594
 
598
595
  if( im_insertset(im, im2, im_new, argc - 1, x, y) )
@@ -1,7 +1,4 @@
1
1
  #include "ruby_vips.h"
2
- #include "image.h"
3
- #include "mask.h"
4
- #include "image_convolution.h"
5
2
 
6
3
  /*
7
4
  * call-seq:
@@ -1,6 +1,4 @@
1
1
  #include "ruby_vips.h"
2
- #include "image.h"
3
- #include "image_freq_filt.h"
4
2
 
5
3
  /*
6
4
  * call-seq:
@@ -1,7 +1,4 @@
1
1
  #include "ruby_vips.h"
2
- #include "image.h"
3
- #include "mask.h"
4
- #include "image_histograms_lut.h"
5
2
 
6
3
  /*
7
4
  * call-seq:
@@ -620,21 +617,21 @@ img_s_tone_build(VALUE obj,
620
617
 
621
618
  /*
622
619
  * call-seq:
623
- * im.tone_analyze(ps, pm, ph, s, m, h) -> image
620
+ * im.tone_analyse(ps, pm, ph, s, m, h) -> image
624
621
  *
625
622
  * As Image#tone_build, but analyse the histogram of *self* and use it to pick
626
623
  * the 0.1% and 99.9% points for <i>lb</i> and <i>lw</i>.
627
624
  */
628
625
 
629
626
  VALUE
630
- img_tone_analyze(VALUE obj,
627
+ img_tone_analyse(VALUE obj,
631
628
  VALUE ps, VALUE pm, VALUE ph, VALUE s, VALUE m, VALUE h)
632
629
  {
633
630
  #if IM_MAJOR_VERSION > 7 || IM_MINOR_VERSION >= 23
634
631
  GetImg(obj, data, im);
635
632
  OutImg(obj, new, data_new, im_new);
636
633
 
637
- if (im_tone_analyze(im, im_new,
634
+ if (im_tone_analyse(im, im_new,
638
635
  NUM2DBL(ps), NUM2DBL(pm), NUM2DBL(ph),
639
636
  NUM2DBL(s), NUM2DBL(m), NUM2DBL(h)) )
640
637
  vips_lib_error();
@@ -25,4 +25,4 @@ VALUE img_s_tone_build_range(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE,
25
25
  VALUE, VALUE, VALUE, VALUE);
26
26
  VALUE img_s_tone_build(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE,
27
27
  VALUE);
28
- VALUE img_tone_analyze(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE);
28
+ VALUE img_tone_analyse(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE);
@@ -1,7 +1,4 @@
1
1
  #include "ruby_vips.h"
2
- #include "image.h"
3
- #include "mask.h"
4
- #include "image_morphology.h"
5
2
 
6
3
  /*
7
4
  * call-seq:
@@ -170,7 +167,7 @@ img_rank_image(int argc, VALUE *argv, VALUE obj)
170
167
  VALUE
171
168
  img_maxvalue(int argc, VALUE *argv, VALUE obj)
172
169
  {
173
- img_rank_image_internal(argc, argv, obj, argc - 1);
170
+ return img_rank_image_internal(argc, argv, obj, argc - 1);
174
171
  }
175
172
 
176
173
  static VALUE
@@ -1,6 +1,4 @@
1
1
  #include "ruby_vips.h"
2
- #include "image.h"
3
- #include "image_mosaicing.h"
4
2
 
5
3
  ID id_match_left, id_match_right, id_match_both, id_match_none;
6
4