Index: trunk/src/ports/SkFontConfigInterface_direct.cpp |
=================================================================== |
--- trunk/src/ports/SkFontConfigInterface_direct.cpp (revision 7879) |
+++ trunk/src/ports/SkFontConfigInterface_direct.cpp (working copy) |
@@ -7,7 +7,6 @@ |
/* migrated from chrome/src/skia/ext/SkFontHost_fontconfig_direct.cpp */ |
-#include <map> |
#include <string> |
#include <unistd.h> |
#include <fcntl.h> |
@@ -15,7 +14,6 @@ |
#include <fontconfig/fontconfig.h> |
#include "SkFontConfigInterface.h" |
-//#include "SkUtils.h" |
#include "SkStream.h" |
class SkFontConfigInterfaceDirect : public SkFontConfigInterface { |
@@ -23,28 +21,15 @@ |
SkFontConfigInterfaceDirect(); |
virtual ~SkFontConfigInterfaceDirect(); |
- virtual bool match(const char familyName[], SkTypeface::Style requested, |
- unsigned* fileFaceID, SkTypeface::Style* outStyle) SK_OVERRIDE; |
- virtual bool getFamilyName(unsigned fileFaceID, SkString* name) SK_OVERRIDE; |
- virtual SkStream* openStream(unsigned fileFaceID) SK_OVERRIDE; |
+ virtual bool matchFamilyName(const char familyName[], |
+ SkTypeface::Style requested, |
+ FontIdentity* outFontIdentifier, |
+ SkString* outFamilyName, |
+ SkTypeface::Style* outStyle) SK_OVERRIDE; |
+ virtual SkStream* openStream(const FontIdentity&) SK_OVERRIDE; |
private: |
SkMutex mutex_; |
- |
- // fileid stored in two maps below are unique per font file. |
- std::map<unsigned, std::string> fileid_to_filename_; |
- std::map<std::string, unsigned> filename_to_fileid_; |
- |
- // Cache of |family,style| to |FontMatch| to minimize querying FontConfig. |
- typedef std::pair<std::string, int> FontMatchKey; |
- struct FontMatch { |
- std::string family; |
- SkTypeface::Style style; |
- unsigned filefaceid; |
- }; |
- std::map<FontMatchKey, FontMatch> font_match_cache_; |
- |
- unsigned next_file_id_; |
}; |
SkFontConfigInterface* SkCreateDirectFontConfigInterface(); |
@@ -290,13 +275,7 @@ |
} |
// Retrieves |is_bold|, |is_italic| and |font_family| properties from |font|. |
-bool GetFontProperties(FcPattern* font, |
- std::string* font_family, |
- SkTypeface::Style* style) { |
- FcChar8* c_family; |
- if (FcPatternGetString(font, FC_FAMILY, 0, &c_family)) |
- return false; |
- |
+SkTypeface::Style GetFontStyle(FcPattern* font) { |
int resulting_bold; |
if (FcPatternGetInteger(font, FC_WEIGHT, 0, &resulting_bold)) |
resulting_bold = FC_WEIGHT_NORMAL; |
@@ -325,28 +304,27 @@ |
styleBits |= SkTypeface::kItalic; |
} |
- *font_family = reinterpret_cast<char*>(c_family); |
- *style = (SkTypeface::Style)styleBits; |
- return true; |
+ return (SkTypeface::Style)styleBits; |
} |
} // anonymous namespace |
/////////////////////////////////////////////////////////////////////////////// |
-#define kMaxFontFamilyLength 1024 |
+#define kMaxFontFamilyLength 2048 |
-SkFontConfigInterfaceDirect::SkFontConfigInterfaceDirect() : next_file_id_(0) { |
+SkFontConfigInterfaceDirect::SkFontConfigInterfaceDirect() { |
FcInit(); |
} |
SkFontConfigInterfaceDirect::~SkFontConfigInterfaceDirect() { |
} |
-bool SkFontConfigInterfaceDirect::match(const char familyName[], |
- SkTypeface::Style style, |
- unsigned* result_filefaceid, |
- SkTypeface::Style* result_style) { |
+bool SkFontConfigInterfaceDirect::matchFamilyName(const char familyName[], |
+ SkTypeface::Style style, |
+ FontIdentity* outIdentity, |
+ SkString* outFamilyName, |
+ SkTypeface::Style* outStyle) { |
std::string familyStr(familyName ? familyName : ""); |
if (familyStr.length() > kMaxFontFamilyLength) { |
return false; |
@@ -354,18 +332,6 @@ |
SkAutoMutexAcquire ac(mutex_); |
- // search our cache |
- { |
- FontMatchKey key = FontMatchKey(familyStr, style); |
- const std::map<FontMatchKey, FontMatch>::const_iterator i = |
- font_match_cache_.find(key); |
- if (i != font_match_cache_.end()) { |
- *result_style = i->second.style; |
- *result_filefaceid = i->second.filefaceid; |
- return true; |
- } |
- } |
- |
FcPattern* pattern = FcPatternCreate(); |
if (familyName) { |
@@ -429,133 +395,43 @@ |
FcPatternDestroy(pattern); |
+ // From here out we just extract our results from 'match' |
+ |
+ if (FcPatternGetString(match, FC_FAMILY, 0, &post_config_family) != FcResultMatch) { |
+ FcFontSetDestroy(font_set); |
+ return false; |
+ } |
+ |
FcChar8* c_filename; |
if (FcPatternGetString(match, FC_FILE, 0, &c_filename) != FcResultMatch) { |
FcFontSetDestroy(font_set); |
return false; |
} |
+ |
int face_index; |
if (FcPatternGetInteger(match, FC_INDEX, 0, &face_index) != FcResultMatch) { |
FcFontSetDestroy(font_set); |
return false; |
} |
- FontMatch font_match; |
- { |
- unsigned out_fileid; |
- const std::string filename(reinterpret_cast<char*>(c_filename)); |
- const std::map<std::string, unsigned>::const_iterator |
- i = filename_to_fileid_.find(filename); |
- if (i == filename_to_fileid_.end()) { |
- out_fileid = next_file_id_++; |
- filename_to_fileid_[filename] = out_fileid; |
- fileid_to_filename_[out_fileid] = filename; |
- } else { |
- out_fileid = i->second; |
- } |
- // fileid stored in filename_to_fileid_ and fileid_to_filename_ is |
- // unique only up to the font file. We have to encode face_index for |
- // the out param. |
- font_match.filefaceid = |
- FileIdAndFaceIndexToFileFaceId(out_fileid, face_index); |
- } |
- |
- bool success = GetFontProperties(match, |
- &font_match.family, |
- &font_match.style); |
FcFontSetDestroy(font_set); |
- if (success) { |
- font_match_cache_[FontMatchKey(familyStr, style)] = font_match; |
- *result_filefaceid = font_match.filefaceid; |
- *result_style = font_match.style; |
+ if (outIdentity) { |
+ outIdentity->fIntPtr = face_index; |
+ outIdentity->fString.set((const char*)c_filename); |
} |
- |
- return success; |
-} |
- |
-#include <fontconfig/fcfreetype.h> |
- |
-bool SkFontConfigInterfaceDirect::getFamilyName(unsigned filefaceid, |
- SkString* result_family) { |
- SkAutoMutexAcquire ac(mutex_); |
- |
-#if 0 |
- FcPattern* pattern = FcPatternCreate(); |
- SkString filename; |
- |
- { |
- const std::map<unsigned, std::string>::const_iterator |
- i = fileid_to_filename_.find(FileFaceIdToFileId(filefaceid)); |
- if (i == fileid_to_filename_.end()) { |
- FcPatternDestroy(pattern); |
- return false; |
- } |
- int face_index = filefaceid & 0xfu; |
- filename.set(i->second.c_str()); |
- FcPatternAddString(pattern, FC_FILE, |
- reinterpret_cast<const FcChar8*>(i->second.c_str())); |
- FcPatternAddInteger(pattern, FC_INDEX, face_index); |
+ if (outFamilyName) { |
+ outFamilyName->set((const char*)post_config_family); |
} |
- |
- FcPatternAddBool(pattern, FC_SCALABLE, FcTrue); |
- |
- FcConfigSubstitute(NULL, pattern, FcMatchPattern); |
- FcDefaultSubstitute(pattern); |
- |
- FcResult result; |
- FcFontSet* font_set = FcFontSort(0, pattern, 0, 0, &result); |
- if (!font_set || font_set->nfont <= 0) { |
- FcPatternDestroy(pattern); |
- return false; |
+ if (outStyle) { |
+ *outStyle = GetFontStyle(match); |
} |
- |
- bool found = false; |
- for (int i = 0; i < font_set->nfont; ++i) { |
- FcChar8* file; |
- FcPatternGetString(font_set->fonts[i], FC_FILE, 0, &file); |
- if (filename.equals((const char*)file)) { |
- FcChar8* family; |
- FcPatternGetString(font_set->fonts[i], FC_FAMILY, 0, &family); |
- result_family->set((const char*)family); |
- found = true; |
- break; |
- } |
- } |
- |
- FcPatternDestroy(pattern); |
- FcFontSetDestroy(font_set); |
- return found; |
-#else |
- const std::map<unsigned, std::string>::const_iterator |
- i = fileid_to_filename_.find(FileFaceIdToFileId(filefaceid)); |
- if (i == fileid_to_filename_.end()) { |
- return false; |
- } |
- |
- int face_index = filefaceid & 0xfu; |
- int count; |
- FcPattern* pattern = FcFreeTypeQuery((const FcChar8*)i->second.c_str(), |
- face_index, NULL, &count); |
- if (!pattern || count <= 0) { |
- return false; |
- } |
- |
- FcChar8* family; |
- FcPatternGetString(pattern, FC_FAMILY, 0, &family); |
- |
- result_family->set((const char*)family); |
return true; |
-#endif |
} |
-SkStream* SkFontConfigInterfaceDirect::openStream(unsigned filefaceid) { |
- SkAutoMutexAcquire ac(mutex_); |
- const std::map<unsigned, std::string>::const_iterator |
- i = fileid_to_filename_.find(FileFaceIdToFileId(filefaceid)); |
- if (i == fileid_to_filename_.end()) { |
- return NULL; |
- } |
- int fd = open(i->second.c_str(), O_RDONLY); |
+SkStream* SkFontConfigInterfaceDirect::openStream(const FontIdentity& identity) { |
+ int fd = open(identity.fString.c_str(), O_RDONLY); |
return (fd >= 0) ? SkNEW_ARGS(SkFDStream, (fd, true)) : NULL; |
} |
+ |
+ |