⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bidiresolver.h

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 H
📖 第 1 页 / 共 3 页
字号:
            eor = current;            m_status.eor = RightToLeft;            m_status.lastStrong = dirCurrent;            m_direction = RightToLeft;            break;            // weak types:        case EuropeanNumber:            if (m_status.lastStrong != RightToLeftArabic) {                // if last strong was AL change EN to AN                switch (m_status.last) {                    case EuropeanNumber:                    case LeftToRight:                        break;                    case RightToLeft:                    case RightToLeftArabic:                    case ArabicNumber:                        eor = last;                        appendRun();                        m_direction = EuropeanNumber;                        break;                    case EuropeanNumberSeparator:                    case CommonNumberSeparator:                        if (m_status.eor == EuropeanNumber)                            break;                    case EuropeanNumberTerminator:                    case BoundaryNeutral:                    case BlockSeparator:                    case SegmentSeparator:                    case WhiteSpaceNeutral:                    case OtherNeutral:                        if (m_status.eor == EuropeanNumber) {                            if (m_status.lastStrong == RightToLeft) {                                // ENs on both sides behave like Rs, so the neutrals should be R.                                // Terminate the EN run.                                appendRun();                                // Make an R run.                                eor = m_status.last == EuropeanNumberTerminator ? lastBeforeET : last;                                m_direction = RightToLeft;                                appendRun();                                // Begin a new EN run.                                m_direction = EuropeanNumber;                            }                        } else if (m_status.eor == ArabicNumber) {                            // Terminate the AN run.                            appendRun();                            if (m_status.lastStrong == RightToLeft || context()->dir() == RightToLeft) {                                // Make an R run.                                eor = m_status.last == EuropeanNumberTerminator ? lastBeforeET : last;                                m_direction = RightToLeft;                                appendRun();                                // Begin a new EN run.                                m_direction = EuropeanNumber;                            }                        } else if (m_status.lastStrong == RightToLeft) {                            // Extend the R run to include the neutrals.                            eor = m_status.last == EuropeanNumberTerminator ? lastBeforeET : last;                            m_direction = RightToLeft;                            appendRun();                            // Begin a new EN run.                            m_direction = EuropeanNumber;                        }                    default:                        break;                }                eor = current;                m_status.eor = EuropeanNumber;                if (m_direction == OtherNeutral)                    m_direction = LeftToRight;                break;            }        case ArabicNumber:            dirCurrent = ArabicNumber;            switch (m_status.last) {                case LeftToRight:                    if (context()->dir() == LeftToRight)                        appendRun();                    break;                case ArabicNumber:                    break;                case RightToLeft:                case RightToLeftArabic:                case EuropeanNumber:                    eor = last;                    appendRun();                    break;                case CommonNumberSeparator:                    if (m_status.eor == ArabicNumber)                        break;                case EuropeanNumberSeparator:                case EuropeanNumberTerminator:                case BoundaryNeutral:                case BlockSeparator:                case SegmentSeparator:                case WhiteSpaceNeutral:                case OtherNeutral:                    if (m_status.eor == ArabicNumber                        || m_status.eor == EuropeanNumber && (m_status.lastStrong == RightToLeft || context()->dir() == RightToLeft)                        || m_status.eor != EuropeanNumber && m_status.lastStrong == LeftToRight && context()->dir() == RightToLeft) {                        // Terminate the run before the neutrals.                        appendRun();                        // Begin an R run for the neutrals.                        m_direction = RightToLeft;                    } else if (m_direction == OtherNeutral)                        m_direction = m_status.lastStrong == LeftToRight ? LeftToRight : RightToLeft;                    eor = last;                    appendRun();                default:                    break;            }            eor = current;            m_status.eor = ArabicNumber;            if (m_direction == OtherNeutral)                m_direction = ArabicNumber;            break;        case EuropeanNumberSeparator:        case CommonNumberSeparator:            break;        case EuropeanNumberTerminator:            if (m_status.last == EuropeanNumber) {                dirCurrent = EuropeanNumber;                eor = current;                m_status.eor = dirCurrent;            } else if (m_status.last != EuropeanNumberTerminator)                lastBeforeET = emptyRun ? eor : last;            break;        // boundary neutrals should be ignored        case BoundaryNeutral:            if (eor == last)                eor = current;            break;            // neutrals        case BlockSeparator:            // ### what do we do with newline and paragraph seperators that come to here?            break;        case SegmentSeparator:            // ### implement rule L1            break;        case WhiteSpaceNeutral:            break;        case OtherNeutral:            break;        default:            break;        }        if (pastEnd) {            if (eor == current) {                if (!reachedEndOfLine) {                    eor = endOfLine;                    switch (m_status.eor) {                        case LeftToRight:                        case RightToLeft:                        case ArabicNumber:                            m_direction = m_status.eor;                            break;                        case EuropeanNumber:                            m_direction = m_status.lastStrong == LeftToRight ? LeftToRight : EuropeanNumber;                            break;                        default:                            ASSERT(false);                    }                    appendRun();                }                current = end;                m_status = stateAtEnd.m_status;                sor = stateAtEnd.sor;                 eor = stateAtEnd.eor;                last = stateAtEnd.last;                reachedEndOfLine = stateAtEnd.reachedEndOfLine;                lastBeforeET = stateAtEnd.lastBeforeET;                emptyRun = stateAtEnd.emptyRun;                m_direction = OtherNeutral;                break;            }        }        // set m_status.last as needed.        switch (dirCurrent) {            case EuropeanNumberTerminator:                if (m_status.last != EuropeanNumber)                    m_status.last = EuropeanNumberTerminator;                break;            case EuropeanNumberSeparator:            case CommonNumberSeparator:            case SegmentSeparator:            case WhiteSpaceNeutral:            case OtherNeutral:                switch(m_status.last) {                    case LeftToRight:                    case RightToLeft:                    case RightToLeftArabic:                    case EuropeanNumber:                    case ArabicNumber:                        m_status.last = dirCurrent;                        break;                    default:                        m_status.last = OtherNeutral;                    }                break;            case NonSpacingMark:            case BoundaryNeutral:            case RightToLeftEmbedding:            case LeftToRightEmbedding:            case RightToLeftOverride:            case LeftToRightOverride:            case PopDirectionalFormat:                // ignore these                break;            case EuropeanNumber:                // fall through            default:                m_status.last = dirCurrent;        }        last = current;        if (emptyRun && !(dirCurrent == RightToLeftEmbedding                || dirCurrent == LeftToRightEmbedding                || dirCurrent == RightToLeftOverride                || dirCurrent == LeftToRightOverride                || dirCurrent == PopDirectionalFormat)) {            sor = current;            emptyRun = false;        }        increment();        if (!m_currentExplicitEmbeddingSequence.isEmpty())            commitExplicitEmbedding();        if (emptyRun && (dirCurrent == RightToLeftEmbedding                || dirCurrent == LeftToRightEmbedding                || dirCurrent == RightToLeftOverride                || dirCurrent == LeftToRightOverride                || dirCurrent == PopDirectionalFormat)) {            // exclude the embedding char itself from the new run so that ATSUI will never see it            eor = Iterator();            last = current;            sor = current;        }        if (!pastEnd && (current == end || current.atEnd())) {            if (emptyRun)                break;            stateAtEnd.m_status = m_status;            stateAtEnd.sor = sor;             stateAtEnd.eor = eor;            stateAtEnd.last = last;            stateAtEnd.reachedEndOfLine = reachedEndOfLine;            stateAtEnd.lastBeforeET = lastBeforeET;            stateAtEnd.emptyRun = emptyRun;            endOfLine = last;            pastEnd = true;        }    }    m_logicallyLastRun = m_lastRun;    // reorder line according to run structure...    // do not reverse for visually ordered web sites    if (!visualOrder) {        // first find highest and lowest levels        unsigned char levelLow = 128;        unsigned char levelHigh = 0;        Run* r = firstRun();        while (r) {            if (r->m_level > levelHigh)                levelHigh = r->m_level;            if (r->m_level < levelLow)                levelLow = r->m_level;            r = r->next();        }        // implements reordering of the line (L2 according to Bidi spec):        // L2. From the highest level found in the text to the lowest odd level on each line,        // reverse any contiguous sequence of characters that are at that level or higher.        // reversing is only done up to the lowest odd level        if (!(levelLow % 2))            levelLow++;        unsigned count = runCount() - 1;        while (levelHigh >= levelLow) {            unsigned i = 0;            Run* currRun = firstRun();            while (i < count) {                while (i < count && currRun && currRun->m_level < levelHigh) {                    i++;                    currRun = currRun->next();                }                unsigned start = i;                while (i <= count && currRun && currRun->m_level >= levelHigh) {                    i++;                    currRun = currRun->next();                }                unsigned end = i - 1;                reverseRuns(start, end);            }            levelHigh--;        }    }    endOfLine = Iterator();}} // namespace WebCore#endif // BidiResolver_h

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -