Fixed <rdar://problem/3903749> REGRESSION (8A321): WebKit gets incorrect glyph metri...
authorrjw <rjw@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 6 Dec 2004 21:09:19 +0000 (21:09 +0000)
committerrjw <rjw@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 6 Dec 2004 21:09:19 +0000 (21:09 +0000)
Use CGFontRef direction when both getting font metrics and drawing
glyphs, instead on depending on [NSFont set].

        Reviewed by John.

        * WebCoreSupport.subproj/WebTextRenderer.m:
        (getUncachedWidth):
        (_drawGlyphs):

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

WebKit/ChangeLog
WebKit/WebCoreSupport.subproj/WebTextRenderer.m

index b794f201114ff0103722b6b2afeb38deae51e44e..088f05894b0d9727c4c2e76f820864b63efdbec9 100644 (file)
@@ -1,3 +1,16 @@
+2004-12-06  Richard Williamson   <rjw@apple.com>
+
+       Fixed <rdar://problem/3903749> REGRESSION (8A321): WebKit gets incorrect glyph metrics due to change in how AppKit uses CGFont
+
+       Use CGFontRef direction when both getting font metrics and drawing
+       glyphs, instead on depending on [NSFont set].
+
+        Reviewed by John.
+
+        * WebCoreSupport.subproj/WebTextRenderer.m:
+        (getUncachedWidth):
+        (_drawGlyphs):
+
 2004-12-06  Ken Kocienda  <kocienda@apple.com>
 
         Reviewed by Harrison
index b20abdef36a0eebdce08b6d697a4a6a7c4bee1c3..a48ee3a7337b36e498dfeaab557306b088c04192 100644 (file)
@@ -204,21 +204,42 @@ static inline SubstituteFontWidthMap *mapForSubstituteFont(WebTextRenderer *rend
 static inline WebGlyphWidth widthFromMap (WebTextRenderer *renderer, WidthMap *map, ATSGlyphRef glyph, NSFont *font);
 static inline WebGlyphWidth widthForGlyph (WebTextRenderer *renderer, ATSGlyphRef glyph, NSFont *font);
 
+#if BUILDING_ON_PANTHER
+
 static WebGlyphWidth getUncachedWidth(WebTextRenderer *renderer, WidthMap *map, ATSGlyphRef glyph, NSFont *font)
 {
     WebGlyphWidth width;
-    BOOL errorResult;
 
-    if (font)
-        errorResult = CGFontGetGlyphScaledAdvances ([font _backingCGSFont], &glyph, 1, &width, [font pointSize]);
-    else
-        errorResult = CGFontGetGlyphScaledAdvances ([renderer->font _backingCGSFont], &glyph, 1, &width, [renderer->font pointSize]);
-    if (errorResult == 0)
-        FATAL_ALWAYS ("Unable to cache glyph widths for %@ %f",  [renderer->font displayName], [renderer->font pointSize]);
+    if (font == NULL)
+        font = renderer->font;
+
+    if (!CGFontGetGlyphScaledAdvances ([font _backingCGSFont], &glyph, 1, &width, [font pointSize]))
+        FATAL_ALWAYS ("Unable to cache glyph widths for %@ %f",  [font displayName], [font pointSize]);
 
     return width;
 }
 
+#else
+
+static WebGlyphWidth getUncachedWidth(WebTextRenderer *renderer, WidthMap *map, ATSGlyphRef glyph, NSFont *font)
+{
+    float pointSize;
+    CGAffineTransform m;
+    CGSize advance;
+
+    if (font == NULL)
+        font = renderer->font;
+
+    pointSize = [font pointSize];
+    m = CGAffineTransformMakeScale(pointSize, pointSize);
+    if (!CGFontGetGlyphTransformedAdvances([font _backingCGSFont], &m, kCGFontRenderingModeAntialiased, &glyph, 1, &advance))
+        FATAL_ALWAYS ("Unable to cache glyph widths for %@ %f", [font displayName], pointSize);
+
+    return advance.width;
+}
+
+#endif
+
 static inline WebGlyphWidth widthFromMap (WebTextRenderer *renderer, WidthMap *map, ATSGlyphRef glyph, NSFont *font)
 {
     WebGlyphWidth width = UNINITIALIZED_GLYPH_WIDTH;
@@ -851,6 +872,7 @@ static void _drawGlyphs(NSFont *font, NSColor *color, CGGlyph *glyphs, CGSize *a
         cgContext = (CGContextRef)[gContext graphicsPort];
         // Setup the color and font.
         
+#if BUILDING_ON_PANTHER        
         if ([gContext isDrawingToScreen]){
             NSFont *screenFont = [font screenFont];
             if (screenFont != font){
@@ -867,6 +889,34 @@ static void _drawGlyphs(NSFont *font, NSColor *color, CGGlyph *glyphs, CGSize *a
             }
             [printerFont set];
         }
+#else
+        NSFont *drawFont;
+        
+        if ([gContext isDrawingToScreen]){
+            drawFont = [font screenFont];
+            if (drawFont != font){
+                // We are getting this in too many places (3406411); use ERROR so it only prints on
+                // debug versions for now. (We should debug this also, eventually).
+                ERROR ("Attempting to set non-screen font (%@) when drawing to screen.  Using screen font anyway, may result in incorrect metrics.", [[[font fontDescriptor] fontAttributes] objectForKey: NSFontNameAttribute]);
+            }
+        }
+        else {
+            drawFont = [font printerFont];
+            if (drawFont != font){
+                NSLog (@"Attempting to set non-printer font (%@) when printing.  Using printer font anyway, may result in incorrect metrics.", [[[font fontDescriptor] fontAttributes] objectForKey: NSFontNameAttribute]);
+            }
+        }
+        
+        CGContextSetFont (cgContext, [drawFont _backingCGSFont]);
+        
+        // Deal will flipping flippyness.
+        const float *matrix = [drawFont matrix];
+        float flip = [[NSView focusView] isFlipped] ? -1 : 1;
+        CGContextSetTextMatrix(cgContext, CGAffineTransformMake(matrix[0], matrix[1] * flip, matrix[2], matrix[3] * flip, matrix[4], matrix[5]));
+        CGContextSetFontRenderingMode (cgContext, kCGFontRenderingModeAntialiased);
+        CGContextSetFontSize(cgContext, 1.0);
+#endif
+
         [color set];
 
         CGContextSetTextPosition (cgContext, x, y);