Files
source/Utils/WordWrap.cpp
T

2105 lines
56 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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 = 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;
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 = 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)
#ifdef CHINESE
&& TempString[usCurIndex] != L''
&& TempString[usCurIndex] != L'。'
&& TempString[usCurIndex] != L''
&& TempString[usCurIndex] != L'”'
&& TempString[usCurIndex] != L''
&& TempString[usCurIndex] != L''
&& TempString[usCurIndex] != L'、'
&& TempString[usCurIndex] != L'?'
&& TempString[usCurIndex] != L''
&& TempString[usCurIndex] != L')'
&& TempString[usCurIndex] != L''
#endif
)//||(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)
#ifdef CHINESE
&& DestString[usDestIndex] < 255
#endif
)
{
OneChar[0] = DestString[ usDestIndex ];
usCurrentWidthPixels = usCurrentWidthPixels - WFStringPixLength( OneChar, ulFont);
usCurIndex--;
usDestIndex--;
}
#ifdef CHINESE
if (DestString[usDestIndex] > 255)
{
if (DestString[usDestIndex] == L''
|| DestString[usDestIndex] == L','
|| DestString[usDestIndex] == L'。'
|| DestString[usDestIndex] == L''
|| DestString[usDestIndex] == L'”'
|| DestString[usDestIndex] == L''
|| DestString[usDestIndex] == L''
|| DestString[usDestIndex] == L'、'
|| DestString[usDestIndex] == L'?'
|| DestString[usDestIndex] == L''
|| DestString[usDestIndex] == L')'
|| DestString[usDestIndex] == L'')
{usDestIndex++;}
else
{usCurIndex--;}
}
#endif
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 = 0, usPosY = 0;
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);
SetFontForeground(ubColor);
SetFontBackground( ubBackGroundColor );
if( ulFlags & TEXT_SHADOWED )
ShadowText( FRAME_BUFFER, pStr, ulFont, (UINT16)(usPosX-1), (UINT16)(usPosY-1 ) );
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
#ifdef CHINESE
&& pString[usSourceCounter] < 255
#endif
)
{
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 = usLocalPosX + usPhraseLengthPixels;
// shorten width for next time
usLocalWidth = 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 = usLocalPosX + usPhraseLengthPixels;
// shorten width for next time
usLocalWidth = 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 = usLocalPosX + usPhraseLengthPixels;
// shorten width for next time
usLocalWidth = 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 = usLocalPosX + usPhraseLengthPixels;
// shorten width for next time
usLocalWidth = 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 = 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;
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 = usLocalPosX + usPhraseLengthPixels;
// shorten width for next time
usLocalWidth = 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 = usLocalPosX + usPhraseLengthPixels;
// shorten width for next time
usLocalWidth = 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 = usLocalPosX + usPhraseLengthPixels;
// shorten width for next time
usLocalWidth = 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 = usLocalPosX + usPhraseLengthPixels;
// shorten width for next time
usLocalWidth = 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
{
#ifdef CHINESE
wchar_t currentChar=pString[usSourceCounter];
if (currentChar> 255 )
{
if (usDestCounter == 0)
{zWordString[usDestCounter++] = currentChar;}
else
{usSourceCounter--;}
}
#endif
// terminate the string TEMPORARILY
zWordString[usDestCounter] = 0;
// get the length (in pixels) of this word
usWordLengthPixels = WFStringPixLength(zWordString,uiLocalFont);
#ifdef CHINESE
if (currentChar <= 255)
#endif
// 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
#ifdef CHINESE
|| pString[usSourceCounter] == L''
|| pString[usSourceCounter] == L','
|| pString[usSourceCounter] == L'。'
|| pString[usSourceCounter] == L''
|| pString[usSourceCounter] == L'”'
|| pString[usSourceCounter] == L''
|| pString[usSourceCounter] == L''
|| pString[usSourceCounter] == L'、'
|| pString[usSourceCounter] == L'?'
|| pString[usSourceCounter] == L''
|| pString[usSourceCounter] == L')'
|| pString[usSourceCounter] == L''
#endif
)
{
// 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 = 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;
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
#ifdef CHINESE
&& pString[usSourceCounter] <= 255
#endif
)
{
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 = usLocalPosX + usPhraseLengthPixels;
// shorten width for next time
usLocalWidth = 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 = usLocalPosX + usPhraseLengthPixels;
// shorten width for next time
usLocalWidth = 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 = usLocalPosX + usPhraseLengthPixels;
// shorten width for next time
usLocalWidth = 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 = usLocalPosX + usPhraseLengthPixels;
// shorten width for next time
usLocalWidth = 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
{
#ifdef CHINESE
wchar_t currentChar = pString[usSourceCounter];
if (currentChar > 255 )
{
if (usDestCounter == 0)
{zWordString[usDestCounter++] = currentChar;}
else
{usSourceCounter--;}
}
#endif
// terminate the string TEMPORARILY
zWordString[usDestCounter] = 0;
// get the length (in pixels) of this word
usWordLengthPixels = WFStringPixLength(zWordString,uiLocalFont);
#ifdef CHINESE
if (currentChar <= 255)
#endif
// 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
#ifdef CHINESE
|| pString[usSourceCounter] == L''
|| pString[usSourceCounter] == L','
|| pString[usSourceCounter] == L'。'
|| pString[usSourceCounter] == L''
|| pString[usSourceCounter] == L'”'
|| pString[usSourceCounter] == L''
|| pString[usSourceCounter] == L''
|| pString[usSourceCounter] == L')'
|| pString[usSourceCounter] == L''
#endif
)
{
// 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 = 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 );
}