| 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 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 | 68 |
| 69 return false; | 69 return false; |
| 70 } | 70 } |
| 71 | 71 |
| 72 static void emit_object(SkPDFObject* object, | 72 static void emit_object(SkPDFObject* object, |
| 73 SkWStream* stream, | 73 SkWStream* stream, |
| 74 SkPDFCatalog* catalog, | 74 SkPDFCatalog* catalog, |
| 75 bool indirect) { | 75 bool indirect) { |
| 76 SkPDFObject* realObject = catalog->getSubstituteObject(object); | 76 SkPDFObject* realObject = catalog->getSubstituteObject(object); |
| 77 if (indirect) { | 77 if (indirect) { |
| 78 catalog->emitObjectNumber(stream, realObject); | 78 stream->writeDecAsText(catalog->getObjectNumber(object)); |
| 79 stream->writeText(" obj\n"); | 79 stream->writeText(" 0 obj\n"); // Generation number is always 0. |
| 80 realObject->emitObject(stream, catalog); | 80 realObject->emitObject(stream, catalog); |
| 81 stream->writeText("\nendobj\n"); | 81 stream->writeText("\nendobj\n"); |
| 82 } else { | 82 } else { |
| 83 realObject->emitObject(stream, catalog); | 83 realObject->emitObject(stream, catalog); |
| 84 } | 84 } |
| 85 } | 85 } |
| 86 | 86 |
| 87 static size_t get_output_size(SkPDFObject* object, | 87 static size_t get_output_size(SkPDFObject* object, |
| 88 SkPDFCatalog* catalog, | 88 SkPDFCatalog* catalog, |
| 89 bool indirect) { | 89 bool indirect) { |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 SkAutoTUnref<SkPDFInt> int1(new SkPDFInt(1)); | 194 SkAutoTUnref<SkPDFInt> int1(new SkPDFInt(1)); |
| 195 SkAutoTUnref<SkPDFInt> int2(new SkPDFInt(2)); | 195 SkAutoTUnref<SkPDFInt> int2(new SkPDFInt(2)); |
| 196 SkAutoTUnref<SkPDFInt> int3(new SkPDFInt(3)); | 196 SkAutoTUnref<SkPDFInt> int3(new SkPDFInt(3)); |
| 197 int1.get()->ref(); | 197 int1.get()->ref(); |
| 198 SkAutoTUnref<SkPDFInt> int1Again(int1.get()); | 198 SkAutoTUnref<SkPDFInt> int1Again(int1.get()); |
| 199 | 199 |
| 200 catalog.addObject(int1.get(), false); | 200 catalog.addObject(int1.get(), false); |
| 201 catalog.addObject(int2.get(), false); | 201 catalog.addObject(int2.get(), false); |
| 202 catalog.addObject(int3.get(), false); | 202 catalog.addObject(int3.get(), false); |
| 203 | 203 |
| 204 REPORTER_ASSERT(reporter, catalog.getObjectNumberSize(int1.get()) == 3); | 204 REPORTER_ASSERT(reporter, catalog.getObjectNumber(int1.get()) == 1); |
| 205 REPORTER_ASSERT(reporter, catalog.getObjectNumberSize(int2.get()) == 3); | 205 REPORTER_ASSERT(reporter, catalog.getObjectNumber(int2.get()) == 2); |
| 206 REPORTER_ASSERT(reporter, catalog.getObjectNumberSize(int3.get()) == 3); | 206 REPORTER_ASSERT(reporter, catalog.getObjectNumber(int3.get()) == 3); |
| 207 | 207 REPORTER_ASSERT(reporter, catalog.getObjectNumber(int1Again.get()) == 1); |
| 208 SkDynamicMemoryWStream buffer; | |
| 209 catalog.emitObjectNumber(&buffer, int1.get()); | |
| 210 catalog.emitObjectNumber(&buffer, int2.get()); | |
| 211 catalog.emitObjectNumber(&buffer, int3.get()); | |
| 212 catalog.emitObjectNumber(&buffer, int1Again.get()); | |
| 213 char expectedResult[] = "1 02 03 01 0"; | |
| 214 REPORTER_ASSERT(reporter, stream_equals(buffer, 0, expectedResult, | |
| 215 strlen(expectedResult))); | |
| 216 } | 208 } |
| 217 | 209 |
| 218 static void TestObjectRef(skiatest::Reporter* reporter) { | 210 static void TestObjectRef(skiatest::Reporter* reporter) { |
| 219 SkAutoTUnref<SkPDFInt> int1(new SkPDFInt(1)); | 211 SkAutoTUnref<SkPDFInt> int1(new SkPDFInt(1)); |
| 220 SkAutoTUnref<SkPDFInt> int2(new SkPDFInt(2)); | 212 SkAutoTUnref<SkPDFInt> int2(new SkPDFInt(2)); |
| 221 SkAutoTUnref<SkPDFObjRef> int2ref(new SkPDFObjRef(int2.get())); | 213 SkAutoTUnref<SkPDFObjRef> int2ref(new SkPDFObjRef(int2.get())); |
| 222 | 214 |
| 223 SkPDFCatalog catalog((SkPDFDocument::Flags)0); | 215 SkPDFCatalog catalog((SkPDFDocument::Flags)0); |
| 224 catalog.addObject(int1.get(), false); | 216 catalog.addObject(int1.get(), false); |
| 225 catalog.addObject(int2.get(), false); | 217 catalog.addObject(int2.get(), false); |
| 226 REPORTER_ASSERT(reporter, catalog.getObjectNumberSize(int1.get()) == 3); | 218 REPORTER_ASSERT(reporter, catalog.getObjectNumber(int1.get()) == 1); |
| 227 REPORTER_ASSERT(reporter, catalog.getObjectNumberSize(int2.get()) == 3); | 219 REPORTER_ASSERT(reporter, catalog.getObjectNumber(int2.get()) == 2); |
| 228 | 220 |
| 229 char expectedResult[] = "2 0 R"; | 221 char expectedResult[] = "2 0 R"; |
| 230 SkDynamicMemoryWStream buffer; | 222 SkDynamicMemoryWStream buffer; |
| 231 int2ref->emitObject(&buffer, &catalog); | 223 int2ref->emitObject(&buffer, &catalog); |
| 232 REPORTER_ASSERT(reporter, buffer.getOffset() == strlen(expectedResult)); | 224 REPORTER_ASSERT(reporter, buffer.getOffset() == strlen(expectedResult)); |
| 233 REPORTER_ASSERT(reporter, stream_equals(buffer, 0, expectedResult, | 225 REPORTER_ASSERT(reporter, stream_equals(buffer, 0, expectedResult, |
| 234 buffer.getOffset())); | 226 buffer.getOffset())); |
| 235 } | 227 } |
| 236 | 228 |
| 237 static void TestSubstitute(skiatest::Reporter* reporter) { | 229 static void TestSubstitute(skiatest::Reporter* reporter) { |
| 238 SkAutoTUnref<SkPDFTestDict> proxy(new SkPDFTestDict()); | 230 SkAutoTUnref<SkPDFTestDict> proxy(new SkPDFTestDict()); |
| 239 SkAutoTUnref<SkPDFTestDict> stub(new SkPDFTestDict()); | 231 SkAutoTUnref<SkPDFTestDict> stub(new SkPDFTestDict()); |
| 240 SkAutoTUnref<SkPDFInt> int33(new SkPDFInt(33)); | |
| 241 SkAutoTUnref<SkPDFDict> stubResource(new SkPDFDict()); | |
| 242 SkAutoTUnref<SkPDFInt> int44(new SkPDFInt(44)); | |
| 243 | 232 |
| 244 stub->insert("Value", int33.get()); | 233 proxy->insert("Value", new SkPDFInt(33))->unref(); |
| 245 stubResource->insert("InnerValue", int44.get()); | 234 stub->insert("Value", new SkPDFInt(44))->unref(); |
| 246 stub->addResource(stubResource.get()); | |
| 247 | 235 |
| 248 SkPDFCatalog catalog((SkPDFDocument::Flags)0); | 236 SkPDFCatalog catalog((SkPDFDocument::Flags)0); |
| 249 catalog.addObject(proxy.get(), false); | 237 catalog.addObject(proxy.get(), false); |
| 250 catalog.setSubstitute(proxy.get(), stub.get()); | 238 catalog.setSubstitute(proxy.get(), stub.get()); |
| 251 | 239 |
| 252 SkDynamicMemoryWStream buffer; | 240 REPORTER_ASSERT(reporter, stub.get() == catalog.getSubstituteObject(proxy)); |
| 253 emit_object(proxy, &buffer, &catalog, false); | 241 REPORTER_ASSERT(reporter, proxy.get() != catalog.getSubstituteObject(stub)); |
| 254 SkTSet<SkPDFObject*>* substituteResources = | |
| 255 catalog.getSubstituteList(false); | |
| 256 for (int i = 0; i < substituteResources->count(); ++i) { | |
| 257 emit_object((*substituteResources)[i], &buffer, &catalog, true); | |
| 258 } | |
| 259 | |
| 260 char objectResult[] = "2 0 obj\n<</Value 33\n>>\nendobj\n"; | |
| 261 catalog.setFileOffset(proxy.get(), 0); | |
| 262 | |
| 263 size_t outputSize = get_output_size( | |
| 264 catalog.getSubstituteObject(proxy.get()), &catalog, true); | |
| 265 REPORTER_ASSERT(reporter, outputSize == strlen(objectResult)); | |
| 266 | |
| 267 char expectedResult[] = | |
| 268 "<</Value 33\n>>1 0 obj\n<</InnerValue 44\n>>\nendobj\n"; | |
| 269 REPORTER_ASSERT(reporter, buffer.getOffset() == strlen(expectedResult)); | |
| 270 REPORTER_ASSERT(reporter, stream_equals(buffer, 0, expectedResult, | |
| 271 buffer.getOffset())); | |
| 272 } | 242 } |
| 273 | 243 |
| 274 // Create a bitmap that would be very eficiently compressed in a ZIP. | 244 // Create a bitmap that would be very eficiently compressed in a ZIP. |
| 275 static void setup_bitmap(SkBitmap* bitmap, int width, int height) { | 245 static void setup_bitmap(SkBitmap* bitmap, int width, int height) { |
| 276 bitmap->allocN32Pixels(width, height); | 246 bitmap->allocN32Pixels(width, height); |
| 277 bitmap->eraseColor(SK_ColorWHITE); | 247 bitmap->eraseColor(SK_ColorWHITE); |
| 278 } | 248 } |
| 279 | 249 |
| 280 static void TestImage(skiatest::Reporter* reporter, const SkBitmap& bitmap, | 250 static void TestImage(skiatest::Reporter* reporter, const SkBitmap& bitmap, |
| 281 const char* expected, bool useDCTEncoder) { | 251 const char* expected, bool useDCTEncoder) { |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 505 | 475 |
| 506 // Filter just created; should be unvisited. | 476 // Filter just created; should be unvisited. |
| 507 REPORTER_ASSERT(reporter, !filter->visited()); | 477 REPORTER_ASSERT(reporter, !filter->visited()); |
| 508 SkPaint paint; | 478 SkPaint paint; |
| 509 paint.setImageFilter(filter.get()); | 479 paint.setImageFilter(filter.get()); |
| 510 canvas.drawRect(SkRect::MakeWH(100, 100), paint); | 480 canvas.drawRect(SkRect::MakeWH(100, 100), paint); |
| 511 | 481 |
| 512 // Filter was used in rendering; should be visited. | 482 // Filter was used in rendering; should be visited. |
| 513 REPORTER_ASSERT(reporter, filter->visited()); | 483 REPORTER_ASSERT(reporter, filter->visited()); |
| 514 } | 484 } |
| OLD | NEW |