• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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:
read(void * buffer,size_t size)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 
TestFlate(skiatest::Reporter * reporter,SkMemoryStream * testStream,size_t dataSize)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 
TestFlateCompression(skiatest::Reporter * reporter)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