Home | History | Annotate | Download | only in Tools
      1 /*!****************************************************************************
      2 
      3  @file         PVRTPrint3D.h
      4  @copyright    Copyright (c) Imagination Technologies Limited.
      5  @brief        Code to print text through the 3D interface.
      6 
      7 ******************************************************************************/
      8 #ifndef _PVRTPRINT3D_H_
      9 #define _PVRTPRINT3D_H_
     10 
     11 #include "PVRTGlobal.h"
     12 #include "PVRTError.h"
     13 #include "PVRTMatrix.h"
     14 #include "PVRTVector.h"
     15 #include "PVRTArray.h"
     16 
     17 struct MetaDataBlock;
     18 template <typename KeyType, typename DataType>
     19 class CPVRTMap;
     20 
     21 /****************************************************************************
     22 ** Enums
     23 ****************************************************************************/
     24 #define PVRTPRINT3D_MAX_RENDERABLE_LETTERS	(0xFFFF >> 2)
     25 
     26 /*!***************************************************************************
     27  @enum      EPVRTPrint3DLogo
     28  @brief     Logo flags for DisplayDefaultTitle
     29 *****************************************************************************/
     30 typedef enum {
     31 	ePVRTPrint3DLogoNone	= 0x00,
     32 	ePVRTPrint3DLogoPowerVR = 0x02,
     33 	ePVRTPrint3DLogoIMG		= 0x04,
     34 	ePVRTPrint3DSDKLogo		= ePVRTPrint3DLogoPowerVR
     35 } EPVRTPrint3DLogo;
     36 
     37 /****************************************************************************
     38 ** Constants
     39 ****************************************************************************/
     40 const PVRTuint32 PVRTPRINT3D_HEADER			= 0xFCFC0050;
     41 const PVRTuint32 PVRTPRINT3D_CHARLIST		= 0xFCFC0051;
     42 const PVRTuint32 PVRTPRINT3D_RECTS			= 0xFCFC0052;
     43 const PVRTuint32 PVRTPRINT3D_METRICS		= 0xFCFC0053;
     44 const PVRTuint32 PVRTPRINT3D_YOFFSET		= 0xFCFC0054;
     45 const PVRTuint32 PVRTPRINT3D_KERNING		= 0xFCFC0055;
     46 
     47 const PVRTuint32 PVRTPRINT3D_VERSION		= 1;
     48 
     49 /****************************************************************************
     50 ** Structures
     51 ****************************************************************************/
     52 /*!**************************************************************************
     53  @struct    SPVRTPrint3DHeader
     54  @brief     A structure for information describing the loaded font.
     55 ****************************************************************************/
     56 struct SPVRTPrint3DHeader				// 12 bytes
     57 {
     58 	PVRTuint8	uVersion;				/*!< Version of PVRFont. */
     59 	PVRTuint8	uSpaceWidth;			/*!< The width of the 'Space' character. */
     60 	PVRTint16	wNumCharacters;			/*!< Total number of characters contained in this file. */
     61 	PVRTint16	wNumKerningPairs;		/*!< Number of characters which kern against each other. */
     62 	PVRTint16	wAscent;				/*!< The height of the character, in pixels, from the base line. */
     63 	PVRTint16	wLineSpace;				/*!< The base line to base line dimension, in pixels. */
     64 	PVRTint16	wBorderWidth;			/*!< px Border around each character. */
     65 };
     66 /*!**************************************************************************
     67  @struct SPVRTPrint3DAPIVertex
     68  @brief A structure for Print3Ds vertex type
     69 ****************************************************************************/
     70 struct SPVRTPrint3DAPIVertex
     71 {
     72 	VERTTYPE		sx, sy, sz, rhw;
     73 	unsigned int	color;
     74 	VERTTYPE		tu, tv;
     75 };
     76 
     77 struct PVRTextureHeaderV3;
     78 struct SPVRTPrint3DAPI;
     79 struct SPVRTContext;
     80 
     81 /*!***************************************************************************
     82  @class CPVRTPrint3D
     83  @brief Display text/logos on the screen
     84 *****************************************************************************/
     85 class CPVRTPrint3D
     86 {
     87 public:
     88 	/*!***************************************************************************
     89 	 @fn           		CPVRTPrint3D
     90 	 @brief     		Init some values.
     91 	*****************************************************************************/
     92 	CPVRTPrint3D();
     93 	/*!***************************************************************************
     94 	 @fn           		~CPVRTPrint3D
     95 	 @brief     		De-allocate the working memory
     96 	*****************************************************************************/
     97 	~CPVRTPrint3D();
     98 
     99 	/*!***************************************************************************
    100 	 @brief     		Initialization and texture upload of default font data.
    101 						Should be called only once for a Print3D object.
    102 	 @param[in]			pContext		Context
    103 	 @param[in]			dwScreenX		Screen resolution along X
    104 	 @param[in]			dwScreenY		Screen resolution along Y
    105 	 @param[in]			bRotate			Rotate print3D by 90 degrees
    106 	 @param[in]			bMakeCopy		This instance of Print3D creates a copy
    107 										of it's data instead of sharing with previous
    108 										contexts. Set this parameter if you require
    109 										thread safety.
    110 	 @return			PVR_SUCCESS or PVR_FAIL
    111 	*****************************************************************************/
    112 	EPVRTError SetTextures(
    113 		const SPVRTContext	* const pContext,
    114 		const unsigned int	dwScreenX,
    115 		const unsigned int	dwScreenY,
    116 		const bool bRotate = false,
    117 		const bool bMakeCopy = false);
    118 
    119 	/*!***************************************************************************
    120 	 @brief     		Initialization and texture upload of user-provided font
    121 						data. Should be called only once for a Print3D object.
    122 	 @param[in]			pContext		Context
    123 	 @param[in]			pTexData		User-provided font texture
    124 	 @param[in]			dwScreenX		Screen resolution along X
    125 	 @param[in]			dwScreenY		Screen resolution along Y
    126 	 @param[in]			bRotate			Rotate print3D by 90 degrees
    127 	 @param[in]			bMakeCopy		This instance of Print3D creates a copy
    128 										of it's data instead of sharing with previous
    129 										contexts. Set this parameter if you require
    130 										thread safety.
    131 	 @return			PVR_SUCCESS or PVR_FAIL
    132 	*****************************************************************************/
    133 	EPVRTError SetTextures(
    134 		const SPVRTContext	* const pContext,
    135 		const void * const pTexData,
    136 		const unsigned int	dwScreenX,
    137 		const unsigned int	dwScreenY,
    138 		const bool bRotate = false,
    139 		const bool bMakeCopy = false);
    140 
    141 	/*!***************************************************************************
    142 	 @fn           		SetProjection
    143 	 @param[in]			mProj			Projection matrix
    144 	 @brief     		Sets the projection matrix for the proceeding flush().
    145 	*****************************************************************************/
    146 	void SetProjection(const PVRTMat4& mProj);
    147 
    148 	/*!***************************************************************************
    149 	 @fn           		SetModelView
    150 	 @param[in]			mModelView			Model View matrix
    151 	 @brief     		Sets the model view matrix for the proceeding flush().
    152 	*****************************************************************************/
    153 	void SetModelView(const PVRTMat4& mModelView);
    154 
    155 	/*!***************************************************************************
    156 	 @fn           		SetFiltering
    157 	 @param[in]			eMin	The method of texture filtering for minification
    158 	 @param[in]			eMag	The method of texture filtering for minification
    159 	 @param[in]			eMip	The method of texture filtering for minification
    160 	 @brief     		Sets the method of texture filtering for the font texture.
    161 						Print3D will attempt to pick the best method by default
    162 						but this method allows the user to override this.
    163 	*****************************************************************************/
    164 	void SetFiltering(ETextureFilter eMin, ETextureFilter eMag, ETextureFilter eMip);
    165 
    166 	/*!***************************************************************************
    167 	 @brief     		Display 3D text on screen.
    168 						CPVRTPrint3D::SetTextures(...) must have been called
    169 						beforehand.
    170 						This function accepts formatting in the printf way.
    171 	 @param[in]			fPosX		Position of the text along X
    172 	 @param[in]			fPosY		Position of the text along Y
    173 	 @param[in]			fScale		Scale of the text
    174 	 @param[in]			Colour		Colour of the text
    175 	 @param[in]			pszFormat	Format string for the text
    176 	 @return			PVR_SUCCESS or PVR_FAIL
    177 	*****************************************************************************/
    178 	EPVRTError Print3D(float fPosX, float fPosY, const float fScale, unsigned int Colour, const char * const pszFormat, ...);
    179 
    180 
    181 	/*!***************************************************************************
    182 	 @brief     		Display wide-char 3D text on screen.
    183 						CPVRTPrint3D::SetTextures(...) must have been called
    184 						beforehand.
    185 						This function accepts formatting in the printf way.
    186 	 @param[in]			fPosX		Position of the text along X
    187 	 @param[in]			fPosY		Position of the text along Y
    188 	 @param[in]			fScale		Scale of the text
    189 	 @param[in]			Colour		Colour of the text
    190 	 @param[in]			pszFormat	Format string for the text
    191 	 @return			PVR_SUCCESS or PVR_FAIL
    192 	*****************************************************************************/
    193 	EPVRTError Print3D(float fPosX, float fPosY, const float fScale, unsigned int Colour, const wchar_t * const pszFormat, ...);
    194 
    195 	/*!***************************************************************************
    196 	 @fn           		DisplayDefaultTitle
    197 	 @param[in]			pszTitle			Title to display
    198 	 @param[in]			pszDescription		Description to display
    199 	 @param[in]			uDisplayLogo		1 = Display the logo
    200 	 @return			PVR_SUCCESS or PVR_FAIL
    201 	 @brief     		Creates a default title with predefined position and colours.
    202 						It displays as well company logos when requested:
    203 						0 = No logo
    204 						1 = PowerVR logo
    205 						2 = Img Tech logo
    206 	*****************************************************************************/
    207 	 EPVRTError DisplayDefaultTitle(const char * const pszTitle, const char * const pszDescription, const unsigned int uDisplayLogo);
    208 
    209 	 /*!***************************************************************************
    210 	 @brief     		Returns the size of a string in pixels.
    211 	 @param[out]		pfWidth				Width of the string in pixels
    212 	 @param[out]		pfHeight			Height of the string in pixels
    213 	 @param[in]			fScale				A value to scale the font by
    214 	 @param[in]			pszUTF8				UTF8 string to take the size of
    215 	*****************************************************************************/
    216 	void MeasureText(
    217 		float		* const pfWidth,
    218 		float		* const pfHeight,
    219 		float				fScale,
    220 		const char	* const pszUTF8);
    221 
    222 	/*!***************************************************************************
    223 	 @brief     		Returns the size of a string in pixels.
    224 	 @param[out]		pfWidth				Width of the string in pixels
    225 	 @param[out]		pfHeight			Height of the string in pixels
    226 	 @param[in]			fScale				A value to scale the font by
    227 	 @param[in]			pszUnicode			Wide character string to take the
    228 											length of.
    229 	*****************************************************************************/
    230 	void MeasureText(
    231 		float		* const pfWidth,
    232 		float		* const pfHeight,
    233 		float				fScale,
    234 		const wchar_t* const pszUnicode);
    235 
    236 	/*!***************************************************************************
    237 	@brief     	        Returns the 'ascent' of the font. This is typically the
    238                         height from the baseline of the larget glyph in the set.
    239 	@return			    The ascent.
    240 	*****************************************************************************/
    241 	unsigned int GetFontAscent();
    242 
    243 	/*!***************************************************************************
    244 	@brief     	    Returns the default line spacing (i.e baseline to baseline)
    245 					for the font.
    246 	@return			The line spacing.
    247 	*****************************************************************************/
    248 	unsigned int GetFontLineSpacing();
    249 
    250 	/*!***************************************************************************
    251 	 @brief     		Returns the current resolution used by Print3D
    252 	 @param[out]		dwScreenX		Screen resolution X
    253 	 @param[out]		dwScreenY		Screen resolution Y
    254 	*****************************************************************************/
    255 	void GetAspectRatio(unsigned int *dwScreenX, unsigned int *dwScreenY);
    256 
    257 	/*!***************************************************************************
    258 	 @brief     		Deallocate the memory allocated in SetTextures(...)
    259 	*****************************************************************************/
    260 	void ReleaseTextures();
    261 
    262 	/*!***************************************************************************
    263 	 @brief     		Flushes all the print text commands
    264 	*****************************************************************************/
    265 	int Flush();
    266 
    267 private:
    268 	/*!***************************************************************************
    269 	 @brief             Update a single line
    270 	 @param[in]			fZPos
    271 	 @param[in]			XPos
    272 	 @param[in]			YPos
    273 	 @param[in]			fScale
    274 	 @param[in]			Colour
    275 	 @param[in]			Text
    276 	 @param[in]			pVertices
    277      @return            Number of vertices affected
    278 	*****************************************************************************/
    279 	unsigned int UpdateLine(const float fZPos, float XPos, float YPos, const float fScale, const unsigned int Colour, const CPVRTArray<PVRTuint32>& Text, SPVRTPrint3DAPIVertex * const pVertices);
    280 
    281 	/*!***************************************************************************
    282 	 @brief     		Draw a single line of text.
    283 	 @return			true or false
    284 	*****************************************************************************/
    285 	bool DrawLine(SPVRTPrint3DAPIVertex *pVtx, unsigned int nVertices);
    286 
    287 	/*!***************************************************************************
    288 	@fn           		LoadFontData
    289 	@param[in]			texHeader
    290 	@param[in]			MetaDataMap
    291 	@return			    bool	true if successful.
    292 	@brief     	        Loads font data bundled with the texture file.
    293 	*****************************************************************************/
    294 	bool LoadFontData(const PVRTextureHeaderV3* texHeader, CPVRTMap<PVRTuint32, CPVRTMap<PVRTuint32, MetaDataBlock> >& MetaDataMap);
    295 
    296 	/*!***************************************************************************
    297 	@fn           		ReadMetaBlock
    298 	@param[in]			pDataCursor
    299 	@return			    bool	true if successful.
    300 	@brief     	        Reads a single meta data block from the data file.
    301 	*****************************************************************************/
    302 	bool ReadMetaBlock(const PVRTuint8** pDataCursor);
    303 
    304 	/*!***************************************************************************
    305 	@fn           		FindCharacter
    306 	@param[in]			character
    307 	@return			    The character index, or PVRPRINT3D_INVALID_CHAR if not found.
    308 	@brief     	        Finds a given character in the binary data and returns its
    309                         index.
    310 	*****************************************************************************/
    311 	PVRTuint32 FindCharacter(PVRTuint32 character) const;
    312 
    313 	/*!***************************************************************************
    314 	@fn           		CharacterCompareFunc
    315 	@param[in]			pA
    316 	@param[in]			pB
    317 	@return			    PVRTint32
    318 	@brief     	        Compares two characters for binary search.
    319 	*****************************************************************************/
    320 	static PVRTint32 CharacterCompareFunc(const void* pA, const void* pB);
    321 
    322 	/*!***************************************************************************
    323 	@fn           		KerningCompareFunc
    324 	@param[in]			pA
    325 	@param[in]			pB
    326 	@return			    VRTint32
    327 	@brief     	        Compares two kerning pairs for binary search.
    328 	*****************************************************************************/
    329 	static PVRTint32 KerningCompareFunc(const void* pA, const void* pB);
    330 
    331 	/*!***************************************************************************
    332 	@fn           		ApplyKerning
    333 	@param[in]			cA
    334 	@param[in]			cB
    335 	@param[out]			fOffset
    336 	@brief     	        Calculates kerning offset.
    337 	*****************************************************************************/
    338 	void ApplyKerning(const PVRTuint32 cA, const PVRTuint32 cB, float& fOffset) const;
    339 
    340 	/*!***************************************************************************
    341 	 @brief     		Returns the size of a string in pixels.
    342 	 @param[out]		pfWidth				Width of the string in pixels
    343 	 @param[out]		pfHeight			Height of the string in pixels
    344 	 @param[in]			fScale				Font size
    345 	 @param[in]			utf32				UTF32 string to take the size of.
    346 	*****************************************************************************/
    347 	void MeasureText(
    348 		float		* const pfWidth,
    349 		float		* const pfHeight,
    350 		float				fScale,
    351 		const CPVRTArray<PVRTuint32>& utf32);
    352 
    353 	/*!***************************************************************************
    354 	@brief     	        Takes an array of UTF32 characters and generates the required mesh.
    355 	@param[in]			fPosX		X Position
    356 	@param[in]			fPosY		Y Position
    357 	@param[in]			fScale		Text scale
    358 	@param[in]			Colour		ARGB colour
    359 	@param[in]			UTF32		Array of UTF32 characters
    360 	@param[in]			bUpdate		Whether to update the vertices
    361 	@return			    EPVRTError	Success of failure
    362 	*****************************************************************************/
    363 	EPVRTError Print3D(float fPosX, float fPosY, const float fScale, unsigned int Colour, const CPVRTArray<PVRTuint32>& UTF32, bool bUpdate);
    364 
    365 //***************************************************************************
    366 // Structures and enums for font data
    367 // The following structures are used to provide layout information for associated fonts.
    368 //*****************************************************************************/
    369 private:
    370 	struct CharacterUV
    371 	{
    372 		PVRTfloat32 fUL;
    373 		PVRTfloat32 fVT;
    374 		PVRTfloat32 fUR;
    375 		PVRTfloat32 fVB;
    376 	};
    377 
    378 	struct Rectanglei
    379 	{
    380 		PVRTint32 nX;
    381 		PVRTint32 nY;
    382 		PVRTint32 nW;
    383 		PVRTint32 nH;
    384 	};
    385 
    386 #pragma pack(push, 4)		// Force 4byte alignment.
    387 	struct KerningPair
    388 	{
    389 		PVRTuint64 uiPair;			/*!< OR'd pair for 32bit characters */
    390 		PVRTint32  iOffset;			/*!< Kerning offset (in pixels) */
    391 	};
    392 #pragma pack(pop)
    393 
    394 	struct CharMetrics
    395 	{
    396 		PVRTint16  nXOff;			/*!< Prefix offset */
    397 		PVRTuint16 nAdv;			/*!< Character width */
    398 	};
    399 
    400 	enum
    401 	{
    402 		eFilterProc_Min,
    403 		eFilterProc_Mag,
    404 		eFilterProc_Mip,
    405 
    406 		eFilterProc_Size
    407 	};
    408 
    409 	enum ELogoPos
    410 	{
    411 		eBottom = 0x01,
    412 		eTop = 0x02,
    413 		eLeft = 0x04,
    414 		eRight = 0x08
    415 	};
    416 
    417 private:
    418 	// Mesh parameters
    419 	SPVRTPrint3DAPI			*m_pAPI;
    420 	unsigned int			m_uLogoToDisplay;
    421 	unsigned short			*m_pwFacesFont;
    422 	SPVRTPrint3DAPIVertex	*m_pPrint3dVtx;
    423 	float					m_fScreenScale[2];
    424 	unsigned int			m_ui32ScreenDim[2];
    425 	bool					m_bTexturesSet;
    426 	SPVRTPrint3DAPIVertex	*m_pVtxCache;
    427 	int						m_nVtxCache;
    428 	int						m_nVtxCacheMax;
    429 	bool					m_bRotate;
    430 
    431 	// Cached memory
    432 	CPVRTArray<PVRTuint32>	m_CachedUTF32;
    433 	int						m_nCachedNumVerts;
    434 	wchar_t*				m_pwzPreviousString;
    435 	char*					m_pszPreviousString;
    436 	float					m_fPrevScale;
    437 	float					m_fPrevX;
    438 	float					m_fPrevY;
    439 	unsigned int			m_uiPrevCol;
    440 
    441 	// Font parameters
    442 	CharacterUV*			m_pUVs;
    443 	KerningPair*			m_pKerningPairs;
    444 	CharMetrics*			m_pCharMatrics;
    445 
    446 	float					m_fTexW;
    447 	float					m_fTexH;
    448 
    449 	Rectanglei*				m_pRects;
    450 	int*					m_pYOffsets;
    451 	int						m_uiNextLineH;
    452 
    453 	unsigned int			m_uiSpaceWidth;
    454 	unsigned int			m_uiNumCharacters;
    455 	unsigned int			m_uiNumKerningPairs;
    456 	unsigned int			m_uiAscent;
    457 	PVRTuint32*				m_pszCharacterList;
    458 	bool					m_bHasMipmaps;
    459 
    460 	// View parameters
    461 	PVRTMat4				m_mProj;
    462 	PVRTMat4				m_mModelView;
    463 	bool					m_bUsingProjection;
    464 	ETextureFilter			m_eFilterMethod[eFilterProc_Size];
    465 
    466 //***************************************************************************
    467 //	API specific code
    468 //  The following functions are API specific. Their implementation
    469 //	can be found in the directory *CurrentAPI*\PVRTPrint3DAPI
    470 //*****************************************************************************/
    471 private:
    472 	/*!***************************************************************************
    473 	 @fn           		APIInit
    474 	 @param[in]			pContext
    475 	 @param[in]			bMakeCopy
    476 	 @return			true or false
    477 	 @brief     		Initialization and texture upload. Should be called only once
    478 						for a given context.
    479 	*****************************************************************************/
    480 	bool APIInit(const SPVRTContext	* const pContext, bool bMakeCopy);
    481 
    482 	/*!***************************************************************************
    483 	 @fn           		APIRelease
    484 	 @brief     		Deinitialization.
    485 	*****************************************************************************/
    486 	void APIRelease();
    487 
    488 	/*!***************************************************************************
    489 	 @fn           		APIUpLoadIcons
    490 	 @param[in]			pIMG
    491 	 @return			true or false
    492 	 @brief     		Initialization and texture upload. Should be called only once
    493 						for a given context.
    494 	*****************************************************************************/
    495 	bool APIUpLoadIcons(const PVRTuint8 * const pIMG, const PVRTuint8 * const pPowerVR);
    496 
    497 	/*!***************************************************************************
    498 	 @fn           		APIUpLoadTexture
    499 	 @param[in]			pSource
    500 	 @param[in]			header
    501 	 @param[in]			MetaDataMap
    502 	 @return			true if successful, false otherwise.
    503 	 @brief     		Reads texture data from *.dat and loads it in
    504 						video memory.
    505 	*****************************************************************************/
    506 	bool APIUpLoadTexture(const PVRTuint8* pSource, const PVRTextureHeaderV3* header, CPVRTMap<PVRTuint32, CPVRTMap<PVRTuint32, MetaDataBlock> >& MetaDataMap);
    507 
    508 
    509 	/*!***************************************************************************
    510 	 @fn           		APIRenderStates
    511 	 @param[in]			nAction
    512 	 @brief     		Stores, writes and restores Render States
    513 	*****************************************************************************/
    514 	void APIRenderStates(int nAction);
    515 
    516 	/*!***************************************************************************
    517 	 @fn           		APIDrawLogo
    518 	 @param[in]			uLogoToDisplay
    519 	 @param[in]			nPod
    520 	 @brief     		nPos = -1 to the left
    521 						nPos = +1 to the right
    522 	*****************************************************************************/
    523 	void APIDrawLogo(const EPVRTPrint3DLogo uLogoToDisplay, const int ePos);
    524 };
    525 
    526 
    527 #endif /* _PVRTPRINT3D_H_ */
    528 
    529 /*****************************************************************************
    530  End of file (PVRTPrint3D.h)
    531 *****************************************************************************/
    532