WebKit:
authorrjw <rjw@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 9 Mar 2005 22:30:26 +0000 (22:30 +0000)
committerrjw <rjw@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 9 Mar 2005 22:30:26 +0000 (22:30 +0000)
Fixed <rdar://problem/4032938> Safari: text layout for MS P Gothic font is corrupted

The AppKit and ATS reports that MS P Gothic is fixed pitch.  It is
not!  This is another case of "fixed pitch" being wrong.  I've
coalesced all the special cases into our isFontFixedPitch:, and
used a dictionary to improve speed.  No performance regression.

        Reviewed by Maciej.

        * WebCoreSupport.subproj/WebTextRenderer.m:
        (-[WebTextRenderer _computeWidthForSpace]):
        * WebCoreSupport.subproj/WebTextRendererFactory.m:
        (-[WebTextRendererFactory clearCaches]):
        (-[WebTextRendererFactory isFontFixedPitch:]):

WebCore:
Fixed <rdar://problem/4032938> Safari: text layout for MS P Gothic font is corrupted

Remove our hacked special case now we have our own cache of
which fonts are fixed  pitch.

        Reviewed by Maciej.

        * kwq/KWQFont.mm:
        (QFont::isFixedPitch):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@8836 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog-2005-08-23
WebCore/kwq/KWQFont.mm
WebKit/ChangeLog
WebKit/WebCoreSupport.subproj/WebTextRenderer.m
WebKit/WebCoreSupport.subproj/WebTextRendererFactory.m

index cf280efbd5cef6af328a9809b22868036154d397..34b61d057c484a7ce230b6eecabdc7f8371b0aa1 100644 (file)
@@ -1,3 +1,15 @@
+2005-03-09  Richard Williamson   <rjw@apple.com>
+
+       Fixed <rdar://problem/4032938> Safari: text layout for MS P Gothic font is corrupted
+
+       Remove our hacked special case now we have our own cache of
+       which fonts are fixed  pitch.
+
+        Reviewed by Maciej.
+
+        * kwq/KWQFont.mm:
+        (QFont::isFixedPitch):
+
 2005-03-09  David Harrison  <harrison@apple.com>
 
         Reviewed by Maciej.
index ed9c950803e164179e52d892f469a23fa64fa5d0..4b132148416b77adc5756059c6673133add15931 100644 (file)
@@ -148,12 +148,6 @@ bool QFont::bold() const
 
 bool QFont::isFixedPitch() const
 {
-    // Special case Osaka-Mono.  Do it here rather than in WebKit
-    // for performance reaason. See <rdar://problem/3999467> for
-    // more details.
-    if (family() == "Osaka-Mono")
-       return true;
-       
     KWQ_BLOCK_EXCEPTIONS;
     return [[WebCoreTextRendererFactory sharedFactory] isFontFixedPitch: getNSFont()];
     KWQ_UNBLOCK_EXCEPTIONS;
index a990e76f5867901211a7c471aaae6f1e35fa1782..86bb6d4b6c0c7578ffb5510464b145ca9c3a28a8 100644 (file)
@@ -1,3 +1,20 @@
+2005-03-09  Richard Williamson   <rjw@apple.com>
+       
+       Fixed <rdar://problem/4032938> Safari: text layout for MS P Gothic font is corrupted
+
+       The AppKit and ATS reports that MS P Gothic is fixed pitch.  It is
+       not!  This is another case of "fixed pitch" being wrong.  I've
+       coalesced all the special cases into our isFontFixedPitch:, and
+       used a dictionary to improve speed.  No performance regression.
+
+        Reviewed by Maciej.
+
+        * WebCoreSupport.subproj/WebTextRenderer.m:
+        (-[WebTextRenderer _computeWidthForSpace]):
+        * WebCoreSupport.subproj/WebTextRendererFactory.m:
+        (-[WebTextRendererFactory clearCaches]):
+        (-[WebTextRendererFactory isFontFixedPitch:]):
+
 2005-03-09  Darin Adler  <darin@apple.com>
 
         Reviewed by Maciej.
index 2136cdb8c7b0278f3c99e82d181482873e35844f..2563791746c823c62afa991d499dcb127d25fd2c 100644 (file)
@@ -42,7 +42,6 @@
 + (NSFont *) findFontLike:(NSFont *)aFont forCharacter:(UInt32)c inLanguage:(NSLanguage *) language;
 + (NSFont *) findFontLike:(NSFont *)aFont forString:(NSString *)string withRange:(NSRange)range inLanguage:(NSLanguage *) language;
 - (NSGlyph)_defaultGlyphForChar:(unichar)uu;
-- (BOOL)_isFakeFixedPitch;
 @end
 
 // Macros
@@ -865,7 +864,7 @@ static inline BOOL fontContainsString(NSFont *font, NSString *string)
     float width = widthForGlyph(self, spaceGlyph, 0);
     spaceWidth = width;
 
-    treatAsFixedPitch = [font isFixedPitch] || [font _isFakeFixedPitch] || [font _web_isFakeFixedPitch];
+    treatAsFixedPitch = [[WebTextRendererFactory sharedFactory] isFontFixedPitch:font];
     adjustedSpaceWidth = treatAsFixedPitch ? CEIL_TO_INT(width) : ROUND_TO_INT(width);
     
     return YES;
index fd407a4154835477954a7a422019a94e2aebd596..8ab25390467857dbe36d6d1272c93cacd5eb9054 100644 (file)
 - (BOOL)_isFakeFixedPitch;
 @end
 
-@implementation NSFont (WebPrivateExtensions)
-- (BOOL)_web_isFakeFixedPitch
-{
-    // Special case Osaka-Mono.  According to <rdar://problem/3999467>, we should treat Osaka-Mono
-    // as fixed pitch.
-    if ([[self fontName] caseInsensitiveCompare:@"Osaka-Mono"] == NSOrderedSame)
-       return YES;
-    return NO;
-}
-@end
-
-
 @implementation WebTextRendererFactory
 
 - (BOOL)coalesceTextDrawing
@@ -191,7 +179,8 @@ static int getLCDScaleParameters(void)
 
 }
 
-static CFMutableDictionaryRef fontCache = NULL;
+static CFMutableDictionaryRef fontCache;
+static CFMutableDictionaryRef fixedPitchFonts;
 
 - (void)clearCaches
 {
@@ -205,6 +194,11 @@ static CFMutableDictionaryRef fontCache = NULL;
         CFRelease(fontCache);
     fontCache = NULL;
     
+    if (fixedPitchFonts) {
+        CFRelease (fixedPitchFonts);
+        fixedPitchFonts = 0;
+    }
+        
     [super clearCaches];
 }
 
@@ -261,10 +255,33 @@ fontsChanged( ATSFontNotificationInfoRef info, void *_factory)
 
 - (BOOL)isFontFixedPitch: (NSFont *)font
 {
-    // We don't add additional check for [font _web_isFakeFixedPitch] here because of
-    // performance problems.  Instead the check is done down in WebCore (QFont) and
-    // also in WebTextRenderer.
-    return [font isFixedPitch] || [font _isFakeFixedPitch];
+    BOOL ret = NO;
+    
+    if (!fixedPitchFonts) {
+        fixedPitchFonts = CFDictionaryCreateMutable (0, 0, &kCFTypeDictionaryKeyCallBacks, 0);
+    }
+    
+    CFBooleanRef val = CFDictionaryGetValue (fixedPitchFonts, font);
+    if (val) {
+        ret = (val == kCFBooleanTrue);
+    }
+    else {
+        // Special case Osaka-Mono.  According to <rdar://problem/3999467>, we should treat Osaka-Mono
+        // as fixed pitch. Note that the AppKit does not report MS-PGothic as fixed pitch.
+
+        // Special case MS PGothic.  According to <rdar://problem/4032938, we should not treat MS-PGothic
+        // as fixed pitch.  Note that AppKit does report MS-PGothic as fixed pitch.
+        if (([font isFixedPitch] || [font _isFakeFixedPitch] || [[font fontName] caseInsensitiveCompare:@"Osaka-Mono"] == NSOrderedSame) && 
+                ![[font fontName] caseInsensitiveCompare:@"MS-PGothic"] == NSOrderedSame) {
+            CFDictionarySetValue (fixedPitchFonts, font, kCFBooleanTrue);
+            ret = YES;
+        }
+        else {
+            CFDictionarySetValue (fixedPitchFonts, font, kCFBooleanFalse);
+            ret = NO;
+        }
+    }
+    return ret;    
 }
 
 - init