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

隨筆 - 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久久| 亚洲精品女av网站| 久久精品国产91精品亚洲| 一本色道88久久加勒比精品| 久久久久成人精品| 国产综合色在线视频区| 日韩亚洲综合在线| 亚洲国产精品一区二区尤物区| 一本色道久久综合亚洲二区三区| 久久国产日本精品| 亚洲欧美日韩高清| 蜜臀a∨国产成人精品| 久久精品一区二区三区中文字幕| 欧美涩涩网站| 亚洲精品一区二区三区在线观看| 亚洲欧洲在线免费| 另类激情亚洲| 亚洲成人在线视频播放 | 一本久道久久综合婷婷鲸鱼| 夜夜躁日日躁狠狠久久88av| 欧美精品在欧美一区二区少妇| 亚洲高清不卡av| 99热在这里有精品免费| 欧美日韩中国免费专区在线看| 日韩亚洲欧美中文三级| 亚洲免费在线看| 国产一区二区三区四区三区四| 欧美在线播放视频| 欧美激情精品久久久| 亚洲裸体俱乐部裸体舞表演av| 欧美日本国产一区| 一区二区三区回区在观看免费视频| 亚洲直播在线一区| 国产亚洲午夜| 欧美69wwwcom| 亚洲午夜女主播在线直播| 久久大综合网| 亚洲人成免费| 国产精品欧美日韩久久| 久久精品女人| 亚洲最黄网站| 久热精品视频在线| 99re66热这里只有精品3直播 | 欧美一区二区在线| 91久久国产综合久久| 欧美午夜一区二区| 久久尤物电影视频在线观看| 亚洲精品资源美女情侣酒店| 久久成人精品| 一区二区av在线| 国产日韩在线视频| 欧美日韩www| 久久精品视频播放| 一本色道久久综合| 欧美国产视频在线| 欧美一区二区成人| 亚洲美女福利视频网站| 国产香蕉97碰碰久久人人| 欧美精品三级| 久久久.com| 亚洲——在线| 亚洲人成欧美中文字幕| 老牛国产精品一区的观看方式| 一区二区三区日韩精品| 亚洲大胆人体视频| 国产精品五月天| 欧美激情一区二区| 久久午夜精品| 欧美在线不卡| 亚洲一区精品电影| 日韩视频二区| 亚洲国产91| 美国成人直播| 久久久免费av| 欧美在线地址| 小处雏高清一区二区三区| 亚洲乱码国产乱码精品精| 亚洲国产成人久久综合| 狠狠v欧美v日韩v亚洲ⅴ| 国产精品一区二区a| 欧美三日本三级少妇三99| 欧美国内亚洲| 欧美承认网站| 欧美华人在线视频| 牛牛影视久久网| 牛牛精品成人免费视频| 免费亚洲电影在线| 嫩草国产精品入口| 免费日韩av| 欧美国产日韩一区二区在线观看| 久久一区二区三区av| 久久五月天婷婷| 美女视频黄免费的久久| 免费成人网www| 可以看av的网站久久看| 久久一区视频| 欧美成人中文字幕在线| 欧美久久久久免费| 欧美日韩在线一区二区| 欧美网站在线| 国产精品视频免费一区| 国产亚洲成av人在线观看导航| 国产伦精品一区二区三区视频孕妇| 国产精品爽黄69| 国内精品久久久久影院薰衣草| 国产一区二区视频在线观看| 影音先锋中文字幕一区二区| 亚洲国产精品成人精品| 亚洲精品永久免费| 亚洲性xxxx| 久久精品久久综合| 美日韩免费视频| 最新国产乱人伦偷精品免费网站| 亚洲精品久久久久久久久久久久久| 日韩网站在线观看| 午夜亚洲视频| 免播放器亚洲一区| 欧美天堂亚洲电影院在线观看| 国产免费成人在线视频| 伊甸园精品99久久久久久| 日韩视频免费在线| 午夜国产欧美理论在线播放| 久久青青草综合| 亚洲欧洲日韩综合二区| 亚洲一区在线观看视频| 久久久亚洲一区| 欧美日本国产在线| 国产午夜精品久久| 亚洲精选视频免费看| 午夜久久久久久| 欧美国产日本在线| 亚洲永久免费av| 欧美成人影音| 国产一区视频网站| 99re6这里只有精品| 久久久久国产精品www| 91久久久久| 久久精精品视频| 欧美三级电影网| 亚洲国产高清高潮精品美女| 午夜激情综合网| 亚洲电影中文字幕| 欧美一级午夜免费电影| 欧美日韩色综合| 亚洲国产美女久久久久 | 亚洲一区二区三区在线看 | 日韩一区二区精品视频| 久久久久国产精品一区| 国产精品久久777777毛茸茸| 亚洲欧洲精品一区二区| 久久狠狠久久综合桃花| 一本色道久久88综合日韩精品| 狂野欧美性猛交xxxx巴西| 国产嫩草影院久久久久| 一区二区三区日韩欧美精品| 欧美成人久久| 欧美中日韩免费视频| 国产精品成人观看视频免费| 亚洲美女电影在线| 欧美96在线丨欧| 欧美一区视频在线| 国产精品女同互慰在线看| 日韩视频中午一区| 欧美黄色免费网站| 久久精品免费看| 黑人巨大精品欧美黑白配亚洲| 欧美夜福利tv在线| 亚洲作爱视频| 欧美剧在线免费观看网站| 亚洲激情在线播放| 欧美韩日一区二区| 久久久久国产精品一区| 激情欧美一区二区| 久久综合色88| 久久婷婷影院| 亚洲高清视频在线观看| 免费久久99精品国产自在现线| 欧美在线亚洲| 激情视频亚洲| 免费不卡亚洲欧美| 久久综合久色欧美综合狠狠| 1024成人| 最新精品在线| 欧美日韩另类字幕中文| 亚洲一区二区在线播放| 亚洲校园激情| 国产日韩欧美在线播放不卡| 久久激情五月婷婷| 久久久美女艺术照精彩视频福利播放| 国内外成人免费激情在线视频网站| 久久精品一区蜜桃臀影院| 久久久久久网| 亚洲美女诱惑|