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