OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2009 Google Inc. | 2 * Copyright 2009 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 /* migrated from chrome/src/skia/ext/SkFontHost_fontconfig_direct.cpp */ | 8 /* migrated from chrome/src/skia/ext/SkFontHost_fontconfig_direct.cpp */ |
9 | 9 |
10 #include <string> | |
11 #include <unistd.h> | 10 #include <unistd.h> |
12 #include <fcntl.h> | 11 #include <fcntl.h> |
13 | 12 |
14 #include <fontconfig/fontconfig.h> | 13 #include <fontconfig/fontconfig.h> |
15 | 14 |
16 #include "SkBuffer.h" | 15 #include "SkBuffer.h" |
17 #include "SkFontConfigInterface.h" | 16 #include "SkFontConfigInterface.h" |
18 #include "SkLazyPtr.h" | 17 #include "SkLazyPtr.h" |
19 #include "SkStream.h" | 18 #include "SkStream.h" |
| 19 #include "SkString.h" |
20 | 20 |
21 size_t SkFontConfigInterface::FontIdentity::writeToMemory(void* addr) const { | 21 size_t SkFontConfigInterface::FontIdentity::writeToMemory(void* addr) const { |
22 size_t size = sizeof(fID) + sizeof(fTTCIndex); | 22 size_t size = sizeof(fID) + sizeof(fTTCIndex); |
23 size += sizeof(int32_t) + sizeof(int32_t) + sizeof(uint8_t); // weight, widt
h, italic | 23 size += sizeof(int32_t) + sizeof(int32_t) + sizeof(uint8_t); // weight, widt
h, italic |
24 size += sizeof(int32_t) + fString.size(); // store length+data | 24 size += sizeof(int32_t) + fString.size(); // store length+data |
25 if (addr) { | 25 if (addr) { |
26 SkWBuffer buffer(addr, size); | 26 SkWBuffer buffer(addr, size); |
27 | 27 |
28 buffer.write32(fID); | 28 buffer.write32(fID); |
29 buffer.write32(fTTCIndex); | 29 buffer.write32(fTTCIndex); |
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
311 FontEquivClass class_a = GetFontEquivClass(font_a); | 311 FontEquivClass class_a = GetFontEquivClass(font_a); |
312 FontEquivClass class_b = GetFontEquivClass(font_b); | 312 FontEquivClass class_b = GetFontEquivClass(font_b); |
313 | 313 |
314 return class_a != OTHER && class_a == class_b; | 314 return class_a != OTHER && class_a == class_b; |
315 } | 315 } |
316 | 316 |
317 // Normally we only return exactly the font asked for. In last-resort | 317 // Normally we only return exactly the font asked for. In last-resort |
318 // cases, the request either doesn't specify a font or is one of the | 318 // cases, the request either doesn't specify a font or is one of the |
319 // basic font names like "Sans", "Serif" or "Monospace". This function | 319 // basic font names like "Sans", "Serif" or "Monospace". This function |
320 // tells you whether a given request is for such a fallback. | 320 // tells you whether a given request is for such a fallback. |
321 bool IsFallbackFontAllowed(const std::string& family) { | 321 bool IsFallbackFontAllowed(const SkString& family) { |
322 const char* family_cstr = family.c_str(); | 322 const char* family_cstr = family.c_str(); |
323 return family.empty() || | 323 return family.isEmpty() || |
324 strcasecmp(family_cstr, "sans") == 0 || | 324 strcasecmp(family_cstr, "sans") == 0 || |
325 strcasecmp(family_cstr, "serif") == 0 || | 325 strcasecmp(family_cstr, "serif") == 0 || |
326 strcasecmp(family_cstr, "monospace") == 0; | 326 strcasecmp(family_cstr, "monospace") == 0; |
327 } | 327 } |
328 | 328 |
329 static bool valid_pattern(FcPattern* pattern) { | 329 static bool valid_pattern(FcPattern* pattern) { |
330 #ifdef SK_FONT_CONFIG_ONLY_ALLOW_SCALABLE_FONTS | 330 #ifdef SK_FONT_CONFIG_ONLY_ALLOW_SCALABLE_FONTS |
331 FcBool is_scalable; | 331 FcBool is_scalable; |
332 if (FcPatternGetBool(pattern, FC_SCALABLE, 0, &is_scalable) != FcResultMatch | 332 if (FcPatternGetBool(pattern, FC_SCALABLE, 0, &is_scalable) != FcResultMatch |
333 || !is_scalable) { | 333 || !is_scalable) { |
334 return false; | 334 return false; |
335 } | 335 } |
336 #endif | 336 #endif |
337 | 337 |
338 // fontconfig can also return fonts which are unreadable | 338 // fontconfig can also return fonts which are unreadable |
339 const char* c_filename = get_name(pattern, FC_FILE); | 339 const char* c_filename = get_name(pattern, FC_FILE); |
340 if (!c_filename) { | 340 if (!c_filename) { |
341 return false; | 341 return false; |
342 } | 342 } |
343 if (access(c_filename, R_OK) != 0) { | 343 if (access(c_filename, R_OK) != 0) { |
344 return false; | 344 return false; |
345 } | 345 } |
346 return true; | 346 return true; |
347 } | 347 } |
348 | 348 |
349 // Find matching font from |font_set| for the given font family. | 349 // Find matching font from |font_set| for the given font family. |
350 FcPattern* MatchFont(FcFontSet* font_set, | 350 FcPattern* MatchFont(FcFontSet* font_set, |
351 const char* post_config_family, | 351 const char* post_config_family, |
352 const std::string& family) { | 352 const SkString& family) { |
353 // Older versions of fontconfig have a bug where they cannot select | 353 // Older versions of fontconfig have a bug where they cannot select |
354 // only scalable fonts so we have to manually filter the results. | 354 // only scalable fonts so we have to manually filter the results. |
355 FcPattern* match = NULL; | 355 FcPattern* match = NULL; |
356 for (int i = 0; i < font_set->nfont; ++i) { | 356 for (int i = 0; i < font_set->nfont; ++i) { |
357 FcPattern* current = font_set->fonts[i]; | 357 FcPattern* current = font_set->fonts[i]; |
358 if (valid_pattern(current)) { | 358 if (valid_pattern(current)) { |
359 match = current; | 359 match = current; |
360 break; | 360 break; |
361 } | 361 } |
362 } | 362 } |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
434 } | 434 } |
435 | 435 |
436 SkFontConfigInterfaceDirect::~SkFontConfigInterfaceDirect() { | 436 SkFontConfigInterfaceDirect::~SkFontConfigInterfaceDirect() { |
437 } | 437 } |
438 | 438 |
439 bool SkFontConfigInterfaceDirect::matchFamilyName(const char familyName[], | 439 bool SkFontConfigInterfaceDirect::matchFamilyName(const char familyName[], |
440 SkTypeface::Style style, | 440 SkTypeface::Style style, |
441 FontIdentity* outIdentity, | 441 FontIdentity* outIdentity, |
442 SkString* outFamilyName, | 442 SkString* outFamilyName, |
443 SkTypeface::Style* outStyle) { | 443 SkTypeface::Style* outStyle) { |
444 std::string familyStr(familyName ? familyName : ""); | 444 SkString familyStr(familyName ? familyName : ""); |
445 if (familyStr.length() > kMaxFontFamilyLength) { | 445 if (familyStr.size() > kMaxFontFamilyLength) { |
446 return false; | 446 return false; |
447 } | 447 } |
448 | 448 |
449 SkAutoMutexAcquire ac(mutex_); | 449 SkAutoMutexAcquire ac(mutex_); |
450 | 450 |
451 FcPattern* pattern = FcPatternCreate(); | 451 FcPattern* pattern = FcPatternCreate(); |
452 | 452 |
453 if (familyName) { | 453 if (familyName) { |
454 FcPatternAddString(pattern, FC_FAMILY, (FcChar8*)familyName); | 454 FcPatternAddString(pattern, FC_FAMILY, (FcChar8*)familyName); |
455 } | 455 } |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
601 return SkDataTable::NewCopyArrays((const void*const*)names.begin(), | 601 return SkDataTable::NewCopyArrays((const void*const*)names.begin(), |
602 sizes.begin(), names.count()); | 602 sizes.begin(), names.count()); |
603 } | 603 } |
604 | 604 |
605 bool SkFontConfigInterfaceDirect::matchFamilySet(const char inFamilyName[], | 605 bool SkFontConfigInterfaceDirect::matchFamilySet(const char inFamilyName[], |
606 SkString* outFamilyName, | 606 SkString* outFamilyName, |
607 SkTArray<FontIdentity>* ids) { | 607 SkTArray<FontIdentity>* ids) { |
608 SkAutoMutexAcquire ac(mutex_); | 608 SkAutoMutexAcquire ac(mutex_); |
609 | 609 |
610 #if 0 | 610 #if 0 |
611 std::string familyStr(familyName ? familyName : ""); | 611 SkString familyStr(familyName ? familyName : ""); |
612 if (familyStr.length() > kMaxFontFamilyLength) { | 612 if (familyStr.size() > kMaxFontFamilyLength) { |
613 return false; | 613 return false; |
614 } | 614 } |
615 | 615 |
616 SkAutoMutexAcquire ac(mutex_); | 616 SkAutoMutexAcquire ac(mutex_); |
617 | 617 |
618 FcPattern* pattern = FcPatternCreate(); | 618 FcPattern* pattern = FcPatternCreate(); |
619 | 619 |
620 if (familyName) { | 620 if (familyName) { |
621 FcPatternAddString(pattern, FC_FAMILY, (FcChar8*)familyName); | 621 FcPatternAddString(pattern, FC_FAMILY, (FcChar8*)familyName); |
622 } | 622 } |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
724 *trimmedMatches.append() = match[i]; | 724 *trimmedMatches.append() = match[i]; |
725 } | 725 } |
726 } | 726 } |
727 | 727 |
728 SkFontStyleSet_FC* sset = SkNEW_ARGS(SkFontStyleSet_FC, | 728 SkFontStyleSet_FC* sset = SkNEW_ARGS(SkFontStyleSet_FC, |
729 (trimmedMatches.begin(), | 729 (trimmedMatches.begin(), |
730 trimmedMatches.count())); | 730 trimmedMatches.count())); |
731 #endif | 731 #endif |
732 return false; | 732 return false; |
733 } | 733 } |
OLD | NEW |