diff options
author | robertphillips <robertphillips@google.com> | 2016-02-25 10:58:49 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-02-25 10:58:49 -0800 |
commit | 3552ba18ee41e135d6fc52228adae37794fc15ff (patch) | |
tree | 8fd975a1a4159055abbdb42ca54a82c577ce67e9 | |
parent | 4dcbe431244c2f1abef8416b95ebf2921708fa63 (diff) | |
download | skia-3552ba18ee41e135d6fc52228adae37794fc15ff.tar.gz |
Make skpinfo able to inspect SK_PICT_TYPEFACE_TAG blocks
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1732263003
BUG=skia:4691
Review URL: https://codereview.chromium.org/1732263003
-rw-r--r-- | src/core/SkFontDescriptor.cpp | 19 | ||||
-rw-r--r-- | src/core/SkFontDescriptor.h | 2 | ||||
-rw-r--r-- | src/core/SkPaint.cpp | 22 | ||||
-rw-r--r-- | src/core/SkTypeface.cpp | 7 | ||||
-rw-r--r-- | src/utils/SkWhitelistTypefaces.cpp | 6 | ||||
-rw-r--r-- | tools/skpinfo.cpp | 20 |
6 files changed, 54 insertions, 22 deletions
diff --git a/src/core/SkFontDescriptor.cpp b/src/core/SkFontDescriptor.cpp index 8348d5fdba..f477a2d695 100644 --- a/src/core/SkFontDescriptor.cpp +++ b/src/core/SkFontDescriptor.cpp @@ -58,8 +58,8 @@ static void write_uint(SkWStream* stream, size_t n, uint32_t id) { stream->writePackedUInt(n); } -SkFontDescriptor::SkFontDescriptor(SkStream* stream) { - fStyle = (SkTypeface::Style)stream->readPackedUInt(); +bool SkFontDescriptor::Deserialize(SkStream* stream, SkFontDescriptor* result) { + result->fStyle = (SkTypeface::Style)stream->readPackedUInt(); SkAutoSTMalloc<4, SkFixed> axis; size_t axisCount = 0; @@ -67,13 +67,13 @@ SkFontDescriptor::SkFontDescriptor(SkStream* stream) { for (size_t id; (id = stream->readPackedUInt()) != kSentinel;) { switch (id) { case kFontFamilyName: - read_string(stream, &fFamilyName); + read_string(stream, &result->fFamilyName); break; case kFullName: - read_string(stream, &fFullName); + read_string(stream, &result->fFullName); break; case kPostscriptName: - read_string(stream, &fPostscriptName); + read_string(stream, &result->fPostscriptName); break; case kFontAxes: axisCount = read_uint(stream); @@ -90,7 +90,7 @@ SkFontDescriptor::SkFontDescriptor(SkStream* stream) { break; default: SkDEBUGFAIL("Unknown id used by a font descriptor"); - return; + return false; } } @@ -98,9 +98,14 @@ SkFontDescriptor::SkFontDescriptor(SkStream* stream) { if (length > 0) { SkAutoTUnref<SkData> data(SkData::NewUninitialized(length)); if (stream->read(data->writable_data(), length) == length) { - fFontData.reset(new SkFontData(new SkMemoryStream(data), index, axis, axisCount)); + result->fFontData.reset(new SkFontData(new SkMemoryStream(data), + index, axis, axisCount)); + } else { + SkDEBUGFAIL("Could not read font data"); + return false; } } + return true; } void SkFontDescriptor::serialize(SkWStream* stream) { diff --git a/src/core/SkFontDescriptor.h b/src/core/SkFontDescriptor.h index 21fecdc416..095ecce60a 100644 --- a/src/core/SkFontDescriptor.h +++ b/src/core/SkFontDescriptor.h @@ -51,7 +51,7 @@ class SkFontDescriptor : SkNoncopyable { public: SkFontDescriptor(SkTypeface::Style = SkTypeface::kNormal); // Does not affect ownership of SkStream. - SkFontDescriptor(SkStream*); + static bool Deserialize(SkStream*, SkFontDescriptor* result); void serialize(SkWStream*); diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp index 638e251b36..060e905ec7 100644 --- a/src/core/SkPaint.cpp +++ b/src/core/SkPaint.cpp @@ -2123,15 +2123,19 @@ void SkPaint::toString(SkString* str) const { SkDynamicMemoryWStream ostream; typeface->serialize(&ostream); SkAutoTDelete<SkStreamAsset> istream(ostream.detachAsStream()); - SkFontDescriptor descriptor(istream); - - str->append("<dt>Font Family Name:</dt><dd>"); - str->append(descriptor.getFamilyName()); - str->append("</dd><dt>Font Full Name:</dt><dd>"); - str->append(descriptor.getFullName()); - str->append("</dd><dt>Font PS Name:</dt><dd>"); - str->append(descriptor.getPostscriptName()); - str->append("</dd>"); + + SkFontDescriptor descriptor; + if (!SkFontDescriptor::Deserialize(istream, &descriptor)) { + str->append("<dt>FontDescriptor deserialization failed</dt>"); + } else { + str->append("<dt>Font Family Name:</dt><dd>"); + str->append(descriptor.getFamilyName()); + str->append("</dd><dt>Font Full Name:</dt><dd>"); + str->append(descriptor.getFullName()); + str->append("</dd><dt>Font PS Name:</dt><dd>"); + str->append(descriptor.getPostscriptName()); + str->append("</dd>"); + } } str->append("<dt>TextSize:</dt><dd>"); diff --git a/src/core/SkTypeface.cpp b/src/core/SkTypeface.cpp index e6a9b4d66c..8d4233eac1 100644 --- a/src/core/SkTypeface.cpp +++ b/src/core/SkTypeface.cpp @@ -180,7 +180,12 @@ SkTypeface* SkTypeface::Deserialize(SkStream* stream) { if (gDeserializeTypefaceDelegate) { return (*gDeserializeTypefaceDelegate)(stream); } - SkFontDescriptor desc(stream); + + SkFontDescriptor desc; + if (!SkFontDescriptor::Deserialize(stream, &desc)) { + return nullptr; + } + SkFontData* data = desc.detachFontData(); if (data) { SkTypeface* typeface = SkTypeface::CreateFromFontData(data); diff --git a/src/utils/SkWhitelistTypefaces.cpp b/src/utils/SkWhitelistTypefaces.cpp index d3ffe98d16..66d32188a0 100644 --- a/src/utils/SkWhitelistTypefaces.cpp +++ b/src/utils/SkWhitelistTypefaces.cpp @@ -184,7 +184,11 @@ void WhitelistSerializeTypeface(const SkTypeface* tf, SkWStream* wstream) { } SkTypeface* WhitelistDeserializeTypeface(SkStream* stream) { - SkFontDescriptor desc(stream); + SkFontDescriptor desc; + if (!SkFontDescriptor::Deserialize(stream, &desc)) { + return nullptr; + } + SkFontData* data = desc.detachFontData(); if (data) { SkTypeface* typeface = SkTypeface::CreateFromFontData(data); diff --git a/tools/skpinfo.cpp b/tools/skpinfo.cpp index c7fd8c8708..4b65cb8a8c 100644 --- a/tools/skpinfo.cpp +++ b/tools/skpinfo.cpp @@ -9,6 +9,7 @@ #include "SkPicture.h" #include "SkPictureData.h" #include "SkStream.h" +#include "SkFontDescriptor.h" DEFINE_string2(input, i, "", "skp on which to report"); DEFINE_bool2(version, v, true, "version"); @@ -107,13 +108,26 @@ int tool_main(int argc, char** argv) { SkDebugf("SK_PICT_FACTORY_TAG %d\n", chunkSize); } break; - case SK_PICT_TYPEFACE_TAG: + case SK_PICT_TYPEFACE_TAG: { if (FLAGS_tags && !FLAGS_quiet) { SkDebugf("SK_PICT_TYPEFACE_TAG %d\n", chunkSize); - SkDebugf("Exiting early due to format limitations\n"); } - return kSuccess; // TODO: need to store size in bytes + + const int count = SkToInt(chunkSize); + for (int i = 0; i < count; i++) { + SkFontDescriptor desc; + if (!SkFontDescriptor::Deserialize(&stream, &desc)) { + if (!FLAGS_quiet) { + SkDebugf("File corruption in SkFontDescriptor\n"); + } + return kInvalidTag; + } + } + + // clear this since we've consumed all the typefaces + chunkSize = 0; break; + } case SK_PICT_PICTURE_TAG: if (FLAGS_tags && !FLAGS_quiet) { SkDebugf("SK_PICT_PICTURE_TAG %d\n", chunkSize); |