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:
Fred Kiefer 2009-07-26 21:38:35 +00:00
parent c6f4518c9f
commit 519598ef24
5 changed files with 131 additions and 53 deletions

View file

@ -1,3 +1,10 @@
2009-07-26 Fred Kiefer <FredKiefer@gmx.de>
* 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 <greg.casamento@gmail.com>
* Source/NSAlert.m: Offset color by less in -resetWindow. Remove
@ -2635,7 +2642,7 @@
2008-04-07 Fred Kiefer <FredKiefer@gmx.de>
* 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,

View file

@ -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

View file

@ -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

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