[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