add fixed-width attribute to typeface

(patch from russellbrenner)



git-svn-id: http://skia.googlecode.com/svn/trunk@837 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
reed@google.com 2011-02-23 14:41:42 +00:00
parent 3f0260d0f7
commit 5b31b0f1ea
3 changed files with 38 additions and 26 deletions

View File

@ -56,7 +56,7 @@ public:
/** Returns true if getStyle() has the kItalic bit set.
*/
bool isItalic() const { return (fStyle & kItalic) != 0; }
/** Return a 32bit value for this typeface, unique for the underlying font
data. Will never return 0.
*/
@ -72,11 +72,11 @@ public:
handling either being null (treating null as the default font)
*/
static bool Equal(const SkTypeface* facea, const SkTypeface* faceb);
/** Return a new reference to the typeface that most closely matches the
requested familyName and style. Pass null as the familyName to return
the default font for the requested style. Will never return null
@param familyName May be NULL. The name of the font family.
@param style The style (normal, bold, italic) of the typeface.
@return reference to the closest-matching typeface. Call must call
@ -100,7 +100,7 @@ public:
requested typeface and specified Style. Use this call if you want to
pick a new style from the same family of the existing typeface.
If family is NULL, this selects from the default font's family.
@param family May be NULL. The name of the existing type face.
@param s The style (normal, bold, italic) of the type face.
@return reference to the closest-matching typeface. Call must call
@ -112,7 +112,7 @@ public:
not a valid font file, returns null.
*/
static SkTypeface* CreateFromFile(const char path[]);
/** Return a new typeface given a stream. If the stream is
not a valid font file, returns null. Ownership of the stream is
transferred, so the caller must not reference it again.
@ -123,7 +123,7 @@ public:
typeface referencing the same font when Deserialize is called.
*/
void serialize(SkWStream*) const;
/** Given the data previously written by serialize(), return a new instance
to a typeface referring to the same font. If that font is not available,
return null. If an instance is returned, the caller is responsible for
@ -142,13 +142,14 @@ public:
protected:
/** uniqueID must be unique (please!) and non-zero
*/
SkTypeface(Style style, uint32_t uniqueID)
: fUniqueID(uniqueID), fStyle(style) {}
SkTypeface(Style style, uint32_t uniqueID, bool isFixedWidth = false)
: fUniqueID(uniqueID), fStyle(style), fIsFixedWidth(isFixedWidth) {}
private:
uint32_t fUniqueID;
Style fStyle;
bool fIsFixedWidth;
typedef SkRefCnt INHERITED;
};

View File

@ -518,13 +518,13 @@ void SkFontHost::FilterRec(SkScalerContext::Rec* rec) {
InitFreetype();
FT_Done_FreeType(gFTLibrary);
}
if (!gLCDSupport && rec->isLCD()) {
// If the runtime Freetype library doesn't support LCD mode, we disable
// it here.
rec->fMaskFormat = SkMask::kA8_Format;
}
SkPaint::Hinting h = rec->getHinting();
if (SkPaint::kFull_Hinting == h && !rec->isLCD()) {
// collapse full->normal hinting if we're not doing LCD
@ -1244,7 +1244,8 @@ SkScalerContext* SkFontHost::CreateScalerContext(const SkDescriptor* desc) {
/* Export this so that other parts of our FonttHost port can make use of our
ability to extract the name+style from a stream, using FreeType's api.
*/
SkTypeface::Style find_name_and_style(SkStream* stream, SkString* name) {
SkTypeface::Style find_name_and_attributes(SkStream* stream, SkString* name,
bool* isFixedWidth) {
FT_Library library;
if (FT_Init_FreeType(&library)) {
name->set(NULL);
@ -1288,6 +1289,9 @@ SkTypeface::Style find_name_and_style(SkStream* stream, SkString* name) {
if (face->style_flags & FT_STYLE_FLAG_ITALIC) {
style |= SkTypeface::kItalic;
}
if (isFixedWidth) {
*isFixedWidth = FT_IS_FIXED_WIDTH(face);
}
FT_Done_Face(face);
FT_Done_FreeType(library);

View File

@ -31,7 +31,8 @@
#define SK_FONT_FILE_PREFIX "/fonts/"
#endif
SkTypeface::Style find_name_and_style(SkStream* stream, SkString* name);
SkTypeface::Style find_name_and_attributes(SkStream* stream, SkString* name,
bool* isFixedWidth);
static void GetFullPathForSysFonts(SkString* full, const char name[]) {
full->set(getenv("ANDROID_ROOT"));
@ -235,8 +236,9 @@ static void remove_from_names(FamilyRec* emptyFamily)
class FamilyTypeface : public SkTypeface {
public:
FamilyTypeface(Style style, bool sysFont, SkTypeface* familyMember)
: SkTypeface(style, sk_atomic_inc(&gUniqueFontID) + 1) {
FamilyTypeface(Style style, bool sysFont, SkTypeface* familyMember,
bool isFixedWidth)
: SkTypeface(style, sk_atomic_inc(&gUniqueFontID) + 1, isFixedWidth) {
fIsSysFont = sysFont;
SkAutoMutexAcquire ac(gFamilyMutex);
@ -280,8 +282,8 @@ private:
class StreamTypeface : public FamilyTypeface {
public:
StreamTypeface(Style style, bool sysFont, SkTypeface* familyMember,
SkStream* stream)
: INHERITED(style, sysFont, familyMember) {
SkStream* stream, bool isFixedWidth)
: INHERITED(style, sysFont, familyMember, isFixedWidth) {
SkASSERT(stream);
stream->ref();
fStream = stream;
@ -311,8 +313,8 @@ private:
class FileTypeface : public FamilyTypeface {
public:
FileTypeface(Style style, bool sysFont, SkTypeface* familyMember,
const char path[])
: INHERITED(style, sysFont, familyMember) {
const char path[], bool isFixedWidth)
: INHERITED(style, sysFont, familyMember, isFixedWidth) {
SkString fullpath;
if (sysFont) {
@ -359,19 +361,20 @@ private:
///////////////////////////////////////////////////////////////////////////////
static bool get_name_and_style(const char path[], SkString* name,
SkTypeface::Style* style, bool isExpected) {
SkTypeface::Style* style,
bool* isFixedWidth, bool isExpected) {
SkString fullpath;
GetFullPathForSysFonts(&fullpath, path);
SkMMAPStream stream(fullpath.c_str());
if (stream.getLength() > 0) {
*style = find_name_and_style(&stream, name);
*style = find_name_and_attributes(&stream, name, isFixedWidth);
return true;
}
else {
SkFILEStream stream(fullpath.c_str());
if (stream.getLength() > 0) {
*style = find_name_and_style(&stream, name);
*style = find_name_and_attributes(&stream, name, isFixedWidth);
return true;
}
}
@ -461,12 +464,14 @@ static void load_system_fonts() {
firstInFamily = NULL;
}
bool isFixedWidth;
SkString name;
SkTypeface::Style style;
// we expect all the fonts, except the "fallback" fonts
bool isExpected = (rec[i].fNames != gFBNames);
if (!get_name_and_style(rec[i].fFileName, &name, &style, isExpected)) {
if (!get_name_and_style(rec[i].fFileName, &name, &style,
&isFixedWidth, isExpected)) {
continue;
}
@ -474,7 +479,8 @@ static void load_system_fonts() {
(style,
true, // system-font (cannot delete)
firstInFamily, // what family to join
rec[i].fFileName) // filename
rec[i].fFileName,
isFixedWidth) // filename
);
if (rec[i].fNames != NULL) {
@ -655,10 +661,11 @@ SkTypeface* SkFontHost::CreateTypefaceFromStream(SkStream* stream) {
return NULL;
}
bool isFixedWidth;
SkString name;
SkTypeface::Style style = find_name_and_style(stream, &name);
SkTypeface::Style style = find_name_and_attributes(stream, &name, &isFixedWidth);
return SkNEW_ARGS(StreamTypeface, (style, false, NULL, stream));
return SkNEW_ARGS(StreamTypeface, (style, false, NULL, stream, isFixedWidth));
}
SkTypeface* SkFontHost::CreateTypefaceFromFile(const char path[]) {