Small fixes for font descriptor handling.

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@28412 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
fredkiefer 2009-07-26 21:38:35 +00:00
parent c58602f5f5
commit 3860bdcb03
5 changed files with 131 additions and 53 deletions

View file

@ -503,43 +503,63 @@ static void setNSFont(NSString *key, NSFont *font)
}
+ (NSFont *) fontWithDescriptor: (NSFontDescriptor *)descriptor
size: (float)size
{
return [self fontWithDescriptor: descriptor size: size textTransform: nil];
}
// the transform/matrix can be used to rotate/scale/shear the whole font (independently of the CTM!)
+ (NSFont *) fontWithDescriptor: (NSFontDescriptor *)descriptor
size: (float)size
textTransform: (NSAffineTransform *)transform
size: (CGFloat)size
{
NSArray *a;
NSFontDescriptor *fd;
if (size == 0.0)
size = [NSFont systemFontSize]; // default
descriptor = [descriptor fontDescriptorWithSize: size];
if (transform)
{
descriptor = [descriptor fontDescriptorByAddingAttributes:
[NSDictionary dictionaryWithObject: transform
forKey: NSFontMatrixAttribute]];
}
// match all keys
// FIXME: Matching on size and matrix seems nonsensical.
a = [descriptor matchingFontDescriptorsWithMandatoryKeys:
descriptor = [descriptor matchingFontDescriptorWithMandatoryKeys:
[NSSet setWithArray: [[descriptor fontAttributes] allKeys]]];
if ([a count] == 0)
if (descriptor == nil)
return nil;
// return first matching font
fd = [a objectAtIndex: 0];
// FIXME: Use NSFontManger to get a font name and create that font
return nil;
a = [[NSFontManager sharedFontManager] availableFontNamesMatchingFontDescriptor:
descriptor];
if ((a == nil) || ([a count] == 0))
return nil;
return [self fontWithName: [a objectAtIndex: 0]
size: size];
}
+ (NSFont*) fontWithDescriptor: (NSFontDescriptor*)descriptor
textTransform: (NSAffineTransform*)transform
{
NSArray *a;
float fontMatrix[6];
descriptor = [descriptor matchingFontDescriptorWithMandatoryKeys:
[NSSet setWithArray: [[descriptor fontAttributes] allKeys]]];
if (descriptor == nil)
return nil;
a = [[NSFontManager sharedFontManager] availableFontNamesMatchingFontDescriptor:
descriptor];
if ((a == nil) || ([a count] == 0))
return nil;
// FIXME: This method is deprecated
[transform getMatrix: fontMatrix];
return [self fontWithName: [a objectAtIndex: 0]
matrix: fontMatrix];
}
+ (NSFont *) fontWithDescriptor: (NSFontDescriptor *)descriptor
size: (CGFloat)size
textTransform: (NSAffineTransform *)transform
{
if (transform)
{
return [self fontWithDescriptor: descriptor
textTransform: transform];
}
else
{
return [self fontWithDescriptor: descriptor
size: size];
}
}

View file

@ -57,7 +57,7 @@
nil]];
}
+ (id) fontDescriptorWithName: (NSString *)name size: (float)size
+ (id) fontDescriptorWithName: (NSString *)name size: (CGFloat)size
{
return [self fontDescriptorWithFontAttributes:
[NSDictionary dictionaryWithObjectsAndKeys:
@ -74,11 +74,15 @@
- (NSFontDescriptor *) fontDescriptorByAddingAttributes:
(NSDictionary *)attributes
{
NSMutableDictionary *m = [_attributes mutableCopy];
NSMutableDictionary *m = [_attributes mutableCopy];
NSFontDescriptor *new;
[m addEntriesFromDictionary: attributes];
return [isa fontDescriptorWithFontAttributes: m] ;
new = [isa fontDescriptorWithFontAttributes: m];
RELEASE(m);
return new;
}
- (NSFontDescriptor *) fontDescriptorWithFace: (NSString *)face
@ -99,19 +103,36 @@
[NSDictionary dictionaryWithObject: matrix forKey: NSFontMatrixAttribute]];
}
- (NSFontDescriptor *) fontDescriptorWithSize: (float)size
- (NSFontDescriptor *) fontDescriptorWithSize: (CGFloat)size
{
return [self fontDescriptorByAddingAttributes:
[NSDictionary dictionaryWithObject: [NSNumber numberWithFloat: size]
[NSDictionary dictionaryWithObject: [NSString stringWithFormat:@"%f", size]
forKey: NSFontSizeAttribute]];
}
- (NSFontDescriptor *) fontDescriptorWithSymbolicTraits:
(NSFontSymbolicTraits)traits
(NSFontSymbolicTraits)symbolicTraits
{
NSDictionary *traits;
traits = [_attributes objectForKey: NSFontTraitsAttribute];
if (traits == nil)
{
traits = [NSDictionary dictionaryWithObject:
[NSNumber numberWithUnsignedInt: symbolicTraits]
forKey: NSFontSymbolicTrait];
}
else
{
traits = AUTORELEASE([traits mutableCopy]);
[(NSMutableDictionary*)traits setObject:
[NSNumber numberWithUnsignedInt: symbolicTraits]
forKey: NSFontSymbolicTrait];
}
return [self fontDescriptorByAddingAttributes:
[NSDictionary dictionaryWithObject: [NSNumber numberWithUnsignedInt: traits]
forKey: NSFontSymbolicTrait]];
[NSDictionary dictionaryWithObject: traits
forKey: NSFontTraitsAttribute]];
}
- (id) initWithFontAttributes: (NSDictionary *) attributes
@ -134,7 +155,7 @@
}
else
{
// FIXME
[aCoder encodeObject: _attributes];
}
}
@ -146,7 +167,7 @@
}
else
{
// FIXME
[aDecoder decodeValueOfObjCType: @encode(id) at: &_attributes];
}
return self;
}
@ -191,6 +212,7 @@
if (value != nil)
{
// FIXME: Special handling for NSFontTraitsAttribute
if (![value isEqual: [fd objectForKey: key]])
{
match = NO;
@ -208,6 +230,19 @@
return found;
}
- (NSFontDescriptor *) matchingFontDescriptorWithMandatoryKeys: (NSSet *)keys;
{
NSArray *found = [self matchingFontDescriptorsWithMandatoryKeys: keys];
if (found && ([found count] > 0))
{
return [found objectAtIndex: 0];
}
else
{
return nil;
}
}
- (NSAffineTransform *) matrix
{
@ -219,7 +254,7 @@
return [_attributes objectForKey: attribute];
}
- (float) pointSize
- (CGFloat) pointSize
{
id size = [_attributes objectForKey: NSFontSizeAttribute];
@ -233,14 +268,9 @@
}
}
- (NSFontSymbolicTraits) symbolicTraits
{
return [[_attributes objectForKey: NSFontSymbolicTrait] unsignedIntValue];
}
- (NSString *) postscriptName
{
NSMutableString *family;
NSMutableString *family;
NSString *face;
family = AUTORELEASE([[self objectForKey: NSFontFamilyAttribute] mutableCopy]);
@ -254,4 +284,19 @@
return [NSString stringWithFormat: @"%@-%@", family, face];
}
- (NSFontSymbolicTraits) symbolicTraits
{
NSDictionary *traits;
traits = [_attributes objectForKey: NSFontTraitsAttribute];
if (traits == nil)
{
return 0;
}
else
{
return [[traits objectForKey: NSFontSymbolicTrait] unsignedIntValue];
}
}
@end