Changeset 62778 in webkit


Ignore:
Timestamp:
Jul 8, 2010 4:48:10 AM (14 years ago)
Author:
xji@chromium.org
Message:

2010-07-08 Xiaomei Ji <xji@chromium.org>

Reviewed by David Levin.

Fix characters with unicode-bidi-mirror property are not correctly
mirrored in Linux.
https://bugs.webkit.org/show_bug.cgi?id=41305

Since harfbuzz does not do mirroring, chromium should iterate each
character in the string and mirror it if needed before passing the
string to harfbuzz for shaping.

  • fast/text/international/bidi-mirror-he-ar.html: Added.
  • platform/mac/fast/text/international/bidi-mirror-he-ar-expected.checksum: Added.
  • platform/mac/fast/text/international/bidi-mirror-he-ar-expected.png: Added.
  • platform/mac/fast/text/international/bidi-mirror-he-ar-expected.txt: Added.

2010-07-08 Xiaomei Ji <xji@chromium.org>

Reviewed by David Levin.

Fix characters with unicode-bidi-mirror property are not correctly
mirrored in Linux.
https://bugs.webkit.org/show_bug.cgi?id=41305

Since harfbuzz does not do mirroring, chromium should iterate each
character in the string and mirror it if needed before passing the
string to harfbuzz for shaping.

Test: fast/text/international/bidi-mirror-he-ar.html

  • platform/graphics/chromium/FontLinux.cpp: (WebCore::TextRunWalker::TextRunWalker): (WebCore::TextRunWalker::~TextRunWalker):
Location:
trunk
Files:
4 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r62776 r62778  
     12010-07-08  Xiaomei Ji  <xji@chromium.org>
     2
     3        Reviewed by David Levin.
     4
     5        Fix characters with unicode-bidi-mirror property are not correctly
     6        mirrored in Linux.
     7        https://bugs.webkit.org/show_bug.cgi?id=41305
     8
     9        Since harfbuzz does not do mirroring, chromium should iterate each
     10        character in the string and mirror it if needed before passing the
     11        string to harfbuzz for shaping.
     12
     13        * fast/text/international/bidi-mirror-he-ar.html: Added.
     14        * platform/mac/fast/text/international/bidi-mirror-he-ar-expected.checksum: Added.
     15        * platform/mac/fast/text/international/bidi-mirror-he-ar-expected.png: Added.
     16        * platform/mac/fast/text/international/bidi-mirror-he-ar-expected.txt: Added.
     17
    1182010-07-08  Nikolas Zimmermann  <nzimmermann@rim.com>
    219
  • trunk/WebCore/ChangeLog

    r62776 r62778  
     12010-07-08  Xiaomei Ji  <xji@chromium.org>
     2
     3        Reviewed by David Levin.
     4
     5        Fix characters with unicode-bidi-mirror property are not correctly
     6        mirrored in Linux.
     7        https://bugs.webkit.org/show_bug.cgi?id=41305
     8
     9        Since harfbuzz does not do mirroring, chromium should iterate each
     10        character in the string and mirror it if needed before passing the
     11        string to harfbuzz for shaping.
     12
     13        Test: fast/text/international/bidi-mirror-he-ar.html
     14
     15        * platform/graphics/chromium/FontLinux.cpp:
     16        (WebCore::TextRunWalker::TextRunWalker):
     17        (WebCore::TextRunWalker::~TextRunWalker):
     18
    1192010-07-08  Nikolas Zimmermann  <nzimmermann@rim.com>
    220
  • trunk/WebCore/platform/graphics/chromium/FontLinux.cpp

    r61795 r62778  
    5050#include <wtf/OwnArrayPtr.h>
    5151#include <wtf/OwnPtr.h>
     52#include <wtf/unicode/Unicode.h>
    5253
    5354namespace WebCore {
     
    181182        m_item.font = allocHarfbuzzFont();
    182183
    183         m_item.string = m_run.characters();
    184         m_item.stringLength = m_run.length();
    185184        m_item.item.bidiLevel = m_run.rtl();
     185
     186        int length = m_run.length();
     187        m_item.stringLength = length;
     188
     189        if (!m_item.item.bidiLevel)
     190            m_item.string = m_run.characters();
     191        else {
     192            // Assume mirrored character is in the same multilingual plane as the original one.
     193            UChar* string = new UChar[length];
     194            mirrorCharacters(string, m_run.characters(), length);
     195            m_item.string = string;
     196        }
    186197
    187198        reset();
     
    193204        deleteGlyphArrays();
    194205        delete[] m_item.log_clusters;
     206        if (m_item.item.bidiLevel)
     207            delete[] m_item.string;
    195208    }
    196209
     
    456469    }
    457470
     471    void mirrorCharacters(UChar* destination, const UChar* source, int length) const
     472    {
     473        int position = 0;
     474        bool error;
     475        // Iterate characters in source and mirror character if needed.
     476        while (position < length) {
     477            UChar32 character;
     478            int nextPosition = position;
     479            U16_NEXT(source, nextPosition, length, character);
     480            character = u_charMirror(character);
     481            U16_APPEND(destination, position, length, character, error);
     482            ASSERT(!error);
     483            position = nextPosition;
     484        }
     485    }
     486
    458487    const Font* const m_font;
    459488    HB_ShaperItem m_item;
Note: See TracChangeset for help on using the changeset viewer.