summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcommit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-12-11 23:54:31 +0000
committercommit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-12-11 23:54:31 +0000
commitc0353ad63a5d956f2a3e09ebdd71be84cdbd1d6b (patch)
tree2eeaf4c1143b3c955cbbd973ae27106453fda7bb
parenta040d0e00417f765cd9d25b9c70694e4b818d77c (diff)
downloadsrc-c0353ad63a5d956f2a3e09ebdd71be84cdbd1d6b.tar.gz
[PDF] Fix font width generation when glyph 0 is used.
Using glyph 0 caused gid 0 to be in the subset list twice, which violated an assumption in the code. Added an assert for the assumption and updated the code to not insert gid 0 into the subset list twice. BUG=skia:1889 R=bungeman@google.com Author: vandebo@chromium.org Review URL: https://codereview.chromium.org/113093004 git-svn-id: http://skia.googlecode.com/svn/trunk/src@12632 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r--core/SkAdvancedTypefaceMetrics.cpp2
-rw-r--r--pdf/SkPDFFont.cpp7
2 files changed, 7 insertions, 2 deletions
diff --git a/core/SkAdvancedTypefaceMetrics.cpp b/core/SkAdvancedTypefaceMetrics.cpp
index ce64a42d..f9b25dc9 100644
--- a/core/SkAdvancedTypefaceMetrics.cpp
+++ b/core/SkAdvancedTypefaceMetrics.cpp
@@ -169,6 +169,8 @@ SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* getAdvanceData(
Data advance = kInvalidAdvance;
if (gId < lastIndex) {
// Get glyph id only when subset is NULL, or the id is in subset.
+ SkASSERT(!subsetGlyphIDs || (subsetIndex < subsetGlyphIDsLength &&
+ static_cast<uint32_t>(gId) <= subsetGlyphIDs[subsetIndex]));
if (!subsetGlyphIDs ||
(subsetIndex < subsetGlyphIDsLength &&
static_cast<uint32_t>(gId) == subsetGlyphIDs[subsetIndex])) {
diff --git a/pdf/SkPDFFont.cpp b/pdf/SkPDFFont.cpp
index ef9c3bbc..07ecbba3 100644
--- a/pdf/SkPDFFont.cpp
+++ b/pdf/SkPDFFont.cpp
@@ -1156,8 +1156,11 @@ bool SkPDFCIDFont::populate(const SkPDFGlyphSet* subset) {
if (fontInfo()->fType == SkAdvancedTypefaceMetrics::kTrueType_Font) {
// Generate glyph id array.
SkTDArray<uint32_t> glyphIDs;
- glyphIDs.push(0); // Always include glyph 0.
if (subset) {
+ // Always include glyph 0.
+ if (!subset->has(0)) {
+ glyphIDs.push(0);
+ }
subset->exportTo(&glyphIDs);
}
@@ -1165,7 +1168,7 @@ bool SkPDFCIDFont::populate(const SkPDFGlyphSet* subset) {
info = SkAdvancedTypefaceMetrics::kGlyphNames_PerGlyphInfo;
info = SkTBitOr<SkAdvancedTypefaceMetrics::PerGlyphInfo>(
info, SkAdvancedTypefaceMetrics::kHAdvance_PerGlyphInfo);
- uint32_t* glyphs = (glyphIDs.count() == 1) ? NULL : glyphIDs.begin();
+ uint32_t* glyphs = (glyphIDs.count() == 0) ? NULL : glyphIDs.begin();
uint32_t glyphsCount = glyphs ? glyphIDs.count() : 0;
SkAutoTUnref<SkAdvancedTypefaceMetrics> fontMetrics(
typeface()->getAdvancedTypefaceMetrics(info, glyphs, glyphsCount));