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

隨筆 - 16, 文章 - 0, 評(píng)論 - 55, 引用 - 0
數(shù)據(jù)加載中……

在windows下,當(dāng)FLTK界面上包含中文的時(shí)候啟動(dòng)速度很慢,以下為修正過(guò)程

問(wèn)題描述:
在windows下,當(dāng)FLTK界面包含中文的時(shí)候,打開(kāi)程序的時(shí)候會(huì)花費(fèi)好幾秒的時(shí)間才能完整顯示界面

原因:
查了代碼,最后發(fā)現(xiàn)原因在于繪制字符的時(shí)候通過(guò)GetTextExtentPoint32W這個(gè)函數(shù)獲取字符寬度,由于這個(gè)函數(shù)本身速度不夠快,所以FLTK使用緩存方式來(lái)保存寬度,問(wèn)題在于緩存的方式不適合中文這種寬字符,當(dāng)前的緩存方式是每當(dāng)獲取一個(gè)字符寬度時(shí),把這個(gè)字符左右共1024個(gè)相鄰字符的寬度提前獲取并保存,以后每次獲取字符寬度之前先搜索緩存,如果沒(méi)有再通過(guò)API實(shí)際獲取。

這個(gè)做法對(duì)于英文沒(méi)有問(wèn)題,因?yàn)镚etTextExtentPoint32W處理英文的速度很快,而且一次獲取1024個(gè)相鄰字符基本就把程序可能會(huì)用到的字符全部囊括了,但是當(dāng)界面出現(xiàn)中文的時(shí)候這種做法就出現(xiàn)問(wèn)題了,中文的字符集是很大的,一次獲取相鄰個(gè)1024字符寬度并不能保證囊括了絕大多數(shù)的字符,所以每次界面顯示之前都會(huì)花很多時(shí)間獲取很多用不到的字符寬度,雖然顯示一次之后的速度很快,但是啟動(dòng)程序的時(shí)候會(huì)出現(xiàn)卡頓

所以我做了修正,每當(dāng)需要獲取字符寬度的時(shí)候只保存當(dāng)前字符的寬度,不獲取相鄰字符的寬度,這樣就避免了問(wèn)題

修正代碼:
一共修改2個(gè)文件,當(dāng)前修改的是FLTK3,如果要修改FLTK1.3.X,只要找到對(duì)應(yīng)的代碼即可
src/fltk3/font.h (fltk1.3.X對(duì)應(yīng)的文件是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對(duì)應(yīng)的文件是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) // 修改主體就是這個(gè)方法,具體代碼如下
{
    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 閱讀(2088) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   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>
            激情综合激情| 亚洲欧洲精品一区二区三区| 一区二区三区四区在线| 亚洲全部视频| 欧美日韩亚洲一区二| 夜夜嗨av一区二区三区网页| 日韩一区二区免费看| 欧美午夜不卡影院在线观看完整版免费 | 亚洲欧洲中文日韩久久av乱码| 欧美v亚洲v综合ⅴ国产v| 老司机亚洲精品| 日韩特黄影片| 亚洲在线观看免费视频| 韩国美女久久| 亚洲人成亚洲人成在线观看| 欧美视频中文一区二区三区在线观看 | 久久精品国产亚洲a| 在线播放日韩专区| 亚洲乱码国产乱码精品精98午夜| 国产精品久久国产三级国电话系列| 欧美一区二区三区精品电影| 久久免费视频一区| 亚洲永久精品国产| 久久亚洲一区二区三区四区| 在线亚洲一区二区| 久久久久九九九九| 亚洲一区二区三区在线视频| 久久久av毛片精品| 亚洲欧美制服另类日韩| 免费在线观看一区二区| 欧美在线播放一区| 欧美日本高清| 免费永久网站黄欧美| 欧美三级黄美女| 蜜桃久久精品一区二区| 国产精品日韩欧美| 亚洲精品乱码| 亚洲第一毛片| 午夜日韩在线| 亚洲欧美一区二区原创| 欧美福利在线观看| 久久久美女艺术照精彩视频福利播放| 欧美国产一区二区在线观看| 久久久久久久久久久久久女国产乱 | 午夜欧美电影在线观看| 一区二区三区三区在线| 美女黄网久久| 久久久久久久久久久成人| 欧美日韩视频不卡| 亚洲高清不卡一区| 亚洲电影专区| 久久久青草青青国产亚洲免观| 欧美亚洲一级| 欧美在线视频免费播放| 欧美精品国产精品| 亚洲高清激情| 亚洲破处大片| 欧美jizzhd精品欧美喷水 | 亚洲国产一二三| 欧美在线视频网站| 久久久福利视频| 国产午夜精品麻豆| 欧美一区高清| 久久夜色精品国产| 精品69视频一区二区三区| 香蕉视频成人在线观看 | 亚洲精品久久视频| 免费人成网站在线观看欧美高清| 久久综合久色欧美综合狠狠| 国产一区二区精品丝袜| 性欧美xxxx大乳国产app| 欧美在线三区| 狠狠做深爱婷婷久久综合一区| 欧美亚洲在线播放| 久久综合色天天久久综合图片| 国产字幕视频一区二区| 久久久久久久尹人综合网亚洲| 久久久蜜臀国产一区二区| 黄色在线一区| 欧美黄色成人网| 9i看片成人免费高清| 亚洲一区二区在线免费观看视频| 国产精品你懂的| 欧美在线二区| 欧美电影打屁股sp| 99国产精品| 国产欧美一二三区| 久久人91精品久久久久久不卡| 欧美电影免费网站| 亚洲天堂av综合网| 国产偷久久久精品专区| 久久久久久久网| 亚洲人成网在线播放| 亚洲欧美美女| 亚洲福利视频网站| 欧美午夜在线一二页| 亚洲欧美在线网| 亚洲高清视频在线| 香蕉久久夜色精品国产| 影音先锋欧美精品| 国产精品99免视看9| 久久九九国产精品怡红院| 最新日韩av| 久久久国产视频91| 亚洲视频高清| 激情婷婷久久| 国产精品嫩草影院一区二区 | 亚洲国产小视频在线观看| 亚洲一区综合| 亚洲精品免费网站| 国产日韩欧美另类| 欧美日韩国产一区二区三区| 欧美在线一区二区| 夜夜嗨av一区二区三区中文字幕 | 亚洲性视频网站| 欧美激情1区2区3区| 香蕉久久国产| 一区二区三区四区蜜桃| 一区二区三区在线高清| 国产精品成人一区| 欧美另类在线播放| 看片网站欧美日韩| 欧美一级理论性理论a| 一本久道久久综合婷婷鲸鱼| 欧美激情一区二区三区成人| 久久九九99视频| 午夜一级在线看亚洲| 一区二区三区视频在线播放| 亚洲第一区色| 黄色一区二区在线| 国产欧美一区二区三区国产幕精品| 欧美精品在线视频观看| 蜜臀av在线播放一区二区三区| 欧美亚洲免费在线| 午夜国产精品视频| 亚洲一区二区视频| 亚洲在线不卡| 午夜精品99久久免费| 在线一区日本视频| 在线视频亚洲| 亚洲一区二区三区久久| 亚洲午夜视频在线观看| 这里只有视频精品| 亚洲图片激情小说| 亚洲在线视频观看| 午夜一级久久| 久久精精品视频| 久久久久99| 美乳少妇欧美精品| 欧美成人一二三| 欧美精品aa| 欧美午夜美女看片| 国产精品永久免费视频| 国产欧美日韩综合一区在线观看 | 欧美日韩在线不卡| 国产精品99一区二区| 国产精品欧美日韩久久| 国产麻豆91精品| 一区二区三区在线视频免费观看 | 国产亚洲成av人在线观看导航 | 欧美性淫爽ww久久久久无| 国产精品扒开腿做爽爽爽视频| 国产精品久久久久久久久借妻| 国产精品热久久久久夜色精品三区| 国产精品亚洲а∨天堂免在线| 国产欧美精品在线观看| 禁久久精品乱码| 99精品国产福利在线观看免费| 亚洲综合色自拍一区| 久久九九免费视频| 91久久香蕉国产日韩欧美9色| 一道本一区二区| 久久免费高清| 欧美视频一区二区三区…| 国产一区在线播放| 亚洲日本中文字幕免费在线不卡| 夜夜嗨网站十八久久| 欧美在线精品一区| 亚洲高清视频的网址| 亚洲综合日韩| 麻豆精品传媒视频| 国产精品爽黄69| 亚洲精品久久久久久久久| 亚洲欧美日韩视频二区| 欧美成人亚洲| 午夜精品www| 欧美日韩日日夜夜| 在线成人免费观看| 性欧美video另类hd性玩具| 欧美成人精品一区| 午夜激情一区| 国产精品啊啊啊| 亚洲精品国产精品国自产观看| 欧美在线一区二区| 亚洲伦理久久| 免费在线观看一区二区| 国产亚洲欧洲997久久综合| 一区二区三区日韩| 亚洲电影免费在线| 久久精品国产精品|