1b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne/*
2b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode VandevenneCopyright 2011 Google Inc. All Rights Reserved.
3b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne
4b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode VandevenneLicensed under the Apache License, Version 2.0 (the "License");
5b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenneyou may not use this file except in compliance with the License.
6b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode VandevenneYou may obtain a copy of the License at
7b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne
8b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    http://www.apache.org/licenses/LICENSE-2.0
9b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne
10b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode VandevenneUnless required by applicable law or agreed to in writing, software
11b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevennedistributed under the License is distributed on an "AS IS" BASIS,
12b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode VandevenneWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode VandevenneSee the License for the specific language governing permissions and
14b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevennelimitations under the License.
15b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne
16b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode VandevenneAuthor: lode.vandevenne@gmail.com (Lode Vandevenne)
17b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode VandevenneAuthor: jyrki.alakuijala@gmail.com (Jyrki Alakuijala)
18b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne*/
19b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne
20b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne/*
21b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode VandevenneFunctions for basic LZ77 compression and utilities for the "squeeze" LZ77
22b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevennecompression.
23b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne*/
24b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne
25b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne#ifndef ZOPFLI_LZ77_H_
26b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne#define ZOPFLI_LZ77_H_
27b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne
28b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne#include <stdlib.h>
29b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne
30b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne#include "cache.h"
31b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne#include "hash.h"
328c218eff39749e738c92bf34155099ad280c16f7Lode Vandevenne#include "zopfli.h"
33b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne
34b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne/*
35b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode VandevenneStores lit/length and dist pairs for LZ77.
36ae16c9e727664ec78d8ceb8916dbc9c9ec7c71c0Lode VandevenneParameter litlens: Contains the literal symbols or length values.
37ae16c9e727664ec78d8ceb8916dbc9c9ec7c71c0Lode VandevenneParameter dists: Contains the distances. A value is 0 to indicate that there is
38ae16c9e727664ec78d8ceb8916dbc9c9ec7c71c0Lode Vandevenneno dist and the corresponding litlens value is a literal instead of a length.
39ae16c9e727664ec78d8ceb8916dbc9c9ec7c71c0Lode VandevenneParameter size: The size of both the litlens and dists arrays.
40ae16c9e727664ec78d8ceb8916dbc9c9ec7c71c0Lode VandevenneThe memory can best be managed by using ZopfliInitLZ77Store to initialize it,
41ae16c9e727664ec78d8ceb8916dbc9c9ec7c71c0Lode VandevenneZopfliCleanLZ77Store to destroy it, and ZopfliStoreLitLenDist to append values.
42ae16c9e727664ec78d8ceb8916dbc9c9ec7c71c0Lode Vandevenne
43b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne*/
44981df0fe897c94382b9b963eb72bc36cbc2e729cLode Vandevennetypedef struct ZopfliLZ77Store {
45b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  unsigned short* litlens;  /* Lit or len. */
46b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  unsigned short* dists;  /* If 0: indicates literal in corresponding litlens,
47b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne      if > 0: length in corresponding litlens, this is the distance. */
48b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  size_t size;
49981df0fe897c94382b9b963eb72bc36cbc2e729cLode Vandevenne} ZopfliLZ77Store;
50b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne
51981df0fe897c94382b9b963eb72bc36cbc2e729cLode Vandevennevoid ZopfliInitLZ77Store(ZopfliLZ77Store* store);
52981df0fe897c94382b9b963eb72bc36cbc2e729cLode Vandevennevoid ZopfliCleanLZ77Store(ZopfliLZ77Store* store);
53981df0fe897c94382b9b963eb72bc36cbc2e729cLode Vandevennevoid ZopfliCopyLZ77Store(const ZopfliLZ77Store* source, ZopfliLZ77Store* dest);
54981df0fe897c94382b9b963eb72bc36cbc2e729cLode Vandevennevoid ZopfliStoreLitLenDist(unsigned short length, unsigned short dist,
55981df0fe897c94382b9b963eb72bc36cbc2e729cLode Vandevenne                           ZopfliLZ77Store* store);
56b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne
57b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne/*
58b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode VandevenneSome state information for compressing a block.
59b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode VandevenneThis is currently a bit under-used (with mainly only the longest match cache),
60b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevennebut is kept for easy future expansion.
61b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne*/
62981df0fe897c94382b9b963eb72bc36cbc2e729cLode Vandevennetypedef struct ZopfliBlockState {
63981df0fe897c94382b9b963eb72bc36cbc2e729cLode Vandevenne  const ZopfliOptions* options;
64b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne
65981df0fe897c94382b9b963eb72bc36cbc2e729cLode Vandevenne#ifdef ZOPFLI_LONGEST_MATCH_CACHE
66b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  /* Cache for length/distance pairs found so far. */
67981df0fe897c94382b9b963eb72bc36cbc2e729cLode Vandevenne  ZopfliLongestMatchCache* lmc;
68b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne#endif
69b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne
70b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  /* The start (inclusive) and end (not inclusive) of the current block. */
71b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  size_t blockstart;
72b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne  size_t blockend;
73981df0fe897c94382b9b963eb72bc36cbc2e729cLode Vandevenne} ZopfliBlockState;
74b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne
75b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne/*
76b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode VandevenneFinds the longest match (length and corresponding distance) for LZ77
77b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevennecompression.
78b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode VandevenneEven when not using "sublen", it can be more efficient to provide an array,
79b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevennebecause only then the caching is used.
80b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevennearray: the data
81b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevennepos: position in the data to find the match for
82b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevennesize: size of the data
83b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevennelimit: limit length to maximum this value (default should be 258). This allows
84b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    finding a shorter dist for that length (= less extra bits). Must be
85981df0fe897c94382b9b963eb72bc36cbc2e729cLode Vandevenne    in the range [ZOPFLI_MIN_MATCH, ZOPFLI_MAX_MATCH].
86b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevennesublen: output array of 259 elements, or null. Has, for each length, the
87b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    smallest distance required to reach this length. Only 256 of its 259 values
88b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    are used, the first 3 are ignored (the shortest length is 3. It is purely
89b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    for convenience that the array is made 3 longer).
90b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne*/
91981df0fe897c94382b9b963eb72bc36cbc2e729cLode Vandevennevoid ZopfliFindLongestMatch(
92981df0fe897c94382b9b963eb72bc36cbc2e729cLode Vandevenne    ZopfliBlockState *s, const ZopfliHash* h, const unsigned char* array,
93b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    size_t pos, size_t size, size_t limit,
94b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    unsigned short* sublen, unsigned short* distance, unsigned short* length);
95b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne
96b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne/*
97b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode VandevenneVerifies if length and dist are indeed valid, only used for assertion.
98b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne*/
99981df0fe897c94382b9b963eb72bc36cbc2e729cLode Vandevennevoid ZopfliVerifyLenDist(const unsigned char* data, size_t datasize, size_t pos,
100981df0fe897c94382b9b963eb72bc36cbc2e729cLode Vandevenne                         unsigned short dist, unsigned short length);
101b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne
102b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne/*
103b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode VandevenneCounts the number of literal, length and distance symbols in the given lz77
104b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevennearrays.
105b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevennelitlens: lz77 lit/lengths
106b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevennedists: ll77 distances
107b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevennestart: where to begin counting in litlens and dists
108b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenneend: where to stop counting in litlens and dists (not inclusive)
109b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevennell_count: count of each lit/len symbol, must have size 288 (see deflate
110b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne    standard)
111b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenned_count: count of each dist symbol, must have size 32 (see deflate standard)
112b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne*/
113981df0fe897c94382b9b963eb72bc36cbc2e729cLode Vandevennevoid ZopfliLZ77Counts(const unsigned short* litlens,
114981df0fe897c94382b9b963eb72bc36cbc2e729cLode Vandevenne                      const unsigned short* dists,
115981df0fe897c94382b9b963eb72bc36cbc2e729cLode Vandevenne                      size_t start, size_t end,
116981df0fe897c94382b9b963eb72bc36cbc2e729cLode Vandevenne                      size_t* ll_count, size_t* d_count);
117b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne
118b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne/*
119b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode VandevenneDoes LZ77 using an algorithm similar to gzip, with lazy matching, rather than
120b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevennewith the slow but better "squeeze" implementation.
121981df0fe897c94382b9b963eb72bc36cbc2e729cLode VandevenneThe result is placed in the ZopfliLZ77Store.
122b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode VandevenneIf instart is larger than 0, it uses values before instart as starting
123b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevennedictionary.
124b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne*/
125981df0fe897c94382b9b963eb72bc36cbc2e729cLode Vandevennevoid ZopfliLZ77Greedy(ZopfliBlockState* s, const unsigned char* in,
126981df0fe897c94382b9b963eb72bc36cbc2e729cLode Vandevenne                      size_t instart, size_t inend,
127981df0fe897c94382b9b963eb72bc36cbc2e729cLode Vandevenne                      ZopfliLZ77Store* store);
128b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne
129b50b7ef8f8150616d3e9a227ce2d722a8355b1dLode Vandevenne#endif  /* ZOPFLI_LZ77_H_ */
130