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

月下的博客

  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 月下圓舞曲 閱讀(4720) 評論(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>
            欧美一级专区| 国产无遮挡一区二区三区毛片日本| 亚洲一区二区三区高清| 亚洲一区视频在线| 亚洲国产精品第一区二区| 久久久成人精品| 久久激情婷婷| 欧美成人精精品一区二区频| 欧美电影资源| 亚洲小视频在线观看| 亚洲一区二区三区精品在线观看 | 一本久久综合亚洲鲁鲁| 欧美国产一区二区三区激情无套| 国产欧美一区二区精品性| 欧美日韩精品一区二区三区四区| 国产精品视频午夜| 国产酒店精品激情| 亚洲美女尤物影院| 欧美在线免费观看| 亚洲欧洲在线看| 亚洲欧美影音先锋| 欧美激情一区在线| 永久免费毛片在线播放不卡| 在线亚洲伦理| 亚洲激情第一页| 欧美专区在线观看一区| 欧美日韩国产色视频| 在线精品国产欧美| 久久久人成影片一区二区三区| 狠狠色狠狠色综合人人| 亚洲欧美制服另类日韩| 最新亚洲一区| 久久久久九九视频| 国产在线精品一区二区中文| 欧美日韩精品欧美日韩精品| 在线欧美亚洲| 欧美激情免费在线| 欧美成人精品在线| 亚洲精品视频中文字幕| 亚洲三级国产| 国产精品yjizz| 欧美一级午夜免费电影| 亚洲欧美激情视频| 国产欧美日韩一区二区三区在线 | 免费亚洲一区二区| 亚洲成色最大综合在线| 国产嫩草影院久久久久| 午夜精品久久久久久久| 欧美日韩国产另类不卡| 欧美亚洲免费在线| 亚洲欧美日韩综合aⅴ视频| 国产精品一区免费观看| 欧美一区二区视频网站| 久久免费视频一区| 一区二区电影免费观看| 亚洲欧美在线高清| 亚洲精品乱码久久久久| 亚洲免费在线观看视频| 一区二区视频免费完整版观看| 日韩亚洲一区二区| 亚洲男人影院| 一区二区三区四区精品| 亚洲最新视频在线| 欧美一级片一区| 91久久精品一区二区别| 亚洲欧美在线一区| 午夜日韩在线| 免费一级欧美片在线播放| 国产精品爽爽ⅴa在线观看| 麻豆精品视频在线观看视频| 国产欧美日韩不卡免费| 日韩视频免费看| 亚洲伦理一区| 国产精品激情电影| 99精品国产高清一区二区| 一区二区三区.www| 欧美视频中文在线看| 一本色道久久99精品综合| 亚洲欧美色婷婷| 国产日韩一区欧美| 久久久天天操| 亚洲三级观看| 亚洲一区二区三区四区视频| 欧美午夜精品久久久| 一区二区三区国产在线| 久久久久高清| 亚洲欧洲偷拍精品| 欧美日韩综合不卡| 亚洲欧美日韩在线高清直播| 老司机凹凸av亚洲导航| 这里是久久伊人| 国内一区二区三区在线视频| 久久久久国产精品人| 99在线精品观看| 猛男gaygay欧美视频| 中日韩美女免费视频网站在线观看| 亚洲国产精品精华液2区45| 亚洲精品国产拍免费91在线| 国产精品久久久久免费a∨| 久久一本综合频道| 久久gogo国模裸体人体| 欧美成人伊人久久综合网| 亚洲欧美在线免费观看| 亚洲三级电影全部在线观看高清| 宅男噜噜噜66一区二区66| 国产精品一区视频| 老司机精品视频一区二区三区| 亚洲欧美成人精品| 亚洲欧洲精品一区二区| 国模一区二区三区| 国产视频自拍一区| 好吊妞**欧美| 国产日韩欧美自拍| 欧美日韩一区二| 久久国产免费看| 久久久av水蜜桃| 久久久国产午夜精品| 亚洲一区日韩| 亚洲精品女人| 日韩视频免费在线| 一本一本大道香蕉久在线精品| 欧美日韩国产色综合一二三四 | 黄色亚洲免费| 国产精品久久久久久亚洲调教| 亚洲摸下面视频| 亚洲电影在线观看| 亚洲欧美国产一区二区三区| 欧美一区二区观看视频| 亚洲欧美日韩成人高清在线一区| 国产精品扒开腿做爽爽爽视频| 91久久中文| 一区二区三区成人| 久久精品亚洲精品| 欧美精品一区二区精品网 | 欧美在线观看一二区| 美女视频一区免费观看| 欧美一区二区三区精品| 国产精品乱码人人做人人爱| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美在线精品一区| 一区二区三区蜜桃网| 欧美成人久久| 精品1区2区| 男女av一区三区二区色多| 久久伊人免费视频| 狠狠综合久久av一区二区小说| 国产一区二区剧情av在线| 亚洲中字黄色| 久久99伊人| 国内外成人免费激情在线视频网站 | 鲁大师影院一区二区三区| 欧美日韩中文字幕精品| 99re亚洲国产精品| 亚洲一级黄色片| 亚洲国产日韩欧美在线图片| 99成人精品| 狠狠色丁香婷婷综合| 宅男精品视频| av成人免费| 亚洲精品黄网在线观看| 欧美精品在欧美一区二区少妇| 欧美aaaaaaaa牛牛影院| 狠狠色丁香婷婷综合久久片| 久久riav二区三区| 蜜臀久久久99精品久久久久久| 老司机免费视频一区二区| 国产视频精品va久久久久久| 久久久精品2019中文字幕神马| 久久久之久亚州精品露出| 久久国产精品99精品国产| 最新国产乱人伦偷精品免费网站| 亚洲免费福利视频| 亚洲一区亚洲二区| 亚洲国产影院| 久久国产综合精品| 亚洲你懂的在线视频| 久久五月天婷婷| 亚洲欧美日韩国产综合| 欧美绝品在线观看成人午夜影视| 国产欧美日韩一区| 在线观看精品视频| 亚洲高清不卡| 国产偷国产偷亚洲高清97cao| 一区二区三区四区精品| 亚洲手机在线| 一本大道久久a久久精品综合| 久久精品国产亚洲aⅴ| 久久婷婷国产麻豆91天堂| 欧美一级视频精品观看| 欧美性猛交xxxx乱大交退制版| 一本色道久久| 欧美在线观看www| 久久久久99精品国产片| 在线观看日韩专区| 美女免费视频一区| 亚洲国产精品传媒在线观看| 亚洲精品久久久久久久久久久久久| 欧美激情中文不卡| 黑人中文字幕一区二区三区 | 国产精品网站在线播放|