1 2 /* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10 #ifndef SkAdvancedTypefaceMetrics_DEFINED 11 #define SkAdvancedTypefaceMetrics_DEFINED 12 13 #include "SkRect.h" 14 #include "SkRefCnt.h" 15 #include "SkString.h" 16 #include "SkTDArray.h" 17 #include "SkTemplates.h" 18 19 /** \class SkAdvancedTypefaceMetrics 20 21 The SkAdvancedTypefaceMetrics class is used by the PDF backend to correctly 22 embed typefaces. This class is created and filled in with information by 23 SkTypeface::getAdvancedTypefaceMetrics. 24 */ 25 26 class SkAdvancedTypefaceMetrics : public SkRefCnt { 27 public: 28 SkAdvancedTypefaceMetrics()29 SkAdvancedTypefaceMetrics() 30 : fType(SkAdvancedTypefaceMetrics::kOther_Font) 31 , fFlags(SkAdvancedTypefaceMetrics::kEmpty_FontFlag) 32 , fLastGlyphID(0) 33 , fEmSize(0) 34 , fStyle(0) 35 , fItalicAngle(0) 36 , fAscent(0) 37 , fDescent(0) 38 , fStemV(0) 39 , fCapHeight(0) 40 , fBBox(SkIRect::MakeEmpty()) {} 41 42 SkString fFontName; 43 44 enum FontType { 45 kType1_Font, 46 kType1CID_Font, 47 kCFF_Font, 48 kTrueType_Font, 49 kOther_Font, 50 }; 51 // The type of the underlying font program. This field determines which 52 // of the following fields are valid. If it is kOther_Font the per glyph 53 // information will never be populated. 54 FontType fType; 55 56 enum FontFlags { 57 kEmpty_FontFlag = 0x0, //!<No flags set 58 kMultiMaster_FontFlag = 0x1, //!<May be true for Type1, CFF, or TrueType fonts. 59 kNotEmbeddable_FontFlag = 0x2, //!<May not be embedded. 60 kNotSubsettable_FontFlag = 0x4, //!<May not be subset. 61 }; 62 // Global font flags. 63 FontFlags fFlags; 64 65 uint16_t fLastGlyphID; // The last valid glyph ID in the font. 66 uint16_t fEmSize; // The size of the em box (defines font units). 67 68 // These enum values match the values used in the PDF file format. 69 enum StyleFlags { 70 kFixedPitch_Style = 0x00001, 71 kSerif_Style = 0x00002, 72 kScript_Style = 0x00008, 73 kItalic_Style = 0x00040, 74 kAllCaps_Style = 0x10000, 75 kSmallCaps_Style = 0x20000, 76 kForceBold_Style = 0x40000 77 }; 78 uint16_t fStyle; // Font style characteristics. 79 int16_t fItalicAngle; // Counterclockwise degrees from vertical of the 80 // dominant vertical stroke for an Italic face. 81 // The following fields are all in font units. 82 int16_t fAscent; // Max height above baseline, not including accents. 83 int16_t fDescent; // Max depth below baseline (negative). 84 int16_t fStemV; // Thickness of dominant vertical stem. 85 int16_t fCapHeight; // Height (from baseline) of top of flat capitals. 86 87 SkIRect fBBox; // The bounding box of all glyphs (in font units). 88 89 template <typename Data> 90 struct AdvanceMetric { 91 enum MetricType { 92 kDefault, // Default advance: fAdvance.count = 1 93 kRange, // Advances for a range: fAdvance.count = fEndID-fStartID 94 kRun // fStartID-fEndID have same advance: fAdvance.count = 1 95 }; 96 MetricType fType; 97 uint16_t fStartId; 98 uint16_t fEndId; 99 SkTDArray<Data> fAdvance; 100 SkAutoTDelete<AdvanceMetric<Data> > fNext; 101 }; 102 103 struct VerticalMetric { 104 int16_t fVerticalAdvance; 105 int16_t fOriginXDisp; // Horiz. displacement of the secondary origin. 106 int16_t fOriginYDisp; // Vert. displacement of the secondary origin. 107 }; 108 typedef AdvanceMetric<int16_t> WidthRange; 109 typedef AdvanceMetric<VerticalMetric> VerticalAdvanceRange; 110 111 // This is indexed by glyph id. 112 SkAutoTDelete<WidthRange> fGlyphWidths; 113 // Only used for Vertical CID fonts. 114 SkAutoTDelete<VerticalAdvanceRange> fVerticalMetrics; 115 116 // The names of each glyph, only populated for postscript fonts. 117 SkAutoTDelete<SkAutoTArray<SkString> > fGlyphNames; 118 119 // The mapping from glyph to Unicode, only populated if 120 // kToUnicode_PerGlyphInfo is passed to GetAdvancedTypefaceMetrics. 121 SkTDArray<SkUnichar> fGlyphToUnicode; 122 123 private: 124 typedef SkRefCnt INHERITED; 125 }; 126 127 namespace skia_advanced_typeface_metrics_utils { 128 129 template <typename Data> 130 void resetRange(SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* range, 131 int startId); 132 133 template <typename Data> 134 SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* appendRange( 135 SkAutoTDelete<SkAdvancedTypefaceMetrics::AdvanceMetric<Data> >* nextSlot, 136 int startId); 137 138 template <typename Data> 139 void finishRange( 140 SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* range, 141 int endId, 142 typename SkAdvancedTypefaceMetrics::AdvanceMetric<Data>::MetricType 143 type); 144 145 /** Retrieve advance data for glyphs. Used by the PDF backend. It calls 146 underlying platform dependent API getAdvance to acquire the data. 147 @param num_glyphs Total number of glyphs in the given font. 148 @param glyphIDs For per-glyph info, specify subset of the font by 149 giving glyph ids. Each integer represents a glyph 150 id. Passing nullptr means all glyphs in the font. 151 @param glyphIDsCount Number of elements in subsetGlyphIds. Ignored if 152 glyphIDs is nullptr. 153 */ 154 template <typename Data, typename FontHandle> 155 SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* getAdvanceData( 156 FontHandle fontHandle, 157 int num_glyphs, 158 const uint32_t* glyphIDs, 159 uint32_t glyphIDsCount, 160 bool (*getAdvance)(FontHandle fontHandle, int gId, Data* data)); 161 162 } // namespace skia_advanced_typeface_metrics_utils 163 164 #endif 165