Index: src/pdf/SkPDFFont.h |
diff --git a/src/pdf/SkPDFFont.h b/src/pdf/SkPDFFont.h |
index f2f1df4c244c2102adebfcb20aeccbb90754d888..36b93ecc352ad6e0668a3568fb0a029b19cb3f27 100644 |
--- a/src/pdf/SkPDFFont.h |
+++ b/src/pdf/SkPDFFont.h |
@@ -60,6 +60,7 @@ |
SkTArray<FontGlyphSetPair> fMap; |
}; |
+ |
/** \class SkPDFFont |
A PDF Object class representing a font. The font may have resources |
attached to it in order to embed the font. SkPDFFonts are canonicalized |
@@ -75,27 +76,28 @@ |
/** Returns the typeface represented by this class. Returns nullptr for the |
* default typeface. |
*/ |
- SkTypeface* typeface() const { return fTypeface.get(); } |
+ SkTypeface* typeface() { return fTypeface.get(); } |
/** Returns the font type represented in this font. For Type0 fonts, |
* returns the type of the decendant font. |
*/ |
- SkAdvancedTypefaceMetrics::FontType getType() const { return fFontType; } |
- |
- static bool IsMultiByte(SkAdvancedTypefaceMetrics::FontType type) { |
- return type == SkAdvancedTypefaceMetrics::kType1CID_Font || |
- type == SkAdvancedTypefaceMetrics::kTrueType_Font; |
- } |
+ SkAdvancedTypefaceMetrics::FontType getType() { return fFontType; } |
/** Returns true if this font encoding supports glyph IDs above 255. |
*/ |
- bool multiByteGlyphs() const { return SkPDFFont::IsMultiByte(this->getType()); } |
+ bool multiByteGlyphs() const { return fMultiByteGlyphs; } |
+ |
+ /** Returns true if the machine readable licensing bits allow embedding. |
+ */ |
+ bool canEmbed() const; |
+ |
+ /** Returns true if the machine readable licensing bits allow subsetting. |
+ */ |
+ bool canSubset() const; |
/** Return true if this font has an encoding for the passed glyph id. |
*/ |
- bool hasGlyph(SkGlyphID gid) { |
- return (gid >= fFirstGlyphID && gid <= fLastGlyphID) || gid == 0; |
- } |
+ bool hasGlyph(uint16_t glyphID); |
/** Convert (in place) the input glyph IDs into the font encoding. If the |
* font has more glyphs than can be encoded (like a type 1 font with more |
@@ -122,11 +124,10 @@ |
*/ |
static SkPDFFont* GetFontResource(SkPDFCanon* canon, |
SkTypeface* typeface, |
- SkGlyphID glyphID); |
- |
- // Uses (kGlyphNames_PerGlyphInfo | kToUnicode_PerGlyphInfo). |
- static const SkAdvancedTypefaceMetrics* GetMetrics(SkTypeface* typeface, |
- SkPDFCanon* canon); |
+ uint16_t glyphID); |
+ |
+ static sk_sp<const SkAdvancedTypefaceMetrics> GetFontMetricsWithToUnicode( |
+ SkTypeface*, uint32_t* glyphs, uint32_t glyphsCount); |
/** Subset the font based on usage set. Returns a SkPDFFont instance with |
* subset. |
@@ -134,8 +135,18 @@ |
* @return nullptr if font does not support subsetting, a new instance |
* of SkPDFFont otherwise. |
*/ |
- virtual sk_sp<SkPDFObject> getFontSubset(SkPDFCanon* canon, |
- const SkPDFGlyphSet* usage); |
+ virtual sk_sp<SkPDFObject> getFontSubset(const SkPDFGlyphSet* usage); |
+ |
+ enum Match { |
+ kExact_Match, |
+ kRelated_Match, |
+ kNot_Match, |
+ }; |
+ static Match IsMatch(SkPDFFont* existingFont, |
+ uint32_t existingFontID, |
+ uint16_t existingGlyphID, |
+ uint32_t searchFontID, |
+ uint16_t searchGlyphID); |
/** |
* Return false iff the typeface has its NotEmbeddable flag set. |
@@ -145,29 +156,52 @@ |
protected: |
// Common constructor to handle common members. |
- SkPDFFont(sk_sp<SkTypeface> typeface, |
- SkAdvancedTypefaceMetrics::FontType fontType); |
- |
+ SkPDFFont(sk_sp<const SkAdvancedTypefaceMetrics> fontInfo, |
+ sk_sp<SkTypeface> typeface, |
+ sk_sp<SkPDFDict> relatedFontDescriptor, |
+ SkAdvancedTypefaceMetrics::FontType fontType, |
+ bool multiByteGlyphs); |
+ |
+ // Accessors for subclass. |
+ const SkAdvancedTypefaceMetrics* getFontInfo() const { return fFontInfo.get(); } |
+ sk_sp<const SkAdvancedTypefaceMetrics> refFontInfo() const { return fFontInfo; } |
+ |
+ void setFontInfo(sk_sp<const SkAdvancedTypefaceMetrics> info); |
SkGlyphID firstGlyphID() const { return fFirstGlyphID; } |
SkGlyphID lastGlyphID() const { return fLastGlyphID; } |
+ void setLastGlyphID(uint16_t glyphID); |
+ |
+ // Accessors for FontDescriptor associated with this object. |
+ SkPDFDict* getFontDescriptor() const { return fDescriptor.get(); } |
+ sk_sp<SkPDFDict> refFontDescriptor() const { return fDescriptor; } |
+ void setFontDescriptor(sk_sp<SkPDFDict> descriptor); |
sk_sp<SkTypeface> refTypeface() const { return fTypeface; } |
/** Set fFirstGlyphID and fLastGlyphID to span at most 255 glyphs, |
* including the passed glyphID. |
*/ |
- void adjustGlyphRangeForSingleByteEncoding(SkGlyphID glyphID); |
+ void adjustGlyphRangeForSingleByteEncoding(uint16_t glyphID); |
+ |
+ // Generate ToUnicode table according to glyph usage subset. |
+ // If subset is nullptr, all available glyph ids will be used. |
+ void populateToUnicodeTable(const SkPDFGlyphSet* subset); |
+ |
+ static bool Find(uint32_t fontID, uint16_t glyphID, int* index); |
void drop() override; |
private: |
sk_sp<SkTypeface> fTypeface; |
+ sk_sp<const SkAdvancedTypefaceMetrics> fFontInfo; |
+ sk_sp<SkPDFDict> fDescriptor; |
// The glyph IDs accessible with this font. For Type1 (non CID) fonts, |
// this will be a subset if the font has more than 255 glyphs. |
SkGlyphID fFirstGlyphID; |
SkGlyphID fLastGlyphID; |
SkAdvancedTypefaceMetrics::FontType fFontType; |
+ bool fMultiByteGlyphs; |
typedef SkPDFDict INHERITED; |
}; |