• <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>
            隨筆 - 132  文章 - 51  trackbacks - 0
            <2010年6月>
            303112345
            6789101112
            13141516171819
            20212223242526
            27282930123
            45678910

            常用鏈接

            留言簿(7)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            cocos2d-x

            OGRE

            OPenGL

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            教你怎么開發(fā)漂亮的描邊字體

             (2011-01-23 10:28:15)
            標(biāo)簽: 

            雜談

            在天龍八部,聊個齋這些國產(chǎn)的游戲中,都用到了freetype,并使用到freetype提供的描邊生成方法。

            關(guān)于freetype怎么應(yīng)用描邊,有個sample,鏈接如下

             http://www.freetype.org/freetype2/docs/tutorial/example2.cpp

            但是這個sample中的生成描邊的方式是低效率的,因為是間接生成的,在描繪函數(shù)里面得到span的信息,然后又遍歷了span再生成bitmap,最后再輸出。

            經(jīng)過我一個通宵研究,我想出了一個更為直接的描繪方式。

            只要把這個sample中間的一部分替換成如下代碼就可以了:

                    FT_Outline *outline = &reinterpret_cast<FT_OutlineGlyph>(glyph)->outline;
                    FT_Glyph_Get_CBox(glyph,
                        FT_GLYPH_BBOX_GRIDFIT,
                        &bbox);
                    int width = (bbox.xMax - bbox.xMin)>>6;
                    int rows = (bbox.yMax - bbox.yMin)>>6;
                    
                    bmp.buffer = new unsigned char[width * rows];
                    memset(bmp.buffer, 0, width * rows);
                    bmp.width = width;
                    bmp.rows = rows;
                    bmp.pitch = width;
                    bmp.pixel_mode = FT_PIXEL_MODE_GRAY;
                    bmp.num_grays = 256;

                    memset(&params, 0, sizeof (params));
                    params.source = outline;
                    params.target = &bmp;
                    params.flags = FT_RASTER_FLAG_AA;

                    FT_Outline_Translate(outline,-bbox.xMin,-bbox.yMin);
                    FT_Outline_Render(library, outline, &params);
                    save_edge_buffer = bmp.buffer;
                    
                    FT_BBox bbox_in;
                    FT_Glyph glyph_fg;
                    FT_Get_Glyph(size->face->glyph, &glyph_fg);
                    FT_Glyph_Get_CBox(glyph_fg,
                          FT_GLYPH_BBOX_GRIDFIT,
                          &bbox_in);

                    bmp.buffer = new unsigned char[width * rows];
                    memset(bmp.buffer, 0, width * rows);
                    bmp.width = width;
                    bmp.rows = rows;
                    bmp.pitch = width;
                    bmp.pixel_mode = FT_PIXEL_MODE_GRAY;
                    bmp.num_grays = 256;
                    outline = &reinterpret_cast<FT_OutlineGlyph>(glyph_fg)->outline;
                    memset(&params, 0, sizeof (params));
                    params.source = outline;
                    params.target = &bmp;
                    params.flags = FT_RASTER_FLAG_AA;
                    FT_Outline_Translate(outline,-bbox.xMin,-bbox.yMin);
                    FT_Outline_Render(library, outline, &params);
                    save_buffer = bmp.buffer;
                    
                    int inner_h = (bbox.yMax-bbox_in.yMax)>>6 ;
                    int w = (bbox_in.xMax-bbox_in.xMin)>>6 ;
                    int left = (bbox.xMin-bbox_in.xMin)>>6 ;
                    width=width;
                    height=rows;
                    pitch = (size->face->glyph->advance.x >> 6)+width-w ;
                    key_x=-(size->face->glyph->metrics.horiBearingX >> 6)-left ;
                    key_y=-_ascent+inner_h+((size->face->glyph->metrics.horiBearingY) >> 6);

            代碼我做了刪減,稍微修改一下就可以替代里面用到的描繪方式。

            得到bitmap之后,你想怎么畫就怎么畫。

            其實上是得到兩張alpha圖,一張是描邊信息的alpha圖,一張是字體本身的alpha圖,剩下的事情,只是在畫出來的時候加上你需要的顏色就可以了。

            關(guān)于這種方式的描邊,其實還有個bug,這個freetype的開發(fā)組還沒完全解決,這個bug如下

            http://lists.nongnu.org/archive/html/freetype/2011-01/msg00022.html

            有人說魔獸世界也用到了freetype,但是我仔細(xì)觀察了魔獸的字體,發(fā)現(xiàn)魔獸最大也好像只支持兩個像素的描邊,而且魔獸的描邊方式也和freetype提供的這種使用stokers的描邊不一樣。

            posted on 2011-07-13 07:46 風(fēng)輕云淡 閱讀(2901) 評論(0)  編輯 收藏 引用 所屬分類: FreeType
            久久亚洲国产成人影院网站| 亚洲精品乱码久久久久久中文字幕 | 合区精品久久久中文字幕一区| 日本加勒比久久精品| 亚洲精品乱码久久久久久按摩 | 国产韩国精品一区二区三区久久| 久久精品男人影院| 亚洲国产成人精品女人久久久 | 国产精品免费久久久久影院| 久久国产亚洲精品| 亚洲国产成人久久精品影视| 日产精品久久久久久久| 久久人搡人人玩人妻精品首页| 99久久久国产精品免费无卡顿 | 思思久久好好热精品国产| 国产精品久久久久…| 无码人妻久久一区二区三区 | 亚洲欧洲日产国码无码久久99| 久久99精品国产麻豆不卡| 97久久综合精品久久久综合| 99久久国产宗和精品1上映| 久久露脸国产精品| 久久夜色精品国产亚洲| 久久精品嫩草影院| 久久精品夜夜夜夜夜久久| 亚洲AV无码久久精品狠狠爱浪潮| 久久久中文字幕日本| 久久国产热这里只有精品| 久久久久国产精品| 久久综合丁香激情久久| 国产人久久人人人人爽 | 品成人欧美大片久久国产欧美...| 精品人妻久久久久久888| 午夜久久久久久禁播电影| 伊人久久精品无码二区麻豆| 丁香色欲久久久久久综合网| 久久精品国产精品亚洲精品| 伊人久久综合精品无码AV专区| 久久亚洲精品国产精品| 久久精品国产精品青草| 精品乱码久久久久久夜夜嗨|