Cairo: Reduce the hilarity of the font panel

Use many more weights and widths when generating the (still extremely
stupid) synthetic PostScript font names.
This commit is contained in:
Jeff Teunissen 2010-10-07 15:36:20 -04:00
parent 390f82f064
commit 016f5eda25
5 changed files with 123 additions and 19 deletions

View file

@ -63,6 +63,8 @@
- (NSString *) familyName;
- (void) setFamilyName: (NSString *)name;
- (NSString *) displayName;
- (void *) fontFace;
- (FcPattern *) matchedPattern;

View file

@ -241,6 +241,12 @@ BOOL _cairo_extents_for_NSGlyph(cairo_scaled_font_t *scaled_font, NSGlyph glyph,
return NSZeroRect;
}
- (NSString *) displayName
{
return [_faceInfo displayName];
}
- (CGFloat) widthOfString: (NSString *)string
{
cairo_text_extents_t ctext;

View file

@ -67,6 +67,17 @@
return _familyName;
}
- (NSString *) displayName
{
char *fcstyle;
if (FcPatternGetString(_pattern, FC_STYLE, 0, (FcChar8 **)&fcstyle) == FcResultMatch) {
return [NSString stringWithFormat: @"%@ %@", _familyName,
[NSString stringWithUTF8String: fcstyle]];
}
return _familyName;
}
- (int) weight
{
return _weight;

View file

@ -78,9 +78,9 @@ NSMutableDictionary * __allFonts;
// Make a GNUstep style font descriptor from a FcPattern
static NSArray *faFromFc(FcPattern *pat)
{
int weight, slant, spacing, nsweight;
int weight, slant, spacing, width, nsweight;
unsigned int nstraits = 0;
char *family;
char *family, *fcstyle;
NSMutableString *name, *style;
if (FcPatternGetInteger(pat, FC_WEIGHT, 0, &weight) != FcResultMatch
@ -99,11 +99,28 @@ static NSArray *faFromFc(FcPattern *pat)
switch (weight)
{
case FC_WEIGHT_THIN:
[style appendString: @"Thin"];
nsweight = 1;
break;
case FC_WEIGHT_ULTRALIGHT:
[style appendString: @"Ultralight"];
nsweight = 2;
break;
case FC_WEIGHT_LIGHT:
[style appendString: @"Light"];
nsweight = 3;
break;
case FC_WEIGHT_BOOK:
[style appendString: @"Book"];
nsweight = 4;
break;
case FC_WEIGHT_REGULAR:
// [style appendString: @"Regular"];
nsweight = 5;
break;
case FC_WEIGHT_MEDIUM:
[style appendString: @"Medium"];
nsweight = 6;
break;
case FC_WEIGHT_DEMIBOLD:
@ -115,13 +132,63 @@ static NSArray *faFromFc(FcPattern *pat)
nsweight = 9;
nstraits |= NSBoldFontMask;
break;
case FC_WEIGHT_ULTRABOLD:
[style appendString: @"Ultrabold"];
nsweight = 11;
nstraits |= NSBoldFontMask;
break;
case FC_WEIGHT_BLACK:
[style appendString: @"Black"];
nsweight = 12;
nstraits |= NSBoldFontMask;
break;
case FC_WEIGHT_ULTRABLACK:
[style appendString: @"Ultrablack"];
nsweight = 13;
nstraits |= NSBoldFontMask;
break;
default:
nsweight = 6;
nsweight = 5;
}
if (FcPatternGetInteger(pat, FC_WIDTH, 0, &width) == FcResultMatch)
switch (width)
{
case FC_WIDTH_ULTRACONDENSED:
[style appendString: @"Ultracondensed"];
nstraits |= NSCondensedFontMask;
break;
case FC_WIDTH_EXTRACONDENSED:
[style appendString: @"Extracondensed"];
nstraits |= NSCondensedFontMask;
break;
case FC_WIDTH_CONDENSED:
[style appendString: @"Condensed"];
nstraits |= NSCondensedFontMask;
break;
case FC_WIDTH_SEMICONDENSED:
[style appendString: @"Semicondensed"];
nstraits |= NSCondensedFontMask;
break;
case FC_WIDTH_SEMIEXPANDED:
[style appendString: @"Semiexpanded"];
nstraits |= NSExpandedFontMask;
break;
case FC_WIDTH_EXPANDED:
[style appendString: @"Expanded"];
nstraits |= NSExpandedFontMask;
break;
case FC_WIDTH_EXTRAEXPANDED:
[style appendString: @"Extraexpanded"];
nstraits |= NSExpandedFontMask;
break;
case FC_WIDTH_ULTRAEXPANDED:
[style appendString: @"Ultraexpanded"];
nstraits |= NSExpandedFontMask;
break;
default:
break;
}
switch (slant)
@ -145,9 +212,13 @@ static NSArray *faFromFc(FcPattern *pat)
}
else
{
[style appendString: @"Roman"];
[style setString: @"Regular"];
}
if (FcPatternGetString(pat, FC_STYLE, 0, (FcChar8 **)&fcstyle) == FcResultMatch)
style = [NSString stringWithUTF8String: fcstyle];
// NSLog (@"family: %@, style: %s/%@", name, fcstyle, style);
return [NSArray arrayWithObjects: name,
style,
[NSNumber numberWithInt: nsweight],
@ -164,7 +235,8 @@ static NSArray *faFromFc(FcPattern *pat)
Class faceInfoClass = [[self class] faceInfoClass];
FcPattern *pat = FcPatternCreate();
FcObjectSet *os = FcObjectSetBuild(FC_FAMILY, FC_SLANT, FC_WEIGHT,
FcObjectSet *os = FcObjectSetBuild(FC_FAMILY, FC_STYLE, FC_FULLNAME,
FC_SLANT, FC_WEIGHT, FC_WIDTH,
FC_SPACING, NULL);
FcFontSet *fs = FcFontList(NULL, pat, os);
@ -218,6 +290,18 @@ static NSArray *faFromFc(FcPattern *pat)
- (NSString *) defaultSystemFontName
{
if ([allFontNames containsObject: @"DejaVu Sans-Book"])
{
return @"DejaVu Sans-Book";
}
if ([allFontNames containsObject: @"DejaVu Sans"])
{
return @"DejaVu Sans";
}
if ([allFontNames containsObject: @"Bitstream Vera Sans-Roman"])
{
return @"Bitstream Vera Sans-Roman";
}
if ([allFontNames containsObject: @"Bitstream Vera Sans"])
{
return @"Bitstream Vera Sans";
@ -226,10 +310,6 @@ static NSArray *faFromFc(FcPattern *pat)
{
return @"FreeSans";
}
if ([allFontNames containsObject: @"DejaVu Sans"])
{
return @"DejaVu Sans";
}
if ([allFontNames containsObject: @"Tahoma"])
{
return @"Tahoma";
@ -243,6 +323,10 @@ static NSArray *faFromFc(FcPattern *pat)
- (NSString *) defaultBoldSystemFontName
{
if ([allFontNames containsObject: @"DejaVu Sans-Bold"])
{
return @"DejaVu Sans-Bold";
}
if ([allFontNames containsObject: @"Bitstream Vera Sans-Bold"])
{
return @"Bitstream Vera Sans-Bold";
@ -251,10 +335,6 @@ static NSArray *faFromFc(FcPattern *pat)
{
return @"FreeSans-Bold";
}
if ([allFontNames containsObject: @"DejaVu Sans-Bold"])
{
return @"DejaVu Sans-Bold";
}
if ([allFontNames containsObject: @"Tahoma-Bold"])
{
return @"Tahoma-Bold";
@ -268,6 +348,10 @@ static NSArray *faFromFc(FcPattern *pat)
- (NSString *) defaultFixedPitchFontName
{
if ([allFontNames containsObject: @"DejaVu Sans Mono"])
{
return @"DejaVu Sans Mono";
}
if ([allFontNames containsObject: @"Bitstream Vera Sans Mono"])
{
return @"Bitstream Vera Sans Mono";
@ -276,10 +360,6 @@ static NSArray *faFromFc(FcPattern *pat)
{
return @"FreeMono";
}
if ([allFontNames containsObject: @"DejaVu Sans Mono"])
{
return @"DejaVu Sans Mono";
}
if ([allFontNames containsObject: @"Courier New"])
{
return @"Courier New";

View file

@ -149,6 +149,11 @@
return NSZeroRect;
}
- (NSString *) displayName
{
return [_faceInfo displayName];
}
- (CGFloat) widthOfString: (NSString *)string
{
[self subclassResponsibility: _cmd];