aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests/PDFPrimitivesTest.cpp
diff options
context:
space:
mode:
authorGravatar halcanary <halcanary@google.com>2016-02-24 15:46:46 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2016-02-24 15:46:46 -0800
commit8e9f5e39d774198a5a5d9345bc9f863e855c593b (patch)
treeb13c2ed1a24d9791863f254515ecbfaf25927a4c /tests/PDFPrimitivesTest.cpp
parentfbe355208d6aff6bdf69a1bd41a93852edf692e7 (diff)
SkPDF: fix scalar serialization
Diffstat (limited to 'tests/PDFPrimitivesTest.cpp')
-rw-r--r--tests/PDFPrimitivesTest.cpp94
1 files changed, 70 insertions, 24 deletions
diff --git a/tests/PDFPrimitivesTest.cpp b/tests/PDFPrimitivesTest.cpp
index 9ca1bd619a..f618e6f68b 100644
--- a/tests/PDFPrimitivesTest.cpp
+++ b/tests/PDFPrimitivesTest.cpp
@@ -18,6 +18,7 @@
#include "SkPDFFont.h"
#include "SkPDFStream.h"
#include "SkPDFTypes.h"
+#include "SkPDFUtils.h"
#include "SkReadBuffer.h"
#include "SkScalar.h"
#include "SkStream.h"
@@ -199,20 +200,16 @@ static void TestPDFUnion(skiatest::Reporter* reporter) {
ASSERT_EMIT_EQ(reporter, int42, "42");
SkPDFUnion realHalf = SkPDFUnion::Scalar(SK_ScalarHalf);
- ASSERT_EMIT_EQ(reporter, realHalf, "0.5");
+ ASSERT_EMIT_EQ(reporter, realHalf, ".5");
SkPDFUnion bigScalar = SkPDFUnion::Scalar(110999.75f);
-#if !defined(SK_ALLOW_LARGE_PDF_SCALARS)
- ASSERT_EMIT_EQ(reporter, bigScalar, "111000");
-#else
ASSERT_EMIT_EQ(reporter, bigScalar, "110999.75");
- SkPDFUnion biggerScalar = SkPDFUnion::Scalar(50000000.1);
+ SkPDFUnion biggerScalar = SkPDFUnion::Scalar(50000000.1f);
ASSERT_EMIT_EQ(reporter, biggerScalar, "50000000");
- SkPDFUnion smallestScalar = SkPDFUnion::Scalar(1.0 / 65536);
- ASSERT_EMIT_EQ(reporter, smallestScalar, "0.00001526");
-#endif
+ SkPDFUnion smallestScalar = SkPDFUnion::Scalar(1.0f / 65536);
+ ASSERT_EMIT_EQ(reporter, smallestScalar, ".0000152587890");
SkPDFUnion stringSimple = SkPDFUnion::String("test ) string ( foo");
ASSERT_EMIT_EQ(reporter, stringSimple, "(test \\) string \\( foo)");
@@ -248,34 +245,34 @@ static void TestPDFArray(skiatest::Reporter* reporter) {
ASSERT_EMIT_EQ(reporter, *array, "[42]");
array->appendScalar(SK_ScalarHalf);
- ASSERT_EMIT_EQ(reporter, *array, "[42 0.5]");
+ ASSERT_EMIT_EQ(reporter, *array, "[42 .5]");
array->appendInt(0);
- ASSERT_EMIT_EQ(reporter, *array, "[42 0.5 0]");
+ ASSERT_EMIT_EQ(reporter, *array, "[42 .5 0]");
array->appendBool(true);
- ASSERT_EMIT_EQ(reporter, *array, "[42 0.5 0 true]");
+ ASSERT_EMIT_EQ(reporter, *array, "[42 .5 0 true]");
array->appendName("ThisName");
- ASSERT_EMIT_EQ(reporter, *array, "[42 0.5 0 true /ThisName]");
+ ASSERT_EMIT_EQ(reporter, *array, "[42 .5 0 true /ThisName]");
array->appendName(SkString("AnotherName"));
- ASSERT_EMIT_EQ(reporter, *array, "[42 0.5 0 true /ThisName /AnotherName]");
+ ASSERT_EMIT_EQ(reporter, *array, "[42 .5 0 true /ThisName /AnotherName]");
array->appendString("This String");
ASSERT_EMIT_EQ(reporter, *array,
- "[42 0.5 0 true /ThisName /AnotherName (This String)]");
+ "[42 .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) "
+ "[42 .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) "
+ "[42 .5 0 true /ThisName /AnotherName (This String) "
"(Another String) [-1]]");
SkAutoTUnref<SkPDFArray> referencedArray(new SkPDFArray);
@@ -287,7 +284,7 @@ static void TestPDFArray(skiatest::Reporter* reporter) {
SkString result = emit_to_string(*array, &catalog);
ASSERT_EQ(reporter, result,
- "[42 0.5 0 true /ThisName /AnotherName (This String) "
+ "[42 .5 0 true /ThisName /AnotherName (This String) "
"(Another String) [-1] 1 0 R]");
}
@@ -310,7 +307,7 @@ static void TestPDFDict(skiatest::Reporter* reporter) {
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]>>");
+ ASSERT_EMIT_EQ(reporter, *dict, "<</n1 42\n/n2 .5\n/n3 [-100]>>");
dict.reset(new SkPDFDict);
ASSERT_EMIT_EQ(reporter, *dict, "<<>>");
@@ -322,26 +319,26 @@ static void TestPDFDict(skiatest::Reporter* reporter) {
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>>");
+ 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 0.5\n/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 0.5\n/n4 /AName\n"
+ 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 0.5\n/n4 /AName\n"
+ 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 0.5\n/n4 /AName\n"
+ 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>>");
-
+
SkAutoTUnref<SkPDFArray> referencedArray(new SkPDFArray);
Catalog catalog;
catalog.numbers.addObject(referencedArray.get());
@@ -435,3 +432,52 @@ DEF_TEST(PDFFontCanEmbedTypeface, reporter) {
REPORTER_ASSERT(reporter,
SkPDFFont::CanEmbedTypeface(portableTypeface, &canon));
}
+
+
+// test to see that all finite scalars round trip via scanf().
+static void check_pdf_scalar_serialization(
+ skiatest::Reporter* reporter, float inputFloat) {
+ char floatString[SkPDFUtils::kMaximumFloatDecimalLength];
+ size_t len = SkPDFUtils::FloatToDecimal(inputFloat, floatString);
+ if (len >= sizeof(floatString)) {
+ ERRORF(reporter, "string too long: %u", (unsigned)len);
+ return;
+ }
+ if (floatString[len] != '\0' || strlen(floatString) != len) {
+ ERRORF(reporter, "terminator misplaced.");
+ return; // The terminator is needed for sscanf().
+ }
+ if (reporter->verbose()) {
+ SkDebugf("%15.9g = \"%s\"\n", inputFloat, floatString);
+ }
+ float roundTripFloat;
+ if (1 != sscanf(floatString, "%f", &roundTripFloat)) {
+ ERRORF(reporter, "unscannable result: %s", floatString);
+ return;
+ }
+ if (isfinite(inputFloat) && roundTripFloat != inputFloat) {
+ ERRORF(reporter, "roundTripFloat (%.9g) != inputFloat (%.9g)",
+ roundTripFloat, inputFloat);
+ }
+}
+
+// Test SkPDFUtils::AppendScalar for accuracy.
+DEF_TEST(PDFPrimitives_Scalar, reporter) {
+ SkRandom random(0x5EED);
+ int iterationCount = 512;
+ while (iterationCount-- > 0) {
+ union { uint32_t u; float f; };
+ u = random.nextU();
+ static_assert(sizeof(float) == sizeof(uint32_t), "");
+ check_pdf_scalar_serialization(reporter, f);
+ }
+ float alwaysCheck[] = {
+ 0.0f, -0.0f, 1.0f, -1.0f, SK_ScalarPI, 0.1f, FLT_MIN, FLT_MAX,
+ -FLT_MIN, -FLT_MAX, FLT_MIN / 16.0f, -FLT_MIN / 16.0f,
+ SK_FloatNaN, SK_FloatInfinity, SK_FloatNegativeInfinity,
+ -FLT_MIN / 8388608.0
+ };
+ for (float inputFloat: alwaysCheck) {
+ check_pdf_scalar_serialization(reporter, inputFloat);
+ }
+}