| Index: src/core/SkFlate.cpp
|
| diff --git a/src/core/SkFlate.cpp b/src/core/SkFlate.cpp
|
| index 1d764e8400ce1df13870edc8a3d66fff13b157a2..9c9f5fcbc609e3cd05e0e415ea22e45633889b8d 100644
|
| --- a/src/core/SkFlate.cpp
|
| +++ b/src/core/SkFlate.cpp
|
| @@ -5,221 +5,3 @@
|
| * Use of this source code is governed by a BSD-style license that can be
|
| * found in the LICENSE file.
|
| */
|
| -
|
| -
|
| -#include "SkData.h"
|
| -#include "SkFlate.h"
|
| -#include "SkStream.h"
|
| -
|
| -namespace {
|
| -
|
| -#ifdef ZLIB_INCLUDE
|
| - #include ZLIB_INCLUDE
|
| -#else
|
| - #include "zlib.h"
|
| -#endif
|
| -
|
| -// static
|
| -const size_t kBufferSize = 1024;
|
| -
|
| -// Different zlib implementations use different T.
|
| -// We've seen size_t and unsigned.
|
| -template <typename T> void* skia_alloc_func(void*, T items, T size) {
|
| - return sk_calloc_throw(SkToSizeT(items) * SkToSizeT(size));
|
| -}
|
| -
|
| -static void skia_free_func(void*, void* address) { sk_free(address); }
|
| -
|
| -bool doFlate(bool compress, SkStream* src, SkWStream* dst) {
|
| - uint8_t inputBuffer[kBufferSize];
|
| - uint8_t outputBuffer[kBufferSize];
|
| - z_stream flateData;
|
| - flateData.zalloc = &skia_alloc_func;
|
| - flateData.zfree = &skia_free_func;
|
| - flateData.opaque = NULL;
|
| - flateData.next_in = NULL;
|
| - flateData.avail_in = 0;
|
| - flateData.next_out = outputBuffer;
|
| - flateData.avail_out = kBufferSize;
|
| - int rc;
|
| - if (compress)
|
| - rc = deflateInit(&flateData, Z_DEFAULT_COMPRESSION);
|
| - else
|
| - rc = inflateInit(&flateData);
|
| - if (rc != Z_OK)
|
| - return false;
|
| -
|
| - uint8_t* input = (uint8_t*)src->getMemoryBase();
|
| - size_t inputLength = src->getLength();
|
| - if (input == NULL || inputLength == 0) {
|
| - input = NULL;
|
| - flateData.next_in = inputBuffer;
|
| - flateData.avail_in = 0;
|
| - } else {
|
| - flateData.next_in = input;
|
| - flateData.avail_in = SkToUInt(inputLength);
|
| - }
|
| -
|
| - rc = Z_OK;
|
| - while (true) {
|
| - if (flateData.avail_out < kBufferSize) {
|
| - if (!dst->write(outputBuffer, kBufferSize - flateData.avail_out)) {
|
| - rc = Z_BUF_ERROR;
|
| - break;
|
| - }
|
| - flateData.next_out = outputBuffer;
|
| - flateData.avail_out = kBufferSize;
|
| - }
|
| - if (rc != Z_OK)
|
| - break;
|
| - if (flateData.avail_in == 0) {
|
| - if (input != NULL)
|
| - break;
|
| - size_t read = src->read(&inputBuffer, kBufferSize);
|
| - if (read == 0)
|
| - break;
|
| - flateData.next_in = inputBuffer;
|
| - flateData.avail_in = SkToUInt(read);
|
| - }
|
| - if (compress)
|
| - rc = deflate(&flateData, Z_NO_FLUSH);
|
| - else
|
| - rc = inflate(&flateData, Z_NO_FLUSH);
|
| - }
|
| - while (rc == Z_OK) {
|
| - if (compress)
|
| - rc = deflate(&flateData, Z_FINISH);
|
| - else
|
| - rc = inflate(&flateData, Z_FINISH);
|
| - if (flateData.avail_out < kBufferSize) {
|
| - if (!dst->write(outputBuffer, kBufferSize - flateData.avail_out))
|
| - return false;
|
| - flateData.next_out = outputBuffer;
|
| - flateData.avail_out = kBufferSize;
|
| - }
|
| - }
|
| -
|
| - if (compress)
|
| - deflateEnd(&flateData);
|
| - else
|
| - inflateEnd(&flateData);
|
| - if (rc == Z_STREAM_END)
|
| - return true;
|
| - return false;
|
| -}
|
| -
|
| -}
|
| -
|
| -// static
|
| -bool SkFlate::Deflate(SkStream* src, SkWStream* dst) {
|
| - return doFlate(true, src, dst);
|
| -}
|
| -
|
| -bool SkFlate::Deflate(const void* ptr, size_t len, SkWStream* dst) {
|
| - SkMemoryStream stream(ptr, len);
|
| - return doFlate(true, &stream, dst);
|
| -}
|
| -
|
| -bool SkFlate::Deflate(const SkData* data, SkWStream* dst) {
|
| - if (data) {
|
| - SkMemoryStream stream(data->data(), data->size());
|
| - return doFlate(true, &stream, dst);
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -// static
|
| -bool SkFlate::Inflate(SkStream* src, SkWStream* dst) {
|
| - return doFlate(false, src, dst);
|
| -}
|
| -
|
| -
|
| -#define SKDEFLATEWSTREAM_INPUT_BUFFER_SIZE 4096
|
| -#define SKDEFLATEWSTREAM_OUTPUT_BUFFER_SIZE 4224 // 4096 + 128, usually big
|
| - // enough to always do a
|
| - // single loop.
|
| -
|
| -// called by both write() and finalize()
|
| -static void do_deflate(int flush,
|
| - z_stream* zStream,
|
| - SkWStream* out,
|
| - unsigned char* inBuffer,
|
| - size_t inBufferSize) {
|
| - zStream->next_in = inBuffer;
|
| - zStream->avail_in = SkToInt(inBufferSize);
|
| - unsigned char outBuffer[SKDEFLATEWSTREAM_OUTPUT_BUFFER_SIZE];
|
| - SkDEBUGCODE(int returnValue;)
|
| - do {
|
| - zStream->next_out = outBuffer;
|
| - zStream->avail_out = sizeof(outBuffer);
|
| - SkDEBUGCODE(returnValue =) deflate(zStream, flush);
|
| - SkASSERT(!zStream->msg);
|
| -
|
| - out->write(outBuffer, sizeof(outBuffer) - zStream->avail_out);
|
| - } while (zStream->avail_in || !zStream->avail_out);
|
| - SkASSERT(flush == Z_FINISH
|
| - ? returnValue == Z_STREAM_END
|
| - : returnValue == Z_OK);
|
| -}
|
| -
|
| -// Hide all zlib impl details.
|
| -struct SkDeflateWStream::Impl {
|
| - SkWStream* fOut;
|
| - unsigned char fInBuffer[SKDEFLATEWSTREAM_INPUT_BUFFER_SIZE];
|
| - size_t fInBufferIndex;
|
| - z_stream fZStream;
|
| -};
|
| -
|
| -SkDeflateWStream::SkDeflateWStream(SkWStream* out)
|
| - : fImpl(SkNEW(SkDeflateWStream::Impl)) {
|
| - fImpl->fOut = out;
|
| - fImpl->fInBufferIndex = 0;
|
| - if (!fImpl->fOut) {
|
| - return;
|
| - }
|
| - fImpl->fZStream.zalloc = &skia_alloc_func;
|
| - fImpl->fZStream.zfree = &skia_free_func;
|
| - fImpl->fZStream.opaque = NULL;
|
| - SkDEBUGCODE(int r =) deflateInit(&fImpl->fZStream, Z_DEFAULT_COMPRESSION);
|
| - SkASSERT(Z_OK == r);
|
| -}
|
| -
|
| -SkDeflateWStream::~SkDeflateWStream() { this->finalize(); }
|
| -
|
| -void SkDeflateWStream::finalize() {
|
| - if (!fImpl->fOut) {
|
| - return;
|
| - }
|
| - do_deflate(Z_FINISH, &fImpl->fZStream, fImpl->fOut, fImpl->fInBuffer,
|
| - fImpl->fInBufferIndex);
|
| - (void)deflateEnd(&fImpl->fZStream);
|
| - fImpl->fOut = NULL;
|
| -}
|
| -
|
| -bool SkDeflateWStream::write(const void* void_buffer, size_t len) {
|
| - if (!fImpl->fOut) {
|
| - return false;
|
| - }
|
| - const char* buffer = (const char*)void_buffer;
|
| - while (len > 0) {
|
| - size_t tocopy =
|
| - SkTMin(len, sizeof(fImpl->fInBuffer) - fImpl->fInBufferIndex);
|
| - memcpy(fImpl->fInBuffer + fImpl->fInBufferIndex, buffer, tocopy);
|
| - len -= tocopy;
|
| - buffer += tocopy;
|
| - fImpl->fInBufferIndex += tocopy;
|
| - SkASSERT(fImpl->fInBufferIndex <= sizeof(fImpl->fInBuffer));
|
| -
|
| - // if the buffer isn't filled, don't call into zlib yet.
|
| - if (sizeof(fImpl->fInBuffer) == fImpl->fInBufferIndex) {
|
| - do_deflate(Z_NO_FLUSH, &fImpl->fZStream, fImpl->fOut,
|
| - fImpl->fInBuffer, fImpl->fInBufferIndex);
|
| - fImpl->fInBufferIndex = 0;
|
| - }
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -size_t SkDeflateWStream::bytesWritten() const {
|
| - return fImpl->fZStream.total_in + fImpl->fInBufferIndex;
|
| -}
|
|
|