reman3/Rayman_X/cpa/tempgrp/GliGlou/MultiDRV/Src/GLIText.c

304 lines
11 KiB
C

/*
=======================================================================================
Name : GLIText.c
Author : vincent lhullier Date :12/10/98
Description : function to display text on screen
=======================================================================================
=======================================================================================
!!!! Warning : In retail version this file is empty !!!!
=======================================================================================
=======================================================================================
*/
#ifndef RETAIL
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#include <string.h>
#include <malloc.h>
#include "DllInter.h"
#include "FIL.h"
#include "TEX.h"
#include "..\..\gld\devvpt.h"
#include "mater_st.h"
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
=======================================================================================
Structures
=======================================================================================
*/
typedef struct tdstLetterPosition_
{
short wX;
short wY;
} tdstLetterPosition;
/*
=======================================================================================
Globals
=======================================================================================
*/
unsigned char *GLI_g_pvPoliceBitmap = NULL;
long GLI_g_lPolicePitch = 0;
//ACP_tdxHandleOfMaterial gh_PoliceMaterial;
GLI_tdstMaterial GLITEXT_st_PoliceMaterial;
ACP_tdxHandleOfTexture GLITEXT_gh_PoliceTexture = NULL;
long GLITEXT_l_ProportionalMode = 1;
long GLITEXT_l_AlreadyInit = 0;
tdstLetterPosition GLI_ga_stLetterPos[ 128 ] =
{
{ -1, -1},{ -1, -1},{ -1, -1},{ -1, -1},{ -1, -1},{ -1, -1},{ -1, -1},{ -1, -1},
{ -1, -1},{ -1, -1},{ -1, -1},{ -1, -1},{ -1, -1},{ -1, -1},{ -1, -1},{ -1, -1},
{ -1, -1},{ -1, -1},{ -1, -1},{ -1, -1},{ -1, -1},{ -1, -1},{ -1, -1},{ -1, -1},
{ -1, -1},{ -1, -1},{ -1, -1},{ -1, -1},{ -1, -1},{ -1, -1},{ -1, -1},{ -1, -1},
{ 320, 14},{ -1, -1},{ -1, -1},{ -1, -1},{ -1, -1},{ 176, 47},{ -1, -1},{ -1, -1},
{ 288, 47},{ 304, 47},{ 96, 47},{ 112, 47},{ 48, 47},{ 128, 47},{ 32, 47},{ 80, 47},
{ 0, 14},{ 16, 14},{ 32, 14},{ 48, 14},{ 64, 14},{ 80, 14},{ 96, 14},{ 112, 14},
{ 128, 14},{ 144, 14},{ 144, 47},{ 64, 47},{ 240, 47},{ -1, -1},{ 256, 47},{ -1, -1},
{ -1, -1},{ 2, 0},{ 18, 0},{ 34, 0},{ 50, 0},{ 66, 0},{ 82, 0},{ 98, 0},
{ 114, 0},{ 130, 0},{ 146, 0},{ 162, 0},{ 178, 0},{ 194, 0},{ 210, 0},{ 226, 0},
{ 242, 0},{ 258, 0},{ 274, 0},{ 290, 0},{ 306, 0},{ 322, 0},{ 338, 0},{ 354, 0},
{ 370, 0},{ 386, 0},{ 402, 0},{ -1, -1},{ -1, -1},{ -1, -1},{ -1, -1},{ 320, 47},
{ -1, -1},{ 0, 31},{ 16, 31},{ 32, 31},{ 48, 31},{ 64, 31},{ 80, 31},{ 96, 31},
{ 112, 31},{ 128, 31},{ 144, 31},{ 160, 31},{ 176, 31},{ 192, 31},{ 208, 31},{ 224, 31},
{ 240, 31},{ 256, 31},{ 272, 31},{ 288, 31},{ 304, 31},{ 320, 31},{ 336, 31},{ 352, 31},
{ 368, 31},{ 384, 31},{ 400, 31},{ -1, -1},{ -1, -1},{ -1, -1},{ -1, -1},{ -1, -1}
};
/*
=======================================================================================
Function
=======================================================================================
*/
/*
----------------------------------------------------------------------------------------
Description : Load Police bitmap
----------------------------------------------------------------------------------------
*/
void GLI_fn_vLoadPolice( void )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
struct FIL_tdstGF_ stHeader;
unsigned char *p_ucTgaBitmap;
unsigned short *p_uwPoliceBitmap, *p_uwLast;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
* load TGA file
*/
FIL_fn_vTGALoadFromFileWithInvertPicture( "", "polices.tga", &stHeader );
if (stHeader.stFileHeader.ucBpp == 0)
return;
/*
* convert data
*/
MMG_fn_vAddMemoryInfo(MMG_C_lTypeGLI , MMG_C_lSubTypePolice , NULL);
GEO_M_CPAMalloc(GLI_g_pvPoliceBitmap,unsigned char *,stHeader.stFileHeader.ulWidth * stHeader.stFileHeader.ulHeight * 2, E_uwGEONotEnoughtMemory );
p_ucTgaBitmap = stHeader.p_ucBitMap;
p_uwPoliceBitmap = (unsigned short *) GLI_g_pvPoliceBitmap;
p_uwLast = p_uwPoliceBitmap + stHeader.stFileHeader.ulWidth * stHeader.stFileHeader.ulHeight;
GLI_g_lPolicePitch = stHeader.stFileHeader.ulWidth * 2;
for ( ; p_uwPoliceBitmap < p_uwLast ; p_uwPoliceBitmap++, p_ucTgaBitmap += 3)
{
*(p_uwPoliceBitmap) = (((unsigned short)(*(p_ucTgaBitmap) & 0xF8) )<<8 ) + (((unsigned short)(*(p_ucTgaBitmap + 1) & 0xF8) )<<3 ) + (((unsigned short)(*(p_ucTgaBitmap + 2) & 0xF8) )>>3);
}
FIL_fn_vTGAFree( &stHeader.p_ucBitMap );
}
/*
----------------------------------------------------------------------------------------
Description : init text data
----------------------------------------------------------------------------------------
*/
void GLITEXT_fnv_Init( void )
{
if (GLITEXT_l_AlreadyInit)
return;
GLITEXT_l_AlreadyInit = 1;
if (GLI_g_pvPoliceBitmap == NULL)
GLI_fn_vLoadPolice();
/*
GLI_xLoadTexture( &GLITEXT_gh_PoliceTexture, NULL, "polices.tga", 0, 0);
if ( GLITEXT_gh_PoliceTexture )
TEX_vSetTextureQualityLevel(GLITEXT_gh_PoliceTexture, (char)TEX_C_QHIGH);
else
*/
GLITEXT_l_ProportionalMode = 0;
//GLI_xSetMaterialTexture( &GLITEXT_st_PoliceMaterial, GLITEXT_gh_PoliceTexture);
}
/*
----------------------------------------------------------------------------------------
Description : init text data
----------------------------------------------------------------------------------------
*/
void GLITEXT_fnv_Close( void )
{
GLITEXT_l_AlreadyInit = 0;
GLITEXT_gh_PoliceTexture = NULL;
}
/*
----------------------------------------------------------------------------------------
Description : write letter bitmap into backbuffer
----------------------------------------------------------------------------------------
*/
void GLI_fn_vWriteLetterInBackBuffer(long X, long Y, long l, long h, unsigned char *p_ucSrc, long SrcPitch , void *_p_cBackBuffer, long _lPitch )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
long *p_sourceptr , *p_sourceptrLast , *p_destptr ,lYCounterLocal;
short *p_Src;
unsigned long *p_ulDest;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//chbani platange si on depasse la taille du viewport
if( (Y+h)>480 )
Y =480-h-1;
if( (X+l)>640 )
X =640-l-1;
p_Src = (unsigned short *)p_ucSrc;
_lPitch = _lPitch/4;
p_ulDest = (unsigned long *) _p_cBackBuffer;
for (lYCounterLocal = 0; lYCounterLocal < h ; lYCounterLocal++)
{
p_destptr = (p_ulDest) + (X>>1) + _lPitch * (Y + lYCounterLocal);
p_sourceptr = ((unsigned long *)p_Src + lYCounterLocal * (SrcPitch >>2)) ;
p_sourceptrLast = p_sourceptr + (l>>1);
for (;p_sourceptr < p_sourceptrLast ;p_sourceptr ++,p_destptr ++)
*p_destptr = *p_sourceptr ;
}
}
/*
----------------------------------------------------------------------------------------
Description : display a string in screen
----------------------------------------------------------------------------------------
*/
void GLI_fn_vDisplayPolices(unsigned char *d_ucFileName, long lX, long lY, void *_p_cBuffer, long _lPitch )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
long lPosInTexture;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
if (GLI_g_pvPoliceBitmap == NULL)
return;
while ((*d_ucFileName) != 0)
{
if ( (*d_ucFileName < 128) && (GLI_ga_stLetterPos[*d_ucFileName].wY != -1) )
{
lPosInTexture = ((long) GLI_ga_stLetterPos[*d_ucFileName].wY) * GLI_g_lPolicePitch + ((long) GLI_ga_stLetterPos[*d_ucFileName].wX);
GLI_fn_vWriteLetterInBackBuffer( lX, lY, 8, 16, GLI_g_pvPoliceBitmap + lPosInTexture, GLI_g_lPolicePitch, _p_cBuffer, _lPitch);
}
d_ucFileName++;
lX+=8;
}
}
/*
----------------------------------------------------------------------------------------
Description : new function to display a string in screen
----------------------------------------------------------------------------------------
*/
extern GLD_tdpstDevice g_pstGLDDevices[ C_NB_MAX_DEVICES ];
extern void GLI_vDraw2DSpriteWithUV( GLD_tdstViewportAttributes *p_stVpt, MTH_tdxReal xXMin, MTH_tdxReal xXMax, MTH_tdxReal xYMin, MTH_tdxReal xYMax, MTH_tdxReal xUMin, MTH_tdxReal xUMax, MTH_tdxReal xVMin, MTH_tdxReal xVMax, ACP_tdxHandleOfMaterial hMaterial );
void GLITEXT_DisplayString( unsigned char *_sz_String, long lX, long lY )
{
float x, dx, y1, y2;
float u, v;
GLD_tdstViewportAttributes *pst_VptAttrib;
pst_VptAttrib = &g_pstGLDDevices[ 0 ]->pstViewports[ 0 ]->stViewAttrib;
if (pst_VptAttrib == NULL)
return;
y1 = ( (float) lY / 480.0f) * pst_VptAttrib->dwHeight;
y2 = y1 + ( (16.0f / 480.0f) * pst_VptAttrib->dwHeight );
x = ( (float) lX / 640.0f) * pst_VptAttrib->dwWidth;
dx = (8.0f / 640.0f) * pst_VptAttrib->dwWidth;
while ( ( *_sz_String ) != 0)
{
if ( (*_sz_String < 128) && (GLI_ga_stLetterPos[*_sz_String].wY != -1) )
{
u = ((float) (GLI_ga_stLetterPos[*_sz_String].wX >> 1) + 1.0f) / 256.0f;
v = 1.0f - (((float) (GLI_ga_stLetterPos[*_sz_String].wY ) +1.0f) / 64.0f);
GLI_vDraw2DSpriteWithUV( pst_VptAttrib, x, x + dx, y1, y2, u, u + 0.03125f, v, v - 0.25f, &GLITEXT_st_PoliceMaterial );
}
_sz_String++;
x += dx;
}
}
/*
----------------------------------------------------------------------------------------
Description : Main function -> lock device, display police in virtual screen and
unlock buffer
----------------------------------------------------------------------------------------
*/
void GLI_vDisplayPolices(unsigned char *d_ucFileName, long lX, long lY)
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
long lPitch;
void *p_cBackBuffer;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
if (GLITEXT_l_ProportionalMode)
{
if (GLITEXT_gh_PoliceTexture)
GLITEXT_DisplayString( d_ucFileName, lX, lY );
}
else
{
if ( GLI_DRV_bLockDevice( &p_cBackBuffer, &lPitch ) )
{
GLI_fn_vDisplayPolices( d_ucFileName, lX, lY, p_cBackBuffer, lPitch );
GLI_DRV_bUnlockDevice();
}
}
}
/*
----------------------------------------------------------------------------------------
Description : access function to display mode var
----------------------------------------------------------------------------------------
*/
void GLITEXT_fnv_SetProportionalMode( long _l_Mode )
{
GLITEXT_l_ProportionalMode = _l_Mode;
}
long GLITEXT_fnl_GetProportionalMode( void )
{
return (GLITEXT_l_ProportionalMode);
}
#endif