rszr 0.5.2 → 0.5.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c4fc21afb848256445e310a0feebab86b2b10ee6baf464bd7e67a44b282b4d07
4
- data.tar.gz: bfe92bbc780dbf03135b4b3d7296df141bee74279412b6bd3b6d2ba70362a140
3
+ metadata.gz: d7322db19722cd5afc93e887fabe4031fa3a3064949956dc3bac562299918f10
4
+ data.tar.gz: 8c03c8922f29d3f7989f427018e7baeb6f09c4c9f561fef1b6a92a80f4042ec8
5
5
  SHA512:
6
- metadata.gz: 26d46f7b4d594da5e871d75975d99cd54358bb6585d8b18fbddcba1b4383970099891f7af6d16b51b8dcf19f5ed179b275d001b15f546c3baa58a3b6573613f9
7
- data.tar.gz: 0f5866b917277c7afb518fb15ba83451fc7b448681fec26dad4321d17cfa464854e9182cff88008f7ee25b1c6df135f6a14f3980b64a145db9ef93e035de1d9e
6
+ metadata.gz: 82b7c3ea10061666bacd712c39319ef36f19b2aecce3fa89556c591c0ef6f2cedf10b0fb1ed4ee6ac8613cfb40904b7e42306cd08d247d2653ca3135450244ba
7
+ data.tar.gz: 52cac4fe43b0feb24e6fb837fdbed69bb4c91e53807ef5d5821c5ab1793d41a698632e1b342e8b14fed0219db080d05179d37eeb6fcef91e8052b66205c2ab07
data/README.md CHANGED
@@ -1,7 +1,8 @@
1
1
  [![Gem Version](https://badge.fury.io/rb/rszr.svg)](http://badge.fury.io/rb/rszr) [![Build Status](https://travis-ci.org/mtgrosser/rszr.svg)](https://travis-ci.org/mtgrosser/rszr)
2
2
  # Rszr - fast image resizer for Ruby
3
3
 
4
- Rszr is an image resizer for Ruby based on the Imlib2 library. It is faster and consumes less memory than MiniMagick, rmagick and GD2.
4
+ Rszr is an image resizer for Ruby based on the Imlib2 library.
5
+ It is faster and consumes less memory than MiniMagick, GD2 and VIPS, and comes with an optional drop-in interface for Rails ActiveStorage image processing.
5
6
 
6
7
  ## Installation
7
8
 
@@ -47,7 +48,15 @@ image.save('resized.jpg')
47
48
 
48
49
  # save it as PNG
49
50
  image.save('resized.png')
51
+ ```
52
+
53
+ ### Transformations
54
+
55
+ For each transformation, there is a bang! and non-bang method.
56
+ The bang method changes the image in place, while the non-bang method
57
+ creates a copy of the image in memory.
50
58
 
59
+ ```ruby
51
60
  # auto height
52
61
  image.resize(400, :auto)
53
62
 
@@ -66,30 +75,67 @@ image.turn!(3)
66
75
  # rotate one time 90 deg counterclockwise
67
76
  image.turn!(-1)
68
77
 
78
+ # rotate by arbitrary angle
79
+ image.rotate(45)
80
+
81
+ # sharpen image by pixel radius
82
+ image.sharpen!(1)
83
+
84
+ # blur image by pixel radius
85
+ image.blur!(1)
86
+
69
87
  # initialize copy
70
88
  image.dup
71
89
 
72
90
  # save memory, do not duplicate instance
73
91
  image.resize!(400, :auto)
92
+ ```
74
93
 
75
- # image info
94
+ ### Image info
95
+ ```ruby
76
96
  image.width => 400
77
97
  image.height => 300
78
98
  image.dimensions => [400, 300]
79
99
  image.format => "jpeg"
80
100
  ```
81
101
 
102
+ ## Rails / ActiveStorage interface
103
+
104
+ Rszr provides a drop-in interface to the `image_resizing` gem.
105
+ It is faster than both `mini_magick` and `vips` and way easier to install than the latter.
106
+
107
+ ```ruby
108
+ # Gemfile
109
+ gem 'image_resizing'
110
+ gem 'rszr'
111
+
112
+ # config/initializers/rszr.rb
113
+ require 'rszr/image_processing'
114
+
115
+ # config/application.rb
116
+ config.active_storage.variant_processor = :rszr
117
+ ```
118
+
119
+ When creating image variants, you can use all of Rszr's transformation methods:
120
+
121
+ ```erb
122
+ <%= image_tag user.avatar.variant(resize_to_fit: [300, 200]) %>
123
+ ```
124
+
82
125
  ## Thread safety
83
126
 
84
- As of version 0.4.0, Rszr is thread safe through the Ruby GIL.
127
+ As of version 0.5.0, Rszr is thread safe through Ruby's global VM lock.
85
128
  Use of any previous versions in a threaded environment is discouraged.
86
129
 
87
130
  ## Speed
88
131
 
89
- Resizing an 1500x997 JPEG image to 800x532, 100 times:
132
+ Resizing a 1500x997 JPEG image to 800x532, 500 times:
133
+ ![Speed](https://github.com/mtgrosser/rszr/blob/master/benchmark/speed.png)
134
+
90
135
 
91
136
  Library | Time
92
137
  ----------------|-----------
93
- MiniMagick | 12.9 s
94
- GD2 | 7.5 s
95
- Rszr | 2.8 s
138
+ MiniMagick | 27.0 s
139
+ GD2 | 28.2 s
140
+ VIPS | 13.6 s
141
+ Rszr | 7.9 s
data/ext/rszr/image.c CHANGED
@@ -75,7 +75,7 @@ static VALUE rszr_image_s__load(VALUE klass, VALUE rb_path)
75
75
  }
76
76
 
77
77
 
78
- static VALUE rszr_image_format(VALUE self)
78
+ static VALUE rszr_image_format_get(VALUE self)
79
79
  {
80
80
  rszr_image_handle * handle;
81
81
  char * format;
@@ -93,6 +93,20 @@ static VALUE rszr_image_format(VALUE self)
93
93
  }
94
94
 
95
95
 
96
+ static VALUE rszr_image__format_set(VALUE self, VALUE rb_format)
97
+ {
98
+ rszr_image_handle * handle;
99
+ char * format = StringValueCStr(rb_format);
100
+
101
+ Data_Get_Struct(self, rszr_image_handle, handle);
102
+
103
+ imlib_context_set_image(handle->image);
104
+ imlib_image_set_format(format);
105
+
106
+ return self;
107
+ }
108
+
109
+
96
110
  static VALUE rszr_image_width(VALUE self)
97
111
  {
98
112
  rszr_image_handle * handle;
@@ -120,6 +134,44 @@ static VALUE rszr_image_height(VALUE self)
120
134
  return INT2NUM(height);
121
135
  }
122
136
 
137
+ /*
138
+ static VALUE rszr_image_get_quality(VALUE self)
139
+ {
140
+ rszr_image_handle * handle;
141
+ int quality;
142
+
143
+ Data_Get_Struct(self, rszr_image_handle, handle);
144
+
145
+ imlib_context_set_image(handle->image);
146
+ quality = imlib_image_get_attached_value("quality");
147
+
148
+ if (quality) {
149
+ return INT2NUM(quality);
150
+ } else {
151
+ return Qnil;
152
+ }
153
+ }
154
+
155
+ static VALUE rszr_image_set_quality(VALUE self, VALUE rb_quality)
156
+ {
157
+ rszr_image_handle * handle;
158
+ int quality;
159
+
160
+ Check_Type(rb_quality, T_FIXNUM);
161
+ quality = FIX2INT(rb_quality);
162
+ if (quality <= 0) {
163
+ rb_raise(rb_eArgError, "quality must be >= 0");
164
+ return Qnil;
165
+ }
166
+
167
+ Data_Get_Struct(self, rszr_image_handle, handle);
168
+
169
+ imlib_context_set_image(handle->image);
170
+ imlib_image_attach_data_value("quality", NULL, quality, NULL);
171
+
172
+ return INT2NUM(quality);
173
+ }
174
+ */
123
175
 
124
176
  static VALUE rszr_image_dup(VALUE self)
125
177
  {
@@ -159,6 +211,77 @@ static VALUE rszr_image__turn_bang(VALUE self, VALUE orientation)
159
211
  }
160
212
 
161
213
 
214
+ static VALUE rszr_image__rotate(VALUE self, VALUE bang, VALUE rb_angle)
215
+ {
216
+ rszr_image_handle * handle;
217
+ rszr_image_handle * rotated_handle;
218
+ Imlib_Image rotated_image;
219
+ VALUE oRotatedImage;
220
+ double angle;
221
+
222
+ angle = NUM2DBL(rb_angle);
223
+
224
+ Data_Get_Struct(self, rszr_image_handle, handle);
225
+
226
+ imlib_context_set_image(handle->image);
227
+ rotated_image = imlib_create_rotated_image(angle);
228
+
229
+ if (!rotated_image) {
230
+ rb_raise(eRszrTransformationError, "error rotating image");
231
+ return Qnil;
232
+ }
233
+
234
+ if (RTEST(bang)) {
235
+ rszr_free_image(handle->image);
236
+ handle->image = rotated_image;
237
+
238
+ return self;
239
+ }
240
+ else {
241
+ oRotatedImage = rszr_image_s_allocate(cImage);
242
+ Data_Get_Struct(oRotatedImage, rszr_image_handle, rotated_handle);
243
+ rotated_handle->image = rotated_image;
244
+
245
+ return oRotatedImage;
246
+ }
247
+ }
248
+
249
+ /*
250
+ static VALUE rszr_image__brighten_bang(VALUE self, VALUE rb_brightness)
251
+ {
252
+ rszr_image_handle * handle;
253
+ double brightness;
254
+
255
+ brightness = NUM2DBL(rb_brightness);
256
+
257
+ imlib_context_set_image(handle->image);
258
+ imlib_modify_color_modifier_brightness(brightness);
259
+
260
+ return self;
261
+ }
262
+ */
263
+
264
+ static VALUE rszr_image__sharpen_bang(VALUE self, VALUE rb_radius)
265
+ {
266
+ rszr_image_handle * handle;
267
+ int radius;
268
+
269
+ radius = NUM2INT(rb_radius);
270
+
271
+ Data_Get_Struct(self, rszr_image_handle, handle);
272
+
273
+ imlib_context_set_image(handle->image);
274
+
275
+ if (radius >= 0) {
276
+ imlib_image_sharpen(radius);
277
+ } else {
278
+ imlib_image_blur(radius);
279
+ }
280
+
281
+ return self;
282
+ }
283
+
284
+
162
285
  static Imlib_Image rszr_create_cropped_scaled_image(const Imlib_Image image, VALUE rb_src_x, VALUE rb_src_y, VALUE rb_src_w, VALUE rb_src_h, VALUE rb_dst_w, VALUE rb_dst_h)
163
286
  {
164
287
  Imlib_Image resized_image;
@@ -262,20 +385,24 @@ static VALUE rszr_image__crop(VALUE self, VALUE bang, VALUE rb_x, VALUE rb_y, VA
262
385
  }
263
386
 
264
387
 
265
- static VALUE rszr_image__save(VALUE self, VALUE rb_path, VALUE rb_format)
388
+ static VALUE rszr_image__save(VALUE self, VALUE rb_path, VALUE rb_format, VALUE rb_quality)
266
389
  {
267
390
  rszr_image_handle * handle;
268
391
  char * path;
269
392
  char * format;
393
+ int quality;
270
394
  Imlib_Load_Error save_error;
271
395
 
272
396
  path = StringValueCStr(rb_path);
273
397
  format = StringValueCStr(rb_format);
274
-
398
+ quality = (NIL_P(rb_quality)) ? 0 : FIX2INT(rb_quality);
399
+
275
400
  Data_Get_Struct(self, rszr_image_handle, handle);
276
401
 
277
402
  imlib_context_set_image(handle->image);
278
403
  imlib_image_set_format(format);
404
+ if (quality)
405
+ imlib_image_attach_data_value("quality", NULL, quality, NULL);
279
406
  imlib_save_image_with_error_return(path, &save_error);
280
407
 
281
408
  if (save_error) {
@@ -298,12 +425,21 @@ void Init_rszr_image()
298
425
  rb_define_method(cImage, "initialize", rszr_image_initialize, 2);
299
426
  rb_define_method(cImage, "width", rszr_image_width, 0);
300
427
  rb_define_method(cImage, "height", rszr_image_height, 0);
301
- rb_define_method(cImage, "format", rszr_image_format, 0);
428
+ rb_define_method(cImage, "format", rszr_image_format_get, 0);
302
429
  rb_define_method(cImage, "dup", rszr_image_dup, 0);
430
+ // rb_define_method(cImage, "quality", rszr_image_get_quality, 0);
431
+ // rb_define_method(cImage, "quality=", rszr_image_set_quality, 1);
432
+
433
+ rb_define_protected_method(cImage, "_format=", rszr_image__format_set, 1);
434
+
303
435
  rb_define_private_method(cImage, "_resize", rszr_image__resize, 7);
304
436
  rb_define_private_method(cImage, "_crop", rszr_image__crop, 5);
305
437
  rb_define_private_method(cImage, "_turn!", rszr_image__turn_bang, 1);
306
- rb_define_private_method(cImage, "_save", rszr_image__save, 2);
438
+ rb_define_private_method(cImage, "_rotate", rszr_image__rotate, 2);
439
+ rb_define_private_method(cImage, "_sharpen!", rszr_image__sharpen_bang, 1);
440
+ /* rb_define_private_method(cImage, "_brighten!", rszr_image__brighten_bang, 1); */
441
+
442
+ rb_define_private_method(cImage, "_save", rszr_image__save, 3);
307
443
  }
308
444
 
309
445
  #endif
data/lib/rszr/image.rb CHANGED
@@ -3,7 +3,7 @@ module Rszr
3
3
 
4
4
  class << self
5
5
 
6
- def load(path, options = {})
6
+ def load(path, **opts)
7
7
  path = path.to_s
8
8
  raise FileNotFound unless File.exist?(path)
9
9
  _load(path)
@@ -15,6 +15,11 @@ module Rszr
15
15
  def dimensions
16
16
  [width, height]
17
17
  end
18
+
19
+ def format=(fmt)
20
+ fmt = fmt.to_s if fmt.is_a?(Symbol)
21
+ self._format = fmt
22
+ end
18
23
 
19
24
  def inspect
20
25
  fmt = format
@@ -22,30 +27,72 @@ module Rszr
22
27
  "#<#{self.class.name}:0x#{object_id.to_s(16)} #{width}x#{height}#{fmt}>"
23
28
  end
24
29
 
25
- def resize(*args)
26
- _resize(false, *calculate_size(*args))
27
- end
30
+ module Transformations
31
+ def resize(*args)
32
+ _resize(false, *calculate_size(*args))
33
+ end
28
34
 
29
- def resize!(*args)
30
- _resize(true, *calculate_size(*args))
31
- end
35
+ def resize!(*args)
36
+ _resize(true, *calculate_size(*args))
37
+ end
32
38
 
33
- def crop(x, y, width, height)
34
- _crop(false, x, y, width, height)
35
- end
39
+ def crop(x, y, width, height)
40
+ _crop(false, x, y, width, height)
41
+ end
36
42
 
37
- def crop!(x, y, width, height)
38
- _crop(true, x, y, width, height)
39
- end
43
+ def crop!(x, y, width, height)
44
+ _crop(true, x, y, width, height)
45
+ end
46
+
47
+ def turn(orientation)
48
+ dup.turn!(orientation)
49
+ end
40
50
 
41
- def turn!(orientation)
42
- orientation = orientation.abs + 2 if orientation.negative?
43
- _turn!(orientation % 4)
51
+ def turn!(orientation)
52
+ orientation = orientation.abs + 2 if orientation.negative?
53
+ _turn!(orientation % 4)
54
+ end
55
+
56
+ def rotate(deg)
57
+ _rotate(false, deg.to_f * Math::PI / 180.0)
58
+ end
59
+
60
+ def rotate!(deg)
61
+ _rotate(true, deg.to_f * Math::PI / 180.0)
62
+ end
63
+
64
+ def sharpen(radius)
65
+ dup.sharpen!(radius)
66
+ end
67
+
68
+ def sharpen!(radius)
69
+ raise ArgumentError, 'illegal radius' if radius < 0
70
+ _sharpen!(radius)
71
+ end
72
+
73
+ def blur(radius)
74
+ dup.blur!(radius)
75
+ end
76
+
77
+ def blur!(radius)
78
+ raise ArgumentError, 'illegal radius' if radius < 0
79
+ _sharpen!(-radius)
80
+ end
81
+
82
+ # TODO
83
+ #def brighten!(brightness)
84
+ # raise ArgumentError, 'illegal brightness' if brightness > 1 || brightness < -1
85
+ # _brighten!(brightness)
86
+ #end
44
87
  end
88
+
89
+ include Transformations
45
90
 
46
- def save(path, format = nil)
47
- format ||= format_from_filename(path) || 'jpg'
48
- _save(path.to_s, format.to_s)
91
+ def save(path, format: nil, quality: nil)
92
+ format ||= format_from_filename(path) || self.format || 'jpg'
93
+ raise ArgumentError, "invalid quality #{quality.inspect}" if quality && !(0..100).cover?(quality)
94
+ ensure_path_is_writable(path)
95
+ _save(path.to_s, format.to_s, quality)
49
96
  end
50
97
 
51
98
  private
@@ -56,7 +103,7 @@ module Rszr
56
103
  # :auto, 300 auto width, fit height
57
104
  # 400, 300, crop: :center_middle
58
105
  # 400, 300, background: rgba
59
- # 400, 300, aspect: false
106
+ # 400, 300, skew: true
60
107
 
61
108
  def calculate_size(*args)
62
109
  options = args.last.is_a?(Hash) ? args.pop : {}
@@ -104,6 +151,15 @@ module Rszr
104
151
  def format_from_filename(path)
105
152
  File.extname(path)[1..-1]
106
153
  end
154
+
155
+ def ensure_path_is_writable(path)
156
+ path = Pathname.new(path)
157
+ path.dirname.realpath.writable?
158
+ rescue Errno::ENOENT => e
159
+ raise SaveError, 'Non-existant path component'
160
+ rescue SystemCallError => e
161
+ raise SaveError, e.message
162
+ end
107
163
 
108
164
  def assert_valid_keys(hsh, *valid_keys)
109
165
  if unknown_key = (hsh.keys - valid_keys).first
@@ -0,0 +1,82 @@
1
+ require 'rszr'
2
+ require 'image_processing'
3
+
4
+ module ImageProcessing
5
+ module Rszr
6
+ extend Chainable
7
+
8
+ class << self
9
+
10
+ # Returns whether the given image file is processable.
11
+ def valid_image?(file)
12
+ ::Rszr::Image.load(file).width
13
+ true
14
+ rescue ::Rszr::Error
15
+ false
16
+ end
17
+
18
+ end
19
+
20
+ class Processor < ImageProcessing::Processor
21
+ accumulator :image, ::Rszr::Image
22
+
23
+ class << self
24
+
25
+ # Loads the image on disk into a Rszr::Image object
26
+ def load_image(path_or_image, **options)
27
+ if path_or_image.is_a?(::Rszr::Image)
28
+ path_or_image
29
+ else
30
+ ::Rszr::Image.load(path_or_image)
31
+ end
32
+ # TODO: image = image.autorot if autorot && !options.key?(:autorotate)
33
+ end
34
+
35
+ # Writes the image object to disk.
36
+ # Accepts additional options (quality, format).
37
+ def save_image(image, destination_path, **options)
38
+ image.save(destination_path, **options)
39
+ end
40
+
41
+ # Calls the operation to perform the processing. If the operation is
42
+ # defined on the processor (macro), calls it. Otherwise calls the
43
+ # bang variant of the method directly on the Rszr image object.
44
+ def apply_operation(accumulator, (name, args, block))
45
+ return super if method_defined?(name)
46
+ accumulator.send("#{name}!", *args, &block)
47
+ end
48
+
49
+ end
50
+
51
+ # Resizes the image to not be larger than the specified dimensions.
52
+ def resize_to_limit(width, height, **options)
53
+ width, height = default_dimensions(width, height)
54
+ thumbnail(width, height, **options)
55
+ end
56
+
57
+ # Resizes the image to fit within the specified dimensions.
58
+ def resize_to_fit(width, height, **options)
59
+ width, height = default_dimensions(width, height)
60
+ thumbnail(width, height, **options)
61
+ end
62
+
63
+ # Resizes the image to fill the specified dimensions, applying any
64
+ # necessary cropping.
65
+ def resize_to_fill(width, height, **options)
66
+ thumbnail(width, height, crop: :center, **options)
67
+ end
68
+
69
+ private
70
+
71
+ def thumbnail(width, height, **options)
72
+ image.resize!(width, height, **options)
73
+ end
74
+
75
+ def default_dimensions(width, height)
76
+ raise Error, 'either width or height must be specified' unless width || height
77
+ [width || :auto, height || :auto]
78
+ end
79
+
80
+ end
81
+ end
82
+ end
data/lib/rszr/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Rszr
2
- VERSION = "0.5.2"
2
+ VERSION = '0.5.3'
3
3
  end
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rszr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 0.5.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthias Grosser
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-07 00:00:00.000000000 Z
11
+ date: 2021-03-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.9'
19
+ version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.9'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: 12.3.3
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: 12.3.3
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake-compiler
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: minitest
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: simplecov
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +108,20 @@ dependencies:
94
108
  - - ">="
95
109
  - !ruby/object:Gem::Version
96
110
  version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: image_processing
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
97
125
  - !ruby/object:Gem::Dependency
98
126
  name: gd2-ffij
99
127
  requirement: !ruby/object:Gem::Requirement
@@ -122,6 +150,20 @@ dependencies:
122
150
  - - ">="
123
151
  - !ruby/object:Gem::Version
124
152
  version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: ruby-vips
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
125
167
  - !ruby/object:Gem::Dependency
126
168
  name: memory_profiler
127
169
  requirement: !ruby/object:Gem::Requirement
@@ -156,12 +198,13 @@ files:
156
198
  - ext/rszr/rszr.h
157
199
  - lib/rszr.rb
158
200
  - lib/rszr/image.rb
201
+ - lib/rszr/image_processing.rb
159
202
  - lib/rszr/version.rb
160
203
  homepage: https://github.com/mtgrosser/rszr
161
204
  licenses:
162
205
  - MIT
163
206
  metadata: {}
164
- post_install_message:
207
+ post_install_message:
165
208
  rdoc_options: []
166
209
  require_paths:
167
210
  - lib
@@ -176,9 +219,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
176
219
  - - ">="
177
220
  - !ruby/object:Gem::Version
178
221
  version: '0'
179
- requirements: []
180
- rubygems_version: 3.0.1
181
- signing_key:
222
+ requirements:
223
+ - Imlib2
224
+ rubygems_version: 3.1.4
225
+ signing_key:
182
226
  specification_version: 4
183
227
  summary: Fast image resizer
184
228
  test_files: []