static void TestPDFArray(skiatest::Reporter* reporter) { sk_sp<SkPDFArray> array(new SkPDFArray); assert_emit_eq(reporter, *array, "[]"); array->appendInt(42); assert_emit_eq(reporter, *array, "[42]"); array->appendScalar(SK_ScalarHalf); assert_emit_eq(reporter, *array, "[42 .5]"); array->appendInt(0); assert_emit_eq(reporter, *array, "[42 .5 0]"); array->appendBool(true); assert_emit_eq(reporter, *array, "[42 .5 0 true]"); array->appendName("ThisName"); assert_emit_eq(reporter, *array, "[42 .5 0 true /ThisName]"); array->appendName(SkString("AnotherName")); assert_emit_eq(reporter, *array, "[42 .5 0 true /ThisName /AnotherName]"); array->appendString("This String"); assert_emit_eq(reporter, *array, "[42 .5 0 true /ThisName /AnotherName (This String)]"); array->appendString(SkString("Another String")); assert_emit_eq(reporter, *array, "[42 .5 0 true /ThisName /AnotherName (This String) " "(Another String)]"); sk_sp<SkPDFArray> innerArray(new SkPDFArray); innerArray->appendInt(-1); array->appendObject(std::move(innerArray)); assert_emit_eq(reporter, *array, "[42 .5 0 true /ThisName /AnotherName (This String) " "(Another String) [-1]]"); sk_sp<SkPDFArray> referencedArray(new SkPDFArray); Catalog catalog; catalog.numbers.addObject(referencedArray.get()); REPORTER_ASSERT(reporter, catalog.numbers.getObjectNumber( referencedArray.get()) == 1); array->appendObjRef(std::move(referencedArray)); SkString result = emit_to_string(*array, &catalog); assert_eq(reporter, result, "[42 .5 0 true /ThisName /AnotherName (This String) " "(Another String) [-1] 1 0 R]"); }
static void TestPDFUnion(skiatest::Reporter* reporter) { SkPDFUnion boolTrue = SkPDFUnion::Bool(true); assert_emit_eq(reporter, boolTrue, "true"); SkPDFUnion boolFalse = SkPDFUnion::Bool(false); assert_emit_eq(reporter, boolFalse, "false"); SkPDFUnion int42 = SkPDFUnion::Int(42); assert_emit_eq(reporter, int42, "42"); assert_emit_eq_number(reporter, SK_ScalarHalf); assert_emit_eq_number(reporter, 110999.75f); // bigScalar assert_emit_eq_number(reporter, 50000000.1f); // biggerScalar assert_emit_eq_number(reporter, 1.0f / 65536); // smallScalar SkPDFUnion stringSimple = SkPDFUnion::String("test ) string ( foo"); assert_emit_eq(reporter, stringSimple, "(test \\) string \\( foo)"); SkString stringComplexInput("\ttest ) string ( foo"); SkPDFUnion stringComplex = SkPDFUnion::String(stringComplexInput); assert_emit_eq(reporter, stringComplex, "(\\011test \\) string \\( foo)"); SkString binaryStringInput("\1\2\3\4\5\6\7\10\11\12\13\14\15\16\17\20"); SkPDFUnion binaryString = SkPDFUnion::String(binaryStringInput); assert_emit_eq(reporter, binaryString, "<0102030405060708090A0B0C0D0E0F10>"); SkString nameInput("Test name\twith#tab"); SkPDFUnion name = SkPDFUnion::Name(nameInput); assert_emit_eq(reporter, name, "/Test#20name#09with#23tab"); SkString nameInput2("A#/%()<>[]{}B"); SkPDFUnion name2 = SkPDFUnion::Name(nameInput2); assert_emit_eq(reporter, name2, "/A#23#2F#25#28#29#3C#3E#5B#5D#7B#7DB"); SkPDFUnion name3 = SkPDFUnion::Name("SimpleNameWithOnlyPrintableASCII"); assert_emit_eq(reporter, name3, "/SimpleNameWithOnlyPrintableASCII"); // Test that we correctly handle characters with the high-bit set. SkString highBitString("\xDE\xAD" "be\xEF"); SkPDFUnion highBitName = SkPDFUnion::Name(highBitString); assert_emit_eq(reporter, highBitName, "/#DE#ADbe#EF"); }
static void TestPDFStream(skiatest::Reporter* reporter) { char streamBytes[] = "Test\nFoo\tBar"; std::unique_ptr<SkStreamAsset> streamData(new SkMemoryStream( streamBytes, strlen(streamBytes), true)); auto stream = sk_make_sp<SkPDFStream>(std::move(streamData)); assert_emit_eq(reporter, *stream, "<</Length 12>> stream\nTest\nFoo\tBar\nendstream"); stream->dict()->insertInt("Attribute", 42); assert_emit_eq(reporter, *stream, "<</Length 12\n/Attribute 42>> stream\n" "Test\nFoo\tBar\nendstream"); { char streamBytes2[] = "This is a longer string, so that compression " "can do something with it. With shorter strings, " "the short circuit logic cuts in and we end up " "with an uncompressed string."; auto stream = sk_make_sp<SkPDFStream>( SkData::MakeWithCopy(streamBytes2, strlen(streamBytes2))); SkDynamicMemoryWStream compressedByteStream; SkDeflateWStream deflateWStream(&compressedByteStream); deflateWStream.write(streamBytes2, strlen(streamBytes2)); deflateWStream.finalize(); SkDynamicMemoryWStream expected; expected.writeText("<</Filter /FlateDecode\n/Length 116>> stream\n"); compressedByteStream.writeToStream(&expected); compressedByteStream.reset(); expected.writeText("\nendstream"); SkAutoDataUnref expectedResultData2(expected.copyToData()); SkString result = emit_to_string(*stream); assert_eql(reporter, result, (const char*)expectedResultData2->data(), expectedResultData2->size()); } }
static void TestPDFArray(skiatest::Reporter* reporter) { std::unique_ptr<SkPDFArray> array(new SkPDFArray); assert_emit_eq(reporter, *array, "[]"); array->appendInt(42); assert_emit_eq(reporter, *array, "[42]"); array->appendScalar(SK_ScalarHalf); assert_emit_eq(reporter, *array, "[42 .5]"); array->appendInt(0); assert_emit_eq(reporter, *array, "[42 .5 0]"); array->appendBool(true); assert_emit_eq(reporter, *array, "[42 .5 0 true]"); array->appendName("ThisName"); assert_emit_eq(reporter, *array, "[42 .5 0 true /ThisName]"); array->appendName(SkString("AnotherName")); assert_emit_eq(reporter, *array, "[42 .5 0 true /ThisName /AnotherName]"); array->appendString("This String"); assert_emit_eq(reporter, *array, "[42 .5 0 true /ThisName /AnotherName (This String)]"); array->appendString(SkString("Another String")); assert_emit_eq(reporter, *array, "[42 .5 0 true /ThisName /AnotherName (This String) " "(Another String)]"); std::unique_ptr<SkPDFArray> innerArray(new SkPDFArray); innerArray->appendInt(-1); array->appendObject(std::move(innerArray)); assert_emit_eq(reporter, *array, "[42 .5 0 true /ThisName /AnotherName (This String) " "(Another String) [-1]]"); }
static void TestPDFDict(skiatest::Reporter* reporter) { sk_sp<SkPDFDict> dict(new SkPDFDict); assert_emit_eq(reporter, *dict, "<<>>"); dict->insertInt("n1", SkToSizeT(42)); assert_emit_eq(reporter, *dict, "<</n1 42>>"); dict.reset(new SkPDFDict); assert_emit_eq(reporter, *dict, "<<>>"); dict->insertInt("n1", 42); assert_emit_eq(reporter, *dict, "<</n1 42>>"); dict->insertScalar("n2", SK_ScalarHalf); SkString n3("n3"); sk_sp<SkPDFArray> innerArray(new SkPDFArray); innerArray->appendInt(-100); dict->insertObject(n3, std::move(innerArray)); assert_emit_eq(reporter, *dict, "<</n1 42\n/n2 .5\n/n3 [-100]>>"); dict.reset(new SkPDFDict); assert_emit_eq(reporter, *dict, "<<>>"); dict->insertInt("n1", 24); assert_emit_eq(reporter, *dict, "<</n1 24>>"); dict->insertInt("n2", SkToSizeT(99)); assert_emit_eq(reporter, *dict, "<</n1 24\n/n2 99>>"); dict->insertScalar("n3", SK_ScalarHalf); assert_emit_eq(reporter, *dict, "<</n1 24\n/n2 99\n/n3 .5>>"); dict->insertName("n4", "AName"); assert_emit_eq(reporter, *dict, "<</n1 24\n/n2 99\n/n3 .5\n/n4 /AName>>"); dict->insertName("n5", SkString("AnotherName")); assert_emit_eq(reporter, *dict, "<</n1 24\n/n2 99\n/n3 .5\n/n4 /AName\n" "/n5 /AnotherName>>"); dict->insertString("n6", "A String"); assert_emit_eq(reporter, *dict, "<</n1 24\n/n2 99\n/n3 .5\n/n4 /AName\n" "/n5 /AnotherName\n/n6 (A String)>>"); dict->insertString("n7", SkString("Another String")); assert_emit_eq(reporter, *dict, "<</n1 24\n/n2 99\n/n3 .5\n/n4 /AName\n" "/n5 /AnotherName\n/n6 (A String)\n/n7 (Another String)>>"); dict.reset(new SkPDFDict("DType")); assert_emit_eq(reporter, *dict, "<</Type /DType>>"); sk_sp<SkPDFArray> referencedArray(new SkPDFArray); Catalog catalog; catalog.numbers.addObject(referencedArray.get()); REPORTER_ASSERT(reporter, catalog.numbers.getObjectNumber( referencedArray.get()) == 1); dict->insertObjRef("n1", std::move(referencedArray)); SkString result = emit_to_string(*dict, &catalog); assert_eq(reporter, result, "<</Type /DType\n/n1 1 0 R>>"); }
static void TestPDFDict(skiatest::Reporter* reporter) { std::unique_ptr<SkPDFDict> dict(new SkPDFDict); assert_emit_eq(reporter, *dict, "<<>>"); dict->insertInt("n1", SkToSizeT(42)); assert_emit_eq(reporter, *dict, "<</n1 42>>"); dict.reset(new SkPDFDict); assert_emit_eq(reporter, *dict, "<<>>"); dict->insertInt("n1", 42); assert_emit_eq(reporter, *dict, "<</n1 42>>"); dict->insertScalar("n2", SK_ScalarHalf); SkString n3("n3"); std::unique_ptr<SkPDFArray> innerArray(new SkPDFArray); innerArray->appendInt(-100); dict->insertObject(n3, std::move(innerArray)); assert_emit_eq(reporter, *dict, "<</n1 42\n/n2 .5\n/n3 [-100]>>"); dict.reset(new SkPDFDict); assert_emit_eq(reporter, *dict, "<<>>"); dict->insertInt("n1", 24); assert_emit_eq(reporter, *dict, "<</n1 24>>"); dict->insertInt("n2", SkToSizeT(99)); assert_emit_eq(reporter, *dict, "<</n1 24\n/n2 99>>"); dict->insertScalar("n3", SK_ScalarHalf); assert_emit_eq(reporter, *dict, "<</n1 24\n/n2 99\n/n3 .5>>"); dict->insertName("n4", "AName"); assert_emit_eq(reporter, *dict, "<</n1 24\n/n2 99\n/n3 .5\n/n4 /AName>>"); dict->insertName("n5", SkString("AnotherName")); assert_emit_eq(reporter, *dict, "<</n1 24\n/n2 99\n/n3 .5\n/n4 /AName\n" "/n5 /AnotherName>>"); dict->insertString("n6", "A String"); assert_emit_eq(reporter, *dict, "<</n1 24\n/n2 99\n/n3 .5\n/n4 /AName\n" "/n5 /AnotherName\n/n6 (A String)>>"); dict->insertString("n7", SkString("Another String")); assert_emit_eq(reporter, *dict, "<</n1 24\n/n2 99\n/n3 .5\n/n4 /AName\n" "/n5 /AnotherName\n/n6 (A String)\n/n7 (Another String)>>"); dict.reset(new SkPDFDict("DType")); assert_emit_eq(reporter, *dict, "<</Type /DType>>"); }