Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(13)

Side by Side Diff: src/pdf/SkPDFFont.cpp

Issue 2222523003: SkPDF/SkAdvancedTypefaceMetrics: simplify ATM, PDF takes over (Closed) Base URL: https://skia.googlesource.com/skia.git@SkPDF_no_kHAdvance
Patch Set: rebase and nit Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/core/SkAdvancedTypefaceMetrics.cpp ('k') | src/pdf/SkPDFFontImpl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2011 Google Inc. 2 * Copyright 2011 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include <ctype.h> 8 #include <ctype.h>
9 9
10 #include "SkData.h" 10 #include "SkData.h"
(...skipping 18 matching lines...) Expand all
29 #else 29 #else
30 #include SK_SFNTLY_SUBSETTER 30 #include SK_SFNTLY_SUBSETTER
31 #endif 31 #endif
32 #endif 32 #endif
33 33
34 // PDF's notion of symbolic vs non-symbolic is related to the character set, not 34 // PDF's notion of symbolic vs non-symbolic is related to the character set, not
35 // symbols vs. characters. Rarely is a font the right character set to call it 35 // symbols vs. characters. Rarely is a font the right character set to call it
36 // non-symbolic, so always call it symbolic. (PDF 1.4 spec, section 5.7.1) 36 // non-symbolic, so always call it symbolic. (PDF 1.4 spec, section 5.7.1)
37 static const int kPdfSymbolic = 4; 37 static const int kPdfSymbolic = 4;
38 38
39 struct AdvanceMetric {
40 enum MetricType {
41 kDefault, // Default advance: fAdvance.count = 1
42 kRange, // Advances for a range: fAdvance.count = fEndID-fStartID
43 kRun // fStartID-fEndID have same advance: fAdvance.count = 1
44 };
45 MetricType fType;
46 uint16_t fStartId;
47 uint16_t fEndId;
48 SkTDArray<int16_t> fAdvance;
49 AdvanceMetric(uint16_t startId) : fStartId(startId) {}
50 AdvanceMetric(AdvanceMetric&&) = default;
51 AdvanceMetric& operator=(AdvanceMetric&& other) = default;
52 AdvanceMetric(const AdvanceMetric&) = delete;
53 AdvanceMetric& operator=(const AdvanceMetric&) = delete;
54 };
55
39 namespace { 56 namespace {
40 57
41 /////////////////////////////////////////////////////////////////////////////// 58 ///////////////////////////////////////////////////////////////////////////////
42 // File-Local Functions 59 // File-Local Functions
43 /////////////////////////////////////////////////////////////////////////////// 60 ///////////////////////////////////////////////////////////////////////////////
44 61
62 const int16_t kInvalidAdvance = SK_MinS16;
63 const int16_t kDontCareAdvance = SK_MinS16 + 1;
64
65 static void stripUninterestingTrailingAdvancesFromRange(
66 AdvanceMetric* range) {
67 SkASSERT(range);
68
69 int expectedAdvanceCount = range->fEndId - range->fStartId + 1;
70 if (range->fAdvance.count() < expectedAdvanceCount) {
71 return;
72 }
73
74 for (int i = expectedAdvanceCount - 1; i >= 0; --i) {
75 if (range->fAdvance[i] != kDontCareAdvance &&
76 range->fAdvance[i] != kInvalidAdvance &&
77 range->fAdvance[i] != 0) {
78 range->fEndId = range->fStartId + i;
79 break;
80 }
81 }
82 }
83
84 static void zeroWildcardsInRange(AdvanceMetric* range) {
85 SkASSERT(range);
86 if (range->fType != AdvanceMetric::kRange) {
87 return;
88 }
89 SkASSERT(range->fAdvance.count() == range->fEndId - range->fStartId + 1);
90
91 // Zero out wildcards.
92 for (int i = 0; i < range->fAdvance.count(); ++i) {
93 if (range->fAdvance[i] == kDontCareAdvance) {
94 range->fAdvance[i] = 0;
95 }
96 }
97 }
98
99 static void FinishRange(
100 AdvanceMetric* range,
101 int endId,
102 AdvanceMetric::MetricType type) {
103 range->fEndId = endId;
104 range->fType = type;
105 stripUninterestingTrailingAdvancesFromRange(range);
106 int newLength;
107 if (type == AdvanceMetric::kRange) {
108 newLength = range->fEndId - range->fStartId + 1;
109 } else {
110 if (range->fEndId == range->fStartId) {
111 range->fType = AdvanceMetric::kRange;
112 }
113 newLength = 1;
114 }
115 SkASSERT(range->fAdvance.count() >= newLength);
116 range->fAdvance.setCount(newLength);
117 zeroWildcardsInRange(range);
118 }
119
120
121 /** Retrieve advance data for glyphs. Used by the PDF backend.
122 @param num_glyphs Total number of glyphs in the given font.
123 @param glyphIDs For per-glyph info, specify subset of the
124 font by giving glyph ids. Each integer
125 represents a glyph id. Passing nullptr
126 means all glyphs in the font.
127 @param glyphIDsCount Number of elements in subsetGlyphIds.
128 Ignored if glyphIDs is nullptr.
129 */
130 // TODO(halcanary): this function is complex enough to need its logic
131 // tested with unit tests. On the other hand, I want to do another
132 // round of re-factoring before figuring out how to mock this.
133 // TODO(halcanary): this function should be combined with
134 // composeAdvanceData() so that we don't need to produce a linked list
135 // of intermediate values. Or we could make the intermediate value
136 // something other than a linked list.
137 static void get_glyph_widths(SkSinglyLinkedList<AdvanceMetric>* glyphWidths,
138 int num_glyphs,
139 const uint32_t* subsetGlyphIDs,
140 uint32_t subsetGlyphIDsLength,
141 SkGlyphCache* glyphCache) {
142 // Assuming that on average, the ASCII representation of an advance plus
143 // a space is 8 characters and the ASCII representation of a glyph id is 3
144 // characters, then the following cut offs for using different range types
145 // apply:
146 // The cost of stopping and starting the range is 7 characers
147 // a. Removing 4 0's or don't care's is a win
148 // The cost of stopping and starting the range plus a run is 22
149 // characters
150 // b. Removing 3 repeating advances is a win
151 // c. Removing 2 repeating advances and 3 don't cares is a win
152 // When not currently in a range the cost of a run over a range is 16
153 // characaters, so:
154 // d. Removing a leading 0/don't cares is a win because it is omitted
155 // e. Removing 2 repeating advances is a win
156
157 AdvanceMetric* prevRange = nullptr;
158 int16_t lastAdvance = kInvalidAdvance;
159 int repeatedAdvances = 0;
160 int wildCardsInRun = 0;
161 int trailingWildCards = 0;
162 uint32_t subsetIndex = 0;
163
164 // Limit the loop count to glyph id ranges provided.
165 int firstIndex = 0;
166 int lastIndex = num_glyphs;
167 if (subsetGlyphIDs) {
168 firstIndex = static_cast<int>(subsetGlyphIDs[0]);
169 lastIndex =
170 static_cast<int>(subsetGlyphIDs[subsetGlyphIDsLength - 1]) + 1;
171 }
172 AdvanceMetric curRange(firstIndex);
173
174 for (int gId = firstIndex; gId <= lastIndex; gId++) {
175 int16_t advance = kInvalidAdvance;
176 if (gId < lastIndex) {
177 // Get glyph id only when subset is nullptr, or the id is in subset.
178 SkASSERT(!subsetGlyphIDs || (subsetIndex < subsetGlyphIDsLength &&
179 static_cast<uint32_t>(gId) <= subsetGlyphIDs[subsetIndex]));
180 if (!subsetGlyphIDs ||
181 (subsetIndex < subsetGlyphIDsLength &&
182 static_cast<uint32_t>(gId) == subsetGlyphIDs[subsetIndex])) {
183 advance = (int16_t)glyphCache->getGlyphIDAdvance(gId).fAdvanceX;
184 ++subsetIndex;
185 } else {
186 advance = kDontCareAdvance;
187 }
188 }
189 if (advance == lastAdvance) {
190 repeatedAdvances++;
191 trailingWildCards = 0;
192 } else if (advance == kDontCareAdvance) {
193 wildCardsInRun++;
194 trailingWildCards++;
195 } else if (curRange.fAdvance.count() ==
196 repeatedAdvances + 1 + wildCardsInRun) { // All in run.
197 if (lastAdvance == 0) {
198 curRange.fStartId = gId; // reset
199 curRange.fAdvance.setCount(0);
200 trailingWildCards = 0;
201 } else if (repeatedAdvances + 1 >= 2 || trailingWildCards >= 4) {
202 FinishRange(&curRange, gId - 1, AdvanceMetric::kRun);
203 prevRange = glyphWidths->emplace_back(std::move(curRange));
204 curRange = AdvanceMetric(gId);
205 trailingWildCards = 0;
206 }
207 repeatedAdvances = 0;
208 wildCardsInRun = trailingWildCards;
209 trailingWildCards = 0;
210 } else {
211 if (lastAdvance == 0 &&
212 repeatedAdvances + 1 + wildCardsInRun >= 4) {
213 FinishRange(&curRange,
214 gId - repeatedAdvances - wildCardsInRun - 2,
215 AdvanceMetric::kRange);
216 prevRange = glyphWidths->emplace_back(std::move(curRange));
217 curRange = AdvanceMetric(gId);
218 trailingWildCards = 0;
219 } else if (trailingWildCards >= 4 && repeatedAdvances + 1 < 2) {
220 FinishRange(&curRange, gId - trailingWildCards - 1,
221 AdvanceMetric::kRange);
222 prevRange = glyphWidths->emplace_back(std::move(curRange));
223 curRange = AdvanceMetric(gId);
224 trailingWildCards = 0;
225 } else if (lastAdvance != 0 &&
226 (repeatedAdvances + 1 >= 3 ||
227 (repeatedAdvances + 1 >= 2 && wildCardsInRun >= 3))) {
228 FinishRange(&curRange,
229 gId - repeatedAdvances - wildCardsInRun - 2,
230 AdvanceMetric::kRange);
231 (void)glyphWidths->emplace_back(std::move(curRange));
232 curRange =
233 AdvanceMetric(gId - repeatedAdvances - wildCardsInRun - 1);
234 curRange.fAdvance.append(1, &lastAdvance);
235 FinishRange(&curRange, gId - 1, AdvanceMetric::kRun);
236 prevRange = glyphWidths->emplace_back(std::move(curRange));
237 curRange = AdvanceMetric(gId);
238 trailingWildCards = 0;
239 }
240 repeatedAdvances = 0;
241 wildCardsInRun = trailingWildCards;
242 trailingWildCards = 0;
243 }
244 curRange.fAdvance.append(1, &advance);
245 if (advance != kDontCareAdvance) {
246 lastAdvance = advance;
247 }
248 }
249 if (curRange.fStartId == lastIndex) {
250 if (!prevRange) {
251 glyphWidths->reset();
252 return; // https://crbug.com/567031
253 }
254 } else {
255 FinishRange(&curRange, lastIndex - 1, AdvanceMetric::kRange);
256 glyphWidths->emplace_back(std::move(curRange));
257 }
258 }
259
260 ////////////////////////////////////////////////////////////////////////////////
261
262
45 bool parsePFBSection(const uint8_t** src, size_t* len, int sectionType, 263 bool parsePFBSection(const uint8_t** src, size_t* len, int sectionType,
46 size_t* size) { 264 size_t* size) {
47 // PFB sections have a two or six bytes header. 0x80 and a one byte 265 // PFB sections have a two or six bytes header. 0x80 and a one byte
48 // section type followed by a four byte section length. Type one is 266 // section type followed by a four byte section length. Type one is
49 // an ASCII section (includes a length), type two is a binary section 267 // an ASCII section (includes a length), type two is a binary section
50 // (includes a length) and type three is an EOF marker with no length. 268 // (includes a length) and type three is an EOF marker with no length.
51 const uint8_t* buf = *src; 269 const uint8_t* buf = *src;
52 if (*len < 2 || buf[0] != 0x80 || buf[1] != sectionType) { 270 if (*len < 2 || buf[0] != 0x80 || buf[1] != sectionType) {
53 return false; 271 return false;
54 } else if (buf[1] == 3) { 272 } else if (buf[1] == 3) {
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 auto bbox = sk_make_sp<SkPDFArray>(); 513 auto bbox = sk_make_sp<SkPDFArray>();
296 bbox->reserve(4); 514 bbox->reserve(4);
297 bbox->appendScalar(scaleFromFontUnits(glyphBBox.fLeft, emSize)); 515 bbox->appendScalar(scaleFromFontUnits(glyphBBox.fLeft, emSize));
298 bbox->appendScalar(scaleFromFontUnits(glyphBBox.fBottom, emSize)); 516 bbox->appendScalar(scaleFromFontUnits(glyphBBox.fBottom, emSize));
299 bbox->appendScalar(scaleFromFontUnits(glyphBBox.fRight, emSize)); 517 bbox->appendScalar(scaleFromFontUnits(glyphBBox.fRight, emSize));
300 bbox->appendScalar(scaleFromFontUnits(glyphBBox.fTop, emSize)); 518 bbox->appendScalar(scaleFromFontUnits(glyphBBox.fTop, emSize));
301 return bbox; 519 return bbox;
302 } 520 }
303 521
304 sk_sp<SkPDFArray> composeAdvanceData( 522 sk_sp<SkPDFArray> composeAdvanceData(
305 const SkSinglyLinkedList<SkAdvancedTypefaceMetrics::WidthRange>& advance Info, 523 const SkSinglyLinkedList<AdvanceMetric>& advanceInfo,
306 uint16_t emSize, 524 uint16_t emSize,
307 int16_t* defaultAdvance) { 525 int16_t* defaultAdvance) {
308 auto result = sk_make_sp<SkPDFArray>(); 526 auto result = sk_make_sp<SkPDFArray>();
309 for (const SkAdvancedTypefaceMetrics::WidthRange& range : advanceInfo) { 527 for (const AdvanceMetric& range : advanceInfo) {
310 switch (range.fType) { 528 switch (range.fType) {
311 case SkAdvancedTypefaceMetrics::WidthRange::kDefault: { 529 case AdvanceMetric::kDefault: {
312 SkASSERT(range.fAdvance.count() == 1); 530 SkASSERT(range.fAdvance.count() == 1);
313 *defaultAdvance = range.fAdvance[0]; 531 *defaultAdvance = range.fAdvance[0];
314 break; 532 break;
315 } 533 }
316 case SkAdvancedTypefaceMetrics::WidthRange::kRange: { 534 case AdvanceMetric::kRange: {
317 auto advanceArray = sk_make_sp<SkPDFArray>(); 535 auto advanceArray = sk_make_sp<SkPDFArray>();
318 for (int j = 0; j < range.fAdvance.count(); j++) 536 for (int j = 0; j < range.fAdvance.count(); j++)
319 advanceArray->appendScalar( 537 advanceArray->appendScalar(
320 scaleFromFontUnits(range.fAdvance[j], emSize)); 538 scaleFromFontUnits(range.fAdvance[j], emSize));
321 result->appendInt(range.fStartId); 539 result->appendInt(range.fStartId);
322 result->appendObject(std::move(advanceArray)); 540 result->appendObject(std::move(advanceArray));
323 break; 541 break;
324 } 542 }
325 case SkAdvancedTypefaceMetrics::WidthRange::kRun: { 543 case AdvanceMetric::kRun: {
326 SkASSERT(range.fAdvance.count() == 1); 544 SkASSERT(range.fAdvance.count() == 1);
327 result->appendInt(range.fStartId); 545 result->appendInt(range.fStartId);
328 result->appendInt(range.fEndId); 546 result->appendInt(range.fEndId);
329 result->appendScalar( 547 result->appendScalar(
330 scaleFromFontUnits(range.fAdvance[0], emSize)); 548 scaleFromFontUnits(range.fAdvance[0], emSize));
331 break; 549 break;
332 } 550 }
333 } 551 }
334 } 552 }
335 return result; 553 return result;
(...skipping 699 matching lines...) Expand 10 before | Expand all | Expand 10 after
1035 } 1253 }
1036 default: 1254 default:
1037 SkASSERT(false); 1255 SkASSERT(false);
1038 } 1256 }
1039 this->insertObjRef("FontDescriptor", std::move(descriptor)); 1257 this->insertObjRef("FontDescriptor", std::move(descriptor));
1040 return true; 1258 return true;
1041 } 1259 }
1042 1260
1043 void set_glyph_widths(SkTypeface* tf, 1261 void set_glyph_widths(SkTypeface* tf,
1044 const SkTDArray<uint32_t>* glyphIDs, 1262 const SkTDArray<uint32_t>* glyphIDs,
1045 SkAdvancedTypefaceMetrics* dst) { 1263 SkSinglyLinkedList<AdvanceMetric>* dst) {
1046 SkPaint tmpPaint; 1264 SkPaint tmpPaint;
1047 tmpPaint.setHinting(SkPaint::kNo_Hinting); 1265 tmpPaint.setHinting(SkPaint::kNo_Hinting);
1048 tmpPaint.setTypeface(sk_ref_sp(tf)); 1266 tmpPaint.setTypeface(sk_ref_sp(tf));
1049 tmpPaint.setTextSize((SkScalar)tf->getUnitsPerEm()); 1267 tmpPaint.setTextSize((SkScalar)tf->getUnitsPerEm());
1050 SkAutoGlyphCache autoGlyphCache(tmpPaint, nullptr, nullptr); 1268 SkAutoGlyphCache autoGlyphCache(tmpPaint, nullptr, nullptr);
1051 SkGlyphCache* glyphCache = autoGlyphCache.get();
1052 SkAdvancedTypefaceMetrics::GetAdvance advanceFn =
1053 [glyphCache](int gid, int16_t* advance) {
1054 *advance = (int16_t)glyphCache->getGlyphIDAdvance(gid).fAdvanceX;
1055 return true;
1056 };
1057 if (!glyphIDs || glyphIDs->isEmpty()) { 1269 if (!glyphIDs || glyphIDs->isEmpty()) {
1058 dst->setGlyphWidths(tf->countGlyphs(), nullptr, 0, advanceFn); 1270 get_glyph_widths(dst, tf->countGlyphs(), nullptr, 0, autoGlyphCache.get( ));
1059 } else { 1271 } else {
1060 dst->setGlyphWidths(tf->countGlyphs(), 1272 get_glyph_widths(dst, tf->countGlyphs(), glyphIDs->begin(),
1061 glyphIDs->begin(), 1273 glyphIDs->count(), autoGlyphCache.get());
1062 glyphIDs->count(), advanceFn);
1063 } 1274 }
1064 } 1275 }
1065 1276
1066 bool SkPDFCIDFont::populate(const SkPDFGlyphSet* subset) { 1277 bool SkPDFCIDFont::populate(const SkPDFGlyphSet* subset) {
1067 // Generate new font metrics with advance info for true type fonts. 1278 // Generate new font metrics with advance info for true type fonts.
1068 // Generate glyph id array. 1279 // Generate glyph id array.
1069 SkTDArray<uint32_t> glyphIDs; 1280 SkTDArray<uint32_t> glyphIDs;
1070 if (subset) { 1281 if (subset) {
1071 if (!subset->has(0)) { 1282 if (!subset->has(0)) {
1072 glyphIDs.push(0); // Always include glyph 0. 1283 glyphIDs.push(0); // Always include glyph 0.
(...skipping 23 matching lines...) Expand all
1096 } else { 1307 } else {
1097 SkASSERT(false); 1308 SkASSERT(false);
1098 } 1309 }
1099 1310
1100 auto sysInfo = sk_make_sp<SkPDFDict>(); 1311 auto sysInfo = sk_make_sp<SkPDFDict>();
1101 sysInfo->insertString("Registry", "Adobe"); 1312 sysInfo->insertString("Registry", "Adobe");
1102 sysInfo->insertString("Ordering", "Identity"); 1313 sysInfo->insertString("Ordering", "Identity");
1103 sysInfo->insertInt("Supplement", 0); 1314 sysInfo->insertInt("Supplement", 0);
1104 this->insertObject("CIDSystemInfo", std::move(sysInfo)); 1315 this->insertObject("CIDSystemInfo", std::move(sysInfo));
1105 1316
1106 SkAdvancedTypefaceMetrics tmpMetrics; 1317 SkSinglyLinkedList<AdvanceMetric> tmpMetrics;
1107 set_glyph_widths(this->typeface(), &glyphIDs, &tmpMetrics); 1318 set_glyph_widths(this->typeface(), &glyphIDs, &tmpMetrics);
1108 int16_t defaultWidth = 0; 1319 int16_t defaultWidth = 0;
1109 uint16_t emSize = (uint16_t)this->fontInfo()->fEmSize; 1320 uint16_t emSize = (uint16_t)this->fontInfo()->fEmSize;
1110 sk_sp<SkPDFArray> widths = composeAdvanceData( 1321 sk_sp<SkPDFArray> widths = composeAdvanceData(tmpMetrics, emSize, &defaultWi dth);
1111 tmpMetrics.fGlyphWidths, emSize, &defaultWidth);
1112 if (widths->size()) { 1322 if (widths->size()) {
1113 this->insertObject("W", std::move(widths)); 1323 this->insertObject("W", std::move(widths));
1114 } 1324 }
1115 1325
1116 this->insertScalar( 1326 this->insertScalar(
1117 "DW", scaleFromFontUnits(defaultWidth, emSize)); 1327 "DW", scaleFromFontUnits(defaultWidth, emSize));
1118 return true; 1328 return true;
1119 } 1329 }
1120 1330
1121 /////////////////////////////////////////////////////////////////////////////// 1331 ///////////////////////////////////////////////////////////////////////////////
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1162 fontStream->dict()->insertInt("Length2", data); 1372 fontStream->dict()->insertInt("Length2", data);
1163 fontStream->dict()->insertInt("Length3", trailer); 1373 fontStream->dict()->insertInt("Length3", trailer);
1164 descriptor->insertObjRef("FontFile", std::move(fontStream)); 1374 descriptor->insertObjRef("FontFile", std::move(fontStream));
1165 1375
1166 this->insertObjRef("FontDescriptor", std::move(descriptor)); 1376 this->insertObjRef("FontDescriptor", std::move(descriptor));
1167 1377
1168 return addCommonFontDescriptorEntries(defaultWidth); 1378 return addCommonFontDescriptorEntries(defaultWidth);
1169 } 1379 }
1170 1380
1171 bool SkPDFType1Font::populate(int16_t glyphID) { 1381 bool SkPDFType1Font::populate(int16_t glyphID) {
1172 SkASSERT(fontInfo()->fVerticalMetrics.empty());
1173 SkASSERT(fontInfo()->fGlyphWidths.empty());
1174
1175 adjustGlyphRangeForSingleByteEncoding(glyphID); 1382 adjustGlyphRangeForSingleByteEncoding(glyphID);
1176 1383
1177 int16_t defaultWidth = 0; 1384 int16_t defaultWidth = 0;
1178 const SkAdvancedTypefaceMetrics::WidthRange* widthRangeEntry = nullptr; 1385 const AdvanceMetric* widthRangeEntry = nullptr;
1179 { 1386 {
1180 SkAdvancedTypefaceMetrics tmpMetrics; 1387 SkSinglyLinkedList<AdvanceMetric> tmpMetrics;
1181 set_glyph_widths(this->typeface(), nullptr, &tmpMetrics); 1388 set_glyph_widths(this->typeface(), nullptr, &tmpMetrics);
1182 for (const auto& widthEntry : tmpMetrics.fGlyphWidths) { 1389 for (const auto& widthEntry : tmpMetrics) {
1183 switch (widthEntry.fType) { 1390 switch (widthEntry.fType) {
1184 case SkAdvancedTypefaceMetrics::WidthRange::kDefault: 1391 case AdvanceMetric::kDefault:
1185 defaultWidth = widthEntry.fAdvance[0]; 1392 defaultWidth = widthEntry.fAdvance[0];
1186 break; 1393 break;
1187 case SkAdvancedTypefaceMetrics::WidthRange::kRun: 1394 case AdvanceMetric::kRun:
1188 SkASSERT(false); 1395 SkASSERT(false);
1189 break; 1396 break;
1190 case SkAdvancedTypefaceMetrics::WidthRange::kRange: 1397 case AdvanceMetric::kRange:
1191 SkASSERT(widthRangeEntry == nullptr); 1398 SkASSERT(widthRangeEntry == nullptr);
1192 widthRangeEntry = &widthEntry; 1399 widthRangeEntry = &widthEntry;
1193 break; 1400 break;
1194 } 1401 }
1195 } 1402 }
1196 } 1403 }
1197 1404
1198 if (!addFontDescriptor(defaultWidth)) { 1405 if (!addFontDescriptor(defaultWidth)) {
1199 return false; 1406 return false;
1200 } 1407 }
1201 1408
1202 insertName("Subtype", "Type1"); 1409 insertName("Subtype", "Type1");
1203 insertName("BaseFont", fontInfo()->fFontName); 1410 insertName("BaseFont", fontInfo()->fFontName);
1204 1411
1205 addWidthInfoFromRange(defaultWidth, widthRangeEntry); 1412 addWidthInfoFromRange(defaultWidth, widthRangeEntry);
1206 auto encDiffs = sk_make_sp<SkPDFArray>(); 1413 auto encDiffs = sk_make_sp<SkPDFArray>();
1207 encDiffs->reserve(lastGlyphID() - firstGlyphID() + 2); 1414 encDiffs->reserve(lastGlyphID() - firstGlyphID() + 2);
1208 encDiffs->appendInt(1); 1415 encDiffs->appendInt(1);
1416 SkASSERT(this->fontInfo()->fGlyphNames.count() >= this->lastGlyphID());
1209 for (int gID = firstGlyphID(); gID <= lastGlyphID(); gID++) { 1417 for (int gID = firstGlyphID(); gID <= lastGlyphID(); gID++) {
1210 encDiffs->appendName(fontInfo()->fGlyphNames->get()[gID].c_str()); 1418 encDiffs->appendName(fontInfo()->fGlyphNames[gID].c_str());
1211 } 1419 }
1212 1420
1213 auto encoding = sk_make_sp<SkPDFDict>("Encoding"); 1421 auto encoding = sk_make_sp<SkPDFDict>("Encoding");
1214 encoding->insertObject("Differences", std::move(encDiffs)); 1422 encoding->insertObject("Differences", std::move(encDiffs));
1215 this->insertObject("Encoding", std::move(encoding)); 1423 this->insertObject("Encoding", std::move(encoding));
1216 return true; 1424 return true;
1217 } 1425 }
1218 1426
1219 void SkPDFType1Font::addWidthInfoFromRange( 1427 void SkPDFType1Font::addWidthInfoFromRange(
1220 int16_t defaultWidth, 1428 int16_t defaultWidth,
1221 const SkAdvancedTypefaceMetrics::WidthRange* widthRangeEntry) { 1429 const AdvanceMetric* widthRangeEntry) {
1222 auto widthArray = sk_make_sp<SkPDFArray>(); 1430 auto widthArray = sk_make_sp<SkPDFArray>();
1223 int firstChar = 0; 1431 int firstChar = 0;
1224 if (widthRangeEntry) { 1432 if (widthRangeEntry) {
1225 const uint16_t emSize = fontInfo()->fEmSize; 1433 const uint16_t emSize = fontInfo()->fEmSize;
1226 int startIndex = firstGlyphID() - widthRangeEntry->fStartId; 1434 int startIndex = firstGlyphID() - widthRangeEntry->fStartId;
1227 int endIndex = startIndex + lastGlyphID() - firstGlyphID() + 1; 1435 int endIndex = startIndex + lastGlyphID() - firstGlyphID() + 1;
1228 if (startIndex < 0) 1436 if (startIndex < 0)
1229 startIndex = 0; 1437 startIndex = 0;
1230 if (endIndex > widthRangeEntry->fAdvance.count()) 1438 if (endIndex > widthRangeEntry->fAdvance.count())
1231 endIndex = widthRangeEntry->fAdvance.count(); 1439 endIndex = widthRangeEntry->fAdvance.count();
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
1370 } 1578 }
1371 return *canon->fCanEmbedTypeface.set(id, canEmbed); 1579 return *canon->fCanEmbedTypeface.set(id, canEmbed);
1372 } 1580 }
1373 1581
1374 void SkPDFFont::drop() { 1582 void SkPDFFont::drop() {
1375 fTypeface = nullptr; 1583 fTypeface = nullptr;
1376 fFontInfo = nullptr; 1584 fFontInfo = nullptr;
1377 fDescriptor = nullptr; 1585 fDescriptor = nullptr;
1378 this->SkPDFDict::drop(); 1586 this->SkPDFDict::drop();
1379 } 1587 }
OLDNEW
« no previous file with comments | « src/core/SkAdvancedTypefaceMetrics.cpp ('k') | src/pdf/SkPDFFontImpl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698