1 /* 2 * Copyright (C) 2011 Google Inc. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include <stdlib.h> 18 #include <string.h> 19 20 #include "Test.h" 21 #include "SkFlate.h" 22 #include "SkStream.h" 23 24 // A memory stream that reports zero size with the standard call, like 25 // an unseekable file stream would. 26 class SkZeroSizeMemStream : public SkMemoryStream { 27 public: 28 virtual size_t read(void* buffer, size_t size) { 29 if (buffer == NULL && size == 0) 30 return 0; 31 if (buffer == NULL && size == kGetSizeKey) 32 size = 0; 33 return SkMemoryStream::read(buffer, size); 34 } 35 36 static const size_t kGetSizeKey = 0xDEADBEEF; 37 }; 38 39 static void TestFlate(skiatest::Reporter* reporter, SkMemoryStream* testStream, 40 size_t dataSize) { 41 if (testStream == NULL) 42 return; 43 44 SkMemoryStream testData(dataSize); 45 uint8_t* data = (uint8_t*)testData.getMemoryBase(); 46 srand(0); // Make data deterministic. 47 for (size_t i = 0; i < dataSize; i++) 48 data[i] = rand() & 0xFF; 49 50 testStream->setMemory(testData.getMemoryBase(), dataSize, true); 51 SkDynamicMemoryWStream compressed; 52 bool status = SkFlate::Deflate(testStream, &compressed); 53 REPORTER_ASSERT(reporter, status); 54 55 // Check that the input data wasn't changed. 56 size_t inputSize = testStream->getLength(); 57 if (inputSize == 0) 58 inputSize = testStream->read(NULL, SkZeroSizeMemStream::kGetSizeKey); 59 REPORTER_ASSERT(reporter, testData.getLength() == inputSize); 60 REPORTER_ASSERT(reporter, memcmp(testData.getMemoryBase(), 61 testStream->getMemoryBase(), 62 testData.getLength()) == 0); 63 64 // Assume there are two test sizes, big and small. 65 if (dataSize < 1024) 66 REPORTER_ASSERT(reporter, compressed.getOffset() < 1024); 67 else 68 REPORTER_ASSERT(reporter, compressed.getOffset() > 1024); 69 70 testStream->setMemory(compressed.getStream(), compressed.getOffset(), true); 71 SkDynamicMemoryWStream uncompressed; 72 status = SkFlate::Inflate(testStream, &uncompressed); 73 REPORTER_ASSERT(reporter, status); 74 75 // Check that the input data wasn't changed. 76 inputSize = testStream->getLength(); 77 if (inputSize == 0) 78 inputSize = testStream->read(NULL, SkZeroSizeMemStream::kGetSizeKey); 79 REPORTER_ASSERT(reporter, compressed.getOffset() == inputSize); 80 REPORTER_ASSERT(reporter, memcmp(testStream->getMemoryBase(), 81 compressed.getStream(), 82 compressed.getOffset()) == 0); 83 84 // Check that the uncompressed data matches the source data. 85 REPORTER_ASSERT(reporter, testData.getLength() == uncompressed.getOffset()); 86 REPORTER_ASSERT(reporter, memcmp(testData.getMemoryBase(), 87 uncompressed.getStream(), 88 testData.getLength()) == 0); 89 } 90 91 static void TestFlateCompression(skiatest::Reporter* reporter) { 92 TestFlate(reporter, NULL, 0); 93 #if defined(SK_ZLIB_INCLUDE) && !defined(SK_DEBUG) 94 REPORTER_ASSERT(reporter, SkFlate::HaveFlate()); 95 96 SkMemoryStream memStream; 97 TestFlate(reporter, &memStream, 512); 98 TestFlate(reporter, &memStream, 10240); 99 100 SkZeroSizeMemStream fileStream; 101 TestFlate(reporter, &fileStream, 512); 102 TestFlate(reporter, &fileStream, 10240); 103 #endif 104 } 105 106 #include "TestClassDef.h" 107 DEFINE_TESTCLASS("Flate", FlateTestClass, TestFlateCompression) 108