Files
wagic/JGE/include/JGBKFont.h

193 lines
5.4 KiB
C++

//-------------------------------------------------------------------------------------
//
// JGE++ is a hardware accelerated 2D game SDK for PSP/Windows.
//
// Licensed under the BSD license, see LICENSE in JGE root for details.
//
// Copyright (c) 2007 James Hui (a.k.a. Dr.Watson) <jhkhui@gmail.com>
//
//-------------------------------------------------------------------------------------
#ifndef _JBGK_FONT_H_
#define _JBGK_FONT_H_
#include "JTypes.h"
#include "JRenderer.h"
#include "JSprite.h"
#define BYTE u8
#define DWORD u32
#define BOOL int
// #define GB_FONT_SIZE 16
// #define GB_FONT_DATA_SIZE GB_FONT_SIZE*GB_FONT_SIZE/8
// #define GB_FONT_BYTE_COUNT GB_FONT_SIZE/8
//
#define MAX_CACHE_SIZE 256
//
// #define CFONT_TEX_WIDTH 256
// #define CFONT_TEX_HEIGHT 256
//////////////////////////////////////////////////////////////////////////
/// Chinese bitmap font encoded with GBK encoding. All popurlar font sizes
/// are supported and the following have been tested:
/// 12x12, 16x16, 18x18, 20x20, 24x24, 28x28 and 32x32.
///
//////////////////////////////////////////////////////////////////////////
class JGBKFont
{
public:
//////////////////////////////////////////////////////////////////////////
/// Constructor.
///
//////////////////////////////////////////////////////////////////////////
JGBKFont();
~JGBKFont();
//////////////////////////////////////////////////////////////////////////
/// Initialization of the font class. You need to provide both a Chinese
/// font file and an English one as well.
///
/// For example:
/// @code
/// mChineseFont = new JGBKFont();
/// mChineseFont->Init("Res/ASC16", "Res/GBK16");
/// @endcode
///
/// @param engFileName - Name of the English font file.
/// @param chnFileName - Name of the Chinese font file.
/// @param fontsize - Font size.
/// @param smallEnglishFont - Indicate to use half width when rendering English characters.
///
//////////////////////////////////////////////////////////////////////////
bool Init(const char* engFileName, const char* chnFileName, int fontsize=16, bool smallEnglishFont=false);
//////////////////////////////////////////////////////////////////////////
/// Rendering character into cache.
///
/// @param ch - Single byte or word of character code.
///
/// @return Index of the character in cache.
///
//////////////////////////////////////////////////////////////////////////
int PreCacheChar(const BYTE *ch);
//////////////////////////////////////////////////////////////////////////
/// Scan through the string and look up the index of each character in the
/// cache and then return all indexes in an array to be rendered later on.
///
/// @param str - String to look for cache indexes.
/// @return dest - Indexes of characters in cache.
/// @return Number of characters processed.
///
//////////////////////////////////////////////////////////////////////////
int PrepareString(BYTE* str, int* dest);
//////////////////////////////////////////////////////////////////////////
/// Render string by using the indexes returned from PrepareString.
///
/// @param text - Cache indexes for rendering.
/// @param count - Number of characters to render.
/// @param x - X screen position for rendering.
/// @param y - Y screen position for rendering.
///
//////////////////////////////////////////////////////////////////////////
void RenderEncodedString(const int* text, int count, float x, float y);
//////////////////////////////////////////////////////////////////////////
/// Render string to screen.
///
/// @param str - String to render.
/// @param x - X screen position for rendering.
/// @param y - Y screen position for rendering.
///
//////////////////////////////////////////////////////////////////////////
void RenderString(BYTE* str, float x, float y, int alignment=JGETEXT_LEFT);
int GetStringWidth(BYTE* str);
int GetStringHeight(BYTE* str);
//////////////////////////////////////////////////////////////////////////
/// Set scale for rendering.
///
/// @param scale - Scale for rendering characters.
///
//////////////////////////////////////////////////////////////////////////
void SetScale(float scale);
//////////////////////////////////////////////////////////////////////////
/// Set angle for rendering.
///
/// @param rot - Rotation angle in radian.
///
//////////////////////////////////////////////////////////////////////////
void SetRotation(float rot);
//////////////////////////////////////////////////////////////////////////
/// Set font color.
///
/// @param color - color of font.
///
//////////////////////////////////////////////////////////////////////////
void SetColor(PIXEL_TYPE color);
//////////////////////////////////////////////////////////////////////////
/// Set background color.
///
/// @param color - Background color.
///
//////////////////////////////////////////////////////////////////////////
void SetBgColor(PIXEL_TYPE color);
private:
static JRenderer* mRenderer;
BYTE* mChnFont;
BYTE* mEngFont;
DWORD* mCharBuffer;
PIXEL_TYPE mColor;
PIXEL_TYPE mBgColor;
int mFontSize;
int mBytesPerChar;
int mBytesPerRow;
int mCacheSize;
int mCacheImageWidth;
int mCacheImageHeight;
int mCol;
int mRow;
//public:
JTexture* mTexture;
JQuad** mSprites;
int *mGBCode;
int mCurr;
float mScale;
float mRotation;
int mCount;
bool mSmallEnglishFont;
void GetStringArea(BYTE* str, int *w, int *h);
};
#endif