1337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne// Copyright 2013 Google Inc. All Rights Reserved. 2337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne// 3337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne// Licensed under the Apache License, Version 2.0 (the "License"); 4337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne// you may not use this file except in compliance with the License. 5337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne// You may obtain a copy of the License at 6337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne// 7337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne// http://www.apache.org/licenses/LICENSE-2.0 8337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne// 9337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne// Unless required by applicable law or agreed to in writing, software 10337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne// distributed under the License is distributed on an "AS IS" BASIS, 11337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne// See the License for the specific language governing permissions and 13337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne// limitations under the License. 14337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne// 15337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne// Author: lode.vandevenne@gmail.com (Lode Vandevenne) 16337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne// Author: jyrki.alakuijala@gmail.com (Jyrki Alakuijala) 17337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne 18337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne// Library to recompress and optimize PNG images. Uses Zopfli as the compression 19337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne// backend, chooses optimal PNG color model, and tries out several PNG filter 20337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne// strategies. 21337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne 2208b97947ac58e1c824ce401d9cc08721bedd1808Lode Vandevenne#ifndef ZOPFLIPNG_LIB_H_ 2308b97947ac58e1c824ce401d9cc08721bedd1808Lode Vandevenne#define ZOPFLIPNG_LIB_H_ 24337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne 25337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne#include <string> 26337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne#include <vector> 27337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne 28337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenneenum ZopfliPNGFilterStrategy { 29337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne kStrategyZero = 0, 30337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne kStrategyOne = 1, 31337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne kStrategyTwo = 2, 32337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne kStrategyThree = 3, 33337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne kStrategyFour = 4, 34337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne kStrategyMinSum, 35337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne kStrategyEntropy, 36337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne kStrategyPredefined, 37337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne kStrategyBruteForce, 38337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne kNumFilterStrategies /* Not a strategy but used for the size of this enum */ 39337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne}; 40337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne 41337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevennestruct ZopfliPNGOptions { 42337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne ZopfliPNGOptions(); 43337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne 44337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne // Allow altering hidden colors of fully transparent pixels 45337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne bool lossy_transparent; 46337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne // Convert 16-bit per channel images to 8-bit per channel 47337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne bool lossy_8bit; 48337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne 49337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne // Filter strategies to try 50337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne std::vector<ZopfliPNGFilterStrategy> filter_strategies; 51337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne 52337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne // Automatically choose filter strategy using less good compression 53337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne bool auto_filter_strategy; 54337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne 55337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne // PNG chunks to keep 56337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne // chunks to literally copy over from the original PNG to the resulting one 57337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne std::vector<std::string> keepchunks; 58337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne 59337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne // Use Zopfli deflate compression 60337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne bool use_zopfli; 61337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne 62337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne // Zopfli number of iterations 63337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne int num_iterations; 64337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne 65337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne // Zopfli number of iterations on large images 66337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne int num_iterations_large; 67337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne 68337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne // 0=none, 1=first, 2=last, 3=both 69337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne int block_split_strategy; 70337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne}; 71337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne 72337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne// Returns 0 on success, error code otherwise. 73337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne// If verbose is true, it will print some info while working. 74337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenneint ZopfliPNGOptimize(const std::vector<unsigned char>& origpng, 75337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne const ZopfliPNGOptions& png_options, 76337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne bool verbose, 77337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne std::vector<unsigned char>* resultpng); 78337d27f25ef15a6cf34fef2acd0613fddc411cb1Lode Vandevenne 7908b97947ac58e1c824ce401d9cc08721bedd1808Lode Vandevenne#endif // ZOPFLIPNG_LIB_H_ 80