2007-05-30 21:56:52 +00:00
/* ScummVM - Graphic Adventure Engine
2007-04-27 12:58:35 +00:00
*
2007-05-30 21:56:52 +00:00
* ScummVM is the legal property of its developers , whose names
* are too numerous to list here . Please refer to the COPYRIGHT
* file distributed with this source distribution .
2007-04-27 12:58:35 +00:00
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version 2
* of the License , or ( at your option ) any later version .
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 , USA .
*
* $ URL $
* $ Id $
*
*/
# include "common/file.h"
2007-12-11 23:06:12 +00:00
# include "common/util.h"
2007-04-27 12:58:35 +00:00
# include "cruise/cruise_main.h"
namespace Cruise {
// (old: fontProc1(int16 param, uint8* ptr1, uint8* ptr2))
2007-04-27 22:33:45 +00:00
int32 getLineHeight ( int16 charCount , uint8 * fontPtr , uint8 * fontPrt_Desc ) {
uint8 * dest ;
2007-04-27 12:58:35 +00:00
int32 highestChar = 0 ;
int32 i ;
2007-04-27 22:33:45 +00:00
if ( ! charCount ) {
return ( 0 ) ;
2007-04-27 12:58:35 +00:00
}
2007-04-27 22:33:45 +00:00
dest = fontPrt_Desc + 6 ; // fontPtr + 20 // char height
2007-04-27 12:58:35 +00:00
2007-04-27 22:33:45 +00:00
for ( i = 0 ; i < charCount ; i + + ) {
if ( ( * ( int16 * ) dest ) > highestChar ) {
highestChar = * ( int16 * ) dest ;
2007-04-27 12:58:35 +00:00
}
dest + = 12 ;
}
return highestChar ;
}
// this function determins how many lines the text will have (old: fontProc2(int32 param1, int32 param2, uint8* ptr, uint8* string))
2007-04-27 22:33:45 +00:00
int32 getTextLineCount ( int32 rightBorder_X , int32 wordSpacingWidth ,
2007-05-30 14:38:17 +00:00
uint8 * ptr , const uint8 * textString ) {
const uint8 * localString = textString ;
const uint8 * currentStringPtr ;
2007-04-27 22:33:45 +00:00
uint8 character ;
2007-04-27 12:58:35 +00:00
2007-04-27 22:33:45 +00:00
int32 var_6 = 0 ;
2007-04-27 12:58:35 +00:00
int32 lineLength = 0 ;
2007-05-30 14:38:17 +00:00
const uint8 * tempPtr = 0 ;
2007-04-27 12:58:35 +00:00
2007-04-27 22:33:45 +00:00
if ( ! * localString ) {
return ( 0 ) ;
2007-04-27 12:58:35 +00:00
}
currentStringPtr = localString ;
2007-04-27 22:33:45 +00:00
character = * localString ;
2007-04-27 12:58:35 +00:00
2007-04-27 22:33:45 +00:00
do {
2007-04-27 12:58:35 +00:00
int32 charData = fontCharacterTable [ character ] ;
2007-04-27 22:33:45 +00:00
if ( character = = ' | ' ) {
lineLength = rightBorder_X ;
2007-04-27 12:58:35 +00:00
localString = tempPtr ;
2007-04-27 22:33:45 +00:00
} else {
if ( charData > = 0 ) { // + 0xA jump to last 2 bytes of the 12 bytes slice = letter width
lineLength + =
wordSpacingWidth + * ( int16 * ) ( ptr + 0xA +
charData * 12 ) ;
} else {
if ( character = = ' ' ) {
2007-04-27 12:58:35 +00:00
lineLength + = wordSpacingWidth + 5 ;
localString = currentStringPtr ;
}
}
}
tempPtr = currentStringPtr ;
2007-04-27 22:33:45 +00:00
if ( rightBorder_X < = lineLength ) {
var_6 + = rightBorder_X ;
2007-04-27 12:58:35 +00:00
currentStringPtr = localString ;
2007-04-27 22:33:45 +00:00
tempPtr = localString ;
lineLength = 0 ;
}
2007-04-27 12:58:35 +00:00
2007-04-27 22:33:45 +00:00
character = * ( tempPtr + + ) ;
2007-04-27 12:58:35 +00:00
currentStringPtr = tempPtr ;
2007-04-27 22:33:45 +00:00
} while ( character ) ;
2007-04-27 12:58:35 +00:00
2007-04-27 22:33:45 +00:00
if ( lineLength = = 0 ) {
2007-04-27 12:58:35 +00:00
return ( var_6 / rightBorder_X ) ;
2007-04-27 22:33:45 +00:00
} else {
2007-04-27 12:58:35 +00:00
return ( ( var_6 + rightBorder_X ) / rightBorder_X ) ;
}
}
2007-11-10 17:15:48 +00:00
void loadFNT ( const char * fileName ) {
2007-04-27 22:33:45 +00:00
uint8 header [ 6 ] ;
int32 fontSize ;
int32 data2 ;
uint8 data3 [ 6 ] ;
2007-11-10 17:15:48 +00:00
2007-04-27 22:33:45 +00:00
_systemFNT = NULL ;
2007-04-27 12:58:35 +00:00
Common : : File fontFileHandle ;
2007-04-27 22:33:45 +00:00
2007-11-10 17:15:48 +00:00
if ( ! fontFileHandle . exists ( fileName ) ) {
2007-04-27 12:58:35 +00:00
return ;
}
2007-05-30 14:38:17 +00:00
fontFileHandle . open ( ( const char * ) fileName ) ;
2007-04-27 12:58:35 +00:00
fontFileHandle . read ( header , 4 ) ;
2007-11-10 17:15:48 +00:00
if ( strcmp ( ( char * ) header , " FNT " ) = = 0 ) {
2007-04-27 12:58:35 +00:00
fontFileHandle . read ( & fontSize , 4 ) ;
flipLong ( & fontSize ) ;
fontFileHandle . read ( & data2 , 4 ) ;
flipLong ( & data2 ) ;
2007-04-27 22:33:45 +00:00
fontFileHandle . read ( data3 , 6 ) ; // may need an endian flip ?
2007-04-27 12:58:35 +00:00
flipGen ( & data3 , 6 ) ;
2007-05-30 14:38:17 +00:00
_systemFNT = ( uint8 * ) mallocAndZero ( fontSize ) ;
2007-04-27 12:58:35 +00:00
2007-04-27 22:33:45 +00:00
if ( _systemFNT ! = NULL ) {
2007-04-27 12:58:35 +00:00
int32 i ;
2007-04-27 22:33:45 +00:00
uint8 * currentPtr ;
2007-04-27 12:58:35 +00:00
fontFileHandle . seek ( 0 ) ;
fontFileHandle . read ( header , 4 ) ; // not really require, we could fseek to 4
fontFileHandle . read ( _systemFNT , fontSize ) ;
2007-04-27 22:33:45 +00:00
flipLong ( ( int32 * ) _systemFNT ) ;
flipLong ( ( int32 * ) ( _systemFNT + 4 ) ) ;
2007-04-27 12:58:35 +00:00
flipGen ( _systemFNT + 8 , 6 ) ;
currentPtr = _systemFNT + 14 ;
2007-05-30 14:38:17 +00:00
for ( i = 0 ; i < * ( int16 * ) ( _systemFNT + 8 ) ; i + + ) {
flipLong ( ( int32 * ) currentPtr ) ;
2007-04-27 12:58:35 +00:00
currentPtr + = 4 ;
flipGen ( currentPtr , 8 ) ;
currentPtr + = 8 ;
}
}
}
fontFileHandle . close ( ) ;
}
2007-12-18 20:12:42 +00:00
void initSystem ( void ) {
2007-04-27 12:58:35 +00:00
int32 i ;
2007-12-18 20:12:42 +00:00
itemColor = 15 ;
titleColor = 9 ;
selectColor = 13 ;
subColor = 10 ;
2007-04-27 12:58:35 +00:00
2007-04-27 22:33:45 +00:00
for ( i = 0 ; i < 64 ; i + + ) {
2007-12-18 20:12:42 +00:00
strcpy ( preloadData [ i ] . name , " " ) ;
preloadData [ i ] . ptr = NULL ;
preloadData [ i ] . nofree = 0 ;
2007-04-27 12:58:35 +00:00
}
2007-12-18 20:12:42 +00:00
lowMemory = 0 ;
doFade = 0 ;
fadeFlag = 0 ;
scroll = 0 ;
2007-11-10 17:15:48 +00:00
switchPal = 0 ;
2007-12-24 16:57:14 +00:00
masterScreen = 0 ;
2007-04-27 12:58:35 +00:00
2007-12-18 20:12:42 +00:00
changeCursor ( CURSOR_NORMAL ) ;
2007-04-27 12:58:35 +00:00
2007-12-18 20:12:42 +00:00
strcpy ( cmdLine , " " ) ;
2007-04-27 12:58:35 +00:00
loadFNT ( " system.fnt " ) ;
}
2007-04-27 22:33:45 +00:00
void flipShort ( int16 * var ) {
uint8 * varPtr = ( uint8 * ) var ;
2007-12-11 23:06:12 +00:00
SWAP ( varPtr [ 0 ] , varPtr [ 1 ] ) ;
2007-04-27 12:58:35 +00:00
}
2007-04-27 22:33:45 +00:00
void flipShort ( uint16 * var ) {
uint8 * varPtr = ( uint8 * ) var ;
2007-12-11 23:06:12 +00:00
SWAP ( varPtr [ 0 ] , varPtr [ 1 ] ) ;
2007-04-27 12:58:35 +00:00
}
2007-04-27 22:33:45 +00:00
void flipLong ( int32 * var ) {
char * varPtr = ( char * ) var ;
2007-04-27 12:58:35 +00:00
2007-12-11 23:06:12 +00:00
SWAP ( varPtr [ 0 ] , varPtr [ 3 ] ) ;
SWAP ( varPtr [ 1 ] , varPtr [ 2 ] ) ;
2007-04-27 12:58:35 +00:00
}
2007-04-27 22:33:45 +00:00
void flipLong ( uint32 * var ) {
char * varPtr = ( char * ) var ;
2007-04-27 12:58:35 +00:00
2007-12-11 23:06:12 +00:00
SWAP ( varPtr [ 0 ] , varPtr [ 3 ] ) ;
SWAP ( varPtr [ 1 ] , varPtr [ 2 ] ) ;
2007-04-27 12:58:35 +00:00
}
2007-04-27 22:33:45 +00:00
void flipGen ( void * var , int32 length ) {
2007-04-27 12:58:35 +00:00
int i ;
2007-04-27 22:33:45 +00:00
short int * varPtr = ( int16 * ) var ;
2007-04-27 12:58:35 +00:00
2007-04-27 22:33:45 +00:00
for ( i = 0 ; i < ( length / 2 ) ; i + + ) {
2007-04-27 12:58:35 +00:00
flipShort ( & varPtr [ i ] ) ;
}
}
2007-04-27 22:33:45 +00:00
void renderWord ( uint8 * fontPtr_Data , uint8 * outBufferPtr ,
int32 drawPosPixel_X , int32 heightOff , int32 height , int32 param4 ,
2008-01-28 00:14:17 +00:00
int32 stringRenderBufferSize , int32 width , int32 charWidth ) {
2007-04-27 12:58:35 +00:00
int i ;
int j ;
2007-04-27 22:33:45 +00:00
uint8 * fontPtr_Data2 = fontPtr_Data + height * 2 ;
2007-04-27 12:58:35 +00:00
2007-04-27 22:33:45 +00:00
outBufferPtr + = heightOff * width * 2 ; // param2 = height , param6 = width
outBufferPtr + = drawPosPixel_X ; // param1 = drawPosPixel_X
2007-04-27 12:58:35 +00:00
2007-09-10 13:17:20 +00:00
for ( i = 0 ; i < height ; i + + ) { // y++
2007-04-27 22:33:45 +00:00
uint16 currentColor1 =
( * ( fontPtr_Data ) < < 8 ) | * ( fontPtr_Data + 1 ) ;
uint16 currentColor2 =
( * ( fontPtr_Data2 ) < < 8 ) | * ( fontPtr_Data2 + 1 ) ;
2007-04-27 12:58:35 +00:00
2007-04-27 22:33:45 +00:00
fontPtr_Data + = 2 ;
2007-04-27 12:58:35 +00:00
fontPtr_Data2 + = 2 ;
2007-04-27 22:33:45 +00:00
for ( j = 0 ; j < charWidth ; j + + ) {
* outBufferPtr =
( ( currentColor1 > > 15 ) & 1 ) | ( ( currentColor2 > >
14 ) & 2 ) ;
2007-04-27 12:58:35 +00:00
outBufferPtr + + ;
2007-04-27 22:33:45 +00:00
currentColor1 < < = 1 ;
currentColor2 < < = 1 ;
2007-04-27 12:58:35 +00:00
}
outBufferPtr + = ( width * 2 ) - charWidth ;
}
}
// returns character count and pixel size (via pointer) per line of the string (old: prepareWordRender(int32 param, int32 var1, int16* out2, uint8* ptr3, uint8* string))
2007-04-27 22:33:45 +00:00
int32 prepareWordRender ( int32 inRightBorder_X , int32 wordSpacingWidth ,
2007-05-30 14:38:17 +00:00
int16 * strPixelLength , uint8 * ptr3 , const uint8 * textString ) {
const uint8 * localString = textString ;
2007-04-27 12:58:35 +00:00
2007-04-27 22:33:45 +00:00
int32 counter = 0 ;
int32 finish = 0 ;
int32 temp_pc = 0 ; // var_A // temporary pixel count save
int32 temp_cc = 0 ; // var_C // temporary char count save
int32 pixelCount = 0 ; // si
2007-04-27 12:58:35 +00:00
2007-04-27 22:33:45 +00:00
do {
2007-04-27 12:58:35 +00:00
uint8 character = * ( localString + + ) ;
int16 charData = fontCharacterTable [ character ] ;
2007-04-27 22:33:45 +00:00
if ( character = = ' ' ) {
2007-04-27 12:58:35 +00:00
temp_cc = counter ;
temp_pc = pixelCount ;
2007-04-27 22:33:45 +00:00
if ( pixelCount + wordSpacingWidth + 5 > =
inRightBorder_X ) {
2007-04-27 12:58:35 +00:00
finish = 1 ;
2007-04-27 22:33:45 +00:00
} else {
pixelCount + = wordSpacingWidth + 5 ;
2007-04-27 12:58:35 +00:00
}
2007-04-27 22:33:45 +00:00
} else {
if ( character = = ' | ' | | ! character ) {
2007-04-27 12:58:35 +00:00
finish = 1 ;
2007-04-27 22:33:45 +00:00
} else {
if ( charData ) {
if ( pixelCount + wordSpacingWidth +
* ( int16 * ) ( ( ptr3 +
charData * 12 ) + 0xA ) > =
inRightBorder_X ) {
2007-04-27 12:58:35 +00:00
finish = 1 ;
2007-04-27 22:33:45 +00:00
if ( temp_pc ) {
2007-04-27 12:58:35 +00:00
pixelCount = temp_pc ;
2007-04-27 22:33:45 +00:00
counter = temp_cc ;
2007-04-27 12:58:35 +00:00
}
2007-04-27 22:33:45 +00:00
} else {
pixelCount + =
wordSpacingWidth +
* ( int16 * ) ( ( ptr3 +
charData * 12 ) + 0xA ) ;
2007-04-27 12:58:35 +00:00
}
}
}
}
counter + + ;
2007-04-27 22:33:45 +00:00
} while ( ! finish ) ;
2007-04-27 12:58:35 +00:00
* strPixelLength = ( int16 ) pixelCount ;
return counter ;
}
2007-04-27 22:33:45 +00:00
void drawString ( int32 x , int32 y , uint8 * string , uint8 * buffer , uint8 color ,
int32 inRightBorder_X ) {
uint8 * fontPtr ;
uint8 * fontPtr_Data ; // ptr2
uint8 * fontPtr_Desc ; // ptr3
int32 wordSpacingWidth ; // var1
int32 wordSpacingHeight ; // var2
int32 rightBorder_X ; // param2
int32 lineHeight ; // fontProc1result
2007-04-27 12:58:35 +00:00
int32 numLines ;
int32 stringHeight ;
int32 stringFinished ;
2007-04-27 22:33:45 +00:00
int32 stringWidth ; // var_1C
2007-04-27 12:58:35 +00:00
int32 stringRenderBufferSize ;
int32 useDynamicBuffer ;
2007-04-27 22:33:45 +00:00
uint8 * currentStrRenderBuffer ;
// int32 var_8; // don't need that on
int32 heightOffset ; // var_12
int32 renderBufferSize ; // var_1E
2007-04-27 12:58:35 +00:00
int needFlip ;
2007-04-27 22:33:45 +00:00
if ( ! buffer | | ! string ) {
2007-04-27 12:58:35 +00:00
return ;
}
2007-04-27 22:33:45 +00:00
if ( fontFileIndex ! = - 1 ) {
2007-04-27 12:58:35 +00:00
fontPtr = filesDatabase [ fontFileIndex ] . subData . ptr ;
2007-04-27 22:33:45 +00:00
if ( ! fontPtr ) {
2007-04-27 12:58:35 +00:00
fontPtr = _systemFNT ;
}
2007-04-27 22:33:45 +00:00
} else {
2007-04-27 12:58:35 +00:00
fontPtr = _systemFNT ;
}
2007-04-27 22:33:45 +00:00
if ( ! fontPtr ) {
2007-04-27 12:58:35 +00:00
return ;
}
2007-04-27 22:33:45 +00:00
fontPtr_Data = fontPtr + * ( int16 * ) ( fontPtr + 4 ) ;
2007-04-27 12:58:35 +00:00
fontPtr_Desc = fontPtr + 14 ;
2007-04-27 22:33:45 +00:00
lineHeight = getLineHeight ( * ( int16 * ) ( fontPtr + 8 ) , fontPtr , fontPtr_Desc ) ; // ok
2007-04-27 12:58:35 +00:00
2007-04-27 22:33:45 +00:00
wordSpacingWidth = * ( int16 * ) ( fontPtr + 10 ) ;
wordSpacingHeight = * ( int16 * ) ( fontPtr + 12 ) ;
2007-04-27 12:58:35 +00:00
2007-04-27 22:33:45 +00:00
if ( inRightBorder_X > 310 ) {
2007-04-27 12:58:35 +00:00
rightBorder_X = 310 ;
2007-04-27 22:33:45 +00:00
} else {
2007-04-27 12:58:35 +00:00
rightBorder_X = inRightBorder_X ;
}
2007-04-27 22:33:45 +00:00
if ( x + rightBorder_X > 319 ) {
2007-04-27 12:58:35 +00:00
x = 319 - rightBorder_X ;
}
2007-04-27 22:33:45 +00:00
if ( y < 0 ) {
2007-04-27 12:58:35 +00:00
y = 0 ;
}
2007-04-27 22:33:45 +00:00
if ( x < 0 ) {
2007-04-27 12:58:35 +00:00
x = 0 ;
}
2007-04-27 22:33:45 +00:00
numLines = getTextLineCount ( rightBorder_X , wordSpacingWidth , fontPtr_Desc , string ) ; // ok
2007-04-27 12:58:35 +00:00
2007-04-27 22:33:45 +00:00
if ( ! numLines ) {
2007-04-27 12:58:35 +00:00
return ;
}
stringHeight = ( ( wordSpacingHeight + lineHeight + 2 ) * numLines ) + 1 ;
2007-04-27 22:33:45 +00:00
if ( y + stringHeight > 199 ) {
2007-04-27 12:58:35 +00:00
y = 200 - stringHeight ;
}
2007-04-27 22:33:45 +00:00
stringFinished = 0 ;
stringWidth = ( rightBorder_X / 16 ) + 2 ;
2007-04-27 12:58:35 +00:00
stringRenderBufferSize = stringWidth * stringHeight * 4 ;
2007-04-27 22:33:45 +00:00
inRightBorder_X = rightBorder_X ;
2007-04-27 12:58:35 +00:00
2007-04-27 22:33:45 +00:00
if ( stringRenderBufferSize > 0x2000 ) {
currentStrRenderBuffer =
( uint8 * ) mallocAndZero ( stringRenderBufferSize ) ;
2007-04-27 12:58:35 +00:00
2007-04-27 22:33:45 +00:00
if ( ! currentStrRenderBuffer ) {
2007-04-27 12:58:35 +00:00
return ;
}
useDynamicBuffer = 1 ;
2007-04-27 22:33:45 +00:00
} else {
2007-12-27 12:05:43 +00:00
currentStrRenderBuffer = ( uint8 * ) workBuffer ;
2007-04-27 22:33:45 +00:00
useDynamicBuffer = 0 ;
2007-04-27 12:58:35 +00:00
}
resetRaster ( currentStrRenderBuffer , stringRenderBufferSize ) ;
// var_8 = 0;
heightOffset = 0 ;
2007-04-27 22:33:45 +00:00
renderBufferSize = stringRenderBufferSize ;
2007-04-27 12:58:35 +00:00
2007-04-27 22:33:45 +00:00
do {
int spacesCount = 0 ; // si
char character = * ( string ) ;
short int strPixelLength ; // var_16;
uint8 * ptrStringEnd ; // var_4 //ok
int drawPosPixel_X ; // di
while ( character = = ' ' ) {
2007-04-27 12:58:35 +00:00
spacesCount + + ;
character = * ( string + spacesCount ) ;
}
2007-04-27 22:33:45 +00:00
string + = spacesCount ;
ptrStringEnd = string + prepareWordRender ( inRightBorder_X , wordSpacingWidth , & strPixelLength , fontPtr_Desc , string ) ; //ok
2007-04-27 12:58:35 +00:00
2007-04-27 22:33:45 +00:00
if ( inRightBorder_X > strPixelLength ) {
drawPosPixel_X =
( inRightBorder_X - strPixelLength ) / 2 ;
} else {
2007-04-27 12:58:35 +00:00
drawPosPixel_X = 0 ;
}
// drawPosPixel_X = var_8;
2007-04-27 22:33:45 +00:00
do {
2007-04-27 18:54:33 +00:00
character = * ( string + + ) ;
2007-04-27 12:58:35 +00:00
2007-04-27 19:54:14 +00:00
short int data = fontCharacterTable [ ( int ) character ] ;
2007-04-27 12:58:35 +00:00
2007-04-27 22:33:45 +00:00
if ( character ) {
if ( character = = ' ' | | character = = 0x7D ) {
2007-12-18 20:12:42 +00:00
drawPosPixel_X + = wordSpacingWidth + 5 ;
2007-04-27 22:33:45 +00:00
} else {
if ( data ) {
short int * si =
( int16 * ) ( fontPtr_Desc +
data * 12 ) ;
2007-04-27 12:58:35 +00:00
//int var_2 = si[5];
2007-04-27 22:33:45 +00:00
renderWord ( fontPtr_Data +
si [ 0 ] ,
currentStrRenderBuffer ,
drawPosPixel_X ,
si [ 4 ] - si [ 3 ] +
lineHeight + heightOffset ,
si [ 3 ] , si [ 2 ] ,
renderBufferSize / 2 ,
stringWidth * 2 , si [ 5 ] ) ;
drawPosPixel_X + =
wordSpacingWidth + si [ 5 ] ;
2007-04-27 12:58:35 +00:00
}
}
2007-04-27 22:33:45 +00:00
} else {
2007-04-27 12:58:35 +00:00
stringFinished = 1 ;
}
2007-04-27 22:33:45 +00:00
if ( ptrStringEnd < = string ) {
2007-04-27 12:58:35 +00:00
break ;
}
2007-04-27 22:33:45 +00:00
} while ( ! stringFinished ) ;
2007-04-27 12:58:35 +00:00
// var_8 = 0;
heightOffset = wordSpacingHeight + lineHeight ;
2007-04-27 22:33:45 +00:00
} while ( ! stringFinished ) ;
2007-04-27 12:58:35 +00:00
needFlip = 0 ;
2007-04-27 22:33:45 +00:00
if ( buffer = = gfxModuleData . pPage00 ) {
if ( gfxModuleData . field_1 ! = 0 ) {
2007-04-27 12:58:35 +00:00
needFlip = 1 ;
gfxModuleData_field_90 ( ) ;
}
gfxModuleData_gfxWaitVSync ( ) ;
}
2007-04-27 22:33:45 +00:00
gfxModuleData_field_64 ( ( char * ) currentStrRenderBuffer , stringWidth ,
stringHeight , ( char * ) buffer , x , y , 0 ) ;
gfxModuleData_field_64 ( ( char * ) currentStrRenderBuffer , stringWidth ,
stringHeight , ( char * ) buffer , x , y , color ) ;
2007-04-27 12:58:35 +00:00
2007-04-27 22:33:45 +00:00
if ( needFlip ) {
2007-04-27 12:58:35 +00:00
gfxModuleData_flip ( ) ;
}
2007-04-27 22:33:45 +00:00
if ( useDynamicBuffer ) {
2007-04-27 12:58:35 +00:00
free ( currentStrRenderBuffer ) ;
}
}
// calculates all necessary datas and renders text
2007-05-30 14:38:17 +00:00
gfxEntryStruct * renderText ( int inRightBorder_X , const uint8 * string ) {
2007-04-27 22:33:45 +00:00
uint8 * fontPtr ;
uint8 * fontPtr_Data ; // pt2
uint8 * fontPtr_Desc ; // ptr3
int32 wordSpacingWidth ; // var1 //0 or -1
int32 wordSpacingHeight ; // var2 //0 or -1
2007-04-27 12:58:35 +00:00
int32 rightBorder_X ;
2007-04-27 22:33:45 +00:00
int32 lineHeight ; // fontProc1result
2007-04-27 12:58:35 +00:00
int32 numLines ;
int32 stringHeight ;
int32 stringFinished ;
2007-04-27 22:33:45 +00:00
int32 stringWidth ; // var_1C
2007-04-27 12:58:35 +00:00
int32 stringRenderBufferSize ;
// int32 useDynamicBuffer;
2007-04-27 22:33:45 +00:00
uint8 * currentStrRenderBuffer ;
// int32 var_8; // don't need that one
int32 heightOffset ; // var_12 // how much pixel-lines have already been drawn
2007-04-27 12:58:35 +00:00
// int32 var_1E;
2007-04-27 22:33:45 +00:00
gfxEntryStruct * generatedGfxEntry ;
2007-04-27 12:58:35 +00:00
2007-04-27 22:33:45 +00:00
// check if string is empty
if ( ! string ) {
2007-04-27 12:58:35 +00:00
return NULL ;
}
2007-04-27 22:33:45 +00:00
// check if font has been loaded, else get system font
if ( fontFileIndex ! = - 1 ) {
2007-04-27 12:58:35 +00:00
fontPtr = filesDatabase [ fontFileIndex ] . subData . ptr ;
2007-04-27 22:33:45 +00:00
if ( ! fontPtr ) {
2007-04-27 12:58:35 +00:00
fontPtr = _systemFNT ;
}
2007-04-27 22:33:45 +00:00
} else {
2007-04-27 12:58:35 +00:00
fontPtr = _systemFNT ;
}
2007-04-27 22:33:45 +00:00
if ( ! fontPtr ) {
2007-04-27 12:58:35 +00:00
return NULL ;
2007-04-27 22:33:45 +00:00
}
fontPtr_Data = fontPtr + * ( int16 * ) ( fontPtr + 4 ) ; // offset to char data
fontPtr_Desc = fontPtr + 14 ; // offset to char description
2007-04-27 12:58:35 +00:00
2007-04-27 22:33:45 +00:00
lineHeight = getLineHeight ( * ( int16 * ) ( fontPtr + 8 ) , fontPtr , fontPtr_Desc ) ; // ok
2007-04-27 12:58:35 +00:00
2007-04-27 22:33:45 +00:00
wordSpacingWidth = * ( int16 * ) ( fontPtr + 10 ) ;
wordSpacingHeight = * ( int16 * ) ( fontPtr + 12 ) ;
2007-04-27 12:58:35 +00:00
// if right border is higher then screenwidth (+ spacing), adjust border
2007-04-27 22:33:45 +00:00
if ( inRightBorder_X > 310 ) {
2007-04-27 12:58:35 +00:00
rightBorder_X = 310 ;
2007-04-27 22:33:45 +00:00
} else {
2007-04-27 12:58:35 +00:00
rightBorder_X = inRightBorder_X ;
2007-04-27 22:33:45 +00:00
}
numLines = getTextLineCount ( rightBorder_X , wordSpacingWidth , fontPtr_Desc , string ) ; // ok
2007-04-27 12:58:35 +00:00
2007-04-27 22:33:45 +00:00
if ( ! numLines ) {
2007-04-27 12:58:35 +00:00
return NULL ;
2007-04-27 22:33:45 +00:00
}
stringHeight = ( ( wordSpacingHeight + lineHeight + 2 ) * numLines ) + 1 ;
stringFinished = 0 ;
stringWidth = rightBorder_X + 2 ; // max render width to the right
2007-04-27 12:58:35 +00:00
stringRenderBufferSize = stringWidth * stringHeight * 4 ;
2007-04-27 22:33:45 +00:00
inRightBorder_X = rightBorder_X ;
2007-04-27 12:58:35 +00:00
2007-04-27 22:33:45 +00:00
currentStrRenderBuffer =
( uint8 * ) mallocAndZero ( stringRenderBufferSize ) ;
2007-04-27 12:58:35 +00:00
resetRaster ( currentStrRenderBuffer , stringRenderBufferSize ) ;
2007-04-27 22:33:45 +00:00
generatedGfxEntry = ( gfxEntryStruct * ) malloc ( sizeof ( gfxEntryStruct ) ) ;
generatedGfxEntry - > imagePtr = currentStrRenderBuffer ;
2007-04-27 12:58:35 +00:00
generatedGfxEntry - > imageSize = stringRenderBufferSize / 2 ;
generatedGfxEntry - > fontIndex = fontFileIndex ;
2007-04-27 22:33:45 +00:00
generatedGfxEntry - > height = stringHeight ;
generatedGfxEntry - > width = stringWidth ; // maximum render width to the right
2007-04-27 12:58:35 +00:00
// var_8 = 0;
heightOffset = 0 ;
2007-04-27 22:33:45 +00:00
do {
int spacesCount = 0 ; // si
2007-04-28 00:26:57 +00:00
unsigned char character = * string ;
2007-04-27 22:33:45 +00:00
short int strPixelLength ; // var_16
2007-05-30 14:38:17 +00:00
const uint8 * ptrStringEnd ; // var_4 //ok
2007-04-27 22:33:45 +00:00
int drawPosPixel_X ; // di
// find first letter in string, skip all spaces
while ( character = = ' ' ) {
2007-04-27 12:58:35 +00:00
spacesCount + + ;
character = * ( string + spacesCount ) ;
}
string + = spacesCount ;
2007-04-27 22:33:45 +00:00
// returns character count and pixel length (via pointer) per line of the text string
ptrStringEnd = string + prepareWordRender ( inRightBorder_X , wordSpacingWidth , & strPixelLength , fontPtr_Desc , string ) ; //ok
// determine how much space is left to the right and left (center text)
if ( inRightBorder_X > strPixelLength ) {
2007-04-27 12:58:35 +00:00
//var_8 = (inRightBorder_X - strPixelLength) / 2;
2007-04-27 22:33:45 +00:00
drawPosPixel_X =
( inRightBorder_X - strPixelLength ) / 2 ;
} else {
2007-04-27 12:58:35 +00:00
drawPosPixel_X = 0 ;
}
//drawPosPixel_X = var_8;
// draw textline, character wise
2007-04-27 22:33:45 +00:00
do {
2007-04-27 18:54:33 +00:00
character = * ( string + + ) ;
2007-04-27 12:58:35 +00:00
2007-04-28 00:26:57 +00:00
short int charData = fontCharacterTable [ character ] ; // get character position
2007-04-27 12:58:35 +00:00
2007-04-27 22:33:45 +00:00
if ( character ) {
if ( character = = ' ' | | character = = 0x7C ) {
drawPosPixel_X + = wordSpacingWidth + 5 ; // if char = "space" adjust word starting postion (don't render space though);
} else {
if ( charData > = 0 ) {
short int * si = ( int16 * ) ( fontPtr_Desc + charData * 12 ) ; // offset font data
2007-04-27 12:58:35 +00:00
// int var_2 = si[5]; // don't need this
2007-04-27 22:33:45 +00:00
// should ist be stringRenderBufferSize/2 for the second last param?
renderWord ( fontPtr_Data +
si [ 0 ] ,
currentStrRenderBuffer ,
drawPosPixel_X ,
si [ 4 ] - si [ 3 ] +
lineHeight + heightOffset ,
si [ 3 ] , si [ 2 ] ,
stringRenderBufferSize ,
stringWidth / 2 , si [ 5 ] ) ;
drawPosPixel_X + =
wordSpacingWidth + si [ 5 ] ;
2007-04-27 12:58:35 +00:00
}
}
2007-04-27 22:33:45 +00:00
} else {
stringFinished = 1 ; // character = 0x00
2007-04-27 12:58:35 +00:00
}
2007-04-27 22:33:45 +00:00
// check if string already reached the end
if ( ptrStringEnd < = string ) {
2007-04-27 12:58:35 +00:00
break ;
2007-04-27 22:33:45 +00:00
}
} while ( ! stringFinished ) ;
2007-04-27 12:58:35 +00:00
// var_8 = 0;
heightOffset + = wordSpacingHeight + lineHeight ;
2007-04-27 22:33:45 +00:00
} while ( ! stringFinished ) ;
2007-04-27 12:58:35 +00:00
return generatedGfxEntry ;
}
} // End of namespace Cruise