aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/SkFontHost.cpp59
-rwxr-xr-xsrc/ports/SkFontHost_mac.cpp78
2 files changed, 108 insertions, 29 deletions
diff --git a/src/core/SkFontHost.cpp b/src/core/SkFontHost.cpp
index d784978eb1..a3df04d79b 100644
--- a/src/core/SkFontHost.cpp
+++ b/src/core/SkFontHost.cpp
@@ -50,8 +50,45 @@ void SkFontHost::SetSubpixelOrder(LCDOrder order) {
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
+#include "SkFontStyle.h"
+
+SkFontStyle::SkFontStyle() {
+ fUnion.fU32 = 0;
+ fUnion.fR.fWeight = kNormal_Weight;
+ fUnion.fR.fWidth = kNormal_Width;
+ fUnion.fR.fSlant = kUpright_Slant;
+}
+
+SkFontStyle::SkFontStyle(int weight, int width, Slant slant) {
+ fUnion.fU32 = 0;
+ fUnion.fR.fWeight = SkPin32(weight, kThin_Weight, kBlack_Weight);
+ fUnion.fR.fWidth = SkPin32(width, kUltraCondensed_Width, kUltaExpanded_Width);
+ fUnion.fR.fSlant = SkPin32(slant, kUpright_Slant, kItalic_Slant);
+}
+
#include "SkFontMgr.h"
+class SkEmptyFontStyleSet : public SkFontStyleSet {
+public:
+ virtual int count() SK_OVERRIDE { return 0; }
+ virtual void getStyle(int, SkFontStyle*, SkString*) SK_OVERRIDE {
+ SkASSERT(!"SkFontStyleSet::getStyle called on empty set");
+ }
+ virtual SkTypeface* createTypeface(int index) SK_OVERRIDE {
+ SkASSERT(!"SkFontStyleSet::createTypeface called on empty set");
+ return NULL;
+ }
+ virtual SkTypeface* matchStyle(const SkFontStyle&) SK_OVERRIDE {
+ return NULL;
+ }
+};
+
+SkFontStyleSet* SkFontStyleSet::CreateEmpty() {
+ return SkNEW(SkEmptyFontStyleSet);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
class SkEmptyFontMgr : public SkFontMgr {
protected:
virtual int onCountFamilies() SK_OVERRIDE {
@@ -64,6 +101,10 @@ protected:
SkASSERT(!"onCreateStyleSet called with bad index");
return NULL;
}
+ virtual SkFontStyleSet* onMatchFamily(const char[]) SK_OVERRIDE {
+ return SkFontStyleSet::CreateEmpty();
+ }
+
virtual SkTypeface* onMatchFamilyStyle(const char[],
const SkFontStyle&) SK_OVERRIDE {
return NULL;
@@ -83,20 +124,6 @@ protected:
}
};
-SkFontStyle::SkFontStyle() {
- fUnion.fU32 = 0;
- fUnion.fR.fWeight = kNormal_Weight;
- fUnion.fR.fWidth = kNormal_Width;
- fUnion.fR.fSlant = kUpright_Slant;
-}
-
-SkFontStyle::SkFontStyle(int weight, int width, Slant slant) {
- fUnion.fU32 = 0;
- fUnion.fR.fWeight = SkPin32(weight, kThin_Weight, kBlack_Weight);
- fUnion.fR.fWidth = SkPin32(width, kUltraCondensed_Width, kUltaExpanded_Width);
- fUnion.fR.fSlant = SkPin32(slant, kUpright_Slant, kItalic_Slant);
-}
-
int SkFontMgr::countFamilies() {
return this->onCountFamilies();
}
@@ -109,6 +136,10 @@ SkFontStyleSet* SkFontMgr::createStyleSet(int index) {
return this->onCreateStyleSet(index);
}
+SkFontStyleSet* SkFontMgr::matchFamily(const char familyName[]) {
+ return this->onMatchFamily(familyName);
+}
+
SkTypeface* SkFontMgr::matchFamilyStyle(const char familyName[],
const SkFontStyle& fs) {
return this->onMatchFamilyStyle(familyName, fs);
diff --git a/src/ports/SkFontHost_mac.cpp b/src/ports/SkFontHost_mac.cpp
index 79e4bde01e..309dabc891 100755
--- a/src/ports/SkFontHost_mac.cpp
+++ b/src/ports/SkFontHost_mac.cpp
@@ -96,6 +96,10 @@ private:
CFRef fCFRef;
};
+static CFStringRef make_CFString(const char str[]) {
+ return CFStringCreateWithCString(NULL, str, kCFStringEncodingUTF8);
+}
+
template<typename T> class AutoCGTable : SkNoncopyable {
public:
AutoCGTable(CGFontRef font)
@@ -498,8 +502,7 @@ static SkTypeface* NewFromName(const char familyName[], SkTypeface::Style theSty
}
// Create the font info
- AutoCFRelease<CFStringRef> cfFontName(
- CFStringCreateWithCString(NULL, familyName, kCFStringEncodingUTF8));
+ AutoCFRelease<CFStringRef> cfFontName(make_CFString(familyName));
AutoCFRelease<CFNumberRef> cfFontTraits(
CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &ctFontTraits));
@@ -1913,6 +1916,18 @@ static int unit_width_to_fontstyle(float unit) {
return sk_float_round2int(value);
}
+static inline int sqr(int value) {
+ SkASSERT(SkAbs32(value) < 0x7FFF); // check for overflow
+ return value * value;
+}
+
+// We normalize each axis (weight, width, italic) to be base-900
+static int compute_metric(const SkFontStyle& a, const SkFontStyle& b) {
+ return sqr(a.weight() - b.weight()) +
+ sqr((a.width() - b.width()) * 100) +
+ sqr((a.isItalic() != b.isItalic()) * 900);
+}
+
static SkFontStyle desc2fontstyle(CTFontDescriptorRef desc) {
AutoCFRelease<CFDictionaryRef> dict(
(CFDictionaryRef)CTFontDescriptorCopyAttribute(desc,
@@ -2026,10 +2041,36 @@ public:
return createFromDesc(fFamilyName, desc);
}
+ virtual SkTypeface* matchStyle(const SkFontStyle& pattern) SK_OVERRIDE {
+ if (0 == fCount) {
+ return NULL;
+ }
+ return createFromDesc(fFamilyName, findMatchingDesc(pattern));
+ }
+
private:
CFArrayRef fArray;
CFStringRef fFamilyName;
int fCount;
+
+ CTFontDescriptorRef findMatchingDesc(const SkFontStyle& pattern) const {
+ int bestMetric = SK_MaxS32;
+ CTFontDescriptorRef bestDesc = NULL;
+
+ for (int i = 0; i < fCount; ++i) {
+ CTFontDescriptorRef desc = (CTFontDescriptorRef)CFArrayGetValueAtIndex(fArray, i);
+ int metric = compute_metric(pattern, desc2fontstyle(desc));
+ if (0 == metric) {
+ return desc;
+ }
+ if (metric < bestMetric) {
+ bestMetric = metric;
+ bestDesc = desc;
+ }
+ }
+ SkASSERT(bestDesc);
+ return bestDesc;
+ }
};
class SkFontMgr_Mac : public SkFontMgr {
@@ -2048,6 +2089,19 @@ class SkFontMgr_Mac : public SkFontMgr {
}
}
+ static SkFontStyleSet* CreateSet(CFStringRef cfFamilyName) {
+ AutoCFRelease<CFMutableDictionaryRef> cfAttr(
+ CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
+ &kCFTypeDictionaryKeyCallBacks,
+ &kCFTypeDictionaryValueCallBacks));
+
+ CFDictionaryAddValue(cfAttr, kCTFontFamilyNameAttribute, cfFamilyName);
+
+ AutoCFRelease<CTFontDescriptorRef> desc(
+ CTFontDescriptorCreateWithAttributes(cfAttr));
+ return SkNEW_ARGS(SkFontStyleSet_Mac, (cfFamilyName, desc));
+ }
+
public:
SkFontMgr_Mac() : fCount(0), fNames(NULL) {}
@@ -2075,20 +2129,14 @@ protected:
if ((unsigned)index >= (unsigned)fCount) {
return NULL;
}
-
- AutoCFRelease<CFMutableDictionaryRef> cfAttr(
- CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
- &kCFTypeDictionaryKeyCallBacks,
- &kCFTypeDictionaryValueCallBacks));
-
- CFDictionaryAddValue(cfAttr, kCTFontFamilyNameAttribute,
- this->stringAt(index));
-
- AutoCFRelease<CTFontDescriptorRef> desc(
- CTFontDescriptorCreateWithAttributes(cfAttr));
- return SkNEW_ARGS(SkFontStyleSet_Mac, (this->stringAt(index), desc));
+ return CreateSet(this->stringAt(index));
}
-
+
+ virtual SkFontStyleSet* onMatchFamily(const char familyName[]) SK_OVERRIDE {
+ AutoCFRelease<CFStringRef> cfName(make_CFString(familyName));
+ return CreateSet(cfName);
+ }
+
virtual SkTypeface* onMatchFamilyStyle(const char familyName[],
const SkFontStyle&) SK_OVERRIDE {
return NULL;