1 // Copyright 2013 Google Inc. All Rights Reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //    http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 //
15 // Author: lode.vandevenne@gmail.com (Lode Vandevenne)
16 // Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
17 
18 // Library to recompress and optimize PNG images. Uses Zopfli as the compression
19 // backend, chooses optimal PNG color model, and tries out several PNG filter
20 // strategies.
21 
22 #ifndef ZOPFLIPNG_LIB_H_
23 #define ZOPFLIPNG_LIB_H_
24 
25 #include <string>
26 #include <vector>
27 
28 enum ZopfliPNGFilterStrategy {
29   kStrategyZero = 0,
30   kStrategyOne = 1,
31   kStrategyTwo = 2,
32   kStrategyThree = 3,
33   kStrategyFour = 4,
34   kStrategyMinSum,
35   kStrategyEntropy,
36   kStrategyPredefined,
37   kStrategyBruteForce,
38   kNumFilterStrategies /* Not a strategy but used for the size of this enum */
39 };
40 
41 struct ZopfliPNGOptions {
42   ZopfliPNGOptions();
43 
44   // Allow altering hidden colors of fully transparent pixels
45   bool lossy_transparent;
46   // Convert 16-bit per channel images to 8-bit per channel
47   bool lossy_8bit;
48 
49   // Filter strategies to try
50   std::vector<ZopfliPNGFilterStrategy> filter_strategies;
51 
52   // Automatically choose filter strategy using less good compression
53   bool auto_filter_strategy;
54 
55   // PNG chunks to keep
56   // chunks to literally copy over from the original PNG to the resulting one
57   std::vector<std::string> keepchunks;
58 
59   // Use Zopfli deflate compression
60   bool use_zopfli;
61 
62   // Zopfli number of iterations
63   int num_iterations;
64 
65   // Zopfli number of iterations on large images
66   int num_iterations_large;
67 
68   // 0=none, 1=first, 2=last, 3=both
69   int block_split_strategy;
70 };
71 
72 // Returns 0 on success, error code otherwise.
73 // If verbose is true, it will print some info while working.
74 int ZopfliPNGOptimize(const std::vector<unsigned char>& origpng,
75     const ZopfliPNGOptions& png_options,
76     bool verbose,
77     std::vector<unsigned char>* resultpng);
78 
79 #endif  // ZOPFLIPNG_LIB_H_
80