diff options
author | halcanary <halcanary@google.com> | 2015-08-18 13:30:25 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-08-18 13:30:25 -0700 |
commit | 48305e835351291ef72a7084c6c1af7b185d89c0 (patch) | |
tree | 56cf2a20e842163148bb212f9ab606deede363d4 /tests/PDFDeflateWStreamTest.cpp | |
parent | a44919ea27acd9808a7581362018484355c0f026 (diff) |
SkPDF/Deflate: clean up old SkFlate code
Factor out some of https://crrev.com/1227913008
BUG=skia:3030
Review URL: https://codereview.chromium.org/1298243002
Diffstat (limited to 'tests/PDFDeflateWStreamTest.cpp')
-rw-r--r-- | tests/PDFDeflateWStreamTest.cpp | 100 |
1 files changed, 93 insertions, 7 deletions
diff --git a/tests/PDFDeflateWStreamTest.cpp b/tests/PDFDeflateWStreamTest.cpp index bc0defc5fe..a85212c2c3 100644 --- a/tests/PDFDeflateWStreamTest.cpp +++ b/tests/PDFDeflateWStreamTest.cpp @@ -9,6 +9,98 @@ #include "SkRandom.h" #include "Test.h" +namespace { + +#ifdef ZLIB_INCLUDE + #include ZLIB_INCLUDE +#else + #include "zlib.h" +#endif + +// 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)); +} + +void skia_free_func(void*, void* address) { sk_free(address); } + +/** + * Use the un-deflate compression algorithm to decompress the data in src, + * returning the result. Returns NULL if an error occurs. + */ +SkStreamAsset* stream_inflate(SkStream* src) { + SkDynamicMemoryWStream decompressedDynamicMemoryWStream; + SkWStream* dst = &decompressedDynamicMemoryWStream; + + static const size_t kBufferSize = 1024; + 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; + rc = inflateInit(&flateData); + if (rc != Z_OK) + return nullptr; + + 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); + } + rc = inflate(&flateData, Z_NO_FLUSH); + } + while (rc == Z_OK) { + rc = inflate(&flateData, Z_FINISH); + if (flateData.avail_out < kBufferSize) { + if (!dst->write(outputBuffer, kBufferSize - flateData.avail_out)) + return nullptr; + flateData.next_out = outputBuffer; + flateData.avail_out = kBufferSize; + } + } + + inflateEnd(&flateData); + if (rc != Z_STREAM_END) { + return nullptr; + } + return decompressedDynamicMemoryWStream.detachAsStream(); +} +} // namespace + DEF_TEST(SkDeflateWStream, r) { SkRandom random(123456); for (int i = 0; i < 50; ++i) { @@ -34,13 +126,7 @@ DEF_TEST(SkDeflateWStream, r) { } SkAutoTDelete<SkStreamAsset> compressed( dynamicMemoryWStream.detachAsStream()); - - SkDynamicMemoryWStream decompressedDynamicMemoryWStream; - SkAssertResult(SkFlate::Inflate(compressed, - &decompressedDynamicMemoryWStream)); - - SkAutoTDelete<SkStreamAsset> decompressed( - decompressedDynamicMemoryWStream.detachAsStream()); + SkAutoTDelete<SkStreamAsset> decompressed(stream_inflate(compressed)); if (decompressed->getLength() != size) { ERRORF(r, "Decompression failed to get right size [%d]." |