Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(111)

Side by Side Diff: src/ports/SkFontMgr_android.cpp

Issue 433503003: Correct Android FontMgr use of ttc index and remove unused code. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Address comment. Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2014 Google Inc. 2 * Copyright 2014 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 "SkFontConfigParser_android.h" 8 #include "SkFontConfigParser_android.h"
9 #include "SkFontDescriptor.h" 9 #include "SkFontDescriptor.h"
10 #include "SkFontHost_FreeType_common.h" 10 #include "SkFontHost_FreeType_common.h"
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 }; 113 };
114 114
115 void get_path_for_sys_fonts(SkString* full, const SkString& name) { 115 void get_path_for_sys_fonts(SkString* full, const SkString& name) {
116 full->set(getenv("ANDROID_ROOT")); 116 full->set(getenv("ANDROID_ROOT"));
117 full->append(SK_FONT_FILE_PREFIX); 117 full->append(SK_FONT_FILE_PREFIX);
118 full->append(name); 118 full->append(name);
119 } 119 }
120 120
121 class SkFontStyleSet_Android : public SkFontStyleSet { 121 class SkFontStyleSet_Android : public SkFontStyleSet {
122 public: 122 public:
123 explicit SkFontStyleSet_Android(FontFamily* family) : fFontFamily(family) { 123 explicit SkFontStyleSet_Android(FontFamily* family) {
124 // TODO? make this lazy 124 // TODO? make this lazy
125 for (int i = 0; i < family->fFontFiles.count(); ++i) { 125 for (int i = 0; i < family->fFontFiles.count(); ++i) {
126 const SkString& fileName = family->fFontFiles[i].fFileName; 126 const SkString& fileName = family->fFontFiles[i].fFileName;
127 127
128 SkString pathName; 128 SkString pathName;
129 get_path_for_sys_fonts(&pathName, fileName); 129 get_path_for_sys_fonts(&pathName, fileName);
130 130
131 SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(pathName.c_str() )); 131 SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(pathName.c_str() ));
132 if (!stream.get()) { 132 if (!stream.get()) {
133 DEBUG_FONT(("---- SystemFonts[%d] file=%s (NOT EXIST)", i, fileN ame.c_str())); 133 DEBUG_FONT(("---- SystemFonts[%d] file=%s (NOT EXIST)", i, fileN ame.c_str()));
134 continue; 134 continue;
135 } 135 }
136 136
137 const int ttcIndex = family->fFontFiles[i].fIndex;
137 SkString fontName; 138 SkString fontName;
138 SkTypeface::Style style; 139 SkTypeface::Style style;
139 bool isFixedWidth; 140 bool isFixedWidth;
140 if (!SkTypeface_FreeType::ScanFont(stream.get(), family->fFontFiles[ i].fIndex, 141 if (!SkTypeface_FreeType::ScanFont(stream.get(), ttcIndex,
141 &fontName, &style, &isFixedWidth) ) { 142 &fontName, &style, &isFixedWidth) ) {
142 DEBUG_FONT(("---- SystemFonts[%d] file=%s (INVALID)", i, fileNam e.c_str())); 143 DEBUG_FONT(("---- SystemFonts[%d] file=%s (INVALID)", i, fileNam e.c_str()));
143 continue; 144 continue;
144 } 145 }
145 146
146 fStyles.push_back().reset(SkNEW_ARGS(SkTypeface_AndroidSystem, 147 fStyles.push_back().reset(SkNEW_ARGS(SkTypeface_AndroidSystem,
147 (pathName, 0, 148 (pathName, ttcIndex,
148 style, isFixedWidth, fontName) )); 149 style, isFixedWidth, fontName) ));
149 } 150 }
150 } 151 }
151 152
152 virtual int count() SK_OVERRIDE { 153 virtual int count() SK_OVERRIDE {
153 return fStyles.count(); 154 return fStyles.count();
154 } 155 }
155 virtual void getStyle(int index, SkFontStyle* style, SkString* name) SK_OVER RIDE { 156 virtual void getStyle(int index, SkFontStyle* style, SkString* name) SK_OVER RIDE {
156 if (index < 0 || fStyles.count() <= index) { 157 if (index < 0 || fStyles.count() <= index) {
157 return; 158 return;
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 return SkFontStyle::kUpright_Slant; 206 return SkFontStyle::kUpright_Slant;
206 } 207 }
207 static int match_score(const SkFontStyle& pattern, const SkFontStyle& candid ate) { 208 static int match_score(const SkFontStyle& pattern, const SkFontStyle& candid ate) {
208 int score = 0; 209 int score = 0;
209 score += abs((pattern.width() - candidate.width()) * 100); 210 score += abs((pattern.width() - candidate.width()) * 100);
210 score += abs((pattern.isItalic() == candidate.isItalic()) ? 0 : 1000); 211 score += abs((pattern.isItalic() == candidate.isItalic()) ? 0 : 1000);
211 score += abs(pattern.weight() - candidate.weight()); 212 score += abs(pattern.weight() - candidate.weight());
212 return score; 213 return score;
213 } 214 }
214 215
215
216 FontFamily* fFontFamily;
217 SkTArray<SkAutoTUnref<SkTypeface>, true> fStyles; 216 SkTArray<SkAutoTUnref<SkTypeface>, true> fStyles;
218 217
219 friend struct NameToFamily; 218 friend struct NameToFamily;
220 friend class SkFontMgr_Android; 219 friend class SkFontMgr_Android;
221 220
222 typedef SkFontStyleSet INHERITED; 221 typedef SkFontStyleSet INHERITED;
223 }; 222 };
224 223
225 /** On Android a single family can have many names, but our API assumes unique n ames. 224 /** On Android a single family can have many names, but our API assumes unique n ames.
226 * Map names to the back end so that all names for a given family refer to the same 225 * Map names to the back end so that all names for a given family refer to the same
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
322 virtual SkTypeface* onLegacyCreateTypeface(const char familyName[], 321 virtual SkTypeface* onLegacyCreateTypeface(const char familyName[],
323 unsigned styleBits) const SK_OVER RIDE { 322 unsigned styleBits) const SK_OVER RIDE {
324 SkTypeface::Style oldStyle = (SkTypeface::Style)styleBits; 323 SkTypeface::Style oldStyle = (SkTypeface::Style)styleBits;
325 SkFontStyle style = SkFontStyle(oldStyle & SkTypeface::kBold 324 SkFontStyle style = SkFontStyle(oldStyle & SkTypeface::kBold
326 ? SkFontStyle::kBold_Weight 325 ? SkFontStyle::kBold_Weight
327 : SkFontStyle::kNormal_Weight, 326 : SkFontStyle::kNormal_Weight,
328 SkFontStyle::kNormal_Width, 327 SkFontStyle::kNormal_Width,
329 oldStyle & SkTypeface::kItalic 328 oldStyle & SkTypeface::kItalic
330 ? SkFontStyle::kItalic_Slant 329 ? SkFontStyle::kItalic_Slant
331 : SkFontStyle::kUpright_Slant); 330 : SkFontStyle::kUpright_Slant);
332 SkTypeface* tf = NULL;
333 331
334 if (NULL != familyName) { 332 if (NULL != familyName) {
335 // On Android, we must return NULL when we can't find the requested 333 // On Android, we must return NULL when we can't find the requested
336 // named typeface so that the system/app can provide their own recov ery 334 // named typeface so that the system/app can provide their own recov ery
337 // mechanism. On other platforms we'd provide a typeface from the 335 // mechanism. On other platforms we'd provide a typeface from the
338 // default family instead. 336 // default family instead.
339 tf = this->onMatchFamilyStyle(familyName, style); 337 return this->onMatchFamilyStyle(familyName, style);
340 } else {
341 tf = fDefaultFamily->matchStyle(style);
342 } 338 }
343 339 return fDefaultFamily->matchStyle(style);
344 // TODO: double ref? qv matchStyle()
345 return SkSafeRef(tf);
346 } 340 }
347 341
348 342
349 private: 343 private:
350 344
351 SkTArray<SkAutoTUnref<SkFontStyleSet_Android>, true> fFontStyleSets; 345 SkTArray<SkAutoTUnref<SkFontStyleSet_Android>, true> fFontStyleSets;
352 SkFontStyleSet* fDefaultFamily; 346 SkFontStyleSet* fDefaultFamily;
353 SkTypeface* fDefaultTypeface; 347 SkTypeface* fDefaultTypeface;
354 348
355 SkTDArray<NameToFamily> fNameToFamilyMap; 349 SkTDArray<NameToFamily> fNameToFamilyMap;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
392 } 386 }
393 387
394 typedef SkFontMgr INHERITED; 388 typedef SkFontMgr INHERITED;
395 }; 389 };
396 390
397 /////////////////////////////////////////////////////////////////////////////// 391 ///////////////////////////////////////////////////////////////////////////////
398 392
399 SkFontMgr* SkFontMgr::Factory() { 393 SkFontMgr* SkFontMgr::Factory() {
400 return SkNEW(SkFontMgr_Android); 394 return SkNEW(SkFontMgr_Android);
401 } 395 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698