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