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

隨筆 - 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 閱讀(2086) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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精品国产亚洲性色| 久久伊人亚洲| 亚洲图片在线| 国产精品极品美女粉嫩高清在线 | 又紧又大又爽精品一区二区| 久久亚洲精品伦理| 免费成人网www| 99re热精品| 亚洲午夜视频在线观看| 国产私拍一区| 男人插女人欧美| 欧美日韩少妇| 久久久久99| 男女精品视频| 性xx色xx综合久久久xx| 欧美专区在线播放| 亚洲另类一区二区| 亚洲午夜久久久久久久久电影网| 国产视频欧美| 亚洲国产人成综合网站| 欧美性jizz18性欧美| 久久精品99| 欧美精品电影在线| 久久精品卡一| 欧美三级中文字幕在线观看| 久久精品视频va| 欧美精品午夜视频| 久久国产精品一区二区三区| 欧美成人日本| 欧美影视一区| 欧美日韩高清在线观看| 久久久久久有精品国产| 欧美伦理在线观看| 久久夜色精品亚洲噜噜国产mv| 欧美精品在线一区二区| 久久免费精品视频| 国产精品福利在线观看网址| 欧美不卡在线视频| 国产精品视频最多的网站| 亚洲国产精品久久久久秋霞不卡| 国产精品无码永久免费888| 亚洲激情第一区| 激情91久久| 亚洲一区精彩视频| 99在线|亚洲一区二区| 久久婷婷丁香| 久久久精品国产免大香伊 | 亚洲影院免费观看| 亚洲免费av电影| 久久永久免费| 久久久www成人免费无遮挡大片| 欧美日韩精品一本二本三本| 亚洲国产精品123| 韩国v欧美v日本v亚洲v| 亚洲在线观看免费视频| 亚洲午夜精品在线| 欧美剧在线免费观看网站| 欧美成人国产一区二区| 黄色免费成人| 久久国产天堂福利天堂| 久久国产精品免费一区| 国产精品久久久久三级| 在线视频欧美日韩精品| 亚洲少妇诱惑| 国产精品porn| 亚洲视频在线观看免费| 午夜欧美大尺度福利影院在线看 | 久久国产精品久久久久久电车| 亚洲免费一在线| 国产精品海角社区在线观看| 一区二区激情| 亚洲欧美日韩视频一区| 国产精品日韩专区| 香蕉av福利精品导航| 久久精品国产综合| ●精品国产综合乱码久久久久| 久久久久国产精品人| 欧美成人精品1314www| 最新成人av在线| 欧美日产在线观看| 在线亚洲观看| 久久成人国产| 亚洲成人直播| 欧美成人首页| 亚洲系列中文字幕| 久久人人97超碰精品888| 怡红院精品视频在线观看极品| 久久午夜激情| 日韩视频免费在线| 欧美一区二区三区在线播放| 国语自产在线不卡| 欧美精品成人| 亚洲欧美精品伊人久久| 欧美xart系列高清| 一区二区三区黄色| 国产亚洲精品激情久久| 模特精品在线| 亚洲欧美日韩精品一区二区| 麻豆91精品| 亚洲一区3d动漫同人无遮挡| 国产欧美综合一区二区三区| 蜜臀va亚洲va欧美va天堂| 亚洲毛片一区| 久久伊人一区二区| 亚洲一区二区少妇| 在线免费观看成人网| 欧美性猛交99久久久久99按摩| 欧美夜福利tv在线| 亚洲精品视频一区| 久热re这里精品视频在线6| 一区二区三区日韩精品视频| 国产香蕉97碰碰久久人人| 欧美激情欧美激情在线五月| 亚洲欧美一区二区激情| 91久久国产自产拍夜夜嗨| 欧美中文字幕精品| 99re热这里只有精品视频 | 欧美福利电影在线观看| 亚洲嫩草精品久久| 亚洲精品欧美日韩专区| 美玉足脚交一区二区三区图片| 亚洲一区二区在线播放| 亚洲精品国产精品乱码不99按摩 | 国产农村妇女毛片精品久久莱园子 | 亚洲国产裸拍裸体视频在线观看乱了中文 | 国产精品一区二区久久久| 免费短视频成人日韩| 性8sex亚洲区入口| 亚洲综合精品| 一本色道久久综合狠狠躁的推荐| 欧美黑人多人双交| 久久精品亚洲一区二区三区浴池| 亚洲永久免费av| 日韩视频中文字幕| 亚洲精品一区二区在线观看| 在线观看亚洲视频| 狠狠色丁香婷综合久久| 国产一区二区三区免费观看| 国产精品永久在线| 国产精品日韩欧美一区二区三区| 欧美日韩理论| 欧美日本高清| 欧美色大人视频| 欧美午夜免费影院| 国产精品久久久久久av福利软件| 欧美日韩国产精品成人| 欧美伦理在线观看| 欧美日韩免费观看中文| 欧美日韩精品一区二区三区四区 | 欧美jizz19性欧美| 欧美91大片| 欧美巨乳在线观看| 国产精品扒开腿做爽爽爽软件| 欧美视频一区在线观看| 国产精品日本精品| 国产综合色一区二区三区| 精品91在线| 亚洲人午夜精品免费| 在线综合亚洲欧美在线视频| 亚洲色图自拍| 欧美影院视频| 欧美成人午夜激情| 最新国产乱人伦偷精品免费网站 | 亚洲伦理中文字幕| 亚洲你懂的在线视频| 久久精品国产亚洲aⅴ| 老**午夜毛片一区二区三区| 欧美激情偷拍| 国产精品日韩欧美| 136国产福利精品导航| 亚洲人成亚洲人成在线观看图片| 一区二区三区精密机械公司| 性高湖久久久久久久久| 另类图片综合电影| 亚洲精品欧美日韩专区| 亚洲免费一区二区| 欧美1区3d| 国产日韩三区| 亚洲理伦电影| 久久精品欧洲| 亚洲精品一级| 久久精品亚洲一区| 欧美日韩亚洲视频| 在线观看视频亚洲| 亚洲欧美日韩精品在线| 亚洲大片av| 性刺激综合网| 欧美日韩一区三区| 亚洲国产精品热久久| 欧美一区二区视频在线观看2020| 欧美黑人国产人伦爽爽爽| 亚洲自拍偷拍网址| 欧美日韩成人综合天天影院| 国产综合视频| 午夜精品福利一区二区蜜股av| 欧美黄色免费| 久久九九99视频| 国产午夜精品全部视频在线播放 | 国产精品一区免费观看| 亚洲精品日韩激情在线电影|