OLD | NEW |
---|---|
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 "SkData.h" | 8 #include "SkData.h" |
9 #include "SkGlyphCache.h" | 9 #include "SkGlyphCache.h" |
10 #include "SkPaint.h" | 10 #include "SkPaint.h" |
(...skipping 11 matching lines...) Expand all Loading... | |
22 #include "SkUtils.h" | 22 #include "SkUtils.h" |
23 | 23 |
24 #ifdef SK_PDF_USE_SFNTLY | 24 #ifdef SK_PDF_USE_SFNTLY |
25 #include "sample/chromium/font_subsetter.h" | 25 #include "sample/chromium/font_subsetter.h" |
26 #endif | 26 #endif |
27 | 27 |
28 namespace { | 28 namespace { |
29 // PDF's notion of symbolic vs non-symbolic is related to the character set, not | 29 // PDF's notion of symbolic vs non-symbolic is related to the character set, not |
30 // symbols vs. characters. Rarely is a font the right character set to call it | 30 // symbols vs. characters. Rarely is a font the right character set to call it |
31 // non-symbolic, so always call it symbolic. (PDF 1.4 spec, section 5.7.1) | 31 // non-symbolic, so always call it symbolic. (PDF 1.4 spec, section 5.7.1) |
32 static const int kPdfSymbolic = 4; | 32 static const int32_t kPdfSymbolic = 4; |
33 | 33 |
34 struct SkPDFType0Font final : public SkPDFFont { | 34 struct SkPDFType0Font final : public SkPDFFont { |
35 SkPDFType0Font(SkPDFFont::Info, const SkAdvancedTypefaceMetrics&); | 35 SkPDFType0Font(SkPDFFont::Info, const SkAdvancedTypefaceMetrics&); |
36 virtual ~SkPDFType0Font(); | 36 virtual ~SkPDFType0Font(); |
37 void getFontSubset(SkPDFCanon*) override; | 37 void getFontSubset(SkPDFCanon*) override; |
38 #ifdef SK_DEBUG | 38 #ifdef SK_DEBUG |
39 void emitObject(SkWStream*, const SkPDFObjNumMap&) const override; | 39 void emitObject(SkWStream*, const SkPDFObjNumMap&) const override; |
40 bool fPopulated; | 40 bool fPopulated; |
41 #endif | 41 #endif |
42 typedef SkPDFDict INHERITED; | 42 typedef SkPDFDict INHERITED; |
(...skipping 376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
419 if (type == SkAdvancedTypefaceMetrics::kType1CID_Font) { | 419 if (type == SkAdvancedTypefaceMetrics::kType1CID_Font) { |
420 newCIDFont->insertName("Subtype", "CIDFontType0"); | 420 newCIDFont->insertName("Subtype", "CIDFontType0"); |
421 } else if (type == SkAdvancedTypefaceMetrics::kTrueType_Font) { | 421 } else if (type == SkAdvancedTypefaceMetrics::kTrueType_Font) { |
422 newCIDFont->insertName("Subtype", "CIDFontType2"); | 422 newCIDFont->insertName("Subtype", "CIDFontType2"); |
423 newCIDFont->insertName("CIDToGIDMap", "Identity"); | 423 newCIDFont->insertName("CIDToGIDMap", "Identity"); |
424 } else { | 424 } else { |
425 SkASSERT(false); | 425 SkASSERT(false); |
426 } | 426 } |
427 | 427 |
428 auto sysInfo = sk_make_sp<SkPDFDict>(); | 428 auto sysInfo = sk_make_sp<SkPDFDict>(); |
429 sysInfo->insertString("Registry", "Adobe"); | 429 sysInfo->insertString("Registry", "Skia"); |
Rik
2016/09/01 17:41:21
This change isn't needed
| |
430 sysInfo->insertString("Ordering", "Identity"); | 430 // TODO: Registry+Ordering should be globally unique! |
431 sysInfo->insertString("Ordering", "SkiaOrdering"); | |
Rik
2016/09/01 17:41:21
Neither is this one
| |
431 sysInfo->insertInt("Supplement", 0); | 432 sysInfo->insertInt("Supplement", 0); |
432 newCIDFont->insertObject("CIDSystemInfo", std::move(sysInfo)); | 433 newCIDFont->insertObject("CIDSystemInfo", std::move(sysInfo)); |
433 | 434 |
434 uint16_t emSize = metrics.fEmSize; | 435 uint16_t emSize = metrics.fEmSize; |
435 int16_t defaultWidth = 0; | 436 int16_t defaultWidth = 0; |
436 { | 437 { |
437 SkAutoGlyphCache glyphCache = vector_cache(face); | 438 SkAutoGlyphCache glyphCache = vector_cache(face); |
438 sk_sp<SkPDFArray> widths = SkPDFMakeCIDGlyphWidthsArray( | 439 sk_sp<SkPDFArray> widths = SkPDFMakeCIDGlyphWidthsArray( |
439 glyphCache.get(), &this->glyphUsage(), emSize, &defaultWidth); | 440 glyphCache.get(), &this->glyphUsage(), emSize, &defaultWidth); |
440 if (widths && widths->size() > 0) { | 441 if (widths && widths->size() > 0) { |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
590 }; | 591 }; |
591 } | 592 } |
592 | 593 |
593 static void add_type3_font_info(SkPDFCanon* canon, | 594 static void add_type3_font_info(SkPDFCanon* canon, |
594 SkPDFDict* font, | 595 SkPDFDict* font, |
595 SkTypeface* typeface, | 596 SkTypeface* typeface, |
596 SkScalar emSize, | 597 SkScalar emSize, |
597 const SkBitSet& subset, | 598 const SkBitSet& subset, |
598 SkGlyphID firstGlyphID, | 599 SkGlyphID firstGlyphID, |
599 SkGlyphID lastGlyphID) { | 600 SkGlyphID lastGlyphID) { |
601 const SkAdvancedTypefaceMetrics* metrics = SkPDFFont::GetMetrics(typeface, c anon); | |
600 SkASSERT(lastGlyphID >= firstGlyphID); | 602 SkASSERT(lastGlyphID >= firstGlyphID); |
601 // Remove unused glyphs at the end of the range. | 603 // Remove unused glyphs at the end of the range. |
602 // Keep the lastGlyphID >= firstGlyphID invariant true. | 604 // Keep the lastGlyphID >= firstGlyphID invariant true. |
603 while (lastGlyphID > firstGlyphID && !subset.has(lastGlyphID)) { | 605 while (lastGlyphID > firstGlyphID && !subset.has(lastGlyphID)) { |
604 --lastGlyphID; | 606 --lastGlyphID; |
605 } | 607 } |
606 SkASSERT(emSize > 0.0f); | 608 SkASSERT(emSize > 0.0f); |
607 SkAutoGlyphCache cache = vector_cache(typeface, emSize); | 609 SkAutoGlyphCache cache = vector_cache(typeface, emSize); |
608 font->insertName("Subtype", "Type3"); | 610 font->insertName("Subtype", "Type3"); |
609 // Flip about the x-axis and scale by 1/emSize. | 611 // Flip about the x-axis and scale by 1/emSize. |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
677 glyphs of the font were placed with their origins coincident and | 679 glyphs of the font were placed with their origins coincident and |
678 then filled." */ | 680 then filled." */ |
679 auto fontBBox = sk_make_sp<SkPDFArray>(); | 681 auto fontBBox = sk_make_sp<SkPDFArray>(); |
680 fontBBox->reserve(4); | 682 fontBBox->reserve(4); |
681 fontBBox->appendInt(bbox.left()); | 683 fontBBox->appendInt(bbox.left()); |
682 fontBBox->appendInt(bbox.bottom()); | 684 fontBBox->appendInt(bbox.bottom()); |
683 fontBBox->appendInt(bbox.right()); | 685 fontBBox->appendInt(bbox.right()); |
684 fontBBox->appendInt(bbox.top()); | 686 fontBBox->appendInt(bbox.top()); |
685 font->insertObject("FontBBox", std::move(fontBBox)); | 687 font->insertObject("FontBBox", std::move(fontBBox)); |
686 font->insertName("CIDToGIDMap", "Identity"); | 688 font->insertName("CIDToGIDMap", "Identity"); |
687 const SkAdvancedTypefaceMetrics* metrics = SkPDFFont::GetMetrics(typeface, c anon); | 689 if (metrics && metrics->fGlyphToUnicode.count() > 0) { |
688 if (metrics /* && metrics->fGlyphToUnicode.count() > 0 */) { | |
689 font->insertObjRef("ToUnicode", | 690 font->insertObjRef("ToUnicode", |
690 SkPDFMakeToUnicodeCmap(metrics->fGlyphToUnicode, | 691 SkPDFMakeToUnicodeCmap(metrics->fGlyphToUnicode, |
691 &subset, | 692 &subset, |
692 false, | 693 false, |
693 firstGlyphID, | 694 firstGlyphID, |
694 lastGlyphID)); | 695 lastGlyphID)); |
695 } | 696 } |
697 auto descriptor = sk_make_sp<SkPDFDict>("FontDescriptor"); | |
698 int32_t fontDescriptorFlags = kPdfSymbolic; | |
699 if (metrics) { | |
700 // Type3 FontDescriptor does not require all the same fields. | |
701 descriptor->insertName("FontName", metrics->fFontName); | |
702 descriptor->insertInt("ItalicAngle", metrics->fItalicAngle); | |
703 fontDescriptorFlags |= (int32_t)metrics->fStyle; | |
704 } | |
705 descriptor->insertInt("Flags", fontDescriptorFlags); | |
706 font->insertObjRef("FontDescriptor", std::move(descriptor)); | |
696 font->insertObject("Widths", std::move(widthArray)); | 707 font->insertObject("Widths", std::move(widthArray)); |
697 font->insertObject("Encoding", std::move(encoding)); | 708 font->insertObject("Encoding", std::move(encoding)); |
698 font->insertObject("CharProcs", std::move(charProcs)); | 709 font->insertObject("CharProcs", std::move(charProcs)); |
699 } | 710 } |
700 | 711 |
701 SkPDFType3Font::SkPDFType3Font(SkPDFFont::Info info, | 712 SkPDFType3Font::SkPDFType3Font(SkPDFFont::Info info, |
702 const SkAdvancedTypefaceMetrics& metrics) | 713 const SkAdvancedTypefaceMetrics& metrics) |
703 : SkPDFFont(std::move(info)) {} | 714 : SkPDFFont(std::move(info)) {} |
704 | 715 |
705 void SkPDFType3Font::getFontSubset(SkPDFCanon* canon) { | 716 void SkPDFType3Font::getFontSubset(SkPDFCanon* canon) { |
(...skipping 10 matching lines...) Expand all Loading... | |
716 | 727 |
717 bool SkPDFFont::CanEmbedTypeface(SkTypeface* typeface, SkPDFCanon* canon) { | 728 bool SkPDFFont::CanEmbedTypeface(SkTypeface* typeface, SkPDFCanon* canon) { |
718 const SkAdvancedTypefaceMetrics* metrics = SkPDFFont::GetMetrics(typeface, c anon); | 729 const SkAdvancedTypefaceMetrics* metrics = SkPDFFont::GetMetrics(typeface, c anon); |
719 return metrics && can_embed(*metrics); | 730 return metrics && can_embed(*metrics); |
720 } | 731 } |
721 | 732 |
722 void SkPDFFont::drop() { | 733 void SkPDFFont::drop() { |
723 fTypeface = nullptr; | 734 fTypeface = nullptr; |
724 this->SkPDFDict::drop(); | 735 this->SkPDFDict::drop(); |
725 } | 736 } |
OLD | NEW |