123
This commit is contained in:
177
CryFont/FontTexture.h
Normal file
177
CryFont/FontTexture.h
Normal file
@@ -0,0 +1,177 @@
|
||||
//-------------------------------------------------------------------------------------------------
|
||||
// Author: M<>rcio Martins
|
||||
//
|
||||
// Purpose:
|
||||
// - Create and update a texture with the most recently used glyphs
|
||||
//
|
||||
// History:
|
||||
// - [6/6/2003] created the file
|
||||
//
|
||||
//-------------------------------------------------------------------------------------------------
|
||||
#pragma once
|
||||
|
||||
|
||||
#ifdef WIN64
|
||||
// Workaround for Amd64 compiler
|
||||
#include <map>
|
||||
#define hash_map map
|
||||
#else
|
||||
#if defined(LINUX)
|
||||
#include <ext/hash_map>
|
||||
#else
|
||||
#include <hash_map>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "GlyphCache.h"
|
||||
#include "GlyphBitmap.h"
|
||||
|
||||
|
||||
// comment this to use 8bit (alpha only texture) wich is both faster, and uses much less memory
|
||||
//#undef FONT_USE_32BIT_TEXTURE
|
||||
#define FONT_USE_32BIT_TEXTURE
|
||||
|
||||
// the number of slots in the glyph cache
|
||||
// each slot ocupies ((glyph_bitmap_width * glyph_bitmap_height) + 24) bytes
|
||||
#define FONT_GLYPH_CACHE_SIZE (1)
|
||||
|
||||
// the glyph spacing offset from the left margin, in pixels
|
||||
#define FONT_GLYPH_OFFSET (2)
|
||||
|
||||
// the size of a rendered space, this value gets multiplied by the default characted width
|
||||
#define FONT_SPACE_SIZE (0.5f)
|
||||
|
||||
// don't draw this char (used to avoid drawing color codes)
|
||||
#define FONT_NOT_DRAWABLE_CHAR (0xffff)
|
||||
|
||||
// smoothing methods
|
||||
#define FONT_SMOOTH_NONE 0
|
||||
#define FONT_SMOOTH_BLUR 1
|
||||
#define FONT_SMOOTH_SUPERSAMPLE 2
|
||||
|
||||
// smoothing amounts
|
||||
#define FONT_SMOOTH_AMOUNT_NONE 0
|
||||
#define FONT_SMOOTH_AMOUNT_2X 1
|
||||
#define FONT_SMOOTH_AMOUNT_4X 2
|
||||
|
||||
|
||||
typedef struct CTextureSlot
|
||||
{
|
||||
unsigned int dwUsage;
|
||||
wchar_t cCurrentChar;
|
||||
|
||||
int iTextureSlot;
|
||||
float vTexCoord[2];
|
||||
int iCharWidth;
|
||||
int iCharHeight;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
dwUsage = 0;
|
||||
cCurrentChar = -1;
|
||||
iCharWidth = 0;
|
||||
iCharHeight = 0;
|
||||
|
||||
};
|
||||
|
||||
} CTextureSlot;
|
||||
|
||||
|
||||
typedef std::vector<CTextureSlot *> CTextureSlotList;
|
||||
typedef std::vector<CTextureSlot *>::iterator CTextureSlotListItor;
|
||||
|
||||
typedef std::hash_map<wchar_t, CTextureSlot *> CTextureSlotTable;
|
||||
typedef std::hash_map<wchar_t, CTextureSlot *>::iterator CTextureSlotTableItor;
|
||||
|
||||
#ifdef WIN64
|
||||
#undef GetCharWidth
|
||||
#undef GetCharHeight
|
||||
#endif
|
||||
|
||||
class CFontTexture
|
||||
{
|
||||
public:
|
||||
CFontTexture();
|
||||
~CFontTexture();
|
||||
|
||||
int CreateFromFile(const string &szFileName, int iWidth, int iHeight, int iSmoothMethod, int iSmoothAmount, float fSizeRatio = 0.8f, int iWidthCharCount = 16, int iHeightCharCount = 16);
|
||||
int CreateFromMemory(unsigned char *pFileData, int iDataSize, int iWidth, int iHeight, int iSmoothMethod, int iSmoothAmount, float fSizeRatio = 0.875f, int iWidthCharCount = 16, int iHeightCharCount = 16);
|
||||
int Create(int iWidth, int iHeight, int iSmoothMethod, int iSmoothAmount, float fSizeRatio = 0.8f, int iWidthCharCount = 16, int iHeightCharCount = 16);
|
||||
int Release();
|
||||
|
||||
int SetEncoding(FT_Encoding pEncoding) { return m_pGlyphCache.SetEncoding(pEncoding); };
|
||||
FT_Encoding GetEncoding() { return m_pGlyphCache.GetEncoding(); };
|
||||
|
||||
int GetCellWidth() { return m_iCellWidth; };
|
||||
int GetCellHeight() { return m_iCellHeight; };
|
||||
|
||||
int GetWidth() { return m_iWidth; };
|
||||
int GetHeight() { return m_iHeight; };
|
||||
|
||||
int GetWidthCellCount() { return m_iWidthCellCount; };
|
||||
int GetHeightCellCount() { return m_iHeightCellCount; };
|
||||
|
||||
float GetTextureCellWidth() { return m_fTextureCellWidth; };
|
||||
float GetTextureCellHeight() { return m_fTextureCellHeight; };
|
||||
|
||||
#ifdef FONT_USE_32BIT_TEXTURE
|
||||
unsigned int *GetBuffer() { return m_pBuffer; };
|
||||
#else
|
||||
unsigned char *GetBuffer() { return m_pBuffer; };
|
||||
#endif
|
||||
|
||||
wchar_t GetSlotChar(int iSlot);
|
||||
CTextureSlot *GetCharSlot(wchar_t cChar);
|
||||
|
||||
CTextureSlot *GetLRUSlot();
|
||||
CTextureSlot *GetMRUSlot();
|
||||
|
||||
// returns 1 if texture updated, returns 2 if texture not updated, returns 0 on error
|
||||
// pUpdated is the number of slots updated
|
||||
int PreCacheString(const wchar_t *szString, int *pUpdated = 0);
|
||||
int GetTextureCoord(wchar_t cChar, float *fU, float *fV);
|
||||
int GetCharWidth(wchar_t cChar);
|
||||
int GetCharHeight(wchar_t cChar);
|
||||
|
||||
int WriteToFile(const string &szFileName);
|
||||
|
||||
private:
|
||||
|
||||
int CreateSlotList(int iListSize);
|
||||
int ReleaseSlotList();
|
||||
|
||||
int UpdateSlot(int iSlot, unsigned int dwUsage, wchar_t cChar);
|
||||
|
||||
int m_iWidth;
|
||||
int m_iHeight;
|
||||
|
||||
int m_iCellWidth;
|
||||
int m_iCellHeight;
|
||||
|
||||
float m_fTextureCellWidth;
|
||||
float m_fTextureCellHeight;
|
||||
|
||||
int m_iWidthCellCount;
|
||||
int m_iHeightCellCount;
|
||||
|
||||
int m_nTextureSlotCount;
|
||||
|
||||
int m_iSmoothMethod;
|
||||
int m_iSmoothAmount;
|
||||
|
||||
CGlyphCache m_pGlyphCache;
|
||||
CTextureSlotList m_pSlotList;
|
||||
CTextureSlotTable m_pSlotTable;
|
||||
|
||||
|
||||
#ifdef FONT_USE_32BIT_TEXTURE
|
||||
unsigned int *m_pBuffer;
|
||||
#else
|
||||
unsigned char *m_pBuffer;
|
||||
#endif
|
||||
|
||||
unsigned int m_dwUsage;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user