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; - (NSString *) familyName;
- (void) setFamilyName: (NSString *)name; - (void) setFamilyName: (NSString *)name;
- (NSString *) displayName;
- (void *) fontFace; - (void *) fontFace;
- (FcPattern *) matchedPattern; - (FcPattern *) matchedPattern;

View file

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

View file

@ -67,6 +67,17 @@
return _familyName; 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 - (int) weight
{ {
return _weight; return _weight;

View file

@ -78,9 +78,9 @@ NSMutableDictionary * __allFonts;
// Make a GNUstep style font descriptor from a FcPattern // Make a GNUstep style font descriptor from a FcPattern
static NSArray *faFromFc(FcPattern *pat) static NSArray *faFromFc(FcPattern *pat)
{ {
int weight, slant, spacing, nsweight; int weight, slant, spacing, width, nsweight;
unsigned int nstraits = 0; unsigned int nstraits = 0;
char *family; char *family, *fcstyle;
NSMutableString *name, *style; NSMutableString *name, *style;
if (FcPatternGetInteger(pat, FC_WEIGHT, 0, &weight) != FcResultMatch if (FcPatternGetInteger(pat, FC_WEIGHT, 0, &weight) != FcResultMatch
@ -92,18 +92,35 @@ static NSArray *faFromFc(FcPattern *pat)
if (FcPatternGetInteger(pat, FC_SPACING, 0, &spacing) == FcResultMatch) if (FcPatternGetInteger(pat, FC_SPACING, 0, &spacing) == FcResultMatch)
if (spacing==FC_MONO || spacing==FC_CHARCELL) if (spacing==FC_MONO || spacing==FC_CHARCELL)
nstraits |= NSFixedPitchFontMask; nstraits |= NSFixedPitchFontMask;
name = [NSMutableString stringWithCapacity: 100]; name = [NSMutableString stringWithCapacity: 100];
style = [NSMutableString stringWithCapacity: 100]; style = [NSMutableString stringWithCapacity: 100];
[name appendString: [NSString stringWithUTF8String: family]]; [name appendString: [NSString stringWithUTF8String: family]];
switch (weight) 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: case FC_WEIGHT_LIGHT:
[style appendString: @"Light"]; [style appendString: @"Light"];
nsweight = 3; nsweight = 3;
break; 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: case FC_WEIGHT_MEDIUM:
[style appendString: @"Medium"];
nsweight = 6; nsweight = 6;
break; break;
case FC_WEIGHT_DEMIBOLD: case FC_WEIGHT_DEMIBOLD:
@ -115,15 +132,65 @@ static NSArray *faFromFc(FcPattern *pat)
nsweight = 9; nsweight = 9;
nstraits |= NSBoldFontMask; nstraits |= NSBoldFontMask;
break; break;
case FC_WEIGHT_ULTRABOLD:
[style appendString: @"Ultrabold"];
nsweight = 11;
nstraits |= NSBoldFontMask;
break;
case FC_WEIGHT_BLACK: case FC_WEIGHT_BLACK:
[style appendString: @"Black"]; [style appendString: @"Black"];
nsweight = 12; nsweight = 12;
nstraits |= NSBoldFontMask; nstraits |= NSBoldFontMask;
break; break;
case FC_WEIGHT_ULTRABLACK:
[style appendString: @"Ultrablack"];
nsweight = 13;
nstraits |= NSBoldFontMask;
break;
default: 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) switch (slant)
{ {
case FC_SLANT_ROMAN: case FC_SLANT_ROMAN:
@ -145,9 +212,13 @@ static NSArray *faFromFc(FcPattern *pat)
} }
else 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, return [NSArray arrayWithObjects: name,
style, style,
[NSNumber numberWithInt: nsweight], [NSNumber numberWithInt: nsweight],
@ -164,7 +235,8 @@ static NSArray *faFromFc(FcPattern *pat)
Class faceInfoClass = [[self class] faceInfoClass]; Class faceInfoClass = [[self class] faceInfoClass];
FcPattern *pat = FcPatternCreate(); 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); FC_SPACING, NULL);
FcFontSet *fs = FcFontList(NULL, pat, os); FcFontSet *fs = FcFontList(NULL, pat, os);
@ -199,7 +271,7 @@ static NSArray *faFromFc(FcPattern *pat)
} }
NSDebugLLog(@"NSFont", @"fc enumerator: adding font: %@", name); NSDebugLLog(@"NSFont", @"fc enumerator: adding font: %@", name);
[familyArray addObject: fontArray]; [familyArray addObject: fontArray];
[fcxft_allFontNames addObject: name]; [fcxft_allFontNames addObject: name];
aFont = [[faceInfoClass alloc] initWithfamilyName: familyString aFont = [[faceInfoClass alloc] initWithfamilyName: familyString
weight: [[fontArray objectAtIndex: 2] intValue] weight: [[fontArray objectAtIndex: 2] intValue]
traits: [[fontArray objectAtIndex: 3] unsignedIntValue] traits: [[fontArray objectAtIndex: 3] unsignedIntValue]
@ -218,6 +290,18 @@ static NSArray *faFromFc(FcPattern *pat)
- (NSString *) defaultSystemFontName - (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"]) if ([allFontNames containsObject: @"Bitstream Vera Sans"])
{ {
return @"Bitstream Vera Sans"; return @"Bitstream Vera Sans";
@ -226,10 +310,6 @@ static NSArray *faFromFc(FcPattern *pat)
{ {
return @"FreeSans"; return @"FreeSans";
} }
if ([allFontNames containsObject: @"DejaVu Sans"])
{
return @"DejaVu Sans";
}
if ([allFontNames containsObject: @"Tahoma"]) if ([allFontNames containsObject: @"Tahoma"])
{ {
return @"Tahoma"; return @"Tahoma";
@ -243,6 +323,10 @@ static NSArray *faFromFc(FcPattern *pat)
- (NSString *) defaultBoldSystemFontName - (NSString *) defaultBoldSystemFontName
{ {
if ([allFontNames containsObject: @"DejaVu Sans-Bold"])
{
return @"DejaVu Sans-Bold";
}
if ([allFontNames containsObject: @"Bitstream Vera Sans-Bold"]) if ([allFontNames containsObject: @"Bitstream Vera Sans-Bold"])
{ {
return @"Bitstream Vera Sans-Bold"; return @"Bitstream Vera Sans-Bold";
@ -251,10 +335,6 @@ static NSArray *faFromFc(FcPattern *pat)
{ {
return @"FreeSans-Bold"; return @"FreeSans-Bold";
} }
if ([allFontNames containsObject: @"DejaVu Sans-Bold"])
{
return @"DejaVu Sans-Bold";
}
if ([allFontNames containsObject: @"Tahoma-Bold"]) if ([allFontNames containsObject: @"Tahoma-Bold"])
{ {
return @"Tahoma-Bold"; return @"Tahoma-Bold";
@ -268,6 +348,10 @@ static NSArray *faFromFc(FcPattern *pat)
- (NSString *) defaultFixedPitchFontName - (NSString *) defaultFixedPitchFontName
{ {
if ([allFontNames containsObject: @"DejaVu Sans Mono"])
{
return @"DejaVu Sans Mono";
}
if ([allFontNames containsObject: @"Bitstream Vera Sans Mono"]) if ([allFontNames containsObject: @"Bitstream Vera Sans Mono"])
{ {
return @"Bitstream Vera Sans Mono"; return @"Bitstream Vera Sans Mono";
@ -276,10 +360,6 @@ static NSArray *faFromFc(FcPattern *pat)
{ {
return @"FreeMono"; return @"FreeMono";
} }
if ([allFontNames containsObject: @"DejaVu Sans Mono"])
{
return @"DejaVu Sans Mono";
}
if ([allFontNames containsObject: @"Courier New"]) if ([allFontNames containsObject: @"Courier New"])
{ {
return @"Courier New"; return @"Courier New";

View file

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