| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 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 "SkFontConfigInterface.h" | 8 #include "SkFontConfigInterface.h" |
| 9 #include "SkFontConfigTypeface.h" | 9 #include "SkFontConfigTypeface.h" |
| 10 #include "SkFontMgr.h" | 10 #include "SkFontMgr.h" |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 53 // borrow this global from SkFontHost_fontconfig. eventually that file should | 53 // borrow this global from SkFontHost_fontconfig. eventually that file should |
| 54 // go away, and be replaced with this one. | 54 // go away, and be replaced with this one. |
| 55 extern SkFontConfigInterface* SkFontHost_fontconfig_ref_global(); | 55 extern SkFontConfigInterface* SkFontHost_fontconfig_ref_global(); |
| 56 static SkFontConfigInterface* RefFCI() { | 56 static SkFontConfigInterface* RefFCI() { |
| 57 return SkFontHost_fontconfig_ref_global(); | 57 return SkFontHost_fontconfig_ref_global(); |
| 58 } | 58 } |
| 59 | 59 |
| 60 // look for the last substring after a '/' and return that, or return null. | 60 // look for the last substring after a '/' and return that, or return null. |
| 61 static const char* find_just_name(const char* str) { | 61 static const char* find_just_name(const char* str) { |
| 62 const char* last = strrchr(str, '/'); | 62 const char* last = strrchr(str, '/'); |
| 63 return last ? last + 1 : NULL; | 63 return last ? last + 1 : nullptr; |
| 64 } | 64 } |
| 65 | 65 |
| 66 static bool is_lower(char c) { | 66 static bool is_lower(char c) { |
| 67 return c >= 'a' && c <= 'z'; | 67 return c >= 'a' && c <= 'z'; |
| 68 } | 68 } |
| 69 | 69 |
| 70 static int get_int(FcPattern* pattern, const char field[]) { | 70 static int get_int(FcPattern* pattern, const char field[]) { |
| 71 SkASSERT(gFCSafeToUse); | 71 SkASSERT(gFCSafeToUse); |
| 72 int value; | 72 int value; |
| 73 if (FcPatternGetInteger(pattern, field, 0, &value) != FcResultMatch) { | 73 if (FcPatternGetInteger(pattern, field, 0, &value) != FcResultMatch) { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 116 FcPattern** iter = font_set->fonts; | 116 FcPattern** iter = font_set->fonts; |
| 117 FcPattern** stop = iter + font_set->nfont; | 117 FcPattern** stop = iter + font_set->nfont; |
| 118 // find the first good match | 118 // find the first good match |
| 119 for (; iter < stop; ++iter) { | 119 for (; iter < stop; ++iter) { |
| 120 if (valid_pattern(*iter)) { | 120 if (valid_pattern(*iter)) { |
| 121 break; | 121 break; |
| 122 } | 122 } |
| 123 } | 123 } |
| 124 | 124 |
| 125 if (iter == stop || !match_name(*iter, post_config_family)) { | 125 if (iter == stop || !match_name(*iter, post_config_family)) { |
| 126 return NULL; | 126 return nullptr; |
| 127 } | 127 } |
| 128 | 128 |
| 129 FcPattern** firstIter = iter++; | 129 FcPattern** firstIter = iter++; |
| 130 for (; iter < stop; ++iter) { | 130 for (; iter < stop; ++iter) { |
| 131 if (!valid_pattern(*iter) || !match_name(*iter, post_config_family)) { | 131 if (!valid_pattern(*iter) || !match_name(*iter, post_config_family)) { |
| 132 break; | 132 break; |
| 133 } | 133 } |
| 134 } | 134 } |
| 135 | 135 |
| 136 *count = iter - firstIter; | 136 *count = iter - firstIter; |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 195 SkASSERT((unsigned)index < (unsigned)fRecCount); | 195 SkASSERT((unsigned)index < (unsigned)fRecCount); |
| 196 if (style) { | 196 if (style) { |
| 197 *style = fRecs[index].fStyle; | 197 *style = fRecs[index].fStyle; |
| 198 } | 198 } |
| 199 if (styleName) { | 199 if (styleName) { |
| 200 *styleName = fRecs[index].fStyleName; | 200 *styleName = fRecs[index].fStyleName; |
| 201 } | 201 } |
| 202 } | 202 } |
| 203 | 203 |
| 204 SkTypeface* SkFontStyleSet_FC::createTypeface(int index) { | 204 SkTypeface* SkFontStyleSet_FC::createTypeface(int index) { |
| 205 return NULL; | 205 return nullptr; |
| 206 } | 206 } |
| 207 | 207 |
| 208 SkTypeface* SkFontStyleSet_FC::matchStyle(const SkFontStyle& pattern) { | 208 SkTypeface* SkFontStyleSet_FC::matchStyle(const SkFontStyle& pattern) { |
| 209 return NULL; | 209 return nullptr; |
| 210 } | 210 } |
| 211 | 211 |
| 212 class SkFontMgr_fontconfig : public SkFontMgr { | 212 class SkFontMgr_fontconfig : public SkFontMgr { |
| 213 SkAutoTUnref<SkFontConfigInterface> fFCI; | 213 SkAutoTUnref<SkFontConfigInterface> fFCI; |
| 214 SkDataTable* fFamilyNames; | 214 SkDataTable* fFamilyNames; |
| 215 SkTypeface_FreeType::Scanner fScanner; | 215 SkTypeface_FreeType::Scanner fScanner; |
| 216 | 216 |
| 217 public: | 217 public: |
| 218 SkFontMgr_fontconfig(SkFontConfigInterface* fci) | 218 SkFontMgr_fontconfig(SkFontConfigInterface* fci) |
| 219 : fFCI(fci) | 219 : fFCI(fci) |
| (...skipping 18 matching lines...) Expand all Loading... |
| 238 | 238 |
| 239 SkFontStyleSet* onMatchFamily(const char familyName[]) const override { | 239 SkFontStyleSet* onMatchFamily(const char familyName[]) const override { |
| 240 FCLocker lock; | 240 FCLocker lock; |
| 241 | 241 |
| 242 FcPattern* pattern = FcPatternCreate(); | 242 FcPattern* pattern = FcPatternCreate(); |
| 243 | 243 |
| 244 FcPatternAddString(pattern, FC_FAMILY, (FcChar8*)familyName); | 244 FcPatternAddString(pattern, FC_FAMILY, (FcChar8*)familyName); |
| 245 #if 0 | 245 #if 0 |
| 246 FcPatternAddBool(pattern, FC_SCALABLE, FcTrue); | 246 FcPatternAddBool(pattern, FC_SCALABLE, FcTrue); |
| 247 #endif | 247 #endif |
| 248 FcConfigSubstitute(NULL, pattern, FcMatchPattern); | 248 FcConfigSubstitute(nullptr, pattern, FcMatchPattern); |
| 249 FcDefaultSubstitute(pattern); | 249 FcDefaultSubstitute(pattern); |
| 250 | 250 |
| 251 const char* post_config_family = get_name(pattern, FC_FAMILY); | 251 const char* post_config_family = get_name(pattern, FC_FAMILY); |
| 252 | 252 |
| 253 FcResult result; | 253 FcResult result; |
| 254 FcFontSet* font_set = FcFontSort(0, pattern, 0, 0, &result); | 254 FcFontSet* font_set = FcFontSort(0, pattern, 0, 0, &result); |
| 255 if (!font_set) { | 255 if (!font_set) { |
| 256 FcPatternDestroy(pattern); | 256 FcPatternDestroy(pattern); |
| 257 return NULL; | 257 return nullptr; |
| 258 } | 258 } |
| 259 | 259 |
| 260 int count; | 260 int count; |
| 261 FcPattern** match = MatchFont(font_set, post_config_family, &count); | 261 FcPattern** match = MatchFont(font_set, post_config_family, &count); |
| 262 if (!match) { | 262 if (!match) { |
| 263 FcPatternDestroy(pattern); | 263 FcPatternDestroy(pattern); |
| 264 FcFontSetDestroy(font_set); | 264 FcFontSetDestroy(font_set); |
| 265 return NULL; | 265 return nullptr; |
| 266 } | 266 } |
| 267 | 267 |
| 268 FcPatternDestroy(pattern); | 268 FcPatternDestroy(pattern); |
| 269 | 269 |
| 270 SkTDArray<FcPattern*> trimmedMatches; | 270 SkTDArray<FcPattern*> trimmedMatches; |
| 271 for (int i = 0; i < count; ++i) { | 271 for (int i = 0; i < count; ++i) { |
| 272 const char* justName = find_just_name(get_name(match[i], FC_FILE)); | 272 const char* justName = find_just_name(get_name(match[i], FC_FILE)); |
| 273 if (!is_lower(*justName)) { | 273 if (!is_lower(*justName)) { |
| 274 *trimmedMatches.append() = match[i]; | 274 *trimmedMatches.append() = match[i]; |
| 275 } | 275 } |
| 276 } | 276 } |
| 277 | 277 |
| 278 SkFontStyleSet_FC* sset = | 278 SkFontStyleSet_FC* sset = |
| 279 new SkFontStyleSet_FC(trimmedMatches.begin(), trimmedMatches.cou
nt()); | 279 new SkFontStyleSet_FC(trimmedMatches.begin(), trimmedMatches.cou
nt()); |
| 280 return sset; | 280 return sset; |
| 281 } | 281 } |
| 282 | 282 |
| 283 SkTypeface* onMatchFamilyStyle(const char familyName[], | 283 SkTypeface* onMatchFamilyStyle(const char familyName[], |
| 284 const SkFontStyle&) const override { return N
ULL; } | 284 const SkFontStyle&) const override { return n
ullptr; } |
| 285 SkTypeface* onMatchFamilyStyleCharacter(const char familyName[], const SkFon
tStyle&, | 285 SkTypeface* onMatchFamilyStyleCharacter(const char familyName[], const SkFon
tStyle&, |
| 286 const char* bcp47[], int bcp47Count, | 286 const char* bcp47[], int bcp47Count, |
| 287 SkUnichar character) const override
{ | 287 SkUnichar character) const override
{ |
| 288 return NULL; | 288 return nullptr; |
| 289 } | 289 } |
| 290 SkTypeface* onMatchFaceStyle(const SkTypeface*, | 290 SkTypeface* onMatchFaceStyle(const SkTypeface*, |
| 291 const SkFontStyle&) const override { return NUL
L; } | 291 const SkFontStyle&) const override { return nul
lptr; } |
| 292 | 292 |
| 293 SkTypeface* onCreateFromData(SkData*, int ttcIndex) const override { return
NULL; } | 293 SkTypeface* onCreateFromData(SkData*, int ttcIndex) const override { return
nullptr; } |
| 294 | 294 |
| 295 SkTypeface* onCreateFromStream(SkStreamAsset* bareStream, int ttcIndex) cons
t override { | 295 SkTypeface* onCreateFromStream(SkStreamAsset* bareStream, int ttcIndex) cons
t override { |
| 296 SkAutoTDelete<SkStreamAsset> stream(bareStream); | 296 SkAutoTDelete<SkStreamAsset> stream(bareStream); |
| 297 const size_t length = stream->getLength(); | 297 const size_t length = stream->getLength(); |
| 298 if (!length) { | 298 if (!length) { |
| 299 return NULL; | 299 return nullptr; |
| 300 } | 300 } |
| 301 if (length >= 1024 * 1024 * 1024) { | 301 if (length >= 1024 * 1024 * 1024) { |
| 302 return NULL; // don't accept too large fonts (>= 1GB) for safety. | 302 return nullptr; // don't accept too large fonts (>= 1GB) for safety
. |
| 303 } | 303 } |
| 304 | 304 |
| 305 // TODO should the caller give us the style or should we get it from fre
etype? | 305 // TODO should the caller give us the style or should we get it from fre
etype? |
| 306 SkFontStyle style; | 306 SkFontStyle style; |
| 307 bool isFixedWidth = false; | 307 bool isFixedWidth = false; |
| 308 if (!fScanner.scanFont(stream, 0, NULL, &style, &isFixedWidth, NULL)) { | 308 if (!fScanner.scanFont(stream, 0, nullptr, &style, &isFixedWidth, nullpt
r)) { |
| 309 return NULL; | 309 return nullptr; |
| 310 } | 310 } |
| 311 | 311 |
| 312 SkTypeface* face = FontConfigTypeface::Create(style, isFixedWidth, strea
m.detach()); | 312 SkTypeface* face = FontConfigTypeface::Create(style, isFixedWidth, strea
m.detach()); |
| 313 return face; | 313 return face; |
| 314 } | 314 } |
| 315 | 315 |
| 316 SkTypeface* onCreateFromFile(const char path[], int ttcIndex) const override
{ | 316 SkTypeface* onCreateFromFile(const char path[], int ttcIndex) const override
{ |
| 317 SkAutoTDelete<SkStreamAsset> stream(SkStream::NewFromFile(path)); | 317 SkAutoTDelete<SkStreamAsset> stream(SkStream::NewFromFile(path)); |
| 318 return stream.get() ? this->createFromStream(stream.detach(), ttcIndex)
: NULL; | 318 return stream.get() ? this->createFromStream(stream.detach(), ttcIndex)
: nullptr; |
| 319 } | 319 } |
| 320 | 320 |
| 321 SkTypeface* onLegacyCreateTypeface(const char familyName[], | 321 SkTypeface* onLegacyCreateTypeface(const char familyName[], |
| 322 unsigned styleBits) const override { | 322 unsigned styleBits) const override { |
| 323 FCLocker lock; | 323 FCLocker lock; |
| 324 return FontConfigTypeface::LegacyCreateTypeface(familyName, (SkTypeface:
:Style)styleBits); | 324 return FontConfigTypeface::LegacyCreateTypeface(familyName, (SkTypeface:
:Style)styleBits); |
| 325 } | 325 } |
| 326 }; | 326 }; |
| 327 | 327 |
| 328 SkFontMgr* SkFontMgr::Factory() { | 328 SkFontMgr* SkFontMgr::Factory() { |
| 329 SkFontConfigInterface* fci = RefFCI(); | 329 SkFontConfigInterface* fci = RefFCI(); |
| 330 return fci ? new SkFontMgr_fontconfig(fci) : NULL; | 330 return fci ? new SkFontMgr_fontconfig(fci) : nullptr; |
| 331 } | 331 } |
| OLD | NEW |