diff options
author | 2012-03-05 18:44:33 +0000 | |
---|---|---|
committer | 2012-03-05 18:44:33 +0000 | |
commit | c0376febfc855870a0e109d39ee62e82f0ab2139 (patch) | |
tree | 74d638f61cc6a229cb2bf188fbe48b226444a970 | |
parent | 178b8e0b8c3d423c3fd947776f4b7790a0417582 (diff) |
[PDF] Fix name objects containing characters > 0x80 and add a test.
This fixes chrome bug http://crbug.com/115258
Review URL: https://codereview.appspot.com/5726048
git-svn-id: http://skia.googlecode.com/svn/trunk@3319 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r-- | src/pdf/SkPDFTypes.cpp | 3 | ||||
-rw-r--r-- | tests/PDFPrimitivesTest.cpp | 8 |
2 files changed, 10 insertions, 1 deletions
diff --git a/src/pdf/SkPDFTypes.cpp b/src/pdf/SkPDFTypes.cpp index f97f21bdfd..5a0ede8253 100644 --- a/src/pdf/SkPDFTypes.cpp +++ b/src/pdf/SkPDFTypes.cpp @@ -297,7 +297,8 @@ SkString SkPDFName::FormatName(const SkString& input) { for (size_t i = 0; i < input.size(); i++) { if (input[i] & 0x80 || input[i] < '!' || input[i] == '#') { result.append("#"); - result.appendHex(input[i], 2); + // Mask with 0xFF to avoid sign extension. i.e. #FFFFFF81 + result.appendHex(input[i] & 0xFF, 2); } else { result.append(input.c_str() + i, 1); } diff --git a/tests/PDFPrimitivesTest.cpp b/tests/PDFPrimitivesTest.cpp index 82686eff87..1aed3ad981 100644 --- a/tests/PDFPrimitivesTest.cpp +++ b/tests/PDFPrimitivesTest.cpp @@ -275,6 +275,14 @@ static void TestPDFPrimitives(skiatest::Reporter* reporter) { CheckObjectOutput(reporter, name.get(), expectedResult, strlen(expectedResult), false, false); + // Test that we correctly handle characters with the high-bit set. + char highBitCString[] = {0xDE, 0xAD, 'b', 'e', 0xEF, 0}; + SkRefPtr<SkPDFName> highBitName = new SkPDFName(highBitCString); + name->unref(); // SkRefPtr and new both took a reference. + const char highBitExpectedResult[] = "/#DE#ADbe#EF"; + CheckObjectOutput(reporter, highBitName.get(), highBitExpectedResult, + strlen(highBitExpectedResult), false, false); + SkRefPtr<SkPDFArray> array = new SkPDFArray; array->unref(); // SkRefPtr and new both took a reference. SimpleCheckObjectOutput(reporter, array.get(), "[]"); |