From c13ee606d82b3847c7ad09cbbc6d21fab46bdcc7 Mon Sep 17 00:00:00 2001 From: "edisonn@google.com" Date: Wed, 23 Jan 2013 16:08:15 +0000 Subject: [PATCH] If getAdvance fails, getAdvanceData should not assert, but ignored. Review URL: https://codereview.appspot.com/7127056 git-svn-id: http://skia.googlecode.com/svn/trunk@7341 2bbb7eff-a529-9590-31e7-b0007b416f81 --- src/core/SkAdvancedTypefaceMetrics.cpp | 4 +++- tests/PDFPrimitivesTest.cpp | 26 ++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/core/SkAdvancedTypefaceMetrics.cpp b/src/core/SkAdvancedTypefaceMetrics.cpp index b647ada260..4982117f05 100644 --- a/src/core/SkAdvancedTypefaceMetrics.cpp +++ b/src/core/SkAdvancedTypefaceMetrics.cpp @@ -174,7 +174,9 @@ SkAdvancedTypefaceMetrics::AdvanceMetric* getAdvanceData( if (!subsetGlyphIDs || (subsetIndex < subsetGlyphIDsLength && static_cast(gId) == subsetGlyphIDs[subsetIndex])) { - SkAssertResult(getAdvance(fontHandle, gId, &advance)); + if (!getAdvance(fontHandle, gId, &advance)) { + advance = kDontCareAdvance; + } ++subsetIndex; } else { advance = kDontCareAdvance; diff --git a/tests/PDFPrimitivesTest.cpp b/tests/PDFPrimitivesTest.cpp index 42fc133b3c..6e7d61676d 100644 --- a/tests/PDFPrimitivesTest.cpp +++ b/tests/PDFPrimitivesTest.cpp @@ -8,9 +8,11 @@ #include "Test.h" +#include "SkCanvas.h" #include "SkData.h" #include "SkFlate.h" #include "SkPDFCatalog.h" +#include "SkPDFDevice.h" #include "SkPDFStream.h" #include "SkPDFTypes.h" #include "SkScalar.h" @@ -217,6 +219,28 @@ static void TestSubstitute(skiatest::Reporter* reporter) { buffer.getOffset())); } +// This test used to assert without the fix submitted for +// http://code.google.com/p/skia/issues/detail?id=1083. +// SKP files might have invalid glyph ids. This test ensures they are ignored, +// and there is no assert on input data in Debug mode. +static void test_issue1083(skiatest::Reporter* reporter) { + SkISize pageSize = SkISize::Make(100, 100); + SkPDFDevice* dev = new SkPDFDevice(pageSize, pageSize, SkMatrix::I()); + + SkCanvas c(dev); + SkPaint paint; + paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); + + uint16_t glyphID = 65000; + c.drawText(&glyphID, 2, 0, 0, paint); + + SkPDFDocument doc; + doc.appendPage(dev); + + SkDynamicMemoryWStream stream; + doc.emitPDF(&stream); +} + static void TestPDFPrimitives(skiatest::Reporter* reporter) { SkAutoTUnref int42(new SkPDFInt(42)); SimpleCheckObjectOutput(reporter, int42.get(), "42"); @@ -298,6 +322,8 @@ static void TestPDFPrimitives(skiatest::Reporter* reporter) { TestObjectRef(reporter); TestSubstitute(reporter); + + test_issue1083(reporter); } #include "TestClassDef.h"