aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests/PDFDeflateWStreamTest.cpp
diff options
context:
space:
mode:
authorGravatar halcanary <halcanary@google.com>2015-08-18 13:30:25 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-08-18 13:30:25 -0700
commit48305e835351291ef72a7084c6c1af7b185d89c0 (patch)
tree56cf2a20e842163148bb212f9ab606deede363d4 /tests/PDFDeflateWStreamTest.cpp
parenta44919ea27acd9808a7581362018484355c0f026 (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.cpp100
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]."