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

📄 qtextengine.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                        eor = current; status.eor = QChar::DirL;                    }                default:                    break;                }            status.lastStrong = QChar::DirL;            break;        case QChar::DirAL:        case QChar::DirR:            hasBidi = true;            if(dir == QChar::DirON) dir = QChar::DirR;            switch(status.last)                {                case QChar::DirL:                case QChar::DirEN:                case QChar::DirAN:                    if (eor >= 0)                        appendItems(engine, sor, eor, control, dir);                    // fall through                case QChar::DirR:                case QChar::DirAL:                    dir = QChar::DirR; eor = current; status.eor = QChar::DirR; break;                case QChar::DirES:                case QChar::DirET:                case QChar::DirCS:                case QChar::DirBN:                case QChar::DirB:                case QChar::DirS:                case QChar::DirWS:                case QChar::DirON:                    if(status.eor != QChar::DirR && status.eor != QChar::DirAL) {                        //last stuff takes embedding dir                        if(control.direction() == QChar::DirR                           || status.lastStrong == QChar::DirR || status.lastStrong == QChar::DirAL) {                            appendItems(engine, sor, eor, control, dir);                            dir = QChar::DirR; status.eor = QChar::DirON;                            eor = current;                        } else {                            eor = current - 1;                            appendItems(engine, sor, eor, control, dir);                            dir = QChar::DirR; status.eor = QChar::DirON;                        }                    } else {                        eor = current; status.eor = QChar::DirR;                    }                default:                    break;                }            status.lastStrong = dirCurrent;            break;            // weak types:        case QChar::DirNSM:            if (eor == current-1)                eor = current;            break;        case QChar::DirEN:            // if last strong was AL change EN to AN            if(status.lastStrong != QChar::DirAL) {                if(dir == QChar::DirON) {                    if(status.lastStrong == QChar::DirL)                        dir = QChar::DirL;                    else                        dir = QChar::DirEN;                }                switch(status.last)                    {                    case QChar::DirET:                        if (status.lastStrong == QChar::DirR || status.lastStrong == QChar::DirAL) {                            appendItems(engine, sor, eor, control, dir);                            status.eor = QChar::DirON;                            dir = QChar::DirAN;                        }                        // fall through                    case QChar::DirEN:                    case QChar::DirL:                        eor = current;                        status.eor = dirCurrent;                        break;                    case QChar::DirR:                    case QChar::DirAL:                    case QChar::DirAN:                        if (eor >= 0)                            appendItems(engine, sor, eor, control, dir);                        else                            eor = current;                        status.eor = QChar::DirEN;                        dir = QChar::DirAN; break;                    case QChar::DirES:                    case QChar::DirCS:                        if(status.eor == QChar::DirEN || dir == QChar::DirAN) {                            eor = current; break;                        }                    case QChar::DirBN:                    case QChar::DirB:                    case QChar::DirS:                    case QChar::DirWS:                    case QChar::DirON:                        if(status.eor == QChar::DirR) {                            // neutrals go to R                            eor = current - 1;                            appendItems(engine, sor, eor, control, dir);                            dir = QChar::DirON; status.eor = QChar::DirEN;                            dir = QChar::DirAN;                        }                        else if(status.eor == QChar::DirL ||                                 (status.eor == QChar::DirEN && status.lastStrong == QChar::DirL)) {                            eor = current; status.eor = dirCurrent;                        } else {                            // numbers on both sides, neutrals get right to left direction                            if(dir != QChar::DirL) {                                appendItems(engine, sor, eor, control, dir);                                dir = QChar::DirON; status.eor = QChar::DirON;                                eor = current - 1;                                dir = QChar::DirR;                                appendItems(engine, sor, eor, control, dir);                                dir = QChar::DirON; status.eor = QChar::DirON;                                dir = QChar::DirAN;                            } else {                                eor = current; status.eor = dirCurrent;                            }                        }                    default:                        break;                    }                break;            }        case QChar::DirAN:            hasBidi = true;            dirCurrent = QChar::DirAN;            if(dir == QChar::DirON) dir = QChar::DirAN;            switch(status.last)                {                case QChar::DirL:                case QChar::DirAN:                    eor = current; status.eor = QChar::DirAN; break;                case QChar::DirR:                case QChar::DirAL:                case QChar::DirEN:                    if (eor >= 0){                        appendItems(engine, sor, eor, control, dir);                    } else {                        eor = current;                    }                    dir = QChar::DirON; status.eor = QChar::DirAN;                    break;                case QChar::DirCS:                    if(status.eor == QChar::DirAN) {                        eor = current; break;                    }                case QChar::DirES:                case QChar::DirET:                case QChar::DirBN:                case QChar::DirB:                case QChar::DirS:                case QChar::DirWS:                case QChar::DirON:                    if(status.eor == QChar::DirR) {                        // neutrals go to R                        eor = current - 1;                        appendItems(engine, sor, eor, control, dir);                        status.eor = QChar::DirAN;                        dir = QChar::DirAN;                    } else if(status.eor == QChar::DirL ||                               (status.eor == QChar::DirEN && status.lastStrong == QChar::DirL)) {                        eor = current; status.eor = dirCurrent;                    } else {                        // numbers on both sides, neutrals get right to left direction                        if(dir != QChar::DirL) {                            appendItems(engine, sor, eor, control, dir);                            status.eor = QChar::DirON;                            eor = current - 1;                            dir = QChar::DirR;                            appendItems(engine, sor, eor, control, dir);                            status.eor = QChar::DirAN;                            dir = QChar::DirAN;                        } else {                            eor = current; status.eor = dirCurrent;                        }                    }                default:                    break;                }            break;        case QChar::DirES:        case QChar::DirCS:            break;        case QChar::DirET:            if(status.last == QChar::DirEN) {                dirCurrent = QChar::DirEN;                eor = current; status.eor = dirCurrent;            }            break;            // boundary neutrals should be ignored        case QChar::DirBN:            break;            // neutrals        case QChar::DirB:            // ### what do we do with newline and paragraph separators that come to here?            break;        case QChar::DirS:            // ### implement rule L1            break;        case QChar::DirWS:        case QChar::DirON:            break;        default:            break;        }        //cout << "     after: dir=" << //        dir << " current=" << dirCurrent << " last=" << status.last << " eor=" << status.eor << " lastStrong=" << status.lastStrong << " embedding=" << control.direction() << endl;        if(current >= (int)length) break;        // set status.last as needed.        switch(dirCurrent) {        case QChar::DirET:        case QChar::DirES:        case QChar::DirCS:        case QChar::DirS:        case QChar::DirWS:        case QChar::DirON:            switch(status.last)            {            case QChar::DirL:            case QChar::DirR:            case QChar::DirAL:            case QChar::DirEN:            case QChar::DirAN:                status.last = dirCurrent;                break;            default:                status.last = QChar::DirON;            }            break;        case QChar::DirNSM:        case QChar::DirBN:            // ignore these            break;        case QChar::DirLRO:        case QChar::DirLRE:            status.last = QChar::DirL;            break;        case QChar::DirRLO:        case QChar::DirRLE:            status.last = QChar::DirR;            break;        case QChar::DirEN:            if (status.last == QChar::DirL) {                status.last = QChar::DirL;                break;            }            // fall through        default:            status.last = dirCurrent;        }        ++current;    }#if (BIDI_DEBUG >= 1)    cout << "reached end of line current=" << current << ", eor=" << eor << endl;#endif    eor = current - 1; // remove dummy char    if (sor <= eor)        appendItems(engine, sor, eor, control, dir);    return hasBidi;}void QTextEngine::bidiReorder(int numItems, const quint8 *levels, int *visualOrder){    // first find highest and lowest levels    uchar levelLow = 128;    uchar levelHigh = 0;    int i = 0;    while (i < numItems) {        //printf("level = %d\n", r->level);        if (levels[i] > levelHigh)            levelHigh = levels[i];        if (levels[i] < levelLow)            levelLow = levels[i];        i++;    }    // 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++;#if (BIDI_DEBUG >= 1)    cout << "reorderLine: lineLow = " << (uint)levelLow << ", lineHigh = " << (uint)levelHigh << endl;#endif    int count = numItems - 1;    for (i = 0; i < numItems; i++)        visualOrder[i] = i;    while(levelHigh >= levelLow) {        int i = 0;        while (i < count) {            while(i < count && levels[i] < levelHigh) i++;            int start = i;            while(i <= count && levels[i] >= levelHigh) i++;            int end = i-1;            if(start != end) {                //cout << "reversing from " << start << " to " << end << endl;                for(int j = 0; j < (end-start+1)/2; j++) {                    int tmp = visualOrder[start+j];                    visualOrder[start+j] = visualOrder[end-j];                    visualOrder[end-j] = tmp;                }            }            i++;        }        levelHigh--;    }#if (BIDI_DEBUG >= 1)    cout << "visual order is:" << endl;    for (i = 0; i < numItems; i++)        cout << visualOrder[i] << endl;#endif}// -----------------------------------------------------------------------------------------------------//// The line break algorithm. See http://www.unicode.org/reports/tr14/tr14-13.html//// -----------------------------------------------------------------------------------------------------/* The Unicode algorithm does in our opinion allow line breaks at some   places they shouldn't be allowed. The following changes were thus   made in comparison to the Unicode reference:   EX->AL from DB to IB   SY->AL from DB to IB   SY->PO from DB to IB   SY->PR from DB to IB   SY->OP from DB to IB   AL->PR from DB to IB   AL->PO from DB to IB   PR->PR from DB to IB   PO->PO from DB to IB   PR->PO from DB to IB   PO->PR from DB to IB   HY->PO from DB to IB   HY->PR from DB to IB   HY->OP from DB to IB   NU->EX from PB to IB   EX->PO from DB to IB*/

⌨️ 快捷键说明

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