亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? qopentype.cpp

?? 基礎(chǔ)c代碼
?? CPP
?? 第 1 頁 / 共 2 頁
字號(hào):
            qDebug("script %s has script index %d", tag_to_string(script), script_index);
#endif
            while (features->tag) {
                FT_UShort feature_index;
                error = TT_GSUB_Select_Feature(gsub, features->tag, script_index, 0xffff, &feature_index);
                if (!error) {
#ifdef OT_DEBUG
                    qDebug("  adding feature %s", tag_to_string(features->tag));
#endif
                    TT_GSUB_Add_Feature(gsub, feature_index, features->property);
                }
                ++features;
            }
        }
    }
    
    if (gpos) {
        TT_GPOS_Clear_Features(gpos);
        FT_UShort script_index;
        FT_Error error = TT_GPOS_Select_Script(gpos, tag, &script_index);
        if (!error) {
#ifdef OT_DEBUG
            {
                TTO_FeatureList featurelist = gpos->FeatureList;
                int numfeatures = featurelist.FeatureCount;
                qDebug("gpos table has %d features", numfeatures);
                for(int i = 0; i < numfeatures; i++) {
                    TTO_FeatureRecord *r = featurelist.FeatureRecord + i;
                    FT_UShort feature_index;
                    TT_GPOS_Select_Feature(gpos, r->FeatureTag, script_index, 0xffff, &feature_index);
                    qDebug("   feature '%s'", tag_to_string(r->FeatureTag));
                }
            }
#endif
            FT_ULong *feature_tag_list;
            error = TT_GPOS_Query_Features(gpos, script_index, 0xffff, &feature_tag_list);
            if (!error) {
                while (*feature_tag_list) {
                    FT_UShort feature_index;
                    error = TT_GPOS_Select_Feature(gpos, *feature_tag_list, script_index, 0xffff, &feature_index);
                    if (!error)
                        TT_GPOS_Add_Feature(gpos, feature_index, PositioningProperties);
                    ++feature_tag_list;
                }
            }
        }
    }

    current_script = script;
}

#ifdef OT_DEBUG
static void dump_string(OTL_Buffer buffer)
{
    for (uint i = 0; i < buffer->in_length; ++i) {
        qDebug("    %x: cluster=%d", buffer->in_string[i].gindex, buffer->in_string[i].cluster);
    }
}
#endif

extern void qt_heuristicPosition(QShaperItem *item);

void QOpenType::shape(QShaperItem *item, const unsigned int *properties)
{
    length = item->num_glyphs;

    otl_buffer_clear(otl_buffer);

    tmpAttributes = (QGlyphLayout::Attributes *) realloc(tmpAttributes, length*sizeof(QGlyphLayout::Attributes));
    tmpLogClusters = (unsigned int *) realloc(tmpLogClusters, length*sizeof(unsigned int));
    for (int i = 0; i < length; ++i) {
        otl_buffer_add_glyph(otl_buffer, item->glyphs[i].glyph, properties ? properties[i] : 0, i);
        tmpAttributes[i] = item->glyphs[i].attributes;
        tmpLogClusters[i] = item->log_clusters[i];
    }

#ifdef OT_DEBUG
    qDebug("-----------------------------------------");
//     qDebug("log clusters before shaping:");
//     for (int j = 0; j < length; j++)
//         qDebug("    log[%d] = %d", j, item->log_clusters[j]);
    qDebug("original glyphs: %p", item->glyphs);
    for (int i = 0; i < length; ++i)
        qDebug("   glyph=%4x", otl_buffer->in_string[i].gindex);
//     dump_string(otl_buffer);
#endif

    loadFlags = item->flags & QTextEngine::DesignMetrics ? FT_LOAD_NO_HINTING : FT_LOAD_DEFAULT;

    if (gsub)
        TT_GSUB_Apply_String(gsub, otl_buffer);

#ifdef OT_DEBUG
//     qDebug("log clusters before shaping:");
//     for (int j = 0; j < length; j++)
//         qDebug("    log[%d] = %d", j, item->log_clusters[j]);
    qDebug("shaped glyphs:");
    for (int i = 0; i < length; ++i)
        qDebug("   glyph=%4x", otl_buffer->in_string[i].gindex);
    qDebug("-----------------------------------------");
//     dump_string(otl_buffer);
#endif
}

bool QOpenType::positionAndAdd(QShaperItem *item, bool doLogClusters)
{
    if (gpos) {
#ifdef Q_WS_X11
        Q_ASSERT(fontEngine->type() == QFontEngine::Freetype);
        face = static_cast<QFontEngineFT *>(fontEngine)->lockFace();
#endif
        memset(otl_buffer->positions, 0, otl_buffer->in_length*sizeof(OTL_PositionRec));
        // #### check that passing "false,false" is correct
        TT_GPOS_Apply_String(face, gpos, loadFlags, otl_buffer, false, false);
#ifdef Q_WS_X11
        static_cast<QFontEngineFT *>(fontEngine)->unlockFace();
#endif
    }
    
    // make sure we have enough space to write everything back
    if (item->num_glyphs < (int)otl_buffer->in_length) {
        item->num_glyphs = otl_buffer->in_length;
        return false;
    }

    QGlyphLayout *glyphs = item->glyphs;

    for (unsigned int i = 0; i < otl_buffer->in_length; ++i) {
        glyphs[i].glyph = otl_buffer->in_string[i].gindex;
        glyphs[i].attributes = tmpAttributes[otl_buffer->in_string[i].cluster];
        if (i && otl_buffer->in_string[i].cluster == otl_buffer->in_string[i-1].cluster)
            glyphs[i].attributes.clusterStart = false;
    }
    item->num_glyphs = otl_buffer->in_length;

    if (doLogClusters) {
        // we can't do this for indic, as we pass the stuf in syllables and it's easier to do it in the shaper.
        unsigned short *logClusters = item->log_clusters;
        int clusterStart = 0;
        int oldCi = 0;
        for (unsigned int i = 0; i < otl_buffer->in_length; ++i) {
            int ci = otl_buffer->in_string[i].cluster;
            //         qDebug("   ci[%d] = %d mark=%d, cmb=%d, cs=%d",
            //                i, ci, glyphAttributes[i].mark, glyphAttributes[i].combiningClass, glyphAttributes[i].clusterStart);
            if (!glyphs[i].attributes.mark && glyphs[i].attributes.clusterStart && ci != oldCi) {
                for (int j = oldCi; j < ci; j++)
                    logClusters[j] = clusterStart;
                clusterStart = i;
                oldCi = ci;
            }
        }
        for (int j = oldCi; j < length; j++)
            logClusters[j] = clusterStart;
    }

    // calulate the advances for the shaped glyphs
//     qDebug("unpositioned: ");
    item->font->recalcAdvances(item->num_glyphs, glyphs, QFlag(item->flags));

    // positioning code:
    if (gpos) {
        OTL_Position positions = otl_buffer->positions;

//         qDebug("positioned glyphs:");
        for (unsigned int i = 0; i < otl_buffer->in_length; i++) {
//             qDebug("    %d:\t orig advance: (%d/%d)\tadv=(%d/%d)\tpos=(%d/%d)\tback=%d\tnew_advance=%d", i,
//                    glyphs[i].advance.x.toInt(), glyphs[i].advance.y.toInt(),
//                    (int)(positions[i].x_advance >> 6), (int)(positions[i].y_advance >> 6),
//                    (int)(positions[i].x_pos >> 6), (int)(positions[i].y_pos >> 6),
//                    positions[i].back, positions[i].new_advance);
            // ###### fix the case where we have y advances. How do we handle this in Uniscribe?????
            if (positions[i].new_advance) {
                glyphs[i].advance.x = QFixed::fromFixed(item->flags & QTextEngine::RightToLeft
                                          ? -positions[i].x_advance : positions[i].x_advance);
                glyphs[i].advance.y = QFixed::fromFixed(-positions[i].y_advance);
            } else {
                glyphs[i].advance.x += QFixed::fromFixed(item->flags & QTextEngine::RightToLeft
                                           ? -positions[i].x_advance : positions[i].x_advance);
                glyphs[i].advance.y -= QFixed::fromFixed(positions[i].y_advance);
            }
            glyphs[i].offset.x = QFixed::fromFixed(positions[i].x_pos);
            glyphs[i].offset.y = QFixed::fromFixed(-positions[i].y_pos);
            int back = positions[i].back;
            if (item->flags & QTextEngine::RightToLeft) {
                while (back--) {
                    glyphs[i].offset.x -= glyphs[i-back].advance.x;
                    glyphs[i].offset.y -= -glyphs[i-back].advance.y;
                }
            } else {
                while (back) {
                    glyphs[i].offset.x -= glyphs[i-back].advance.x;
                    glyphs[i].offset.y -= -glyphs[i-back].advance.y;
                    --back;
                }
            }
//             qDebug("   ->\tadv=%d\tpos=(%d/%d)",
//                    glyphs[i].advance.x.toInt(), glyphs[i].offset.x.toInt(), glyphs[i].offset.y.toInt());
        }
    } else {
        qt_heuristicPosition(item);
    }

#ifdef OT_DEBUG
    if (doLogClusters) {
        qDebug("log clusters after shaping:");
        for (int j = 0; j < length; j++)
            qDebug("    log[%d] = %d", j, item->log_clusters[j]);
    }
    qDebug("final glyphs:");
    for (int i = 0; i < (int)otl_buffer->in_length; ++i)
        qDebug("   glyph=%4x char_index=%d mark: %d cmp: %d, clusterStart: %d advance=%d/%d offset=%d/%d",
               glyphs[i].glyph, otl_buffer->in_string[i].cluster, glyphs[i].attributes.mark,
               glyphs[i].attributes.combiningClass, glyphs[i].attributes.clusterStart,
               glyphs[i].advance.x.toInt(), glyphs[i].advance.y.toInt(),
               glyphs[i].offset.x.toInt(), glyphs[i].offset.y.toInt());
    qDebug("-----------------------------------------");
#endif
    return true;
}

#endif // QT_NO_FREETYPE

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品77777| 一区二区视频在线| 欧美酷刑日本凌虐凌虐| av中文字幕不卡| 高清国产一区二区| 成人的网站免费观看| 91日韩一区二区三区| 在线观看日韩高清av| 欧美日韩一区二区在线视频| 91国产精品成人| 欧美精品高清视频| 欧美不卡视频一区| 国产性做久久久久久| 国产精品久久久久四虎| 亚洲精品美国一| 免费不卡在线观看| 国产精品91xxx| 91伊人久久大香线蕉| 欧美日韩亚洲丝袜制服| 精品国产免费一区二区三区香蕉| 精品国产免费一区二区三区四区 | 欧美网站大全在线观看| 欧美日韩三级一区| 久久蜜桃香蕉精品一区二区三区| 久久久久久久久久久99999| 最新久久zyz资源站| 亚洲免费av观看| 秋霞av亚洲一区二区三| fc2成人免费人成在线观看播放| 91老司机福利 在线| 欧美成人性福生活免费看| 中文字幕亚洲一区二区va在线| 亚洲h精品动漫在线观看| 国产精品一卡二卡在线观看| 一本大道久久a久久综合| 日韩精品一区二区三区在线观看 | 日本中文在线一区| 成人丝袜高跟foot| 日韩一区二区在线看| 国产精品精品国产色婷婷| 蜜桃一区二区三区在线| 91在线观看一区二区| 26uuu亚洲综合色欧美| 亚洲免费毛片网站| 国产精品系列在线观看| 欧美剧在线免费观看网站| 国产日韩欧美a| 美女在线观看视频一区二区| 91小视频在线免费看| 国产夜色精品一区二区av| 亚洲福利视频一区| 日本韩国一区二区三区| 国产日韩欧美精品在线| 麻豆91免费看| 欧美群妇大交群中文字幕| 自拍偷拍国产亚洲| 成人黄色电影在线| 久久久久国产免费免费| 久久精品噜噜噜成人88aⅴ| 欧美日韩激情一区二区| 亚洲精品第1页| 在线观看av不卡| 亚洲精品免费在线播放| 色视频欧美一区二区三区| 国产精品久久久久久久久免费樱桃| 极品美女销魂一区二区三区 | 中文字幕av免费专区久久| 精品夜夜嗨av一区二区三区| 欧美喷水一区二区| 五月天婷婷综合| 欧美日韩第一区日日骚| 亚洲chinese男男1069| 欧美日韩国产综合一区二区三区| 亚洲欧美色综合| 欧洲精品一区二区| 亚洲综合激情网| 欧美性大战久久久久久久蜜臀| 夜夜亚洲天天久久| 欧美日韩极品在线观看一区| 日精品一区二区三区| 日韩免费在线观看| 国产中文字幕一区| 国产精品视频九色porn| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 久久免费的精品国产v∧| 国产精品一线二线三线| 国产精品丝袜在线| 日本韩国一区二区三区| 日韩精品福利网| 久久中文字幕电影| 成人免费不卡视频| 亚洲午夜精品网| 欧美刺激午夜性久久久久久久| 欧美bbbbb| 久久久五月婷婷| 91在线播放网址| 日韩影视精彩在线| 欧美激情一区二区在线| 色素色在线综合| 久久国产精品区| 最新国产精品久久精品| 正在播放亚洲一区| 成人激情图片网| 天天影视涩香欲综合网| 欧美激情一区二区在线| 欧美日韩另类国产亚洲欧美一级| 蓝色福利精品导航| 一区二区三区在线观看网站| 欧美一区二区高清| 色婷婷综合久久久久中文| 奇米精品一区二区三区在线观看 | 美腿丝袜一区二区三区| 亚洲国产精品精华液ab| 欧美日韩极品在线观看一区| 国产成人免费视| 日韩中文字幕不卡| 亚洲色图色小说| 久久久久久久网| 日韩一区二区三区免费看| av男人天堂一区| 国产一区二区三区观看| 性做久久久久久免费观看欧美| 国产日韩三级在线| 亚洲精品一区二区三区福利| 欧美色电影在线| av在线不卡网| 成人综合在线观看| 国产在线一区观看| 男人的j进女人的j一区| 亚洲一区二区中文在线| 中文字幕第一页久久| 精品88久久久久88久久久| 3751色影院一区二区三区| 91麻豆免费看| av网站免费线看精品| 国产精品一区二区在线播放| 裸体歌舞表演一区二区| 蜜臀99久久精品久久久久久软件| 亚洲欧美中日韩| 亚洲欧美怡红院| 中文字幕视频一区| 国产精品麻豆欧美日韩ww| 国产精品午夜久久| 久久久综合视频| 国产色爱av资源综合区| 久久久亚洲午夜电影| 国产日韩欧美精品在线| 中文在线资源观看网站视频免费不卡| 欧美大片拔萝卜| 26uuu国产日韩综合| 精品av久久707| 日本一区二区三区视频视频| 久久亚洲春色中文字幕久久久| 精品国产精品网麻豆系列| 久久亚洲精品国产精品紫薇| 久久众筹精品私拍模特| 亚洲国产精品v| 亚洲视频在线一区| 亚洲国产日韩av| 日韩av在线播放中文字幕| 免费一级欧美片在线观看| 激情五月播播久久久精品| 国产一区二区美女诱惑| 不卡的av电影| 欧美日韩在线综合| 欧美一级片在线观看| 久久色.com| 国产精品第一页第二页第三页| 最好看的中文字幕久久| 亚欧色一区w666天堂| 韩日av一区二区| av在线不卡网| 这里只有精品视频在线观看| 精品久久久久久无| 17c精品麻豆一区二区免费| 亚洲国产wwwccc36天堂| 久久99久久99精品免视看婷婷| 国产精品一区在线观看乱码 | 久久综合av免费| 亚洲欧美日韩国产成人精品影院| 亚洲国产视频网站| 夫妻av一区二区| 在线成人高清不卡| 中文字幕电影一区| 日本怡春院一区二区| 丰满少妇在线播放bd日韩电影| 日本久久电影网| 国产婷婷色一区二区三区四区 | 欧美精品久久久久久久久老牛影院| 欧美xxxx老人做受| 一区二区在线观看免费视频播放| 美女网站色91| 91麻豆精品在线观看| wwww国产精品欧美| 亚洲制服丝袜在线| 成人免费毛片片v| 精品日韩成人av| 亚洲va国产va欧美va观看| 91在线视频免费91| 欧美韩日一区二区三区|