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

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

Issue 1316233002: Style Change: NULL->nullptr (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: 2015-08-27 (Thursday) 10:25:06 EDT Created 5 years, 3 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/pdf/SkPDFFont.h ('k') | src/pdf/SkPDFFormXObject.cpp » ('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 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 } 70 }
71 71
72 bool parsePFB(const uint8_t* src, size_t size, size_t* headerLen, 72 bool parsePFB(const uint8_t* src, size_t size, size_t* headerLen,
73 size_t* dataLen, size_t* trailerLen) { 73 size_t* dataLen, size_t* trailerLen) {
74 const uint8_t* srcPtr = src; 74 const uint8_t* srcPtr = src;
75 size_t remaining = size; 75 size_t remaining = size;
76 76
77 return parsePFBSection(&srcPtr, &remaining, 1, headerLen) && 77 return parsePFBSection(&srcPtr, &remaining, 1, headerLen) &&
78 parsePFBSection(&srcPtr, &remaining, 2, dataLen) && 78 parsePFBSection(&srcPtr, &remaining, 2, dataLen) &&
79 parsePFBSection(&srcPtr, &remaining, 1, trailerLen) && 79 parsePFBSection(&srcPtr, &remaining, 1, trailerLen) &&
80 parsePFBSection(&srcPtr, &remaining, 3, NULL); 80 parsePFBSection(&srcPtr, &remaining, 3, nullptr);
81 } 81 }
82 82
83 /* The sections of a PFA file are implicitly defined. The body starts 83 /* The sections of a PFA file are implicitly defined. The body starts
84 * after the line containing "eexec," and the trailer starts with 512 84 * after the line containing "eexec," and the trailer starts with 512
85 * literal 0's followed by "cleartomark" (plus arbitrary white space). 85 * literal 0's followed by "cleartomark" (plus arbitrary white space).
86 * 86 *
87 * This function assumes that src is NUL terminated, but the NUL 87 * This function assumes that src is NUL terminated, but the NUL
88 * termination is not included in size. 88 * termination is not included in size.
89 * 89 *
90 */ 90 */
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 155
156 static SkData* handle_type1_stream(SkStream* srcStream, size_t* headerLen, 156 static SkData* handle_type1_stream(SkStream* srcStream, size_t* headerLen,
157 size_t* dataLen, size_t* trailerLen) { 157 size_t* dataLen, size_t* trailerLen) {
158 // srcStream may be backed by a file or a unseekable fd, so we may not be 158 // srcStream may be backed by a file or a unseekable fd, so we may not be
159 // able to use skip(), rewind(), or getMemoryBase(). read()ing through 159 // able to use skip(), rewind(), or getMemoryBase(). read()ing through
160 // the input only once is doable, but very ugly. Furthermore, it'd be nice 160 // the input only once is doable, but very ugly. Furthermore, it'd be nice
161 // if the data was NUL terminated so that we can use strstr() to search it. 161 // if the data was NUL terminated so that we can use strstr() to search it.
162 // Make as few copies as possible given these constraints. 162 // Make as few copies as possible given these constraints.
163 SkDynamicMemoryWStream dynamicStream; 163 SkDynamicMemoryWStream dynamicStream;
164 SkAutoTDelete<SkMemoryStream> staticStream; 164 SkAutoTDelete<SkMemoryStream> staticStream;
165 SkData* data = NULL; 165 SkData* data = nullptr;
166 const uint8_t* src; 166 const uint8_t* src;
167 size_t srcLen; 167 size_t srcLen;
168 if ((srcLen = srcStream->getLength()) > 0) { 168 if ((srcLen = srcStream->getLength()) > 0) {
169 staticStream.reset(new SkMemoryStream(srcLen + 1)); 169 staticStream.reset(new SkMemoryStream(srcLen + 1));
170 src = (const uint8_t*)staticStream->getMemoryBase(); 170 src = (const uint8_t*)staticStream->getMemoryBase();
171 if (srcStream->getMemoryBase() != NULL) { 171 if (srcStream->getMemoryBase() != nullptr) {
172 memcpy((void *)src, srcStream->getMemoryBase(), srcLen); 172 memcpy((void *)src, srcStream->getMemoryBase(), srcLen);
173 } else { 173 } else {
174 size_t read = 0; 174 size_t read = 0;
175 while (read < srcLen) { 175 while (read < srcLen) {
176 size_t got = srcStream->read((void *)staticStream->getAtPos(), 176 size_t got = srcStream->read((void *)staticStream->getAtPos(),
177 srcLen - read); 177 srcLen - read);
178 if (got == 0) { 178 if (got == 0) {
179 return NULL; 179 return nullptr;
180 } 180 }
181 read += got; 181 read += got;
182 staticStream->seek(read); 182 staticStream->seek(read);
183 } 183 }
184 } 184 }
185 ((uint8_t *)src)[srcLen] = 0; 185 ((uint8_t *)src)[srcLen] = 0;
186 } else { 186 } else {
187 static const size_t kBufSize = 4096; 187 static const size_t kBufSize = 4096;
188 uint8_t buf[kBufSize]; 188 uint8_t buf[kBufSize];
189 size_t amount; 189 size_t amount;
190 while ((amount = srcStream->read(buf, kBufSize)) > 0) { 190 while ((amount = srcStream->read(buf, kBufSize)) > 0) {
191 dynamicStream.write(buf, amount); 191 dynamicStream.write(buf, amount);
192 } 192 }
193 amount = 0; 193 amount = 0;
194 dynamicStream.write(&amount, 1); // NULL terminator. 194 dynamicStream.write(&amount, 1); // nullptr terminator.
195 data = dynamicStream.copyToData(); 195 data = dynamicStream.copyToData();
196 src = data->bytes(); 196 src = data->bytes();
197 srcLen = data->size() - 1; 197 srcLen = data->size() - 1;
198 } 198 }
199 199
200 // this handles releasing the data we may have gotten from dynamicStream. 200 // this handles releasing the data we may have gotten from dynamicStream.
201 // if data is null, it is a no-op 201 // if data is null, it is a no-op
202 SkAutoDataUnref aud(data); 202 SkAutoDataUnref aud(data);
203 203
204 if (parsePFB(src, srcLen, headerLen, dataLen, trailerLen)) { 204 if (parsePFB(src, srcLen, headerLen, dataLen, trailerLen)) {
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 if (!highNibble) { 261 if (!highNibble) {
262 resultData[outputOffset++] = dataByte; 262 resultData[outputOffset++] = dataByte;
263 } 263 }
264 SkASSERT(outputOffset == *dataLen); 264 SkASSERT(outputOffset == *dataLen);
265 265
266 uint8_t* const resultTrailer = &(buffer[SkToInt(*headerLen + outputOffse t)]); 266 uint8_t* const resultTrailer = &(buffer[SkToInt(*headerLen + outputOffse t)]);
267 memcpy(resultTrailer, src + *headerLen + hexDataLen, *trailerLen); 267 memcpy(resultTrailer, src + *headerLen + hexDataLen, *trailerLen);
268 268
269 return SkData::NewFromMalloc(buffer.detach(), length); 269 return SkData::NewFromMalloc(buffer.detach(), length);
270 } 270 }
271 return NULL; 271 return nullptr;
272 } 272 }
273 273
274 // scale from em-units to base-1000, returning as a SkScalar 274 // scale from em-units to base-1000, returning as a SkScalar
275 SkScalar scaleFromFontUnits(int16_t val, uint16_t emSize) { 275 SkScalar scaleFromFontUnits(int16_t val, uint16_t emSize) {
276 SkScalar scaled = SkIntToScalar(val); 276 SkScalar scaled = SkIntToScalar(val);
277 if (emSize == 1000) { 277 if (emSize == 1000) {
278 return scaled; 278 return scaled;
279 } else { 279 } else {
280 return SkScalarMulDiv(scaled, 1000, emSize); 280 return SkScalarMulDiv(scaled, 1000, emSize);
281 } 281 }
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
322 } 322 }
323 323
324 template <typename Data> 324 template <typename Data>
325 SkPDFArray* composeAdvanceData( 325 SkPDFArray* composeAdvanceData(
326 SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* advanceInfo, 326 SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* advanceInfo,
327 uint16_t emSize, 327 uint16_t emSize,
328 SkPDFArray* (*appendAdvance)(const Data& advance, uint16_t emSize, 328 SkPDFArray* (*appendAdvance)(const Data& advance, uint16_t emSize,
329 SkPDFArray* array), 329 SkPDFArray* array),
330 Data* defaultAdvance) { 330 Data* defaultAdvance) {
331 SkPDFArray* result = new SkPDFArray(); 331 SkPDFArray* result = new SkPDFArray();
332 for (; advanceInfo != NULL; advanceInfo = advanceInfo->fNext.get()) { 332 for (; advanceInfo != nullptr; advanceInfo = advanceInfo->fNext.get()) {
333 switch (advanceInfo->fType) { 333 switch (advanceInfo->fType) {
334 case SkAdvancedTypefaceMetrics::WidthRange::kDefault: { 334 case SkAdvancedTypefaceMetrics::WidthRange::kDefault: {
335 SkASSERT(advanceInfo->fAdvance.count() == 1); 335 SkASSERT(advanceInfo->fAdvance.count() == 1);
336 *defaultAdvance = advanceInfo->fAdvance[0]; 336 *defaultAdvance = advanceInfo->fAdvance[0];
337 break; 337 break;
338 } 338 }
339 case SkAdvancedTypefaceMetrics::WidthRange::kRange: { 339 case SkAdvancedTypefaceMetrics::WidthRange::kRange: {
340 SkAutoTUnref<SkPDFArray> advanceArray(new SkPDFArray()); 340 SkAutoTUnref<SkPDFArray> advanceArray(new SkPDFArray());
341 for (int j = 0; j < advanceInfo->fAdvance.count(); j++) 341 for (int j = 0; j < advanceInfo->fAdvance.count(); j++)
342 appendAdvance(advanceInfo->fAdvance[j], emSize, 342 appendAdvance(advanceInfo->fAdvance[j], emSize,
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
513 SkTDArray<BFChar> bfcharEntries; 513 SkTDArray<BFChar> bfcharEntries;
514 SkTDArray<BFRange> bfrangeEntries; 514 SkTDArray<BFRange> bfrangeEntries;
515 515
516 BFRange currentRangeEntry = {0, 0, 0}; 516 BFRange currentRangeEntry = {0, 0, 0};
517 bool rangeEmpty = true; 517 bool rangeEmpty = true;
518 const int limit = 518 const int limit =
519 SkMin32(lastGlyphID + 1, glyphToUnicode.count()) - glyphOffset; 519 SkMin32(lastGlyphID + 1, glyphToUnicode.count()) - glyphOffset;
520 520
521 for (int i = firstGlyphID - glyphOffset; i < limit + 1; ++i) { 521 for (int i = firstGlyphID - glyphOffset; i < limit + 1; ++i) {
522 bool inSubset = i < limit && 522 bool inSubset = i < limit &&
523 (subset == NULL || subset->has(i + glyphOffset)); 523 (subset == nullptr || subset->has(i + glyphOffset));
524 if (!rangeEmpty) { 524 if (!rangeEmpty) {
525 // PDF spec requires bfrange not changing the higher byte, 525 // PDF spec requires bfrange not changing the higher byte,
526 // e.g. <1035> <10FF> <2222> is ok, but 526 // e.g. <1035> <10FF> <2222> is ok, but
527 // <1035> <1100> <2222> is no good 527 // <1035> <1100> <2222> is no good
528 bool inRange = 528 bool inRange =
529 i == currentRangeEntry.fEnd + 1 && 529 i == currentRangeEntry.fEnd + 1 &&
530 i >> 8 == currentRangeEntry.fStart >> 8 && 530 i >> 8 == currentRangeEntry.fStart >> 8 &&
531 i < limit && 531 i < limit &&
532 glyphToUnicode[i + glyphOffset] == 532 glyphToUnicode[i + glyphOffset] ==
533 currentRangeEntry.fUnicode + i - currentRangeEntry.fStart; 533 currentRangeEntry.fUnicode + i - currentRangeEntry.fStart;
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
589 const SkTypeface* typeface, 589 const SkTypeface* typeface,
590 const SkTDArray<uint32_t>& subset, 590 const SkTDArray<uint32_t>& subset,
591 SkPDFStream** fontStream) { 591 SkPDFStream** fontStream) {
592 int ttcIndex; 592 int ttcIndex;
593 SkAutoTDelete<SkStream> fontData(typeface->openStream(&ttcIndex)); 593 SkAutoTDelete<SkStream> fontData(typeface->openStream(&ttcIndex));
594 SkASSERT(fontData.get()); 594 SkASSERT(fontData.get());
595 595
596 size_t fontSize = fontData->getLength(); 596 size_t fontSize = fontData->getLength();
597 597
598 // Read font into buffer. 598 // Read font into buffer.
599 SkPDFStream* subsetFontStream = NULL; 599 SkPDFStream* subsetFontStream = nullptr;
600 SkTDArray<unsigned char> originalFont; 600 SkTDArray<unsigned char> originalFont;
601 originalFont.setCount(SkToInt(fontSize)); 601 originalFont.setCount(SkToInt(fontSize));
602 if (fontData->read(originalFont.begin(), fontSize) == fontSize) { 602 if (fontData->read(originalFont.begin(), fontSize) == fontSize) {
603 unsigned char* subsetFont = NULL; 603 unsigned char* subsetFont = nullptr;
604 // sfntly requires unsigned int* to be passed in, as far as we know, 604 // sfntly requires unsigned int* to be passed in, as far as we know,
605 // unsigned int is equivalent to uint32_t on all platforms. 605 // unsigned int is equivalent to uint32_t on all platforms.
606 static_assert(sizeof(unsigned int) == sizeof(uint32_t), "unsigned_int_no t_32_bits"); 606 static_assert(sizeof(unsigned int) == sizeof(uint32_t), "unsigned_int_no t_32_bits");
607 int subsetFontSize = SfntlyWrapper::SubsetFont(fontName, 607 int subsetFontSize = SfntlyWrapper::SubsetFont(fontName,
608 originalFont.begin(), 608 originalFont.begin(),
609 fontSize, 609 fontSize,
610 subset.begin(), 610 subset.begin(),
611 subset.count(), 611 subset.count(),
612 &subsetFont); 612 &subsetFont);
613 if (subsetFontSize > 0 && subsetFont != NULL) { 613 if (subsetFontSize > 0 && subsetFont != nullptr) {
614 SkAutoDataUnref data(SkData::NewWithProc(subsetFont, 614 SkAutoDataUnref data(SkData::NewWithProc(subsetFont,
615 subsetFontSize, 615 subsetFontSize,
616 sk_delete_array, 616 sk_delete_array,
617 NULL)); 617 nullptr));
618 subsetFontStream = new SkPDFStream(data.get()); 618 subsetFontStream = new SkPDFStream(data.get());
619 fontSize = subsetFontSize; 619 fontSize = subsetFontSize;
620 } 620 }
621 } 621 }
622 if (subsetFontStream) { 622 if (subsetFontStream) {
623 *fontStream = subsetFontStream; 623 *fontStream = subsetFontStream;
624 return fontSize; 624 return fontSize;
625 } 625 }
626 fontData->rewind(); 626 fontData->rewind();
627 627
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
664 : fFont(font), 664 : fFont(font),
665 fGlyphSet(glyphSet) { 665 fGlyphSet(glyphSet) {
666 } 666 }
667 667
668 SkPDFGlyphSetMap::F2BIter::F2BIter(const SkPDFGlyphSetMap& map) { 668 SkPDFGlyphSetMap::F2BIter::F2BIter(const SkPDFGlyphSetMap& map) {
669 reset(map); 669 reset(map);
670 } 670 }
671 671
672 const SkPDFGlyphSetMap::FontGlyphSetPair* SkPDFGlyphSetMap::F2BIter::next() cons t { 672 const SkPDFGlyphSetMap::FontGlyphSetPair* SkPDFGlyphSetMap::F2BIter::next() cons t {
673 if (fIndex >= fMap->count()) { 673 if (fIndex >= fMap->count()) {
674 return NULL; 674 return nullptr;
675 } 675 }
676 return &((*fMap)[fIndex++]); 676 return &((*fMap)[fIndex++]);
677 } 677 }
678 678
679 void SkPDFGlyphSetMap::F2BIter::reset(const SkPDFGlyphSetMap& map) { 679 void SkPDFGlyphSetMap::F2BIter::reset(const SkPDFGlyphSetMap& map) {
680 fMap = &(map.fMap); 680 fMap = &(map.fMap);
681 fIndex = 0; 681 fIndex = 0;
682 } 682 }
683 683
684 SkPDFGlyphSetMap::SkPDFGlyphSetMap() { 684 SkPDFGlyphSetMap::SkPDFGlyphSetMap() {
685 } 685 }
686 686
687 SkPDFGlyphSetMap::~SkPDFGlyphSetMap() { 687 SkPDFGlyphSetMap::~SkPDFGlyphSetMap() {
688 reset(); 688 reset();
689 } 689 }
690 690
691 void SkPDFGlyphSetMap::merge(const SkPDFGlyphSetMap& usage) { 691 void SkPDFGlyphSetMap::merge(const SkPDFGlyphSetMap& usage) {
692 for (int i = 0; i < usage.fMap.count(); ++i) { 692 for (int i = 0; i < usage.fMap.count(); ++i) {
693 SkPDFGlyphSet* myUsage = getGlyphSetForFont(usage.fMap[i].fFont); 693 SkPDFGlyphSet* myUsage = getGlyphSetForFont(usage.fMap[i].fFont);
694 myUsage->merge(*(usage.fMap[i].fGlyphSet)); 694 myUsage->merge(*(usage.fMap[i].fGlyphSet));
695 } 695 }
696 } 696 }
697 697
698 void SkPDFGlyphSetMap::reset() { 698 void SkPDFGlyphSetMap::reset() {
699 for (int i = 0; i < fMap.count(); ++i) { 699 for (int i = 0; i < fMap.count(); ++i) {
700 delete fMap[i].fGlyphSet; // Should not be NULL. 700 delete fMap[i].fGlyphSet; // Should not be nullptr.
701 } 701 }
702 fMap.reset(); 702 fMap.reset();
703 } 703 }
704 704
705 void SkPDFGlyphSetMap::noteGlyphUsage(SkPDFFont* font, const uint16_t* glyphIDs, 705 void SkPDFGlyphSetMap::noteGlyphUsage(SkPDFFont* font, const uint16_t* glyphIDs,
706 int numGlyphs) { 706 int numGlyphs) {
707 SkPDFGlyphSet* subset = getGlyphSetForFont(font); 707 SkPDFGlyphSet* subset = getGlyphSetForFont(font);
708 if (subset) { 708 if (subset) {
709 subset->set(glyphIDs, numGlyphs); 709 subset->set(glyphIDs, numGlyphs);
710 } 710 }
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
799 SkAutoResolveDefaultTypeface autoResolve(typeface); 799 SkAutoResolveDefaultTypeface autoResolve(typeface);
800 typeface = autoResolve.get(); 800 typeface = autoResolve.get();
801 const uint32_t fontID = typeface->uniqueID(); 801 const uint32_t fontID = typeface->uniqueID();
802 802
803 SkPDFFont* relatedFont; 803 SkPDFFont* relatedFont;
804 if (SkPDFFont* pdfFont = canon->findFont(fontID, glyphID, &relatedFont)) { 804 if (SkPDFFont* pdfFont = canon->findFont(fontID, glyphID, &relatedFont)) {
805 return SkRef(pdfFont); 805 return SkRef(pdfFont);
806 } 806 }
807 807
808 SkAutoTUnref<const SkAdvancedTypefaceMetrics> fontMetrics; 808 SkAutoTUnref<const SkAdvancedTypefaceMetrics> fontMetrics;
809 SkPDFDict* relatedFontDescriptor = NULL; 809 SkPDFDict* relatedFontDescriptor = nullptr;
810 if (relatedFont) { 810 if (relatedFont) {
811 fontMetrics.reset(SkSafeRef(relatedFont->fontInfo())); 811 fontMetrics.reset(SkSafeRef(relatedFont->fontInfo()));
812 relatedFontDescriptor = relatedFont->getFontDescriptor(); 812 relatedFontDescriptor = relatedFont->getFontDescriptor();
813 813
814 // This only is to catch callers who pass invalid glyph ids. 814 // This only is to catch callers who pass invalid glyph ids.
815 // If glyph id is invalid, then we will create duplicate entries 815 // If glyph id is invalid, then we will create duplicate entries
816 // for TrueType fonts. 816 // for TrueType fonts.
817 SkAdvancedTypefaceMetrics::FontType fontType = 817 SkAdvancedTypefaceMetrics::FontType fontType =
818 fontMetrics.get() ? fontMetrics.get()->fType : 818 fontMetrics.get() ? fontMetrics.get()->fType :
819 SkAdvancedTypefaceMetrics::kOther_Font; 819 SkAdvancedTypefaceMetrics::kOther_Font;
820 820
821 if (fontType == SkAdvancedTypefaceMetrics::kType1CID_Font || 821 if (fontType == SkAdvancedTypefaceMetrics::kType1CID_Font ||
822 fontType == SkAdvancedTypefaceMetrics::kTrueType_Font) { 822 fontType == SkAdvancedTypefaceMetrics::kTrueType_Font) {
823 return SkRef(relatedFont); 823 return SkRef(relatedFont);
824 } 824 }
825 } else { 825 } else {
826 SkTypeface::PerGlyphInfo info; 826 SkTypeface::PerGlyphInfo info;
827 info = SkTypeface::kGlyphNames_PerGlyphInfo; 827 info = SkTypeface::kGlyphNames_PerGlyphInfo;
828 info = SkTBitOr<SkTypeface::PerGlyphInfo>( 828 info = SkTBitOr<SkTypeface::PerGlyphInfo>(
829 info, SkTypeface::kToUnicode_PerGlyphInfo); 829 info, SkTypeface::kToUnicode_PerGlyphInfo);
830 #if !defined (SK_SFNTLY_SUBSETTER) 830 #if !defined (SK_SFNTLY_SUBSETTER)
831 info = SkTBitOr<SkTypeface::PerGlyphInfo>( 831 info = SkTBitOr<SkTypeface::PerGlyphInfo>(
832 info, SkTypeface::kHAdvance_PerGlyphInfo); 832 info, SkTypeface::kHAdvance_PerGlyphInfo);
833 #endif 833 #endif
834 fontMetrics.reset( 834 fontMetrics.reset(
835 typeface->getAdvancedTypefaceMetrics(info, NULL, 0)); 835 typeface->getAdvancedTypefaceMetrics(info, nullptr, 0));
836 #if defined (SK_SFNTLY_SUBSETTER) 836 #if defined (SK_SFNTLY_SUBSETTER)
837 if (fontMetrics.get() && 837 if (fontMetrics.get() &&
838 fontMetrics->fType != SkAdvancedTypefaceMetrics::kTrueType_Font) { 838 fontMetrics->fType != SkAdvancedTypefaceMetrics::kTrueType_Font) {
839 // Font does not support subsetting, get new info with advance. 839 // Font does not support subsetting, get new info with advance.
840 info = SkTBitOr<SkTypeface::PerGlyphInfo>( 840 info = SkTBitOr<SkTypeface::PerGlyphInfo>(
841 info, SkTypeface::kHAdvance_PerGlyphInfo); 841 info, SkTypeface::kHAdvance_PerGlyphInfo);
842 fontMetrics.reset( 842 fontMetrics.reset(
843 typeface->getAdvancedTypefaceMetrics(info, NULL, 0)); 843 typeface->getAdvancedTypefaceMetrics(info, nullptr, 0));
844 } 844 }
845 #endif 845 #endif
846 } 846 }
847 847
848 SkPDFFont* font = SkPDFFont::Create(canon, fontMetrics.get(), typeface, 848 SkPDFFont* font = SkPDFFont::Create(canon, fontMetrics.get(), typeface,
849 glyphID, relatedFontDescriptor); 849 glyphID, relatedFontDescriptor);
850 canon->addFont(font, fontID, font->fFirstGlyphID); 850 canon->addFont(font, fontID, font->fFirstGlyphID);
851 return font; 851 return font;
852 } 852 }
853 853
854 SkPDFFont* SkPDFFont::getFontSubset(const SkPDFGlyphSet*) { 854 SkPDFFont* SkPDFFont::getFontSubset(const SkPDFGlyphSet*) {
855 return NULL; // Default: no support. 855 return nullptr; // Default: no support.
856 } 856 }
857 857
858 SkPDFFont::SkPDFFont(const SkAdvancedTypefaceMetrics* info, 858 SkPDFFont::SkPDFFont(const SkAdvancedTypefaceMetrics* info,
859 SkTypeface* typeface, 859 SkTypeface* typeface,
860 SkPDFDict* relatedFontDescriptor) 860 SkPDFDict* relatedFontDescriptor)
861 : SkPDFDict("Font") 861 : SkPDFDict("Font")
862 , fTypeface(ref_or_default(typeface)) 862 , fTypeface(ref_or_default(typeface))
863 , fFirstGlyphID(1) 863 , fFirstGlyphID(1)
864 , fLastGlyphID(info ? info->fLastGlyphID : 0) 864 , fLastGlyphID(info ? info->fLastGlyphID : 0)
865 , fFontInfo(SkSafeRef(info)) 865 , fFontInfo(SkSafeRef(info))
866 , fDescriptor(SkSafeRef(relatedFontDescriptor)) { 866 , fDescriptor(SkSafeRef(relatedFontDescriptor)) {
867 if (info == NULL || 867 if (info == nullptr ||
868 info->fFlags & SkAdvancedTypefaceMetrics::kMultiMaster_FontFlag) { 868 info->fFlags & SkAdvancedTypefaceMetrics::kMultiMaster_FontFlag) {
869 fFontType = SkAdvancedTypefaceMetrics::kOther_Font; 869 fFontType = SkAdvancedTypefaceMetrics::kOther_Font;
870 } else { 870 } else {
871 fFontType = info->fType; 871 fFontType = info->fType;
872 } 872 }
873 } 873 }
874 874
875 // static 875 // static
876 SkPDFFont* SkPDFFont::Create(SkPDFCanon* canon, 876 SkPDFFont* SkPDFFont::Create(SkPDFCanon* canon,
877 const SkAdvancedTypefaceMetrics* info, 877 const SkAdvancedTypefaceMetrics* info,
878 SkTypeface* typeface, 878 SkTypeface* typeface,
879 uint16_t glyphID, 879 uint16_t glyphID,
880 SkPDFDict* relatedFontDescriptor) { 880 SkPDFDict* relatedFontDescriptor) {
881 SkAdvancedTypefaceMetrics::FontType type = 881 SkAdvancedTypefaceMetrics::FontType type =
882 info ? info->fType : SkAdvancedTypefaceMetrics::kOther_Font; 882 info ? info->fType : SkAdvancedTypefaceMetrics::kOther_Font;
883 883
884 if (info && (info->fFlags & SkAdvancedTypefaceMetrics::kMultiMaster_FontFlag )) { 884 if (info && (info->fFlags & SkAdvancedTypefaceMetrics::kMultiMaster_FontFlag )) {
885 return new SkPDFType3Font(info, typeface, glyphID); 885 return new SkPDFType3Font(info, typeface, glyphID);
886 } 886 }
887 if (type == SkAdvancedTypefaceMetrics::kType1CID_Font || 887 if (type == SkAdvancedTypefaceMetrics::kType1CID_Font ||
888 type == SkAdvancedTypefaceMetrics::kTrueType_Font) { 888 type == SkAdvancedTypefaceMetrics::kTrueType_Font) {
889 SkASSERT(relatedFontDescriptor == NULL); 889 SkASSERT(relatedFontDescriptor == nullptr);
890 return new SkPDFType0Font(info, typeface); 890 return new SkPDFType0Font(info, typeface);
891 } 891 }
892 if (type == SkAdvancedTypefaceMetrics::kType1_Font) { 892 if (type == SkAdvancedTypefaceMetrics::kType1_Font) {
893 return new SkPDFType1Font(info, typeface, glyphID, relatedFontDescriptor ); 893 return new SkPDFType1Font(info, typeface, glyphID, relatedFontDescriptor );
894 } 894 }
895 895
896 SkASSERT(type == SkAdvancedTypefaceMetrics::kCFF_Font || 896 SkASSERT(type == SkAdvancedTypefaceMetrics::kCFF_Font ||
897 type == SkAdvancedTypefaceMetrics::kOther_Font); 897 type == SkAdvancedTypefaceMetrics::kOther_Font);
898 898
899 return new SkPDFType3Font(info, typeface, glyphID); 899 return new SkPDFType3Font(info, typeface, glyphID);
900 } 900 }
901 901
902 const SkAdvancedTypefaceMetrics* SkPDFFont::fontInfo() { 902 const SkAdvancedTypefaceMetrics* SkPDFFont::fontInfo() {
903 return fFontInfo.get(); 903 return fFontInfo.get();
904 } 904 }
905 905
906 void SkPDFFont::setFontInfo(const SkAdvancedTypefaceMetrics* info) { 906 void SkPDFFont::setFontInfo(const SkAdvancedTypefaceMetrics* info) {
907 if (info == NULL || info == fFontInfo.get()) { 907 if (info == nullptr || info == fFontInfo.get()) {
908 return; 908 return;
909 } 909 }
910 fFontInfo.reset(info); 910 fFontInfo.reset(info);
911 SkSafeRef(info); 911 SkSafeRef(info);
912 } 912 }
913 913
914 uint16_t SkPDFFont::firstGlyphID() const { 914 uint16_t SkPDFFont::firstGlyphID() const {
915 return fFirstGlyphID; 915 return fFirstGlyphID;
916 } 916 }
917 917
918 uint16_t SkPDFFont::lastGlyphID() const { 918 uint16_t SkPDFFont::lastGlyphID() const {
919 return fLastGlyphID; 919 return fLastGlyphID;
920 } 920 }
921 921
922 void SkPDFFont::setLastGlyphID(uint16_t glyphID) { 922 void SkPDFFont::setLastGlyphID(uint16_t glyphID) {
923 fLastGlyphID = glyphID; 923 fLastGlyphID = glyphID;
924 } 924 }
925 925
926 SkPDFDict* SkPDFFont::getFontDescriptor() { 926 SkPDFDict* SkPDFFont::getFontDescriptor() {
927 return fDescriptor.get(); 927 return fDescriptor.get();
928 } 928 }
929 929
930 void SkPDFFont::setFontDescriptor(SkPDFDict* descriptor) { 930 void SkPDFFont::setFontDescriptor(SkPDFDict* descriptor) {
931 fDescriptor.reset(descriptor); 931 fDescriptor.reset(descriptor);
932 SkSafeRef(descriptor); 932 SkSafeRef(descriptor);
933 } 933 }
934 934
935 bool SkPDFFont::addCommonFontDescriptorEntries(int16_t defaultWidth) { 935 bool SkPDFFont::addCommonFontDescriptorEntries(int16_t defaultWidth) {
936 if (fDescriptor.get() == NULL) { 936 if (fDescriptor.get() == nullptr) {
937 return false; 937 return false;
938 } 938 }
939 939
940 const uint16_t emSize = fFontInfo->fEmSize; 940 const uint16_t emSize = fFontInfo->fEmSize;
941 941
942 fDescriptor->insertName("FontName", fFontInfo->fFontName); 942 fDescriptor->insertName("FontName", fFontInfo->fFontName);
943 fDescriptor->insertInt("Flags", fFontInfo->fStyle | kPdfSymbolic); 943 fDescriptor->insertInt("Flags", fFontInfo->fStyle | kPdfSymbolic);
944 fDescriptor->insertScalar("Ascent", 944 fDescriptor->insertScalar("Ascent",
945 scaleFromFontUnits(fFontInfo->fAscent, emSize)); 945 scaleFromFontUnits(fFontInfo->fAscent, emSize));
946 fDescriptor->insertScalar("Descent", 946 fDescriptor->insertScalar("Descent",
(...skipping 16 matching lines...) Expand all
963 963
964 void SkPDFFont::adjustGlyphRangeForSingleByteEncoding(uint16_t glyphID) { 964 void SkPDFFont::adjustGlyphRangeForSingleByteEncoding(uint16_t glyphID) {
965 // Single byte glyph encoding supports a max of 255 glyphs. 965 // Single byte glyph encoding supports a max of 255 glyphs.
966 fFirstGlyphID = glyphID - (glyphID - 1) % 255; 966 fFirstGlyphID = glyphID - (glyphID - 1) % 255;
967 if (fLastGlyphID > fFirstGlyphID + 255 - 1) { 967 if (fLastGlyphID > fFirstGlyphID + 255 - 1) {
968 fLastGlyphID = fFirstGlyphID + 255 - 1; 968 fLastGlyphID = fFirstGlyphID + 255 - 1;
969 } 969 }
970 } 970 }
971 971
972 void SkPDFFont::populateToUnicodeTable(const SkPDFGlyphSet* subset) { 972 void SkPDFFont::populateToUnicodeTable(const SkPDFGlyphSet* subset) {
973 if (fFontInfo == NULL || fFontInfo->fGlyphToUnicode.begin() == NULL) { 973 if (fFontInfo == nullptr || fFontInfo->fGlyphToUnicode.begin() == nullptr) {
974 return; 974 return;
975 } 975 }
976 this->insertObjRef("ToUnicode", 976 this->insertObjRef("ToUnicode",
977 generate_tounicode_cmap(fFontInfo->fGlyphToUnicode, 977 generate_tounicode_cmap(fFontInfo->fGlyphToUnicode,
978 subset, 978 subset,
979 multiByteGlyphs(), 979 multiByteGlyphs(),
980 firstGlyphID(), 980 firstGlyphID(),
981 lastGlyphID())); 981 lastGlyphID()));
982 } 982 }
983 983
984 /////////////////////////////////////////////////////////////////////////////// 984 ///////////////////////////////////////////////////////////////////////////////
985 // class SkPDFType0Font 985 // class SkPDFType0Font
986 /////////////////////////////////////////////////////////////////////////////// 986 ///////////////////////////////////////////////////////////////////////////////
987 987
988 SkPDFType0Font::SkPDFType0Font(const SkAdvancedTypefaceMetrics* info, SkTypeface * typeface) 988 SkPDFType0Font::SkPDFType0Font(const SkAdvancedTypefaceMetrics* info, SkTypeface * typeface)
989 : SkPDFFont(info, typeface, NULL) { 989 : SkPDFFont(info, typeface, nullptr) {
990 SkDEBUGCODE(fPopulated = false); 990 SkDEBUGCODE(fPopulated = false);
991 if (!canSubset()) { 991 if (!canSubset()) {
992 this->populate(NULL); 992 this->populate(nullptr);
993 } 993 }
994 } 994 }
995 995
996 SkPDFType0Font::~SkPDFType0Font() {} 996 SkPDFType0Font::~SkPDFType0Font() {}
997 997
998 SkPDFFont* SkPDFType0Font::getFontSubset(const SkPDFGlyphSet* subset) { 998 SkPDFFont* SkPDFType0Font::getFontSubset(const SkPDFGlyphSet* subset) {
999 if (!canSubset()) { 999 if (!canSubset()) {
1000 return NULL; 1000 return nullptr;
1001 } 1001 }
1002 SkPDFType0Font* newSubset = new SkPDFType0Font(fontInfo(), typeface()); 1002 SkPDFType0Font* newSubset = new SkPDFType0Font(fontInfo(), typeface());
1003 newSubset->populate(subset); 1003 newSubset->populate(subset);
1004 return newSubset; 1004 return newSubset;
1005 } 1005 }
1006 1006
1007 #ifdef SK_DEBUG 1007 #ifdef SK_DEBUG
1008 void SkPDFType0Font::emitObject(SkWStream* stream, 1008 void SkPDFType0Font::emitObject(SkWStream* stream,
1009 const SkPDFObjNumMap& objNumMap, 1009 const SkPDFObjNumMap& objNumMap,
1010 const SkPDFSubstituteMap& substitutes) const { 1010 const SkPDFSubstituteMap& substitutes) const {
(...skipping 19 matching lines...) Expand all
1030 return true; 1030 return true;
1031 } 1031 }
1032 1032
1033 /////////////////////////////////////////////////////////////////////////////// 1033 ///////////////////////////////////////////////////////////////////////////////
1034 // class SkPDFCIDFont 1034 // class SkPDFCIDFont
1035 /////////////////////////////////////////////////////////////////////////////// 1035 ///////////////////////////////////////////////////////////////////////////////
1036 1036
1037 SkPDFCIDFont::SkPDFCIDFont(const SkAdvancedTypefaceMetrics* info, 1037 SkPDFCIDFont::SkPDFCIDFont(const SkAdvancedTypefaceMetrics* info,
1038 SkTypeface* typeface, 1038 SkTypeface* typeface,
1039 const SkPDFGlyphSet* subset) 1039 const SkPDFGlyphSet* subset)
1040 : SkPDFFont(info, typeface, NULL) { 1040 : SkPDFFont(info, typeface, nullptr) {
1041 this->populate(subset); 1041 this->populate(subset);
1042 } 1042 }
1043 1043
1044 SkPDFCIDFont::~SkPDFCIDFont() {} 1044 SkPDFCIDFont::~SkPDFCIDFont() {}
1045 1045
1046 bool SkPDFCIDFont::addFontDescriptor(int16_t defaultWidth, 1046 bool SkPDFCIDFont::addFontDescriptor(int16_t defaultWidth,
1047 const SkTDArray<uint32_t>* subset) { 1047 const SkTDArray<uint32_t>* subset) {
1048 SkAutoTUnref<SkPDFDict> descriptor(new SkPDFDict("FontDescriptor")); 1048 SkAutoTUnref<SkPDFDict> descriptor(new SkPDFDict("FontDescriptor"));
1049 setFontDescriptor(descriptor.get()); 1049 setFontDescriptor(descriptor.get());
1050 if (!addCommonFontDescriptorEntries(defaultWidth)) { 1050 if (!addCommonFontDescriptorEntries(defaultWidth)) {
1051 this->insertObjRef("FontDescriptor", descriptor.detach()); 1051 this->insertObjRef("FontDescriptor", descriptor.detach());
1052 return false; 1052 return false;
1053 } 1053 }
1054 if (!canEmbed()) { 1054 if (!canEmbed()) {
1055 this->insertObjRef("FontDescriptor", descriptor.detach()); 1055 this->insertObjRef("FontDescriptor", descriptor.detach());
1056 return true; 1056 return true;
1057 } 1057 }
1058 1058
1059 switch (getType()) { 1059 switch (getType()) {
1060 case SkAdvancedTypefaceMetrics::kTrueType_Font: { 1060 case SkAdvancedTypefaceMetrics::kTrueType_Font: {
1061 size_t fontSize = 0; 1061 size_t fontSize = 0;
1062 #if defined(SK_SFNTLY_SUBSETTER) 1062 #if defined(SK_SFNTLY_SUBSETTER)
1063 if (this->canSubset()) { 1063 if (this->canSubset()) {
1064 SkAutoTUnref<SkPDFStream> fontStream; 1064 SkAutoTUnref<SkPDFStream> fontStream;
1065 SkPDFStream* rawStream = NULL; 1065 SkPDFStream* rawStream = nullptr;
1066 fontSize = get_subset_font_stream(fontInfo()->fFontName.c_str(), 1066 fontSize = get_subset_font_stream(fontInfo()->fFontName.c_str(),
1067 typeface(), 1067 typeface(),
1068 *subset, 1068 *subset,
1069 &rawStream); 1069 &rawStream);
1070 if (rawStream) { 1070 if (rawStream) {
1071 fontStream.reset(rawStream); 1071 fontStream.reset(rawStream);
1072 fontStream->insertInt("Length1", fontSize); 1072 fontStream->insertInt("Length1", fontSize);
1073 descriptor->insertObjRef("FontFile2", fontStream.detach()); 1073 descriptor->insertObjRef("FontFile2", fontStream.detach());
1074 break; 1074 break;
1075 } 1075 }
1076 } 1076 }
1077 #endif 1077 #endif
1078 SkAutoTUnref<SkPDFSharedStream> fontStream; 1078 SkAutoTUnref<SkPDFSharedStream> fontStream;
1079 SkAutoTDelete<SkStreamAsset> fontData( 1079 SkAutoTDelete<SkStreamAsset> fontData(
1080 this->typeface()->openStream(NULL)); 1080 this->typeface()->openStream(nullptr));
1081 SkASSERT(fontData); 1081 SkASSERT(fontData);
1082 fontSize = fontData->getLength(); 1082 fontSize = fontData->getLength();
1083 SkASSERT(fontSize > 0); 1083 SkASSERT(fontSize > 0);
1084 fontStream.reset(new SkPDFSharedStream(fontData.detach())); 1084 fontStream.reset(new SkPDFSharedStream(fontData.detach()));
1085 fontStream->dict()->insertInt("Length1", fontSize); 1085 fontStream->dict()->insertInt("Length1", fontSize);
1086 descriptor->insertObjRef("FontFile2", fontStream.detach()); 1086 descriptor->insertObjRef("FontFile2", fontStream.detach());
1087 break; 1087 break;
1088 } 1088 }
1089 case SkAdvancedTypefaceMetrics::kCFF_Font: 1089 case SkAdvancedTypefaceMetrics::kCFF_Font:
1090 case SkAdvancedTypefaceMetrics::kType1CID_Font: { 1090 case SkAdvancedTypefaceMetrics::kType1CID_Font: {
1091 SkAutoTUnref<SkPDFSharedStream> fontStream( 1091 SkAutoTUnref<SkPDFSharedStream> fontStream(
1092 new SkPDFSharedStream(this->typeface()->openStream(NULL))); 1092 new SkPDFSharedStream(this->typeface()->openStream(nullptr)) );
1093 1093
1094 if (getType() == SkAdvancedTypefaceMetrics::kCFF_Font) { 1094 if (getType() == SkAdvancedTypefaceMetrics::kCFF_Font) {
1095 fontStream->dict()->insertName("Subtype", "Type1C"); 1095 fontStream->dict()->insertName("Subtype", "Type1C");
1096 } else { 1096 } else {
1097 fontStream->dict()->insertName("Subtype", "CIDFontType0c"); 1097 fontStream->dict()->insertName("Subtype", "CIDFontType0c");
1098 } 1098 }
1099 descriptor->insertObjRef("FontFile3", fontStream.detach()); 1099 descriptor->insertObjRef("FontFile3", fontStream.detach());
1100 break; 1100 break;
1101 } 1101 }
1102 default: 1102 default:
(...skipping 13 matching lines...) Expand all
1116 if (!subset->has(0)) { 1116 if (!subset->has(0)) {
1117 glyphIDs.push(0); 1117 glyphIDs.push(0);
1118 } 1118 }
1119 subset->exportTo(&glyphIDs); 1119 subset->exportTo(&glyphIDs);
1120 } 1120 }
1121 1121
1122 SkTypeface::PerGlyphInfo info; 1122 SkTypeface::PerGlyphInfo info;
1123 info = SkTypeface::kGlyphNames_PerGlyphInfo; 1123 info = SkTypeface::kGlyphNames_PerGlyphInfo;
1124 info = SkTBitOr<SkTypeface::PerGlyphInfo>( 1124 info = SkTBitOr<SkTypeface::PerGlyphInfo>(
1125 info, SkTypeface::kHAdvance_PerGlyphInfo); 1125 info, SkTypeface::kHAdvance_PerGlyphInfo);
1126 uint32_t* glyphs = (glyphIDs.count() == 0) ? NULL : glyphIDs.begin(); 1126 uint32_t* glyphs = (glyphIDs.count() == 0) ? nullptr : glyphIDs.begin();
1127 uint32_t glyphsCount = glyphs ? glyphIDs.count() : 0; 1127 uint32_t glyphsCount = glyphs ? glyphIDs.count() : 0;
1128 SkAutoTUnref<const SkAdvancedTypefaceMetrics> fontMetrics( 1128 SkAutoTUnref<const SkAdvancedTypefaceMetrics> fontMetrics(
1129 typeface()->getAdvancedTypefaceMetrics(info, glyphs, glyphsCount)); 1129 typeface()->getAdvancedTypefaceMetrics(info, glyphs, glyphsCount));
1130 setFontInfo(fontMetrics.get()); 1130 setFontInfo(fontMetrics.get());
1131 addFontDescriptor(0, &glyphIDs); 1131 addFontDescriptor(0, &glyphIDs);
1132 } else { 1132 } else {
1133 // Other CID fonts 1133 // Other CID fonts
1134 addFontDescriptor(0, NULL); 1134 addFontDescriptor(0, nullptr);
1135 } 1135 }
1136 1136
1137 insertName("BaseFont", fontInfo()->fFontName); 1137 insertName("BaseFont", fontInfo()->fFontName);
1138 1138
1139 if (getType() == SkAdvancedTypefaceMetrics::kType1CID_Font) { 1139 if (getType() == SkAdvancedTypefaceMetrics::kType1CID_Font) {
1140 insertName("Subtype", "CIDFontType0"); 1140 insertName("Subtype", "CIDFontType0");
1141 } else if (getType() == SkAdvancedTypefaceMetrics::kTrueType_Font) { 1141 } else if (getType() == SkAdvancedTypefaceMetrics::kTrueType_Font) {
1142 insertName("Subtype", "CIDFontType2"); 1142 insertName("Subtype", "CIDFontType2");
1143 insertName("CIDToGIDMap", "Identity"); 1143 insertName("CIDToGIDMap", "Identity");
1144 } else { 1144 } else {
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1212 SkAutoTUnref<SkPDFDict> descriptor(new SkPDFDict("FontDescriptor")); 1212 SkAutoTUnref<SkPDFDict> descriptor(new SkPDFDict("FontDescriptor"));
1213 setFontDescriptor(descriptor.get()); 1213 setFontDescriptor(descriptor.get());
1214 1214
1215 int ttcIndex; 1215 int ttcIndex;
1216 size_t header SK_INIT_TO_AVOID_WARNING; 1216 size_t header SK_INIT_TO_AVOID_WARNING;
1217 size_t data SK_INIT_TO_AVOID_WARNING; 1217 size_t data SK_INIT_TO_AVOID_WARNING;
1218 size_t trailer SK_INIT_TO_AVOID_WARNING; 1218 size_t trailer SK_INIT_TO_AVOID_WARNING;
1219 SkAutoTDelete<SkStream> rawFontData(typeface()->openStream(&ttcIndex)); 1219 SkAutoTDelete<SkStream> rawFontData(typeface()->openStream(&ttcIndex));
1220 SkAutoTUnref<SkData> fontData(handle_type1_stream(rawFontData.get(), &header , 1220 SkAutoTUnref<SkData> fontData(handle_type1_stream(rawFontData.get(), &header ,
1221 &data, &trailer)); 1221 &data, &trailer));
1222 if (fontData.get() == NULL) { 1222 if (fontData.get() == nullptr) {
1223 return false; 1223 return false;
1224 } 1224 }
1225 if (canEmbed()) { 1225 if (canEmbed()) {
1226 SkAutoTUnref<SkPDFStream> fontStream(new SkPDFStream(fontData.get())); 1226 SkAutoTUnref<SkPDFStream> fontStream(new SkPDFStream(fontData.get()));
1227 fontStream->insertInt("Length1", header); 1227 fontStream->insertInt("Length1", header);
1228 fontStream->insertInt("Length2", data); 1228 fontStream->insertInt("Length2", data);
1229 fontStream->insertInt("Length3", trailer); 1229 fontStream->insertInt("Length3", trailer);
1230 descriptor->insertObjRef("FontFile", fontStream.detach()); 1230 descriptor->insertObjRef("FontFile", fontStream.detach());
1231 } 1231 }
1232 1232
1233 this->insertObjRef("FontDescriptor", descriptor.detach()); 1233 this->insertObjRef("FontDescriptor", descriptor.detach());
1234 1234
1235 return addCommonFontDescriptorEntries(defaultWidth); 1235 return addCommonFontDescriptorEntries(defaultWidth);
1236 } 1236 }
1237 1237
1238 bool SkPDFType1Font::populate(int16_t glyphID) { 1238 bool SkPDFType1Font::populate(int16_t glyphID) {
1239 SkASSERT(!fontInfo()->fVerticalMetrics.get()); 1239 SkASSERT(!fontInfo()->fVerticalMetrics.get());
1240 SkASSERT(fontInfo()->fGlyphWidths.get()); 1240 SkASSERT(fontInfo()->fGlyphWidths.get());
1241 1241
1242 adjustGlyphRangeForSingleByteEncoding(glyphID); 1242 adjustGlyphRangeForSingleByteEncoding(glyphID);
1243 1243
1244 int16_t defaultWidth = 0; 1244 int16_t defaultWidth = 0;
1245 const SkAdvancedTypefaceMetrics::WidthRange* widthRangeEntry = NULL; 1245 const SkAdvancedTypefaceMetrics::WidthRange* widthRangeEntry = nullptr;
1246 const SkAdvancedTypefaceMetrics::WidthRange* widthEntry; 1246 const SkAdvancedTypefaceMetrics::WidthRange* widthEntry;
1247 for (widthEntry = fontInfo()->fGlyphWidths.get(); 1247 for (widthEntry = fontInfo()->fGlyphWidths.get();
1248 widthEntry != NULL; 1248 widthEntry != nullptr;
1249 widthEntry = widthEntry->fNext.get()) { 1249 widthEntry = widthEntry->fNext.get()) {
1250 switch (widthEntry->fType) { 1250 switch (widthEntry->fType) {
1251 case SkAdvancedTypefaceMetrics::WidthRange::kDefault: 1251 case SkAdvancedTypefaceMetrics::WidthRange::kDefault:
1252 defaultWidth = widthEntry->fAdvance[0]; 1252 defaultWidth = widthEntry->fAdvance[0];
1253 break; 1253 break;
1254 case SkAdvancedTypefaceMetrics::WidthRange::kRun: 1254 case SkAdvancedTypefaceMetrics::WidthRange::kRun:
1255 SkASSERT(false); 1255 SkASSERT(false);
1256 break; 1256 break;
1257 case SkAdvancedTypefaceMetrics::WidthRange::kRange: 1257 case SkAdvancedTypefaceMetrics::WidthRange::kRange:
1258 SkASSERT(widthRangeEntry == NULL); 1258 SkASSERT(widthRangeEntry == nullptr);
1259 widthRangeEntry = widthEntry; 1259 widthRangeEntry = widthEntry;
1260 break; 1260 break;
1261 } 1261 }
1262 } 1262 }
1263 1263
1264 if (!addFontDescriptor(defaultWidth)) { 1264 if (!addFontDescriptor(defaultWidth)) {
1265 return false; 1265 return false;
1266 } 1266 }
1267 1267
1268 insertName("Subtype", "Type1"); 1268 insertName("Subtype", "Type1");
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1313 this->insertObject("Widths", widthArray.detach()); 1313 this->insertObject("Widths", widthArray.detach());
1314 } 1314 }
1315 1315
1316 /////////////////////////////////////////////////////////////////////////////// 1316 ///////////////////////////////////////////////////////////////////////////////
1317 // class SkPDFType3Font 1317 // class SkPDFType3Font
1318 /////////////////////////////////////////////////////////////////////////////// 1318 ///////////////////////////////////////////////////////////////////////////////
1319 1319
1320 SkPDFType3Font::SkPDFType3Font(const SkAdvancedTypefaceMetrics* info, 1320 SkPDFType3Font::SkPDFType3Font(const SkAdvancedTypefaceMetrics* info,
1321 SkTypeface* typeface, 1321 SkTypeface* typeface,
1322 uint16_t glyphID) 1322 uint16_t glyphID)
1323 : SkPDFFont(info, typeface, NULL) { 1323 : SkPDFFont(info, typeface, nullptr) {
1324 this->populate(glyphID); 1324 this->populate(glyphID);
1325 } 1325 }
1326 1326
1327 SkPDFType3Font::~SkPDFType3Font() {} 1327 SkPDFType3Font::~SkPDFType3Font() {}
1328 1328
1329 bool SkPDFType3Font::populate(uint16_t glyphID) { 1329 bool SkPDFType3Font::populate(uint16_t glyphID) {
1330 SkPaint paint; 1330 SkPaint paint;
1331 paint.setTypeface(typeface()); 1331 paint.setTypeface(typeface());
1332 paint.setTextSize(1000); 1332 paint.setTextSize(1000);
1333 const SkSurfaceProps props(0, kUnknown_SkPixelGeometry); 1333 const SkSurfaceProps props(0, kUnknown_SkPixelGeometry);
1334 SkAutoGlyphCache autoCache(paint, &props, NULL); 1334 SkAutoGlyphCache autoCache(paint, &props, nullptr);
1335 SkGlyphCache* cache = autoCache.getCache(); 1335 SkGlyphCache* cache = autoCache.getCache();
1336 // If fLastGlyphID isn't set (because there is not fFontInfo), look it up. 1336 // If fLastGlyphID isn't set (because there is not fFontInfo), look it up.
1337 if (lastGlyphID() == 0) { 1337 if (lastGlyphID() == 0) {
1338 setLastGlyphID(cache->getGlyphCount() - 1); 1338 setLastGlyphID(cache->getGlyphCount() - 1);
1339 } 1339 }
1340 1340
1341 adjustGlyphRangeForSingleByteEncoding(glyphID); 1341 adjustGlyphRangeForSingleByteEncoding(glyphID);
1342 1342
1343 insertName("Subtype", "Type3"); 1343 insertName("Subtype", "Type3");
1344 // Flip about the x-axis and scale by 1/1000. 1344 // Flip about the x-axis and scale by 1/1000.
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1387 1387
1388 this->insertObject("CharProcs", charProcs.detach()); 1388 this->insertObject("CharProcs", charProcs.detach());
1389 this->insertObject("Encoding", encoding.detach()); 1389 this->insertObject("Encoding", encoding.detach());
1390 1390
1391 this->insertObject("FontBBox", makeFontBBox(bbox, 1000)); 1391 this->insertObject("FontBBox", makeFontBBox(bbox, 1000));
1392 this->insertInt("FirstChar", 1); 1392 this->insertInt("FirstChar", 1);
1393 this->insertInt("LastChar", lastGlyphID() - firstGlyphID() + 1); 1393 this->insertInt("LastChar", lastGlyphID() - firstGlyphID() + 1);
1394 this->insertObject("Widths", widthArray.detach()); 1394 this->insertObject("Widths", widthArray.detach());
1395 this->insertName("CIDToGIDMap", "Identity"); 1395 this->insertName("CIDToGIDMap", "Identity");
1396 1396
1397 this->populateToUnicodeTable(NULL); 1397 this->populateToUnicodeTable(nullptr);
1398 return true; 1398 return true;
1399 } 1399 }
1400 1400
1401 SkPDFFont::Match SkPDFFont::IsMatch(SkPDFFont* existingFont, 1401 SkPDFFont::Match SkPDFFont::IsMatch(SkPDFFont* existingFont,
1402 uint32_t existingFontID, 1402 uint32_t existingFontID,
1403 uint16_t existingGlyphID, 1403 uint16_t existingGlyphID,
1404 uint32_t searchFontID, 1404 uint32_t searchFontID,
1405 uint16_t searchGlyphID) { 1405 uint16_t searchGlyphID) {
1406 if (existingFontID != searchFontID) { 1406 if (existingFontID != searchFontID) {
1407 return SkPDFFont::kNot_Match; 1407 return SkPDFFont::kNot_Match;
1408 } 1408 }
1409 if (existingGlyphID == 0 || searchGlyphID == 0) { 1409 if (existingGlyphID == 0 || searchGlyphID == 0) {
1410 return SkPDFFont::kExact_Match; 1410 return SkPDFFont::kExact_Match;
1411 } 1411 }
1412 if (existingFont != NULL) { 1412 if (existingFont != nullptr) {
1413 return (existingFont->fFirstGlyphID <= searchGlyphID && 1413 return (existingFont->fFirstGlyphID <= searchGlyphID &&
1414 searchGlyphID <= existingFont->fLastGlyphID) 1414 searchGlyphID <= existingFont->fLastGlyphID)
1415 ? SkPDFFont::kExact_Match 1415 ? SkPDFFont::kExact_Match
1416 : SkPDFFont::kRelated_Match; 1416 : SkPDFFont::kRelated_Match;
1417 } 1417 }
1418 return (existingGlyphID == searchGlyphID) ? SkPDFFont::kExact_Match 1418 return (existingGlyphID == searchGlyphID) ? SkPDFFont::kExact_Match
1419 : SkPDFFont::kRelated_Match; 1419 : SkPDFFont::kRelated_Match;
1420 } 1420 }
OLDNEW
« no previous file with comments | « src/pdf/SkPDFFont.h ('k') | src/pdf/SkPDFFormXObject.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698