| 2027 | } |
| 2028 | |
| 2029 | static unsigned deflateFixed(LodePNGBitWriter* writer, Hash* hash, |
| 2030 | const unsigned char* data, |
| 2031 | size_t datapos, size_t dataend, |
| 2032 | const LodePNGCompressSettings* settings, unsigned final) { |
| 2033 | HuffmanTree tree_ll; /*tree for literal values and length codes*/ |
| 2034 | HuffmanTree tree_d; /*tree for distance codes*/ |
| 2035 | |
| 2036 | unsigned BFINAL = final; |
| 2037 | unsigned error = 0; |
| 2038 | size_t i; |
| 2039 | |
| 2040 | HuffmanTree_init(&tree_ll); |
| 2041 | HuffmanTree_init(&tree_d); |
| 2042 | |
| 2043 | error = generateFixedLitLenTree(&tree_ll); |
| 2044 | if(!error) error = generateFixedDistanceTree(&tree_d); |
| 2045 | |
| 2046 | if(!error) { |
| 2047 | writeBits(writer, BFINAL, 1); |
| 2048 | writeBits(writer, 1, 1); /*first bit of BTYPE*/ |
| 2049 | writeBits(writer, 0, 1); /*second bit of BTYPE*/ |
| 2050 | |
| 2051 | if(settings->use_lz77) /*LZ77 encoded*/ { |
| 2052 | uivector lz77_encoded; |
| 2053 | uivector_init(&lz77_encoded); |
| 2054 | error = encodeLZ77(&lz77_encoded, hash, data, datapos, dataend, settings->windowsize, |
| 2055 | settings->minmatch, settings->nicematch, settings->lazymatching); |
| 2056 | if(!error) writeLZ77data(writer, &lz77_encoded, &tree_ll, &tree_d); |
| 2057 | uivector_cleanup(&lz77_encoded); |
| 2058 | } else /*no LZ77, but still will be Huffman compressed*/ { |
| 2059 | for(i = datapos; i < dataend; ++i) { |
| 2060 | writeBitsReversed(writer, tree_ll.codes[data[i]], tree_ll.lengths[data[i]]); |
| 2061 | } |
| 2062 | } |
| 2063 | /*add END code*/ |
| 2064 | if(!error) writeBitsReversed(writer,tree_ll.codes[256], tree_ll.lengths[256]); |
| 2065 | } |
| 2066 | |
| 2067 | /*cleanup*/ |
| 2068 | HuffmanTree_cleanup(&tree_ll); |
| 2069 | HuffmanTree_cleanup(&tree_d); |
| 2070 | |
| 2071 | return error; |
| 2072 | } |
| 2073 | |
| 2074 | static unsigned lodepng_deflatev(ucvector* out, const unsigned char* in, size_t insize, |
| 2075 | const LodePNGCompressSettings* settings) { |
no test coverage detected