Files
source/Utils/WordWrap.cpp
T
Overhaul 7a27e7105d New attack busy system
Added missing #includes

Added LUA scripting and console

Changed the way tracers are visualized, so they work more like real tracers instead of a light fountain

Fixed signedness of many grid variables used in GetMouseMapPos calls

Fixed enemy weapon choosing:  Sometimes a mortar is chosen but later rejected, but the grenade class was not reset.  Caused assertion failure

Added checks so enemies don't try to chuck RPG grenades with their hands

Now possible to shoot a someone in the head if he's in water

Fixed InitSightArrays to also clear soldier interrupt duel points.  This was causing an assertion failure elsewhere in the code because the interrupt list still had soldiers on it sometimes when this function was called.

Soldiers are much less willing to forfeit their turn over an attempt to use more APs than they have

Removed early setting of muzzle flash.  This would allow enemies to get an interrupt before you even fired.

Fixed item dropping by AI.  If AI tried to drop something while standing it would cause deadlock

Change to greatly speed up closing the sector inventory window in an unloaded sector

Added conditional compile flag to always give robot weapon ready advantage, even for 360 degree sighting


Check builddefines.h for the conditional flags.  Of greatest interest might be LUA_CONSOLE.  This will cause the game to bring up a command console when run.  However this console is severely lacking in many areas.  If anybody knows of an open-source terminal/console that could be used instead, it would be appreciated.  The existing console does bad things when you try to close it, and since it counts as a separate app, it pauses the game while it has focus.

LUA scripting is very limited, basically just proof of concept.  There is one global variable, the Soldiers array.  An array index gives you the soldier in that slot in the currently loaded sector.  The soldier has a few things that can be accessed:  name (short name); fullname (long name); grid (current grid #, can be changed); walkto(grid) (function to walk to another grid); runto(grid) (function to run to another grid)


git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@924 3b4a5df2-a311-0410-b5c6-a8a6f20db521
2007-06-09 09:01:04 +00:00

2034 lines
55 KiB
C++

#ifdef PRECOMPILEDHEADERS
#include "Utils All.h"
#include "winfont.h"
#else
#include "WordWrap.h"
#include "sgp.h"
#include "Render Dirty.h"
#include "Font Control.h"
#include "Stdio.h"
#include "WinFont.h"
#endif
#define SINGLE_CHARACTER_WORD_FOR_WORDWRAP
BOOLEAN gfUseSingleCharWordsForWordWrap = FALSE;
void UseSingleCharWordsForWordWrap( BOOLEAN fUseSingleCharWords )
{
gfUseSingleCharWordsForWordWrap = fUseSingleCharWords;
}
WRAPPED_STRING *LineWrapForSingleCharWords(UINT32 ulFont, UINT16 usLineWidthPixels, UINT16 *pusLineWidthIfWordIsWiderThenWidth, STR16 pString, ...)
{
WRAPPED_STRING FirstWrappedString;
WRAPPED_STRING *pWrappedString = NULL;
CHAR16 TempString[1024];
// CHAR16 pNullString[2];
INT16 usCurIndex, usEndIndex, usDestIndex;
CHAR16 DestString[1024];
va_list argptr;
BOOLEAN fDone = FALSE;
UINT16 usCurrentWidthPixels=0;
// UINT16 usCurrentLineWidthPixels=0;
CHAR16 OneChar[2];
BOOLEAN fNewLine=FALSE;
// BOOLEAN fTheStringIsToLong=FALSE;
// INT32 iCounter=0;
// INT32 iErrorCount = 0;
// pNullString[0]=L' ';
// pNullString[1]=0;
memset(&FirstWrappedString, 0, sizeof(WRAPPED_STRING) );
*pusLineWidthIfWordIsWiderThenWidth = usLineWidthPixels;
if(pString == NULL)
return(FALSE);
va_start(argptr, pString); // Set up variable argument pointer
vswprintf(TempString, pString, argptr); // process string (get output str)
va_end(argptr);
usCurIndex = usEndIndex = usDestIndex = 0;
OneChar[1] = L'\0';
while(!fDone)
{
fNewLine=FALSE;
DestString[ usDestIndex ] = TempString[ usCurIndex ];
//If the new char is a newline character
if( DestString[usDestIndex] == NEWLINE_CHAR )
{
DestString[usDestIndex]=TempString[usCurIndex]=0;
fNewLine=TRUE;
}
//Get the next char
OneChar[0] = TempString[ usCurIndex ];
usCurrentWidthPixels += WFStringPixLength( OneChar, ulFont);
//If we are at the end of the string
if(TempString[ usCurIndex ] == 0)
{
//get to next WrappedString structure
pWrappedString = &FirstWrappedString;
while(pWrappedString->pNextWrappedString != NULL)
pWrappedString = pWrappedString->pNextWrappedString;
//allocate memory for the string
pWrappedString->pNextWrappedString = (WRAPPED_STRING *) MemAlloc( sizeof(WRAPPED_STRING) );
pWrappedString->pNextWrappedString->sString = (STR16) MemAlloc( (wcslen(DestString) +2 )* sizeof(CHAR16) );
if( pWrappedString->pNextWrappedString->sString == NULL)
return (NULL);
wcscpy(pWrappedString->pNextWrappedString->sString, DestString);
pWrappedString->pNextWrappedString->pNextWrappedString = NULL;
return(FirstWrappedString.pNextWrappedString);
}
//if we are at the end of the line
if( usCurrentWidthPixels >= usLineWidthPixels )
{
fNewLine = TRUE;
}
if( fNewLine )
{
//End the current line
DestString[ usDestIndex + 1 ] = '\0';
//get to next WrappedString structure
pWrappedString = &FirstWrappedString;
while(pWrappedString->pNextWrappedString != NULL)
pWrappedString = pWrappedString->pNextWrappedString;
//allocate memory for the string
pWrappedString->pNextWrappedString = (WRAPPED_STRING *) MemAlloc(sizeof(WRAPPED_STRING));
pWrappedString->pNextWrappedString->sString = (STR16) MemAlloc((wcslen(DestString) +2 )* sizeof(CHAR16) );
//Copy the string into the new struct
wcscpy(pWrappedString->pNextWrappedString->sString, DestString);
pWrappedString->pNextWrappedString->pNextWrappedString = NULL;
fNewLine = FALSE;
usCurrentWidthPixels =0;
usDestIndex = 0;
usCurIndex++;
usEndIndex = usCurIndex;
continue;
}
usCurIndex++;
usDestIndex++;
}
return(FirstWrappedString.pNextWrappedString);
}
WRAPPED_STRING *LineWrap(UINT32 ulFont, UINT16 usLineWidthPixels, UINT16 *pusLineWidthIfWordIsWiderThenWidth, STR16 pString, ...)
{
WRAPPED_STRING FirstWrappedString;
WRAPPED_STRING *pWrappedString = NULL;
CHAR16 TempString[1024];
CHAR16 pNullString[2];
INT16 usCurIndex, usEndIndex, usDestIndex;
STR16 pCurrentStringLoc;
CHAR16 DestString[1024];
va_list argptr;
BOOLEAN fDone = FALSE;
UINT16 usCurrentWidthPixels=0;
UINT16 usCurrentLineWidthPixels=0;
CHAR16 OneChar[2];
BOOLEAN fNewLine=FALSE;
BOOLEAN fTheStringIsToLong=FALSE;
INT32 iCounter=0;
INT32 iErrorCount = 0;
pNullString[0]=L' ';
pNullString[1]=0;
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("LineWrap: %s", pString));
memset(&FirstWrappedString, 0, sizeof(WRAPPED_STRING) );
*pusLineWidthIfWordIsWiderThenWidth = usLineWidthPixels;
if(pString == NULL)
{
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("LineWrap: done"));
return(FALSE);
}
va_start(argptr, pString); // Set up variable argument pointer
vswprintf(TempString, pString, argptr); // process string (get output str)
va_end(argptr);
usCurIndex = usEndIndex = usDestIndex = 0;
OneChar[1] = L'\0';
while(!fDone)
{
//Kris:
//This is TEMPORARY!!! Dave, I've added this to get out of the infinite loop by slowing increasing the
//line width!
iErrorCount++;
if( iErrorCount > 300 )
{
iErrorCount = 0;
usLineWidthPixels++;
}
fNewLine=FALSE;
DestString[ usDestIndex ] = TempString[ usCurIndex ];
if(DestString[usDestIndex]==NEWLINE_CHAR)
{
DestString[usDestIndex]=TempString[usCurIndex]=0;
fNewLine=TRUE;
}
OneChar[0] = TempString[ usCurIndex ];
usCurrentWidthPixels += WFStringPixLength( OneChar, ulFont);
//If we are at the end of the string
if(TempString[ usCurIndex ] == 0)
{
//get to next WrappedString structure
pWrappedString = &FirstWrappedString;
while(pWrappedString->pNextWrappedString != NULL)
pWrappedString = pWrappedString->pNextWrappedString;
//allocate memory for the string
pWrappedString->pNextWrappedString = (WRAPPED_STRING *) MemAlloc( sizeof(WRAPPED_STRING) );
pWrappedString->pNextWrappedString->sString = (STR16) MemAlloc( (wcslen(DestString) +2 )* sizeof(CHAR16) );
if( pWrappedString->pNextWrappedString->sString == NULL)
{
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("LineWrap: done"));
return (NULL);
}
wcscpy(pWrappedString->pNextWrappedString->sString, DestString);
pWrappedString->pNextWrappedString->pNextWrappedString = NULL;
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("LineWrap: done"));
return(FirstWrappedString.pNextWrappedString);
}
if((usCurrentWidthPixels > usLineWidthPixels))//||(DestString[ usDestIndex ]==NEWLINE_CHAR )||(fNewLine))
{
//if an error has occured, and the string is too long
if( fTheStringIsToLong )
DestString[ usDestIndex ] = L' ';
//Go back to begining of word
while( (DestString[ usDestIndex ] != L' ') && (usCurIndex > 0) )
{
OneChar[0] = DestString[ usDestIndex ];
usCurrentWidthPixels -= WFStringPixLength( OneChar, ulFont);
usCurIndex--;
usDestIndex--;
}
usEndIndex = usDestIndex;
if( usEndIndex < 0 )
usEndIndex = 0;
// put next line into temp buffer
DestString[usEndIndex] = 0;
//get to next WrappedString structure
pWrappedString = &FirstWrappedString;
while(pWrappedString->pNextWrappedString != NULL)
pWrappedString = pWrappedString->pNextWrappedString;
if( wcslen(DestString) != 0 )
{
//allocate memory for the string
pWrappedString->pNextWrappedString = (WRAPPED_STRING *) MemAlloc( sizeof(WRAPPED_STRING) );
pWrappedString->pNextWrappedString->sString = (STR16) MemAlloc( (wcslen(DestString) +2 )* sizeof(CHAR16) );
if( pWrappedString->pNextWrappedString->sString == NULL)
{
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("LineWrap: done"));
return (NULL);
}
wcscpy(pWrappedString->pNextWrappedString->sString, DestString);
pWrappedString->pNextWrappedString->pNextWrappedString = NULL;
usCurrentWidthPixels =0;
usDestIndex = 0;
usCurIndex++;
usEndIndex = usCurIndex;
pCurrentStringLoc = &TempString[ usEndIndex ];
//if last line, put line into string structure
if ( WFStringPixLength( pCurrentStringLoc, ulFont) < usLineWidthPixels )
{
// run until end of DestString
wcscpy(DestString, pCurrentStringLoc);
iCounter=0;
while(DestString[iCounter]!=0)
{
if(DestString[iCounter]==NEWLINE_CHAR)
{
DestString[iCounter]=0;
fNewLine=TRUE;
break;
}
iCounter++;
}
//get to next WrappedString structure
pWrappedString = &FirstWrappedString;
while(pWrappedString->pNextWrappedString != NULL)
pWrappedString = pWrappedString->pNextWrappedString;
//allocate memory for the string
pWrappedString->pNextWrappedString = (WRAPPED_STRING *) MemAlloc( sizeof(WRAPPED_STRING) );
pWrappedString->pNextWrappedString->sString = (STR16) MemAlloc( (wcslen(DestString) + 2) * sizeof(CHAR16) );
if( pWrappedString->pNextWrappedString->sString == NULL)
return (NULL);
wcscpy(pWrappedString->pNextWrappedString->sString, DestString);
pWrappedString->pNextWrappedString->pNextWrappedString = NULL;
if(fNewLine)
{
pWrappedString = &FirstWrappedString;
while(pWrappedString->pNextWrappedString != NULL)
pWrappedString = pWrappedString->pNextWrappedString;
//allocate memory for the string
pWrappedString->pNextWrappedString = (WRAPPED_STRING *) MemAlloc(sizeof(WRAPPED_STRING));
pWrappedString->pNextWrappedString->sString = (STR16) MemAlloc((wcslen(pNullString) +2 )* sizeof(CHAR16) );
wcscpy(pWrappedString->pNextWrappedString->sString, pNullString);
pWrappedString->pNextWrappedString->pNextWrappedString = NULL;
}
fDone = TRUE;
}
usCurIndex--;
usDestIndex = -1;
}
else
{
CHAR zText[1024];
sprintf( zText, "LineWrap() Error! The string ( %S ) has a word ( %S ) that is too long to fit into the required width of %d! Please fix!!", pString, &TempString[usCurIndex], usLineWidthPixels );
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, zText );
//error
usLineWidthPixels = 1 + WFStringPixLength( &TempString[usCurIndex], ulFont);
*pusLineWidthIfWordIsWiderThenWidth = usLineWidthPixels;
fTheStringIsToLong = TRUE;
usCurIndex--;
usDestIndex--;
}
}
usCurIndex++;
usDestIndex++;
}
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,String("LineWrap: done"));
return(FirstWrappedString.pNextWrappedString);
}
//
// Pass in, the x,y location for the start of the string,
// the width of the buffer
// the gap in between the lines
//
UINT16 DisplayWrappedString(UINT16 usPosX, UINT16 usPosY, UINT16 usWidth, UINT8 ubGap, UINT32 uiFont, UINT8 ubColor, STR16 pString, UINT8 ubBackGroundColor, BOOLEAN fDirty, UINT32 uiFlags)
{
WRAPPED_STRING *pFirstWrappedString, *pTempWrappedString;
UINT16 uiCounter=0;
UINT16 usLineWidthIfWordIsWiderThenWidth=0;
UINT16 usHeight;
usHeight = WFGetFontHeight(uiFont);
//If we are to a Single char for a word ( like in Taiwan )
if( gfUseSingleCharWordsForWordWrap )
{
pFirstWrappedString = LineWrapForSingleCharWords(uiFont, usWidth, &usLineWidthIfWordIsWiderThenWidth, pString);
}
else
{
pFirstWrappedString = LineWrap(uiFont, usWidth, &usLineWidthIfWordIsWiderThenWidth, pString);
}
//if an error occured and a word was bigger then the width passed in, reset the width
if( usLineWidthIfWordIsWiderThenWidth != usWidth )
usWidth = usLineWidthIfWordIsWiderThenWidth;
while(pFirstWrappedString != NULL)
{
DrawTextToScreen(pFirstWrappedString->sString, usPosX, usPosY, usWidth, uiFont, ubColor, ubBackGroundColor, fDirty, uiFlags );
pTempWrappedString = pFirstWrappedString;
pFirstWrappedString = pTempWrappedString->pNextWrappedString;
MemFree( pTempWrappedString->sString );
pTempWrappedString->sString = NULL;
MemFree( pTempWrappedString );
pTempWrappedString = NULL;
uiCounter++;
usPosY += usHeight + ubGap;
}
return(uiCounter * (WFGetFontHeight(uiFont) + ubGap));
}
UINT16 DeleteWrappedString(WRAPPED_STRING *pWrappedString)
{
WRAPPED_STRING *pTempWrappedString;
UINT16 uiCounter=0;
while(pWrappedString != NULL)
{
pTempWrappedString = pWrappedString;
pWrappedString = pTempWrappedString->pNextWrappedString;
MemFree( pTempWrappedString->sString );
pTempWrappedString->sString = NULL;
MemFree( pTempWrappedString );
pTempWrappedString = NULL;
uiCounter++;
}
return(uiCounter);
}
// DrawTextToScreen Parameters:
// The string,
// X position
// Y position
// The width of the area you are drawing in. It can be 0 for left justified
// The font
// the color you want the font
// the color of the background
// do you want to display it using dirty rects, TRUE or FALSE
// flags for either LEFT_JUSTIFIED, CENTER_JUSTIFIED, RIGHT_JUSTIFIED
BOOLEAN DrawTextToScreen(STR16 pStr, UINT16 usLocX, UINT16 usLocY, UINT16 usWidth, UINT32 ulFont, UINT8 ubColor, UINT8 ubBackGroundColor, BOOLEAN fDirty, UINT32 ulFlags)
{
UINT16 usPosX, usPosY;
UINT16 usFontHeight=0;
UINT16 usStringWidth=0;
if( ulFlags & DONT_DISPLAY_TEXT )
return( TRUE );
if( ulFlags == 0 )
ulFlags = LEFT_JUSTIFIED;
// FONT_MCOLOR_BLACK, FALSE
if( ulFlags & LEFT_JUSTIFIED )
{
usPosX = usLocX;
usPosY = usLocY;
}
else if( ulFlags & CENTER_JUSTIFIED )
{
VarFindFontCenterCoordinates( usLocX, usLocY, usWidth, WFGetFontHeight(ulFont), ulFont, (INT16 *)&usPosX, (INT16 *)&usPosY, pStr );
}
else if( ulFlags & RIGHT_JUSTIFIED )
{
VarFindFontRightCoordinates( usLocX, usLocY, usWidth, WFGetFontHeight(ulFont), ulFont, (INT16 *)&usPosX, (INT16 *)&usPosY, pStr );
}
SetFont(ulFont);
if ( USE_WINFONTS( ) )
{
COLORVAL Color = FROMRGB( 255, 255, 255 );
SetWinFontForeColor( GET_WINFONT( ), &Color );
}
else
{
SetFontForeground(ubColor);
SetFontBackground( ubBackGroundColor );
}
if( ulFlags & TEXT_SHADOWED )
ShadowText( FRAME_BUFFER, pStr, ulFont, (UINT16)(usPosX-1), (UINT16)(usPosY-1 ) );
if ( USE_WINFONTS( ) )
{
if( fDirty )
{
gprintfdirty( usPosX, usPosY, pStr);
WinFont_mprintf( GET_WINFONT( ), usPosX,usPosY,pStr);
}
else
{
WinFont_mprintf( GET_WINFONT( ), usPosX,usPosY,pStr);
}
}
else
{
if( fDirty )
{
gprintfdirty( usPosX, usPosY, pStr);
mprintf(usPosX,usPosY,pStr);
}
else
{
mprintf(usPosX,usPosY,pStr);
}
}
if( IAN_WRAP_NO_SHADOW & ulFlags )
{
// reset shadow
SetFontShadow( DEFAULT_SHADOW );
}
if( ulFlags & INVALIDATE_TEXT )
{
usFontHeight= WFGetFontHeight( ulFont );
usStringWidth = WFStringPixLength( pStr, ulFont );
InvalidateRegion( usPosX, usPosY, usPosX+usStringWidth, usPosY+usFontHeight );
}
return(TRUE);
}
//
// Pass in, the x,y location for the start of the string,
// the width of the buffer (how many pixels wide for word wrapping)
// the gap in between the lines
//
UINT16 IanDisplayWrappedString(UINT16 usPosX, UINT16 usPosY, UINT16 usWidth, UINT8 ubGap,
UINT32 uiFont, UINT8 ubColor, STR16 pString,
UINT8 ubBackGroundColor, BOOLEAN fDirty, UINT32 uiFlags)
{
UINT16 usHeight;
UINT16 usSourceCounter=0,usDestCounter=0,usWordLengthPixels,usLineLengthPixels=0,usPhraseLengthPixels=0;
UINT16 usLinesUsed=1,usLocalWidth=usWidth;
UINT32 uiLocalFont=uiFont;
UINT16 usJustification = LEFT_JUSTIFIED,usLocalPosX=usPosX;
UINT8 ubLocalColor = ubColor;
BOOLEAN fBoldOn=FALSE;
CHAR16 zLineString[128] = L"",zWordString[64]= L"";
usHeight = WFGetFontHeight( uiFont );
do
{
// each character goes towards building a new word
if (pString[usSourceCounter] != TEXT_SPACE && pString[usSourceCounter] != 0)
{
zWordString[usDestCounter++] = pString[usSourceCounter];
}
else
{
// we hit a space (or end of record), so this is the END of a word!
// is this a special CODE?
if (zWordString[0] >= TEXT_CODE_NEWLINE && zWordString[0] <= TEXT_CODE_DEFCOLOR)
{
switch(zWordString[0])
{
case TEXT_CODE_CENTER:
if (usJustification != CENTER_JUSTIFIED)
{
usJustification = CENTER_JUSTIFIED;
// erase this word string we've been building - it was just a code
memset(zWordString,0,sizeof(zWordString));
// erase the line string, we're starting from scratch
memset(zLineString,0,sizeof(zLineString));
// reset the line length - we're starting from scratch
usLineLengthPixels = 0;
// reset dest char counter
usDestCounter = 0;
}
else // turn OFF centering...
{
// shadow control
if( IAN_WRAP_NO_SHADOW & uiFlags )
{
// turn off shadow
SetFontShadow( NO_SHADOW );
}
// time to draw this line of text (centered)!
DrawTextToScreen(zLineString, usLocalPosX, usPosY, usLocalWidth, uiLocalFont, ubLocalColor, ubBackGroundColor, fDirty, usJustification);
// shadow control
if( IAN_WRAP_NO_SHADOW & uiFlags )
{
// turn on shadow
SetFontShadow( DEFAULT_SHADOW );
}
// increment Y position for next time
usPosY += (WFGetFontHeight(uiLocalFont)) + ubGap; //; // +ubGap
// we just used a line, so note that
usLinesUsed++;
// reset x position
usLocalPosX = usPosX;
// erase line string
memset(zLineString,0,sizeof(zLineString));
// erase word string
memset(zWordString,0,sizeof(zWordString));
// reset the line length
usLineLengthPixels = 0;
// reset dest char counter
usDestCounter = 0;
// turn off centering...
usJustification = LEFT_JUSTIFIED;
}
break;
case TEXT_CODE_NEWLINE:
// NEWLINE character!
// shadow control
if( IAN_WRAP_NO_SHADOW & uiFlags )
{
// turn off shadow
SetFontShadow( NO_SHADOW );
}
// Display what we have up to now
DrawTextToScreen(zLineString, usLocalPosX, usPosY, usLocalWidth, uiLocalFont, ubLocalColor, ubBackGroundColor, fDirty, usJustification );
// shadow control
if( IAN_WRAP_NO_SHADOW & uiFlags )
{
// turn on shadow
SetFontShadow( DEFAULT_SHADOW );
}
// increment Y position for next time
usPosY += (WFGetFontHeight(uiLocalFont))+ubGap; //; // +ubGap
// we just used a line, so note that
usLinesUsed++;
// reset x position
usLocalPosX = usPosX;
// erase line string
memset(zLineString,0,sizeof(zLineString));
// erase word string
memset(zWordString,0,sizeof(zWordString));
// reset the line length
usLineLengthPixels = 0;
// reset width
usLocalWidth = usWidth;
// reset dest char counter
usDestCounter = 0;
break;
case TEXT_CODE_BOLD:
if (!fBoldOn)
{
// shadow control
if( IAN_WRAP_NO_SHADOW & uiFlags )
{
// turn off shadow
SetFontShadow( NO_SHADOW );
}
// turn bold ON.... but first, write whatever we have in normal now...
DrawTextToScreen(zLineString, usLocalPosX, usPosY, usLocalWidth, uiLocalFont, ubColor, ubBackGroundColor, fDirty, usJustification );
// shadow control
if( IAN_WRAP_NO_SHADOW & uiFlags )
{
// turn on shadow
SetFontShadow( DEFAULT_SHADOW );
}
// calc length of what we just wrote
usPhraseLengthPixels = WFStringPixLength(zLineString,uiLocalFont);
// calculate new x position for next time
usLocalPosX += usPhraseLengthPixels;
// shorten width for next time
usLocalWidth -= usLineLengthPixels;
// erase line string
memset(zLineString,0,sizeof(zLineString));
// erase word string
memset(zWordString,0,sizeof(zWordString));
// turn bold ON
uiLocalFont = FONT10ARIALBOLD;
SetFontShadow(NO_SHADOW);
fBoldOn = TRUE;
// reset dest char counter
usDestCounter = 0;
}
else
{
// shadow control
if( IAN_WRAP_NO_SHADOW & uiFlags )
{
// turn off shadow
SetFontShadow( NO_SHADOW );
}
// turn bold OFF - write whatever we have in bold now...
DrawTextToScreen(zLineString, usLocalPosX, usPosY, usLocalWidth, uiLocalFont, ubColor, ubBackGroundColor, fDirty, usJustification );
// shadow control
if( IAN_WRAP_NO_SHADOW & uiFlags )
{
// turn on shadow
SetFontShadow( DEFAULT_SHADOW );
}
// calc length of what we just wrote
usPhraseLengthPixels = WFStringPixLength(zLineString,uiLocalFont);
// calculate new x position for next time
usLocalPosX += usPhraseLengthPixels;
// shorten width for next time
usLocalWidth -= usLineLengthPixels;
// erase line string
memset(zLineString,0,sizeof(zLineString));
// new by Ian Nov 30th, 1998
/*
DEF: commented out for Beta. Nov 30
// measure length of WordString and if length > 1, then we have a word to deal with
if (wcslen(zWordString) > 1)
{
// need to reduce the usSourceCounter by the true word length (not counting the code char)
usSourceCounter -= (wcslen(zWordString) - 1);
}
*/
// erase word string
memset(zWordString,0,sizeof(zWordString));
// turn bold OFF
uiLocalFont = uiFont;
fBoldOn = FALSE;
// reset dest char counter
usDestCounter = 0;
}
break;
case TEXT_CODE_NEWCOLOR:
// shadow control
if( IAN_WRAP_NO_SHADOW & uiFlags )
{
// turn off shadow
SetFontShadow( NO_SHADOW );
}
// change to new color.... but first, write whatever we have in normal now...
DrawTextToScreen(zLineString, usLocalPosX, usPosY, usLocalWidth, uiLocalFont, ubLocalColor, ubBackGroundColor, fDirty, usJustification );
// shadow control
if( IAN_WRAP_NO_SHADOW & uiFlags )
{
// turn on shadow
SetFontShadow( DEFAULT_SHADOW );
}
// the new color value is the next character in the word
if (zWordString[1] != TEXT_SPACE && zWordString[1] < 256)
ubLocalColor = (UINT8) zWordString[1];
ubLocalColor = 184;;
// calc length of what we just wrote
usPhraseLengthPixels = WFStringPixLength(zLineString,uiLocalFont);
// calculate new x position for next time
usLocalPosX += usPhraseLengthPixels;
// shorten width for next time
usLocalWidth -= usLineLengthPixels;
// erase line string
memset(zLineString,0,sizeof(zLineString));
// erase word string
memset(zWordString,0,sizeof(zWordString));
// reset dest char counter
usDestCounter = 0;
break;
case TEXT_CODE_DEFCOLOR:
// shadow control
if( IAN_WRAP_NO_SHADOW & uiFlags )
{
// turn off shadow
SetFontShadow( NO_SHADOW );
}
// turn color back to default - write whatever we have in bold now...
DrawTextToScreen(zLineString, usLocalPosX, usPosY, usLocalWidth, uiLocalFont, ubLocalColor, ubBackGroundColor, fDirty, usJustification );
// shadow control
if( IAN_WRAP_NO_SHADOW & uiFlags )
{
// turn on shadow
SetFontShadow( DEFAULT_SHADOW );
}
// calc length of what we just wrote
usPhraseLengthPixels = WFStringPixLength(zLineString,uiLocalFont);
// calculate new x position for next time
usLocalPosX += usPhraseLengthPixels;
// shorten width for next time
usLocalWidth -= usLineLengthPixels;
// erase line string
memset(zLineString,0,sizeof(zLineString));
// erase word string
memset(zWordString,0,sizeof(zWordString));
// change color back to default color
ubLocalColor = ubColor;
// reset dest char counter
usDestCounter = 0;
break;
} // end of switch of CODES
}
else // not a special character
{
// terminate the string TEMPORARILY
zWordString[usDestCounter] = 0;
// get the length (in pixels) of this word
usWordLengthPixels = WFStringPixLength(zWordString,uiLocalFont);
// add a space (in case we add another word to it)
zWordString[usDestCounter++] = 32;
// RE-terminate the string
zWordString[usDestCounter] = 0;
// can we fit it onto the length of our "line" ?
if ((usLineLengthPixels + usWordLengthPixels) < usWidth)
{
// yes we can fit this word.
// get the length AGAIN (in pixels with the SPACE) for this word
usWordLengthPixels = WFStringPixLength(zWordString,uiLocalFont);
// calc new pixel length for the line
usLineLengthPixels += usWordLengthPixels;
// reset dest char counter
usDestCounter = 0;
// add the word (with the space) to the line
wcscat(zLineString, zWordString);
}
else
{
// can't fit this word!
// shadow control
if( IAN_WRAP_NO_SHADOW & uiFlags )
{
// turn off shadow
SetFontShadow( NO_SHADOW );
}
// Display what we have up to now
DrawTextToScreen(zLineString, usLocalPosX, usPosY, usLocalWidth, uiLocalFont, ubLocalColor, ubBackGroundColor, fDirty, usJustification );
// shadow control
if( IAN_WRAP_NO_SHADOW & uiFlags )
{
// turn off shadow
SetFontShadow( DEFAULT_SHADOW );
}
// increment Y position for next time
usPosY += (WFGetFontHeight(uiLocalFont))+ubGap;//; // +ubGap
// reset x position
usLocalPosX = usPosX;
// we just used a line, so note that
usLinesUsed++;
// start off next line string with the word we couldn't fit
wcscpy(zLineString,zWordString);
// remeasure the line length
usLineLengthPixels = WFStringPixLength(zLineString,uiLocalFont);
// reset dest char counter
usDestCounter = 0;
// reset width
usLocalWidth = usWidth;
}
} // end of this word was NOT a special code
}
} while (pString[usSourceCounter++] != 0);
// terminate the entire paragraph with a null string (null character guaranteed)
wcscat(zLineString, L"");
// shadow control
if( IAN_WRAP_NO_SHADOW & uiFlags )
{
// turn off shadow
SetFontShadow( NO_SHADOW );
}
// draw the paragraph
DrawTextToScreen(zLineString, usLocalPosX, usPosY, usLocalWidth, uiLocalFont, ubLocalColor, ubBackGroundColor, fDirty, usJustification );
// shadow control
if( IAN_WRAP_NO_SHADOW & uiFlags )
{
// turn on shadow
SetFontShadow( DEFAULT_SHADOW );
}
// return how many Y pixels we used
return(usLinesUsed * ( WFGetFontHeight(uiFont) + ubGap ) ); // +ubGap
}
void CleanOutControlCodesFromString(STR16 pSourceString, STR16 pDestString)
{
INT32 iSourceCounter=0;
INT32 iDestCounter=0;
BOOLEAN fRemoveCurrentChar;
BOOLEAN fRemoveCurrentCharAndNextChar;
// this procedure will run through a STR16 and strip out all control characters. This is a nessacary as wcscmp and the like tend not to like control chars in thier strings
fRemoveCurrentChar = FALSE;
fRemoveCurrentCharAndNextChar = FALSE;
// while not end of source string,
while( pSourceString[ iSourceCounter ] != 0 )
{
if( pSourceString[ iSourceCounter + 1 ] == 0 )
{
fRemoveCurrentCharAndNextChar = FALSE;
fRemoveCurrentChar = TRUE;
}
else
{
switch ( pSourceString[iSourceCounter] )
{
case TEXT_CODE_CENTER:
case TEXT_CODE_NEWCOLOR:
case TEXT_CODE_BOLD:
case TEXT_CODE_DEFCOLOR:
if( pSourceString[ iSourceCounter + 1 ] == TEXT_SPACE )
{
fRemoveCurrentCharAndNextChar = TRUE;
fRemoveCurrentChar = FALSE;
}
else
{
fRemoveCurrentCharAndNextChar = FALSE;
fRemoveCurrentChar = TRUE;
}
break;
case TEXT_CODE_NEWLINE:
fRemoveCurrentCharAndNextChar = FALSE;
fRemoveCurrentChar = TRUE;
break;
default:
fRemoveCurrentCharAndNextChar = FALSE;
fRemoveCurrentChar = FALSE;
break;
}
}
if( fRemoveCurrentChar )
{
iSourceCounter++;
}
else if( fRemoveCurrentCharAndNextChar )
{
if( pSourceString[ iSourceCounter + 2 ] != 0 )
iSourceCounter += 2;
else
iSourceCounter ++;
}
else
{
pDestString[ iDestCounter ] = pSourceString[ iSourceCounter ];
iDestCounter++;
iSourceCounter++;
}
fRemoveCurrentCharAndNextChar = FALSE;
fRemoveCurrentChar = FALSE;
}
pDestString[ iDestCounter ] = L'\0';
return;
}
//
// Pass in, the x,y location for the start of the string,
// the width of the buffer (how many pixels wide for word wrapping)
// the gap in between the lines, the height of buffer and which page you want the text displayed for, and the total height to date
//
INT16 IanDisplayWrappedStringToPages(UINT16 usPosX, UINT16 usPosY, UINT16 usWidth, UINT16 usPageHeight, UINT16 usTotalHeight, UINT16 usPageNumber,UINT8 ubGap,
UINT32 uiFont, UINT8 ubColor, STR16 pString,
UINT8 ubBackGroundColor, BOOLEAN fDirty, UINT32 uiFlags, BOOLEAN *fOnLastPageFlag)
{
UINT16 usHeight;
UINT16 usSourceCounter=0,usDestCounter=0,usWordLengthPixels,usLineLengthPixels=0,usPhraseLengthPixels=0;
UINT16 usLinesUsed=1,usLocalWidth=usWidth;
UINT32 uiLocalFont=uiFont;
UINT16 usJustification = LEFT_JUSTIFIED,usLocalPosX=usPosX;
UINT8 ubLocalColor = ubColor;
BOOLEAN fBoldOn=FALSE;
UINT32 iTotalHeight =0;
CHAR16 zLineString[640] = L"",zWordString[640]= L"";
usHeight = WFGetFontHeight(uiFont);
// identical to ianwordwrap, but this one lets the user to specify the page they want to display, if the text takes more than one page
// multiple calls to this function will allow one to work out how many pages there are
do
{
// last page is not true, YET!
*fOnLastPageFlag = FALSE;
// each character goes towards building a new word
if (pString[usSourceCounter] != TEXT_SPACE && pString[usSourceCounter] != 0)
{
zWordString[usDestCounter++] = pString[usSourceCounter];
}
else
{
// we hit a space (or end of record), so this is the END of a word!
// is this a special CODE?
if (zWordString[0] >= TEXT_CODE_NEWLINE && zWordString[0] <= TEXT_CODE_DEFCOLOR)
{
switch(zWordString[0])
{
case TEXT_CODE_CENTER:
if (usJustification != CENTER_JUSTIFIED)
{
usJustification = CENTER_JUSTIFIED;
// erase this word string we've been building - it was just a code
memset(zWordString,0,sizeof(zWordString));
// erase the line string, we're starting from scratch
memset(zLineString,0,sizeof(zLineString));
// reset the line length - we're starting from scratch
usLineLengthPixels = 0;
// reset dest char counter
usDestCounter = 0;
}
else // turn OFF centering...
{
// time to draw this line of text (centered)!
DrawTextToScreen(zLineString, usLocalPosX, usPosY, usLocalWidth, uiLocalFont, ubLocalColor, ubBackGroundColor, fDirty, usJustification);
// increment Y position for next time
usPosY += (WFGetFontHeight(uiLocalFont)) +ubGap;
// we just used a line, so note that
usLinesUsed++;
// reset x position
usLocalPosX = usPosX;
// erase line string
memset(zLineString,0,sizeof(zLineString));
// erase word string
memset(zWordString,0,sizeof(zWordString));
// reset the line length
usLineLengthPixels = 0;
// reset dest char counter
usDestCounter = 0;
// turn off centering...
usJustification = LEFT_JUSTIFIED;
}
break;
case TEXT_CODE_NEWLINE:
// NEWLINE character!
// Display what we have up to now
DrawTextToScreen(zLineString, usLocalPosX, usPosY, usLocalWidth, uiLocalFont, ubLocalColor, ubBackGroundColor, fDirty, usJustification );
// increment Y position for next time
usPosY += (WFGetFontHeight(uiLocalFont)) +ubGap;
// we just used a line, so note that
usLinesUsed++;
// reset x position
usLocalPosX = usPosX;
// erase line string
memset(zLineString,0,sizeof(zLineString));
// erase word string
memset(zWordString,0,sizeof(zWordString));
// reset the line length
usLineLengthPixels = 0;
// reset width
usLocalWidth = usWidth;
// reset dest char counter
usDestCounter = 0;
break;
case TEXT_CODE_BOLD:
if (!fBoldOn)
{
// turn bold ON.... but first, write whatever we have in normal now...
DrawTextToScreen(zLineString, usLocalPosX, usPosY, usLocalWidth, uiLocalFont, ubColor, ubBackGroundColor, fDirty, usJustification );
// calc length of what we just wrote
usPhraseLengthPixels = WFStringPixLength(zLineString,uiLocalFont);
// calculate new x position for next time
usLocalPosX += usPhraseLengthPixels;
// shorten width for next time
usLocalWidth -= usLineLengthPixels;
// erase line string
memset(zLineString,0,sizeof(zLineString));
// erase word string
memset(zWordString,0,sizeof(zWordString));
// turn bold ON
uiLocalFont = FONT10ARIALBOLD;
SetFontShadow(NO_SHADOW);
fBoldOn = TRUE;
// reset dest char counter
usDestCounter = 0;
}
else
{
// turn bold OFF - write whatever we have in bold now...
DrawTextToScreen(zLineString, usLocalPosX, usPosY, usLocalWidth, uiLocalFont, ubColor, ubBackGroundColor, fDirty, usJustification );
// calc length of what we just wrote
usPhraseLengthPixels = WFStringPixLength(zLineString,uiLocalFont);
// calculate new x position for next time
usLocalPosX += usPhraseLengthPixels;
// shorten width for next time
usLocalWidth -= usLineLengthPixels;
// erase line string
memset(zLineString,0,sizeof(zLineString));
// erase word string
memset(zWordString,0,sizeof(zWordString));
// turn bold OFF
uiLocalFont = uiFont;
fBoldOn = FALSE;
// reset dest char counter
usDestCounter = 0;
}
break;
case TEXT_CODE_NEWCOLOR:
// change to new color.... but first, write whatever we have in normal now...
DrawTextToScreen(zLineString, usLocalPosX, usPosY, usLocalWidth, uiLocalFont, ubLocalColor, ubBackGroundColor, fDirty, usJustification );
// the new color value is the next character in the word
if (zWordString[1] != TEXT_SPACE && zWordString[1] < 256)
ubLocalColor = (UINT8) zWordString[1];
ubLocalColor = 184;;
// calc length of what we just wrote
usPhraseLengthPixels = WFStringPixLength(zLineString,uiLocalFont);
// calculate new x position for next time
usLocalPosX += usPhraseLengthPixels;
// shorten width for next time
usLocalWidth -= usLineLengthPixels;
// erase line string
memset(zLineString,0,sizeof(zLineString));
// erase word string
memset(zWordString,0,sizeof(zWordString));
// reset dest char counter
usDestCounter = 0;
break;
case TEXT_CODE_DEFCOLOR:
// turn color back to default - write whatever we have in bold now...
DrawTextToScreen(zLineString, usLocalPosX, usPosY, usLocalWidth, uiLocalFont, ubLocalColor, ubBackGroundColor, fDirty, usJustification );
// calc length of what we just wrote
usPhraseLengthPixels = WFStringPixLength(zLineString,uiLocalFont);
// calculate new x position for next time
usLocalPosX += usPhraseLengthPixels;
// shorten width for next time
usLocalWidth -= usLineLengthPixels;
// erase line string
memset(zLineString,0,sizeof(zLineString));
// erase word string
memset(zWordString,0,sizeof(zWordString));
// change color back to default color
ubLocalColor = ubColor;
// reset dest char counter
usDestCounter = 0;
break;
} // end of switch of CODES
}
else // not a special character
{
// terminate the string TEMPORARILY
zWordString[usDestCounter] = 0;
// get the length (in pixels) of this word
usWordLengthPixels = WFStringPixLength(zWordString,uiLocalFont);
// add a space (in case we add another word to it)
zWordString[usDestCounter++] = 32;
// RE-terminate the string
zWordString[usDestCounter] = 0;
// can we fit it onto the length of our "line" ?
if ((usLineLengthPixels + usWordLengthPixels) < usWidth)
{
// yes we can fit this word.
// get the length AGAIN (in pixels with the SPACE) for this word
usWordLengthPixels = WFStringPixLength(zWordString,uiLocalFont);
// calc new pixel length for the line
usLineLengthPixels += usWordLengthPixels;
// reset dest char counter
usDestCounter = 0;
// add the word (with the space) to the line
wcscat(zLineString, zWordString);
}
else
{
// Display what we have up to now
DrawTextToScreen(zLineString, usLocalPosX, usPosY, usLocalWidth, uiLocalFont, ubLocalColor, ubBackGroundColor, fDirty, usJustification );
// reset x position
usLocalPosX = usPosX;
// increment Y position for next time
usPosY += (WFGetFontHeight(uiLocalFont)) +ubGap;
// we just used a line, so note that
usLinesUsed++;
// start off next line string with the word we couldn't fit
wcscpy(zLineString,zWordString);
// remeasure the line length
usLineLengthPixels = WFStringPixLength(zLineString,uiLocalFont);
// reset dest char counter
usDestCounter = 0;
// reset width
usLocalWidth = usWidth;
}
} // end of this word was NOT a special code
}
} while (pString[usSourceCounter++] != 0);
// terminate the entire paragraph with a null string (null character guaranteed)
wcscat(zLineString, L"");
// draw the paragraph
DrawTextToScreen(zLineString, usLocalPosX, usPosY, usLocalWidth, uiLocalFont, ubLocalColor, ubBackGroundColor, fDirty, usJustification );
// return how many Y pixels we used
return(usLinesUsed * ( WFGetFontHeight(uiFont) + ( UINT16 )ubGap ) ); // +ubGap
}
// now variant for grabbing height
UINT16 IanWrappedStringHeight(UINT16 usPosX, UINT16 usPosY, UINT16 usWidth, UINT8 ubGap,
UINT32 uiFont, UINT8 ubColor, STR16 pString,
UINT8 ubBackGroundColor, BOOLEAN fDirty, UINT32 uiFlags)
{
UINT16 usHeight;
UINT16 usSourceCounter=0,usDestCounter=0,usWordLengthPixels,usLineLengthPixels=0,usPhraseLengthPixels=0;
UINT16 usLinesUsed=1,usLocalWidth=usWidth;
UINT32 uiLocalFont=uiFont;
UINT16 usJustification = LEFT_JUSTIFIED,usLocalPosX=usPosX;
UINT8 ubLocalColor = ubColor;
BOOLEAN fBoldOn=FALSE;
UINT32 iTotalHeight =0;
CHAR16 zLineString[640] = L"",zWordString[640]= L"";
usHeight = WFGetFontHeight(uiFont);
// simply a cut and paste operation on Ian Display Wrapped, but will not write string to screen
// since this all we want to do, everything IanWrapped will do but without displaying string
do
{
// each character goes towards building a new word
if (pString[usSourceCounter] != TEXT_SPACE && pString[usSourceCounter] != 0)
{
zWordString[usDestCounter++] = pString[usSourceCounter];
}
else
{
// we hit a space (or end of record), so this is the END of a word!
// is this a special CODE?
if (zWordString[0] >= TEXT_CODE_NEWLINE && zWordString[0] <= TEXT_CODE_DEFCOLOR)
{
switch(zWordString[0])
{
case TEXT_CODE_CENTER:
if (usJustification != CENTER_JUSTIFIED)
{
usJustification = CENTER_JUSTIFIED;
// erase this word string we've been building - it was just a code
memset(zWordString,0,sizeof(zWordString));
// erase the line string, we're starting from scratch
memset(zLineString,0,sizeof(zLineString));
// reset the line length - we're starting from scratch
usLineLengthPixels = 0;
// reset dest char counter
usDestCounter = 0;
}
else // turn OFF centering...
{
// increment Y position for next time
usPosY += (WFGetFontHeight(uiLocalFont)) + ubGap;
// we just used a line, so note that
usLinesUsed++;
// reset x position
usLocalPosX = usPosX;
// erase line string
memset(zLineString,0,sizeof(zLineString));
// erase word string
memset(zWordString,0,sizeof(zWordString));
// reset the line length
usLineLengthPixels = 0;
// reset dest char counter
usDestCounter = 0;
// turn off centering...
usJustification = LEFT_JUSTIFIED;
}
break;
case TEXT_CODE_NEWLINE:
// NEWLINE character!
// increment Y position for next time
usPosY += (WFGetFontHeight(uiLocalFont)) +ubGap;
// we just used a line, so note that
usLinesUsed++;
// reset x position
usLocalPosX = usPosX;
// erase line string
memset(zLineString,0,sizeof(zLineString));
// erase word string
memset(zWordString,0,sizeof(zWordString));
// reset the line length
usLineLengthPixels = 0;
// reset width
usLocalWidth = usWidth;
// reset dest char counter
usDestCounter = 0;
break;
case TEXT_CODE_BOLD:
if (!fBoldOn)
{
// calc length of what we just wrote
usPhraseLengthPixels = WFStringPixLength(zLineString,uiLocalFont);
// calculate new x position for next time
usLocalPosX += usPhraseLengthPixels;
// shorten width for next time
usLocalWidth -= usLineLengthPixels;
// erase line string
memset(zLineString,0,sizeof(zLineString));
// erase word string
memset(zWordString,0,sizeof(zWordString));
// turn bold ON
uiLocalFont = FONT10ARIALBOLD;
SetFontShadow(NO_SHADOW);
fBoldOn = TRUE;
// reset dest char counter
usDestCounter = 0;
}
else
{
// calc length of what we just wrote
usPhraseLengthPixels = WFStringPixLength(zLineString,uiLocalFont);
// calculate new x position for next time
usLocalPosX += usPhraseLengthPixels;
// shorten width for next time
usLocalWidth -= usLineLengthPixels;
// erase line string
memset(zLineString,0,sizeof(zLineString));
// erase word string
memset(zWordString,0,sizeof(zWordString));
// turn bold OFF
uiLocalFont = uiFont;
fBoldOn = FALSE;
// reset dest char counter
usDestCounter = 0;
}
break;
case TEXT_CODE_NEWCOLOR:
// the new color value is the next character in the word
if (zWordString[1] != TEXT_SPACE && zWordString[1] < 256)
ubLocalColor = (UINT8) zWordString[1];
ubLocalColor = 184;;
// calc length of what we just wrote
usPhraseLengthPixels = WFStringPixLength(zLineString,uiLocalFont);
// calculate new x position for next time
usLocalPosX += usPhraseLengthPixels;
// shorten width for next time
usLocalWidth -= usLineLengthPixels;
// erase line string
memset(zLineString,0,sizeof(zLineString));
// erase word string
memset(zWordString,0,sizeof(zWordString));
// reset dest char counter
usDestCounter = 0;
break;
case TEXT_CODE_DEFCOLOR:
// calc length of what we just wrote
usPhraseLengthPixels = WFStringPixLength(zLineString,uiLocalFont);
// calculate new x position for next time
usLocalPosX += usPhraseLengthPixels;
// shorten width for next time
usLocalWidth -= usLineLengthPixels;
// erase line string
memset(zLineString,0,sizeof(zLineString));
// erase word string
memset(zWordString,0,sizeof(zWordString));
// change color back to default color
ubLocalColor = ubColor;
// reset dest char counter
usDestCounter = 0;
break;
} // end of switch of CODES
}
else // not a special character
{
// terminate the string TEMPORARILY
zWordString[usDestCounter] = 0;
// get the length (in pixels) of this word
usWordLengthPixels = WFStringPixLength(zWordString,uiLocalFont);
// add a space (in case we add another word to it)
zWordString[usDestCounter++] = 32;
// RE-terminate the string
zWordString[usDestCounter] = 0;
// can we fit it onto the length of our "line" ?
if ((usLineLengthPixels + usWordLengthPixels) <= usWidth)
{
// yes we can fit this word.
// get the length AGAIN (in pixels with the SPACE) for this word
usWordLengthPixels = WFStringPixLength(zWordString,uiLocalFont);
// calc new pixel length for the line
usLineLengthPixels += usWordLengthPixels;
// reset dest char counter
usDestCounter = 0;
// add the word (with the space) to the line
wcscat(zLineString, zWordString);
}
else
{
// can't fit this word!
// increment Y position for next time
usPosY += (WFGetFontHeight(uiLocalFont)) +ubGap;
// reset x position
usLocalPosX = usPosX;
// we just used a line, so note that
usLinesUsed++;
// start off next line string with the word we couldn't fit
wcscpy(zLineString,zWordString);
// remeasure the line length
usLineLengthPixels = WFStringPixLength(zLineString,uiLocalFont);
// reset dest char counter
usDestCounter = 0;
// reset width
usLocalWidth = usWidth;
}
} // end of this word was NOT a special code
}
} while (pString[usSourceCounter++] != 0);
SetFontShadow(DEFAULT_SHADOW);
// return how many Y pixels we used
return( usLinesUsed * ( WFGetFontHeight(uiFont) + ( UINT16 )ubGap) ); // +ubGap
}
BOOLEAN WillThisStringGetCutOff( INT32 iTotalYPosition, INT32 iBottomOfPage, INT32 iWrapWidth, UINT32 uiFont, STR16 pString, INT32 iGap, INT32 iPage )
{
BOOLEAN fGetCutOff = FALSE;
INT32 iHeight;
// Will return if this string will get cut off
iHeight = IanWrappedStringHeight(0, 0, ( INT16 )iWrapWidth, ( UINT8 ) ( iGap ),
uiFont, 0, pString,
0, FALSE , 0);
if( iHeight + iTotalYPosition >= ((iPage + 1) * iBottomOfPage ) )
{
fGetCutOff = TRUE;
}
return( fGetCutOff );
}
BOOLEAN IsThisStringBeforeTheCurrentPage( INT32 iTotalYPosition, INT32 iPageSize, INT32 iCurrentPage ,INT32 iWrapWidth, UINT32 uiFont, STR16 pString, INT32 iGap )
{
// check to see if the current string will appear on the current page
BOOLEAN fBeforeCurrentPage = FALSE;
if( iTotalYPosition + IanWrappedStringHeight(0, 0, ( INT16 )iWrapWidth, ( UINT8 ) ( iGap ),
uiFont, 0, pString,
0, FALSE , 0) > ( iPageSize * iCurrentPage ) )
{
fBeforeCurrentPage = FALSE;
}
else if( iTotalYPosition <= ( iPageSize * iCurrentPage ) )
{
fBeforeCurrentPage = TRUE;
}
return ( fBeforeCurrentPage );
}
INT32 GetNewTotalYPositionOfThisString( INT32 iTotalYPosition, INT32 iPageSize, INT32 iCurrentPage ,INT32 iWrapWidth, UINT32 uiFont, STR16 pString, INT32 iGap )
{
INT32 iNewYPosition = 0;
// will returnt he new total y value of this string
iNewYPosition = iTotalYPosition + IanWrappedStringHeight(0, 0, ( INT16 )iWrapWidth, ( UINT8 ) ( iGap ),
uiFont, 0, pString,
0, FALSE , 0);
return( iNewYPosition );
}
void ShadowText(UINT32 uiDestVSurface, STR16 pString, UINT32 uiFont, UINT16 usPosX, UINT16 usPosY )
{
UINT32 uiLength = StringPixLength( pString, uiFont);
UINT16 usFontHeight = WFGetFontHeight( uiFont );
ShadowVideoSurfaceRect( uiDestVSurface, usPosX, usPosY, usPosX+uiLength+1, usPosY+usFontHeight+1 );
}
// for email
RecordPtr GetFirstRecordOnThisPage( RecordPtr RecordList, UINT32 uiFont, UINT16 usWidth, UINT8 ubGap, INT32 iPage, INT32 iPageSize )
{
// get the first record on this page - build pages up until this point
RecordPtr CurrentRecord = NULL;
INT32 iCurrentPositionOnThisPage = 0;
INT32 iCurrentPage =0;
// null record list, nothing to do
if( RecordList == NULL )
{
return ( CurrentRecord );
}
CurrentRecord = RecordList;
// while we are not on the current page
while( iCurrentPage < iPage )
{
// build record list to this point
while( ( iCurrentPositionOnThisPage + IanWrappedStringHeight(0, 0, usWidth, ubGap,
uiFont, 0, CurrentRecord->pRecord,
0, 0, 0 ) ) <= iPageSize )
{
// still room on this page
iCurrentPositionOnThisPage += IanWrappedStringHeight(0, 0, usWidth, ubGap,
uiFont, 0, CurrentRecord->pRecord,
0, 0, 0 ) ;
// next record
CurrentRecord = CurrentRecord -> Next;
// check if we have gone too far?
if( CurrentRecord == NULL )
{
return( CurrentRecord );
}
}
// reset position
iCurrentPositionOnThisPage = 0;
// next page
iCurrentPage++;
}
return ( CurrentRecord );
}
// for file viewer
FileStringPtr GetFirstStringOnThisPage( FileStringPtr RecordList, UINT32 uiFont, UINT16 usWidth, UINT8 ubGap, INT32 iPage, INT32 iPageSize, FileRecordWidthPtr WidthList )
{
// get the first record on this page - build pages up until this point
FileStringPtr CurrentRecord = NULL;
INT32 iCurrentPositionOnThisPage = 0;
INT32 iCurrentPage =0;
INT32 iCounter =0;
FileRecordWidthPtr pWidthList = WidthList;
UINT16 usCurrentWidth = usWidth;
// null record list, nothing to do
if( RecordList == NULL )
{
return ( CurrentRecord );
}
CurrentRecord = RecordList;
// while we are not on the current page
while( iCurrentPage < iPage )
{
usCurrentWidth = usWidth;
pWidthList = WidthList;
while( pWidthList )
{
if( iCounter == pWidthList->iRecordNumber )
{
usCurrentWidth = ( INT16 ) pWidthList->iRecordWidth;
// iCurrentPositionOnThisPage += pWidthList->iRecordHeightAdjustment;
if( pWidthList->iRecordHeightAdjustment == iPageSize )
{
if( iCurrentPositionOnThisPage != 0 )
iCurrentPositionOnThisPage += iPageSize - iCurrentPositionOnThisPage;
}
else
iCurrentPositionOnThisPage += pWidthList->iRecordHeightAdjustment;
}
pWidthList = pWidthList ->Next;
}
// build record list to this point
while( ( iCurrentPositionOnThisPage + IanWrappedStringHeight(0, 0, usCurrentWidth, ubGap,
uiFont, 0, CurrentRecord->pString,
0, 0, 0 ) ) < iPageSize )
{
// still room on this page
iCurrentPositionOnThisPage += IanWrappedStringHeight(0, 0, usCurrentWidth, ubGap,
uiFont, 0, CurrentRecord->pString,
0, 0, 0 ) ;
// next record
CurrentRecord = CurrentRecord->Next;
iCounter++;
usCurrentWidth = usWidth;
pWidthList = WidthList;
while( pWidthList )
{
if( iCounter == pWidthList->iRecordNumber )
{
usCurrentWidth = ( INT16 ) pWidthList->iRecordWidth;
if( pWidthList->iRecordHeightAdjustment == iPageSize )
{
if( iCurrentPositionOnThisPage != 0 )
iCurrentPositionOnThisPage += iPageSize - iCurrentPositionOnThisPage;
}
else
iCurrentPositionOnThisPage += pWidthList->iRecordHeightAdjustment;
}
pWidthList = pWidthList->Next;
}
}
// reset position
iCurrentPositionOnThisPage = 0;
// next page
iCurrentPage++;
// iCounter++;
}
return ( CurrentRecord );
}
BOOLEAN ReduceStringLength( STR16 pString, UINT32 uiWidthToFitIn, UINT32 uiFont )
{
CHAR16 OneChar[2];
CHAR16 zTemp[ 1024 ];
CHAR16 zStrDots[16];
UINT32 uiDotWidth;
UINT32 uiTempStringPixWidth=0;
UINT32 uiStringPixWidth;
BOOLEAN fDone = FALSE;
UINT32 uiSrcStringCntr = 0;
UINT32 uiOneCharWidth = 0;
uiStringPixWidth = WFStringPixLength( pString, uiFont );
OneChar[1] = L'\0';
zTemp[0] = L'\0';
//if the string is wider then the loaction
if( uiStringPixWidth <= uiWidthToFitIn )
{
//leave
return( TRUE );
}
//addd the '...' to the string
wcscpy( zStrDots, L"..." );
//get the width of the '...'
uiDotWidth = StringPixLength( zStrDots, uiFont );
//since the temp strig will contain the '...' add the '...' width to the temp string now
uiTempStringPixWidth = uiDotWidth;
//loop through and add each character, 1 at a time
while( !fDone )
{
//get the next char
OneChar[0] = pString[ uiSrcStringCntr ];
//get the width of the character
uiOneCharWidth = StringPixLength( OneChar, uiFont );
//will the new char + the old string be too wide for the width
if( ( uiTempStringPixWidth + uiOneCharWidth ) <= uiWidthToFitIn )
{
//add the new char to the string
wcscat( zTemp, OneChar );
//add the new char width to the string width
uiTempStringPixWidth += uiOneCharWidth;
//increment to the next string
uiSrcStringCntr++;
}
//yes the string would be too long if we add the new char, stop adding characters
else
{
//we are done
fDone = TRUE;
}
}
//combine the temp string and the '...' to form the finished string
swprintf( pString, L"%s%s", zTemp, zStrDots );
return( TRUE );
}