3 * Copyright 2010 The Android Open Source Project
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
15 bool SkFlate::HaveFlate() { return false; }
16 bool SkFlate::Deflate(SkStream*, SkWStream*) { return false; }
17 bool SkFlate::Deflate(const void*, size_t, SkWStream*) { return false; }
18 bool SkFlate::Deflate(const SkData*, SkWStream*) { return false; }
19 bool SkFlate::Inflate(SkStream*, SkWStream*) { return false; }
23 bool SkFlate::HaveFlate() {
32 #include SK_ZLIB_INCLUDE
36 const size_t kBufferSize = 1024;
38 bool doFlate(bool compress, SkStream* src, SkWStream* dst) {
39 uint8_t inputBuffer[kBufferSize];
40 uint8_t outputBuffer[kBufferSize];
42 flateData.zalloc = NULL;
43 flateData.zfree = NULL;
44 flateData.next_in = NULL;
45 flateData.avail_in = 0;
46 flateData.next_out = outputBuffer;
47 flateData.avail_out = kBufferSize;
50 rc = deflateInit(&flateData, Z_DEFAULT_COMPRESSION);
52 rc = inflateInit(&flateData);
56 uint8_t* input = (uint8_t*)src->getMemoryBase();
57 size_t inputLength = src->getLength();
58 if (input == NULL || inputLength == 0) {
60 flateData.next_in = inputBuffer;
61 flateData.avail_in = 0;
63 flateData.next_in = input;
64 flateData.avail_in = inputLength;
69 if (flateData.avail_out < kBufferSize) {
70 if (!dst->write(outputBuffer, kBufferSize - flateData.avail_out)) {
74 flateData.next_out = outputBuffer;
75 flateData.avail_out = kBufferSize;
79 if (flateData.avail_in == 0) {
82 size_t read = src->read(&inputBuffer, kBufferSize);
85 flateData.next_in = inputBuffer;
86 flateData.avail_in = read;
89 rc = deflate(&flateData, Z_NO_FLUSH);
91 rc = inflate(&flateData, Z_NO_FLUSH);
95 rc = deflate(&flateData, Z_FINISH);
97 rc = inflate(&flateData, Z_FINISH);
98 if (flateData.avail_out < kBufferSize) {
99 if (!dst->write(outputBuffer, kBufferSize - flateData.avail_out))
101 flateData.next_out = outputBuffer;
102 flateData.avail_out = kBufferSize;
107 deflateEnd(&flateData);
109 inflateEnd(&flateData);
110 if (rc == Z_STREAM_END)
118 bool SkFlate::Deflate(SkStream* src, SkWStream* dst) {
119 return doFlate(true, src, dst);
122 bool SkFlate::Deflate(const void* ptr, size_t len, SkWStream* dst) {
123 SkMemoryStream stream(ptr, len);
124 return doFlate(true, &stream, dst);
127 bool SkFlate::Deflate(const SkData* data, SkWStream* dst) {
129 SkMemoryStream stream(data->data(), data->size());
130 return doFlate(true, &stream, dst);
136 bool SkFlate::Inflate(SkStream* src, SkWStream* dst) {
137 return doFlate(false, src, dst);