static void TestPDFDict(skiatest::Reporter* reporter) { SkAutoTUnref<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"); SkAutoTUnref<SkPDFArray> innerArray(new SkPDFArray); innerArray->appendInt(-100); dict->insertObject(n3, innerArray.detach()); ASSERT_EMIT_EQ(reporter, *dict, "<</n1 42\n/n2 0.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 0.5>>"); dict->insertName("n4", "AName"); ASSERT_EMIT_EQ(reporter, *dict, "<</n1 24\n/n2 99\n/n3 0.5\n/n4 /AName>>"); dict->insertName("n5", SkString("AnotherName")); ASSERT_EMIT_EQ(reporter, *dict, "<</n1 24\n/n2 99\n/n3 0.5\n/n4 /AName\n" "/n5 /AnotherName>>"); dict->insertString("n6", "A String"); ASSERT_EMIT_EQ(reporter, *dict, "<</n1 24\n/n2 99\n/n3 0.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 0.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>>"); SkAutoTUnref<SkPDFArray> referencedArray(new SkPDFArray); Catalog catalog; catalog.numbers.addObject(referencedArray.get()); REPORTER_ASSERT(reporter, catalog.numbers.getObjectNumber( referencedArray.get()) == 1); dict->insertObjRef("n1", referencedArray.detach()); SkString result = emit_to_string(*dict, &catalog); ASSERT_EQ(reporter, result, "<</Type /DType\n/n1 1 0 R>>"); }
static void assert_emit_eq_number(skiatest::Reporter* reporter, float number) { SkPDFUnion pdfUnion = SkPDFUnion::Scalar(number); SkString result = emit_to_string(pdfUnion); float value = static_cast<float>(std::atof(result.c_str())); if (value != number) { ERRORF(reporter, "%.9g != %s", number, result.c_str()); } }
static void TestPDFArray(skiatest::Reporter* reporter) { SkAutoTUnref<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 0.5]"); array->appendInt(0); ASSERT_EMIT_EQ(reporter, *array, "[42 0.5 0]"); array->appendBool(true); ASSERT_EMIT_EQ(reporter, *array, "[42 0.5 0 true]"); array->appendName("ThisName"); ASSERT_EMIT_EQ(reporter, *array, "[42 0.5 0 true /ThisName]"); array->appendName(SkString("AnotherName")); ASSERT_EMIT_EQ(reporter, *array, "[42 0.5 0 true /ThisName /AnotherName]"); array->appendString("This String"); ASSERT_EMIT_EQ(reporter, *array, "[42 0.5 0 true /ThisName /AnotherName (This String)]"); array->appendString(SkString("Another String")); ASSERT_EMIT_EQ(reporter, *array, "[42 0.5 0 true /ThisName /AnotherName (This String) " "(Another String)]"); SkAutoTUnref<SkPDFArray> innerArray(new SkPDFArray); innerArray->appendInt(-1); array->appendObject(innerArray.detach()); ASSERT_EMIT_EQ(reporter, *array, "[42 0.5 0 true /ThisName /AnotherName (This String) " "(Another String) [-1]]"); SkAutoTUnref<SkPDFArray> referencedArray(new SkPDFArray); Catalog catalog; catalog.numbers.addObject(referencedArray.get()); REPORTER_ASSERT(reporter, catalog.numbers.getObjectNumber( referencedArray.get()) == 1); array->appendObjRef(referencedArray.detach()); SkString result = emit_to_string(*array, &catalog); ASSERT_EQ(reporter, result, "[42 0.5 0 true /ThisName /AnotherName (This String) " "(Another String) [-1] 1 0 R]"); }
static void TestObjectRef(skiatest::Reporter* reporter) { SkAutoTUnref<SkPDFArray> a1(new SkPDFArray); SkAutoTUnref<SkPDFArray> a2(new SkPDFArray); a2->appendObjRef(SkRef(a1.get())); Catalog catalog; catalog.numbers.addObject(a1.get()); REPORTER_ASSERT(reporter, catalog.numbers.getObjectNumber(a1.get()) == 1); SkString result = emit_to_string(*a2, &catalog); // If appendObjRef misbehaves, then the result would // be [[]], not [1 0 R]. ASSERT_EQ(reporter, result, "[1 0 R]"); }
static void TestPDFStream(skiatest::Reporter* reporter) { char streamBytes[] = "Test\nFoo\tBar"; SkAutoTDelete<SkMemoryStream> streamData(new SkMemoryStream( streamBytes, strlen(streamBytes), true)); SkAutoTUnref<SkPDFStream> stream(new SkPDFStream(streamData.get())); ASSERT_EMIT_EQ(reporter, *stream, "<</Length 12>> stream\nTest\nFoo\tBar\nendstream"); stream->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."; SkAutoDataUnref streamData2(SkData::NewWithCopy(streamBytes2, strlen(streamBytes2))); SkAutoTUnref<SkPDFStream> stream(new SkPDFStream(streamData2.get())); 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 assert_emit_eq(skiatest::Reporter* reporter, T& object, const char* string) { SkString result = emit_to_string(object); assert_eq(reporter, result, string); }