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

月下的博客

  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>
            日韩性生活视频| 日韩网站在线看片你懂的| 欧美视频福利| 亚洲黄网站黄| 亚洲欧美一区二区三区极速播放| 一本在线高清不卡dvd| 国产精品美女主播在线观看纯欲| 香蕉久久a毛片| 日韩视频精品在线| 亚洲一区不卡| 亚洲天堂网在线观看| 国产偷国产偷亚洲高清97cao| 久久久精品免费视频| 91久久精品国产91性色| 一本久道久久综合狠狠爱| 小黄鸭精品aⅴ导航网站入口| 黄色精品网站| 国产精品久久网站| 国产综合av| 国产精品免费一区二区三区观看| 国产精品vip| 欧美美女视频| 久久久久久久久久久久久9999| 亚洲精品免费网站| 嫩草成人www欧美| 亚洲欧美日韩精品久久| 亚洲国产欧美一区二区三区丁香婷| 国产精品美女久久久久久久| 国产欧美日韩综合| 国产精品久久影院| 亚洲国产精品一区二区第一页 | 亚洲国产高清高潮精品美女| 一本色道久久综合亚洲精品小说 | 久久精品一区二区三区不卡| 欧美日韩黄视频| 欧美激情一二区| 久久久激情视频| 欧美另类女人| 在线观看久久av| 极品少妇一区二区| 黄色精品一区| 欧美亚洲在线观看| 亚洲精品国偷自产在线99热| 欧美在线综合| 久久av二区| 欧美系列亚洲系列| 日韩视频国产视频| 亚洲图中文字幕| 欧美激情网友自拍| 欧美黄网免费在线观看| 午夜综合激情| 国产精品女人网站| 亚洲免费在线观看| 一区二区三区日韩| 国产精品高潮呻吟久久av黑人| 国产精品久久久久久久久久免费看 | 欧美一级片一区| 99视频一区二区三区| 欧美激情精品久久久久| 国产精品成人一区二区网站软件 | 久久久7777| 欧美黄色小视频| 久久免费的精品国产v∧| 久久综合伊人77777蜜臀| 欧美aa国产视频| 国产精品chinese| 99综合在线| 一区二区三欧美| 国产精品视频在线观看| 最新中文字幕亚洲| 亚洲伊人网站| 开心色5月久久精品| 午夜在线精品偷拍| 99riav1国产精品视频| 午夜精品久久久久久久白皮肤| 久久一区激情| 在线综合+亚洲+欧美中文字幕| 久久精品人人| 亚洲国产精品一区二区久| 欧美成人福利视频| 欧美日韩mp4| 欧美在线观看日本一区| 亚洲黑丝一区二区| 欧美日韩在线免费| 国外精品视频| 欧美国产一区在线| 国产精品扒开腿做爽爽爽视频| 欧美一区二区三区在| 久久久久国产精品一区二区| 99国产精品视频免费观看一公开| 一道本一区二区| 黄色成人小视频| 99精品热6080yy久久 | 国产精品爱啪在线线免费观看| 欧美一区网站| 欧美大片一区二区三区| 红桃视频国产精品| 亚洲精品一区在线| 欧美国产乱视频| 午夜欧美精品久久久久久久| 久久免费高清| 欧美一区二区三区日韩视频| 欧美91大片| 久久久久久一区| 欧美一区二区观看视频| 国产精品亚洲视频| 欧美激情国产日韩| 国产精品资源在线观看| 亚洲无限乱码一二三四麻| 亚洲春色另类小说| 久久福利视频导航| 一区一区视频| 亚洲图片激情小说| 亚洲激情另类| 亚洲精美视频| 一区二区在线不卡| 亚洲欧美成人| 国产在线乱码一区二区三区| 亚洲免费高清视频| 亚洲人永久免费| 久久精品一级爱片| 久久精品首页| 久久这里只有| 久久久久久久久久看片| 欧美亚一区二区| 亚洲国产欧美不卡在线观看| 黄色成人av在线| 欧美在线视频导航| 久久福利视频导航| 久久一日本道色综合久久| 午夜影院日韩| 国产精品你懂的在线| 亚洲视频中文| 香蕉成人伊视频在线观看| 国产一区二区三区奇米久涩| 91久久夜色精品国产九色| 亚洲欧美日韩国产精品| 一区二区三区精品在线| 一道本一区二区| 在线视频你懂得一区| 免费毛片一区二区三区久久久| 另类av一区二区| 在线精品视频在线观看高清| 亚洲国产精品va在看黑人| 在线精品亚洲一区二区| 久久久久免费视频| 免费久久99精品国产自在现线| 欧美二区在线| 亚洲福利视频一区| 欧美性理论片在线观看片免费| 亚洲美女视频在线观看| 亚洲先锋成人| 国产精品视频一二三| 久久福利一区| 亚洲人线精品午夜| 午夜视频在线观看一区| 国产亚洲第一区| 狼人社综合社区| 亚洲精品一区二区三区av| 亚洲中无吗在线| 国产综合色产在线精品| 欧美成年人视频网站欧美| 一本久久综合亚洲鲁鲁| 久久大逼视频| 亚洲毛片av| 国产精品一区亚洲| 麻豆国产精品777777在线| 亚洲欧美日韩系列| 狠狠爱综合网| 欧美另类综合| 欧美一区二区三区在线免费观看| 免费不卡在线观看av| 亚洲一区二区视频在线| 国产在线拍偷自揄拍精品| 欧美成人一区二免费视频软件| 亚洲视频在线观看| 欧美成人精品在线| 亚洲欧美中日韩| 亚洲精品韩国| 欧美成va人片在线观看| 中文精品一区二区三区| 欧美成人一区二区| 伊人夜夜躁av伊人久久| 欧美视频一区二区在线观看| 久久久久久九九九九| 亚洲午夜在线观看视频在线| 亚洲第一在线视频| 久久综合色婷婷| 亚洲欧美日韩一区二区在线| 亚洲日本va在线观看| 精久久久久久| 国产亚洲一区二区三区在线观看| 欧美视频一区二区三区…| 欧美成人高清| 久久久久久精| 久久久精品999| 亚洲欧美中文日韩v在线观看| 99视频精品全部免费在线| 亚洲国产天堂久久综合| 美日韩在线观看|