WebCore:
authormitz@apple.com <mitz@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 4 Mar 2008 16:03:02 +0000 (16:03 +0000)
committermitz@apple.com <mitz@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 4 Mar 2008 16:03:02 +0000 (16:03 +0000)
        Reviewed by Sam Weinig.

        - fix <rdar://problem/5622336> Burmese text does not render on http://www.myanmarbible.com/bible/Judson/html/index.html

        Test: platform/win/fast/text/uniscribe-missing-glyph.html

        Note that default installations of Windows do not have Myanmar fonts.
        What this patch does is ensure that the Myanmar and other complex
        scripts are rendered as missing glyphs rather than not rendered at all.
        The particular page in the bug measures the relative widths of two
        rendered strings and, if they are rendered as missing glyphs, detects
        that a Myanmar fonts is not available and substitutes the text with
        images. By not rendering (and measuring) missing glyphs, WebKit was
        throwing the page's detection code off.

        * platform/graphics/win/UniscribeController.cpp:
        (WebCore::UniscribeController::shape): Removed an early return in case
        shaping resulted in missing glyphs. This is now expected if font
        fallback failed to produce a font containing glyphs for the character.
        Also changed two resize()s to shrink()s.

LayoutTests:

        - test for <rdar://problem/5622336> Burmese text does not render on http://www.myanmarbible.com/bible/Judson/html/index.html

        * platform/win/fast/text/uniscribe-missing-glyph-expected.txt: Added.
        * platform/win/fast/text/uniscribe-missing-glyph.html: Added.

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

LayoutTests/ChangeLog
LayoutTests/platform/win/fast/text/uniscribe-missing-glyph-expected.txt [new file with mode: 0644]
LayoutTests/platform/win/fast/text/uniscribe-missing-glyph.html [new file with mode: 0644]
WebCore/ChangeLog
WebCore/platform/graphics/win/UniscribeController.cpp

index 0aa3131..ad8a2c1 100644 (file)
@@ -1,3 +1,10 @@
+2008-03-04  Dan Bernstein  <mitz@apple.com>
+
+        - test for <rdar://problem/5622336> Burmese text does not render on http://www.myanmarbible.com/bible/Judson/html/index.html
+
+        * platform/win/fast/text/uniscribe-missing-glyph-expected.txt: Added.
+        * platform/win/fast/text/uniscribe-missing-glyph.html: Added.
+
 2008-03-04  Alexey Proskuryakov  <ap@webkit.org>
 
         Suggested by Darin, rubber-stamped by Mark.
diff --git a/LayoutTests/platform/win/fast/text/uniscribe-missing-glyph-expected.txt b/LayoutTests/platform/win/fast/text/uniscribe-missing-glyph-expected.txt
new file mode 100644 (file)
index 0000000..bdbc7d5
--- /dev/null
@@ -0,0 +1,21 @@
+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 {P} at (0,0) size 784x18
+        RenderText {#text} at (0,0) size 762x18
+          text run at (0,0) width 762: "This tests that the Uniscribe code path renders missing glyphs as squares. It assumes that a Myanmar font is not available."
+      RenderBlock (anonymous) at (0,34) size 784x72
+        RenderText {#text} at (0,0) size 22x18
+          text run at (0,0) width 22: "(\x{1000})"
+        RenderBR {BR} at (22,14) size 0x0
+        RenderText {#text} at (0,18) size 34x18
+          text run at (0,18) width 34: "(\x{1000}\x{1000})"
+        RenderBR {BR} at (34,32) size 0x0
+        RenderText {#text} at (0,36) size 46x18
+          text run at (0,36) width 46: "(\x{1000}\x{1000}\x{1000})"
+        RenderBR {BR} at (46,50) size 0x0
+        RenderText {#text} at (0,54) size 58x18
+          text run at (0,54) width 58: "(\x{1000}\x{1000}\x{1000}\x{1000})"
+        RenderBR {BR} at (58,68) size 0x0
diff --git a/LayoutTests/platform/win/fast/text/uniscribe-missing-glyph.html b/LayoutTests/platform/win/fast/text/uniscribe-missing-glyph.html
new file mode 100644 (file)
index 0000000..1f374c6
--- /dev/null
@@ -0,0 +1,7 @@
+<p>
+    This tests that the Uniscribe code path renders missing glyphs as squares. It assumes that a Myanmar font is not available.
+</p>
+(&#x1000;)<br>
+(&#x1000;&#x1000;)<br>
+(&#x1000;&#x1000;&#x1000;)<br>
+(&#x1000;&#x1000;&#x1000;&#x1000;)<br>
index d4f7c73..563b361 100644 (file)
@@ -1,3 +1,26 @@
+2008-03-04  Dan Bernstein  <mitz@apple.com>
+
+        Reviewed by Sam Weinig.
+
+        - fix <rdar://problem/5622336> Burmese text does not render on http://www.myanmarbible.com/bible/Judson/html/index.html
+
+        Test: platform/win/fast/text/uniscribe-missing-glyph.html
+
+        Note that default installations of Windows do not have Myanmar fonts.
+        What this patch does is ensure that the Myanmar and other complex
+        scripts are rendered as missing glyphs rather than not rendered at all.
+        The particular page in the bug measures the relative widths of two
+        rendered strings and, if they are rendered as missing glyphs, detects
+        that a Myanmar fonts is not available and substitutes the text with
+        images. By not rendering (and measuring) missing glyphs, WebKit was
+        throwing the page's detection code off.
+
+        * platform/graphics/win/UniscribeController.cpp:
+        (WebCore::UniscribeController::shape): Removed an early return in case
+        shaping resulted in missing glyphs. This is now expected if font
+        fallback failed to produce a font containing glyphs for the character.
+        Also changed two resize()s to shrink()s.
+
 2008-03-04  Darin Adler  <darin@apple.com>
 
         Reviewed by Adam.
index 876ff43..8496369 100644 (file)
@@ -422,25 +422,9 @@ bool UniscribeController::shape(const UChar* str, int len, SCRIPT_ITEM item, con
 
     if (FAILED(shapeResult))
         return false;
-    
-    // FIXME: We need to do better than this.  Falling back on the entire item is not good enough.
-    // We may still have missing glyphs even if we succeeded.  We need to treat missing glyphs as
-    // a failure so that we will fall back to another font.
-    bool containsMissingGlyphs = false;
-    SCRIPT_FONTPROPERTIES* fontProperties = fontData->scriptFontProperties();
-    for (int i = 0; i < glyphCount; i++) {
-        WORD glyph = glyphs[i];
-        if (glyph == fontProperties->wgDefault) {
-            containsMissingGlyphs = true;
-            break;
-        }
-    }
-
-    if (containsMissingGlyphs)
-        return false;
 
-    glyphs.resize(glyphCount);
-    visualAttributes.resize(glyphCount);
+    glyphs.shrink(glyphCount);
+    visualAttributes.shrink(glyphCount);
 
     return true;
 }