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

月下的博客

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  34 Posts :: 0 Stories :: 59 Comments :: 0 Trackbacks

常用鏈接

留言簿(5)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

  上個月開始和同學一塊在做類似CS的射擊游戲demo,要自己實現游戲里的簡單2DOverlay和文本顯示(不用具體GUI了,菜單什么的再用CEGUI),由于我這人做事慢,所以就去實現字體這種小模塊~0~(學末總是很難靜下心編程唉~~),本來以為網上這類資源挺多的,搜到的無非是NeHe的openGL+ft2,還有一位仁兄模仿Ogre寫的一個代碼(里面有些問題),多不是很系統,自己認真花了3,4天模仿OgreFont實現了一個簡單的英文字體在dx 9下使用ID3DXSprite接口進行渲染,然后照著clayman和hyzboy的提示修改成了支持中文的動態調頻寫入紋理那樣(不過沒做測試哦~~下下周得去上海2K面試,我就將就用了~)問題應該還有很多,而且應該做成考慮時間那樣(LRU),以后再說吧。。。
整個流程:

  最后把代碼貼下面吧,希望對大家有幫助。

/************************************************************************\
  This is a fucking
  ______   ___   _      _       
  |  ___| / _ \ | |    | |      
  | |_   / /_\ \| |__  | |  ___ 
  |  _|  |  _  || '_ \ | | / _ \
  | |    | | | || |_) || ||  __/
  \_|    \_| |_/|_.__/ |_| \___| 's free file

  filename: Font.h 
  created:  2010/07/30
  creator:    承天一
   
  purpose:  Freetype字體類
************************************************************************
*/

#ifndef __FONT_H__
#define __FONT_H__

#include 
<map>
#include 
<ft2build.h>
#include FT_FREETYPE_H
#include FT_GLYPH_H

using namespace std;

namespace Fable
{
    
class Font : public NedAlloc
    {
    
public:
        typedef unsigned 
int CodePoint;
        typedef FloatRect UVRect;
        
/// Information about the position and size of a glyph in a texture
        struct GlyphInfo
        {
        
public:
            CodePoint codePoint;        
//字符的unicode碼
            UVRect uvRect;                //紋理區域
            float aspectRatio;
            USHORT    useCount;            
//字符的使用次數
            UINT    l;
            UINT    m;

        
public:
            GlyphInfo(CodePoint _code, 
const UVRect& _rect, float _aspect, UINT _l, UINT _m) 
                : codePoint(_code), uvRect(_rect), aspectRatio(_aspect), useCount(
0), l(_l), m(_m)
            {
            }
        };
        
/// A range of code points, inclusive on both ends
        typedef std::pair<CodePoint, CodePoint> CodePointRange;
        typedef vector
<CodePointRange> CodePointRangeList;
    
protected:
        
/// Map from unicode code point to texture coordinates
        typedef map<CodePoint, GlyphInfo> CodePointMap;
        CodePointMap mCodePointMap;

        
/// Range of code points to generate glyphs for (truetype only)
        CodePointRangeList mCodePointRangeList;
    
public:

        Font();

        
~Font();

        
void        load(const std::string& name);

        
void        unLoad();

        
void        addCodePointRange(const CodePointRange& range)
        {
            mCodePointRangeList.push_back(range);
        }

        
/** Clear the list of code point ranges.
        
*/
        
void        clearCodePointRanges()
        {
            mCodePointRangeList.clear();
        }
        
/** Get a const reference to the list of code point ranges to be used to
            generate glyphs from a truetype font.
        
*/
        
const CodePointRangeList& getCodePointRangeList() const
        {
            
return mCodePointRangeList;
        }

    
protected:
        
/// Size of the truetype font, in points
        float            mTtfSize;
        
/// Resolution (dpi) of truetype font
        unsigned int    mTtfResolution;
        
/// Max distance to baseline of this (truetype) font
        int                mTtfMaxBearingY;
        
/// for TRUE_TYPE font only
        bool            mAntialiasColour;

        IDirect3DTexture9
*    mTexture;

        UINT            mWidth;
        UINT            mHeight;
        std::
string        mFontName;

        
/// 紋理上使用區域還剩的個數
        UINT            mLeftBlankNum;
        UINT            mMaxCharNum;
        uchar
*            mImageData;
        FT_Library        mFtLibrary;
        FT_Face            mFtFace;

        UINT            mPixelBytes;
        UINT            mCharDataWidth;
        UINT            mMaxCharSize;
        UINT            mDataSize;

        
int                mMaxHeight;
        
int                mMaxWidth;
        
float            mTextureAspect;
        UINT            mCharSpacer;

        UINT            mImage_m;
        UINT            mImage_l;

    
public:

        UINT    getTextureWidth() 
const { return mWidth;}

        UINT    getTextureHeight() 
const { return mHeight;}


         inline 
const UVRect& getGlyphTexCoords(CodePoint id) const
        {
            CodePointMap::const_iterator i 
= mCodePointMap.find(id);
            
if (i != mCodePointMap.end())
            {
                
return i->second.uvRect;
            }
            
else
            {
                
static UVRect nullRect(0.00.00.00.0);
                
return nullRect;
            }
        }

        
/** Sets the texture coordinates of a glyph.
        @remarks
            You only need to call this if you're setting up a font loaded from a texture manually.
        @note
            Also sets the aspect ratio (width / height) of this character. textureAspect
            is the width/height of the texture (may be non-square)
        
*/
        inline 
void setGlyphTexCoords(CodePoint id, UINT u1Pixel, UINT v1Pixel, UINT u2Pixel, UINT v2Pixel, float textureAspect)
        {
            
float u1 = (float)u1Pixel / (float)mWidth, v1 = (float)v1Pixel / (float)mHeight, u2 = (float)u2Pixel / (float)mWidth, v2 = (float)v2Pixel / (float)mWidth;
            CodePointMap::iterator i 
= mCodePointMap.find(id);
            
if (i != mCodePointMap.end())
            {
                i
->second.uvRect.left = u1;
                i
->second.uvRect.top = v1;
                i
->second.uvRect.right = u2;
                i
->second.uvRect.bottom = v2;
                i
->second.aspectRatio = textureAspect * (u2 - u1)  / (v2 - v1);
                i
->second.l = u1Pixel;
                i
->second.m = v1Pixel;
            }
            
else
            {
                mCodePointMap.insert(
                    CodePointMap::value_type(id, 
                        GlyphInfo(id, UVRect(u1, v1, u2, v2), 
                            textureAspect 
* (u2 - u1)  / (v2 - v1), u1Pixel, v1Pixel)));
            }

        }

        
/** Gets the aspect ratio (width / height) of this character. */
        inline 
float getGlyphAspectRatio(CodePoint id) const
        {
            CodePointMap::const_iterator i 
= mCodePointMap.find(id);
            
if (i != mCodePointMap.end())
            {
                
return i->second.aspectRatio;
            }
            
else
            {
                
return 1.0;
            }
        }
        
/** Sets the aspect ratio (width / height) of this character.
        @remarks
            You only need to call this if you're setting up a font loaded from a 
            texture manually.
        
*/
        inline 
void setGlyphAspectRatio(CodePoint id, float ratio)
        {
            CodePointMap::iterator i 
= mCodePointMap.find(id);
            
if (i != mCodePointMap.end())
            {
                i
->second.aspectRatio = ratio;
            }
        }

        
/** Gets the information available for a glyph corresponding to a
            given code point, or throws an exception if it doesn't exist;
        
*/
        
const GlyphInfo* getGlyphInfo(CodePoint id) const;


        LPDIRECT3DTEXTURE9    getFontTexture() 
const { return mTexture; }

        
void    insertGlyphInfo(CodePoint id);

        
bool    hasBlankInTexture() const 
        { 
            
return mLeftBlankNum > 0
        }

        
void    renderGlyphIntoTexture(CodePoint id);

        CodePoint    getLessUseChar();

        
void    removeGlyph(CodePoint id);
    
    };
}
#endif

/************************************************************************\
This is a fucking
______   ___   _      _       
|  ___| / _ \ | |    | |      
| |_   / /_\ \| |__  | |  ___ 
|  _|  |  _  || '_ \ | | / _ \
| |    | | | || |_) || ||  __/
\_|    \_| |_/|_.__/ |_| \___| 's free file

filename: Font.cpp 
created:  2010/07/30
creator:    承天一

purpose:  Freetype字體類
************************************************************************
*/

#include 
"stdafx.h"
#include 
"RenderCore.h"
#include 
"Font.h"
#include 
"TextureManager.h"
#include 
<d3dx9tex.h>


#undef max
#undef min

namespace Fable
{

    Font::Font()
        :mTtfMaxBearingY(
0), mTtfResolution(0), mAntialiasColour(false),
        mTexture(
0), mLeftBlankNum(0),
        mImageData(nullptr), mImage_m(
0),mImage_l(0)
    {
        mWidth 
= 1024;
        mHeight 
= 1024;
        mTtfSize 
= 20;
        mTtfResolution 
= 96;
    }

    Font::
~Font()
    {
        unLoad();
    }

    
void Font::load(const std::string& name)
    {
        mFontName 
= name;

        FT_Library ftLibrary;

        
//初始化庫 
        if(FT_Init_FreeType(&ftLibrary))
            FA_EXCEPT(ERR_FONT, 
"FreeType初始化失敗");

        mCharSpacer 
= 5;
        
if(FT_New_Face(ftLibrary, name.c_str(), 0&mFtFace)) 
            FA_EXCEPT(ERR_FONT, 
"FreeType無法打開ttf文件");

        UINT maxFaceNum 
= mFtFace->num_faces;

        FT_F26Dot6 ftSize 
= (FT_F26Dot6)(mTtfSize * (1 << 6));

        
if(FT_Set_Char_Size( mFtFace, ftSize, 0, mTtfResolution, mTtfResolution))
            FA_EXCEPT(ERR_FONT, 
"Could not set char size!");

        mMaxHeight 
= 0, mMaxWidth = 0;

        
if(mCodePointRangeList.empty())
        {
            mCodePointRangeList.push_back(CodePointRange(
33166));
            mCodePointRangeList.push_back(CodePointRange(
1996840869));
        }

        
// Calculate maximum width, height and bearing
        for (CodePointRangeList::const_iterator r = mCodePointRangeList.begin();
            r 
!= mCodePointRangeList.end(); ++r)
        {
            
const CodePointRange& range = *r;
            
for(CodePoint cp = range.first; cp <= range.second; ++cp)
            {
                FT_Load_Char( mFtFace, cp, FT_LOAD_RENDER );

                
if( ( 2 * ( mFtFace->glyph->bitmap.rows << 6 ) - mFtFace->glyph->metrics.horiBearingY ) > mMaxHeight )
                    mMaxHeight 
= ( 2 * ( mFtFace->glyph->bitmap.rows << 6 ) - mFtFace->glyph->metrics.horiBearingY );
                
if( mFtFace->glyph->metrics.horiBearingY > mTtfMaxBearingY )
                    mTtfMaxBearingY 
= mFtFace->glyph->metrics.horiBearingY;

                
if( (mFtFace->glyph->advance.x >> 6 ) + ( mFtFace->glyph->metrics.horiBearingX >> 6 ) > mMaxWidth)
                    mMaxWidth 
= (mFtFace->glyph->advance.x >> 6 ) + ( mFtFace->glyph->metrics.horiBearingX >> 6 );
            }
        }

        
// We just make a 1024 * 1024 texture, it's enough
        mTextureAspect = 1.0f;

        mPixelBytes 
= 2;
        mCharDataWidth 
= (mMaxWidth + mCharSpacer) * mPixelBytes;
        mDataSize
= mWidth * mHeight * mPixelBytes;
        mMaxCharSize 
= ((mMaxHeight >> 6+ mCharSpacer) * mCharDataWidth;
        mMaxCharNum 
= mDataSize / mMaxCharSize;
        mLeftBlankNum 
= mMaxCharNum;
        CON_INFO(
"Font texture size %d * %d", mWidth, mHeight);

        mImageData
= FA_NEW_ARRAY_T(uchar, mDataSize);
        
// Reset content (transparent, white)
        for (size_t i = 0; i < mDataSize; i += mPixelBytes)
        {
            mImageData[i 
+ 0= 0xFF// luminance
            mImageData[i + 1= 0x00;    // alpha
        }

        HRESULT hr 
= 0;
        hr 
= D3DXCreateTexture(
            RenderCore::getInstancePtr()
->getDevice(),
            mWidth,
            mHeight,
            
1,
            
0,
            D3DFMT_A8L8,
            D3DPOOL_MANAGED,
            
&mTexture);

        
if(FAILED(hr))
        {
            
string msg = DXGetErrorDescriptionA(hr);
            FA_EXCEPT(ERR_FONT, 
"Create font Texture failed: " + msg);
        }

    }

    
void Font::unLoad()
    {
        FA_DELETE_ARRAY_T(mImageData, uchar, mDataSize);
        SAFE_RELEASE(mTexture);
        FT_Done_FreeType(mFtLibrary);
    }

    
const Font::GlyphInfo* Font::getGlyphInfo(CodePoint id) const
    {
        CodePointMap::const_iterator i 
= mCodePointMap.find(id);
        
if (i == mCodePointMap.end())
        {
            
return nullptr;
        }
        
return &i->second;
    }

    
void Font::renderGlyphIntoTexture(CodePoint id)
    {
        FT_Error ftResult;

        
// Load & render glyph
        ftResult = FT_Load_Char( mFtFace, id, FT_LOAD_RENDER );
        
if (ftResult)
        {
            
// problem loading this glyph, continue
            CON_INFO("Info: cannot load CodePoint %d", id);
        }

        FT_Int advance 
= mFtFace->glyph->advance.x >> 6;
        unsigned 
char* buffer = mFtFace->glyph->bitmap.buffer;

        
if (!buffer)
        {
            
// Yuck, FT didn't detect this but generated a null pointer!
            CON_INFO("Info: Freetype returned null for character %d", id);
        }

        
int y_bearnig = ( mTtfMaxBearingY >> 6 ) - ( mFtFace->glyph->metrics.horiBearingY >> 6 );
        
int x_bearing = mFtFace->glyph->metrics.horiBearingX >> 6;

        
for(int j = 0; j < mFtFace->glyph->bitmap.rows; ++j )
        {
            size_t row 
= j + mImage_m + y_bearnig;
            UCHAR
* pDest = &mImageData[(row * mWidth * mPixelBytes) + (mImage_l + x_bearing) * mPixelBytes];
            
for(int k = 0; k < mFtFace->glyph->bitmap.width; ++k )
            {
                
if (mAntialiasColour)
                        {
                            
// Use the same greyscale pixel for all components RGBA
                            *pDest++= *buffer;
                        }
                        
else
                        {
                            
// Always white whether 'on' or 'off' pixel, since alpha
                            
// will turn off
                            *pDest++= 0xFF;
                        }
                        
// Always use the greyscale value for alpha
                        *pDest++= *buffer++
            }
        }

        
this->setGlyphTexCoords(id,
            mImage_l,  
// u1
            mImage_m,  // v1
            mImage_l + ( mFtFace->glyph->advance.x >> 6 ), // u2
            mImage_m + ( mMaxHeight >> 6 ), // v2
            mTextureAspect
            );

        
// Advance a column
        mImage_l += (advance + mCharSpacer);

        
// If at end of row
        if( mWidth - 1 < mImage_l + ( advance ) )
        {
            mImage_m 
+= ( mMaxHeight >> 6 ) + mCharSpacer;
            mImage_l 
= 0;
        }
        
--mLeftBlankNum;

        D3DLOCKED_RECT lockedRect;
        mTexture
->LockRect(0&lockedRect,00);         

        
//使用類型注意
        uchar* TexData = (uchar*)lockedRect.pBits;

        
for(UINT i = 0; i < mHeight; ++i)
        {
            
for(UINT j = 0; j < mWidth; ++j)
            {
                
//Pitch數據的總長度
                int index = i * lockedRect.Pitch / mPixelBytes + j;
                TexData[index] 
= mImageData[index];
            }
        }
        mTexture
->UnlockRect(0);

        
// for test
//#ifdef    _DEBUG
//        D3DXSaveTextureToFileA("..//media//test.png",D3DXIFF_PNG, mTexture, 0);
//#endif
    }

    
void Font::insertGlyphInfo(CodePoint id)
    {
        
if(!hasBlankInTexture())    //has no space left in texture    
        {
            removeGlyph(getLessUseChar());
        }
        renderGlyphIntoTexture(id);

    }

    Font::CodePoint Font::getLessUseChar()
    {
        CodePointMap::iterator i 
= mCodePointMap.begin(), iend = mCodePointMap.end(), iless = mCodePointMap.begin();
        
while(i != iend)
        {
            
if(i->second.useCount < iless->second.useCount)
                iless 
= i;
            
++i;
        }
        
return iless->second.codePoint;   
    }

    
void Font::removeGlyph(CodePoint id)
    {
        CodePointMap::iterator it 
= mCodePointMap.find(id);
        
if(it != mCodePointMap.end())
        {
            mImage_l 
= it->second.l;
            mImage_m 
= it->second.m;
            mCodePointMap.erase(it);
            
++mLeftBlankNum;
        }
        
else
        {
            FA_EXCEPT(ERR_FONT, 
"Can not find CodePoint to remove in void Font::removeGlyph(CodePoint id)");
        }
    }

}

posted on 2010-08-09 19:02 月下圓舞曲 閱讀(4721) 評論(1)  編輯 收藏 引用 所屬分類: 開發

Feedback

# re: 實現了簡陋的Freetype2在DirectX下顯示字體 2010-11-02 14:41 放放風
很大部分是 ogre 的代碼  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久爱www久久做| 国产精品久久久久久久久久三级 | 国产综合久久久久久鬼色| 久久久亚洲成人| 亚洲欧美日韩一区二区三区在线观看 | 在线观看欧美日韩国产| 欧美日本成人| 欧美韩日精品| 国产精品成人一区二区| 国产精品嫩草影院av蜜臀| 国产精品久久久久久久久果冻传媒 | 欧美午夜不卡在线观看免费| 亚洲欧美综合精品久久成人| 亚洲精品欧美极品| 正在播放欧美一区| 亚洲精品1区2区| 夜夜夜精品看看| 亚洲免费观看高清在线观看| 99这里只有久久精品视频| 黄色国产精品| 亚洲欧美日韩一区| 亚洲午夜一区二区三区| 欧美一级电影久久| 性欧美精品高清| 欧美成人精品一区二区| 亚洲精品影院在线观看| 免费久久久一本精品久久区| 欧美日韩国产页| 性感少妇一区| 欧美精品久久久久久久| 韩国av一区| 久久五月激情| 亚洲综合欧美| 欧美日韩在线第一页| 亚洲大胆美女视频| 欧美一区二区私人影院日本| 欧美激情在线观看| 欧美不卡激情三级在线观看| 久久精品一区二区| 欧美1区2区| 亚洲国产mv| 亚洲第一页自拍| 老鸭窝亚洲一区二区三区| 久久久国产精品亚洲一区| 日韩视频在线永久播放| 欧美日韩高清不卡| 日韩一级片网址| 一区二区免费在线观看| 欧美视频一区二区三区…| 一本色道久久综合狠狠躁篇怎么玩 | 玖玖视频精品| 一区二区高清在线| 美女精品自拍一二三四| 欧美精品一区二区三区一线天视频| 久久久久久久尹人综合网亚洲| 国产欧美日韩一区二区三区| 欧美精品v日韩精品v韩国精品v| 亚洲欧洲另类国产综合| 亚洲伊人网站| 亚洲欧洲综合另类| 欧美日韩美女在线| 欧美一级播放| 免费观看成人鲁鲁鲁鲁鲁视频| 亚洲精品你懂的| 亚洲男人的天堂在线观看| 一本色道88久久加勒比精品| 久久久久久久久久久久久女国产乱| 一本色道久久综合| 欧美高清视频www夜色资源网| 欧美一级在线视频| 久久综合导航| 亚洲精品一区二区三区福利| 国产精品久久久久av免费| 亚洲国产成人一区| 国际精品欧美精品| 亚洲自拍偷拍福利| 欧美一区二区黄色| 欧美三级网址| 亚洲午夜女主播在线直播| 欧美成人黄色小视频| 欧美日本久久| 日韩午夜免费| 亚洲综合精品一区二区| 久久久综合免费视频| 久久尤物视频| 亚洲高清不卡在线| 欧美日本高清一区| 一区二区三区视频免费在线观看| 亚洲精品孕妇| 国产精品免费久久久久久| 午夜精品一区二区在线观看| 久久精品国产综合精品| 在线欧美福利| 国产精品成人久久久久| 亚洲欧美综合精品久久成人| 久久天堂成人| 99热精品在线观看| 国产精品一区二区三区四区 | 中文有码久久| 美女黄毛**国产精品啪啪| 亚洲人www| 国产欧美日韩综合精品二区| 免费亚洲电影在线观看| 亚洲欧美国产日韩天堂区| 欧美激情在线有限公司| 亚洲国产老妈| 欧美国产91| 亚洲一区www| 亚洲成人自拍视频| 午夜精品婷婷| 一区二区欧美视频| av成人免费在线| 91久久精品www人人做人人爽 | 国产精品裸体一区二区三区| 亚洲精品欧美在线| 久久精品国产99精品国产亚洲性色| 一区二区三区你懂的| 亚洲人成人99网站| 亚洲日本中文字幕免费在线不卡| 狠狠色狠狠色综合人人| 国产一区二区三区四区| 国产亚洲成年网址在线观看| 欧美深夜影院| 亚洲国产高清自拍| 国产精品美女黄网| 欧美日韩国产免费观看| 欧美激情精品久久久久| 一区二区三区在线不卡| 亚洲五月婷婷| 亚洲欧美成人网| 久久深夜福利免费观看| 欧美大片免费| 国产精品揄拍500视频| 老司机一区二区三区| 久久精品一级爱片| 久久综合色综合88| 亚洲国产高清自拍| 亚洲桃花岛网站| 久久久久国产精品一区| 久久久久国色av免费看影院| 国产婷婷色一区二区三区| 欧美视频观看一区| 国产欧美一区二区三区久久人妖| 怡红院精品视频| 亚洲欧美国产制服动漫| 亚洲福利视频网站| 午夜精品成人在线视频| 久久日韩粉嫩一区二区三区| 亚洲小说欧美另类社区| 久久精品男女| 亚洲欧美国产另类| 久久蜜桃资源一区二区老牛| 日韩天堂在线视频| 欧美精品久久99久久在免费线| 一区二区三区日韩欧美精品| 亚洲欧美激情在线视频| 欧美日韩成人精品| 日韩视频免费看| 亚洲午夜视频在线| 欧美一级欧美一级在线播放| 欧美激情精品久久久久久黑人 | 国产日韩欧美精品一区| 亚洲欧美日韩精品久久久久| 一区二区欧美视频| 欧美午夜不卡在线观看免费| 欧美一二三视频| 久久夜色精品国产亚洲aⅴ | 欧美国产另类| 亚洲免费视频观看| 久久国产精品久久久久久久久久 | 99re6热只有精品免费观看| 欧美成人一二三| 亚洲欧美日韩第一区| 欧美欧美天天天天操| 国产精品网曝门| 性色一区二区| 久久综合色一综合色88| 夜夜嗨av色综合久久久综合网| 一本久久a久久免费精品不卡| 国产欧美日韩亚州综合| 亚洲激情不卡| 国产亚洲va综合人人澡精品| 亚洲精品一区二区三区99| 国精品一区二区三区| 亚洲午夜国产一区99re久久| 亚洲人成网站在线播| 亚洲欧美日韩在线高清直播| 99综合视频| 欧美国产精品va在线观看| 麻豆久久精品| 精品av久久久久电影| 亚洲国产精品一区二区www| 国产亚洲精品自拍| 久久精品一本| 亚洲综合色丁香婷婷六月图片| 久久精品成人一区二区三区蜜臀| 一区二区三区 在线观看视| 久久最新视频| 免费在线亚洲欧美| 国产综合在线看|