青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 16, 文章 - 0, 評論 - 55, 引用 - 0
數據加載中……

在windows下,當FLTK界面上包含中文的時候啟動速度很慢,以下為修正過程

問題描述:
在windows下,當FLTK界面包含中文的時候,打開程序的時候會花費好幾秒的時間才能完整顯示界面

原因:
查了代碼,最后發現原因在于繪制字符的時候通過GetTextExtentPoint32W這個函數獲取字符寬度,由于這個函數本身速度不夠快,所以FLTK使用緩存方式來保存寬度,問題在于緩存的方式不適合中文這種寬字符,當前的緩存方式是每當獲取一個字符寬度時,把這個字符左右共1024個相鄰字符的寬度提前獲取并保存,以后每次獲取字符寬度之前先搜索緩存,如果沒有再通過API實際獲取。

這個做法對于英文沒有問題,因為GetTextExtentPoint32W處理英文的速度很快,而且一次獲取1024個相鄰字符基本就把程序可能會用到的字符全部囊括了,但是當界面出現中文的時候這種做法就出現問題了,中文的字符集是很大的,一次獲取相鄰個1024字符寬度并不能保證囊括了絕大多數的字符,所以每次界面顯示之前都會花很多時間獲取很多用不到的字符寬度,雖然顯示一次之后的速度很快,但是啟動程序的時候會出現卡頓

所以我做了修正,每當需要獲取字符寬度的時候只保存當前字符的寬度,不獲取相鄰字符的寬度,這樣就避免了問題

修正代碼:
一共修改2個文件,當前修改的是FLTK3,如果要修改FLTK1.3.X,只要找到對應的代碼即可
src/fltk3/font.h (fltk1.3.X對應的文件是src/fl_font.h)
class Fl_Font_Descriptor {
public:
  ...
#  ifdef WIN32
  HFONT fid;
  int *width[64];
  unsigned char *widthcached[64]; // 0-not cache, 1-cached //這里增加定義
...
};

src/fltk3/win32_font.cxx(fltk1.3.X對應的文件是src/fl_font_win32.cxx)
Fl_Font_Descriptor::Fl_Font_Descriptor(const char* name, fltk3::Fontsize fsize)
{
   ...
    int i;
    for (i = 0; i < 64; i++) {
        width[i] = NULL;
        widthcached[i] = NULL; // 這里增加
    }
  ...
}

Fl_Font_Descriptor::~Fl_Font_Descriptor()
{
  ...
    int i;
    for (i = 0; i < 64; i++) {
        if ( width[i] != NULL ) free(width[i]);
        if ( widthcached[i] != NULL ) free(widthcached[i]); // 這里增加
    }
}
double fltk3::GDIGraphicsDriver::width(unsigned int c) // 修改主體就是這個方法,具體代碼如下
{
    Fl_Font_Descriptor *fontsize = font_descriptor();
    unsigned int r;
    SIZE s;
    // Special Case Handling of Unicode points over U+FFFF.
    // The logic (below) computes a lookup table for char widths
    // on-the-fly, but the table only covers codepoints up to
    // U+FFFF, which covers the basic multilingual plane, but
    // not any higher plane, or glyphs that require surrogate-pairs
    // to encode them in WinXX, which is UTF16.
    // This code assumes that these glyphs are rarely used and simply
    // measures them explicitly if they occur - This will be slow...
    if(c > 0x0000FFFF) { // UTF16 surrogate pair is needed
        if (!fl_gc) { // We have no valid gc, so nothing to measure - bail out
            return 0.0;
        }
        int cc; // cell count
        unsigned short u16[4]; // Array for UTF16 representation of c
        // Creates a UTF16 string from a UCS code point.
        cc = fltk3::ucs_to_Utf16(c, u16, 4);
        // Make sure the current font is selected before we make the measurement
        SelectObject(fl_gc, fontsize->fid);
        // measure the glyph width
        GetTextExtentPoint32W(fl_gc, (WCHAR*)u16, cc, &s);
        return (double)s.cx;
    }
    // else - this falls through to the lookup-table for glyph widths
    // in the basic multilingual plane
    r = (c & 0xFC00) >> 10;
    unsigned short ii;
    HDC gc;
    HWND hWnd;
    if (!fontsize->width[r]) {
        fontsize->width[r] = (int*) malloc(sizeof(int) * 0x0400);
        fontsize->widthcached[r] = (unsigned char *)malloc(sizeof(unsigned char) * 0x0400);
        for (int k=0; k<0x0400; k++) fontsize->widthcached[r][k] = 0;
        ii = r * 0x400;
        // The following code makes a best effort attempt to obtain a valid fl_gc.
        // If no fl_gc is available at the time we call fltk3::width(), then we first
        // try to obtain a gc from the first fltk window.
        // If that is null then we attempt to obtain the gc from the current screen
        // using (GetDC(NULL)).
        // This should resolve STR #2086
        gc = fl_gc;
        hWnd = 0;
        if (!gc) { // We have no valid gc, try and obtain one
            // Use our first fltk window, or fallback to using the screen via GetDC(NULL)
            hWnd = fltk3::first_window() ? fl_xid(fltk3::first_window()) : NULL;
            gc = GetDC(hWnd);
        }
        if (!gc) fltk3::fatal("Invalid graphic context: fltk3::width() failed because no valid HDC was found!");
        SelectObject(gc, fontsize->fid);
        ii += c &0x03FF;
        GetTextExtentPoint32W(gc, (WCHAR*)&ii, 1, &s);
        fontsize->width[r][c&0x03FF] = s.cx;
        fontsize->widthcached[r][c&0x03FF] = 1;
        if (gc && gc!=fl_gc) ReleaseDC(hWnd, gc);
        //printf("[%d,%X]\n", s.cx, c);
    } else {
        if ( fontsize->widthcached[r][c&0x03FF] == 1 ) return (double) fontsize->width[r][c & 0x03FF];
        ii = r * 0x400;
        gc = fl_gc;
        hWnd = 0;
        if (!gc) { // We have no valid gc, try and obtain one
            // Use our first fltk window, or fallback to using the screen via GetDC(NULL)
            hWnd = fltk3::first_window() ? fl_xid(fltk3::first_window()) : NULL;
            gc = GetDC(hWnd);
        }
        if (!gc) fltk3::fatal("Invalid graphic context: fltk3::width() failed because no valid HDC was found!");
        SelectObject(gc, fontsize->fid);
        ii += c &0x03FF;
        GetTextExtentPoint32W(gc, (WCHAR*)&ii, 1, &s);
        fontsize->width[r][c&0x03FF] = s.cx;
        fontsize->widthcached[r][c&0x03FF] = 1;
        if (gc && gc!=fl_gc) ReleaseDC(hWnd, gc);
        //printf("[%d,%X]\n", s.cx, c);
    }
    return (double) fontsize->width[r][c & 0x03FF];
}

posted on 2014-04-29 17:28 cyantree 閱讀(2079) 評論(0)  編輯 收藏 引用

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲国产精品福利| 欧美成人dvd在线视频| 日韩视频三区| 欧美性片在线观看| 亚洲欧美日韩综合aⅴ视频| 亚洲午夜久久久| 国产亚洲福利一区| 开心色5月久久精品| 欧美成人激情视频免费观看| 9l国产精品久久久久麻豆| 一本色道久久综合亚洲精品不| 国产精品人人做人人爽| 久久久久在线观看| 嫩草成人www欧美| 亚洲欧美日韩在线不卡| 久久久久久久久综合| 在线性视频日韩欧美| 亚洲女爱视频在线| 亚洲精品欧美日韩| 亚洲综合精品四区| 最新国产精品拍自在线播放| 亚洲午夜激情| 亚洲日本国产| 欧美一级久久| 亚洲视频日本| 久久一区精品| 久久精品成人| 欧美视频精品在线| 欧美成人亚洲成人| 国产伦精品一区二区三区照片91 | 老司机精品导航| 欧美日韩成人免费| 免费高清在线视频一区·| 欧美午夜大胆人体| 亚洲高清一区二| 黑人巨大精品欧美黑白配亚洲| 亚洲精选在线| 亚洲区一区二区三区| 欧美怡红院视频| 亚洲欧美日韩专区| 欧美精品在线一区二区三区| 久久尤物视频| 国产日韩欧美综合| 一区二区国产精品| 亚洲久久视频| 欧美va天堂| 欧美成人午夜剧场免费观看| 国产亚洲视频在线观看| 亚洲一区二区三区精品在线| 中文欧美日韩| 欧美日韩精品二区| 亚洲精品偷拍| 99国产精品| 欧美另类人妖| 日韩午夜免费| 亚洲无限av看| 国产精品大全| 亚洲一级在线| 欧美一级电影久久| 国产乱码精品一区二区三区av| 一区二区三区国产精品| 亚洲一区在线播放| 国产精品狼人久久影院观看方式| 日韩一级黄色av| 亚洲欧美一区二区三区在线| 国产精品二区二区三区| 亚洲摸下面视频| 久久国产乱子精品免费女| 国产模特精品视频久久久久| 性欧美大战久久久久久久久| 久久久激情视频| 黄色精品一区二区| 乱中年女人伦av一区二区| 亚洲国产成人久久综合| 一区二区三区精品国产| 欧美日韩小视频| 午夜精品视频| 欧美在线网站| 亚洲精品视频在线观看免费| 久久国产精品电影| 久久九九99视频| 国产一区欧美| 欧美chengren| 中文精品99久久国产香蕉| 久久成人一区| 在线观看亚洲a| 欧美精品一区二区在线播放| 亚洲一卡久久| 欧美不卡高清| 亚洲影视在线| 黄色成人在线网站| 亚洲综合欧美日韩| 激情文学综合丁香| 欧美日韩成人综合天天影院| 亚洲高清视频的网址| 欧美高清在线精品一区| 亚洲午夜成aⅴ人片| 久久综合中文字幕| 亚洲一区二区三区精品在线观看| 国产九区一区在线| 欧美精品一区二区三区高清aⅴ| 亚洲香蕉伊综合在人在线视看| 快播亚洲色图| 亚洲欧美中文另类| 亚洲经典在线看| 国产精品影院在线观看| 欧美大尺度在线观看| 先锋影音国产精品| 99精品免费| 欧美激情精品久久久久| 欧美一级视频精品观看| 99这里有精品| 亚洲国产裸拍裸体视频在线观看乱了中文 | 亚洲精品乱码| 国外精品视频| 国产精品一区二区在线观看不卡 | 亚洲视频网站在线观看| 欧美国产欧美亚州国产日韩mv天天看完整| 亚洲午夜黄色| 日韩午夜av在线| 在线观看亚洲| 国语精品一区| 国产日韩视频| 国产麻豆精品theporn| 欧美午夜精品理论片a级按摩| 欧美国产精品中文字幕| 久久久视频精品| 欧美一区二区三区久久精品茉莉花 | 欧美激情第4页| 久久阴道视频| 久久精品中文字幕一区| 欧美一区二区三区免费视频| 亚洲午夜免费视频| 国产精品99久久久久久人| 亚洲精品美女久久7777777| 在线看不卡av| 亚洲丰满少妇videoshd| 精品不卡一区| 在线高清一区| 91久久精品国产91性色| 亚洲国产欧美一区二区三区久久| 在线免费观看成人网| 伊人成人开心激情综合网| 狠狠综合久久av一区二区老牛| 国产一区二区三区日韩| 国产自产在线视频一区| 一区二区三区在线高清| 在线免费高清一区二区三区| 亚洲国产精品传媒在线观看 | 国产一区亚洲| 一区二区亚洲精品国产| 亚洲第一黄色网| 亚洲伦理中文字幕| 亚洲图片欧洲图片av| 亚洲资源av| 欧美一区二区黄色| 美女黄毛**国产精品啪啪 | 亚洲视频一区在线| 性色av一区二区三区红粉影视| 欧美在线视频不卡| 女同一区二区| 日韩视频不卡中文| 性做久久久久久久免费看| 久久久久国产精品www| 欧美freesex8一10精品| 欧美午夜精品久久久久久浪潮| 国产欧美日本在线| 亚洲福利视频在线| 亚洲午夜一级| 久久婷婷综合激情| 亚洲人精品午夜在线观看| 亚洲一区综合| 开元免费观看欧美电视剧网站| 欧美日韩精品免费在线观看视频| 国产精品欧美日韩久久| 在线精品亚洲| 午夜精品久久久久久99热| 蜜臀av在线播放一区二区三区| 亚洲精品国产精品国自产观看| 午夜精品亚洲| 欧美日韩a区| 黄色成人在线网站| 亚洲一区二区三区在线播放| 老司机一区二区| 亚洲午夜精品久久久久久app| 久热成人在线视频| 国产精品视频观看| aa日韩免费精品视频一| 久久综合国产精品| 亚洲一区二区三区欧美| 欧美电影免费观看大全| 国产一区二区三区精品久久久| 在线一区观看| 亚洲国产高清高潮精品美女| 欧美一区高清| 国产精品视频久久久| 国产精品99久久久久久久vr| 欧美激情性爽国产精品17p| 欧美影院精品一区| 国产精品欧美久久久久无广告|