| 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 "Resources.h" | 8 #include "Resources.h" |
| 9 #include "SkBitmap.h" | 9 #include "SkBitmap.h" |
| 10 #include "SkCanvas.h" | 10 #include "SkCanvas.h" |
| (...skipping 13 matching lines...) Expand all Loading... |
| 24 #include "SkStream.h" | 24 #include "SkStream.h" |
| 25 #include "SkTypes.h" | 25 #include "SkTypes.h" |
| 26 #include "Test.h" | 26 #include "Test.h" |
| 27 #include "sk_tool_utils.h" | 27 #include "sk_tool_utils.h" |
| 28 | 28 |
| 29 #include <cstdlib> | 29 #include <cstdlib> |
| 30 #include <cmath> | 30 #include <cmath> |
| 31 | 31 |
| 32 #define DUMMY_TEXT "DCT compessed stream." | 32 #define DUMMY_TEXT "DCT compessed stream." |
| 33 | 33 |
| 34 namespace { | |
| 35 struct Catalog { | |
| 36 SkPDFSubstituteMap substitutes; | |
| 37 SkPDFObjNumMap numbers; | |
| 38 }; | |
| 39 } // namespace | |
| 40 | |
| 41 template <typename T> | 34 template <typename T> |
| 42 static SkString emit_to_string(T& obj, Catalog* catPtr = nullptr) { | 35 static SkString emit_to_string(T& obj, SkPDFObjNumMap* catPtr = nullptr) { |
| 43 Catalog catalog; | 36 SkPDFObjNumMap catalog; |
| 44 SkDynamicMemoryWStream buffer; | 37 SkDynamicMemoryWStream buffer; |
| 45 if (!catPtr) { | 38 if (!catPtr) { |
| 46 catPtr = &catalog; | 39 catPtr = &catalog; |
| 47 } | 40 } |
| 48 obj.emitObject(&buffer, catPtr->numbers, catPtr->substitutes); | 41 obj.emitObject(&buffer, *catPtr); |
| 49 SkString tmp(buffer.bytesWritten()); | 42 SkString tmp(buffer.bytesWritten()); |
| 50 buffer.copyTo(tmp.writable_str()); | 43 buffer.copyTo(tmp.writable_str()); |
| 51 return tmp; | 44 return tmp; |
| 52 } | 45 } |
| 53 | 46 |
| 54 static bool eq(const SkString& str, const char* strPtr, size_t len) { | 47 static bool eq(const SkString& str, const char* strPtr, size_t len) { |
| 55 return len == str.size() && 0 == memcmp(str.c_str(), strPtr, len); | 48 return len == str.size() && 0 == memcmp(str.c_str(), strPtr, len); |
| 56 } | 49 } |
| 57 | 50 |
| 58 static void assert_eql(skiatest::Reporter* reporter, | 51 static void assert_eql(skiatest::Reporter* reporter, |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 141 // Assert that repeated calls to get the object number return | 134 // Assert that repeated calls to get the object number return |
| 142 // consistent result. | 135 // consistent result. |
| 143 REPORTER_ASSERT(reporter, objNumMap.getObjectNumber(a1.get()) == 1); | 136 REPORTER_ASSERT(reporter, objNumMap.getObjectNumber(a1.get()) == 1); |
| 144 } | 137 } |
| 145 | 138 |
| 146 static void TestObjectRef(skiatest::Reporter* reporter) { | 139 static void TestObjectRef(skiatest::Reporter* reporter) { |
| 147 sk_sp<SkPDFArray> a1(new SkPDFArray); | 140 sk_sp<SkPDFArray> a1(new SkPDFArray); |
| 148 sk_sp<SkPDFArray> a2(new SkPDFArray); | 141 sk_sp<SkPDFArray> a2(new SkPDFArray); |
| 149 a2->appendObjRef(a1); | 142 a2->appendObjRef(a1); |
| 150 | 143 |
| 151 Catalog catalog; | 144 SkPDFObjNumMap catalog; |
| 152 catalog.numbers.addObject(a1.get()); | 145 catalog.addObject(a1.get()); |
| 153 REPORTER_ASSERT(reporter, catalog.numbers.getObjectNumber(a1.get()) == 1); | 146 REPORTER_ASSERT(reporter, catalog.getObjectNumber(a1.get()) == 1); |
| 154 | 147 |
| 155 SkString result = emit_to_string(*a2, &catalog); | 148 SkString result = emit_to_string(*a2, &catalog); |
| 156 // If appendObjRef misbehaves, then the result would | 149 // If appendObjRef misbehaves, then the result would |
| 157 // be [[]], not [1 0 R]. | 150 // be [[]], not [1 0 R]. |
| 158 assert_eq(reporter, result, "[1 0 R]"); | 151 assert_eq(reporter, result, "[1 0 R]"); |
| 159 } | 152 } |
| 160 | 153 |
| 161 static void TestSubstitute(skiatest::Reporter* reporter) { | |
| 162 sk_sp<SkPDFDict> proxy(new SkPDFDict()); | |
| 163 sk_sp<SkPDFDict> stub(new SkPDFDict()); | |
| 164 | |
| 165 proxy->insertInt("Value", 33); | |
| 166 stub->insertInt("Value", 44); | |
| 167 | |
| 168 SkPDFSubstituteMap substituteMap; | |
| 169 substituteMap.setSubstitute(proxy.get(), stub.get()); | |
| 170 SkPDFObjNumMap catalog; | |
| 171 catalog.addObject(proxy.get()); | |
| 172 | |
| 173 REPORTER_ASSERT(reporter, stub.get() == substituteMap.getSubstitute(proxy.ge
t())); | |
| 174 REPORTER_ASSERT(reporter, proxy.get() != substituteMap.getSubstitute(stub.ge
t())); | |
| 175 } | |
| 176 | |
| 177 // This test used to assert without the fix submitted for | 154 // This test used to assert without the fix submitted for |
| 178 // http://code.google.com/p/skia/issues/detail?id=1083. | 155 // http://code.google.com/p/skia/issues/detail?id=1083. |
| 179 // SKP files might have invalid glyph ids. This test ensures they are ignored, | 156 // SKP files might have invalid glyph ids. This test ensures they are ignored, |
| 180 // and there is no assert on input data in Debug mode. | 157 // and there is no assert on input data in Debug mode. |
| 181 static void test_issue1083() { | 158 static void test_issue1083() { |
| 182 SkDynamicMemoryWStream outStream; | 159 SkDynamicMemoryWStream outStream; |
| 183 sk_sp<SkDocument> doc(SkDocument::MakePDF(&outStream)); | 160 sk_sp<SkDocument> doc(SkDocument::MakePDF(&outStream)); |
| 184 SkCanvas* canvas = doc->beginPage(100.0f, 100.0f); | 161 SkCanvas* canvas = doc->beginPage(100.0f, 100.0f); |
| 185 SkPaint paint; | 162 SkPaint paint; |
| 186 paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); | 163 paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 276 "(Another String)]"); | 253 "(Another String)]"); |
| 277 | 254 |
| 278 sk_sp<SkPDFArray> innerArray(new SkPDFArray); | 255 sk_sp<SkPDFArray> innerArray(new SkPDFArray); |
| 279 innerArray->appendInt(-1); | 256 innerArray->appendInt(-1); |
| 280 array->appendObject(std::move(innerArray)); | 257 array->appendObject(std::move(innerArray)); |
| 281 assert_emit_eq(reporter, *array, | 258 assert_emit_eq(reporter, *array, |
| 282 "[42 .5 0 true /ThisName /AnotherName (This String) " | 259 "[42 .5 0 true /ThisName /AnotherName (This String) " |
| 283 "(Another String) [-1]]"); | 260 "(Another String) [-1]]"); |
| 284 | 261 |
| 285 sk_sp<SkPDFArray> referencedArray(new SkPDFArray); | 262 sk_sp<SkPDFArray> referencedArray(new SkPDFArray); |
| 286 Catalog catalog; | 263 SkPDFObjNumMap catalog; |
| 287 catalog.numbers.addObject(referencedArray.get()); | 264 catalog.addObject(referencedArray.get()); |
| 288 REPORTER_ASSERT(reporter, catalog.numbers.getObjectNumber( | 265 REPORTER_ASSERT(reporter, catalog.getObjectNumber( |
| 289 referencedArray.get()) == 1); | 266 referencedArray.get()) == 1); |
| 290 array->appendObjRef(std::move(referencedArray)); | 267 array->appendObjRef(std::move(referencedArray)); |
| 291 | 268 |
| 292 SkString result = emit_to_string(*array, &catalog); | 269 SkString result = emit_to_string(*array, &catalog); |
| 293 assert_eq(reporter, result, | 270 assert_eq(reporter, result, |
| 294 "[42 .5 0 true /ThisName /AnotherName (This String) " | 271 "[42 .5 0 true /ThisName /AnotherName (This String) " |
| 295 "(Another String) [-1] 1 0 R]"); | 272 "(Another String) [-1] 1 0 R]"); |
| 296 } | 273 } |
| 297 | 274 |
| 298 static void TestPDFDict(skiatest::Reporter* reporter) { | 275 static void TestPDFDict(skiatest::Reporter* reporter) { |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 340 "/n5 /AnotherName\n/n6 (A String)>>"); | 317 "/n5 /AnotherName\n/n6 (A String)>>"); |
| 341 | 318 |
| 342 dict->insertString("n7", SkString("Another String")); | 319 dict->insertString("n7", SkString("Another String")); |
| 343 assert_emit_eq(reporter, *dict, "<</n1 24\n/n2 99\n/n3 .5\n/n4 /AName\n" | 320 assert_emit_eq(reporter, *dict, "<</n1 24\n/n2 99\n/n3 .5\n/n4 /AName\n" |
| 344 "/n5 /AnotherName\n/n6 (A String)\n/n7 (Another String)>>"); | 321 "/n5 /AnotherName\n/n6 (A String)\n/n7 (Another String)>>"); |
| 345 | 322 |
| 346 dict.reset(new SkPDFDict("DType")); | 323 dict.reset(new SkPDFDict("DType")); |
| 347 assert_emit_eq(reporter, *dict, "<</Type /DType>>"); | 324 assert_emit_eq(reporter, *dict, "<</Type /DType>>"); |
| 348 | 325 |
| 349 sk_sp<SkPDFArray> referencedArray(new SkPDFArray); | 326 sk_sp<SkPDFArray> referencedArray(new SkPDFArray); |
| 350 Catalog catalog; | 327 SkPDFObjNumMap catalog; |
| 351 catalog.numbers.addObject(referencedArray.get()); | 328 catalog.addObject(referencedArray.get()); |
| 352 REPORTER_ASSERT(reporter, catalog.numbers.getObjectNumber( | 329 REPORTER_ASSERT(reporter, catalog.getObjectNumber( |
| 353 referencedArray.get()) == 1); | 330 referencedArray.get()) == 1); |
| 354 dict->insertObjRef("n1", std::move(referencedArray)); | 331 dict->insertObjRef("n1", std::move(referencedArray)); |
| 355 SkString result = emit_to_string(*dict, &catalog); | 332 SkString result = emit_to_string(*dict, &catalog); |
| 356 assert_eq(reporter, result, "<</Type /DType\n/n1 1 0 R>>"); | 333 assert_eq(reporter, result, "<</Type /DType\n/n1 1 0 R>>"); |
| 357 } | 334 } |
| 358 | 335 |
| 359 DEF_TEST(PDFPrimitives, reporter) { | 336 DEF_TEST(PDFPrimitives, reporter) { |
| 360 TestPDFUnion(reporter); | 337 TestPDFUnion(reporter); |
| 361 TestPDFArray(reporter); | 338 TestPDFArray(reporter); |
| 362 TestPDFDict(reporter); | 339 TestPDFDict(reporter); |
| 363 TestPDFStream(reporter); | 340 TestPDFStream(reporter); |
| 364 TestObjectNumberMap(reporter); | 341 TestObjectNumberMap(reporter); |
| 365 TestObjectRef(reporter); | 342 TestObjectRef(reporter); |
| 366 TestSubstitute(reporter); | |
| 367 test_issue1083(); | 343 test_issue1083(); |
| 368 } | 344 } |
| 369 | 345 |
| 370 namespace { | 346 namespace { |
| 371 | 347 |
| 372 class DummyImageFilter : public SkImageFilter { | 348 class DummyImageFilter : public SkImageFilter { |
| 373 public: | 349 public: |
| 374 static sk_sp<DummyImageFilter> Make(bool visited = false) { | 350 static sk_sp<DummyImageFilter> Make(bool visited = false) { |
| 375 return sk_sp<DummyImageFilter>(new DummyImageFilter(visited)); | 351 return sk_sp<DummyImageFilter>(new DummyImageFilter(visited)); |
| 376 } | 352 } |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 501 char buffer[5]; | 477 char buffer[5]; |
| 502 for (int i = 0; i < 256; ++i) { | 478 for (int i = 0; i < 256; ++i) { |
| 503 size_t len = SkPDFUtils::ColorToDecimal(i, buffer); | 479 size_t len = SkPDFUtils::ColorToDecimal(i, buffer); |
| 504 REPORTER_ASSERT(reporter, len == strlen(buffer)); | 480 REPORTER_ASSERT(reporter, len == strlen(buffer)); |
| 505 float f; | 481 float f; |
| 506 REPORTER_ASSERT(reporter, 1 == sscanf(buffer, "%f", &f)); | 482 REPORTER_ASSERT(reporter, 1 == sscanf(buffer, "%f", &f)); |
| 507 int roundTrip = (int)(0.5 + f * 255); | 483 int roundTrip = (int)(0.5 + f * 255); |
| 508 REPORTER_ASSERT(reporter, roundTrip == i); | 484 REPORTER_ASSERT(reporter, roundTrip == i); |
| 509 } | 485 } |
| 510 } | 486 } |
| OLD | NEW |