Chromium Code Reviews| 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 "SkBuffer.h" | 10 #include "SkBuffer.h" |
| 11 #include "SkDataTable.h" | 11 #include "SkDataTable.h" |
| 12 #include "SkFontConfigInterface.h" | 12 #include "SkFontConfigInterface.h" |
| 13 #include "SkFontStyle.h" | 13 #include "SkFontStyle.h" |
| 14 #include "SkMutex.h" | 14 #include "SkMutex.h" |
| 15 #include "SkStream.h" | 15 #include "SkStream.h" |
| 16 #include "SkString.h" | 16 #include "SkString.h" |
| 17 #include "SkTArray.h" | 17 #include "SkTArray.h" |
| 18 #include "SkTDArray.h" | 18 #include "SkTDArray.h" |
| 19 #include "SkTemplates.h" | 19 #include "SkTemplates.h" |
| 20 #include "SkTypeface.h" | 20 #include "SkTypeface.h" |
| 21 #include "SkTypes.h" | 21 #include "SkTypes.h" |
| 22 | 22 |
| 23 #include <fontconfig/fontconfig.h> | 23 #include <fontconfig/fontconfig.h> |
| 24 #include <unistd.h> | 24 #include <unistd.h> |
| 25 | 25 |
| 26 #if defined(GOOGLE3) | |
|
bungeman-skia
2015/11/23 19:04:54
I would very much like to minimize this craziness.
| |
| 27 #include "google_font_file_buffering.h" | |
| 28 #endif | |
| 29 | |
| 26 size_t SkFontConfigInterface::FontIdentity::writeToMemory(void* addr) const { | 30 size_t SkFontConfigInterface::FontIdentity::writeToMemory(void* addr) const { |
| 27 size_t size = sizeof(fID) + sizeof(fTTCIndex); | 31 size_t size = sizeof(fID) + sizeof(fTTCIndex); |
| 28 size += sizeof(int32_t) + sizeof(int32_t) + sizeof(uint8_t); // weight, widt h, italic | 32 size += sizeof(int32_t) + sizeof(int32_t) + sizeof(uint8_t); // weight, widt h, italic |
| 29 size += sizeof(int32_t) + fString.size(); // store length+data | 33 size += sizeof(int32_t) + fString.size(); // store length+data |
| 30 if (addr) { | 34 if (addr) { |
| 31 SkWBuffer buffer(addr, size); | 35 SkWBuffer buffer(addr, size); |
| 32 | 36 |
| 33 buffer.write32(fID); | 37 buffer.write32(fID); |
| 34 buffer.write32(fTTCIndex); | 38 buffer.write32(fTTCIndex); |
| 35 buffer.write32(fString.size()); | 39 buffer.write32(fString.size()); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 100 SkASSERT(iden0 != iden1); | 104 SkASSERT(iden0 != iden1); |
| 101 | 105 |
| 102 make_iden(&iden1); | 106 make_iden(&iden1); |
| 103 SkASSERT(iden0 == iden1); | 107 SkASSERT(iden0 == iden1); |
| 104 | 108 |
| 105 test_writeToMemory(iden0, 0); | 109 test_writeToMemory(iden0, 0); |
| 106 test_writeToMemory(iden0, 0); | 110 test_writeToMemory(iden0, 0); |
| 107 } | 111 } |
| 108 #endif | 112 #endif |
| 109 | 113 |
| 110 class SkFontConfigInterfaceDirect : public SkFontConfigInterface { | 114 class SkFontConfigInterfaceDirect : public SkFontConfigInterface { |
|
bungeman-skia
2015/11/23 21:39:59
So here's a plan. Take this definition and put it
| |
| 111 public: | 115 public: |
| 112 SkFontConfigInterfaceDirect(); | 116 SkFontConfigInterfaceDirect(); |
| 113 virtual ~SkFontConfigInterfaceDirect(); | 117 virtual ~SkFontConfigInterfaceDirect(); |
| 114 | 118 |
| 115 virtual bool matchFamilyName(const char familyName[], | 119 virtual bool matchFamilyName(const char familyName[], |
| 116 SkTypeface::Style requested, | 120 SkTypeface::Style requested, |
| 117 FontIdentity* outFontIdentifier, | 121 FontIdentity* outFontIdentifier, |
| 118 SkString* outFamilyName, | 122 SkString* outFamilyName, |
| 119 SkTypeface::Style* outStyle) override; | 123 SkTypeface::Style* outStyle) override; |
| 120 SkStreamAsset* openStream(const FontIdentity&) override; | 124 SkStreamAsset* openStream(const FontIdentity&) override; |
| 121 | 125 |
| 122 // new APIs | 126 // new APIs |
| 123 SkDataTable* getFamilyNames() override; | 127 SkDataTable* getFamilyNames() override; |
| 124 virtual bool matchFamilySet(const char inFamilyName[], | 128 virtual bool matchFamilySet(const char inFamilyName[], |
| 125 SkString* outFamilyName, | 129 SkString* outFamilyName, |
| 126 SkTArray<FontIdentity>*) override; | 130 SkTArray<FontIdentity>*) override; |
| 127 | 131 |
| 128 private: | 132 private: |
| 129 SkMutex mutex_; | 133 SkMutex mutex_; |
| 130 }; | 134 }; |
| 131 | 135 |
| 132 SkFontConfigInterface* SkFontConfigInterface::GetSingletonDirectInterface(SkBase Mutex* mutex) { | 136 SkFontConfigInterface* SkFontConfigInterface::GetSingletonDirectInterface(SkBase Mutex* mutex) { |
|
bungeman-skia
2015/11/23 21:39:59
Then, since this is a factory, put this in a separ
| |
| 133 SkAutoMutexAcquire ac(mutex); | 137 SkAutoMutexAcquire ac(mutex); |
| 134 static SkFontConfigInterfaceDirect* singleton = nullptr; | 138 static SkFontConfigInterfaceDirect* singleton = nullptr; |
| 135 if (singleton == nullptr) { | 139 if (singleton == nullptr) { |
| 136 singleton = new SkFontConfigInterfaceDirect; | 140 singleton = new SkFontConfigInterfaceDirect; |
| 137 } | 141 } |
| 138 return singleton; | 142 return singleton; |
| 139 } | 143 } |
| 140 | 144 |
| 141 /////////////////////////////////////////////////////////////////////////////// | 145 /////////////////////////////////////////////////////////////////////////////// |
| 142 | 146 |
| (...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 341 || !is_scalable) { | 345 || !is_scalable) { |
| 342 return false; | 346 return false; |
| 343 } | 347 } |
| 344 #endif | 348 #endif |
| 345 | 349 |
| 346 // fontconfig can also return fonts which are unreadable | 350 // fontconfig can also return fonts which are unreadable |
| 347 const char* c_filename = get_name(pattern, FC_FILE); | 351 const char* c_filename = get_name(pattern, FC_FILE); |
| 348 if (!c_filename) { | 352 if (!c_filename) { |
| 349 return false; | 353 return false; |
| 350 } | 354 } |
| 355 | |
| 356 #if defined(GOOGLE3) | |
|
bungeman-skia
2015/11/23 21:39:59
This block is harder to remove, but since it wasn'
bungeman-skia
2015/11/24 21:56:36
This block is needed, or at least the 'access' cod
| |
| 357 // Check if this font has been pre-loaded into memory. | |
| 358 const char* unused; | |
| 359 if (GoogleFreeType::GoogleFt2ReadFontFromMemory(c_filename, &unused) >= 0) { | |
| 360 return true; | |
| 361 } | |
| 362 #endif | |
| 363 | |
| 351 if (access(c_filename, R_OK) != 0) { | 364 if (access(c_filename, R_OK) != 0) { |
| 352 return false; | 365 return false; |
| 353 } | 366 } |
| 367 | |
| 354 return true; | 368 return true; |
| 355 } | 369 } |
| 356 | 370 |
| 357 // Find matching font from |font_set| for the given font family. | 371 // Find matching font from |font_set| for the given font family. |
| 358 FcPattern* MatchFont(FcFontSet* font_set, | 372 FcPattern* MatchFont(FcFontSet* font_set, |
| 359 const char* post_config_family, | 373 const char* post_config_family, |
| 360 const SkString& family) { | 374 const SkString& family) { |
| 361 // Older versions of fontconfig have a bug where they cannot select | 375 // Older versions of fontconfig have a bug where they cannot select |
| 362 // only scalable fonts so we have to manually filter the results. | 376 // only scalable fonts so we have to manually filter the results. |
| 363 FcPattern* match = nullptr; | 377 FcPattern* match = nullptr; |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 552 if (outFamilyName) { | 566 if (outFamilyName) { |
| 553 outFamilyName->set(post_config_family); | 567 outFamilyName->set(post_config_family); |
| 554 } | 568 } |
| 555 if (outStyle) { | 569 if (outStyle) { |
| 556 *outStyle = GetFontStyle(match); | 570 *outStyle = GetFontStyle(match); |
| 557 } | 571 } |
| 558 return true; | 572 return true; |
| 559 } | 573 } |
| 560 | 574 |
| 561 SkStreamAsset* SkFontConfigInterfaceDirect::openStream(const FontIdentity& ident ity) { | 575 SkStreamAsset* SkFontConfigInterfaceDirect::openStream(const FontIdentity& ident ity) { |
| 562 return SkStream::NewFromFile(identity.fString.c_str()); | 576 const char* c_filename = identity.fString.c_str(); |
| 577 #if defined(GOOGLE3) | |
| 578 // Read the system fonts from the fonts we've pre-loaded into memory. | |
| 579 const char* buffer; | |
| 580 int length = GoogleFreeType::GoogleFt2ReadFontFromMemory( | |
| 581 c_filename, &buffer); | |
| 582 if (length >= 0) return new SkMemoryStream(buffer, length); | |
| 583 #endif | |
| 584 return SkStream::NewFromFile(c_filename); | |
| 563 } | 585 } |
| 564 | 586 |
| 565 /////////////////////////////////////////////////////////////////////////////// | 587 /////////////////////////////////////////////////////////////////////////////// |
| 566 | 588 |
| 567 static bool find_name(const SkTDArray<const char*>& list, const char* str) { | 589 static bool find_name(const SkTDArray<const char*>& list, const char* str) { |
| 568 int count = list.count(); | 590 int count = list.count(); |
| 569 for (int i = 0; i < count; ++i) { | 591 for (int i = 0; i < count; ++i) { |
| 570 if (!strcmp(list[i], str)) { | 592 if (!strcmp(list[i], str)) { |
| 571 return true; | 593 return true; |
| 572 } | 594 } |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 730 const char* justName = find_just_name(get_name(match[i], FC_FILE)); | 752 const char* justName = find_just_name(get_name(match[i], FC_FILE)); |
| 731 if (!is_lower(*justName)) { | 753 if (!is_lower(*justName)) { |
| 732 *trimmedMatches.append() = match[i]; | 754 *trimmedMatches.append() = match[i]; |
| 733 } | 755 } |
| 734 } | 756 } |
| 735 | 757 |
| 736 SkFontStyleSet_FC* sset = new SkFontStyleSet_FC (trimmedMatches.begin(), trimmedMatches.count()); | 758 SkFontStyleSet_FC* sset = new SkFontStyleSet_FC (trimmedMatches.begin(), trimmedMatches.count()); |
| 737 #endif | 759 #endif |
| 738 return false; | 760 return false; |
| 739 } | 761 } |
| OLD | NEW |