- 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;">
+۰۱۲۳۴۵۶۷۸۹
+</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>
+۰۱۲۳۴۵۶۷۸۹
+</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*);