Home | History | Annotate | Download | only in zopflipng
      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 (at) gmail.com (Lode Vandevenne)
     16 // Author: jyrki.alakuijala (at) 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