[SCM] WebKit Debian packaging branch, debian/unstable, updated. debian/1.1.15-1-40151-g37bb677

rjw rjw at 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Sat Sep 26 07:10:55 UTC 2009


The following commit has been merged in the debian/unstable branch:
commit a56a61fe91115fd34416d965913b6dc25c09cef0
Author: rjw <rjw at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Wed Dec 4 01:56:00 2002 +0000

            Fixed 3019986.  Use an array of font families instead of a single
            font family to support CSS family lists.
            r=hyatt
    
            * Misc.subproj/WebKitNSStringExtras.m:
            (-[NSString _web_widthForString:font:]):
            * Misc.subproj/WebStringTruncator.m:
            (+[WebStringTruncator rightTruncateString:toWidth:withFont:]):
            (+[WebStringTruncator centerTruncateString:toWidth:withFont:]):
            * WebCoreSupport.subproj/WebTextRenderer.h:
            * WebCoreSupport.subproj/WebTextRenderer.m:
            (-[WebTextRenderer substituteFontForString:families:]):
            (-[WebTextRenderer substituteFontForCharacters:length:families:]):
            (-[WebTextRenderer widthForCharacters:length:]):
            (-[WebTextRenderer drawCharacters:stringLength:fromCharacterPosition:toCharacterPosition:atPoint:withPadding:withTextColor:backgroundColor:rightToLeft:letterSpacing:wordSpacing:fontFamilies:]):
            (-[WebTextRenderer floatWidthForCharacters:stringLength:characterPosition:]):
            (-[WebTextRenderer floatWidthForCharacters:stringLength:fromCharacterPosition:numberOfCharacters:]):
            (-[WebTextRenderer floatWidthForCharacters:stringLength:fromCharacterPosition:numberOfCharacters:withPadding:applyRounding:attemptFontSubstitution:widths:letterSpacing:wordSpacing:fontFamilies:]):
            (-[WebTextRenderer _floatWidthForCharacters:stringLength:fromCharacterPosition:numberOfCharacters:withPadding:applyRounding:attemptFontSubstitution:widths:fonts:glyphs:numGlyphs:letterSpacing:wordSpacing:fontFamilies:]):
            * WebCoreSupport.subproj/WebTextRendererFactory.h:
            * WebCoreSupport.subproj/WebTextRendererFactory.m:
            (-[WebTextRendererFactory fontWithFamilies:traits:size:]):
            (-[WebTextRendererFactory fontWithFamily:traits:size:]):
            (+[WebTextRendererFactory fallbackFontWithTraits:size:]):
            (-[WebTextRendererFactory cachedFontFromFamily:traits:size:]):
            (-[WebTextRendererFactory cachedFontFromFamilies:traits:size:]):
            (-[WebTextRendererFactory rendererWithFamilies:traits:size:]):
    
            Fixed 3019986.  Use an array of font families instead of a single
            font family to support CSS family lists.
            r=hyatt
    
            * kwq/KWQFont.h:
            * kwq/KWQFont.mm:
            (QFont::getNSFont):
            * kwq/KWQFontMetrics.mm:
            (QFontMetrics::width):
            (QFontMetrics::floatWidth):
            (QFontMetrics::floatCharacterWidths):
            * kwq/KWQPainter.mm:
            (QPainter::drawText):
            (QPainter::drawUnderlineForText):
            * kwq/WebCoreTextRenderer.h:
            * kwq/WebCoreTextRendererFactory.h:
            * kwq/WebCoreTextRendererFactory.m:
            (-[WebCoreTextRendererFactory rendererWithFamilies:traits:size:]):
            (-[WebCoreTextRendererFactory fontWithFamilies:traits:size:]):
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@2915 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog-2002-12-03 b/WebCore/ChangeLog-2002-12-03
index b630f38..031ee2c 100644
--- a/WebCore/ChangeLog-2002-12-03
+++ b/WebCore/ChangeLog-2002-12-03
@@ -1,3 +1,25 @@
+2002-12-03  Richard Williamson   <rjw at apple.com>
+
+        Fixed 3019986.  Use an array of font families instead of a single
+        font family to support CSS family lists.
+        r=hyatt
+                
+        * kwq/KWQFont.h:
+        * kwq/KWQFont.mm:
+        (QFont::getNSFont):
+        * kwq/KWQFontMetrics.mm:
+        (QFontMetrics::width):
+        (QFontMetrics::floatWidth):
+        (QFontMetrics::floatCharacterWidths):
+        * kwq/KWQPainter.mm:
+        (QPainter::drawText):
+        (QPainter::drawUnderlineForText):
+        * kwq/WebCoreTextRenderer.h:
+        * kwq/WebCoreTextRendererFactory.h:
+        * kwq/WebCoreTextRendererFactory.m:
+        (-[WebCoreTextRendererFactory rendererWithFamilies:traits:size:]):
+        (-[WebCoreTextRendererFactory fontWithFamilies:traits:size:]):
+
 2002-12-03  David Hyatt  <hyatt at apple.com>
 
 	Fix for 3112599, aol.com shopping page doesn't work.  Apply
diff --git a/WebCore/ChangeLog-2003-10-25 b/WebCore/ChangeLog-2003-10-25
index b630f38..031ee2c 100644
--- a/WebCore/ChangeLog-2003-10-25
+++ b/WebCore/ChangeLog-2003-10-25
@@ -1,3 +1,25 @@
+2002-12-03  Richard Williamson   <rjw at apple.com>
+
+        Fixed 3019986.  Use an array of font families instead of a single
+        font family to support CSS family lists.
+        r=hyatt
+                
+        * kwq/KWQFont.h:
+        * kwq/KWQFont.mm:
+        (QFont::getNSFont):
+        * kwq/KWQFontMetrics.mm:
+        (QFontMetrics::width):
+        (QFontMetrics::floatWidth):
+        (QFontMetrics::floatCharacterWidths):
+        * kwq/KWQPainter.mm:
+        (QPainter::drawText):
+        (QPainter::drawUnderlineForText):
+        * kwq/WebCoreTextRenderer.h:
+        * kwq/WebCoreTextRendererFactory.h:
+        * kwq/WebCoreTextRendererFactory.m:
+        (-[WebCoreTextRendererFactory rendererWithFamilies:traits:size:]):
+        (-[WebCoreTextRendererFactory fontWithFamilies:traits:size:]):
+
 2002-12-03  David Hyatt  <hyatt at apple.com>
 
 	Fix for 3112599, aol.com shopping page doesn't work.  Apply
diff --git a/WebCore/ChangeLog-2005-08-23 b/WebCore/ChangeLog-2005-08-23
index b630f38..031ee2c 100644
--- a/WebCore/ChangeLog-2005-08-23
+++ b/WebCore/ChangeLog-2005-08-23
@@ -1,3 +1,25 @@
+2002-12-03  Richard Williamson   <rjw at apple.com>
+
+        Fixed 3019986.  Use an array of font families instead of a single
+        font family to support CSS family lists.
+        r=hyatt
+                
+        * kwq/KWQFont.h:
+        * kwq/KWQFont.mm:
+        (QFont::getNSFont):
+        * kwq/KWQFontMetrics.mm:
+        (QFontMetrics::width):
+        (QFontMetrics::floatWidth):
+        (QFontMetrics::floatCharacterWidths):
+        * kwq/KWQPainter.mm:
+        (QPainter::drawText):
+        (QPainter::drawUnderlineForText):
+        * kwq/WebCoreTextRenderer.h:
+        * kwq/WebCoreTextRendererFactory.h:
+        * kwq/WebCoreTextRendererFactory.m:
+        (-[WebCoreTextRendererFactory rendererWithFamilies:traits:size:]):
+        (-[WebCoreTextRendererFactory fontWithFamilies:traits:size:]):
+
 2002-12-03  David Hyatt  <hyatt at apple.com>
 
 	Fix for 3112599, aol.com shopping page doesn't work.  Apply
diff --git a/WebCore/kwq/KWQFont.h b/WebCore/kwq/KWQFont.h
index 8360477..7f0abcc 100644
--- a/WebCore/kwq/KWQFont.h
+++ b/WebCore/kwq/KWQFont.h
@@ -101,7 +101,6 @@ public:
     float getNSSize() const { return _size; }
     
     NSFont *getNSFont() const;
-    NSFont* getNSFontWithFamily(QFontFamily* fontFamily) const;
     
 private:
     QFontFamily _family;
@@ -109,4 +108,32 @@ private:
     float _size;
 };
 
+// Macro to create a stack array containing non-retained NSString names
+// of CSS font families.  This can be used to avoid allocations in
+// performance critical code.  Create a NSSString ** name families
+// and populates with a NSString * for each family name.  Null terminates
+// the array.
+#define CREATE_FAMILY_ARRAY(font,families)\
+int __numFamilies = 0;\
+{\
+    QFontFamily *__ff = ((QFont)font).firstFamily();\
+    while (__ff)\
+    {\
+        __numFamilies++;\
+            __ff = __ff->next();\
+    }\
+}\
+NSString *families[__numFamilies+1];\
+{\
+    int __i = 0;\
+    QFontFamily *__ff = ((QFont)font).firstFamily();\
+    while (__ff)\
+    {\
+        families[__i++] = __ff->getNSFamily();\
+            __ff = __ff->next();\
+    }\
+    families[__i] = 0;\
+}
+
+
 #endif
diff --git a/WebCore/kwq/KWQFont.mm b/WebCore/kwq/KWQFont.mm
index c39b301..d72e6b3 100644
--- a/WebCore/kwq/KWQFont.mm
+++ b/WebCore/kwq/KWQFont.mm
@@ -145,17 +145,10 @@ bool QFont::operator==(const QFont &compareFont) const
 
 NSFont *QFont::getNSFont() const
 {
-    return [[WebCoreTextRendererFactory sharedFactory] 
-    	fontWithFamily:getNSFamily()
-                traits:getNSTraits() 
-                  size:getNSSize()];
-}
+    CREATE_FAMILY_ARRAY(this, families);
 
-NSFont *QFont::getNSFontWithFamily(QFontFamily* family) const
-{
     return [[WebCoreTextRendererFactory sharedFactory] 
-    	fontWithFamily:family->getNSFamily()
+    	fontWithFamilies:families
                 traits:getNSTraits() 
                   size:getNSSize()];
 }
-
diff --git a/WebCore/kwq/KWQFontMetrics.mm b/WebCore/kwq/KWQFontMetrics.mm
index 5f211fe..11a3ef1 100644
--- a/WebCore/kwq/KWQFontMetrics.mm
+++ b/WebCore/kwq/KWQFontMetrics.mm
@@ -34,10 +34,16 @@
 
 struct QFontMetricsPrivate
 {
+    friend class QFontMetrics;
+    
     QFontMetricsPrivate(const QFont &font)
     {
         refCount = 0;
-        renderer = [[[WebCoreTextRendererFactory sharedFactory] rendererWithFamily:font.getNSFamily() traits:font.getNSTraits() size:font.getNSSize()] retain];
+
+        CREATE_FAMILY_ARRAY(font, families);
+
+        renderer = [[[WebCoreTextRendererFactory sharedFactory] rendererWithFamilies:families traits:font.getNSTraits() size:font.getNSSize()] retain];
+        _font = font;
     }
     ~QFontMetricsPrivate()
     {
@@ -52,7 +58,7 @@ struct QFontMetricsPrivate
     
 private:
     id <WebCoreTextRenderer> renderer;
-    
+    QFont _font;
     QFontMetricsPrivate(const QFontMetricsPrivate&);
     QFontMetricsPrivate& operator=(const QFontMetricsPrivate&);
 };
@@ -112,7 +118,10 @@ float QFontMetrics::xHeight() const
 int QFontMetrics::width(QChar qc) const
 {
     UniChar c = qc.unicode();
-    return ROUND_TO_INT([data->getRenderer() floatWidthForCharacters:&c stringLength:1 fromCharacterPosition:0 numberOfCharacters:1 withPadding: 0 applyRounding:YES attemptFontSubstitution: YES widths:0 letterSpacing:0 wordSpacing:0]);
+
+    CREATE_FAMILY_ARRAY(data->_font, families);
+    
+    return ROUND_TO_INT([data->getRenderer() floatWidthForCharacters:&c stringLength:1 fromCharacterPosition:0 numberOfCharacters:1 withPadding: 0 applyRounding:YES attemptFontSubstitution: YES widths:0 letterSpacing:0 wordSpacing:0 fontFamilies: families]);
 }
 
 int QFontMetrics::charWidth(const QString &s, int pos) const
@@ -123,27 +132,38 @@ int QFontMetrics::charWidth(const QString &s, int pos) const
 int QFontMetrics::width(char c) const
 {
     UniChar ch = (uchar) c;
-    return ROUND_TO_INT([data->getRenderer() floatWidthForCharacters:&ch stringLength:1 fromCharacterPosition:0 numberOfCharacters:1 withPadding: 0 applyRounding:YES attemptFontSubstitution: YES widths:0  letterSpacing:0 wordSpacing:0]);
+
+    CREATE_FAMILY_ARRAY(data->_font, families);
+
+    return ROUND_TO_INT([data->getRenderer() floatWidthForCharacters:&ch stringLength:1 fromCharacterPosition:0 numberOfCharacters:1 withPadding: 0 applyRounding:YES attemptFontSubstitution: YES widths:0  letterSpacing:0 wordSpacing:0 fontFamilies: families]);
 }
 
 int QFontMetrics::width(const QString &qstring, int len) const
 {
-    return ROUND_TO_INT([data->getRenderer() floatWidthForCharacters:(const UniChar *)qstring.unicode() stringLength:len fromCharacterPosition:0 numberOfCharacters:len withPadding: 0 applyRounding:YES attemptFontSubstitution: YES widths: 0 letterSpacing:0 wordSpacing:0]);
+    CREATE_FAMILY_ARRAY(data->_font, families);
+
+    return ROUND_TO_INT([data->getRenderer() floatWidthForCharacters:(const UniChar *)qstring.unicode() stringLength:len fromCharacterPosition:0 numberOfCharacters:len withPadding: 0 applyRounding:YES attemptFontSubstitution: YES widths: 0 letterSpacing:0 wordSpacing:0 fontFamilies: families]);
 }
 
 int QFontMetrics::width(const QChar *uchars, int len) const
 {
-    return ROUND_TO_INT([data->getRenderer() floatWidthForCharacters:(const UniChar *)uchars stringLength:len fromCharacterPosition:0 numberOfCharacters:len withPadding: 0 applyRounding:YES attemptFontSubstitution: YES widths: 0 letterSpacing:0 wordSpacing:0]);
+    CREATE_FAMILY_ARRAY(data->_font, families);
+
+    return ROUND_TO_INT([data->getRenderer() floatWidthForCharacters:(const UniChar *)uchars stringLength:len fromCharacterPosition:0 numberOfCharacters:len withPadding: 0 applyRounding:YES attemptFontSubstitution: YES widths: 0 letterSpacing:0 wordSpacing:0 fontFamilies: families]);
 }
 
 float QFontMetrics::floatWidth(const QChar *uchars, int slen, int pos, int len, int letterSpacing, int wordSpacing) const
 {
-    return [data->getRenderer() floatWidthForCharacters:(const UniChar *)uchars stringLength:slen fromCharacterPosition:pos numberOfCharacters:len withPadding: 0 applyRounding: YES attemptFontSubstitution: YES widths: 0 letterSpacing:letterSpacing wordSpacing:wordSpacing];
+    CREATE_FAMILY_ARRAY(data->_font, families);
+
+    return [data->getRenderer() floatWidthForCharacters:(const UniChar *)uchars stringLength:slen fromCharacterPosition:pos numberOfCharacters:len withPadding: 0 applyRounding: YES attemptFontSubstitution: YES widths: 0 letterSpacing:letterSpacing wordSpacing:wordSpacing fontFamilies: families];
 }
 
 float QFontMetrics::floatCharacterWidths(const QChar *uchars, int slen, int pos, int len, int toAdd, float *buffer, int letterSpacing, int wordSpacing) const
 {
-    return [data->getRenderer() floatWidthForCharacters:(const UniChar *)uchars stringLength:slen fromCharacterPosition:pos numberOfCharacters:len withPadding: toAdd applyRounding: YES attemptFontSubstitution: YES widths: (float *)buffer letterSpacing:letterSpacing wordSpacing: wordSpacing];
+    CREATE_FAMILY_ARRAY(data->_font, families);
+    
+    return [data->getRenderer() floatWidthForCharacters:(const UniChar *)uchars stringLength:slen fromCharacterPosition:pos numberOfCharacters:len withPadding: toAdd applyRounding: YES attemptFontSubstitution: YES widths: (float *)buffer letterSpacing:letterSpacing wordSpacing: wordSpacing fontFamilies: families];
 }
 
 QRect QFontMetrics::boundingRect(const QString &qstring, int len) const
diff --git a/WebCore/kwq/KWQPainter.mm b/WebCore/kwq/KWQPainter.mm
index 9e1fed9..c635512 100644
--- a/WebCore/kwq/KWQPainter.mm
+++ b/WebCore/kwq/KWQPainter.mm
@@ -354,13 +354,17 @@ void QPainter::drawText(int x, int y, int, int, int alignmentFlags, const QStrin
     if (data->state.paintingDisabled)
         return;
         
+    // Avoid allocations, use stack array to pass font families.  Normally these
+    // css fallback lists are small <= 3.
+    CREATE_FAMILY_ARRAY(data->state.font, families);
+
     id<WebCoreTextRenderer> renderer = 
       [[WebCoreTextRendererFactory sharedFactory]
-          rendererWithFamily:data->state.font.getNSFamily() traits:data->state.font.getNSTraits() size:data->state.font.getNSSize()];
+          rendererWithFamilies:families traits:data->state.font.getNSTraits() size:data->state.font.getNSSize()];
 
     const UniChar* str = (const UniChar*)qstring.unicode();
     if (alignmentFlags & Qt::AlignRight)
-        x -= ROUND_TO_INT([renderer floatWidthForCharacters:(const UniChar *)str stringLength:qstring.length() fromCharacterPosition:0 numberOfCharacters:qstring.length() withPadding: 0 applyRounding:YES attemptFontSubstitution: YES widths: 0 letterSpacing: 0 wordSpacing: 0]);
+        x -= ROUND_TO_INT([renderer floatWidthForCharacters:(const UniChar *)str stringLength:qstring.length() fromCharacterPosition:0 numberOfCharacters:qstring.length() withPadding: 0 applyRounding:YES attemptFontSubstitution: YES widths: 0 letterSpacing: 0 wordSpacing: 0 fontFamilies: families]);
      
     [renderer drawCharacters:str stringLength:qstring.length()
         fromCharacterPosition:0 
@@ -371,16 +375,21 @@ void QPainter::drawText(int x, int y, int, int, int alignmentFlags, const QStrin
         backgroundColor:nil
         rightToLeft: false
         letterSpacing: 0
-        wordSpacing: 0];
+        wordSpacing: 0
+        fontFamilies: families];
 }
 
 void QPainter::drawText(int x, int y, const QChar *str, int len, int from, int to, int toAdd, const QColor &backgroundColor, QPainter::TextDirection d, int letterSpacing, int wordSpacing)
 {
     if (data->state.paintingDisabled || len <= 0)
         return;
-        
+
+    // Avoid allocations, use stack array to pass font families.  Normally these
+    // css fallback lists are small <= 3.
+    CREATE_FAMILY_ARRAY(data->state.font, families);
+    
     [[[WebCoreTextRendererFactory sharedFactory]
-        rendererWithFamily:data->state.font.getNSFamily() traits:data->state.font.getNSTraits() size:data->state.font.getNSSize()]
+        rendererWithFamilies:families traits:data->state.font.getNSTraits() size:data->state.font.getNSSize()]
     	drawCharacters:(const UniChar *)str stringLength:len
         fromCharacterPosition:from 
         toCharacterPosition:to 
@@ -390,16 +399,19 @@ void QPainter::drawText(int x, int y, const QChar *str, int len, int from, int t
         backgroundColor:backgroundColor.isValid() ? backgroundColor.getNSColor() : nil
         rightToLeft: d == RTL ? true : false
         letterSpacing: letterSpacing
-        wordSpacing: wordSpacing];
+        wordSpacing: wordSpacing
+        fontFamilies: families];
 }
 
 void QPainter::drawUnderlineForText(int x, int y, const QChar *str, int len)
 {
     if (data->state.paintingDisabled)
         return;
+
+    CREATE_FAMILY_ARRAY(data->state.font, families);
         
     [[[WebCoreTextRendererFactory sharedFactory]
-        rendererWithFamily:data->state.font.getNSFamily() traits:data->state.font.getNSTraits() size:data->state.font.getNSSize()]
+        rendererWithFamilies:families traits:data->state.font.getNSTraits() size:data->state.font.getNSSize()]
         drawUnderlineForCharacters:(const UniChar *)str stringLength:len
         atPoint:NSMakePoint(x,y) withColor:data->state.pen.color().getNSColor()];
 }
diff --git a/WebCore/kwq/WebCoreTextRenderer.h b/WebCore/kwq/WebCoreTextRenderer.h
index b89518a..f42e277 100644
--- a/WebCore/kwq/WebCoreTextRenderer.h
+++ b/WebCore/kwq/WebCoreTextRenderer.h
@@ -38,10 +38,10 @@
 - (float)xHeight;
 
 // horizontal metrics
-- (float)floatWidthForCharacters:(const unichar *)characters stringLength:(unsigned)length fromCharacterPosition: (int)pos numberOfCharacters: (int)len withPadding: (int)padding applyRounding: (BOOL)applyRounding attemptFontSubstitution: (BOOL)attemptFontSubstitution widths: (float *)buffer letterSpacing: (int)letterSpacing wordSpacing: (int)wordSpacing;
+- (float)floatWidthForCharacters:(const unichar *)characters stringLength:(unsigned)length fromCharacterPosition: (int)pos numberOfCharacters: (int)len withPadding: (int)padding applyRounding: (BOOL)applyRounding attemptFontSubstitution: (BOOL)attemptFontSubstitution widths: (float *)buffer letterSpacing: (int)letterSpacing wordSpacing: (int)wordSpacing fontFamilies: (NSString **)families;
 
 // drawing
-- (void)drawCharacters:(const UniChar *)characters stringLength:(unsigned)length fromCharacterPosition:(int)from toCharacterPosition:(int)to atPoint:(NSPoint)point withPadding: (int)padding withTextColor:(NSColor *)textColor backgroundColor:(NSColor *)backgroundColor rightToLeft: (BOOL)rtl letterSpacing: (int)letterSpacing wordSpacing: (int)wordSpacing;
+- (void)drawCharacters:(const UniChar *)characters stringLength:(unsigned)length fromCharacterPosition:(int)from toCharacterPosition:(int)to atPoint:(NSPoint)point withPadding: (int)padding withTextColor:(NSColor *)textColor backgroundColor:(NSColor *)backgroundColor rightToLeft: (BOOL)rtl letterSpacing: (int)letterSpacing wordSpacing: (int)wordSpacing fontFamilies: (NSString **)families;
 - (void)drawUnderlineForCharacters:(const UniChar *)characters stringLength:(unsigned)length atPoint:(NSPoint)point withColor:(NSColor *)color;
 
 @end
diff --git a/WebCore/kwq/WebCoreTextRendererFactory.h b/WebCore/kwq/WebCoreTextRendererFactory.h
index 1e883c4..34dab07 100644
--- a/WebCore/kwq/WebCoreTextRendererFactory.h
+++ b/WebCore/kwq/WebCoreTextRendererFactory.h
@@ -32,7 +32,7 @@
 }
 
 + (WebCoreTextRendererFactory *)sharedFactory;
-- (id <WebCoreTextRenderer>)rendererWithFamily:(NSString *)family traits:(NSFontTraitMask)traits size:(float)size;
-- (NSFont *)fontWithFamily:(NSString *)family traits:(NSFontTraitMask)traits size:(float)size;
+- (id <WebCoreTextRenderer>)rendererWithFamilies:(NSString **)families traits:(NSFontTraitMask)traits size:(float)size;
+- (NSFont *)fontWithFamilies:(NSString **)families traits:(NSFontTraitMask)traits size:(float)size;
 
 @end
diff --git a/WebCore/kwq/WebCoreTextRendererFactory.m b/WebCore/kwq/WebCoreTextRendererFactory.m
index fc9f793..76f8f73 100644
--- a/WebCore/kwq/WebCoreTextRendererFactory.m
+++ b/WebCore/kwq/WebCoreTextRendererFactory.m
@@ -46,7 +46,7 @@ static WebCoreTextRendererFactory *sharedFactory;
     return self;
 }
 
-- (id <WebCoreTextRenderer>)rendererWithFamily:(NSString *)family traits:(NSFontTraitMask)traits size:(float)size
+- (id <WebCoreTextRenderer>)rendererWithFamilies:(NSString **)families traits:(NSFontTraitMask)traits size:(float)size
 {
     return nil;
 }
@@ -55,4 +55,10 @@ static WebCoreTextRendererFactory *sharedFactory;
 {
     return nil;
 }
+
+- (NSFont *)fontWithFamilies:(NSString **)families traits:(NSFontTraitMask)traits size:(float)size
+{
+    return nil;
+}
+
 @end
diff --git a/WebCore/kwq/WebCoreTextRendererFactory.mm b/WebCore/kwq/WebCoreTextRendererFactory.mm
index fc9f793..76f8f73 100644
--- a/WebCore/kwq/WebCoreTextRendererFactory.mm
+++ b/WebCore/kwq/WebCoreTextRendererFactory.mm
@@ -46,7 +46,7 @@ static WebCoreTextRendererFactory *sharedFactory;
     return self;
 }
 
-- (id <WebCoreTextRenderer>)rendererWithFamily:(NSString *)family traits:(NSFontTraitMask)traits size:(float)size
+- (id <WebCoreTextRenderer>)rendererWithFamilies:(NSString **)families traits:(NSFontTraitMask)traits size:(float)size
 {
     return nil;
 }
@@ -55,4 +55,10 @@ static WebCoreTextRendererFactory *sharedFactory;
 {
     return nil;
 }
+
+- (NSFont *)fontWithFamilies:(NSString **)families traits:(NSFontTraitMask)traits size:(float)size
+{
+    return nil;
+}
+
 @end
diff --git a/WebKit/ChangeLog b/WebKit/ChangeLog
index eb10360..780af8e 100644
--- a/WebKit/ChangeLog
+++ b/WebKit/ChangeLog
@@ -1,3 +1,33 @@
+2002-12-03  Richard Williamson   <rjw at apple.com>
+
+        Fixed 3019986.  Use an array of font families instead of a single
+        font family to support CSS family lists.
+        r=hyatt
+        
+        * Misc.subproj/WebKitNSStringExtras.m:
+        (-[NSString _web_widthForString:font:]):
+        * Misc.subproj/WebStringTruncator.m:
+        (+[WebStringTruncator rightTruncateString:toWidth:withFont:]):
+        (+[WebStringTruncator centerTruncateString:toWidth:withFont:]):
+        * WebCoreSupport.subproj/WebTextRenderer.h:
+        * WebCoreSupport.subproj/WebTextRenderer.m:
+        (-[WebTextRenderer substituteFontForString:families:]):
+        (-[WebTextRenderer substituteFontForCharacters:length:families:]):
+        (-[WebTextRenderer widthForCharacters:length:]):
+        (-[WebTextRenderer drawCharacters:stringLength:fromCharacterPosition:toCharacterPosition:atPoint:withPadding:withTextColor:backgroundColor:rightToLeft:letterSpacing:wordSpacing:fontFamilies:]):
+        (-[WebTextRenderer floatWidthForCharacters:stringLength:characterPosition:]):
+        (-[WebTextRenderer floatWidthForCharacters:stringLength:fromCharacterPosition:numberOfCharacters:]):
+        (-[WebTextRenderer floatWidthForCharacters:stringLength:fromCharacterPosition:numberOfCharacters:withPadding:applyRounding:attemptFontSubstitution:widths:letterSpacing:wordSpacing:fontFamilies:]):
+        (-[WebTextRenderer _floatWidthForCharacters:stringLength:fromCharacterPosition:numberOfCharacters:withPadding:applyRounding:attemptFontSubstitution:widths:fonts:glyphs:numGlyphs:letterSpacing:wordSpacing:fontFamilies:]):
+        * WebCoreSupport.subproj/WebTextRendererFactory.h:
+        * WebCoreSupport.subproj/WebTextRendererFactory.m:
+        (-[WebTextRendererFactory fontWithFamilies:traits:size:]):
+        (-[WebTextRendererFactory fontWithFamily:traits:size:]):
+        (+[WebTextRendererFactory fallbackFontWithTraits:size:]):
+        (-[WebTextRendererFactory cachedFontFromFamily:traits:size:]):
+        (-[WebTextRendererFactory cachedFontFromFamilies:traits:size:]):
+        (-[WebTextRendererFactory rendererWithFamilies:traits:size:]):
+
 2002-12-03  Chris Blumenberg  <cblu at apple.com>
 
 	Fixed: 3115073 - REGRESSION: plants.com is crashing in WebIconDB with bad retain count
diff --git a/WebKit/ChangeLog-2002-12-03 b/WebKit/ChangeLog-2002-12-03
index eb10360..780af8e 100644
--- a/WebKit/ChangeLog-2002-12-03
+++ b/WebKit/ChangeLog-2002-12-03
@@ -1,3 +1,33 @@
+2002-12-03  Richard Williamson   <rjw at apple.com>
+
+        Fixed 3019986.  Use an array of font families instead of a single
+        font family to support CSS family lists.
+        r=hyatt
+        
+        * Misc.subproj/WebKitNSStringExtras.m:
+        (-[NSString _web_widthForString:font:]):
+        * Misc.subproj/WebStringTruncator.m:
+        (+[WebStringTruncator rightTruncateString:toWidth:withFont:]):
+        (+[WebStringTruncator centerTruncateString:toWidth:withFont:]):
+        * WebCoreSupport.subproj/WebTextRenderer.h:
+        * WebCoreSupport.subproj/WebTextRenderer.m:
+        (-[WebTextRenderer substituteFontForString:families:]):
+        (-[WebTextRenderer substituteFontForCharacters:length:families:]):
+        (-[WebTextRenderer widthForCharacters:length:]):
+        (-[WebTextRenderer drawCharacters:stringLength:fromCharacterPosition:toCharacterPosition:atPoint:withPadding:withTextColor:backgroundColor:rightToLeft:letterSpacing:wordSpacing:fontFamilies:]):
+        (-[WebTextRenderer floatWidthForCharacters:stringLength:characterPosition:]):
+        (-[WebTextRenderer floatWidthForCharacters:stringLength:fromCharacterPosition:numberOfCharacters:]):
+        (-[WebTextRenderer floatWidthForCharacters:stringLength:fromCharacterPosition:numberOfCharacters:withPadding:applyRounding:attemptFontSubstitution:widths:letterSpacing:wordSpacing:fontFamilies:]):
+        (-[WebTextRenderer _floatWidthForCharacters:stringLength:fromCharacterPosition:numberOfCharacters:withPadding:applyRounding:attemptFontSubstitution:widths:fonts:glyphs:numGlyphs:letterSpacing:wordSpacing:fontFamilies:]):
+        * WebCoreSupport.subproj/WebTextRendererFactory.h:
+        * WebCoreSupport.subproj/WebTextRendererFactory.m:
+        (-[WebTextRendererFactory fontWithFamilies:traits:size:]):
+        (-[WebTextRendererFactory fontWithFamily:traits:size:]):
+        (+[WebTextRendererFactory fallbackFontWithTraits:size:]):
+        (-[WebTextRendererFactory cachedFontFromFamily:traits:size:]):
+        (-[WebTextRendererFactory cachedFontFromFamilies:traits:size:]):
+        (-[WebTextRendererFactory rendererWithFamilies:traits:size:]):
+
 2002-12-03  Chris Blumenberg  <cblu at apple.com>
 
 	Fixed: 3115073 - REGRESSION: plants.com is crashing in WebIconDB with bad retain count
diff --git a/WebKit/Misc.subproj/WebKitNSStringExtras.m b/WebKit/Misc.subproj/WebKitNSStringExtras.m
index 551ed19..b00f91d 100644
--- a/WebKit/Misc.subproj/WebKitNSStringExtras.m
+++ b/WebKit/Misc.subproj/WebKitNSStringExtras.m
@@ -31,7 +31,8 @@
              backgroundColor:nil
                  rightToLeft:NO
                letterSpacing:0
-                 wordSpacing:0];
+                 wordSpacing:0
+                 fontFamilies:0];
     free(buffer);
 }
 
@@ -58,7 +59,8 @@
                 glyphs: 0
                 numGlyphs: 0
                 letterSpacing: 0
-                wordSpacing: 0];
+                wordSpacing: 0
+                fontFamilies: 0];
     free(buffer);
     
     return width;
diff --git a/WebKit/Misc.subproj/WebStringTruncator.m b/WebKit/Misc.subproj/WebStringTruncator.m
index 25a3537..91f54e4 100644
--- a/WebKit/Misc.subproj/WebStringTruncator.m
+++ b/WebKit/Misc.subproj/WebStringTruncator.m
@@ -70,18 +70,18 @@ static float currentEllipsisWidth;
     [string getCharacters:stringBuffer];
     renderer = [[WebTextRendererFactory sharedFactory] rendererWithFont:font];
     width = [renderer floatWidthForCharacters:stringBuffer
-                                 stringLength:truncatedLength fromCharacterPosition: 0 numberOfCharacters: truncatedLength withPadding: 0 applyRounding: NO attemptFontSubstitution: YES widths: 0 letterSpacing: 0 wordSpacing: 0];
+                                 stringLength:truncatedLength fromCharacterPosition: 0 numberOfCharacters: truncatedLength withPadding: 0 applyRounding: NO attemptFontSubstitution: YES widths: 0 letterSpacing: 0 wordSpacing: 0 fontFamilies: 0];
     if (width <= maxWidth)
         return string;
 
     ellipsis = ELLIPSIS_CHARACTER;
-    ellipsisWidth = [renderer floatWidthForCharacters:&ellipsis stringLength:1 fromCharacterPosition: 0 numberOfCharacters: 1 withPadding: 0 applyRounding: NO attemptFontSubstitution: YES widths: 0 letterSpacing: 0 wordSpacing: 0];
+    ellipsisWidth = [renderer floatWidthForCharacters:&ellipsis stringLength:1 fromCharacterPosition: 0 numberOfCharacters: 1 withPadding: 0 applyRounding: NO attemptFontSubstitution: YES widths: 0 letterSpacing: 0 wordSpacing: 0 fontFamilies: 0];
 
     maxWidth -= ellipsisWidth;
     while (width > maxWidth && truncatedLength){	
         truncatedLength--;
         width = [renderer floatWidthForCharacters:stringBuffer
-                                     stringLength:truncatedLength fromCharacterPosition: 0 numberOfCharacters: truncatedLength withPadding: 0 applyRounding: NO attemptFontSubstitution: YES widths: 0 letterSpacing: 0 wordSpacing: 0];
+                                     stringLength:truncatedLength fromCharacterPosition: 0 numberOfCharacters: truncatedLength withPadding: 0 applyRounding: NO attemptFontSubstitution: YES widths: 0 letterSpacing: 0 wordSpacing: 0 fontFamilies: 0];
     }
 
     stringBuffer[truncatedLength++] = ELLIPSIS_CHARACTER; 
@@ -111,7 +111,7 @@ static float currentEllipsisWidth;
         [WebTextRendererFactory createSharedFactory];
         currentRenderer = [[[WebTextRendererFactory sharedFactory] rendererWithFont:font] retain];
         ellipsis = ELLIPSIS_CHARACTER;
-        currentEllipsisWidth = [currentRenderer floatWidthForCharacters:&ellipsis stringLength:1 fromCharacterPosition: 0 numberOfCharacters: 1 withPadding: 0 applyRounding: NO attemptFontSubstitution: YES widths: 0 letterSpacing: 0 wordSpacing: 0];
+        currentEllipsisWidth = [currentRenderer floatWidthForCharacters:&ellipsis stringLength:1 fromCharacterPosition: 0 numberOfCharacters: 1 withPadding: 0 applyRounding: NO attemptFontSubstitution: YES widths: 0 letterSpacing: 0 wordSpacing: 0 fontFamilies: 0];
     }
     
     ASSERT(currentRenderer);
@@ -130,7 +130,7 @@ static float currentEllipsisWidth;
     }
 
     width = [currentRenderer floatWidthForCharacters:stringBuffer
-                                        stringLength:truncatedLength fromCharacterPosition: 0 numberOfCharacters: truncatedLength withPadding: 0 applyRounding: NO attemptFontSubstitution: YES widths: 0 letterSpacing: 0 wordSpacing: 0];
+                                        stringLength:truncatedLength fromCharacterPosition: 0 numberOfCharacters: truncatedLength withPadding: 0 applyRounding: NO attemptFontSubstitution: YES widths: 0 letterSpacing: 0 wordSpacing: 0 fontFamilies: 0];
     if (width <= maxWidth) {
         return string;
     }
@@ -170,7 +170,7 @@ static float currentEllipsisWidth;
                                            keepCount:keepCount
                                             toBuffer:stringBuffer];
 
-        width = [currentRenderer floatWidthForCharacters:stringBuffer stringLength:truncatedLength fromCharacterPosition: 0 numberOfCharacters: truncatedLength withPadding: 0 applyRounding: NO attemptFontSubstitution: YES widths: 0 letterSpacing: 0 wordSpacing: 0];
+        width = [currentRenderer floatWidthForCharacters:stringBuffer stringLength:truncatedLength fromCharacterPosition: 0 numberOfCharacters: truncatedLength withPadding: 0 applyRounding: NO attemptFontSubstitution: YES widths: 0 letterSpacing: 0 wordSpacing: 0 fontFamilies: 0];
         if (width <= maxWidth) {
             keepCountForLargestKnownToFit = keepCount;
             widthForLargestKnownToFit = width;
diff --git a/WebKit/WebCoreSupport.subproj/WebTextRenderer.h b/WebKit/WebCoreSupport.subproj/WebTextRenderer.h
index e0e8608..3c67433 100644
--- a/WebKit/WebCoreSupport.subproj/WebTextRenderer.h
+++ b/WebKit/WebCoreSupport.subproj/WebTextRenderer.h
@@ -31,6 +31,6 @@ typedef struct UnicodeGlyphMap UnicodeGlyphMap;
 
 - initWithFont:(NSFont *)font;
 
-- (float)_floatWidthForCharacters:(const UniChar *)characters stringLength:(unsigned)stringLength fromCharacterPosition: (int)pos numberOfCharacters: (int)len withPadding: (int)padding applyRounding: (BOOL)applyRounding attemptFontSubstitution: (BOOL)attemptSubstitution widths: (float *)widthBuffer fonts: (NSFont **)fontBuffer glyphs: (CGGlyph *)glyphBuffer numGlyphs: (int *)_numGlyphs letterSpacing: (int)ls wordSpacing: (int)ws;
+- (float)_floatWidthForCharacters:(const UniChar *)characters stringLength:(unsigned)stringLength fromCharacterPosition: (int)pos numberOfCharacters: (int)len withPadding: (int)padding applyRounding: (BOOL)applyRounding attemptFontSubstitution: (BOOL)attemptSubstitution widths: (float *)widthBuffer fonts: (NSFont **)fontBuffer glyphs: (CGGlyph *)glyphBuffer numGlyphs: (int *)_numGlyphs letterSpacing: (int)ls wordSpacing: (int)ws fontFamilies: (NSString **)families;
 
 @end
diff --git a/WebKit/WebCoreSupport.subproj/WebTextRenderer.m b/WebKit/WebCoreSupport.subproj/WebTextRenderer.m
index 38d95b6..c03287b 100644
--- a/WebKit/WebCoreSupport.subproj/WebTextRenderer.m
+++ b/WebKit/WebCoreSupport.subproj/WebTextRenderer.m
@@ -259,10 +259,32 @@ static BOOL bufferTextDrawing = NO;
 }
 
 
-- (NSFont *)substituteFontForString: (NSString *)string
+- (NSFont *)substituteFontForString: (NSString *)string families: (NSString **)families
 {
-    NSFont *substituteFont;
+    NSFont *substituteFont = nil;
 
+    // First search the CSS family fallback list.
+    NSString *family = nil;
+    int i = 0;
+    while (families && families[i] != 0 && substituteFont == nil){
+        family = families[i++];
+        substituteFont = [[WebTextRendererFactory sharedFactory] cachedFontFromFamily: family traits:[[NSFontManager sharedFontManager] traitsOfFont:font] size:[font pointSize]];
+        if (substituteFont){
+            NSCharacterSet *cs = [substituteFont coveredCharacterSet];
+            int pos = 0;
+            int length = [string length];
+            while (pos < length){
+                if (![cs characterIsMember: [string characterAtIndex: pos]]){
+                    substituteFont = nil;
+                    continue;
+                }
+            }
+        }
+    }
+    if (substituteFont)
+        return substituteFont;
+    
+    // Now do string based lookup
     substituteFont = [NSFont findFontLike:font forString:string withRange:NSMakeRange (0,[string length]) inLanguage:[NSLanguage defaultLanguage]];
 
     if ([substituteFont isEqual: font])
@@ -280,12 +302,12 @@ static BOOL bufferTextDrawing = NO;
 }
 
 
-- (NSFont *)substituteFontForCharacters: (const unichar *)characters length: (int)numCharacters
+- (NSFont *)substituteFontForCharacters: (const unichar *)characters length: (int)numCharacters families: (NSString **)families
 {
     NSFont *substituteFont;
     NSString *string = [[NSString alloc] initWithCharactersNoCopy:(unichar *)characters length: numCharacters freeWhenDone: NO];
 
-    substituteFont = [self substituteFontForString: string];
+    substituteFont = [self substituteFontForString: string families: families];
 
     [string release];
     
@@ -429,7 +451,7 @@ static BOOL bufferTextDrawing = NO;
 
 - (int)widthForCharacters:(const UniChar *)characters length:(unsigned)stringLength
 {
-    return ROUND_TO_INT([self floatWidthForCharacters:characters stringLength:stringLength fromCharacterPosition:0 numberOfCharacters:stringLength withPadding: 0 applyRounding:YES attemptFontSubstitution: YES widths: 0 letterSpacing: 0 wordSpacing: 0]);
+    return ROUND_TO_INT([self floatWidthForCharacters:characters stringLength:stringLength fromCharacterPosition:0 numberOfCharacters:stringLength withPadding: 0 applyRounding:YES attemptFontSubstitution: YES widths: 0 letterSpacing: 0 wordSpacing: 0 fontFamilies: 0]);
 }
 
 - (int)widthForString:(NSString *)string
@@ -513,7 +535,7 @@ static void _drawGlyphs(NSFont *font, NSColor *color, CGGlyph *glyphs, CGSize *a
     }
 }
 
-- (void)drawCharacters:(const UniChar *)characters stringLength: (unsigned int)length fromCharacterPosition: (int)from toCharacterPosition: (int)to atPoint:(NSPoint)point withPadding: (int)padding withTextColor:(NSColor *)textColor backgroundColor: (NSColor *)backgroundColor rightToLeft: (BOOL)rtl letterSpacing: (int)letterSpacing wordSpacing: (int)wordSpacing
+- (void)drawCharacters:(const UniChar *)characters stringLength: (unsigned int)length fromCharacterPosition: (int)from toCharacterPosition: (int)to atPoint:(NSPoint)point withPadding: (int)padding withTextColor:(NSColor *)textColor backgroundColor: (NSColor *)backgroundColor rightToLeft: (BOOL)rtl letterSpacing: (int)letterSpacing wordSpacing: (int)wordSpacing fontFamilies: (NSString **)families
 {
     float *widthBuffer, localWidthBuffer[LOCAL_BUFFER_SIZE];
     CGGlyph *glyphBuffer, localGlyphBuffer[LOCAL_BUFFER_SIZE];
@@ -552,7 +574,8 @@ static void _drawGlyphs(NSFont *font, NSColor *color, CGGlyph *glyphs, CGSize *a
         glyphs: glyphBuffer
         numGlyphs: &numGlyphs
         letterSpacing: letterSpacing
-        wordSpacing: wordSpacing];
+        wordSpacing: wordSpacing
+        fontFamilies: families];
 
     if (from == -1)
         from = 0;
@@ -677,19 +700,19 @@ static void _drawGlyphs(NSFont *font, NSColor *color, CGGlyph *glyphs, CGSize *a
     // Return the width of the first complete character at the specified position.  Even though
     // the first 'character' may contain more than one unicode characters this method will
     // work correctly.
-    return [self floatWidthForCharacters:characters stringLength:stringLength fromCharacterPosition:pos numberOfCharacters:1 withPadding: 0 applyRounding: YES attemptFontSubstitution: YES widths: nil letterSpacing: 0 wordSpacing: 0];
+    return [self floatWidthForCharacters:characters stringLength:stringLength fromCharacterPosition:pos numberOfCharacters:1 withPadding: 0 applyRounding: YES attemptFontSubstitution: YES widths: nil letterSpacing: 0 wordSpacing: 0 fontFamilies: 0];
 }
 
 
 - (float)floatWidthForCharacters:(const UniChar *)characters stringLength:(unsigned)stringLength fromCharacterPosition: (int)pos numberOfCharacters: (int)len
 {
-    return [self floatWidthForCharacters:characters stringLength:stringLength fromCharacterPosition:pos numberOfCharacters:len withPadding: 0 applyRounding: YES attemptFontSubstitution: YES widths: nil letterSpacing: 0 wordSpacing: 0];
+    return [self floatWidthForCharacters:characters stringLength:stringLength fromCharacterPosition:pos numberOfCharacters:len withPadding: 0 applyRounding: YES attemptFontSubstitution: YES widths: nil letterSpacing: 0 wordSpacing: 0 fontFamilies: 0];
 }
 
 
-- (float)floatWidthForCharacters:(const UniChar *)characters stringLength:(unsigned)stringLength fromCharacterPosition: (int)pos numberOfCharacters: (int)len withPadding: (int)padding applyRounding: (BOOL)applyRounding attemptFontSubstitution: (BOOL)attemptSubstitution widths: (float *)widthBuffer letterSpacing: (int)letterSpacing wordSpacing: (int)wordSpacing
+- (float)floatWidthForCharacters:(const UniChar *)characters stringLength:(unsigned)stringLength fromCharacterPosition: (int)pos numberOfCharacters: (int)len withPadding: (int)padding applyRounding: (BOOL)applyRounding attemptFontSubstitution: (BOOL)attemptSubstitution widths: (float *)widthBuffer letterSpacing: (int)letterSpacing wordSpacing: (int)wordSpacing fontFamilies: (NSString **)families
 {
-    return [self _floatWidthForCharacters:characters stringLength:stringLength fromCharacterPosition:pos numberOfCharacters:len withPadding: 0 applyRounding: YES attemptFontSubstitution: YES widths: widthBuffer fonts: nil  glyphs: nil numGlyphs: nil letterSpacing: letterSpacing wordSpacing: wordSpacing];
+    return [self _floatWidthForCharacters:characters stringLength:stringLength fromCharacterPosition:pos numberOfCharacters:len withPadding: 0 applyRounding: YES attemptFontSubstitution: YES widths: widthBuffer fonts: nil  glyphs: nil numGlyphs: nil letterSpacing: letterSpacing wordSpacing: wordSpacing fontFamilies: families];
 }
 
 #ifdef DEBUG_COMBINING
@@ -728,7 +751,7 @@ static const char *joiningNames[] = {
 };
 #endif
 
-- (float)_floatWidthForCharacters:(const UniChar *)characters stringLength:(unsigned)stringLength fromCharacterPosition: (int)pos numberOfCharacters: (int)len withPadding: (int)padding applyRounding: (BOOL)applyRounding attemptFontSubstitution: (BOOL)attemptSubstitution widths: (float *)widthBuffer fonts: (NSFont **)fontBuffer glyphs: (CGGlyph *)glyphBuffer numGlyphs: (int *)_numGlyphs letterSpacing: (int)letterSpacing wordSpacing: (int)wordSpacing
+- (float)_floatWidthForCharacters:(const UniChar *)characters stringLength:(unsigned)stringLength fromCharacterPosition: (int)pos numberOfCharacters: (int)len withPadding: (int)padding applyRounding: (BOOL)applyRounding attemptFontSubstitution: (BOOL)attemptSubstitution widths: (float *)widthBuffer fonts: (NSFont **)fontBuffer glyphs: (CGGlyph *)glyphBuffer numGlyphs: (int *)_numGlyphs letterSpacing: (int)letterSpacing wordSpacing: (int)wordSpacing fontFamilies: (NSString **)families
 {
     float totalWidth = 0;
     unsigned int i, clusterLength;
@@ -860,7 +883,7 @@ static const char *joiningNames[] = {
                 clusterLength = findLengthOfCharacterCluster (&characters[i], stringLength - i);
                 _characters = &characters[i];
             }
-            substituteFont = [self substituteFontForCharacters: _characters length: clusterLength];
+            substituteFont = [self substituteFontForCharacters: _characters length: clusterLength families: families];
             if (substituteFont) {
                 int cNumGlyphs;
                 lastWidth = [[[WebTextRendererFactory sharedFactory] rendererWithFont: substituteFont] 
@@ -873,7 +896,8 @@ static const char *joiningNames[] = {
                                 glyphs: ((glyphBuffer != 0 ) ? (&glyphBuffer[numGlyphs]) : nil)
                                 numGlyphs: &cNumGlyphs
                                 letterSpacing: letterSpacing
-                                wordSpacing: wordSpacing];
+                                wordSpacing: wordSpacing
+                                fontFamilies: families];
                 if (fontBuffer){
                     int j;
                     for (j = 0; j < cNumGlyphs; j++)
diff --git a/WebKit/WebCoreSupport.subproj/WebTextRendererFactory.h b/WebKit/WebCoreSupport.subproj/WebTextRendererFactory.h
index 3eeda28..b98dee0 100644
--- a/WebKit/WebCoreSupport.subproj/WebTextRendererFactory.h
+++ b/WebKit/WebCoreSupport.subproj/WebTextRendererFactory.h
@@ -18,6 +18,8 @@
 
 + (void)createSharedFactory;
 + (WebTextRendererFactory *)sharedFactory;
+- (NSFont *)cachedFontFromFamily:(NSString *)family traits:(NSFontTraitMask)traits size:(float)size;
+- (NSFont *)cachedFontFromFamilies:(NSString **)families traits:(NSFontTraitMask)traits size:(float)size;
 - init;
 
 - (WebTextRenderer *)rendererWithFont:(NSFont *)font;
diff --git a/WebKit/WebCoreSupport.subproj/WebTextRendererFactory.m b/WebKit/WebCoreSupport.subproj/WebTextRendererFactory.m
index 86785cf..9de1a66 100644
--- a/WebKit/WebCoreSupport.subproj/WebTextRendererFactory.m
+++ b/WebKit/WebCoreSupport.subproj/WebTextRendererFactory.m
@@ -186,6 +186,11 @@
     return renderer;
 }
 
+- (NSFont *)fontWithFamilies:(NSString **)families traits:(NSFontTraitMask)traits size:(float)size
+{
+    return [self cachedFontFromFamilies: families traits: traits size: size];
+}
+
 - (NSFont *)fontWithFamily:(NSString *)family traits:(NSFontTraitMask)traits size:(float)size
 {
     NSFont *font;
@@ -239,14 +244,38 @@
         }
     }
     
+    return nil;
+}
+
++ (NSFont *)fallbackFontWithTraits:(NSFontTraitMask)traits size:(float)size 
+{
     return [[NSFontManager sharedFontManager] fontWithFamily:@"Helvetica" traits:traits weight:5 size:size];
 }
 
-- (NSFont *)cachedFontWithFamily:(NSString *)family traits:(NSFontTraitMask)traits size:(float)size
+- (NSFont *)cachedFontFromFamily:(NSString *)family traits:(NSFontTraitMask)traits size:(float)size
 {
     static NSMutableDictionary *fontCache = nil;
-    NSString *fontKey;
-    NSFont *font;
+    NSString *fontKey = [[WebFontCacheKey alloc] initWithFamily:family traits:traits size:size];
+    NSFont *font = nil;
+    
+    if (!fontCache) {
+        fontCache = [[NSMutableDictionary alloc] init];
+    }
+
+    font = [fontCache objectForKey:fontKey];
+    if (!font){
+        font = [self fontWithFamily:family traits:traits size:size];
+        if (font)
+            [fontCache setObject:font forKey:fontKey];
+    }
+    
+    return font;
+}
+
+
+- (NSFont *)cachedFontFromFamilies:(NSString **)families traits:(NSFontTraitMask)traits size:(float)size
+{
+    NSFont *font = nil;
     
 #ifdef DEBUG_GETFONT
     static int getFontCount = 0;
@@ -254,24 +283,22 @@
     printf("getFountCount = %d, family = %s, traits = 0x%08x, size = %f\n", getFontCount, [_family lossyCString], _trait, _size);
 #endif
 
-    if (!fontCache) {
-        fontCache = [[NSMutableDictionary alloc] init];
-    }
+    NSString *family;
+    int i = 0;
     
-    fontKey = [[WebFontCacheKey alloc] initWithFamily:family traits:traits size:size];
-    font = [fontCache objectForKey:fontKey];
-    if (font == nil) {
-        font = [self fontWithFamily:family traits:traits size:size];
-        [fontCache setObject:font forKey:fontKey];
+    while (families && families[i] != 0 && font == nil){
+        family = families[i++];
+        font = [self cachedFontFromFamily: family traits:traits size:size];
     }
-    [fontKey release];
-    
+    if (font == nil)
+        font = [WebTextRendererFactory fallbackFontWithTraits:traits size:size];
+
     return font;
 }
 
-- (id <WebCoreTextRenderer>)rendererWithFamily:(NSString *)family traits:(NSFontTraitMask)traits size:(float)size
+- (id <WebCoreTextRenderer>)rendererWithFamilies:(NSString **)families traits:(NSFontTraitMask)traits size:(float)size
 {
-    return [self rendererWithFont:[self cachedFontWithFamily:family traits:traits size:size]];
+    return [self rendererWithFont:[self cachedFontFromFamilies:families traits:traits size:size]];
 }
 
 @end

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list