diff options
Diffstat (limited to 'skia/ext')
-rw-r--r-- | skia/ext/SkFontHost_fontconfig.cpp | 15 | ||||
-rw-r--r-- | skia/ext/SkFontHost_fontconfig_direct.cpp | 35 | ||||
-rw-r--r-- | skia/ext/SkFontHost_fontconfig_direct.h | 2 | ||||
-rw-r--r-- | skia/ext/SkFontHost_fontconfig_impl.h | 8 | ||||
-rw-r--r-- | skia/ext/SkFontHost_fontconfig_ipc.cpp | 20 | ||||
-rw-r--r-- | skia/ext/SkFontHost_fontconfig_ipc.h | 2 |
6 files changed, 53 insertions, 29 deletions
diff --git a/skia/ext/SkFontHost_fontconfig.cpp b/skia/ext/SkFontHost_fontconfig.cpp index 04ac5b9d..2ecbe6c 100644 --- a/skia/ext/SkFontHost_fontconfig.cpp +++ b/skia/ext/SkFontHost_fontconfig.cpp @@ -101,7 +101,7 @@ SkTypeface* SkFontHost::CreateTypeface(const SkTypeface* familyFace, const unsigned fileid = UniqueIdToFileId(familyFace->uniqueID()); if (!GetFcImpl()->Match( &resolved_family_name, NULL, true /* fileid valid */, fileid, "", - -1, -1)) { + NULL, NULL)) { return NULL; } } else if (familyName) { @@ -110,16 +110,19 @@ SkTypeface* SkFontHost::CreateTypeface(const SkTypeface* familyFace, return NULL; } - const bool bold = style & SkTypeface::kBold; - const bool italic = style & SkTypeface::kItalic; + bool bold = style & SkTypeface::kBold; + bool italic = style & SkTypeface::kItalic; unsigned fileid; if (!GetFcImpl()->Match(NULL, &fileid, false, -1, /* no fileid */ - resolved_family_name, bold, italic)) { + resolved_family_name, &bold, &italic)) { return NULL; } + const SkTypeface::Style resulting_style = static_cast<SkTypeface::Style>( + (bold ? SkTypeface::kBold : 0) | + (italic ? SkTypeface::kItalic : 0)); - const unsigned id = FileIdAndStyleToUniqueId(fileid, style); - SkTypeface* typeface = SkNEW_ARGS(FontConfigTypeface, (style, id)); + const unsigned id = FileIdAndStyleToUniqueId(fileid, resulting_style); + SkTypeface* typeface = SkNEW_ARGS(FontConfigTypeface, (resulting_style, id)); { SkAutoMutexAcquire ac(global_fc_map_lock); diff --git a/skia/ext/SkFontHost_fontconfig_direct.cpp b/skia/ext/SkFontHost_fontconfig_direct.cpp index 5d425c2..dc20aff 100644 --- a/skia/ext/SkFontHost_fontconfig_direct.cpp +++ b/skia/ext/SkFontHost_fontconfig_direct.cpp @@ -43,8 +43,8 @@ static bool IsFallbackFontAllowed(const std::string& family) bool FontConfigDirect::Match(std::string* result_family, unsigned* result_fileid, bool fileid_valid, unsigned fileid, - const std::string& family, int is_bold, - int is_italic) { + const std::string& family, bool* is_bold, + bool* is_italic) { SkAutoMutexAcquire ac(mutex_); FcPattern* pattern = FcPatternCreate(); @@ -66,16 +66,14 @@ bool FontConfigDirect::Match(std::string* result_family, fcvalue.u.s = (FcChar8*) family.c_str(); FcPatternAdd(pattern, FC_FAMILY, fcvalue, 0); } - if (is_bold > 0) { - fcvalue.type = FcTypeInteger; - fcvalue.u.i = is_bold ? FC_WEIGHT_BOLD : FC_WEIGHT_NORMAL; - FcPatternAdd(pattern, FC_WEIGHT, fcvalue, 0); - } - if (is_italic > 0) { - fcvalue.type = FcTypeInteger; - fcvalue.u.i = is_italic ? FC_SLANT_ITALIC : FC_SLANT_ROMAN; - FcPatternAdd(pattern, FC_SLANT, fcvalue, 0); - } + + fcvalue.type = FcTypeInteger; + fcvalue.u.i = is_bold && *is_bold ? FC_WEIGHT_BOLD : FC_WEIGHT_NORMAL; + FcPatternAdd(pattern, FC_WEIGHT, fcvalue, 0); + + fcvalue.type = FcTypeInteger; + fcvalue.u.i = is_italic && *is_italic ? FC_SLANT_ITALIC : FC_SLANT_ROMAN; + FcPatternAdd(pattern, FC_SLANT, fcvalue, 0); FcConfigSubstitute(0, pattern, FcMatchPattern); FcDefaultSubstitute(pattern); @@ -173,6 +171,19 @@ bool FontConfigDirect::Match(std::string* result_family, return NULL; } + int resulting_bold; + if (FcPatternGetInteger(match, FC_WEIGHT, 0, &resulting_bold)) + resulting_bold = FC_WEIGHT_NORMAL; + + int resulting_italic; + if (FcPatternGetInteger(match, FC_SLANT, 0, &resulting_italic)) + resulting_italic = FC_SLANT_ROMAN; + + if (is_bold) + *is_bold = resulting_bold >= FC_WEIGHT_BOLD; + if (is_italic) + *is_italic = resulting_italic == FC_SLANT_ITALIC; + if (result_family) *result_family = (char *) c_family; diff --git a/skia/ext/SkFontHost_fontconfig_direct.h b/skia/ext/SkFontHost_fontconfig_direct.h index d9c934a..56bea34 100644 --- a/skia/ext/SkFontHost_fontconfig_direct.h +++ b/skia/ext/SkFontHost_fontconfig_direct.h @@ -31,7 +31,7 @@ class FontConfigDirect : public FontConfigInterface { // FontConfigInterface implementation. Thread safe. virtual bool Match(std::string* result_family, unsigned* result_fileid, bool fileid_valid, unsigned fileid, - const std::string& family, int is_bold, int is_italic); + const std::string& family, bool* is_bold, bool* is_italic); virtual int Open(unsigned fileid); private: diff --git a/skia/ext/SkFontHost_fontconfig_impl.h b/skia/ext/SkFontHost_fontconfig_impl.h index a593891..f3b4b41 100644 --- a/skia/ext/SkFontHost_fontconfig_impl.h +++ b/skia/ext/SkFontHost_fontconfig_impl.h @@ -39,8 +39,8 @@ class FontConfigInterface { * trying to match. * @param family (optional) the family of the font that we are trying to * match. - * @param is_bold (optional, set to -1 to ignore) - * @param is_italic (optional, set to -1 to ignore) + * @param is_bold (optional, set to NULL to ignore, in/out) + * @param is_italic (optional, set to NULL to ignore, in/out) * @return true iff successful. */ virtual bool Match( @@ -49,8 +49,8 @@ class FontConfigInterface { bool fileid_valid, unsigned fileid, const std::string& family, - int is_bold, - int is_italic) = 0; + bool* is_bold, + bool* is_italic) = 0; /** Open a font file given the fileid as returned by Match */ diff --git a/skia/ext/SkFontHost_fontconfig_ipc.cpp b/skia/ext/SkFontHost_fontconfig_ipc.cpp index e3868f4..ada7bc9 100644 --- a/skia/ext/SkFontHost_fontconfig_ipc.cpp +++ b/skia/ext/SkFontHost_fontconfig_ipc.cpp @@ -39,15 +39,17 @@ FontConfigIPC::~FontConfigIPC() { bool FontConfigIPC::Match(std::string* result_family, unsigned* result_fileid, bool fileid_valid, unsigned fileid, - const std::string& family, int is_bold, - int is_italic) { + const std::string& family, bool* is_bold, + bool* is_italic) { Pickle request; request.WriteInt(METHOD_MATCH); request.WriteBool(fileid_valid); if (fileid_valid) request.WriteUInt32(fileid); - request.WriteBool(is_bold); - request.WriteBool(is_italic); + + request.WriteBool(is_bold && *is_bold); + request.WriteBool(is_bold && *is_italic); + request.WriteString(family); uint8_t reply_buf[512]; @@ -66,8 +68,11 @@ bool FontConfigIPC::Match(std::string* result_family, uint32_t reply_fileid; std::string reply_family; + bool resulting_bold, resulting_italic; if (!reply.ReadUInt32(&iter, &reply_fileid) || - !reply.ReadString(&iter, &reply_family)) { + !reply.ReadString(&iter, &reply_family) || + !reply.ReadBool(&iter, &resulting_bold) || + !reply.ReadBool(&iter, &resulting_italic)) { return false; } @@ -75,6 +80,11 @@ bool FontConfigIPC::Match(std::string* result_family, if (result_family) *result_family = reply_family; + if (is_bold) + *is_bold = resulting_bold; + if (is_italic) + *is_italic = resulting_italic; + return true; } diff --git a/skia/ext/SkFontHost_fontconfig_ipc.h b/skia/ext/SkFontHost_fontconfig_ipc.h index 9965cb6..30a32e1 100644 --- a/skia/ext/SkFontHost_fontconfig_ipc.h +++ b/skia/ext/SkFontHost_fontconfig_ipc.h @@ -33,7 +33,7 @@ class FontConfigIPC : public FontConfigInterface { // FontConfigInterface implementation. virtual bool Match(std::string* result_family, unsigned* result_fileid, bool fileid_valid, unsigned fileid, - const std::string& family, int is_bold, int is_italic); + const std::string& family, bool* is_bold, bool* is_italic); virtual int Open(unsigned fileid); enum Method { |