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

隨筆 - 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>
            亚洲国产一区二区三区高清| 亚洲电影在线看| 亚洲午夜免费福利视频| 欧美日韩国产综合新一区| 日韩写真在线| 日韩视频在线一区二区三区| 国产精品福利在线观看网址| 欧美一区二视频在线免费观看| 亚洲欧美日韩视频二区| 在线精品亚洲一区二区| 亚洲国产岛国毛片在线| 国产精品久久久久久久久搜平片 | 在线看日韩av| 亚洲电影一级黄| 欧美日韩中文精品| 久久深夜福利| 欧美精品在线免费| 久久精品色图| 欧美精品一区二区蜜臀亚洲| 午夜亚洲福利在线老司机| 久久国产精品99久久久久久老狼 | 亚洲久久一区| 亚洲一区二区3| 亚洲高清免费| 亚洲午夜视频在线观看| 亚洲成人在线视频网站| 99视频超级精品| 亚洲国产精品va在看黑人| 亚洲美女91| 在线观看一区视频| 亚洲午夜久久久久久久久电影网| 伊人成综合网伊人222| 一区二区三区日韩在线观看| 伊人久久婷婷色综合98网| 中文日韩在线| 日韩视频在线一区| 久久精品亚洲热| 久久se精品一区精品二区| 欧美日韩八区| 欧美成人免费播放| 国产在线欧美日韩| 亚洲视频一二区| av不卡在线看| 欧美电影免费观看大全| 狼人天天伊人久久| 国产日韩在线一区| 在线天堂一区av电影| 亚洲精品乱码| 狂野欧美激情性xxxx| 久久成人精品| 国产精品免费观看视频| 99亚洲一区二区| 99精品视频一区| 欧美黄污视频| 亚洲国产综合91精品麻豆| **性色生活片久久毛片| 久久精品水蜜桃av综合天堂| 欧美在线播放一区| 国产精品综合| 亚洲欧美日韩一区二区三区在线| 亚洲一区二区在线看| 欧美日韩一区在线视频| 亚洲精一区二区三区| 99精品国产福利在线观看免费 | 一区二区三区欧美| 99精品视频一区| 欧美日韩成人综合| 亚洲精品在线观看免费| 亚洲裸体俱乐部裸体舞表演av| 美女啪啪无遮挡免费久久网站| 免费一级欧美在线大片| 在线观看亚洲a| 欧美mv日韩mv亚洲| 99精品视频一区二区三区| 亚洲一区成人| 国产午夜精品久久久久久免费视| 欧美一区二区黄| 久久综合五月天婷婷伊人| 亚洲二区在线观看| 欧美精品在线免费观看| 亚洲特色特黄| 久久嫩草精品久久久精品| 亚洲观看高清完整版在线观看| 欧美电影在线观看完整版| 亚洲人成网站999久久久综合| 亚洲婷婷综合久久一本伊一区| 国产精品欧美一区喷水| 午夜精品美女自拍福到在线| 久热精品视频| 在线亚洲高清视频| 国产一区二区久久| 美女网站在线免费欧美精品| 日韩一级黄色av| 久久久91精品国产| 亚洲日本中文字幕| 国产欧美精品va在线观看| 久久亚洲精品网站| 一本色道久久加勒比88综合| 久久精品成人| 99伊人成综合| 一区二区三区在线视频观看| 欧美精品尤物在线| 久久精品亚洲一区| 在线视频中文亚洲| 欧美国产一区视频在线观看| 亚洲欧洲av一区二区| 亚洲激情视频网| 国产网站欧美日韩免费精品在线观看| 欧美**人妖| 欧美一区二区三区在线| 日韩视频在线永久播放| 狂野欧美激情性xxxx欧美| 亚洲综合电影| 日韩视频免费在线| 加勒比av一区二区| 国产精品三级久久久久久电影| 欧美成人影音| 久久久免费av| 亚洲欧美日韩在线不卡| 夜夜嗨av一区二区三区| 欧美激情视频网站| 久久免费黄色| 欧美在线看片a免费观看| 一区二区三区日韩欧美| 亚洲激情黄色| 亚洲国产婷婷香蕉久久久久久99| 国产午夜精品久久| 国产伦精品一区二区三区在线观看| 欧美精品麻豆| 欧美成人免费全部| 噜噜噜91成人网| 久久夜色撩人精品| 久久久国产精品一区二区三区| 亚洲午夜一区| 在线亚洲精品| 在线亚洲欧美| 亚洲香蕉成视频在线观看| 一本色道久久综合精品竹菊| 亚洲精品一区二区三区四区高清| 欧美激情中文不卡| 欧美国产日本在线| 欧美激情片在线观看| 欧美jizzhd精品欧美巨大免费| 久久午夜av| 麻豆精品一区二区av白丝在线| 久久亚洲风情| 女仆av观看一区| 亚洲激情一区| 日韩亚洲欧美成人一区| 亚洲午夜久久久| 欧美一区二区日韩| 久久国产一区| 麻豆精品视频| 欧美日韩高清在线播放| 欧美午夜性色大片在线观看| 国产精品成人在线| 国产午夜精品美女毛片视频| 韩日成人在线| 亚洲精品国产系列| 亚洲一区二区三区四区中文| 午夜精品久久久久影视| 久久精品国产久精国产一老狼| 久久这里只精品最新地址| 嫩草国产精品入口| 亚洲精品日韩欧美| 亚洲欧美日韩成人| 久久影院午夜论| 欧美日本中文| 国产午夜精品全部视频在线播放| 亚洲福利视频网站| 亚洲午夜精品久久久久久app| 欧美一区网站| 亚洲国产一二三| 亚洲综合大片69999| 每日更新成人在线视频| 欧美性开放视频| 黄色亚洲在线| 中文在线不卡视频| 久热精品视频| 亚洲伊人观看| 欧美高潮视频| 国内激情久久| 亚洲一区国产一区| 免费一级欧美片在线观看| 一区二区三区不卡视频在线观看 | 久久综合色一综合色88| 欧美午夜精品理论片a级按摩| 一区二区视频在线观看| 亚洲性图久久| 亚洲国产日韩美| 久久精品一区二区三区四区| 欧美午夜免费| 亚洲日产国产精品| 久久影院午夜论| 亚洲淫性视频| 欧美日韩国产天堂| 91久久精品视频| 美脚丝袜一区二区三区在线观看 | 欧美成人激情视频| 午夜精彩视频在线观看不卡|