free-image 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -33,11 +33,32 @@ free-image is via Ruby Gems. To install:
33
33
 
34
34
  gem install free-image
35
35
 
36
-
37
36
  == Getting Started
38
- Using free-image is easy. To get you started, refer to the
39
- \FreeImage cookbook[rdoc-ref:cookbook.rdoc].
37
+ Getting started is easy - first work through the examples in the cookbook[rdoc-ref:cookbook.rdoc].
38
+ Once you've done that, the refer to rdocs for extensive documentation.
39
+
40
+ == Memory Management
41
+ Opening and working with images consumes some memory. Generally you won't have to
42
+ worry about this. When an image goes out of scope, it will be garbage collected
43
+ and the underlying image memory will be freed.
44
+
45
+ Having said that, \FreeImage also lets you control when the memory is freed.
46
+ Any method that creates a new image also takes a block. When the block finishes,
47
+ the underlying image memory is freed. This works the same way as the File.open
48
+ method. For example:
49
+
50
+ FreeImage::Bitmap.open('images/lena.png') do |image|
51
+ thumbnail = image.make_thumbail do |thumbail|
52
+ thumbnail.save('images/thumbnail.png', :png)
53
+ end
54
+ end
55
+
56
+ When the inner block finishes the thumbnail image is freed and when the outer
57
+ block finished the lena image is freed.
40
58
 
59
+ If you need even more control, you can use FreeImage::Bitmap#free which frees
60
+ the underlying image. Be careful though - once the image is freed further usage
61
+ of it will result in a segmentation fault.
41
62
 
42
63
  == Implementation Status
43
64
  The FreeImage API is divided into multiple parts. As summarized below, the Ruby ffi
@@ -74,7 +95,7 @@ extend the coverage.
74
95
  * Channel processing - Not Implemented
75
96
  * Copy / Paste / Composite routines - FreeImage::Modify
76
97
  * Background filling - FreeImage::Modify
77
- * Miscellaneous algorithms - Not Implemented
98
+ * Miscellaneous algorithms - FreeImage::Helper
78
99
 
79
100
  == Documentation
80
101
  Documentation is available via rdoc, and is installed automatically with the
data/cookbook.rdoc CHANGED
@@ -17,7 +17,7 @@ via the FreeImage::Bitmap.open method:
17
17
  The open method also takes two additional optional parameters, format and flags,
18
18
  that provide greater control over opening images if needed.
19
19
 
20
- The open method works similary to File.open, meaning you can pass it a block.
20
+ The open method works similary to File.open, meaning you can also pass it a block.
21
21
 
22
22
  FreeImage::Bitmap.open('images/lena.png') do |image|
23
23
  ... do some stuff..
@@ -25,9 +25,8 @@ The open method works similary to File.open, meaning you can pass it a block.
25
25
 
26
26
  Once the block completes, the image will be automatically freed for you. If you don't
27
27
  pass block, then the image will be freed by Ruby's Garbage Collector once it goes out
28
- of scope or you can call the FreeImage::Bitmap#free method. Once you do that though,
29
- remember the image no longer exists and further usage of it will result in
30
- segmentation faults.
28
+ of scope. For more information about memory management, refer to
29
+ the readme [rdoc-ref:README.rdoc].
31
30
 
32
31
  Image[link:cookbook/lena.png]
33
32
 
data/free-image.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = 'free-image'
5
- spec.version = '0.5.0'
5
+ spec.version = '0.6.0'
6
6
  spec.summary = 'Ruby Bindings for the Free Image Library'
7
7
  spec.description = <<-EOS
8
8
  FreeImage is an Open Source library project for developers who would like to support
data/lib/free-image.rb CHANGED
@@ -52,7 +52,7 @@ module FreeImage
52
52
  elsif FFI::Platform.windows?
53
53
  ffi_lib("FreeImaged")
54
54
  else
55
- ffi_lib("free_image")
55
+ ffi_lib("freeimage")
56
56
  end
57
57
 
58
58
  ffi_convention :stdcall if FFI::Platform.windows?
@@ -86,14 +86,28 @@ module FreeImage
86
86
  # also be a string which is interpreted as a fully qualified file path.
87
87
  def self.open(source)
88
88
  bitmap = figure_source(source).open
89
- unless block_given?
90
- bitmap
89
+ if block_given?
90
+ begin
91
+ yield bitmap
92
+ ensure
93
+ bitmap.free
94
+ end
91
95
  else
96
+ bitmap
97
+ end
98
+ end
99
+
100
+ def self.new(ptr, source = nil)
101
+ bitmap = super(ptr, source)
102
+
103
+ if block_given?
92
104
  begin
93
105
  yield bitmap
94
106
  ensure
95
107
  bitmap.free
96
108
  end
109
+ else
110
+ bitmap
97
111
  end
98
112
  end
99
113
 
@@ -112,11 +126,19 @@ module FreeImage
112
126
  super(ptr)
113
127
  end
114
128
 
129
+ # :call-seq:
130
+ # image.clone -> bitmap
131
+ # image.clone {|img| block} -> bitmap
132
+ #
115
133
  # Creates an exact copy of the current image.
116
- def clone
134
+ #
135
+ # If an optional block is provided, it will be passed the new image as an argument. The
136
+ # image will be automatically closed when the block completes.
137
+ #
138
+ def clone(&block)
117
139
  ptr = FreeImage.FreeImage_Clone(self)
118
140
  FreeImage.check_last_error
119
- self.class.new(ptr)
141
+ self.class.new(ptr, &block)
120
142
  end
121
143
 
122
144
  # Save the image to the specified source.
@@ -146,9 +168,5 @@ module FreeImage
146
168
  raise(ArgumentError, "Unknown source type: #{source.class.name}")
147
169
  end
148
170
  end
149
-
150
- def figure_color_klass
151
-
152
- end
153
171
  end
154
172
  end
@@ -14,9 +14,9 @@ module FreeImage
14
14
  # :double:: Array of double: 64-bit IEEE floating point
15
15
  # :complex:: Array of FICOMPLEX: 2 x 64-bit IEEE floating point
16
16
  # :rgb16:: 48-bit rgb image: 3 x 16-bit
17
- # :rgba16:: 64-bit rgbA image: 4 x 16-bit
17
+ # :rgba16:: 64-bit rgba image: 4 x 16-bit
18
18
  # :rgbf:: 96-bit rgb float image: 3 x 32-bit IEEE floating point
19
- # :rgbaf:: 128-bit rgbA float image: 4 x 32-bit IEEE floating point
19
+ # :rgbaf:: 128-bit rgba float image: 4 x 32-bit IEEE floating point
20
20
  #
21
21
  # :method: image_types
22
22
 
@@ -33,6 +33,10 @@ module FreeImage
33
33
  attach_function('FreeImage_ConvertToType', [:pointer, :image_type, FreeImage::Boolean], :pointer)
34
34
 
35
35
  module Conversions
36
+ # :call-seq:
37
+ # image.convert_to_4bits -> bitmap
38
+ # image.convert_to_4bits {|img| block} -> bitmap
39
+ #
36
40
  # Converts a bitmap to 4 bits. If the bitmap is a high-color (16, 24 or 32-bit),
37
41
  # monochrome or greyscale bitmap (1 or 8-bit) the end result will be a greyscale bitmap.
38
42
  # A 1-bit bitmap will become a palletized bitmap.
@@ -40,12 +44,20 @@ module FreeImage
40
44
  # Note that "greyscale" means that the resulting bitmap will have grey colors,
41
45
  # but the palette won't be a linear greyscale palette. Thus, FreeImage::Bitmap.color_type
42
46
  # will return a :palette.
43
- def convert_to_4bits
47
+ #
48
+ # If an optional block is provided, it will be passed the new image as an argument. The
49
+ # image will be automatically closed when the block completes.
50
+ #
51
+ def convert_to_4bits(&block)
44
52
  ptr = FreeImage.FreeImage_ConvertTo4Bits(self)
45
53
  FreeImage.check_last_error
46
- self.class.new(ptr)
54
+ self.class.new(ptr, &block)
47
55
  end
48
56
 
57
+ # :call-seq:
58
+ # image.convert_to_8bits -> bitmap
59
+ # image.convert_to_8bits {|img| block} -> bitmap
60
+ #
49
61
  # Converts a bitmap to 8 bits. If the bitmap is a high-color (16, 24 or 32-bit),
50
62
  # monochrome or greyscale bitmap (1 or 4-bit) the end result will be a greyscale bitmap.
51
63
  # A 1-bit or 4-bit bitmap will become a palletized bitmap.
@@ -53,59 +65,107 @@ module FreeImage
53
65
  # For 16-bit greyscale images (images whose type is :uint16), conversion is done by
54
66
  # dividing the 16-bit channel by 256 (see also FreeImage::Bitmap.ConvertToStandardType).
55
67
  # A nil value is returned for other non-standard bitmap types.
56
- def convert_to_8bits
68
+ #
69
+ # If an optional block is provided, it will be passed the new image as an argument. The
70
+ # image will be automatically closed when the block completes.
71
+ #
72
+ def convert_to_8bits(&block)
57
73
  ptr = FreeImage.FreeImage_ConvertTo8Bits(self)
58
74
  FreeImage.check_last_error
59
- self.class.new(ptr)
75
+ self.class.new(ptr, &block)
60
76
  end
61
77
 
78
+ # :call-seq:
79
+ # image.convert_to_greyscale -> bitmap
80
+ # image.convert_to_greyscale {|img| block} -> bitmap
81
+ #
62
82
  # Converts a bitmap to a 8-bit greyscale image with a linear ramp. Contrary to
63
83
  # the FreeImage::Conversions#convert_to_8bits function, 1-, 4- and 8-bit palletized
64
84
  # bitmaps are correctly converted, as well as images with a :minis_white color type.
65
- def convert_to_greyscale
85
+ #
86
+ # If an optional block is provided, it will be passed the new image as an argument. The
87
+ # image will be automatically closed when the block completes.
88
+ #
89
+ def convert_to_greyscale(&block)
66
90
  ptr = FreeImage.FreeImage_ConvertToGreyscale(self)
67
91
  FreeImage.check_last_error
68
- self.class.new(ptr)
92
+ self.class.new(ptr, &block)
69
93
  end
70
94
 
95
+ # :call-seq:
96
+ # image.convert_to_16bits_555 -> bitmap
97
+ # image.convert_to_16bits_555 {|img| block} -> bitmap
98
+ #
71
99
  # Converts a bitmap to 16 bits, where each pixel has a color pattern of
72
100
  # 5 bits red, 5 bits green and 5 bits blue. One bit in each pixel is
73
101
  # unused.
74
- def convert_to_16bits_555
102
+ #
103
+ # If an optional block is provided, it will be passed the new image as an argument. The
104
+ # image will be automatically closed when the block completes.
105
+ #
106
+ def convert_to_16bits_555(&block)
75
107
  ptr = FreeImage.FreeImage_ConvertTo16Bits555(self)
76
108
  FreeImage.check_last_error
77
- self.class.new(ptr)
109
+ self.class.new(ptr, &block)
78
110
  end
79
111
 
112
+ # :call-seq:
113
+ # image.convert_to_16bits_565 -> bitmap
114
+ # image.convert_to_16bits_565 {|img| block} -> bitmap
115
+ #
80
116
  # Converts a bitmap to 16 bits, where each pixel has a color pattern of
81
117
  # 5 bits red, 6 bits green and 5 bits blue. One bit in each pixel is
82
118
  # unused.
83
- def convert_to_16bits_565
119
+ #
120
+ # If an optional block is provided, it will be passed the new image as an argument. The
121
+ # image will be automatically closed when the block completes.
122
+ #
123
+ def convert_to_16bits_565(&block)
84
124
  ptr = FreeImage.FreeImage_ConvertTo16Bits565(self)
85
125
  FreeImage.check_last_error
86
- self.class.new(ptr)
126
+ self.class.new(ptr, &block)
87
127
  end
88
128
 
129
+ # :call-seq:
130
+ # image.convert_to_24bits -> bitmap
131
+ # image.convert_to_24bits {|img| block} -> bitmap
132
+ #
89
133
  # Converts a bitmap to 24 bits. For 48-bit RGB images, conversion is done
90
134
  # by dividing each 16-bit channel by 256. A nil value is returned for
91
135
  # other non-standard bitmap types.
92
- def convert_to_24bits
136
+ #
137
+ # If an optional block is provided, it will be passed the new image as an argument. The
138
+ # image will be automatically closed when the block completes.
139
+ #
140
+ def convert_to_24bits(&block)
93
141
  ptr = FreeImage.FreeImage_ConvertTo24Bits(self)
94
142
  FreeImage.check_last_error
95
- self.class.new(ptr)
143
+ self.class.new(ptr, &block)
96
144
  end
97
145
 
146
+ # :call-seq:
147
+ # image.convert_to_32bits -> bitmap
148
+ # image.convert_to_32bits {|img| block} -> bitmap
149
+ #
98
150
  # Converts a bitmap to 32 bits. For 48-bit RGB images, conversion is done
99
151
  # by dividing each 16-bit channel by 256 and by setting the alpha channel
100
152
  # to an opaque value (0xFF). For 64-bit RGBA images, conversion is done
101
153
  # by dividing each 16-bit channel by 256. A nil value is returned for
102
154
  # other non-standard bitmap types.
103
- def convert_to_32bits
155
+ #
156
+ # If an optional block is provided, it will be passed the new image as an argument. The
157
+ # image will be automatically closed when the block completes.
158
+ #
159
+ def convert_to_32bits(&block)
104
160
  ptr = FreeImage.FreeImage_ConvertTo32Bits(self)
105
161
  FreeImage.check_last_error
106
- self.class.new(ptr)
162
+ self.class.new(ptr, &block)
107
163
  end
108
164
 
165
+ # :call-seq:
166
+ # image.convert_to_standard_type(scale_linear = true) -> bitmap
167
+ # image.convert_to_standard_type(scale_linear = true) {|img| block} -> bitmap
168
+ #
109
169
  # Converts a non standard image whose color type is :minis_black to a
110
170
  # standard 8-bit greyscale image. When the scale_linear parameter is
111
171
  # true, conversion is done by scaling linearly each pixel value from [min, max]
@@ -119,48 +179,76 @@ module FreeImage
119
179
  # For standard bitmaps, a clone of the original bitmap is returned.
120
180
  # For complex images, the magnitude is extracted as a double image and then converted
121
181
  # according to the scale parameter.
122
- def convert_to_standard_type(scale_linear = true)
182
+ #
183
+ # If an optional block is provided, it will be passed the new image as an argument. The
184
+ # image will be automatically closed when the block completes.
185
+ #
186
+ def convert_to_standard_type(scale_linear = true, &block)
123
187
  ptr = FreeImage.FreeImage_ConvertToStandardType(self, scale_linear)
124
188
  FreeImage.check_last_error
125
- self.class.new(ptr)
189
+ self.class.new(ptr, &block)
126
190
  end
127
191
 
192
+ # :call-seq:
193
+ # image.convert_to_type(dst_image_type, scale_linear = true) -> bitmap
194
+ # image.convert_to_type(dst_image_type, scale_linear = true) {|img| block} -> bitmap
195
+ #
128
196
  # Converts a bitmap to the specified destination image type. When the image_type
129
197
  # is equal to :bitmap, the function calls FreeImage::Converstions#convert_to_standard_type.
130
198
  # Otherwise, conversion is done using standard C language casting conventions. When
131
199
  # a conversion is not allowed, a nil value is returned and an error is thrown.
132
200
  # Please refer to the FreeImage documentation for allowed conversions.
133
- def convert_to_type(dst_image_type, scale_linear = true)
201
+ #
202
+ # If an optional block is provided, it will be passed the new image as an argument. The
203
+ # image will be automatically closed when the block completes.
204
+ #
205
+ def convert_to_type(dst_image_type, scale_linear = true, &block)
134
206
  ptr = FreeImage.FreeImage_ConvertToType(self, dst_image_type, scale_linear)
135
207
  FreeImage.check_last_error
136
- self.class.new(ptr)
208
+ self.class.new(ptr, &block)
137
209
  end
138
210
 
211
+ # :call-seq:
212
+ # image.dither(algorithm) -> bitmap
213
+ # image.dither(algorithm) {|img| block} -> bitmap
214
+ #
139
215
  # Converts a bitmap to 1-bit monochrome bitmap using the specified
140
216
  # {dithering}[rdoc-ref:FreeImage.dithers] algorithm. For 1-bit input
141
217
  # bitmaps, the function clones the input bitmap and builds a
142
218
  # monochrome palette. Otherwise the function first converts the
143
219
  # bitmap to a 8-bit greyscale bitmap.
144
- def dither(algorithm)
220
+ #
221
+ # If an optional block is provided, it will be passed the new image as an argument. The
222
+ # image will be automatically closed when the block completes.
223
+ #
224
+ def dither(algorithm, &block)
145
225
  ptr = FreeImage.FreeImage_Dither(self, algorithm)
146
226
  FreeImage.check_last_error
147
- self.class.new(ptr)
227
+ self.class.new(ptr, &block)
148
228
  end
149
229
 
230
+ # :call-seq:
231
+ # image.threshold(value) -> bitmap
232
+ # image.threshold(value) {|img| block} -> bitmap
233
+ #
150
234
  # Converts a bitmap to 1-bit monochrome bitmap using a threshold value
151
235
  # between 0 and 255. The function first converts the bitmap to a 8-bit
152
236
  # greyscale bitmap. Then any brightness level that is less than the
153
237
  # threshold is set to zero and any value above is set to 1.
154
238
  # For 1-bit input bitmaps, the function clones the input bitmap and
155
239
  # builds a monochrome palette.
156
- def threshold(value)
240
+ #
241
+ # If an optional block is provided, it will be passed the new image as an argument. The
242
+ # image will be automatically closed when the block completes.
243
+ #
244
+ def threshold(value, &block)
157
245
  value = Integer(value)
158
246
  unless (0..255).include?(value)
159
247
  raise(RangeError, "Value is out of range 0..255. Value: #{value}")
160
248
  end
161
249
  ptr = FreeImage.FreeImage_Threshold(self, value)
162
250
  FreeImage.check_last_error
163
- self.class.new(ptr)
251
+ self.class.new(ptr, &block)
164
252
  end
165
253
  end
166
254
  end
@@ -45,6 +45,10 @@ module FreeImage
45
45
  # filling background colors.
46
46
  #
47
47
  module Modify
48
+ # :call-seq:
49
+ # image.composite(background_bitmap) -> bitmap
50
+ # image.composite(background_bitmap) {|img| block} -> bitmap
51
+ #
48
52
  # Composites a transparent foreground image against a background image.
49
53
  # The equation for computing a composited sample value is:
50
54
  #
@@ -53,12 +57,20 @@ module FreeImage
53
57
  # Where alpha and the input and output sample values are expressed as fractions
54
58
  # in the range 0 to 1. For color images, the computation is done separately
55
59
  # for R, G, and B samples.
56
- def composite(background_bitmap)
60
+ #
61
+ # If an optional block is provided, it will be passed the new image as an argument. The
62
+ # image will be automatically closed when the block completes.
63
+ #
64
+ def composite(background_bitmap, &block)
57
65
  ptr = FreeImage.FreeImage_Composite(self, false, nil, background_bitmap)
58
66
  FreeImage.check_last_error
59
- self.class.new(ptr)
67
+ self.class.new(ptr, &block)
60
68
  end
61
69
 
70
+ # :call-seq:
71
+ # image.composite_with_color(background_color) -> bitmap
72
+ # image.composite_with_color(background_color) {|img| block} -> bitmap
73
+ #
62
74
  # Composites a transparent foreground image against a background color.
63
75
  # The equation for computing a composited sample value is:
64
76
  #
@@ -67,25 +79,41 @@ module FreeImage
67
79
  # Where alpha and the input and output sample values are expressed as fractions
68
80
  # in the range 0 to 1. For color images, the computation is done separately
69
81
  # for R, G, and B samples.
70
- def composite_with_color(background_color)
82
+ #
83
+ # If an optional block is provided, it will be passed the new image as an argument. The
84
+ # image will be automatically closed when the block completes.
85
+ #
86
+ def composite_with_color(background_color, &block)
71
87
  ptr = FreeImage.FreeImage_Composite(self, false, background_color, nil)
72
88
  FreeImage.check_last_error
73
- self.class.new(ptr)
89
+ self.class.new(ptr, &block)
74
90
  end
75
91
 
92
+ # :call-seq:
93
+ # image.copy(left, top, right, bottom) -> bitmap
94
+ # image.copy(left, top, right, bottom) {|img| block} -> bitmap
95
+ #
76
96
  # Copy a subpart of the current image. The rectangle defined by the
77
97
  # left, top, right, bottom parameters is first normalized such that the
78
98
  # value of the left coordinate is less than the right and the top is less
79
99
  # than the bottom. Then, the returned bitmap is defined by a width equal to
80
100
  # (right - left) and a height equal to (bottom - top).
81
101
  #
82
- # The function returns the subimage if successful and returns nil otherwise.
83
- def copy(left, top, right, bottom)
102
+ # If an optional block is provided, it will be passed the new image as an argument. The
103
+ # image will be automatically closed when the block completes.
104
+ #
105
+ # The function returns the subimage if successful and othewise it returns nil.
106
+ #
107
+ def copy(left, top, right, bottom, &block)
84
108
  ptr = FreeImage.FreeImage_Copy(self, left, top, right, bottom)
85
109
  FreeImage.check_last_error
86
- self.class.new(ptr)
110
+ self.class.new(ptr, &block)
87
111
  end
88
112
 
113
+ # :call-seq:
114
+ # image.enlarge_canvas(left, top, right, bottom, color, options = 0) -> bitmap
115
+ # image.enlarge_canvas(left, top, right, bottom, color, options = 0) {|img| block} -> bitmap
116
+ #
89
117
  # Enlarges or shrinks an image selectively per side and fills newly added areas with the
90
118
  # specified background color. The common use case is to add borders to an image.
91
119
  #
@@ -117,12 +145,15 @@ module FreeImage
117
145
  # options:: Used to control color search process for palletized images. See
118
146
  # #fill_background for more details.
119
147
  #
148
+ # If an optional block is provided, it will be passed the new image as an argument. The
149
+ # image will be automatically closed when the block completes.
150
+ #
120
151
  # Returns a new image on success or nil.
121
152
  #
122
- def enlarge_canvas(left, top, right, bottom, color, options = 0)
153
+ def enlarge_canvas(left, top, right, bottom, color, options = 0, &block)
123
154
  ptr = FreeImage.FreeImage_EnlargeCanvas(self, left, top, right, bottom, color, options)
124
155
  FreeImage.check_last_error
125
- self.class.new(ptr)
156
+ self.class.new(ptr, &block)
126
157
  end
127
158
 
128
159
  # Sets all pixels of an image to the specified color.
@@ -161,6 +192,7 @@ module FreeImage
161
192
 
162
193
  # :call-seq:
163
194
  # bitmap.make_thumbnail(max_pixel_size, convert = true) -> bitmap
195
+ # bitmap.make_thumbnail(max_pixel_size, convert = true) {|img| block} -> bitmap
164
196
  #
165
197
  # Creates a thumbnail image that fits inside a square of size max_pixel_size,
166
198
  # keeping the original aspect ratio intact. Downsampling is done using a bilinear
@@ -174,10 +206,13 @@ module FreeImage
174
206
  # to standard images (i.e. 8-, 24 or 32-bit images). The
175
207
  # default value is true.
176
208
  #
177
- def make_thumbnail(max_pixel_size, convert = true)
209
+ # If an optional block is provided, it will be passed the new image as an argument. The
210
+ # image will be automatically closed when the block completes.
211
+ #
212
+ def make_thumbnail(max_pixel_size, convert = true, &block)
178
213
  ptr = FreeImage.FreeImage_MakeThumbnail(self, max_pixel_size, convert)
179
214
  FreeImage.check_last_error
180
- self.class.new(ptr)
215
+ self.class.new(ptr, &block)
181
216
  end
182
217
 
183
218
  # Combines or blends a subpart of another image with the current image.
@@ -201,6 +236,7 @@ module FreeImage
201
236
 
202
237
  # :call-seq:
203
238
  # bitmap.rescale(width, height, filter) -> bitmap
239
+ # bitmap.rescale(width, height, filter) {|img| block} -> bitmap -> bitmap
204
240
  #
205
241
  # Resamples an image to the desired width and height. Resampling changes the
206
242
  # pixel dimensions (and therefore display size) of an image.
@@ -252,10 +288,13 @@ module FreeImage
252
288
  # rare applications using band-limited photographic images with
253
289
  # no sharp edges.
254
290
  #
255
- def rescale(width, height, filter = :bilinear)
291
+ # If an optional block is provided, it will be passed the new image as an argument. The
292
+ # image will be automatically closed when the block completes.
293
+ #
294
+ def rescale(width, height, filter = :bilinear, &block)
256
295
  ptr = FreeImage.FreeImage_Rescale(self, width, height, filter)
257
296
  FreeImage.check_last_error
258
- self.class.new(ptr)
297
+ self.class.new(ptr, &block)
259
298
  end
260
299
  end
261
300
  end
@@ -14,6 +14,7 @@ module FreeImage
14
14
  module Transforms
15
15
  # call-seq:
16
16
  # bitmap.rotate(angle, bk_color) -> bitmap
17
+ # bitmap.rotate(angle, bk_color) -> {|img| block} -> bitmap
17
18
  #
18
19
  # Rotates an image around the center of the image area by means of 3 shears.
19
20
  # The rotated image retains the same size and aspect ratio of source image
@@ -29,14 +30,18 @@ module FreeImage
29
30
  # angle:: Specifies the angle of rotation in degrees
30
31
  # bk_color:: The color used to fill the background.
31
32
  #
32
- def rotate(angle, bk_color = nil)
33
+ # If an optional block is provided, it will be passed the new image as an argument. The
34
+ # image will be automatically closed when the block completes.
35
+ #
36
+ def rotate(angle, bk_color = nil, &block)
33
37
  ptr = FreeImage.FreeImage_Rotate(self, angle, bk_color)
34
38
  FreeImage.check_last_error
35
- self.class.new(ptr)
39
+ self.class.new(ptr, &block)
36
40
  end
37
41
 
38
42
  # call-seq:
39
43
  # bitmap.rotate_ex(aangle, x_shift, y_shift, x_origin, y_origin, use_mask = false) -> bitmap
44
+ # bitmap.rotate_ex(aangle, x_shift, y_shift, x_origin, y_origin, use_mask = false) {|img| block} -> bitmap
40
45
  #
41
46
  # Rotates an image using a 3rd order (cubic) B-Spline. The rotated image will have
42
47
  # the same width and height as the source image, so that this function is better
@@ -52,10 +57,13 @@ module FreeImage
52
57
  # use_mask:: When true, irrelevant parts of the image are set to black,
53
58
  # otherwise, a mirroring technique is used to fill irrelevant pixels.
54
59
  #
55
- def rotate_ex(angle, x_shift, y_shift, x_origin, y_origin, use_mask = false);
60
+ # If an optional block is provided, it will be passed the new image as an argument. The
61
+ # image will be automatically closed when the block completes.
62
+ #
63
+ def rotate_ex(angle, x_shift, y_shift, x_origin, y_origin, use_mask = false, &block)
56
64
  ptr = FreeImage.FreeImage_RotateEx(self, angle, x_shift, y_shift, x_origin, y_origin, use_mask)
57
65
  FreeImage.check_last_error
58
- self.class.new(ptr)
66
+ self.class.new(ptr, &block)
59
67
  end
60
68
 
61
69
  # call-seq:
data/test/test_bitmap.rb CHANGED
@@ -34,6 +34,18 @@ class BitmapTest < Test::Unit::TestCase
34
34
  end
35
35
  end
36
36
 
37
+ def test_clone
38
+ image = lena_image
39
+ clone = image.clone
40
+ assert(!clone.equal?(image))
41
+ end
42
+
43
+ def test_clone_block
44
+ lena_image.clone do |image|
45
+ assert_not_nil(image)
46
+ end
47
+ end
48
+
37
49
  def test_free
38
50
  1000.times do
39
51
  image = sample_image
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: free-image
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-08-31 00:00:00.000000000 Z
12
+ date: 2011-09-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ffi
16
- requirement: &22083624 !ruby/object:Gem::Requirement
16
+ requirement: &25091640 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 1.0.10
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *22083624
24
+ version_requirements: *25091640
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: hanna-nouveau
27
- requirement: &22083396 !ruby/object:Gem::Requirement
27
+ requirement: &25091412 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *22083396
35
+ version_requirements: *25091412
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: open4
38
- requirement: &22083120 !ruby/object:Gem::Requirement
38
+ requirement: &25091136 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *22083120
46
+ version_requirements: *25091136
47
47
  description: ! " FreeImage is an Open Source library project for developers who
48
48
  would like to support\n popular graphics image formats like PNG, BMP, JPEG, TIFF
49
49
  and others as needed by\n today's multimedia applications. FreeImage is easy