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

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

?? qopentype.cpp

?? 基礎(chǔ)c代碼
?? CPP
?? 第 1 頁 / 共 2 頁
字號(hào):
/****************************************************************************
**
** Copyright (C) 1992-2006 Trolltech AS. All rights reserved.
**
** This file is part of the QtGui module of the Qt Toolkit.
**
** This file may be used under the terms of the GNU General Public
** License version 2.0 as published by the Free Software Foundation
** and appearing in the file LICENSE.GPL included in the packaging of
** this file.  Please review the following information to ensure GNU
** General Public Licensing requirements will be met:
** http://www.trolltech.com/products/qt/opensource.html
**
** If you are unsure which license is appropriate for your use, please
** review the following information:
** http://www.trolltech.com/products/qt/licensing.html or contact the
** sales department at sales@trolltech.com.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
****************************************************************************/

#include "qopentype_p.h"
#include "qfontengine_p.h"
#include "qscriptengine_p.h"

#ifndef QT_NO_FREETYPE
//  --------------------------------------------------------------------------------------------------------------------
// Open type support
//  --------------------------------------------------------------------------------------------------------------------

//#define OT_DEBUG

#ifdef OT_DEBUG
static inline char *tag_to_string(FT_ULong tag)
{
    static char string[5];
    string[0] = (tag >> 24)&0xff;
    string[1] = (tag >> 16)&0xff;
    string[2] = (tag >> 8)&0xff;
    string[3] = tag&0xff;
    string[4] = 0;
    return string;
}
#endif

#define DefaultLangSys 0xffff
#define DefaultScript FT_MAKE_TAG('D', 'F', 'L', 'T')

enum {
    RequiresGsub = 1,
    RequiresGpos = 2
};

struct OTScripts {
    unsigned int tag;
    int flags;
};
static const OTScripts ot_scripts [] = {
    // Common
    { FT_MAKE_TAG('D', 'F', 'L', 'T'), 0 },
    // Hebrew
    { FT_MAKE_TAG('h', 'e', 'b', 'r'), 1 },
    // Arabic
    { FT_MAKE_TAG('a', 'r', 'a', 'b'), 1 },
    // Syriac
    { FT_MAKE_TAG('s', 'y', 'r', 'c'), 1 },
    // Thaana
    { FT_MAKE_TAG('t', 'h', 'a', 'a'), 1 },
    // Devanagari
    { FT_MAKE_TAG('d', 'e', 'v', 'a'), 1 },
    // Bengali
    { FT_MAKE_TAG('b', 'e', 'n', 'g'), 1 },
    // Gurmukhi
    { FT_MAKE_TAG('g', 'u', 'r', 'u'), 1 },
    // Gujarati
    { FT_MAKE_TAG('g', 'u', 'j', 'r'), 1 },
    // Oriya
    { FT_MAKE_TAG('o', 'r', 'y', 'a'), 1 },
    // Tamil
    { FT_MAKE_TAG('t', 'a', 'm', 'l'), 1 },
    // Telugu
    { FT_MAKE_TAG('t', 'e', 'l', 'u'), 1 },
    // Kannada
    { FT_MAKE_TAG('k', 'n', 'd', 'a'), 1 },
    // Malayalam
    { FT_MAKE_TAG('m', 'l', 'y', 'm'), 1 },
    // Sinhala
    // ### could not find any OT specs on this
    { FT_MAKE_TAG('s', 'i', 'n', 'h'), 1 },
    // Thai
    { FT_MAKE_TAG('t', 'h', 'a', 'i'), 1 },
    // Lao
    { FT_MAKE_TAG('l', 'a', 'o', ' '), 1 },
    // Tibetan
    { FT_MAKE_TAG('t', 'i', 'b', 't'), 1 },
    // Myanmar
    { FT_MAKE_TAG('m', 'y', 'm', 'r'), 1 },
    // Hangul
    { FT_MAKE_TAG('h', 'a', 'n', 'g'), 1 },
    // Khmer
    { FT_MAKE_TAG('k', 'h', 'm', 'r'), 1 },
};

QOpenType::QOpenType(QFontEngine *fe, FT_Face _face)
    : fontEngine(fe), face(_face), gdef(0), gsub(0), gpos(0), current_script(0)
{
    otl_buffer_new(face->memory, &otl_buffer);
    tmpAttributes = 0;
    tmpLogClusters = 0;

    FT_Error error;
    if ((error = TT_Load_GDEF_Table(face, &gdef))) {
#ifdef OT_DEBUG
        qDebug("error loading gdef table: %d", error);
#endif
        gdef = 0;
    }

    if ((error = TT_Load_GSUB_Table(face, &gsub, gdef))) {
        gsub = 0;
#ifdef OT_DEBUG
        if (error != FT_Err_Table_Missing) {
            qDebug("error loading gsub table: %d", error);
        } else {
            qDebug("face doesn't have a gsub table");
        }
#endif
    }

    if ((error = TT_Load_GPOS_Table(face, &gpos, gdef))) {
        gpos = 0;
#ifdef OT_DEBUG
        qDebug("error loading gpos table: %d", error);
#endif
    }
    
    for (uint i = 0; i < QUnicodeTables::ScriptCount; ++i)
        supported_scripts[i] = checkScript(i);
}

QOpenType::~QOpenType()
{
    if (gpos)
        TT_Done_GPOS_Table(gpos);
    if (gsub)
        TT_Done_GSUB_Table(gsub);
    if (gdef)
        TT_Done_GDEF_Table(gdef);
    if (otl_buffer)
        otl_buffer_free(otl_buffer);
    if (tmpAttributes)
        free(tmpAttributes);
    if (tmpLogClusters)
        free(tmpLogClusters);
}

bool QOpenType::checkScript(unsigned int script)
{
    assert(script < QUnicodeTables::ScriptCount);

    uint tag = ot_scripts[script].tag;
    int requirements = ot_scripts[script].flags;

    if (requirements & RequiresGsub) {
        if (!gsub)
            return false;
        
        FT_UShort script_index;
        FT_Error error = TT_GSUB_Select_Script(gsub, tag, &script_index);
        if (error) {
#ifdef OT_DEBUG
            qDebug("could not select script %d in GSub table: %d", (int)script, error);
#endif
            return false;
        }
    }
    
    if (requirements & RequiresGpos) {
        if (!gpos)
            return false;
        
        FT_UShort script_index;
        FT_Error error = TT_GPOS_Select_Script(gpos, script, &script_index);
        if (error) {
#ifdef OT_DEBUG
            qDebug("could not select script in gpos table: %d", error);
#endif
            return false;
        }

    }
    return true;
}


void QOpenType::selectScript(unsigned int script, const Features *features)
{
    if (current_script == script)
        return;
    
    assert(script < QUnicodeTables::ScriptCount);
    // find script in our list of supported scripts.
    uint tag = ot_scripts[script].tag;

    if (gsub && features) {
#ifdef OT_DEBUG
        {
            TTO_FeatureList featurelist = gsub->FeatureList;
            int numfeatures = featurelist.FeatureCount;
            qDebug("gsub table has %d features", numfeatures);
            for(int i = 0; i < numfeatures; i++) {
                TTO_FeatureRecord *r = featurelist.FeatureRecord + i;
                qDebug("   feature '%s'", tag_to_string(r->FeatureTag));
            }
        }
#endif
        TT_GSUB_Clear_Features(gsub);
        FT_UShort script_index;
        FT_Error error = TT_GSUB_Select_Script(gsub, tag, &script_index);
        if (!error) {
#ifdef OT_DEBUG

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品免费视频观看| 男女性色大片免费观看一区二区| 亚洲男人电影天堂| 色综合激情久久| 日韩欧美的一区| 最近日韩中文字幕| 国内精品伊人久久久久av影院 | 欧美激情艳妇裸体舞| 亚洲国产精品人人做人人爽| 韩国欧美一区二区| 欧美日韩不卡一区二区| 国产精品久久久久天堂| 国产一区二区成人久久免费影院 | 日韩写真欧美这视频| 一区二区在线观看免费 | 亚洲国产精品二十页| 男女性色大片免费观看一区二区 | 亚洲婷婷综合久久一本伊一区| 久久国产精品99久久久久久老狼 | 国产91精品欧美| 7799精品视频| 亚洲成人动漫精品| 久久午夜免费电影| 极品美女销魂一区二区三区免费| 欧美丝袜丝交足nylons图片| 日韩一区中文字幕| 成人av综合一区| 中文字幕av一区二区三区| 国产毛片精品一区| 欧美精品一区二| 久久激情五月激情| 精品黑人一区二区三区久久| 亚洲成人av福利| 欧美日韩小视频| 亚洲福利一区二区三区| 欧美日韩在线三级| 亚洲成国产人片在线观看| 欧美三级蜜桃2在线观看| 伊人性伊人情综合网| 欧美网站大全在线观看| 亚洲成av人片www| 欧美日韩视频一区二区| 天天综合日日夜夜精品| 欧美一区二区免费观在线| 日日夜夜一区二区| 欧美va亚洲va香蕉在线| 国产酒店精品激情| 欧美激情一区二区三区全黄| 不卡av在线网| 一区二区三区四区在线播放| 欧美日韩国产另类一区| 美女免费视频一区二区| 精品黑人一区二区三区久久| 成人国产精品免费网站| 伊人性伊人情综合网| 91精品国产色综合久久| 欧美无砖砖区免费| 美女国产一区二区三区| 国产区在线观看成人精品| 色综合久久综合中文综合网| 亚洲成av人**亚洲成av**| 日韩精品一区二区三区视频在线观看| 激情综合色播五月| 综合在线观看色| 在线播放中文一区| 懂色av一区二区在线播放| 一区二区三区日韩欧美精品| 欧美一级艳片视频免费观看| 国产成人午夜精品影院观看视频| 日韩伦理免费电影| 日韩亚洲欧美综合| 91同城在线观看| 另类的小说在线视频另类成人小视频在线 | 国产精品免费av| 欧美日韩国产另类一区| 粉嫩av一区二区三区| 亚洲福利一区二区| 国产精品视频一二| 51精品国自产在线| 99re成人精品视频| 麻豆国产欧美一区二区三区| 亚洲天堂中文字幕| 精品国精品自拍自在线| 在线视频你懂得一区二区三区| 久久国产三级精品| 亚洲成a天堂v人片| 中文字幕一区视频| 午夜一区二区三区视频| 久久综合国产精品| 欧美日韩激情一区二区三区| 成人一区二区三区视频 | 一区二区三区自拍| 国产三级三级三级精品8ⅰ区| 欧美日韩午夜在线| 在线中文字幕一区二区| 成人永久aaa| 国产一区二区三区免费观看| 午夜一区二区三区在线观看| 亚洲靠逼com| 国产精品美女久久久久久2018| 日韩欧美电影在线| 欧美一区二区三区电影| 欧美日韩免费一区二区三区| 99国产精品一区| 成人动漫一区二区三区| 国产麻豆成人精品| 国产乱码精品一区二区三区av| 日日噜噜夜夜狠狠视频欧美人 | 日韩毛片精品高清免费| 中文字幕乱码亚洲精品一区| 久久众筹精品私拍模特| 日韩欧美一区在线| 91精品国产91热久久久做人人| 欧美性色黄大片| 在线精品视频免费观看| 色婷婷久久久久swag精品| 99精品久久只有精品| 99视频有精品| 99久久婷婷国产综合精品电影| 成人亚洲精品久久久久软件| 国产精品亚洲成人| 成人午夜又粗又硬又大| 成人免费观看男女羞羞视频| 高清beeg欧美| av一区二区久久| 欧洲精品一区二区三区在线观看| 国产精品麻豆欧美日韩ww| 中文字幕乱码亚洲精品一区| 国产精品成人免费| 亚洲人成网站精品片在线观看| 国产精品成人在线观看| 亚洲男人的天堂av| 亚洲成av人片在线观看| 免费在线视频一区| 国产一区二区三区四| av不卡在线播放| 欧美最猛性xxxxx直播| 91精品免费在线观看| 精品国产免费一区二区三区四区 | 欧美美女一区二区| 日韩欧美高清一区| 中文字幕免费不卡| 午夜亚洲国产au精品一区二区| 久久精工是国产品牌吗| 成人97人人超碰人人99| 欧美日韩一区二区三区在线| 日韩一本二本av| 1区2区3区欧美| 日韩精品视频网| 国产成人精品免费网站| 色88888久久久久久影院野外| 777精品伊人久久久久大香线蕉| 久久综合色综合88| 一区二区三区中文字幕电影| 精品一区二区三区免费播放 | 国产精品18久久久久久vr| 99久久免费精品| 4hu四虎永久在线影院成人| 国产精品美女久久久久久久久久久| 亚洲一区在线视频| 国产不卡在线视频| 欧美日本不卡视频| 国产日韩在线不卡| 爽好多水快深点欧美视频| 成人免费毛片app| 日韩欧美的一区| 亚洲一区二区三区视频在线播放| 免费成人结看片| 91亚洲国产成人精品一区二区三| 日韩一区二区麻豆国产| 亚洲欧美日韩人成在线播放| 极品少妇xxxx精品少妇偷拍 | 午夜精品视频一区| av电影一区二区| 久久在线免费观看| 日本亚洲三级在线| 91首页免费视频| 国产欧美中文在线| 麻豆高清免费国产一区| 欧美一a一片一级一片| 国产精品视频观看| 国产一区二区三区在线观看免费视频 | 日韩欧美综合一区| 亚洲综合色丁香婷婷六月图片| 成人免费毛片app| 国产欧美日韩精品a在线观看| 青青草伊人久久| 欧美精品丝袜中出| 亚洲一区二区三区免费视频| 色八戒一区二区三区| 国产精品福利一区二区三区| 国产一区激情在线| 欧美精品一区在线观看| 人人狠狠综合久久亚洲| 7777精品伊人久久久大香线蕉超级流畅 | 欧美成人官网二区| 免费欧美高清视频| 日韩欧美激情四射| 麻豆freexxxx性91精品| 91精品福利在线一区二区三区|