OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2010 The Android Open Source Project | 2 * Copyright 2010 The Android Open Source Project |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkBitmap.h" | 8 #include "SkBitmap.h" |
9 #include "SkCanvas.h" | 9 #include "SkCanvas.h" |
10 #include "SkData.h" | 10 #include "SkData.h" |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 | 62 |
63 for (size_t offset = 0 ; offset < data->size() - len; offset++) { | 63 for (size_t offset = 0 ; offset < data->size() - len; offset++) { |
64 if (memcmp(data->bytes() + offset, buffer, len) == 0) { | 64 if (memcmp(data->bytes() + offset, buffer, len) == 0) { |
65 return true; | 65 return true; |
66 } | 66 } |
67 } | 67 } |
68 | 68 |
69 return false; | 69 return false; |
70 } | 70 } |
71 | 71 |
| 72 static void emit_object(SkPDFObject* object, |
| 73 SkWStream* stream, |
| 74 SkPDFCatalog* catalog, |
| 75 bool indirect) { |
| 76 SkPDFObject* realObject = catalog->getSubstituteObject(object); |
| 77 if (indirect) { |
| 78 catalog->emitObjectNumber(stream, realObject); |
| 79 stream->writeText(" obj\n"); |
| 80 realObject->emitObject(stream, catalog); |
| 81 stream->writeText("\nendobj\n"); |
| 82 } else { |
| 83 realObject->emitObject(stream, catalog); |
| 84 } |
| 85 } |
| 86 |
| 87 static size_t get_output_size(SkPDFObject* object, |
| 88 SkPDFCatalog* catalog, |
| 89 bool indirect) { |
| 90 SkDynamicMemoryWStream buffer; |
| 91 emit_object(object, &buffer, catalog, indirect); |
| 92 return buffer.getOffset(); |
| 93 } |
| 94 |
72 static void CheckObjectOutput(skiatest::Reporter* reporter, SkPDFObject* obj, | 95 static void CheckObjectOutput(skiatest::Reporter* reporter, SkPDFObject* obj, |
73 const char* expectedData, size_t expectedSize, | 96 const char* expectedData, size_t expectedSize, |
74 bool indirect, bool compression) { | 97 bool indirect, bool compression) { |
75 SkPDFDocument::Flags docFlags = (SkPDFDocument::Flags) 0; | 98 SkPDFDocument::Flags docFlags = (SkPDFDocument::Flags) 0; |
76 if (!compression) { | 99 if (!compression) { |
77 docFlags = SkTBitOr(docFlags, SkPDFDocument::kFavorSpeedOverSize_Flags); | 100 docFlags = SkTBitOr(docFlags, SkPDFDocument::kFavorSpeedOverSize_Flags); |
78 } | 101 } |
79 SkPDFCatalog catalog(docFlags); | 102 SkPDFCatalog catalog(docFlags); |
80 size_t directSize = obj->getOutputSize(&catalog, false); | 103 size_t directSize = get_output_size(obj, &catalog, false); |
81 REPORTER_ASSERT(reporter, directSize == expectedSize); | 104 REPORTER_ASSERT(reporter, directSize == expectedSize); |
82 | 105 |
83 SkDynamicMemoryWStream buffer; | 106 SkDynamicMemoryWStream buffer; |
84 obj->emit(&buffer, &catalog, false); | 107 emit_object(obj, &buffer, &catalog, false); |
85 REPORTER_ASSERT(reporter, directSize == buffer.getOffset()); | 108 REPORTER_ASSERT(reporter, directSize == buffer.getOffset()); |
86 REPORTER_ASSERT(reporter, stream_equals(buffer, 0, expectedData, | 109 REPORTER_ASSERT(reporter, stream_equals(buffer, 0, expectedData, |
87 directSize)); | 110 directSize)); |
88 | 111 |
89 if (indirect) { | 112 if (indirect) { |
90 // Indirect output. | 113 // Indirect output. |
91 static char header[] = "1 0 obj\n"; | 114 static char header[] = "1 0 obj\n"; |
92 static size_t headerLen = strlen(header); | 115 static size_t headerLen = strlen(header); |
93 static char footer[] = "\nendobj\n"; | 116 static char footer[] = "\nendobj\n"; |
94 static size_t footerLen = strlen(footer); | 117 static size_t footerLen = strlen(footer); |
95 | 118 |
96 catalog.addObject(obj, false); | 119 catalog.addObject(obj, false); |
97 | 120 |
98 size_t indirectSize = obj->getOutputSize(&catalog, true); | 121 size_t indirectSize = get_output_size(obj, &catalog, true); |
99 REPORTER_ASSERT(reporter, | 122 REPORTER_ASSERT(reporter, |
100 indirectSize == directSize + headerLen + footerLen); | 123 indirectSize == directSize + headerLen + footerLen); |
101 | 124 |
102 buffer.reset(); | 125 buffer.reset(); |
103 obj->emit(&buffer, &catalog, true); | 126 emit_object(obj, &buffer, &catalog, true); |
104 REPORTER_ASSERT(reporter, indirectSize == buffer.getOffset()); | 127 REPORTER_ASSERT(reporter, indirectSize == buffer.getOffset()); |
105 REPORTER_ASSERT(reporter, stream_equals(buffer, 0, header, headerLen)); | 128 REPORTER_ASSERT(reporter, stream_equals(buffer, 0, header, headerLen)); |
106 REPORTER_ASSERT(reporter, stream_equals(buffer, headerLen, expectedData, | 129 REPORTER_ASSERT(reporter, stream_equals(buffer, headerLen, expectedData, |
107 directSize)); | 130 directSize)); |
108 REPORTER_ASSERT(reporter, stream_equals(buffer, headerLen + directSize, | 131 REPORTER_ASSERT(reporter, stream_equals(buffer, headerLen + directSize, |
109 footer, footerLen)); | 132 footer, footerLen)); |
110 } | 133 } |
111 } | 134 } |
112 | 135 |
113 static void SimpleCheckObjectOutput(skiatest::Reporter* reporter, | 136 static void SimpleCheckObjectOutput(skiatest::Reporter* reporter, |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
220 | 243 |
221 stub->insert("Value", int33.get()); | 244 stub->insert("Value", int33.get()); |
222 stubResource->insert("InnerValue", int44.get()); | 245 stubResource->insert("InnerValue", int44.get()); |
223 stub->addResource(stubResource.get()); | 246 stub->addResource(stubResource.get()); |
224 | 247 |
225 SkPDFCatalog catalog((SkPDFDocument::Flags)0); | 248 SkPDFCatalog catalog((SkPDFDocument::Flags)0); |
226 catalog.addObject(proxy.get(), false); | 249 catalog.addObject(proxy.get(), false); |
227 catalog.setSubstitute(proxy.get(), stub.get()); | 250 catalog.setSubstitute(proxy.get(), stub.get()); |
228 | 251 |
229 SkDynamicMemoryWStream buffer; | 252 SkDynamicMemoryWStream buffer; |
230 proxy->emit(&buffer, &catalog, false); | 253 emit_object(proxy, &buffer, &catalog, false); |
231 SkTSet<SkPDFObject*>* substituteResources = | 254 SkTSet<SkPDFObject*>* substituteResources = |
232 catalog.getSubstituteList(false); | 255 catalog.getSubstituteList(false); |
233 for (int i = 0; i < substituteResources->count(); ++i) { | 256 for (int i = 0; i < substituteResources->count(); ++i) { |
234 (*substituteResources)[i]->emit(&buffer, &catalog, true); | 257 emit_object((*substituteResources)[i], &buffer, &catalog, true); |
235 } | 258 } |
236 | 259 |
237 char objectResult[] = "2 0 obj\n<</Value 33\n>>\nendobj\n"; | 260 char objectResult[] = "2 0 obj\n<</Value 33\n>>\nendobj\n"; |
238 catalog.setFileOffset(proxy.get(), 0); | 261 catalog.setFileOffset(proxy.get(), 0); |
239 | 262 |
240 size_t outputSize = catalog.getSubstituteObject(proxy.get()) | 263 size_t outputSize = get_output_size( |
241 ->getOutputSize(&catalog, true); | 264 catalog.getSubstituteObject(proxy.get()), &catalog, true); |
242 REPORTER_ASSERT(reporter, outputSize == strlen(objectResult)); | 265 REPORTER_ASSERT(reporter, outputSize == strlen(objectResult)); |
243 | 266 |
244 char expectedResult[] = | 267 char expectedResult[] = |
245 "<</Value 33\n>>1 0 obj\n<</InnerValue 44\n>>\nendobj\n"; | 268 "<</Value 33\n>>1 0 obj\n<</InnerValue 44\n>>\nendobj\n"; |
246 REPORTER_ASSERT(reporter, buffer.getOffset() == strlen(expectedResult)); | 269 REPORTER_ASSERT(reporter, buffer.getOffset() == strlen(expectedResult)); |
247 REPORTER_ASSERT(reporter, stream_equals(buffer, 0, expectedResult, | 270 REPORTER_ASSERT(reporter, stream_equals(buffer, 0, expectedResult, |
248 buffer.getOffset())); | 271 buffer.getOffset())); |
249 } | 272 } |
250 | 273 |
251 // Create a bitmap that would be very eficiently compressed in a ZIP. | 274 // Create a bitmap that would be very eficiently compressed in a ZIP. |
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
482 | 505 |
483 // Filter just created; should be unvisited. | 506 // Filter just created; should be unvisited. |
484 REPORTER_ASSERT(reporter, !filter->visited()); | 507 REPORTER_ASSERT(reporter, !filter->visited()); |
485 SkPaint paint; | 508 SkPaint paint; |
486 paint.setImageFilter(filter.get()); | 509 paint.setImageFilter(filter.get()); |
487 canvas.drawRect(SkRect::MakeWH(100, 100), paint); | 510 canvas.drawRect(SkRect::MakeWH(100, 100), paint); |
488 | 511 |
489 // Filter was used in rendering; should be visited. | 512 // Filter was used in rendering; should be visited. |
490 REPORTER_ASSERT(reporter, filter->visited()); | 513 REPORTER_ASSERT(reporter, filter->visited()); |
491 } | 514 } |
OLD | NEW |