| 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 "SkFontMgr.h" | 8 #include "SkFontMgr.h" |
| 9 #include "SkFontStyle.h" | 9 #include "SkFontStyle.h" |
| 10 #include "SkFontConfigInterface.h" | 10 #include "SkFontConfigInterface.h" |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 } | 177 } |
| 178 | 178 |
| 179 SkTypeface* SkFontStyleSet_FC::matchStyle(const SkFontStyle& pattern) { | 179 SkTypeface* SkFontStyleSet_FC::matchStyle(const SkFontStyle& pattern) { |
| 180 return NULL; | 180 return NULL; |
| 181 } | 181 } |
| 182 | 182 |
| 183 class SkFontMgr_fontconfig : public SkFontMgr { | 183 class SkFontMgr_fontconfig : public SkFontMgr { |
| 184 SkAutoTUnref<SkFontConfigInterface> fFCI; | 184 SkAutoTUnref<SkFontConfigInterface> fFCI; |
| 185 SkDataTable* fFamilyNames; | 185 SkDataTable* fFamilyNames; |
| 186 | 186 |
| 187 void init() { | |
| 188 if (!fFamilyNames) { | |
| 189 fFamilyNames = fFCI->getFamilyNames(); | |
| 190 } | |
| 191 } | |
| 192 | 187 |
| 193 public: | 188 public: |
| 194 SkFontMgr_fontconfig(SkFontConfigInterface* fci) | 189 SkFontMgr_fontconfig(SkFontConfigInterface* fci) |
| 195 : fFCI(fci) | 190 : fFCI(fci) |
| 196 , fFamilyNames(NULL) {} | 191 , fFamilyNames(fFCI->getFamilyNames()) {} |
| 197 | 192 |
| 198 virtual ~SkFontMgr_fontconfig() { | 193 virtual ~SkFontMgr_fontconfig() { |
| 199 SkSafeUnref(fFamilyNames); | 194 SkSafeUnref(fFamilyNames); |
| 200 } | 195 } |
| 201 | 196 |
| 202 protected: | 197 protected: |
| 203 virtual int onCountFamilies() { | 198 virtual int onCountFamilies() const SK_OVERRIDE { |
| 204 this->init(); | |
| 205 return fFamilyNames->count(); | 199 return fFamilyNames->count(); |
| 206 } | 200 } |
| 207 | 201 |
| 208 virtual void onGetFamilyName(int index, SkString* familyName) { | 202 virtual void onGetFamilyName(int index, SkString* familyName) const SK_OVERR
IDE { |
| 209 this->init(); | |
| 210 familyName->set(fFamilyNames->atStr(index)); | 203 familyName->set(fFamilyNames->atStr(index)); |
| 211 } | 204 } |
| 212 | 205 |
| 213 virtual SkFontStyleSet* onCreateStyleSet(int index) { | 206 virtual SkFontStyleSet* onCreateStyleSet(int index) const SK_OVERRIDE { |
| 214 this->init(); | |
| 215 return this->onMatchFamily(fFamilyNames->atStr(index)); | 207 return this->onMatchFamily(fFamilyNames->atStr(index)); |
| 216 } | 208 } |
| 217 | 209 |
| 218 virtual SkFontStyleSet* onMatchFamily(const char familyName[]) { | 210 virtual SkFontStyleSet* onMatchFamily(const char familyName[]) const SK_OVER
RIDE { |
| 219 this->init(); | |
| 220 | |
| 221 FcPattern* pattern = FcPatternCreate(); | 211 FcPattern* pattern = FcPatternCreate(); |
| 222 | 212 |
| 223 FcPatternAddString(pattern, FC_FAMILY, (FcChar8*)familyName); | 213 FcPatternAddString(pattern, FC_FAMILY, (FcChar8*)familyName); |
| 224 #if 0 | 214 #if 0 |
| 225 FcPatternAddBool(pattern, FC_SCALABLE, FcTrue); | 215 FcPatternAddBool(pattern, FC_SCALABLE, FcTrue); |
| 226 #endif | 216 #endif |
| 227 FcConfigSubstitute(NULL, pattern, FcMatchPattern); | 217 FcConfigSubstitute(NULL, pattern, FcMatchPattern); |
| 228 FcDefaultSubstitute(pattern); | 218 FcDefaultSubstitute(pattern); |
| 229 | 219 |
| 230 const char* post_config_family = get_name(pattern, FC_FAMILY); | 220 const char* post_config_family = get_name(pattern, FC_FAMILY); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 254 } | 244 } |
| 255 } | 245 } |
| 256 | 246 |
| 257 SkFontStyleSet_FC* sset = SkNEW_ARGS(SkFontStyleSet_FC, | 247 SkFontStyleSet_FC* sset = SkNEW_ARGS(SkFontStyleSet_FC, |
| 258 (trimmedMatches.begin(), | 248 (trimmedMatches.begin(), |
| 259 trimmedMatches.count())); | 249 trimmedMatches.count())); |
| 260 return sset; | 250 return sset; |
| 261 } | 251 } |
| 262 | 252 |
| 263 virtual SkTypeface* onMatchFamilyStyle(const char familyName[], | 253 virtual SkTypeface* onMatchFamilyStyle(const char familyName[], |
| 264 const SkFontStyle&) { return NULL; } | 254 const SkFontStyle&) const SK_OVERRIDE
{ return NULL; } |
| 265 virtual SkTypeface* onMatchFaceStyle(const SkTypeface*, | 255 virtual SkTypeface* onMatchFaceStyle(const SkTypeface*, |
| 266 const SkFontStyle&) { return NULL; } | 256 const SkFontStyle&) const SK_OVERRIDE {
return NULL; } |
| 267 | 257 |
| 268 virtual SkTypeface* onCreateFromData(SkData*, int ttcIndex) { return NULL; } | 258 virtual SkTypeface* onCreateFromData(SkData*, int ttcIndex) const SK_OVERRID
E { return NULL; } |
| 269 | 259 |
| 270 virtual SkTypeface* onCreateFromStream(SkStream* stream, int ttcIndex) { | 260 virtual SkTypeface* onCreateFromStream(SkStream* stream, int ttcIndex) const
SK_OVERRIDE { |
| 271 const size_t length = stream->getLength(); | 261 const size_t length = stream->getLength(); |
| 272 if (!length) { | 262 if (!length) { |
| 273 return NULL; | 263 return NULL; |
| 274 } | 264 } |
| 275 if (length >= 1024 * 1024 * 1024) { | 265 if (length >= 1024 * 1024 * 1024) { |
| 276 return NULL; // don't accept too large fonts (>= 1GB) for safety. | 266 return NULL; // don't accept too large fonts (>= 1GB) for safety. |
| 277 } | 267 } |
| 278 | 268 |
| 279 // TODO should the caller give us the style or should we get it from fre
etype? | 269 // TODO should the caller give us the style or should we get it from fre
etype? |
| 280 SkTypeface::Style style = SkTypeface::kNormal; | 270 SkTypeface::Style style = SkTypeface::kNormal; |
| 281 bool isFixedWidth = false; | 271 bool isFixedWidth = false; |
| 282 if (!find_name_and_attributes(stream, NULL, &style, &isFixedWidth)) { | 272 if (!find_name_and_attributes(stream, NULL, &style, &isFixedWidth)) { |
| 283 return NULL; | 273 return NULL; |
| 284 } | 274 } |
| 285 | 275 |
| 286 SkTypeface* face = SkNEW_ARGS(FontConfigTypeface, (style, isFixedWidth,
stream)); | 276 SkTypeface* face = SkNEW_ARGS(FontConfigTypeface, (style, isFixedWidth,
stream)); |
| 287 return face; | 277 return face; |
| 288 } | 278 } |
| 289 | 279 |
| 290 virtual SkTypeface* onCreateFromFile(const char path[], int ttcIndex) { | 280 virtual SkTypeface* onCreateFromFile(const char path[], int ttcIndex) const
SK_OVERRIDE { |
| 291 SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(path)); | 281 SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(path)); |
| 292 return stream.get() ? this->createFromStream(stream, ttcIndex) : NULL; | 282 return stream.get() ? this->createFromStream(stream, ttcIndex) : NULL; |
| 293 } | 283 } |
| 294 | 284 |
| 295 virtual SkTypeface* onLegacyCreateTypeface(const char familyName[], | 285 virtual SkTypeface* onLegacyCreateTypeface(const char familyName[], |
| 296 unsigned styleBits) SK_OVERRIDE { | 286 unsigned styleBits) const SK_OVER
RIDE { |
| 297 return FontConfigTypeface::LegacyCreateTypeface(NULL, familyName, | 287 return FontConfigTypeface::LegacyCreateTypeface(NULL, familyName, |
| 298 (SkTypeface::Style)styleBits); | 288 (SkTypeface::Style)styleBits); |
| 299 } | 289 } |
| 300 }; | 290 }; |
| 301 | 291 |
| 302 SkFontMgr* SkFontMgr::Factory() { | 292 SkFontMgr* SkFontMgr::Factory() { |
| 303 SkFontConfigInterface* fci = RefFCI(); | 293 SkFontConfigInterface* fci = RefFCI(); |
| 304 return fci ? SkNEW_ARGS(SkFontMgr_fontconfig, (fci)) : NULL; | 294 return fci ? SkNEW_ARGS(SkFontMgr_fontconfig, (fci)) : NULL; |
| 305 } | 295 } |
| OLD | NEW |