OLD | NEW |
---|---|
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 #ifndef SkPDFFont_DEFINED | 10 #ifndef SkPDFFont_DEFINED |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
132 static SkPDFFont* GetFontResource(SkTypeface* typeface, uint16_t glyphID); | 132 static SkPDFFont* GetFontResource(SkTypeface* typeface, uint16_t glyphID); |
133 | 133 |
134 /** Subset the font based on usage set. Returns a SkPDFFont instance with | 134 /** Subset the font based on usage set. Returns a SkPDFFont instance with |
135 * subset. | 135 * subset. |
136 * @param usage Glyph subset requested. | 136 * @param usage Glyph subset requested. |
137 * @return NULL if font does not support subsetting, a new instance | 137 * @return NULL if font does not support subsetting, a new instance |
138 * of SkPDFFont otherwise. | 138 * of SkPDFFont otherwise. |
139 */ | 139 */ |
140 virtual SkPDFFont* getFontSubset(const SkPDFGlyphSet* usage); | 140 virtual SkPDFFont* getFontSubset(const SkPDFGlyphSet* usage); |
141 | 141 |
142 enum Match { | |
143 kExact_Match, | |
144 kRelated_Match, | |
145 kNot_Match, | |
146 }; | |
147 static Match IsMatch(SkPDFFont* existingFont, | |
148 uint32_t existingFontID, | |
149 uint16_t existingGlyphID, | |
150 uint32_t searchFontID, | |
151 uint16_t searchGlyphID); | |
152 | |
142 protected: | 153 protected: |
143 // Common constructor to handle common members. | 154 // Common constructor to handle common members. |
144 SkPDFFont(const SkAdvancedTypefaceMetrics* fontInfo, SkTypeface* typeface, | 155 SkPDFFont(const SkAdvancedTypefaceMetrics* fontInfo, SkTypeface* typeface, |
145 SkPDFDict* relatedFontDescriptor); | 156 SkPDFDict* relatedFontDescriptor); |
146 | 157 |
147 // Accessors for subclass. | 158 // Accessors for subclass. |
148 const SkAdvancedTypefaceMetrics* fontInfo(); | 159 const SkAdvancedTypefaceMetrics* fontInfo(); |
149 void setFontInfo(const SkAdvancedTypefaceMetrics* info); | 160 void setFontInfo(const SkAdvancedTypefaceMetrics* info); |
150 uint16_t firstGlyphID() const; | 161 uint16_t firstGlyphID() const; |
151 uint16_t lastGlyphID() const; | 162 uint16_t lastGlyphID() const; |
(...skipping 19 matching lines...) Expand all Loading... | |
171 void populateToUnicodeTable(const SkPDFGlyphSet* subset); | 182 void populateToUnicodeTable(const SkPDFGlyphSet* subset); |
172 | 183 |
173 // Create instances of derived types based on fontInfo. | 184 // Create instances of derived types based on fontInfo. |
174 static SkPDFFont* Create(const SkAdvancedTypefaceMetrics* fontInfo, | 185 static SkPDFFont* Create(const SkAdvancedTypefaceMetrics* fontInfo, |
175 SkTypeface* typeface, uint16_t glyphID, | 186 SkTypeface* typeface, uint16_t glyphID, |
176 SkPDFDict* relatedFontDescriptor); | 187 SkPDFDict* relatedFontDescriptor); |
177 | 188 |
178 static bool Find(uint32_t fontID, uint16_t glyphID, int* index); | 189 static bool Find(uint32_t fontID, uint16_t glyphID, int* index); |
179 | 190 |
180 private: | 191 private: |
181 class FontRec { | |
182 public: | |
183 SkPDFFont* fFont; | |
184 uint32_t fFontID; | |
185 uint16_t fGlyphID; | |
186 | |
187 // A fGlyphID of 0 with no fFont always matches. | |
188 bool operator==(const FontRec& b) const; | |
189 FontRec(SkPDFFont* font, uint32_t fontID, uint16_t fGlyphID); | |
190 }; | |
191 | |
192 SkAutoTUnref<SkTypeface> fTypeface; | 192 SkAutoTUnref<SkTypeface> fTypeface; |
193 | 193 |
194 // The glyph IDs accessible with this font. For Type1 (non CID) fonts, | 194 // The glyph IDs accessible with this font. For Type1 (non CID) fonts, |
195 // this will be a subset if the font has more than 255 glyphs. | 195 // this will be a subset if the font has more than 255 glyphs. |
196 uint16_t fFirstGlyphID; | 196 uint16_t fFirstGlyphID; |
197 uint16_t fLastGlyphID; | 197 uint16_t fLastGlyphID; |
198 SkAutoTUnref<const SkAdvancedTypefaceMetrics> fFontInfo; | 198 SkAutoTUnref<const SkAdvancedTypefaceMetrics> fFontInfo; |
199 SkTDArray<SkPDFObject*> fResources; | 199 SkTDArray<SkPDFObject*> fResources; |
200 SkAutoTUnref<SkPDFDict> fDescriptor; | 200 SkAutoTUnref<SkPDFDict> fDescriptor; |
201 | 201 |
202 SkAdvancedTypefaceMetrics::FontType fFontType; | 202 SkAdvancedTypefaceMetrics::FontType fFontType; |
203 | 203 |
204 // This should be made a hash table if performance is a problem. | |
205 static SkTDArray<FontRec>& CanonicalFonts(); | |
206 static SkBaseMutex& CanonicalFontsMutex(); | |
207 typedef SkPDFDict INHERITED; | 204 typedef SkPDFDict INHERITED; |
208 }; | 205 }; |
209 | 206 |
207 inline SkPDFFont::Match SkPDFFont::IsMatch(SkPDFFont* existingFont, | |
mtklein
2015/01/20 21:59:51
This seems like an odd thing to implement inline h
hal.canary
2015/01/21 17:07:50
Done.
| |
208 uint32_t existingFontID, | |
209 uint16_t existingGlyphID, | |
210 uint32_t searchFontID, | |
211 uint16_t searchGlyphID) { | |
212 if (existingFontID != searchFontID) { | |
213 return SkPDFFont::kNot_Match; | |
214 } | |
215 if (existingGlyphID == 0 || searchGlyphID == 0) { | |
216 return SkPDFFont::kExact_Match; | |
217 } | |
218 if (existingFont != NULL) { | |
219 return (existingFont->fFirstGlyphID <= searchGlyphID && | |
220 searchGlyphID <= existingFont->fLastGlyphID) | |
221 ? SkPDFFont::kExact_Match | |
222 : SkPDFFont::kRelated_Match; | |
223 } | |
224 return (existingGlyphID == searchGlyphID) ? SkPDFFont::kExact_Match | |
225 : SkPDFFont::kRelated_Match; | |
226 } | |
227 | |
210 #endif | 228 #endif |
OLD | NEW |