webp-ffi 0.1.8 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4faf9be4b898c23d0b6b8c035046f6b659878652
4
- data.tar.gz: a3a0c25ecca3b5d402a4abac31f8f279a6ee1192
3
+ metadata.gz: e31c8360882b799459efbb17d02a0c8c05182264
4
+ data.tar.gz: ad4344c8ce850645cc5f092d627e40860a2e4ae5
5
5
  SHA512:
6
- metadata.gz: d44c413f3e4b72eb08377f179d6a0ada43549d36d5b3baf79ce38e4cb6e03f4ea6245937ea9edb53fd615c7abc5f59aeb873ab7c648c89293a884912d9b79f37
7
- data.tar.gz: 123198f82ddfe778ab72614696afa54fbf7fb88497d1a4ef1107feb262cdcd4d9d322f008be36f580b5cd192b2dc6eb91fce5d352789f3a077d588ddb1c0b2c0
6
+ metadata.gz: 9ebce606526ecd0e5e715f3f83e259ef43dba995dc07cda35fb7d8dbf16e38aadf7171c9092ec5809613cf8073af8251a44539ff51446c2161c42f3912e1c3c5
7
+ data.tar.gz: dced6dcbbad67660e1b531317f60af8dcbcac734b2757baad107972e29ed4ed346445e6841f1f852a1909e006d4fff9c4856205935881e57604fb779b881745f
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.0.0
1
+ 2.1.0
data/CHANGELOG.md CHANGED
@@ -1,6 +1,10 @@
1
+ ## v0.2.0
2
+
3
+ * Checked and fixed for webp 0.4.0
4
+
1
5
  ## v0.1.8
2
6
 
3
- * Fix decoder options (it was not working fully)
7
+ * Fix encoder options (didn't work fully)
4
8
 
5
9
  ## v0.1.7
6
10
 
data/README.md CHANGED
@@ -13,21 +13,21 @@ WebP is a new image format that provides lossless and lossy compression for imag
13
13
 
14
14
  ### Requirements
15
15
 
16
- First of all you should have install libraries: libpng, libjpeg and libwebp (for libwebp need libpng and libjpeg).
16
+ First of all you should have install libraries: libpng, libjpeg and libtiff.
17
17
 
18
- For ubuntu, debian:
18
+ For Ubuntu, Debian:
19
19
 
20
20
  sudo apt-get install libjpeg-dev libpng-dev libtiff-dev
21
21
 
22
22
  For Mac OS:
23
23
 
24
- sudo port install jpeg libpng tiff
24
+ brew install libjpg libpng libtiff webp
25
25
 
26
- or:
26
+ or (for MacPorts):
27
27
 
28
- brew install libjpg libpng libtiff
28
+ sudo port install jpeg libpng tiff
29
29
 
30
- Next, you should [install libwebp](https://developers.google.com/speed/webp/docs/compiling).
30
+ Next, you should [install libwebp](https://developers.google.com/speed/webp/docs/compiling) (if you didn't install it by `brew` in Mac OS). This gem is not support Windows systems (sorry).
31
31
 
32
32
  ### Final part
33
33
 
data/ext/webp_ffi/util.c CHANGED
@@ -280,6 +280,146 @@ static int UtilWritePPM(FILE* fout, const WebPDecBuffer* const buffer, int alpha
280
280
  return 1;
281
281
  }
282
282
 
283
+ static void PutLE16(uint8_t* const dst, uint32_t value) {
284
+ dst[0] = (value >> 0) & 0xff;
285
+ dst[1] = (value >> 8) & 0xff;
286
+ }
287
+
288
+ static void PutLE32(uint8_t* const dst, uint32_t value) {
289
+ PutLE16(dst + 0, (value >> 0) & 0xffff);
290
+ PutLE16(dst + 2, (value >> 16) & 0xffff);
291
+ }
292
+
293
+ #define BMP_HEADER_SIZE 54
294
+ static int UtilWriteBMP(FILE* fout, const WebPDecBuffer* const buffer) {
295
+ const int has_alpha = (buffer->colorspace != MODE_BGR);
296
+ const uint32_t width = buffer->width;
297
+ const uint32_t height = buffer->height;
298
+ const uint8_t* const rgba = buffer->u.RGBA.rgba;
299
+ const int stride = buffer->u.RGBA.stride;
300
+ const uint32_t bytes_per_px = has_alpha ? 4 : 3;
301
+ uint32_t y;
302
+ const uint32_t line_size = bytes_per_px * width;
303
+ const uint32_t bmp_stride = (line_size + 3) & ~3; // pad to 4
304
+ const uint32_t total_size = bmp_stride * height + BMP_HEADER_SIZE;
305
+ uint8_t bmp_header[BMP_HEADER_SIZE] = { 0 };
306
+
307
+ // bitmap file header
308
+ PutLE16(bmp_header + 0, 0x4d42); // signature 'BM'
309
+ PutLE32(bmp_header + 2, total_size); // size including header
310
+ PutLE32(bmp_header + 6, 0); // reserved
311
+ PutLE32(bmp_header + 10, BMP_HEADER_SIZE); // offset to pixel array
312
+ // bitmap info header
313
+ PutLE32(bmp_header + 14, 40); // DIB header size
314
+ PutLE32(bmp_header + 18, width); // dimensions
315
+ PutLE32(bmp_header + 22, -(int)height); // vertical flip!
316
+ PutLE16(bmp_header + 26, 1); // number of planes
317
+ PutLE16(bmp_header + 28, bytes_per_px * 8); // bits per pixel
318
+ PutLE32(bmp_header + 30, 0); // no compression (BI_RGB)
319
+ PutLE32(bmp_header + 34, 0); // image size (dummy)
320
+ PutLE32(bmp_header + 38, 2400); // x pixels/meter
321
+ PutLE32(bmp_header + 42, 2400); // y pixels/meter
322
+ PutLE32(bmp_header + 46, 0); // number of palette colors
323
+ PutLE32(bmp_header + 50, 0); // important color count
324
+
325
+ // TODO(skal): color profile
326
+
327
+ // write header
328
+ if (fwrite(bmp_header, sizeof(bmp_header), 1, fout) != 1) {
329
+ return 0;
330
+ }
331
+
332
+ // write pixel array
333
+ for (y = 0; y < height; ++y) {
334
+ if (fwrite(rgba + y * stride, line_size, 1, fout) != 1) {
335
+ return 0;
336
+ }
337
+ // write padding zeroes
338
+ if (bmp_stride != line_size) {
339
+ const uint8_t zeroes[3] = { 0 };
340
+ if (fwrite(zeroes, bmp_stride - line_size, 1, fout) != 1) {
341
+ return 0;
342
+ }
343
+ }
344
+ }
345
+ return 1;
346
+ }
347
+ #undef BMP_HEADER_SIZE
348
+
349
+ #define NUM_IFD_ENTRIES 15
350
+ #define EXTRA_DATA_SIZE 16
351
+ // 10b for signature/header + n * 12b entries + 4b for IFD terminator:
352
+ #define EXTRA_DATA_OFFSET (10 + 12 * NUM_IFD_ENTRIES + 4)
353
+ #define TIFF_HEADER_SIZE (EXTRA_DATA_OFFSET + EXTRA_DATA_SIZE)
354
+
355
+ static int UtilWriteTIFF(FILE* fout, const WebPDecBuffer* const buffer) {
356
+ const int has_alpha = (buffer->colorspace != MODE_RGB);
357
+ const uint32_t width = buffer->width;
358
+ const uint32_t height = buffer->height;
359
+ const uint8_t* const rgba = buffer->u.RGBA.rgba;
360
+ const int stride = buffer->u.RGBA.stride;
361
+ const uint8_t bytes_per_px = has_alpha ? 4 : 3;
362
+ // For non-alpha case, we omit tag 0x152 (ExtraSamples).
363
+ const uint8_t num_ifd_entries = has_alpha ? NUM_IFD_ENTRIES
364
+ : NUM_IFD_ENTRIES - 1;
365
+ uint8_t tiff_header[TIFF_HEADER_SIZE] = {
366
+ 0x49, 0x49, 0x2a, 0x00, // little endian signature
367
+ 8, 0, 0, 0, // offset to the unique IFD that follows
368
+ // IFD (offset = 8). Entries must be written in increasing tag order.
369
+ num_ifd_entries, 0, // Number of entries in the IFD (12 bytes each).
370
+ 0x00, 0x01, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, // 10: Width (TBD)
371
+ 0x01, 0x01, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, // 22: Height (TBD)
372
+ 0x02, 0x01, 3, 0, bytes_per_px, 0, 0, 0, // 34: BitsPerSample: 8888
373
+ EXTRA_DATA_OFFSET + 0, 0, 0, 0,
374
+ 0x03, 0x01, 3, 0, 1, 0, 0, 0, 1, 0, 0, 0, // 46: Compression: none
375
+ 0x06, 0x01, 3, 0, 1, 0, 0, 0, 2, 0, 0, 0, // 58: Photometric: RGB
376
+ 0x11, 0x01, 4, 0, 1, 0, 0, 0, // 70: Strips offset:
377
+ TIFF_HEADER_SIZE, 0, 0, 0, // data follows header
378
+ 0x12, 0x01, 3, 0, 1, 0, 0, 0, 1, 0, 0, 0, // 82: Orientation: topleft
379
+ 0x15, 0x01, 3, 0, 1, 0, 0, 0, // 94: SamplesPerPixels
380
+ bytes_per_px, 0, 0, 0,
381
+ 0x16, 0x01, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, // 106: Rows per strip (TBD)
382
+ 0x17, 0x01, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, // 118: StripByteCount (TBD)
383
+ 0x1a, 0x01, 5, 0, 1, 0, 0, 0, // 130: X-resolution
384
+ EXTRA_DATA_OFFSET + 8, 0, 0, 0,
385
+ 0x1b, 0x01, 5, 0, 1, 0, 0, 0, // 142: Y-resolution
386
+ EXTRA_DATA_OFFSET + 8, 0, 0, 0,
387
+ 0x1c, 0x01, 3, 0, 1, 0, 0, 0, 1, 0, 0, 0, // 154: PlanarConfiguration
388
+ 0x28, 0x01, 3, 0, 1, 0, 0, 0, 2, 0, 0, 0, // 166: ResolutionUnit (inch)
389
+ 0x52, 0x01, 3, 0, 1, 0, 0, 0, 1, 0, 0, 0, // 178: ExtraSamples: rgbA
390
+ 0, 0, 0, 0, // 190: IFD terminator
391
+ // EXTRA_DATA_OFFSET:
392
+ 8, 0, 8, 0, 8, 0, 8, 0, // BitsPerSample
393
+ 72, 0, 0, 0, 1, 0, 0, 0 // 72 pixels/inch, for X/Y-resolution
394
+ };
395
+ uint32_t y;
396
+
397
+ // Fill placeholders in IFD:
398
+ PutLE32(tiff_header + 10 + 8, width);
399
+ PutLE32(tiff_header + 22 + 8, height);
400
+ PutLE32(tiff_header + 106 + 8, height);
401
+ PutLE32(tiff_header + 118 + 8, width * bytes_per_px * height);
402
+ if (!has_alpha) PutLE32(tiff_header + 178, 0); // IFD terminator
403
+
404
+ // write header
405
+ if (fwrite(tiff_header, sizeof(tiff_header), 1, fout) != 1) {
406
+ return 0;
407
+ }
408
+ // write pixel values
409
+ for (y = 0; y < height; ++y) {
410
+ if (fwrite(rgba + y * stride, bytes_per_px, width, fout) != width) {
411
+ return 0;
412
+ }
413
+ }
414
+
415
+ return 1;
416
+ }
417
+
418
+ #undef TIFF_HEADER_SIZE
419
+ #undef EXTRA_DATA_OFFSET
420
+ #undef EXTRA_DATA_SIZE
421
+ #undef NUM_IFD_ENTRIES
422
+
283
423
  static int UtilWriteAlphaPlane(FILE* fout, const WebPDecBuffer* const buffer) {
284
424
  const uint32_t width = buffer->width;
285
425
  const uint32_t height = buffer->height;
@@ -389,11 +529,11 @@ static InputFileFormat GetImageType(FILE* in_file) {
389
529
 
390
530
  magic = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
391
531
  if (magic == 0x89504E47U) {
392
- format = PNG_;
532
+ format = iPNG_;
393
533
  } else if (magic >= 0xFFD8FF00U && magic <= 0xFFD8FFFFU) {
394
- format = JPEG_;
534
+ format = iJPEG_;
395
535
  } else if (magic == 0x49492A00 || magic == 0x4D4D002A) {
396
- format = TIFF_;
536
+ format = iTIFF_;
397
537
  }
398
538
  return format;
399
539
  }
@@ -410,11 +550,11 @@ int UtilReadPicture(const char* const filename, WebPPicture* const pic,
410
550
  if (pic->width == 0 || pic->height == 0) {
411
551
  // If no size specified, try to decode it as PNG/JPEG (as appropriate).
412
552
  const InputFileFormat format = GetImageType(in_file);
413
- if (format == PNG_) {
553
+ if (format == iPNG_) {
414
554
  ok = UtilReadPNG(in_file, pic, keep_alpha);
415
- } else if (format == JPEG_) {
555
+ } else if (format == iJPEG_) {
416
556
  ok = UtilReadJPEG(in_file, pic);
417
- } else if (format == TIFF_) {
557
+ } else if (format == iTIFF_) {
418
558
  ok = UtilReadTIFF(filename, pic, keep_alpha);
419
559
  }
420
560
  } else {
@@ -437,13 +577,17 @@ int UtilSaveOutput(const WebPDecBuffer* const buffer,
437
577
  return 0;
438
578
  }
439
579
 
440
- if (format == PNG) {
580
+ if (format == oPNG) {
441
581
  ok &= UtilWritePNG(fout, buffer);
442
- } else if (format == PAM) {
582
+ } else if (format == oPAM) {
443
583
  ok &= UtilWritePPM(fout, buffer, 1);
444
- } else if (format == PPM) {
584
+ } else if (format == oPPM) {
445
585
  ok &= UtilWritePPM(fout, buffer, 0);
446
- } else if (format == PGM) {
586
+ } else if (format == oBMP) {
587
+ ok &= UtilWriteBMP(fout, buffer);
588
+ } else if (format == oTIFF_) {
589
+ ok &= UtilWriteTIFF(fout, buffer);
590
+ } else if (format == oPGM || format == oYUV) {
447
591
  ok &= UtilWritePGM(fout, buffer);
448
592
  } else if (format == ALPHA_PLANE_ONLY) {
449
593
  ok &= UtilWriteAlphaPlane(fout, buffer);
data/ext/webp_ffi/util.h CHANGED
@@ -6,17 +6,20 @@ extern "C" {
6
6
  #endif
7
7
 
8
8
  typedef enum {
9
- PNG = 0,
10
- PAM,
11
- PPM,
12
- PGM,
9
+ oPNG = 0,
10
+ oPAM,
11
+ oPPM,
12
+ oPGM,
13
+ oBMP,
14
+ oTIFF_,
15
+ oYUV,
13
16
  ALPHA_PLANE_ONLY // this is for experimenting only
14
17
  } OutputFileFormat;
15
18
 
16
19
  typedef enum {
17
- PNG_ = 0,
18
- JPEG_,
19
- TIFF_, // 'TIFF' clashes with libtiff
20
+ iPNG_ = 0,
21
+ iJPEG_,
22
+ iTIFF_, // 'TIFF' clashes with libtiff
20
23
  UNSUPPORTED
21
24
  } InputFileFormat;
22
25
 
@@ -3,14 +3,10 @@
3
3
  #include <stdlib.h>
4
4
  #include <string.h>
5
5
 
6
- #include "webp/decode.h"
7
- #include "webp/encode.h"
8
-
9
6
  // utils
10
7
  #include "./util.h"
11
8
  #include "./webp_ffi.h"
12
9
 
13
-
14
10
  #if defined(__cplusplus) || defined(c_plusplus)
15
11
  extern "C" {
16
12
  #endif
@@ -193,7 +189,7 @@ int webp_decode(const char *in_file, const char *out_file, const FfiWebpDecodeCo
193
189
  WebPDecoderConfig config;
194
190
  WebPDecBuffer* const output_buffer = &config.output;
195
191
  WebPBitstreamFeatures* const bitstream = &config.input;
196
- OutputFileFormat format = PNG;
192
+ OutputFileFormat format = oPNG;
197
193
 
198
194
  if (!WebPInitDecoderConfig(&config)) {
199
195
  //fprintf(stderr, "Library version mismatch!\n");
@@ -239,16 +235,24 @@ int webp_decode(const char *in_file, const char *out_file, const FfiWebpDecodeCo
239
235
  }
240
236
 
241
237
  switch (format) {
242
- case PNG:
238
+ case oPNG:
243
239
  output_buffer->colorspace = bitstream->has_alpha ? MODE_RGBA : MODE_RGB;
244
240
  break;
245
- case PAM:
241
+ case oPAM:
246
242
  output_buffer->colorspace = MODE_RGBA;
247
243
  break;
248
- case PPM:
244
+ case oPPM:
249
245
  output_buffer->colorspace = MODE_RGB; // drops alpha for PPM
250
246
  break;
251
- case PGM:
247
+ case oBMP:
248
+ output_buffer->colorspace = bitstream->has_alpha ? MODE_BGRA : MODE_BGR;
249
+ break;
250
+ case oTIFF_: // note: force pre-multiplied alpha
251
+ output_buffer->colorspace =
252
+ bitstream->has_alpha ? MODE_rgbA : MODE_RGB;
253
+ break;
254
+ case oPGM:
255
+ case oYUV:
252
256
  output_buffer->colorspace = bitstream->has_alpha ? MODE_YUVA : MODE_YUV;
253
257
  break;
254
258
  case ALPHA_PLANE_ONLY:
@@ -258,6 +262,7 @@ int webp_decode(const char *in_file, const char *out_file, const FfiWebpDecodeCo
258
262
  free((void*)data);
259
263
  return 3;
260
264
  }
265
+
261
266
  status = WebPDecode(data, data_size, &config);
262
267
 
263
268
  if (status != VP8_STATUS_OK) {
data/lib/webp/c.rb CHANGED
@@ -5,6 +5,9 @@ module WebP
5
5
  :pam,
6
6
  :ppm,
7
7
  :pgm,
8
+ :bmp,
9
+ :tiff,
10
+ :yuv,
8
11
  :alpha_plane_only )
9
12
  # struct
10
13
  class FfiWebpEncodeConfig < FFI::Struct
@@ -37,7 +40,7 @@ module WebP
37
40
  :resize_w, :int,
38
41
  :resize_h, :int
39
42
  end
40
-
43
+
41
44
  class FfiWebpDecodeConfig < FFI::Struct
42
45
  layout :output_format, OutputFileFormat,
43
46
  :bypass_filtering, :int,
data/lib/webp/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module WebP
2
- VERSION = "0.1.8"
2
+ VERSION = "0.2.0"
3
3
  end
data/spec/travis_build.sh CHANGED
@@ -1,7 +1,7 @@
1
1
  #/usr/bin/env sh
2
- wget http://webp.googlecode.com/files/libwebp-0.3.1.tar.gz
3
- tar xvzf libwebp-0.3.1.tar.gz
4
- cd libwebp-0.3.1
2
+ wget http://webp.googlecode.com/files/libwebp-0.4.0.tar.gz
3
+ tar xvzf libwebp-0.4.0.tar.gz
4
+ cd libwebp-0.4.0
5
5
  ./configure
6
6
  make
7
7
  sudo make install
@@ -132,7 +132,7 @@ describe WebP do
132
132
  end
133
133
  end
134
134
  context "with output_format" do
135
- [:png, :pam, :ppm, :pgm, :alpha_plane_only].each do |output_format|
135
+ [:png, :pam, :ppm, :pgm, :bmp, :tiff, :yuv, :alpha_plane_only].each do |output_format|
136
136
  factories[:webp].take(2).each do |image|
137
137
  it "#{image}.webp image to #{output_format}" do
138
138
  in_filename = File.expand_path(File.join(File.dirname(__FILE__), "factories/#{image}.webp"))
metadata CHANGED
@@ -1,83 +1,83 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: webp-ffi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexey Vasyliev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-23 00:00:00.000000000 Z
11
+ date: 2014-01-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: 1.9.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: 1.9.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: ffi-compiler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: 0.1.2
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: 0.1.2
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '1.2'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.2'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '>='
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '>='
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
75
  version: 2.14.0
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - '>='
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: 2.14.0
83
83
  description: Ruby wrapper for libwebp
@@ -88,9 +88,9 @@ extensions:
88
88
  - ext/webp_ffi/Rakefile
89
89
  extra_rdoc_files: []
90
90
  files:
91
- - .gitignore
92
- - .ruby-version
93
- - .travis.yml
91
+ - ".gitignore"
92
+ - ".ruby-version"
93
+ - ".travis.yml"
94
94
  - CHANGELOG.md
95
95
  - Gemfile
96
96
  - LICENSE.txt
@@ -133,17 +133,17 @@ require_paths:
133
133
  - lib
134
134
  required_ruby_version: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - '>='
136
+ - - ">="
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
139
  required_rubygems_version: !ruby/object:Gem::Requirement
140
140
  requirements:
141
- - - '>='
141
+ - - ">="
142
142
  - !ruby/object:Gem::Version
143
143
  version: '0'
144
144
  requirements: []
145
145
  rubyforge_project:
146
- rubygems_version: 2.0.3
146
+ rubygems_version: 2.2.1
147
147
  signing_key:
148
148
  specification_version: 4
149
149
  summary: Ruby wrapper for libwebp