| /*!**************************************************************************** |
| |
| @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) |
| *****************************************************************************/ |