image_science 1.2.6 → 1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2f4c2bf100b9b9c8b0fc90434c2457f59ad04413
4
- data.tar.gz: 27a8915d9d58366d4f780087e6518a75ba97772e
3
+ metadata.gz: fb44497f07164016d9a369ec83065816b3a7d837
4
+ data.tar.gz: 6c5fdaa3fd0a82bfb2decd4542601ab063dac965
5
5
  SHA512:
6
- metadata.gz: 14f8f590cc4ff27fd8604b6dfcd6fe0ef38ec3e80ec03a896f79383e2e136d8c12418f6366afa661dbc6a83c5f7bcf17587e7c51d9df70473f37f8001fcb4799
7
- data.tar.gz: 65c54429309c45b2547a278b7e0a0d109645392e17f31f7c4af12cebd44b64813624980a111fef2e0ce710f8883978f0c269f04b1c1396954140eeaf04b0737b
6
+ metadata.gz: 26db89c63f7a24c5b72fadc9eae287c171fe5c81e9cb5cde0af95bbffdcb92dcffb4545e3219581d940ae74845f7a7f2df617210a14161c33c2afa23e0d7bbf0
7
+ data.tar.gz: a3710d72afbe244c133abbde96f9794e750132c6f641cb00a3c212103447aed3f3c46c503a635000d041532642bde4d0e09936d7df3dde20575132d2dc9f35ba
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -1,3 +1,13 @@
1
+ === 1.3.0 / 2016-05-16
2
+
3
+ * 1 minor enhancement:
4
+
5
+ * Add rotate method. (bhenderson)
6
+
7
+ * 1 bug fix:
8
+
9
+ * Fixed error-raising behaviour. (omp)
10
+
1
11
  === 1.2.6 / 2014-01-15
2
12
 
3
13
  * 1 bug fix:
data/Rakefile CHANGED
@@ -13,6 +13,8 @@ Hoe.plugin :isolate
13
13
  Hoe.spec 'image_science' do
14
14
  developer 'Ryan Davis', 'ryand-ruby@zenspider.com'
15
15
 
16
+ license "MIT"
17
+
16
18
  clean_globs << 'blah*png' << 'images/*_thumb.*'
17
19
  end
18
20
 
@@ -11,7 +11,7 @@ require 'inline'
11
11
  # http://seattlerb.rubyforge.org/ImageScience.html
12
12
 
13
13
  class ImageScience
14
- VERSION = '1.2.6'
14
+ VERSION = '1.3.0'
15
15
 
16
16
  ##
17
17
  # The top-level image loader opens +path+ and then yields the image.
@@ -52,6 +52,11 @@ class ImageScience
52
52
  #
53
53
  # :method: resize
54
54
 
55
+ ##
56
+ # Rotate the image to +angle+. Limited to 45 degree skewing only.
57
+ #
58
+ # :method: rotate
59
+
55
60
  ##
56
61
  # Creates a proportional thumbnail of the image scaled so its longest
57
62
  # edge is resized to +size+ and yields the new image.
@@ -105,7 +110,8 @@ class ImageScience
105
110
  builder.prefix <<-"END"
106
111
  #define GET_BITMAP(name) Data_Get_Struct(self, FIBITMAP, (name)); if (!(name)) rb_raise(rb_eTypeError, "Bitmap has already been freed");
107
112
  static ID err_key; /* used as thread-local key */
108
- static void raise_deferred(void);
113
+ static void clear_error(void);
114
+ static void raise_error(void);
109
115
  END
110
116
 
111
117
  builder.prefix <<-"END"
@@ -115,29 +121,19 @@ class ImageScience
115
121
 
116
122
  FreeImage_Unload(bitmap);
117
123
  DATA_PTR(self) = NULL;
118
- raise_deferred(); /* raise just in case */
124
+ clear_error();
119
125
  return Qnil;
120
126
  }
121
127
  END
122
128
 
123
129
  builder.prefix <<-"END"
124
- static VALUE raise_or_yield(VALUE obj) {
125
- /*
126
- * check for FreeImage routines which may warn or error out,
127
- * do not run user code if there are warnings/errors here:
128
- */
129
- raise_deferred();
130
-
131
- return rb_yield(obj);
132
- }
133
-
134
130
  VALUE wrap_and_yield(FIBITMAP *image, VALUE self, FREE_IMAGE_FORMAT fif) {
135
131
  unsigned int self_is_class = rb_type(self) == T_CLASS;
136
132
  VALUE klass = self_is_class ? self : CLASS_OF(self);
137
133
  VALUE type = self_is_class ? INT2FIX(fif) : rb_iv_get(self, "@file_type");
138
134
  VALUE obj = Data_Wrap_Struct(klass, NULL, NULL, image);
139
135
  rb_iv_set(obj, "@file_type", type);
140
- return rb_ensure(raise_or_yield, obj, unload, obj);
136
+ return rb_ensure(rb_yield, obj, unload, obj);
141
137
  }
142
138
  END
143
139
 
@@ -169,15 +165,25 @@ class ImageScience
169
165
  # do not call this until necessary variables are wrapped up for GC
170
166
  # otherwise there will be leaks
171
167
  builder.prefix <<-"END"
172
- static void raise_deferred(void) {
168
+ static void raise_error(void) {
173
169
  VALUE err = rb_thread_local_aref(rb_thread_current(), err_key);
174
- if (!NIL_P(err)) {
170
+ if (NIL_P(err)) {
171
+ rb_raise(rb_eRuntimeError, "FreeImage exception");
172
+ } else {
175
173
  rb_thread_local_aset(rb_thread_current(), err_key, Qnil);
176
174
  rb_raise(rb_eRuntimeError, "%s", StringValueCStr(err));
177
175
  }
178
176
  }
179
177
  END
180
178
 
179
+ builder.prefix <<-"END"
180
+ static void clear_error(void) {
181
+ if (!NIL_P(rb_thread_local_aref(rb_thread_current(), err_key))) {
182
+ rb_thread_local_aset(rb_thread_current(), err_key, Qnil);
183
+ }
184
+ }
185
+ END
186
+
181
187
  builder.prefix <<-"END"
182
188
  FIBITMAP* ReOrient(FIBITMAP *bitmap) {
183
189
  FITAG *tagValue = NULL;
@@ -216,11 +222,11 @@ class ImageScience
216
222
  FIBITMAP *bitmap;
217
223
  VALUE result = Qnil;
218
224
  flags = fif == FIF_JPEG ? JPEG_ACCURATE : 0;
219
- if ((bitmap = FreeImage_Load(fif, input, flags))) {
220
- bitmap = ReOrient(bitmap);
221
- result = wrap_and_yield(bitmap, self, fif);
222
- }
223
- raise_deferred();
225
+
226
+ if (!(bitmap = FreeImage_Load(fif, input, flags))) raise_error();
227
+ if (!(bitmap = ReOrient(bitmap))) raise_error();
228
+
229
+ result = wrap_and_yield(bitmap, self, fif);
224
230
  return result;
225
231
  }
226
232
  rb_raise(rb_eTypeError, "Unknown file format");
@@ -249,17 +255,18 @@ class ImageScience
249
255
 
250
256
  fif = FreeImage_GetFileTypeFromMemory(stream, 0);
251
257
  if ((fif == FIF_UNKNOWN) || !FreeImage_FIFSupportsReading(fif)) {
258
+ FreeImage_CloseMemory(stream);
252
259
  rb_raise(rb_eTypeError, "Unknown file format");
253
260
  }
254
261
 
255
262
  flags = fif == FIF_JPEG ? JPEG_ACCURATE : 0;
256
263
  bitmap = FreeImage_LoadFromMemory(fif, stream, flags);
257
264
  FreeImage_CloseMemory(stream);
258
- if (bitmap) {
259
- bitmap = ReOrient(bitmap);
260
- result = wrap_and_yield(bitmap, self, fif);
261
- }
262
- raise_deferred();
265
+
266
+ if (!bitmap) raise_error();
267
+ if (!(bitmap = ReOrient(bitmap))) raise_error();
268
+
269
+ result = wrap_and_yield(bitmap, self, fif);
263
270
  return result;
264
271
  }
265
272
  END
@@ -267,15 +274,12 @@ class ImageScience
267
274
  builder.c <<-"END"
268
275
  VALUE with_crop(int l, int t, int r, int b) {
269
276
  FIBITMAP *copy, *bitmap;
270
- VALUE result = Qnil;
271
277
  GET_BITMAP(bitmap);
272
278
 
273
- if ((copy = FreeImage_Copy(bitmap, l, t, r, b))) {
274
- copy_icc_profile(self, bitmap, copy);
275
- result = wrap_and_yield(copy, self, 0);
276
- }
277
- raise_deferred();
278
- return result;
279
+ if (!(copy = FreeImage_Copy(bitmap, l, t, r, b))) raise_error();
280
+
281
+ copy_icc_profile(self, bitmap, copy);
282
+ return wrap_and_yield(copy, self, 0);
279
283
  }
280
284
  END
281
285
 
@@ -303,12 +307,25 @@ class ImageScience
303
307
  if (w <= 0) rb_raise(rb_eArgError, "Width <= 0");
304
308
  if (h <= 0) rb_raise(rb_eArgError, "Height <= 0");
305
309
  GET_BITMAP(bitmap);
310
+
306
311
  image = FreeImage_Rescale(bitmap, w, h, FILTER_CATMULLROM);
312
+ if (!image) raise_error();
313
+
314
+ copy_icc_profile(self, bitmap, image);
315
+ return wrap_and_yield(image, self, 0);
316
+ }
317
+ END
318
+
319
+ builder.c <<-"END"
320
+ VALUE rotate(int angle) {
321
+ FIBITMAP *bitmap, *image;
322
+ if ((angle % 45) != 0) rb_raise(rb_eArgError, "Angle must be 45 degree skew");
323
+ GET_BITMAP(bitmap);
324
+ image = FreeImage_RotateClassic(bitmap, angle);
307
325
  if (image) {
308
326
  copy_icc_profile(self, bitmap, image);
309
327
  return wrap_and_yield(image, self, 0);
310
328
  }
311
- raise_deferred();
312
329
  return Qnil;
313
330
  }
314
331
  END
@@ -325,15 +342,16 @@ class ImageScience
325
342
  flags = fif == FIF_JPEG ? JPEG_QUALITYSUPERB : 0;
326
343
 
327
344
  if (fif == FIF_PNG) FreeImage_DestroyICCProfile(bitmap);
328
- if (fif == FIF_JPEG && FreeImage_GetBPP(bitmap) != 24)
345
+ if (fif == FIF_JPEG && FreeImage_GetBPP(bitmap) != 24) {
329
346
  bitmap = FreeImage_ConvertTo24Bits(bitmap), unload = 1; // sue me
347
+ if (!bitmap) raise_error();
348
+ }
330
349
 
331
350
  result = FreeImage_Save(fif, bitmap, output, flags);
332
-
333
351
  if (unload) FreeImage_Unload(bitmap);
352
+ if (!result) raise_error();
334
353
 
335
- raise_deferred();
336
- return result ? Qtrue : Qfalse;
354
+ return Qtrue;
337
355
  }
338
356
  rb_raise(rb_eTypeError, "Unknown file format");
339
357
  return Qnil;
@@ -30,7 +30,7 @@ class TestImageScience < Minitest::Test
30
30
  assert img.save(@tmppath)
31
31
  end
32
32
 
33
- assert File.exists?(@tmppath)
33
+ assert File.exist?(@tmppath)
34
34
 
35
35
  ImageScience.with_image @tmppath do |img|
36
36
  assert_kind_of ImageScience, img
@@ -65,7 +65,7 @@ class TestImageScience < Minitest::Test
65
65
  assert img.save(@tmppath)
66
66
  end
67
67
 
68
- assert File.exists?(@tmppath)
68
+ assert File.exist?(@tmppath)
69
69
 
70
70
  ImageScience.with_image @tmppath do |img|
71
71
  assert_kind_of ImageScience, img
@@ -89,7 +89,7 @@ class TestImageScience < Minitest::Test
89
89
  end
90
90
  end
91
91
 
92
- assert File.exists?(@tmppath)
92
+ assert File.exist?(@tmppath)
93
93
 
94
94
  ImageScience.with_image @tmppath do |img|
95
95
  assert_kind_of ImageScience, img
@@ -105,7 +105,7 @@ class TestImageScience < Minitest::Test
105
105
  end
106
106
  end
107
107
 
108
- assert File.exists?(@tmppath)
108
+ assert File.exist?(@tmppath)
109
109
 
110
110
  ImageScience.with_image @tmppath do |img|
111
111
  assert_kind_of ImageScience, img
@@ -123,7 +123,7 @@ class TestImageScience < Minitest::Test
123
123
  end
124
124
  end
125
125
 
126
- refute File.exists?(@tmppath)
126
+ refute File.exist?(@tmppath)
127
127
 
128
128
  assert_raises ArgumentError do
129
129
  ImageScience.with_image @path do |img|
@@ -133,7 +133,7 @@ class TestImageScience < Minitest::Test
133
133
  end
134
134
  end
135
135
 
136
- refute File.exists?(@tmppath)
136
+ refute File.exist?(@tmppath)
137
137
  end
138
138
 
139
139
  def test_resize_negative
@@ -145,7 +145,7 @@ class TestImageScience < Minitest::Test
145
145
  end
146
146
  end
147
147
 
148
- refute File.exists?(@tmppath)
148
+ refute File.exist?(@tmppath)
149
149
 
150
150
  assert_raises ArgumentError do
151
151
  ImageScience.with_image @path do |img|
@@ -155,7 +155,7 @@ class TestImageScience < Minitest::Test
155
155
  end
156
156
  end
157
157
 
158
- refute File.exists?(@tmppath)
158
+ refute File.exist?(@tmppath)
159
159
  end
160
160
 
161
161
  def test_thumbnail
@@ -165,7 +165,7 @@ class TestImageScience < Minitest::Test
165
165
  end
166
166
  end
167
167
 
168
- assert File.exists?(@tmppath)
168
+ assert File.exist?(@tmppath)
169
169
 
170
170
  ImageScience.with_image @tmppath do |img|
171
171
  assert_kind_of ImageScience, img
@@ -188,4 +188,23 @@ class TestImageScience < Minitest::Test
188
188
  assert_equal 38, img.width
189
189
  end
190
190
  end
191
+
192
+ def test_rotate
193
+ ImageScience.with_image "test/portrait.jpg" do |image|
194
+ image.rotate 90 do |img|
195
+ assert_equal 50, img.width
196
+ assert_equal 38, img.height
197
+ end
198
+ end
199
+ end
200
+
201
+ def test_rotate_not_45
202
+ e = assert_raises ArgumentError do
203
+ ImageScience.with_image "test/portrait.jpg" do |image|
204
+ image.rotate 44
205
+ end
206
+ end
207
+
208
+ assert_equal 'Angle must be 45 degree skew', e.message
209
+ end
191
210
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: image_science
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.6
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Davis
@@ -10,9 +10,9 @@ bindir: bin
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
- MIIDPjCCAiagAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMRMwEQYDVQQDDApyeWFu
13
+ MIIDPjCCAiagAwIBAgIBAzANBgkqhkiG9w0BAQUFADBFMRMwEQYDVQQDDApyeWFu
14
14
  ZC1ydWJ5MRkwFwYKCZImiZPyLGQBGRYJemVuc3BpZGVyMRMwEQYKCZImiZPyLGQB
15
- GRYDY29tMB4XDTEzMDkxNjIzMDQxMloXDTE0MDkxNjIzMDQxMlowRTETMBEGA1UE
15
+ GRYDY29tMB4XDTE1MDkxOTIwNTEyMloXDTE2MDkxODIwNTEyMlowRTETMBEGA1UE
16
16
  AwwKcnlhbmQtcnVieTEZMBcGCgmSJomT8ixkARkWCXplbnNwaWRlcjETMBEGCgmS
17
17
  JomT8ixkARkWA2NvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALda
18
18
  b9DCgK+627gPJkB6XfjZ1itoOQvpqH1EXScSaba9/S2VF22VYQbXU1xQXL/WzCkx
@@ -22,14 +22,14 @@ cert_chain:
22
22
  qhtV7HJxNKuPj/JFH0D2cswvzznE/a5FOYO68g+YCuFi5L8wZuuM8zzdwjrWHqSV
23
23
  gBEfoTEGr7Zii72cx+sCAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw
24
24
  HQYDVR0OBBYEFEfFe9md/r/tj/Wmwpy+MI8d9k/hMA0GCSqGSIb3DQEBBQUAA4IB
25
- AQCFZ7JTzoy1gcG4d8A6dmOJy7ygtO5MFpRIz8HuKCF5566nOvpy7aHhDDzFmQuu
26
- FX3zDU6ghx5cQIueDhf2SGOncyBmmJRRYawm3wI0o1MeN6LZJ/3cRaOTjSFy6+S6
27
- zqDmHBp8fVA2TGJtO0BLNkbGVrBJjh0UPmSoGzWlRhEVnYC33TpDAbNA+u39UrQI
28
- ynwhNN7YbnmSR7+JU2cUjBFv2iPBO+TGuWC+9L2zn3NHjuc6tnmSYipA9y8Hv+As
29
- Y4evBVezr3SjXz08vPqRO5YRdO3zfeMT8gBjRqZjWJGMZ2lD4XNfrs7eky74CyZw
30
- xx3n58i0lQkBE1EpKE0lFu/y
25
+ AQB+Hx8xUgrpZa4P8H8gR8zme5kISwQrG80MbpqJV6/G3/ZicRFhN5sjwu0uHGue
26
+ bd9Cymf6oIRwHVarJux2M32T6bL07Hmi07w2QaPc3MnMKB/D46SRZ2JSSGPFRBTc
27
+ SilobMRoGs/7B15uGFUEnNrCB/ltMqhwwSx1r++UQPfeySHEV9uqu03E5Vb7J37O
28
+ 2Er6PLXHRiYsIycD1LkMi6YnixdITRHmrqJYE2rsjaIfpIehiusVAPHkNf7qbpHq
29
+ qx3h45R1CAsObX0SQDIT+rRbQrtKz1GHIZTOFYvEJjUY1XmRTZupD3CJ8Q7sDqSy
30
+ NLq5jm1fq6Y9Uolu3RJbmycf
31
31
  -----END CERTIFICATE-----
32
- date: 2014-01-16 00:00:00.000000000 Z
32
+ date: 2016-05-16 00:00:00.000000000 Z
33
33
  dependencies:
34
34
  - !ruby/object:Gem::Dependency
35
35
  name: RubyInline
@@ -45,20 +45,6 @@ dependencies:
45
45
  - - ~>
46
46
  - !ruby/object:Gem::Version
47
47
  version: '3.9'
48
- - !ruby/object:Gem::Dependency
49
- name: minitest
50
- requirement: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ~>
53
- - !ruby/object:Gem::Version
54
- version: '5.2'
55
- type: :development
56
- prerelease: false
57
- version_requirements: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ~>
60
- - !ruby/object:Gem::Version
61
- version: '5.2'
62
48
  - !ruby/object:Gem::Dependency
63
49
  name: rdoc
64
50
  requirement: !ruby/object:Gem::Requirement
@@ -79,14 +65,14 @@ dependencies:
79
65
  requirements:
80
66
  - - ~>
81
67
  - !ruby/object:Gem::Version
82
- version: '3.8'
68
+ version: '3.15'
83
69
  type: :development
84
70
  prerelease: false
85
71
  version_requirements: !ruby/object:Gem::Requirement
86
72
  requirements:
87
73
  - - ~>
88
74
  - !ruby/object:Gem::Version
89
- version: '3.8'
75
+ version: '3.15'
90
76
  description: |-
91
77
  ImageScience is a clean and happy Ruby library that generates
92
78
  thumbnails -- and kicks the living crap out of RMagick. Oh, and it
@@ -103,7 +89,6 @@ extra_rdoc_files:
103
89
  - Manifest.txt
104
90
  - README.txt
105
91
  files:
106
- - .gemtest
107
92
  - History.txt
108
93
  - Manifest.txt
109
94
  - README.txt
@@ -135,11 +120,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
135
120
  - !ruby/object:Gem::Version
136
121
  version: '0'
137
122
  requirements: []
138
- rubyforge_project: image_science
139
- rubygems_version: 2.2.1
123
+ rubyforge_project:
124
+ rubygems_version: 2.4.5
140
125
  signing_key:
141
126
  specification_version: 4
142
127
  summary: ImageScience is a clean and happy Ruby library that generates thumbnails
143
128
  -- and kicks the living crap out of RMagick
144
- test_files:
145
- - test/test_image_science.rb
129
+ test_files: []
metadata.gz.sig CHANGED
Binary file
data/.gemtest DELETED
File without changes