From 3860bdcb0398c91731d1e9627b08397f85b872c8 Mon Sep 17 00:00:00 2001 From: fredkiefer Date: Sun, 26 Jul 2009 21:38:35 +0000 Subject: [PATCH] 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 --- ChangeLog | 9 +++- Headers/AppKit/NSFont.h | 7 ++- Headers/AppKit/NSFontDescriptor.h | 9 ++-- Source/NSFont.m | 80 +++++++++++++++++++------------ Source/NSFontDescriptor.m | 79 +++++++++++++++++++++++------- 5 files changed, 131 insertions(+), 53 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8971dd2f8..2382f74f2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2009-07-26 Fred Kiefer + + * Headers/AppKit/NSFontDescriptor.h, + * Headers/AppKit/NSFont.h: Add missing interface method from 10.5. + * Source/NSFontDescriptor.m, + * Source/NSFont.m: Small fixes for font descriptor handling. + 2009-07-25 22:54-EDT Gregory John Casamento * Source/NSAlert.m: Offset color by less in -resetWindow. Remove @@ -2635,7 +2642,7 @@ 2008-04-07 Fred Kiefer * Source/NSFont.m (NSConvertGlyphsToPackedGlyphs): Store the glyph - count in th efirst byte. + count in the first byte. * Source/NSBezierPath.m (-appendBezierPathWithPackedGlyphs): Send this method on to the graphics context. * Headers/AppKit/NSGraphicsContext.h, diff --git a/Headers/AppKit/NSFont.h b/Headers/AppKit/NSFont.h index a71cf4851..9caebbf20 100644 --- a/Headers/AppKit/NSFont.h +++ b/Headers/AppKit/NSFont.h @@ -133,9 +133,12 @@ APPKIT_EXPORT const float *NSFontIdentityMatrix; + (NSFont*) menuBarFontOfSize: (float)fontSize; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST) -+ (NSFont*) fontWithDescriptor: (NSFontDescriptor*)descriptor size: (float)size; ++ (NSFont*) fontWithDescriptor: (NSFontDescriptor*)descriptor size: (CGFloat)size; + (NSFont*) fontWithDescriptor: (NSFontDescriptor*)descriptor - size: (float)size + textTransform: (NSAffineTransform*)transform; +// This method was a mistake in the 10.4 documentation ++ (NSFont*) fontWithDescriptor: (NSFontDescriptor*)descriptor + size: (CGFloat)size textTransform: (NSAffineTransform*)transform; #endif diff --git a/Headers/AppKit/NSFontDescriptor.h b/Headers/AppKit/NSFontDescriptor.h index 133d402b0..0dc27fb54 100644 --- a/Headers/AppKit/NSFontDescriptor.h +++ b/Headers/AppKit/NSFontDescriptor.h @@ -109,7 +109,7 @@ extern NSString *NSFontVariationAxisNameKey; + (id) fontDescriptorWithFontAttributes: (NSDictionary *)attributes; + (id) fontDescriptorWithName: (NSString *)name - size: (float)size; + size: (CGFloat)size; #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST) + (id) fontDescriptorWithName: (NSString *)name matrix: (NSAffineTransform *)matrix; @@ -124,17 +124,20 @@ extern NSString *NSFontVariationAxisNameKey; - (NSFontDescriptor *) fontDescriptorWithFace: (NSString *)face; - (NSFontDescriptor *) fontDescriptorWithFamily: (NSString *)family; - (NSFontDescriptor *) fontDescriptorWithMatrix: (NSAffineTransform *)matrix; -- (NSFontDescriptor *) fontDescriptorWithSize: (float)size; +- (NSFontDescriptor *) fontDescriptorWithSize: (CGFloat)size; - (NSFontDescriptor *) fontDescriptorWithSymbolicTraits: (NSFontSymbolicTraits)traits; - (NSArray *) matchingFontDescriptorsWithMandatoryKeys: (NSSet *)keys; - (id) objectForKey: (NSString *)attribute; - (NSAffineTransform *) matrix; -- (float) pointSize; +- (CGFloat) pointSize; - (NSString *) postscriptName; - (NSFontSymbolicTraits) symbolicTraits; #endif +#if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) +- (NSFontDescriptor *) matchingFontDescriptorWithMandatoryKeys: (NSSet *)keys; +#endif @end diff --git a/Source/NSFont.m b/Source/NSFont.m index 82709a387..057af081f 100644 --- a/Source/NSFont.m +++ b/Source/NSFont.m @@ -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]; + } } diff --git a/Source/NSFontDescriptor.m b/Source/NSFontDescriptor.m index e8614744e..68e531e72 100644 --- a/Source/NSFontDescriptor.m +++ b/Source/NSFontDescriptor.m @@ -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