Author: fredkiefer
Date: Sat Oct 17 21:49:15 2015
New Revision: 39079

URL: http://svn.gna.org/viewcvs/gnustep?rev=39079&view=rev
Log:
        * Source/NSAttributedString.m (-_substituteFontFor:font:): Use
        font descriptors for faster replacement font detection.
        * Source/GSFontInfo.m
        (GSFontEnumerator-matchingFontDescriptorsFor:): Special handling
        for NSFontCharacterSetAttribute.

Modified:
    libs/gui/trunk/ChangeLog
    libs/gui/trunk/Source/GSFontInfo.m
    libs/gui/trunk/Source/NSAttributedString.m

Modified: libs/gui/trunk/ChangeLog
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/gui/trunk/ChangeLog?rev=39079&r1=39078&r2=39079&view=diff
==============================================================================
--- libs/gui/trunk/ChangeLog    (original)
+++ libs/gui/trunk/ChangeLog    Sat Oct 17 21:49:15 2015
@@ -1,3 +1,11 @@
+2015-10-17 Fred Kiefer <[email protected]>
+
+       * Source/NSAttributedString.m (-_substituteFontFor:font:): Use
+       font descriptors for faster replacement font detection.
+       * Source/GSFontInfo.m
+       (GSFontEnumerator-matchingFontDescriptorsFor:): Special handling
+       for NSFontCharacterSetAttribute.
+
 2015-10-16 Fred Kiefer <[email protected]>
 
        * Source/NSCell.m (-trackMouse:...untilMouseUp:): Check enabled

Modified: libs/gui/trunk/Source/GSFontInfo.m
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/gui/trunk/Source/GSFontInfo.m?rev=39079&r1=39078&r2=39079&view=diff
==============================================================================
--- libs/gui/trunk/Source/GSFontInfo.m  (original)
+++ libs/gui/trunk/Source/GSFontInfo.m  Sat Oct 17 21:49:15 2015
@@ -229,6 +229,14 @@
                         break;
                       }
                   }
+                else if ([key isEqual: NSFontCharacterSetAttribute])
+                  {
+                    if (![valueB isSupersetOfSet: valueA])
+                      {
+                        match = NO;
+                        break;
+                      }
+                  }
                 else 
                   {
                     if (![valueA isEqual: valueB])

Modified: libs/gui/trunk/Source/NSAttributedString.m
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/gui/trunk/Source/NSAttributedString.m?rev=39079&r1=39078&r2=39079&view=diff
==============================================================================
--- libs/gui/trunk/Source/NSAttributedString.m  (original)
+++ libs/gui/trunk/Source/NSAttributedString.m  Sat Oct 17 21:49:15 2015
@@ -39,6 +39,7 @@
 #import <Foundation/NSFileManager.h>
 #import <Foundation/NSPathUtilities.h>
 #import <Foundation/NSRange.h>
+#import <Foundation/NSSet.h>
 #import <Foundation/NSString.h>
 #import <Foundation/NSValue.h>
 
@@ -50,6 +51,7 @@
 #import "AppKit/NSColor.h"
 #import "AppKit/NSFileWrapper.h"
 #import "AppKit/NSFont.h"
+#import "AppKit/NSFontDescriptor.h"
 #import "AppKit/NSFontManager.h"
 // For the colour name spaces
 #import "AppKit/NSGraphics.h"
@@ -1519,9 +1521,20 @@
   return nil;
 }
 
+- (NSFontDescriptor*)_substituteFontDescriptorFor: (unichar)uchar
+{
+  NSString *chars = [NSString stringWithCharacters: &uchar length: 1];
+  NSCharacterSet *requiredCharacterSet = [NSCharacterSet 
characterSetWithCharactersInString: chars];
+  NSDictionary *fontAttributes = [NSDictionary dictionaryWithObjectsAndKeys: 
requiredCharacterSet, NSFontCharacterSetAttribute, nil];
+  NSSet *mandatoryKeys = [NSSet setWithObjects: NSFontCharacterSetAttribute, 
nil];
+  NSFontDescriptor *fd = [NSFontDescriptor fontDescriptorWithFontAttributes: 
fontAttributes];
+  return [fd matchingFontDescriptorWithMandatoryKeys: mandatoryKeys];
+}
+
 - (NSFont*)_substituteFontFor: (unichar)uchar font: (NSFont*)baseFont
 {
   NSFont *subFont;
+  NSFontDescriptor *descriptor;
 
   // Caching one font may lead to the selected substitution font not being
   // from the prefered list, although there is one there with this character.
@@ -1538,13 +1551,29 @@
       return subFont;
     }
 
+  // Fast way with font descriptors
+  descriptor = [self _substituteFontDescriptorFor: uchar];
+  if (descriptor != nil)
+    {
+      NSCharacterSet *newSet = [descriptor objectForKey: 
NSFontCharacterSetAttribute];
+      if ([newSet characterIsMember: uchar])
+        {
+          NSString *fName = [descriptor objectForKey: NSFontFamilyAttribute];
+ 
+          ASSIGN(lastFont, fName);
+          ASSIGN(lastSet, newSet);
+          return [self _substituteFontWithName: fName font: baseFont];
+        }
+    }
+
+  
   subFont = [self _substituteFontFor: uchar font: baseFont fromList: 
                       [[NSFontManager sharedFontManager] availableFonts]];
   if (subFont != nil)
     {
       return subFont;
     }
-  
+
   return nil;
 }
 


_______________________________________________
Gnustep-cvs mailing list
[email protected]
https://mail.gna.org/listinfo/gnustep-cvs

Reply via email to