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

隨筆 - 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>
            久久久一本精品99久久精品66| 亚洲一区二区欧美| 欧美成人激情视频| 久热精品在线| 老司机一区二区| 另类尿喷潮videofree | 一本久道久久综合中文字幕| 99热这里只有成人精品国产| 欧美**字幕| 欧美国产亚洲另类动漫| 日韩午夜免费| 亚洲欧美在线另类| 久久久久.com| 亚洲第一页在线| 欧美国产视频一区二区| 亚洲视频精选在线| 亚洲中午字幕| 久久亚洲精品网站| 亚洲精品视频在线观看网站| 亚洲免费视频在线观看| 国产亚洲毛片| 亚洲激情在线播放| 亚洲一区二区久久| 久久免费黄色| 亚洲经典在线看| 这里只有精品丝袜| 久久美女性网| 国产精品久久久久久久久久妞妞| 久久全球大尺度高清视频| 亚洲精品一区二区三区99| 久久激情中文| 亚洲国产视频一区| 欧美一二三区精品| 欧美日韩亚洲一区二区三区在线观看 | 亚洲精品国产视频| 欧美区亚洲区| 亚洲欧美日韩天堂| 欧美国产日韩一区二区| 亚洲欧美久久久| 欧美成人中文| 亚洲综合欧美| 欧美日韩免费一区二区三区视频 | 亚洲高清不卡| 亚洲男女自偷自拍图片另类| 91久久综合| 亚洲欧美日韩国产成人| 一区二区三区久久精品| 1000部精品久久久久久久久| 国产精品日韩电影| 亚洲激情电影中文字幕| 精品成人一区二区三区四区| 国产精品一区二区三区四区五区| 欧美成ee人免费视频| 欧美在线视频网站| 国产精品久久久一区二区| 欧美日韩免费观看一区二区三区| 亚洲精品乱码久久久久久| 久久夜色精品亚洲噜噜国产mv| 香蕉久久精品日日躁夜夜躁| 亚洲一区二区在| 亚洲国产mv| 久久九九全国免费精品观看| 久久久久久久久久久久久女国产乱 | 欧美www在线| 尤物九九久久国产精品的特点| 国际精品欧美精品| 亚洲欧美综合网| 亚洲在线电影| 国产亚洲欧美一区二区三区| 红桃视频亚洲| 久久久噜噜噜久久久| 美女视频黄a大片欧美| 久久亚洲综合色一区二区三区| 久久精品首页| 欧美一级一区| 一区二区三区在线看| 亚洲激情啪啪| 欧美激情在线播放| 欧美电影在线观看完整版| 欧美日韩另类视频| 亚洲色图制服丝袜| 亚洲一区国产| 国内外成人在线| 久久久综合视频| 亚洲日本欧美| 99视频热这里只有精品免费| 一区二区三区精品在线| 午夜精品久久久久久久| 久久精品视频在线看| 欧美不卡高清| 一本综合精品| 欧美亚洲一区| 最新国产乱人伦偷精品免费网站| 亚洲视频欧美在线| 亚洲图片欧美日产| 蜜桃久久av一区| 亚洲美女av在线播放| 欧美在线二区| 久久免费少妇高潮久久精品99| 欧美激情一区二区三级高清视频 | 亚洲一区二区动漫| 国产一区二区三区在线观看免费视频| 另类图片综合电影| 国产精品久久久久9999高清| 黑人巨大精品欧美黑白配亚洲 | 亚洲免费在线观看视频| 久久久人成影片一区二区三区观看| 欧美第一黄色网| 欧美日韩亚洲三区| 噜噜噜久久亚洲精品国产品小说| 亚洲天堂第二页| 激情婷婷亚洲| 亚洲一区二区在线视频| 国产精品福利影院| 欧美成人三级在线| 国产精品一区在线观看| 亚洲午夜一二三区视频| 亚洲国产精品一区二区第四页av | 亚洲区在线播放| 亚洲网站视频福利| 亚洲欧洲一区二区三区在线观看| 久久疯狂做爰流白浆xx| 日韩亚洲精品在线| 一区二区三区在线看| 久久久久久夜| 欧美日韩1234| 欧美成人国产一区二区 | 欧美三级视频在线播放| 亚洲电影视频在线| 亚洲天堂激情| 亚洲理论在线| 亚洲午夜精品| 亚洲影院污污.| 亚洲午夜女主播在线直播| 亚洲国产裸拍裸体视频在线观看乱了中文 | 海角社区69精品视频| 亚洲精品一品区二品区三品区| 亚洲综合导航| 麻豆精品一区二区综合av | 亚洲国产清纯| 国产亚洲精品久久久久动| 欧美亚洲日本国产| 欧美福利专区| 欧美大片在线观看一区| 99精品国产在热久久下载| 欧美xart系列高清| 久久男人资源视频| 国产欧美一区二区三区沐欲| 性欧美办公室18xxxxhd| 夜夜嗨av一区二区三区免费区| 欧美国产日产韩国视频| 亚洲美女色禁图| 久久九九免费| 一区二区精品国产| 欧美国产日本| 亚洲三级影院| 欧美午夜宅男影院在线观看| 欧美精品国产精品日韩精品| 国产一区二区看久久| 欧美在线看片| 国产精品尤物| 午夜精品美女自拍福到在线 | 性欧美暴力猛交另类hd| 国产老女人精品毛片久久| 午夜在线成人av| 国产精品草莓在线免费观看| 亚欧成人在线| 欧美激情欧美狂野欧美精品| 99在线热播精品免费99热| 亚洲精品久久久久久久久久久久久| 亚洲欧美不卡| 欧美一区二区在线看| 久久久久久网站| 久久精品国内一区二区三区| 久久精品国产久精国产爱| 亚洲电影免费观看高清| 亚洲欧洲三级| 亚洲视频网站在线观看| 亚洲淫性视频| 亚洲视频二区| 欧美日韩国语| 亚洲国产精品高清久久久| 国产精品综合色区在线观看| 国产精品久久久久久福利一牛影视| 亚洲精品在线二区| 新67194成人永久网站| 亚洲精选一区二区| 欧美日韩成人免费| 亚洲精选久久| 久久一综合视频| 亚洲精品之草原avav久久| 日韩一级二级三级| 欧美有码在线观看视频| 久久精品国产免费看久久精品| 亚洲精品自在久久| 国产精品日韩| 母乳一区在线观看| 91久久久精品| 亚洲国产经典视频| 久久精品亚洲一区二区三区浴池|