How does matchFontDescriptorsWithMandatoryKeys match font descriptors?

Im using the method - [NSFontDescriptor matchingFontDescriptorsWithMandatoryKeys:] to find if the font is already installed on the system, but the results are very strange to me.

Here is a small program to check if a given font matches the installed font:

#import <AppKit/AppKit.h>
#import <Foundation/Foundation.h>

void logFontDescriptor(NSString *message, NSFontDescriptor *fontDescriptor, NSArray *attributeKeys)
{
    printf("%s %s\n", [message UTF8String], [fontDescriptor.postscriptName UTF8String]);
    for (NSString *attributeKey in attributeKeys)
    {
        printf("    %30s -> %s\n", [[attributeKey description] UTF8String], [[[fontDescriptor objectForKey:attributeKey] description] UTF8String]);
    }
    printf("\n");
}

int main(int argc, const char * argv[])
{
    @autoreleasepool
    {
        if (argc != 2)
            return EXIT_FAILURE;

        NSArray *mandatoryKeys = @[ NSFontNameAttribute, NSFontFamilyAttribute, NSFontFaceAttribute ];

        NSURL *fontURL = [NSURL fileURLWithPath:@(argv[1])];
        NSArray *fontDescriptors = CFBridgingRelease(CTFontManagerCreateFontDescriptorsFromURL((__bridge CFURLRef)fontURL));
        for (NSFontDescriptor *fontDescriptor in fontDescriptors)
        {
            logFontDescriptor(@"***", fontDescriptor, mandatoryKeys);

            NSArray *matchingFontDescriptors = [fontDescriptor matchingFontDescriptorsWithMandatoryKeys:[NSSet setWithArray:mandatoryKeys]];
            for (NSFontDescriptor *matchingFontDescriptor in matchingFontDescriptors)
            {
                logFontDescriptor(@"  MATCHING", matchingFontDescriptor, mandatoryKeys);
            }
        }
    }
    return EXIT_SUCCESS;
}

To reproduce strange behavior, download the Ubuntu font family and copy only the Ubuntu-B.ttf(Ubuntu Bold) file into yours ~/Library/Fonts. Then run this test program using Ubuntu-R.ttf(Ubuntu Regular):

./font_descriptor_matching ~/Downloads/ubuntu-font-family-0.80/Ubuntu-R.ttf

Now you have the Ubuntu Bold font installed on your system, and you ask which font descriptors correspond to Ubuntu Regular, and here is the result (OS X 10.9.1):

*** Ubuntu
               NSFontNameAttribute -> Ubuntu
             NSFontFamilyAttribute -> Ubuntu
               NSFontFaceAttribute -> Regular

  MATCHING Ubuntu-Bold
               NSFontNameAttribute -> Ubuntu-Bold
             NSFontFamilyAttribute -> Ubuntu
               NSFontFaceAttribute -> Bold

Ubuntu Regular, (NSFontNameAttribute), (NSFontFamilyAttribute) (NSFontFaceAttribute) Ubuntu Bold. , , , . , , matchingFontDescriptorsWithMandatoryKeys: , .

, matchingFontDescriptorsWithMandatoryKeys: ?

:

  • Ubuntu Bold Ubuntu Regular, .

  • .

+4
1

, , , .

static NSArray * ReallyMatchingFontDescriptorsWithMandatoryKeys(NSFontDescriptor *fontDescriptor, NSSet *mandatoryKeys)
{
    NSArray *matchingFontDescriptors = [fontDescriptor matchingFontDescriptorsWithMandatoryKeys:mandatoryKeys];
    NSMutableArray *reallyMatchingFontDescriptors = [matchingFontDescriptors mutableCopy];
    for (NSFontDescriptor *matchingFontDescriptor in matchingFontDescriptors)
    {
        BOOL reallyMatching = YES;
        for (NSString *mandatoryKey in mandatoryKeys)
        {
            if (![[fontDescriptor objectForKey:mandatoryKey] isEqual:[matchingFontDescriptor objectForKey:mandatoryKey]])
                reallyMatching = NO;
        }
        if (!reallyMatching)
            [reallyMatchingFontDescriptors removeObjectIdenticalTo:matchingFontDescriptor];
    }
    return [reallyMatchingFontDescriptors copy];
}
+1

Source: https://habr.com/ru/post/1523906/


All Articles