Title: [88114] releases/WebKitGTK/webkit-1.4

Diff

Modified: releases/WebKitGTK/webkit-1.4/LayoutTests/ChangeLog (88113 => 88114)


--- releases/WebKitGTK/webkit-1.4/LayoutTests/ChangeLog	2011-06-04 12:56:33 UTC (rev 88113)
+++ releases/WebKitGTK/webkit-1.4/LayoutTests/ChangeLog	2011-06-04 16:15:16 UTC (rev 88114)
@@ -1,3 +1,17 @@
+2011-06-03  Martin Robinson  <[email protected]>
+
+        Reviewed by Dirk Schulze.
+
+        [GTK][Cairo] Twitter rendering breaks
+        https://bugs.webkit.org/show_bug.cgi?id=60917
+
+        Added a GTK+ specific test that verifies that zero pixel sized
+        fonts do not corrupt the Cairo context.
+
+        * platform/gtk/fonts/zero-pixel-sized-fonts-expected.png: Added.
+        * platform/gtk/fonts/zero-pixel-sized-fonts-expected.txt: Added.
+        * platform/gtk/fonts/zero-pixel-sized-fonts.html: Added.
+
 2011-04-28  Arno Renevier  <[email protected]>
 
         Reviewed by Gustavo Noronha Silva.

Added: releases/WebKitGTK/webkit-1.4/LayoutTests/platform/gtk/fonts/zero-pixel-sized-fonts-expected.png


(Binary files differ)
Property changes on: releases/WebKitGTK/webkit-1.4/LayoutTests/platform/gtk/fonts/zero-pixel-sized-fonts-expected.png ___________________________________________________________________

Added: svn:mime-type

Added: releases/WebKitGTK/webkit-1.4/LayoutTests/platform/gtk/fonts/zero-pixel-sized-fonts-expected.txt (0 => 88114)


--- releases/WebKitGTK/webkit-1.4/LayoutTests/platform/gtk/fonts/zero-pixel-sized-fonts-expected.txt	                        (rev 0)
+++ releases/WebKitGTK/webkit-1.4/LayoutTests/platform/gtk/fonts/zero-pixel-sized-fonts-expected.txt	2011-06-04 16:15:16 UTC (rev 88114)
@@ -0,0 +1,36 @@
+layer at (0,0) size 800x600
+  RenderView at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderBlock {HTML} at (0,0) size 800x600
+    RenderBody {BODY} at (8,8) size 784x584
+      RenderBlock {DIV} at (0,0) size 784x38
+        RenderText {#text} at (0,0) size 582x19
+          text run at (0,0) width 428: "This test verifies that divs containing zero pixel fonts do not corrupt "
+          text run at (428,0) width 154: "the page rendering (bug "
+        RenderInline {A} at (0,0) size 40x19 [color=#0000EE]
+          RenderText {#text} at (582,0) size 40x19
+            text run at (582,0) width 40: "60917"
+        RenderText {#text} at (622,0) size 742x38
+          text run at (622,0) width 13: "). "
+          text run at (635,0) width 107: "There line below"
+          text run at (0,19) width 254: "should read \"GoldilocksBearBearBear\"."
+      RenderBlock {DIV} at (0,38) size 784x19
+        RenderBlock {DIV} at (0,0) size 69x19
+          RenderText {#text} at (0,0) size 69x19
+            text run at (0,0) width 69: "Goldilocks"
+        RenderText {#text} at (69,15) size 0x0
+          text run at (69,15) width 0: " "
+        RenderBlock {DIV} at (69,0) size 30x19
+          RenderText {#text} at (0,0) size 30x19
+            text run at (0,0) width 30: "Bear"
+        RenderText {#text} at (99,15) size 0x0
+          text run at (99,15) width 0: " "
+        RenderBlock {DIV} at (99,0) size 30x19
+          RenderText {#text} at (0,0) size 30x19
+            text run at (0,0) width 30: "Bear"
+        RenderText {#text} at (129,15) size 0x0
+          text run at (129,15) width 0: " "
+        RenderBlock {DIV} at (129,0) size 30x19
+          RenderText {#text} at (0,0) size 30x19
+            text run at (0,0) width 30: "Bear"
+        RenderText {#text} at (0,0) size 0x0

Added: releases/WebKitGTK/webkit-1.4/LayoutTests/platform/gtk/fonts/zero-pixel-sized-fonts.html (0 => 88114)


--- releases/WebKitGTK/webkit-1.4/LayoutTests/platform/gtk/fonts/zero-pixel-sized-fonts.html	                        (rev 0)
+++ releases/WebKitGTK/webkit-1.4/LayoutTests/platform/gtk/fonts/zero-pixel-sized-fonts.html	2011-06-04 16:15:16 UTC (rev 88114)
@@ -0,0 +1,31 @@
+<html>
+
+<head>
+<style>
+    .buttons {
+        font-size: 0px;
+    }
+    .button {
+        display: inline-block;
+        float: none;
+        font-size: 16px;
+    }
+</style>
+</head>
+
+<body>
+    <div>
+        This test verifies that divs containing zero pixel fonts do not corrupt
+        the page rendering (bug <a href=""
+        There line below should read "GoldilocksBearBearBear".
+    </div>
+
+    <div class="buttons">
+        <div class="button">Goldilocks </div>
+        <div class="button">Bear </div>
+        <div class="button">Bear </div>
+        <div class="button">Bear </div>
+  </div>
+</body>
+
+</html>

Modified: releases/WebKitGTK/webkit-1.4/Source/WebCore/ChangeLog (88113 => 88114)


--- releases/WebKitGTK/webkit-1.4/Source/WebCore/ChangeLog	2011-06-04 12:56:33 UTC (rev 88113)
+++ releases/WebKitGTK/webkit-1.4/Source/WebCore/ChangeLog	2011-06-04 16:15:16 UTC (rev 88114)
@@ -1,3 +1,40 @@
+2011-06-03  Martin Robinson  <[email protected]>
+
+        Reviewed by Dirk Schulze.
+
+        [GTK][Cairo] Twitter rendering breaks
+        https://bugs.webkit.org/show_bug.cgi?id=60917
+
+        When instantiating a cairo_scaled_font_t font would pus the font in an error state,
+        leave the m_scaledFont member of platform data as null. Rendering with scaled fonts
+        in the error state can later lead to corrupted rendering.
+
+        Due to this change, we must always null check cairo_scaled_font_t and the platform
+        data now carries the cairo_font_face_t object with it, so that it can be accessed later
+        if there is no cairo_scaled_font_t.
+
+        Test: platform/gtk/fonts/zero-pixel-sized-fonts.html
+
+        * platform/graphics/cairo/FontCairo.cpp:
+        (WebCore::Font::drawGlyphs): If the scaled font is null, do not render.
+        * platform/graphics/freetype/FontPlatformData.h: Now include the cairo_font_face_t.
+        * platform/graphics/freetype/FontPlatformDataFreeType.cpp:
+        (WebCore::FontPlatformData::FontPlatformData): Initialize the new member.
+        (WebCore::FontPlatformData::operator=): Carry over the new member.
+        (WebCore::FontPlatformData::operator==): Check equality with the new member.
+        (WebCore::FontPlatformData::initializeWithFontFace): If the initialization of m_scaledFont
+        put the font into an error state, then just free it and return.
+        (WebCore::FontPlatformData::hasCompatibleCharmap): The font always has a compatible charmap
+        when the scaled font is null, because rendering is always a no-op and the font data never
+        needs to be read.
+        * platform/graphics/freetype/GlyphPageTreeNodeFreeType.cpp:
+        (WebCore::GlyphPage::fill): Don't read font data when the scaled font is null.
+        * platform/graphics/freetype/SimpleFontDataFreeType.cpp:
+        (WebCore::SimpleFontData::platformInit): Return early when there's no scaled font.
+        (WebCore::SimpleFontData::scaledFontData): Use the new m_font member.
+        (WebCore::SimpleFontData::containsCharacters): Return early when there's no scaled font.
+        (WebCore::SimpleFontData::platformWidthForGlyph): Ditto.
+
 2011-04-28  Arno Renevier  <[email protected]>
 
         Reviewed by Gustavo Noronha Silva.

Modified: releases/WebKitGTK/webkit-1.4/Source/WebCore/platform/graphics/cairo/FontCairo.cpp (88113 => 88114)


--- releases/WebKitGTK/webkit-1.4/Source/WebCore/platform/graphics/cairo/FontCairo.cpp	2011-06-04 12:56:33 UTC (rev 88113)
+++ releases/WebKitGTK/webkit-1.4/Source/WebCore/platform/graphics/cairo/FontCairo.cpp	2011-06-04 16:15:16 UTC (rev 88114)
@@ -97,8 +97,11 @@
 void Font::drawGlyphs(GraphicsContext* context, const SimpleFontData* font, const GlyphBuffer& glyphBuffer,
                       int from, int numGlyphs, const FloatPoint& point) const
 {
-    GlyphBufferGlyph* glyphs = (GlyphBufferGlyph*)glyphBuffer.glyphs(from);
+    if (!font->platformData().scaledFont())
+        return;
 
+    GlyphBufferGlyph* glyphs = const_cast<GlyphBufferGlyph*>(glyphBuffer.glyphs(from));
+
     float offset = 0.0f;
     for (int i = 0; i < numGlyphs; i++) {
         glyphs[i].x = offset;

Modified: releases/WebKitGTK/webkit-1.4/Source/WebCore/platform/graphics/freetype/FontPlatformData.h (88113 => 88114)


--- releases/WebKitGTK/webkit-1.4/Source/WebCore/platform/graphics/freetype/FontPlatformData.h	2011-06-04 12:56:33 UTC (rev 88113)
+++ releases/WebKitGTK/webkit-1.4/Source/WebCore/platform/graphics/freetype/FontPlatformData.h	2011-06-04 16:15:16 UTC (rev 88114)
@@ -97,6 +97,7 @@
     bool m_syntheticBold;
     bool m_syntheticOblique;
     bool m_fixedWidth;
+    RefPtr<cairo_font_face_t> m_font;
     cairo_scaled_font_t* m_scaledFont;
 
 private:

Modified: releases/WebKitGTK/webkit-1.4/Source/WebCore/platform/graphics/freetype/FontPlatformDataFreeType.cpp (88113 => 88114)


--- releases/WebKitGTK/webkit-1.4/Source/WebCore/platform/graphics/freetype/FontPlatformDataFreeType.cpp	2011-06-04 12:56:33 UTC (rev 88113)
+++ releases/WebKitGTK/webkit-1.4/Source/WebCore/platform/graphics/freetype/FontPlatformDataFreeType.cpp	2011-06-04 16:15:16 UTC (rev 88114)
@@ -121,8 +121,8 @@
     , m_fixedWidth(false)
     , m_scaledFont(0)
 {
-    RefPtr<cairo_font_face_t> fontFace = adoptRef(cairo_ft_font_face_create_for_pattern(m_pattern.get()));
-    initializeWithFontFace(fontFace.get());
+    m_font = adoptRef(cairo_ft_font_face_create_for_pattern(m_pattern.get()));
+    initializeWithFontFace(m_font.get());
 
     int spacing;
     if (FcPatternGetInteger(pattern, FC_SPACING, 0, &spacing) == FcResultMatch && spacing == FC_MONO)
@@ -152,6 +152,7 @@
     , m_size(size)
     , m_syntheticBold(bold)
     , m_syntheticOblique(italic)
+    , m_font(fontFace)
     , m_scaledFont(0)
 {
     initializeWithFontFace(fontFace);
@@ -184,6 +185,7 @@
     if (m_scaledFont && m_scaledFont != hashTableDeletedFontValue())
         cairo_scaled_font_destroy(m_scaledFont);
     m_scaledFont = cairo_scaled_font_reference(other.m_scaledFont);
+    m_font = other.m_font;
 
     return *this;
 }
@@ -228,7 +230,7 @@
     if (!m_pattern || !other.m_pattern)
         return false;
     return FcPatternEqual(m_pattern.get(), other.m_pattern.get())
-        && m_scaledFont == other.m_scaledFont && m_size == other.m_size
+        && m_scaledFont == other.m_scaledFont && m_font == other.m_font && m_size == other.m_size
         && m_syntheticOblique == other.m_syntheticOblique && m_syntheticBold == other.m_syntheticBold; 
 }
 
@@ -241,6 +243,12 @@
 
 void FontPlatformData::initializeWithFontFace(cairo_font_face_t* fontFace)
 {
+    // Fonts with zero size lead to failed cairo_scaled_font_t instantiations. Instead
+    // we just do not instantiate the scaled font at all. This will cause all renders
+    // to be no-ops and all metrics to be zero, which is the desired behavior anyway.
+    if (!m_size)
+        return;
+
     cairo_font_options_t* options = getDefaultFontOptions();
 
     cairo_matrix_t ctm;
@@ -273,8 +281,10 @@
 
 bool FontPlatformData::hasCompatibleCharmap()
 {
+    // If m_scaledFont is null, it means that this is a size zero font, which always
+    // has a compatible charmap since we never really read any font data from the font.
     if (!m_scaledFont)
-        return false;
+        return true;
 
     FT_Face freeTypeFace = cairo_ft_scaled_font_lock_face(m_scaledFont);
     bool hasCompatibleCharmap = !(FT_Select_Charmap(freeTypeFace, ft_encoding_unicode)

Modified: releases/WebKitGTK/webkit-1.4/Source/WebCore/platform/graphics/freetype/GlyphPageTreeNodeFreeType.cpp (88113 => 88114)


--- releases/WebKitGTK/webkit-1.4/Source/WebCore/platform/graphics/freetype/GlyphPageTreeNodeFreeType.cpp	2011-06-04 12:56:33 UTC (rev 88113)
+++ releases/WebKitGTK/webkit-1.4/Source/WebCore/platform/graphics/freetype/GlyphPageTreeNodeFreeType.cpp	2011-06-04 16:15:16 UTC (rev 88114)
@@ -45,7 +45,11 @@
     if (bufferLength > GlyphPage::size)
         return false;
 
-    FT_Face face = cairo_ft_scaled_font_lock_face(fontData->platformData().scaledFont());
+    cairo_scaled_font_t* scaledFont = fontData->platformData().scaledFont();
+    if (!scaledFont)
+        return false;
+
+    FT_Face face = cairo_ft_scaled_font_lock_face(scaledFont);
     if (!face)
         return false;
 
@@ -60,8 +64,7 @@
         }
     }
 
-    cairo_ft_scaled_font_unlock_face(fontData->platformData().scaledFont());
-
+    cairo_ft_scaled_font_unlock_face(scaledFont);
     return haveGlyphs;
 }
 

Modified: releases/WebKitGTK/webkit-1.4/Source/WebCore/platform/graphics/freetype/SimpleFontDataFreeType.cpp (88113 => 88114)


--- releases/WebKitGTK/webkit-1.4/Source/WebCore/platform/graphics/freetype/SimpleFontDataFreeType.cpp	2011-06-04 12:56:33 UTC (rev 88113)
+++ releases/WebKitGTK/webkit-1.4/Source/WebCore/platform/graphics/freetype/SimpleFontDataFreeType.cpp	2011-06-04 16:15:16 UTC (rev 88114)
@@ -47,6 +47,9 @@
 
 void SimpleFontData::platformInit()
 {
+    if (!m_platformData.scaledFont())
+        return;
+
     cairo_font_extents_t font_extents;
     cairo_text_extents_t text_extents;
     cairo_scaled_font_extents(m_platformData.scaledFont(), &font_extents);
@@ -88,9 +91,11 @@
 
 SimpleFontData* SimpleFontData::scaledFontData(const FontDescription& fontDescription, float scaleFactor) const
 {
-    return new SimpleFontData(FontPlatformData(cairo_scaled_font_get_font_face(m_platformData.scaledFont()),
-        scaleFactor * fontDescription.computedSize(), m_platformData.syntheticBold(), m_platformData.syntheticOblique()),
-        isCustomFont(), false);
+    return new SimpleFontData(FontPlatformData(m_platformData.m_font.get(),
+                                               scaleFactor * fontDescription.computedSize(),
+                                               m_platformData.syntheticBold(),
+                                               m_platformData.syntheticOblique()),
+                              isCustomFont(), false);
 }
 
 SimpleFontData* SimpleFontData::smallCapsFontData(const FontDescription& fontDescription) const
@@ -116,8 +121,12 @@
 
 bool SimpleFontData::containsCharacters(const UChar* characters, int length) const
 {
+    // If this is a no-op font (zero size), then it should always contain the characters,
+    // since we never read from or render from this font.
+    if (!m_platformData.scaledFont())
+        return true;
+
     FT_Face face = cairo_ft_scaled_font_lock_face(m_platformData.scaledFont());
-
     if (!face)
         return false;
 
@@ -129,7 +138,6 @@
     }
 
     cairo_ft_scaled_font_unlock_face(m_platformData.scaledFont());
-
     return true;
 }
 
@@ -145,7 +153,8 @@
 
 float SimpleFontData::platformWidthForGlyph(Glyph glyph) const
 {
-    ASSERT(m_platformData.scaledFont());
+    if (!m_platformData.scaledFont())
+        return 0;
 
     cairo_glyph_t cglyph = { glyph, 0, 0 };
     cairo_text_extents_t extents;
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to