73 lines
1.8 KiB
C++
73 lines
1.8 KiB
C++
/**
|
|
* QuartzTextStyleAttribute.h
|
|
*
|
|
* Original Code by Evan Jones on Wed Oct 02 2002.
|
|
* Contributors:
|
|
* Shane Caraveo, ActiveState
|
|
* Bernd Paradies, Adobe
|
|
*
|
|
*/
|
|
|
|
|
|
#ifndef _QUARTZ_TEXT_STYLE_ATTRIBUTE_H
|
|
#define _QUARTZ_TEXT_STYLE_ATTRIBUTE_H
|
|
|
|
class QuartzFont {
|
|
public:
|
|
/** Create a font style from a name. */
|
|
QuartzFont(const char *name, size_t length, float size, int weight, bool italic) {
|
|
assert(name != NULL && length > 0 && name[length] == '\0');
|
|
|
|
CFStringRef fontName = CFStringCreateWithCString(kCFAllocatorDefault, name, kCFStringEncodingMacRoman);
|
|
assert(fontName != NULL);
|
|
bool bold = weight > SC_WEIGHT_NORMAL;
|
|
|
|
if (bold || italic) {
|
|
CTFontSymbolicTraits desiredTrait = 0;
|
|
CTFontSymbolicTraits traitMask = 0;
|
|
|
|
// if bold was specified, add the trait
|
|
if (bold) {
|
|
desiredTrait |= kCTFontBoldTrait;
|
|
traitMask |= kCTFontBoldTrait;
|
|
}
|
|
|
|
// if italic was specified, add the trait
|
|
if (italic) {
|
|
desiredTrait |= kCTFontItalicTrait;
|
|
traitMask |= kCTFontItalicTrait;
|
|
}
|
|
|
|
// create a font and then a copy of it with the sym traits
|
|
CTFontRef iFont = ::CTFontCreateWithName(fontName, size, NULL);
|
|
fontid = ::CTFontCreateCopyWithSymbolicTraits(iFont, size, NULL, desiredTrait, traitMask);
|
|
if (fontid) {
|
|
CFRelease(iFont);
|
|
} else {
|
|
// Traits failed so use base font
|
|
fontid = iFont;
|
|
}
|
|
} else {
|
|
// create the font, no traits
|
|
fontid = ::CTFontCreateWithName(fontName, size, NULL);
|
|
}
|
|
|
|
if (!fontid) {
|
|
// Failed to create requested font so use font always present
|
|
fontid = ::CTFontCreateWithName((CFStringRef)@"Monaco", size, NULL);
|
|
}
|
|
|
|
CFRelease(fontName);
|
|
}
|
|
|
|
CTFontRef getFontID() {
|
|
return fontid;
|
|
}
|
|
|
|
private:
|
|
CTFontRef fontid;
|
|
};
|
|
|
|
#endif
|
|
|