zopfli 0.0.4 → 0.0.5

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: 503ace95ca436e62f8e7d158bce6dd89e70306cb
4
- data.tar.gz: c7ff625d49d161b4a5e72982d3f411b3d06a9e7a
3
+ metadata.gz: 4ed0d8eec767ad3ac6d89fef3b9acb09e2cc1091
4
+ data.tar.gz: 9c9c5a832bcebf030c9e7950cf4c1165dd74f7e3
5
5
  SHA512:
6
- metadata.gz: 9a547aa524567c257e28b7135eff8592b2a051b79b26156afb47f0417761bc414518b19040358c2b3aa194803ca841de41216c7ac4d155a1cc0315978f75fcbe
7
- data.tar.gz: 2ad09ff1f2cfbc06f517ef06f217d68508ed40407847651c4ece8986b030298a67b428cb1034c10bd03df33767fe386c70a8f25c523b9731ff735a4f14beced4
6
+ metadata.gz: d7f5decb3aec6b12d4a868071fc92cc4156d80253eaed923296b7d14aa302398cccbc155c27b94c76f2af394d2c5949cedca2f856a99d1fb6c06e58db4567022
7
+ data.tar.gz: 980e462293ea31247405e54a9614d9948570bfb4936bd2179160b19d2b156879cc0a2dba5153c0b3151afbc12e949a375e558b8efe0e38a4a5484fe166d6b4d6
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Zopfli
2
2
 
3
- see https://code.google.com/p/zopfli/
3
+ see https://github.com/google/zopfli
4
4
 
5
5
  ## Installation
6
6
 
@@ -30,6 +30,11 @@ compressed_data = Zopfli.deflate string
30
30
  uncompressed_data = Zlib::Inflate.inflate compressed_data
31
31
  uncompressed_data == string
32
32
  # => true
33
+
34
+ Zlib.deflate(File.read('LICENSE.txt'), Zlib::BEST_COMPRESSION).bytesize
35
+ # => 628
36
+ Zopfli.deflate(File.read('LICENSE.txt')).bytesize
37
+ # => 601
33
38
  ```
34
39
 
35
40
  ## Contributing
@@ -1,3 +1,3 @@
1
1
  module Zopfli
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
@@ -24,12 +24,9 @@ describe Zopfli do
24
24
  it "gzip format works" do
25
25
  fixture = fixtures("alice29.txt").read
26
26
 
27
- gzipped = Zopfli.deflate fixture, format: :gzip
27
+ deflated = Zopfli.deflate fixture, format: :gzip
28
28
 
29
- uncompressed = nil
30
- Zlib::GzipReader.wrap(StringIO.new gzipped) { |gz|
31
- uncompressed = gz.read
32
- }
29
+ uncompressed = Zlib::GzipReader.wrap(StringIO.new(deflated), &:read)
33
30
 
34
31
  uncompressed.must_equal fixture
35
32
  end
@@ -37,11 +34,12 @@ describe Zopfli do
37
34
  it "deflate format works" do
38
35
  fixture = fixtures("alice29.txt").read
39
36
 
40
- deflate = Zopfli.deflate fixture, format: :deflate
37
+ Zopfli.deflate fixture, format: :deflate
38
+
41
39
  skip "How to test"
42
40
  end
43
41
 
44
42
  def fixtures(name)
45
- File.open(File.join File.dirname(__FILE__), "fixtures", name)
43
+ File.open(File.join(File.dirname(__FILE__), "fixtures", name))
46
44
  end
47
45
  end
@@ -0,0 +1,24 @@
1
+ Want to contribute? Great! First, read this page (including the small print at the end).
2
+
3
+ ### Before you contribute
4
+ Before we can use your code, you must sign the
5
+ [Google Individual Contributor License Agreement](https://developers.google.com/open-source/cla/individual?csw=1)
6
+ (CLA), which you can do online. The CLA is necessary mainly because you own the
7
+ copyright to your changes, even after your contribution becomes part of our
8
+ codebase, so we need your permission to use and distribute your code. We also
9
+ need to be sure of various other things—for instance that you'll tell us if you
10
+ know that your code infringes on other people's patents. You don't have to sign
11
+ the CLA until after you've submitted your code for review and a member has
12
+ approved it, but you must do it before we can put your code into our codebase.
13
+ Before you start working on a larger contribution, you should get in touch with
14
+ us first through the issue tracker with your idea so that we can help out and
15
+ possibly guide you. Coordinating up front makes it much easier to avoid
16
+ frustration later on.
17
+
18
+ ### Code reviews
19
+ All submissions, including submissions by project members, require review. We
20
+ use Github pull requests for this purpose.
21
+
22
+ ### The small print
23
+ Contributions made by corporations are covered by a different agreement than
24
+ the one above, the Software Grant and Corporate Contributor License Agreement.
@@ -5,3 +5,4 @@ Daniel Reed
5
5
  Huzaifa Sidhpurwala
6
6
  Péter Szabó
7
7
  Lode Vandevenne
8
+ Derek Buitenhuis
@@ -32,6 +32,11 @@ zopflipng:
32
32
  $(CC) $(ZOPFLILIB_SRC) $(CFLAGS) -c
33
33
  $(CXX) $(ZOPFLILIB_OBJ) $(LODEPNG_SRC) $(ZOPFLIPNGLIB_SRC) $(ZOPFLIPNGBIN_SRC) $(CFLAGS) -o zopflipng
34
34
 
35
+ # ZopfliPNG shared library
36
+ libzopflipng:
37
+ $(CC) $(ZOPFLILIB_SRC) $(CFLAGS) -fPIC -c
38
+ $(CXX) $(ZOPFLILIB_OBJ) $(LODEPNG_SRC) $(ZOPFLIPNGLIB_SRC) $(CFLAGS) -fPIC --shared -Wl,-soname,libzopflipng.so.1 -o libzopflipng.so.1.0.0
39
+
35
40
  # Remove all libraries and binaries
36
41
  clean:
37
42
  rm -f zopflipng zopfli $(ZOPFLILIB_OBJ) libzopfli*
@@ -31,6 +31,10 @@ void ZopfliInitCache(size_t blocksize, ZopfliLongestMatchCache* lmc) {
31
31
  lmc->dist = (unsigned short*)malloc(sizeof(unsigned short) * blocksize);
32
32
  /* Rather large amount of memory. */
33
33
  lmc->sublen = (unsigned char*)malloc(ZOPFLI_CACHE_LENGTH * 3 * blocksize);
34
+ if(lmc->sublen == NULL) {
35
+ fprintf(stderr,"Error: Out of memory. Tried allocating %lu bytes of memory.\n",(unsigned long)(ZOPFLI_CACHE_LENGTH * 3 * blocksize));
36
+ exit (EXIT_FAILURE);
37
+ }
34
38
 
35
39
  /* length > 0 and dist 0 is invalid combination, which indicates on purpose
36
40
  that this cache value is not filled in yet. */
@@ -536,7 +536,7 @@ static void AddLZ77Block(const ZopfliOptions* options, int btype, int final,
536
536
  unsigned d_lengths[32];
537
537
  unsigned ll_symbols[288];
538
538
  unsigned d_symbols[32];
539
- size_t detect_block_size = *outsize;
539
+ size_t detect_block_size;
540
540
  size_t compressed_size;
541
541
  size_t uncompressed_size = 0;
542
542
  size_t i;
@@ -844,6 +844,7 @@ void ZopfliDeflatePart(const ZopfliOptions* options, int btype, int final,
844
844
  void ZopfliDeflate(const ZopfliOptions* options, int btype, int final,
845
845
  const unsigned char* in, size_t insize,
846
846
  unsigned char* bp, unsigned char** out, size_t* outsize) {
847
+ size_t offset = *outsize;
847
848
  #if ZOPFLI_MASTER_BLOCK_SIZE == 0
848
849
  ZopfliDeflatePart(options, btype, final, in, 0, insize, bp, out, outsize);
849
850
  #else
@@ -860,7 +861,7 @@ void ZopfliDeflate(const ZopfliOptions* options, int btype, int final,
860
861
  if (options->verbose) {
861
862
  fprintf(stderr,
862
863
  "Original Size: %d, Deflate: %d, Compression: %f%% Removed\n",
863
- (int)insize, (int)*outsize,
864
- 100.0 * (double)(insize - *outsize) / (double)insize);
864
+ (int)insize, (int)(*outsize - offset),
865
+ 100.0 * (double)(insize - (*outsize - offset)) / (double)insize);
865
866
  }
866
867
  }
@@ -27,16 +27,16 @@ The hash for ZopfliFindLongestMatch of lz77.c.
27
27
  #include "util.h"
28
28
 
29
29
  typedef struct ZopfliHash {
30
- int* head; /* Hash value to index of its most recent occurance. */
31
- unsigned short* prev; /* Index to index of prev. occurance of same hash. */
30
+ int* head; /* Hash value to index of its most recent occurrence. */
31
+ unsigned short* prev; /* Index to index of prev. occurrence of same hash. */
32
32
  int* hashval; /* Index to hash value at this index. */
33
33
  int val; /* Current hash value. */
34
34
 
35
35
  #ifdef ZOPFLI_HASH_SAME_HASH
36
36
  /* Fields with similar purpose as the above hash, but for the second hash with
37
37
  a value that is calculated differently. */
38
- int* head2; /* Hash value to index of its most recent occurance. */
39
- unsigned short* prev2; /* Index to index of prev. occurance of same hash. */
38
+ int* head2; /* Hash value to index of its most recent occurrence. */
39
+ unsigned short* prev2; /* Index to index of prev. occurrence of same hash. */
40
40
  int* hashval2; /* Index to hash value at this index. */
41
41
  int val2; /* Current hash value. */
42
42
  #endif
@@ -30,7 +30,7 @@ The output is tailored for DEFLATE: symbols that never occur, get a bit length
30
30
  of 0, and if only a single symbol occurs at least once, its bitlength will be 1,
31
31
  and not 0 as would theoretically be needed for a single symbol.
32
32
 
33
- frequencies: The amount of occurances of each symbol.
33
+ frequencies: The amount of occurrences of each symbol.
34
34
  n: The amount of symbols.
35
35
  maxbits: Maximum bit length, inclusive.
36
36
  bitlengths: Output, the bitlengths for the symbol prefix codes.
@@ -33,6 +33,11 @@ decompressor.
33
33
  #include "gzip_container.h"
34
34
  #include "zlib_container.h"
35
35
 
36
+ /* Windows workaround for stdout output. */
37
+ #if _WIN32
38
+ #include <fcntl.h>
39
+ #endif
40
+
36
41
  /*
37
42
  Loads a file into a memory array.
38
43
  */
@@ -47,6 +52,10 @@ static void LoadFile(const char* filename,
47
52
 
48
53
  fseek(file , 0 , SEEK_END);
49
54
  *outsize = ftell(file);
55
+ if(*outsize > 2147483647) {
56
+ fprintf(stderr,"Files larger than 2GB are not supported.\n");
57
+ exit(EXIT_FAILURE);
58
+ }
50
59
  rewind(file);
51
60
 
52
61
  *out = (unsigned char*)malloc(*outsize);
@@ -71,6 +80,10 @@ Saves a file from a memory array, overwriting the file if it existed.
71
80
  static void SaveFile(const char* filename,
72
81
  const unsigned char* in, size_t insize) {
73
82
  FILE* file = fopen(filename, "wb" );
83
+ if (file == NULL) {
84
+ fprintf(stderr,"Error: Cannot write to output file, terminating.\n");
85
+ exit (EXIT_FAILURE);
86
+ }
74
87
  assert(file);
75
88
  fwrite((char*)in, 1, insize, file);
76
89
  fclose(file);
@@ -99,8 +112,11 @@ static void CompressFile(const ZopfliOptions* options,
99
112
  SaveFile(outfilename, out, outsize);
100
113
  } else {
101
114
  size_t i;
115
+ #if _WIN32
116
+ /* Windows workaround for stdout output. */
117
+ _setmode(_fileno(stdout), _O_BINARY);
118
+ #endif
102
119
  for (i = 0; i < outsize; i++) {
103
- /* Works only if terminal does not convert newlines. */
104
120
  printf("%c", out[i]);
105
121
  }
106
122
  }
@@ -150,7 +166,7 @@ int main(int argc, char* argv[]) {
150
166
  }
151
167
  else if (StringsEqual(arg, "-h")) {
152
168
  fprintf(stderr,
153
- "Usage: zopfli [OPTION]... FILE\n"
169
+ "Usage: zopfli [OPTION]... FILE...\n"
154
170
  " -h gives this help\n"
155
171
  " -c write the result on standard output, instead of disk"
156
172
  " filename + '.gz'\n"
@@ -168,7 +184,7 @@ int main(int argc, char* argv[]) {
168
184
  }
169
185
 
170
186
  if (options.numiterations < 1) {
171
- fprintf(stderr, "Error: must have 1 or more iterations");
187
+ fprintf(stderr, "Error: must have 1 or more iterations\n");
172
188
  return 0;
173
189
  }
174
190
 
@@ -5165,16 +5165,8 @@ static void filterScanline(unsigned char* out, const unsigned char* scanline, co
5165
5165
  for(i = 0; i < length; i++) out[i] = scanline[i];
5166
5166
  break;
5167
5167
  case 1: /*Sub*/
5168
- if(prevline)
5169
- {
5170
- for(i = 0; i < bytewidth; i++) out[i] = scanline[i];
5171
- for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth];
5172
- }
5173
- else
5174
- {
5175
- for(i = 0; i < bytewidth; i++) out[i] = scanline[i];
5176
- for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth];
5177
- }
5168
+ for(i = 0; i < bytewidth; i++) out[i] = scanline[i];
5169
+ for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth];
5178
5170
  break;
5179
5171
  case 2: /*Up*/
5180
5172
  if(prevline)
@@ -151,7 +151,6 @@ int main(int argc, char *argv[]) {
151
151
  std::string prefix = "zopfli_"; // prefix for output filenames
152
152
 
153
153
  std::vector<std::string> files;
154
- std::vector<char> options;
155
154
  for (int i = 1; i < argc; i++) {
156
155
  std::string arg = argv[i];
157
156
  if (arg[0] == '-' && arg.size() > 1 && arg[1] != '-') {
@@ -182,6 +181,8 @@ int main(int argc, char *argv[]) {
182
181
  int num = atoi(value.c_str());
183
182
  if (name == "--always_zopflify") {
184
183
  always_zopflify = true;
184
+ } else if (name == "--verbose") {
185
+ png_options.verbose = true;
185
186
  } else if (name == "--lossy_transparent") {
186
187
  png_options.lossy_transparent = true;
187
188
  } else if (name == "--lossy_8bit") {
@@ -291,7 +292,7 @@ int main(int argc, char *argv[]) {
291
292
  error = ZopfliPNGOptimize(origpng, png_options, true, &resultpng);
292
293
 
293
294
  if (error) {
294
- printf("Decoding error %i: %s\n", error, lodepng_error_text(error));
295
+ printf("Decoding error %u: %s\n", error, lodepng_error_text(error));
295
296
  }
296
297
 
297
298
  // Verify result, check that the result causes no decoding errors
@@ -19,7 +19,10 @@
19
19
 
20
20
  #include "zopflipng_lib.h"
21
21
 
22
+ #include <errno.h>
22
23
  #include <stdio.h>
24
+ #include <stdlib.h>
25
+ #include <string.h>
23
26
  #include <set>
24
27
  #include <vector>
25
28
 
@@ -29,6 +32,7 @@
29
32
 
30
33
  ZopfliPNGOptions::ZopfliPNGOptions()
31
34
  : lossy_transparent(false)
35
+ , verbose(false)
32
36
  , lossy_8bit(false)
33
37
  , auto_filter_strategy(true)
34
38
  , use_zopfli(true)
@@ -48,6 +52,7 @@ unsigned CustomPNGDeflate(unsigned char** out, size_t* outsize,
48
52
  ZopfliOptions options;
49
53
  ZopfliInitOptions(&options);
50
54
 
55
+ options.verbose = png_options->verbose;
51
56
  options.numiterations = insize < 200000
52
57
  ? png_options->num_iterations : png_options->num_iterations_large;
53
58
 
@@ -81,7 +86,7 @@ unsigned CustomPNGDeflate(unsigned char** out, size_t* outsize,
81
86
 
82
87
  // Returns 32-bit integer value for RGBA color.
83
88
  static unsigned ColorIndex(const unsigned char* color) {
84
- return color[0] + 256u * color[1] + 65536u * color[1] + 16777216u * color[3];
89
+ return color[0] + 256u * color[1] + 65536u * color[2] + 16777216u * color[3];
85
90
  }
86
91
 
87
92
  // Counts amount of colors in the image, up to 257. If transparent_counts_as_one
@@ -128,6 +133,7 @@ void LossyOptimizeTransparent(lodepng::State* inputstate, unsigned char* image,
128
133
  r = image[i * 4 + 0];
129
134
  g = image[i * 4 + 1];
130
135
  b = image[i * 4 + 2];
136
+ break;
131
137
  }
132
138
  }
133
139
  }
@@ -366,7 +372,7 @@ int ZopfliPNGOptimize(const std::vector<unsigned char>& origpng,
366
372
 
367
373
  if (error) {
368
374
  if (verbose) {
369
- printf("Decoding error %i: %s\n", error, lodepng_error_text(error));
375
+ printf("Decoding error %u: %s\n", error, lodepng_error_text(error));
370
376
  }
371
377
  return error;
372
378
  }
@@ -423,3 +429,64 @@ int ZopfliPNGOptimize(const std::vector<unsigned char>& origpng,
423
429
 
424
430
  return error;
425
431
  }
432
+
433
+ extern "C" void CZopfliPNGSetDefaults(CZopfliPNGOptions* png_options) {
434
+
435
+ memset(png_options, 0, sizeof(*png_options));
436
+ // Constructor sets the defaults
437
+ ZopfliPNGOptions opts;
438
+
439
+ png_options->lossy_transparent = opts.lossy_transparent;
440
+ png_options->lossy_8bit = opts.lossy_8bit;
441
+ png_options->auto_filter_strategy = opts.auto_filter_strategy;
442
+ png_options->use_zopfli = opts.use_zopfli;
443
+ png_options->num_iterations = opts.num_iterations;
444
+ png_options->num_iterations_large = opts.num_iterations_large;
445
+ png_options->block_split_strategy = opts.block_split_strategy;
446
+ }
447
+
448
+ extern "C" int CZopfliPNGOptimize(const unsigned char* origpng,
449
+ const size_t origpng_size,
450
+ const CZopfliPNGOptions* png_options,
451
+ int verbose,
452
+ unsigned char** resultpng,
453
+ size_t* resultpng_size) {
454
+ ZopfliPNGOptions opts;
455
+
456
+ // Copy over to the C++-style struct
457
+ opts.lossy_transparent = !!png_options->lossy_transparent;
458
+ opts.lossy_8bit = !!png_options->lossy_8bit;
459
+ opts.auto_filter_strategy = !!png_options->auto_filter_strategy;
460
+ opts.use_zopfli = !!png_options->use_zopfli;
461
+ opts.num_iterations = png_options->num_iterations;
462
+ opts.num_iterations_large = png_options->num_iterations_large;
463
+ opts.block_split_strategy = png_options->block_split_strategy;
464
+
465
+ for (int i = 0; i < png_options->num_filter_strategies; i++) {
466
+ opts.filter_strategies.push_back(png_options->filter_strategies[i]);
467
+ }
468
+
469
+ for (int i = 0; i < png_options->num_keepchunks; i++) {
470
+ opts.keepchunks.push_back(png_options->keepchunks[i]);
471
+ }
472
+
473
+ const std::vector<unsigned char> origpng_cc(origpng, origpng + origpng_size);
474
+ std::vector<unsigned char> resultpng_cc;
475
+
476
+ int ret = ZopfliPNGOptimize(origpng_cc, opts, !!verbose, &resultpng_cc);
477
+ if (ret) {
478
+ return ret;
479
+ }
480
+
481
+ *resultpng_size = resultpng_cc.size();
482
+ *resultpng = (unsigned char*) malloc(resultpng_cc.size());
483
+ if (!(*resultpng)) {
484
+ return ENOMEM;
485
+ }
486
+
487
+ memcpy(*resultpng,
488
+ reinterpret_cast<unsigned char*>(&resultpng_cc[0]),
489
+ resultpng_cc.size());
490
+
491
+ return 0;
492
+ }
@@ -22,9 +22,17 @@
22
22
  #ifndef ZOPFLIPNG_LIB_H_
23
23
  #define ZOPFLIPNG_LIB_H_
24
24
 
25
+ #ifdef __cplusplus
26
+
25
27
  #include <string>
26
28
  #include <vector>
27
29
 
30
+ extern "C" {
31
+
32
+ #endif
33
+
34
+ #include <stdlib.h>
35
+
28
36
  enum ZopfliPNGFilterStrategy {
29
37
  kStrategyZero = 0,
30
38
  kStrategyOne = 1,
@@ -38,9 +46,54 @@ enum ZopfliPNGFilterStrategy {
38
46
  kNumFilterStrategies /* Not a strategy but used for the size of this enum */
39
47
  };
40
48
 
49
+ typedef struct CZopfliPNGOptions {
50
+ int lossy_transparent;
51
+ int lossy_8bit;
52
+
53
+ enum ZopfliPNGFilterStrategy* filter_strategies;
54
+ // How many strategies to try.
55
+ int num_filter_strategies;
56
+
57
+ int auto_filter_strategy;
58
+
59
+ char** keepchunks;
60
+ // How many entries in keepchunks.
61
+ int num_keepchunks;
62
+
63
+ int use_zopfli;
64
+
65
+ int num_iterations;
66
+
67
+ int num_iterations_large;
68
+
69
+ int block_split_strategy;
70
+ } CZopfliPNGOptions;
71
+
72
+ // Sets the default options
73
+ // Does not allocate or set keepchunks or filter_strategies
74
+ void CZopfliPNGSetDefaults(CZopfliPNGOptions *png_options);
75
+
76
+ // Returns 0 on success, error code otherwise
77
+ // The caller must free resultpng after use
78
+ int CZopfliPNGOptimize(const unsigned char* origpng,
79
+ const size_t origpng_size,
80
+ const CZopfliPNGOptions* png_options,
81
+ int verbose,
82
+ unsigned char** resultpng,
83
+ size_t* resultpng_size);
84
+
85
+ #ifdef __cplusplus
86
+ } // extern "C"
87
+ #endif
88
+
89
+ // C++ API
90
+ #ifdef __cplusplus
91
+
41
92
  struct ZopfliPNGOptions {
42
93
  ZopfliPNGOptions();
43
94
 
95
+ bool verbose;
96
+
44
97
  // Allow altering hidden colors of fully transparent pixels
45
98
  bool lossy_transparent;
46
99
  // Convert 16-bit per channel images to 8-bit per channel
@@ -76,4 +129,6 @@ int ZopfliPNGOptimize(const std::vector<unsigned char>& origpng,
76
129
  bool verbose,
77
130
  std::vector<unsigned char>* resultpng);
78
131
 
132
+ #endif // __cplusplus
133
+
79
134
  #endif // ZOPFLIPNG_LIB_H_
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zopfli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - miyucy
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-05 00:00:00.000000000 Z
11
+ date: 2016-06-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -71,6 +71,7 @@ files:
71
71
  - lib/zopfli/version.rb
72
72
  - test/fixtures/alice29.txt
73
73
  - test/test_zopfli_deflate.rb
74
+ - vendor/zopfli/CONTRIBUTING.md
74
75
  - vendor/zopfli/CONTRIBUTORS
75
76
  - vendor/zopfli/COPYING
76
77
  - vendor/zopfli/Makefile
@@ -129,7 +130,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
129
130
  version: '0'
130
131
  requirements: []
131
132
  rubyforge_project:
132
- rubygems_version: 2.2.2
133
+ rubygems_version: 2.6.4
133
134
  signing_key:
134
135
  specification_version: 4
135
136
  summary: zopfli