use ATSFontRef for our unique ID. Much more stable than using the ptr itself (duh)
git-svn-id: http://skia.googlecode.com/svn/trunk@2457 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
parent
c2188cf233
commit
2174494ccd
@ -171,13 +171,18 @@ static SkTypeface::Style computeStyleBits(CTFontRef font, bool* isMonospace) {
|
|||||||
return (SkTypeface::Style)style;
|
return (SkTypeface::Style)style;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static SkFontID CTFontRef_to_SkFontID(CTFontRef fontRef) {
|
||||||
|
ATSFontRef ats = CTFontGetPlatformFont(fontRef, NULL);
|
||||||
|
return (SkFontID)ats;
|
||||||
|
}
|
||||||
|
|
||||||
class SkTypeface_Mac : public SkTypeface {
|
class SkTypeface_Mac : public SkTypeface {
|
||||||
public:
|
public:
|
||||||
SkTypeface_Mac(SkTypeface::Style style, SkFontID fontID, bool isMonospace,
|
SkTypeface_Mac(SkTypeface::Style style, SkFontID fontID, bool isMonospace,
|
||||||
CTFontRef fontRef, const char name[])
|
CTFontRef fontRef, const char name[])
|
||||||
: SkTypeface(style, fontID, isMonospace) {
|
: SkTypeface(style, fontID, isMonospace) {
|
||||||
SkASSERT(fontRef);
|
SkASSERT(fontRef);
|
||||||
fFontRef = fontRef; // we take over ownership
|
fFontRef = fontRef; // caller has already called CFRetain for us
|
||||||
fName.set(name);
|
fName.set(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -191,8 +196,9 @@ static SkTypeface* NewFromFontRef(CTFontRef fontRef, const char name[]) {
|
|||||||
SkASSERT(fontRef);
|
SkASSERT(fontRef);
|
||||||
bool isMonospace;
|
bool isMonospace;
|
||||||
SkTypeface::Style style = computeStyleBits(fontRef, &isMonospace);
|
SkTypeface::Style style = computeStyleBits(fontRef, &isMonospace);
|
||||||
return new SkTypeface_Mac(style, SkTypefaceCache::NewFontID(),
|
SkFontID fontID = CTFontRef_to_SkFontID(fontRef);
|
||||||
isMonospace, fontRef, name);
|
|
||||||
|
return new SkTypeface_Mac(style, fontID, isMonospace, fontRef, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
static SkTypeface* NewFromName(const char familyName[],
|
static SkTypeface* NewFromName(const char familyName[],
|
||||||
@ -267,23 +273,12 @@ static SkTypeface* GetDefaultFace() {
|
|||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
struct FontRefRec {
|
|
||||||
CTFontRef fFontRef;
|
|
||||||
};
|
|
||||||
|
|
||||||
static bool FindByFontRef(SkTypeface* face, SkTypeface::Style, void* ctx) {
|
|
||||||
const SkTypeface_Mac* mface = reinterpret_cast<SkTypeface_Mac*>(face);
|
|
||||||
const FontRefRec* rec = reinterpret_cast<const FontRefRec*>(ctx);
|
|
||||||
|
|
||||||
return rec->fFontRef == mface->fFontRef;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This function is visible on the outside. It first searches the cache, and if
|
/* This function is visible on the outside. It first searches the cache, and if
|
||||||
* not found, returns a new entry (after adding it to the cache).
|
* not found, returns a new entry (after adding it to the cache).
|
||||||
*/
|
*/
|
||||||
SkTypeface* SkCreateTypefaceFromCTFont(CTFontRef fontRef) {
|
SkTypeface* SkCreateTypefaceFromCTFont(CTFontRef fontRef) {
|
||||||
FontRefRec rec = { fontRef };
|
SkFontID fontID = CTFontRef_to_SkFontID(fontRef);
|
||||||
SkTypeface* face = SkTypefaceCache::FindByProc(FindByFontRef, &rec);
|
SkTypeface* face = SkTypefaceCache::FindByID(fontID);
|
||||||
if (face) {
|
if (face) {
|
||||||
face->ref();
|
face->ref();
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user