Changeset 76768 in webkit


Ignore:
Timestamp:
Jan 27, 2011 12:23:31 AM (13 years ago)
Author:
mitz@apple.com
Message:

REGRESSION (r76743): Uneven spacing in right-to-left justified text
https://bugs.webkit.org/show_bug.cgi?id=53225

Reviewed by Sam Weinig.

Fixes failure in fast/text/atsui-spacing-features.html

There was an inconsistency between rendering code and font code in the interpretation of
'after expansion' and 'trailing expansion'. Changed all code to interpret these in terms of
visual order rather than logical.

  • platform/graphics/Font.cpp:

(WebCore::Font::expansionOpportunityCount): Added a text direction parameter and changed to
iterate in visual order accordingly.

  • platform/graphics/Font.h:
  • platform/graphics/WidthIterator.cpp:

(WebCore::WidthIterator::WidthIterator): Pass the run direction to expansionOpportunityCount().
(WebCore::WidthIterator::advance): For right-to-left runs, evaluate the trailing expansion
condition with respect to the first character, which is the trailing character in visual order.

  • platform/graphics/mac/ComplexTextController.cpp:

(WebCore::ComplexTextController::ComplexTextController): Pass the run direction to
expansionOpportunityCount().

  • rendering/RenderBlockLineLayout.cpp:

(WebCore::RenderBlock::computeInlineDirectionPositionsForLine): Ditto.

Location:
trunk/Source/WebCore
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r76764 r76768  
     12011-01-27  Dan Bernstein  <mitz@apple.com>
     2
     3        Reviewed by Sam Weinig.
     4
     5        REGRESSION (r76743): Uneven spacing in right-to-left justified text
     6        https://bugs.webkit.org/show_bug.cgi?id=53225
     7
     8        Fixes failure in fast/text/atsui-spacing-features.html
     9
     10        There was an inconsistency between rendering code and font code in the interpretation of
     11        'after expansion' and 'trailing expansion'. Changed all code to interpret these in terms of
     12        visual order rather than logical.
     13
     14        * platform/graphics/Font.cpp:
     15        (WebCore::Font::expansionOpportunityCount): Added a text direction parameter and changed to
     16        iterate in visual order accordingly.
     17        * platform/graphics/Font.h:
     18        * platform/graphics/WidthIterator.cpp:
     19        (WebCore::WidthIterator::WidthIterator): Pass the run direction to expansionOpportunityCount().
     20        (WebCore::WidthIterator::advance): For right-to-left runs, evaluate the trailing expansion
     21        condition with respect to the first character, which is the trailing character in visual order.
     22        * platform/graphics/mac/ComplexTextController.cpp:
     23        (WebCore::ComplexTextController::ComplexTextController): Pass the run direction to
     24        expansionOpportunityCount().
     25        * rendering/RenderBlockLineLayout.cpp:
     26        (WebCore::RenderBlock::computeInlineDirectionPositionsForLine): Ditto.
     27
    1282011-01-26  Adam Roben  <aroben@apple.com>
    229
  • trunk/Source/WebCore/platform/graphics/Font.cpp

    r76743 r76768  
    459459}
    460460
    461 unsigned Font::expansionOpportunityCount(const UChar* characters, size_t length, bool& isAfterExpansion)
     461unsigned Font::expansionOpportunityCount(const UChar* characters, size_t length, TextDirection direction, bool& isAfterExpansion)
    462462{
    463463    static bool expandAroundIdeographs = canExpandAroundIdeographsInComplexText();
    464464    unsigned count = 0;
    465     for (size_t i = 0; i < length; ++i) {
    466         UChar32 character = characters[i];
    467         if (treatAsSpace(character)) {
    468             count++;
    469             isAfterExpansion = true;
    470             continue;
     465    if (direction == LTR) {
     466        for (size_t i = 0; i < length; ++i) {
     467            UChar32 character = characters[i];
     468            if (treatAsSpace(character)) {
     469                count++;
     470                isAfterExpansion = true;
     471                continue;
     472            }
     473            if (U16_IS_LEAD(character) && i + 1 < length && U16_IS_TRAIL(characters[i + 1])) {
     474                character = U16_GET_SUPPLEMENTARY(character, characters[i + 1]);
     475                i++;
     476            }
     477            if (expandAroundIdeographs && isCJKIdeograph(character)) {
     478                if (!isAfterExpansion)
     479                    count++;
     480                count++;
     481                isAfterExpansion = true;
     482                continue;
     483            }
     484            isAfterExpansion = false;
    471485        }
    472         if (U16_IS_LEAD(character) && i + 1 < length && U16_IS_TRAIL(characters[i + 1])) {
    473             character = U16_GET_SUPPLEMENTARY(character, characters[i + 1]);
    474             i++;
     486    } else {
     487        for (size_t i = length; i > 0; --i) {
     488            UChar32 character = characters[i - 1];
     489            if (treatAsSpace(character)) {
     490                count++;
     491                isAfterExpansion = true;
     492                continue;
     493            }
     494            if (U16_IS_TRAIL(character) && i > 1 && U16_IS_LEAD(characters[i - 2])) {
     495                character = U16_GET_SUPPLEMENTARY(characters[i - 2], character);
     496                i--;
     497            }
     498            if (expandAroundIdeographs && isCJKIdeograph(character)) {
     499                if (!isAfterExpansion)
     500                    count++;
     501                count++;
     502                isAfterExpansion = true;
     503                continue;
     504            }
     505            isAfterExpansion = false;
    475506        }
    476         if (expandAroundIdeographs && isCJKIdeograph(character)) {
    477             if (!isAfterExpansion)
    478                 count++;
    479             count++;
    480             isAfterExpansion = true;
    481             continue;
    482         }
    483         isAfterExpansion = false;
    484507    }
    485508    return count;
  • trunk/Source/WebCore/platform/graphics/Font.h

    r76743 r76768  
    3030#include "FontFallbackList.h"
    3131#include "SimpleFontData.h"
     32#include "TextDirection.h"
    3233#include "TypesettingFeatures.h"
    3334#include <wtf/HashMap.h>
     
    144145    static bool isCJKIdeographOrSymbol(UChar32);
    145146
    146     static unsigned expansionOpportunityCount(const UChar*, size_t length, bool& isAfterExpansion);
     147    static unsigned expansionOpportunityCount(const UChar*, size_t length, TextDirection, bool& isAfterExpansion);
    147148
    148149#if PLATFORM(QT)
  • trunk/Source/WebCore/platform/graphics/WidthIterator.cpp

    r76743 r76768  
    6565    else {
    6666        bool isAfterExpansion = true;
    67         unsigned expansionOpportunityCount = Font::expansionOpportunityCount(m_run.characters(), m_end, isAfterExpansion);
     67        unsigned expansionOpportunityCount = Font::expansionOpportunityCount(m_run.characters(), m_end, m_run.ltr() ? LTR : RTL, isAfterExpansion);
    6868        if (isAfterExpansion && !m_run.allowsTrailingExpansion())
    6969            expansionOpportunityCount--;
     
    178178            if (treatAsSpace || (expandAroundIdeographs && Font::isCJKIdeograph(c))) {
    179179                // Distribute the run's total expansion evenly over all expansion opportunities in the run.
    180                 if (m_expansion && (m_run.allowsTrailingExpansion() || currentCharacter + clusterLength < static_cast<size_t>(m_run.length()))) {
     180                if (m_expansion && (m_run.allowsTrailingExpansion() || (m_run.ltr() && currentCharacter + clusterLength < static_cast<size_t>(m_run.length()))
     181                    || (m_run.rtl() && currentCharacter))) {
    181182                    float previousExpansion = m_expansion;
    182183                    if (!treatAsSpace && !m_isAfterExpansion) {
  • trunk/Source/WebCore/platform/graphics/mac/ComplexTextController.cpp

    r76743 r76768  
    8585    else {
    8686        bool isAfterExpansion = true;
    87         unsigned expansionOpportunityCount = Font::expansionOpportunityCount(m_run.characters(), m_end, isAfterExpansion);
     87        unsigned expansionOpportunityCount = Font::expansionOpportunityCount(m_run.characters(), m_end, m_run.ltr() ? LTR : RTL, isAfterExpansion);
    8888        if (isAfterExpansion && !m_run.allowsTrailingExpansion())
    8989            expansionOpportunityCount--;
  • trunk/Source/WebCore/rendering/RenderBlockLineLayout.cpp

    r76743 r76768  
    325325
    326326            if (textAlign == JUSTIFY && r != trailingSpaceRun) {
    327                 unsigned opportunitiesInRun = Font::expansionOpportunityCount(rt->characters() + r->m_start, r->m_stop - r->m_start, isAfterExpansion);
     327                unsigned opportunitiesInRun = Font::expansionOpportunityCount(rt->characters() + r->m_start, r->m_stop - r->m_start, r->m_box->direction(), isAfterExpansion);
    328328                expansionOpportunities.append(opportunitiesInRun);
    329329                expansionOpportunityCount += opportunitiesInRun;
Note: See TracChangeset for help on using the changeset viewer.