Title: [134172] branches/chromium/1312
Revision
134172
Author
[email protected]
Date
2012-11-11 05:12:54 -0800 (Sun, 11 Nov 2012)

Log Message

Merge 133983 - [Chromium] Arabic digits should appear left-to-right
https://bugs.webkit.org/show_bug.cgi?id=101440

Reviewed by Tony Chang.

Source/WebCore:

Call hb_buffer_set_direction() to set direction when drawing glyphs or
direction should be overridden. Leave direction setting to HarfBuzz when
WebKit is calculating widths because the direction is LTR by default while
calculating widths.  Set script before shaping so that HarfBuzz can estimate
appropriate direction.

Test: fast/text/international/arabic-digits.html

* platform/graphics/harfbuzz/ng/HarfBuzzShaper.cpp:
(WebCore::HarfBuzzShaper::HarfBuzzRun::HarfBuzzRun):
Add m_script. This holds the script of the run.
(WebCore::HarfBuzzShaper::shape):
Tell shapeHarfBuzzRuns() to set direction when drawing glyphs or
direction should be overridden.
(WebCore::HarfBuzzShaper::collectHarfBuzzRuns):
Set script of HarfBuzzRuns.
(WebCore::HarfBuzzShaper::shapeHarfBuzzRuns):
Add an argument that indicates it should set direction.
* platform/graphics/harfbuzz/ng/HarfBuzzShaper.h:
(WebCore::HarfBuzzShaper::HarfBuzzRun::create):
(WebCore::HarfBuzzShaper::HarfBuzzRun::rtl):
(WebCore::HarfBuzzShaper::HarfBuzzRun::script):
(HarfBuzzRun):
(HarfBuzzShaper):

LayoutTests:

Add a test that checks Arabic digits appear in increasing order from left to right.

* fast/text/international/arabic-digits-expected.html: Added.
* fast/text/international/arabic-digits.html: Added.


[email protected]
Review URL: https://codereview.chromium.org/11293219

Modified Paths

Added Paths

Diff

Copied: branches/chromium/1312/LayoutTests/fast/text/international/arabic-digits-expected.html (from rev 133983, trunk/LayoutTests/fast/text/international/arabic-digits-expected.html) (0 => 134172)


--- branches/chromium/1312/LayoutTests/fast/text/international/arabic-digits-expected.html	                        (rev 0)
+++ branches/chromium/1312/LayoutTests/fast/text/international/arabic-digits-expected.html	2012-11-11 13:12:54 UTC (rev 134172)
@@ -0,0 +1,15 @@
+<html>
+<head>
+<meta charset="utf-8" />
+</head>
+<body>
+<p>
+Following Arabic-Indic digits should appear in increasing order from left to right.
+</p>
+<div style="font-size: 36pt;">
+<span style="direction: ltr; unicode-bidi: bidi-override;">
+&#x6f0;&#x6f1;&#x6f2;&#x6f3;&#x6f4;&#x6f5;&#x6f6;&#x6f7;&#x6f8;&#x6f9;
+</span>
+</div>
+</body>
+</html>

Copied: branches/chromium/1312/LayoutTests/fast/text/international/arabic-digits.html (from rev 133983, trunk/LayoutTests/fast/text/international/arabic-digits.html) (0 => 134172)


--- branches/chromium/1312/LayoutTests/fast/text/international/arabic-digits.html	                        (rev 0)
+++ branches/chromium/1312/LayoutTests/fast/text/international/arabic-digits.html	2012-11-11 13:12:54 UTC (rev 134172)
@@ -0,0 +1,15 @@
+<html>
+<head>
+<meta charset="utf-8" />
+</head>
+<body>
+<p>
+Following Arabic-Indic digits should appear in increasing order from left to right.
+</p>
+<div style="font-size: 36pt;">
+<span>
+&#x6f0;&#x6f1;&#x6f2;&#x6f3;&#x6f4;&#x6f5;&#x6f6;&#x6f7;&#x6f8;&#x6f9;
+</span>
+</div>
+</body>
+</html>

Modified: branches/chromium/1312/Source/WebCore/platform/graphics/harfbuzz/ng/HarfBuzzShaper.cpp (134171 => 134172)


--- branches/chromium/1312/Source/WebCore/platform/graphics/harfbuzz/ng/HarfBuzzShaper.cpp	2012-11-11 12:59:40 UTC (rev 134171)
+++ branches/chromium/1312/Source/WebCore/platform/graphics/harfbuzz/ng/HarfBuzzShaper.cpp	2012-11-11 13:12:54 UTC (rev 134172)
@@ -72,11 +72,12 @@
     return static_cast<float>(value) / (1 << 16);
 }
 
-HarfBuzzShaper::HarfBuzzRun::HarfBuzzRun(const SimpleFontData* fontData, unsigned startIndex, unsigned numCharacters, TextDirection direction)
+HarfBuzzShaper::HarfBuzzRun::HarfBuzzRun(const SimpleFontData* fontData, unsigned startIndex, unsigned numCharacters, TextDirection direction, hb_script_t script)
     : m_fontData(fontData)
     , m_startIndex(startIndex)
     , m_numCharacters(numCharacters)
     , m_direction(direction)
+    , m_script(script)
 {
 }
 
@@ -230,7 +231,9 @@
         return false;
 
     m_totalWidth = 0;
-    if (!shapeHarfBuzzRuns())
+    // WebKit doesn't set direction when calulating widths. Leave the direction setting to
+    // HarfBuzz when we are calculating widths (except when directionalOverride() is set).
+    if (!shapeHarfBuzzRuns(glyphBuffer || m_run.directionalOverride()))
         return false;
     m_totalWidth = roundf(m_totalWidth);
 
@@ -301,7 +304,8 @@
             currentCharacterPosition = iterator.characters();
         }
         unsigned numCharactersOfCurrentRun = iterator.currentCharacter() - startIndexOfCurrentRun;
-        m_harfbuzzRuns.append(HarfBuzzRun::create(currentFontData, startIndexOfCurrentRun, numCharactersOfCurrentRun, m_run.direction()));
+        hb_script_t script = hb_icu_script_to_script(currentScript);
+        m_harfbuzzRuns.append(HarfBuzzRun::create(currentFontData, startIndexOfCurrentRun, numCharactersOfCurrentRun, m_run.direction(), script));
         currentFontData = nextFontData;
         startIndexOfCurrentRun = iterator.currentCharacter();
     } while (iterator.consume(character, clusterLength));
@@ -309,19 +313,21 @@
     return !m_harfbuzzRuns.isEmpty();
 }
 
-bool HarfBuzzShaper::shapeHarfBuzzRuns()
+bool HarfBuzzShaper::shapeHarfBuzzRuns(bool shouldSetDirection)
 {
     HarfBuzzScopedPtr<hb_buffer_t> harfbuzzBuffer(hb_buffer_create(), hb_buffer_destroy);
 
     hb_buffer_set_unicode_funcs(harfbuzzBuffer.get(), hb_icu_get_unicode_funcs());
-    if (m_run.rtl() || m_run.directionalOverride())
-        hb_buffer_set_direction(harfbuzzBuffer.get(), m_run.rtl() ? HB_DIRECTION_RTL : HB_DIRECTION_LTR);
 
     for (unsigned i = 0; i < m_harfbuzzRuns.size(); ++i) {
         unsigned runIndex = m_run.rtl() ? m_harfbuzzRuns.size() - i - 1 : i;
         HarfBuzzRun* currentRun = m_harfbuzzRuns[runIndex].get();
         const SimpleFontData* currentFontData = currentRun->fontData();
 
+        hb_buffer_set_script(harfbuzzBuffer.get(), currentRun->script());
+        if (shouldSetDirection)
+            hb_buffer_set_direction(harfbuzzBuffer.get(), currentRun->rtl() ? HB_DIRECTION_RTL : HB_DIRECTION_LTR);
+
         // Add a space as pre-context to the buffer. This prevents showing dotted-circle
         // for combining marks at the beginning of runs.
         static const uint16_t preContext = ' ';
@@ -351,8 +357,6 @@
         setGlyphPositionsForHarfBuzzRun(currentRun, harfbuzzBuffer.get());
 
         hb_buffer_reset(harfbuzzBuffer.get());
-        if (m_run.rtl() || m_run.directionalOverride())
-            hb_buffer_set_direction(harfbuzzBuffer.get(), m_run.rtl() ? HB_DIRECTION_RTL : HB_DIRECTION_LTR);
     }
 
     return true;

Modified: branches/chromium/1312/Source/WebCore/platform/graphics/harfbuzz/ng/HarfBuzzShaper.h (134171 => 134172)


--- branches/chromium/1312/Source/WebCore/platform/graphics/harfbuzz/ng/HarfBuzzShaper.h	2012-11-11 12:59:40 UTC (rev 134171)
+++ branches/chromium/1312/Source/WebCore/platform/graphics/harfbuzz/ng/HarfBuzzShaper.h	2012-11-11 13:12:54 UTC (rev 134172)
@@ -61,9 +61,9 @@
 private:
     class HarfBuzzRun {
     public:
-        static PassOwnPtr<HarfBuzzRun> create(const SimpleFontData* fontData, unsigned startIndex, unsigned numCharacters, TextDirection direction)
+        static PassOwnPtr<HarfBuzzRun> create(const SimpleFontData* fontData, unsigned startIndex, unsigned numCharacters, TextDirection direction, hb_script_t script)
         {
-            return adoptPtr(new HarfBuzzRun(fontData, startIndex, numCharacters, direction));
+            return adoptPtr(new HarfBuzzRun(fontData, startIndex, numCharacters, direction, script));
         }
 
         void applyShapeResult(hb_buffer_t*);
@@ -82,16 +82,18 @@
         FloatPoint* offsets() { return &m_offsets[0]; }
         uint16_t* glyphToCharacterIndexes() { return &m_glyphToCharacterIndexes[0]; }
         float width() { return m_width; }
+        bool rtl() { return m_direction == RTL; }
+        hb_script_t script() { return m_script; }
 
     private:
-        HarfBuzzRun(const SimpleFontData*, unsigned startIndex, unsigned numCharacters, TextDirection);
-        bool rtl() { return m_direction == RTL; }
+        HarfBuzzRun(const SimpleFontData*, unsigned startIndex, unsigned numCharacters, TextDirection, hb_script_t);
 
         const SimpleFontData* m_fontData;
         unsigned m_startIndex;
         size_t m_numCharacters;
         unsigned m_numGlyphs;
         TextDirection m_direction;
+        hb_script_t m_script;
         Vector<uint16_t, 256> m_glyphs;
         Vector<float, 256> m_advances;
         Vector<uint16_t, 256> m_glyphToCharacterIndexes;
@@ -102,7 +104,7 @@
     void setFontFeatures();
 
     bool collectHarfBuzzRuns();
-    bool shapeHarfBuzzRuns();
+    bool shapeHarfBuzzRuns(bool shouldSetDirection);
     bool fillGlyphBuffer(GlyphBuffer*);
     void fillGlyphBufferFromHarfBuzzRun(GlyphBuffer*, HarfBuzzRun*, FloatPoint& firstOffsetOfNextRun);
     void setGlyphPositionsForHarfBuzzRun(HarfBuzzRun*, hb_buffer_t*);
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to