/*!**************************************************************************** @file PVRTPrint3D.h @copyright Copyright (c) Imagination Technologies Limited. @brief Code to print text through the 3D interface. ******************************************************************************/ #ifndef _PVRTPRINT3D_H_ #define _PVRTPRINT3D_H_ #include "PVRTGlobal.h" #include "PVRTError.h" #include "PVRTMatrix.h" #include "PVRTVector.h" #include "PVRTArray.h" struct MetaDataBlock; template <typename KeyType, typename DataType> class CPVRTMap; /**************************************************************************** ** Enums ****************************************************************************/ #define PVRTPRINT3D_MAX_RENDERABLE_LETTERS (0xFFFF >> 2) /*!*************************************************************************** @enum EPVRTPrint3DLogo @brief Logo flags for DisplayDefaultTitle *****************************************************************************/ typedef enum { ePVRTPrint3DLogoNone = 0x00, ePVRTPrint3DLogoPowerVR = 0x02, ePVRTPrint3DLogoIMG = 0x04, ePVRTPrint3DSDKLogo = ePVRTPrint3DLogoPowerVR } EPVRTPrint3DLogo; /**************************************************************************** ** Constants ****************************************************************************/ const PVRTuint32 PVRTPRINT3D_HEADER = 0xFCFC0050; const PVRTuint32 PVRTPRINT3D_CHARLIST = 0xFCFC0051; const PVRTuint32 PVRTPRINT3D_RECTS = 0xFCFC0052; const PVRTuint32 PVRTPRINT3D_METRICS = 0xFCFC0053; const PVRTuint32 PVRTPRINT3D_YOFFSET = 0xFCFC0054; const PVRTuint32 PVRTPRINT3D_KERNING = 0xFCFC0055; const PVRTuint32 PVRTPRINT3D_VERSION = 1; /**************************************************************************** ** Structures ****************************************************************************/ /*!************************************************************************** @struct SPVRTPrint3DHeader @brief A structure for information describing the loaded font. ****************************************************************************/ struct SPVRTPrint3DHeader // 12 bytes { PVRTuint8 uVersion; /*!< Version of PVRFont. */ PVRTuint8 uSpaceWidth; /*!< The width of the 'Space' character. */ PVRTint16 wNumCharacters; /*!< Total number of characters contained in this file. */ PVRTint16 wNumKerningPairs; /*!< Number of characters which kern against each other. */ PVRTint16 wAscent; /*!< The height of the character, in pixels, from the base line. */ PVRTint16 wLineSpace; /*!< The base line to base line dimension, in pixels. */ PVRTint16 wBorderWidth; /*!< px Border around each character. */ }; /*!************************************************************************** @struct SPVRTPrint3DAPIVertex @brief A structure for Print3Ds vertex type ****************************************************************************/ struct SPVRTPrint3DAPIVertex { VERTTYPE sx, sy, sz, rhw; unsigned int color; VERTTYPE tu, tv; }; struct PVRTextureHeaderV3; struct SPVRTPrint3DAPI; struct SPVRTContext; /*!*************************************************************************** @class CPVRTPrint3D @brief Display text/logos on the screen *****************************************************************************/ class CPVRTPrint3D { public: /*!*************************************************************************** @fn CPVRTPrint3D @brief Init some values. *****************************************************************************/ CPVRTPrint3D(); /*!*************************************************************************** @fn ~CPVRTPrint3D @brief De-allocate the working memory *****************************************************************************/ ~CPVRTPrint3D(); /*!*************************************************************************** @brief Initialization and texture upload of default font data. Should be called only once for a Print3D object. @param[in] pContext Context @param[in] dwScreenX Screen resolution along X @param[in] dwScreenY Screen resolution along Y @param[in] bRotate Rotate print3D by 90 degrees @param[in] bMakeCopy This instance of Print3D creates a copy of it's data instead of sharing with previous contexts. Set this parameter if you require thread safety. @return PVR_SUCCESS or PVR_FAIL *****************************************************************************/ EPVRTError SetTextures( const SPVRTContext * const pContext, const unsigned int dwScreenX, const unsigned int dwScreenY, const bool bRotate = false, const bool bMakeCopy = false); /*!*************************************************************************** @brief Initialization and texture upload of user-provided font data. Should be called only once for a Print3D object. @param[in] pContext Context @param[in] pTexData User-provided font texture @param[in] dwScreenX Screen resolution along X @param[in] dwScreenY Screen resolution along Y @param[in] bRotate Rotate print3D by 90 degrees @param[in] bMakeCopy This instance of Print3D creates a copy of it's data instead of sharing with previous contexts. Set this parameter if you require thread safety. @return PVR_SUCCESS or PVR_FAIL *****************************************************************************/ EPVRTError SetTextures( const SPVRTContext * const pContext, const void * const pTexData, const unsigned int dwScreenX, const unsigned int dwScreenY, const bool bRotate = false, const bool bMakeCopy = false); /*!*************************************************************************** @fn SetProjection @param[in] mProj Projection matrix @brief Sets the projection matrix for the proceeding flush(). *****************************************************************************/ void SetProjection(const PVRTMat4& mProj); /*!*************************************************************************** @fn SetModelView @param[in] mModelView Model View matrix @brief Sets the model view matrix for the proceeding flush(). *****************************************************************************/ void SetModelView(const PVRTMat4& mModelView); /*!*************************************************************************** @fn SetFiltering @param[in] eMin The method of texture filtering for minification @param[in] eMag The method of texture filtering for minification @param[in] eMip The method of texture filtering for minification @brief Sets the method of texture filtering for the font texture. Print3D will attempt to pick the best method by default but this method allows the user to override this. *****************************************************************************/ void SetFiltering(ETextureFilter eMin, ETextureFilter eMag, ETextureFilter eMip); /*!*************************************************************************** @brief Display 3D text on screen. CPVRTPrint3D::SetTextures(...) must have been called beforehand. This function accepts formatting in the printf way. @param[in] fPosX Position of the text along X @param[in] fPosY Position of the text along Y @param[in] fScale Scale of the text @param[in] Colour Colour of the text @param[in] pszFormat Format string for the text @return PVR_SUCCESS or PVR_FAIL *****************************************************************************/ EPVRTError Print3D(float fPosX, float fPosY, const float fScale, unsigned int Colour, const char * const pszFormat, ...); /*!*************************************************************************** @brief Display wide-char 3D text on screen. CPVRTPrint3D::SetTextures(...) must have been called beforehand. This function accepts formatting in the printf way. @param[in] fPosX Position of the text along X @param[in] fPosY Position of the text along Y @param[in] fScale Scale of the text @param[in] Colour Colour of the text @param[in] pszFormat Format string for the text @return PVR_SUCCESS or PVR_FAIL *****************************************************************************/ EPVRTError Print3D(float fPosX, float fPosY, const float fScale, unsigned int Colour, const wchar_t * const pszFormat, ...); /*!*************************************************************************** @fn DisplayDefaultTitle @param[in] pszTitle Title to display @param[in] pszDescription Description to display @param[in] uDisplayLogo 1 = Display the logo @return PVR_SUCCESS or PVR_FAIL @brief Creates a default title with predefined position and colours. It displays as well company logos when requested: 0 = No logo 1 = PowerVR logo 2 = Img Tech logo *****************************************************************************/ EPVRTError DisplayDefaultTitle(const char * const pszTitle, const char * const pszDescription, const unsigned int uDisplayLogo); /*!*************************************************************************** @brief Returns the size of a string in pixels. @param[out] pfWidth Width of the string in pixels @param[out] pfHeight Height of the string in pixels @param[in] fScale A value to scale the font by @param[in] pszUTF8 UTF8 string to take the size of *****************************************************************************/ void MeasureText( float * const pfWidth, float * const pfHeight, float fScale, const char * const pszUTF8); /*!*************************************************************************** @brief Returns the size of a string in pixels. @param[out] pfWidth Width of the string in pixels @param[out] pfHeight Height of the string in pixels @param[in] fScale A value to scale the font by @param[in] pszUnicode Wide character string to take the length of. *****************************************************************************/ void MeasureText( float * const pfWidth, float * const pfHeight, float fScale, const wchar_t* const pszUnicode); /*!*************************************************************************** @brief Returns the 'ascent' of the font. This is typically the height from the baseline of the larget glyph in the set. @return The ascent. *****************************************************************************/ unsigned int GetFontAscent(); /*!*************************************************************************** @brief Returns the default line spacing (i.e baseline to baseline) for the font. @return The line spacing. *****************************************************************************/ unsigned int GetFontLineSpacing(); /*!*************************************************************************** @brief Returns the current resolution used by Print3D @param[out] dwScreenX Screen resolution X @param[out] dwScreenY Screen resolution Y *****************************************************************************/ void GetAspectRatio(unsigned int *dwScreenX, unsigned int *dwScreenY); /*!*************************************************************************** @brief Deallocate the memory allocated in SetTextures(...) *****************************************************************************/ void ReleaseTextures(); /*!*************************************************************************** @brief Flushes all the print text commands *****************************************************************************/ int Flush(); private: /*!*************************************************************************** @brief Update a single line @param[in] fZPos @param[in] XPos @param[in] YPos @param[in] fScale @param[in] Colour @param[in] Text @param[in] pVertices @return Number of vertices affected *****************************************************************************/ unsigned int UpdateLine(const float fZPos, float XPos, float YPos, const float fScale, const unsigned int Colour, const CPVRTArray<PVRTuint32>& Text, SPVRTPrint3DAPIVertex * const pVertices); /*!*************************************************************************** @brief Draw a single line of text. @return true or false *****************************************************************************/ bool DrawLine(SPVRTPrint3DAPIVertex *pVtx, unsigned int nVertices); /*!*************************************************************************** @fn LoadFontData @param[in] texHeader @param[in] MetaDataMap @return bool true if successful. @brief Loads font data bundled with the texture file. *****************************************************************************/ bool LoadFontData(const PVRTextureHeaderV3* texHeader, CPVRTMap<PVRTuint32, CPVRTMap<PVRTuint32, MetaDataBlock> >& MetaDataMap); /*!*************************************************************************** @fn ReadMetaBlock @param[in] pDataCursor @return bool true if successful. @brief Reads a single meta data block from the data file. *****************************************************************************/ bool ReadMetaBlock(const PVRTuint8** pDataCursor); /*!*************************************************************************** @fn FindCharacter @param[in] character @return The character index, or PVRPRINT3D_INVALID_CHAR if not found. @brief Finds a given character in the binary data and returns its index. *****************************************************************************/ PVRTuint32 FindCharacter(PVRTuint32 character) const; /*!*************************************************************************** @fn CharacterCompareFunc @param[in] pA @param[in] pB @return PVRTint32 @brief Compares two characters for binary search. *****************************************************************************/ static PVRTint32 CharacterCompareFunc(const void* pA, const void* pB); /*!*************************************************************************** @fn KerningCompareFunc @param[in] pA @param[in] pB @return VRTint32 @brief Compares two kerning pairs for binary search. *****************************************************************************/ static PVRTint32 KerningCompareFunc(const void* pA, const void* pB); /*!*************************************************************************** @fn ApplyKerning @param[in] cA @param[in] cB @param[out] fOffset @brief Calculates kerning offset. *****************************************************************************/ void ApplyKerning(const PVRTuint32 cA, const PVRTuint32 cB, float& fOffset) const; /*!*************************************************************************** @brief Returns the size of a string in pixels. @param[out] pfWidth Width of the string in pixels @param[out] pfHeight Height of the string in pixels @param[in] fScale Font size @param[in] utf32 UTF32 string to take the size of. *****************************************************************************/ void MeasureText( float * const pfWidth, float * const pfHeight, float fScale, const CPVRTArray<PVRTuint32>& utf32); /*!*************************************************************************** @brief Takes an array of UTF32 characters and generates the required mesh. @param[in] fPosX X Position @param[in] fPosY Y Position @param[in] fScale Text scale @param[in] Colour ARGB colour @param[in] UTF32 Array of UTF32 characters @param[in] bUpdate Whether to update the vertices @return EPVRTError Success of failure *****************************************************************************/ EPVRTError Print3D(float fPosX, float fPosY, const float fScale, unsigned int Colour, const CPVRTArray<PVRTuint32>& UTF32, bool bUpdate); //*************************************************************************** // Structures and enums for font data // The following structures are used to provide layout information for associated fonts. //*****************************************************************************/ private: struct CharacterUV { PVRTfloat32 fUL; PVRTfloat32 fVT; PVRTfloat32 fUR; PVRTfloat32 fVB; }; struct Rectanglei { PVRTint32 nX; PVRTint32 nY; PVRTint32 nW; PVRTint32 nH; }; #pragma pack(push, 4) // Force 4byte alignment. struct KerningPair { PVRTuint64 uiPair; /*!< OR'd pair for 32bit characters */ PVRTint32 iOffset; /*!< Kerning offset (in pixels) */ }; #pragma pack(pop) struct CharMetrics { PVRTint16 nXOff; /*!< Prefix offset */ PVRTuint16 nAdv; /*!< Character width */ }; enum { eFilterProc_Min, eFilterProc_Mag, eFilterProc_Mip, eFilterProc_Size }; enum ELogoPos { eBottom = 0x01, eTop = 0x02, eLeft = 0x04, eRight = 0x08 }; private: // Mesh parameters SPVRTPrint3DAPI *m_pAPI; unsigned int m_uLogoToDisplay; unsigned short *m_pwFacesFont; SPVRTPrint3DAPIVertex *m_pPrint3dVtx; float m_fScreenScale[2]; unsigned int m_ui32ScreenDim[2]; bool m_bTexturesSet; SPVRTPrint3DAPIVertex *m_pVtxCache; int m_nVtxCache; int m_nVtxCacheMax; bool m_bRotate; // Cached memory CPVRTArray<PVRTuint32> m_CachedUTF32; int m_nCachedNumVerts; wchar_t* m_pwzPreviousString; char* m_pszPreviousString; float m_fPrevScale; float m_fPrevX; float m_fPrevY; unsigned int m_uiPrevCol; // Font parameters CharacterUV* m_pUVs; KerningPair* m_pKerningPairs; CharMetrics* m_pCharMatrics; float m_fTexW; float m_fTexH; Rectanglei* m_pRects; int* m_pYOffsets; int m_uiNextLineH; unsigned int m_uiSpaceWidth; unsigned int m_uiNumCharacters; unsigned int m_uiNumKerningPairs; unsigned int m_uiAscent; PVRTuint32* m_pszCharacterList; bool m_bHasMipmaps; // View parameters PVRTMat4 m_mProj; PVRTMat4 m_mModelView; bool m_bUsingProjection; ETextureFilter m_eFilterMethod[eFilterProc_Size]; //*************************************************************************** // API specific code // The following functions are API specific. Their implementation // can be found in the directory *CurrentAPI*\PVRTPrint3DAPI //*****************************************************************************/ private: /*!*************************************************************************** @fn APIInit @param[in] pContext @param[in] bMakeCopy @return true or false @brief Initialization and texture upload. Should be called only once for a given context. *****************************************************************************/ bool APIInit(const SPVRTContext * const pContext, bool bMakeCopy); /*!*************************************************************************** @fn APIRelease @brief Deinitialization. *****************************************************************************/ void APIRelease(); /*!*************************************************************************** @fn APIUpLoadIcons @param[in] pIMG @return true or false @brief Initialization and texture upload. Should be called only once for a given context. *****************************************************************************/ bool APIUpLoadIcons(const PVRTuint8 * const pIMG, const PVRTuint8 * const pPowerVR); /*!*************************************************************************** @fn APIUpLoadTexture @param[in] pSource @param[in] header @param[in] MetaDataMap @return true if successful, false otherwise. @brief Reads texture data from *.dat and loads it in video memory. *****************************************************************************/ bool APIUpLoadTexture(const PVRTuint8* pSource, const PVRTextureHeaderV3* header, CPVRTMap<PVRTuint32, CPVRTMap<PVRTuint32, MetaDataBlock> >& MetaDataMap); /*!*************************************************************************** @fn APIRenderStates @param[in] nAction @brief Stores, writes and restores Render States *****************************************************************************/ void APIRenderStates(int nAction); /*!*************************************************************************** @fn APIDrawLogo @param[in] uLogoToDisplay @param[in] nPod @brief nPos = -1 to the left nPos = +1 to the right *****************************************************************************/ void APIDrawLogo(const EPVRTPrint3DLogo uLogoToDisplay, const int ePos); }; #endif /* _PVRTPRINT3D_H_ */ /***************************************************************************** End of file (PVRTPrint3D.h) *****************************************************************************/