@ -659,11 +659,16 @@ void plFont::IRenderString( plMipmap *mip, UInt16 x, UInt16 y, const wchar_t *st
// Advance left past any clipping area
CharRenderFunc oldFunc = fRenderInfo . fRenderFunc ;
fRenderInfo . fRenderFunc = & plFont : : IRenderCharNull ;
while ( fRenderInfo . fX < fRenderInfo . fClipRect . fX & & * string ! = 0 )
Int16 prevX ;
do
{
prevX = fRenderInfo . fX ;
IRenderLoop ( string , 1 ) ;
string + + ;
}
while ( fRenderInfo . fX < = fRenderInfo . fClipRect . fX & & * + + string ! = 0 ) ;
fRenderInfo . fMaxWidth + = fRenderInfo . fX - prevX ;
fRenderInfo . fDestPtr - = ( fRenderInfo . fX - prevX ) * fRenderInfo . fDestBPP ;
fRenderInfo . fX = prevX ;
fRenderInfo . fRenderFunc = oldFunc ;
}
@ -672,10 +677,10 @@ void plFont::IRenderString( plMipmap *mip, UInt16 x, UInt16 y, const wchar_t *st
{
// See note at top of file
plCharacter & ch = fCharacters [ ( UInt16 ) string [ 0 ] - fFirstChar ] ;
Int32 newX = x - ( Int16 ) ch . fLeftKern ;
if ( newX < 0 )
newX = 0 ;
fRenderInfo . fX = fRenderInfo . fFarthestX = ( Int16 ) new X ;
fRenderInfo . fX - = ( Int16 ) ch . fLeftKern ;
fRenderInfo . fMaxWidth + = ( Int16 ) ch . fLeftKern ;
fRenderInfo . fDestPtr - = ( Int16 ) ch . fLeftKern * fRenderInfo . fDestBPP ;
fRenderInfo . fFarthest X = fRenderInfo . fX ;
}
fRenderInfo . fVolatileStringPtr = string ; // Just so we can keep track of when we clip
@ -715,9 +720,6 @@ void plFont::IRenderLoop( const wchar_t *string, Int32 maxCount )
if ( fRenderInfo . fFlags & kRenderScaleAA )
thisWidth > > = 1 ;
if ( thisWidth > = fRenderInfo . fMaxWidth )
break ;
( this - > * ( fRenderInfo . fRenderFunc ) ) ( fCharacters [ c ] ) ;
fRenderInfo . fX + = thisWidth ;
@ -848,8 +850,8 @@ void plFont::IRenderChar8To32( const plFont::plCharacter &c )
{
UInt8 * src = fBMapData + c . fBitmapOff ;
UInt32 * destPtr , * destBasePtr = ( UInt32 * ) ( fRenderInfo . fDestPtr - c . fBaseline * fRenderInfo . fDestStride ) ;
U Int16 x , y ;
UInt32 srcAlpha , oneMinusAlpha , r , g , b , dR , dG , dB , destAlpha , thisWidth ;
Int16 x , y , thisHeight , xstart , thisWidth ;
UInt32 srcAlpha , oneMinusAlpha , r , g , b , dR , dG , dB , destAlpha ;
UInt8 srcR , srcG , srcB ;
@ -861,18 +863,34 @@ void plFont::IRenderChar8To32( const plFont::plCharacter &c )
// should already be in the cache. If it does, time to upgrade the font
// format (again)
thisWidth = fWidth ; // + (Int32)c.fRightKern;
if ( thisWidth > = fRenderInfo . fMaxWidth )
thisWidth = fRenderInfo . fMaxWidth ;
if ( ( Int32 ) c . fHeight - ( Int32 ) c . fBaseline > = fRenderInfo . fMaxHeight | | thisWidth > = fRenderInfo . fMaxWidth | | c . fBaseline > fRenderInfo . fY )
return ;
xstart = fRenderInfo . fClipRect . fX - fRenderInfo . fX ;
if ( xstart < 0 )
xstart = 0 ;
srcR = ( UInt8 ) ( ( fRenderInfo . fColor > > 16 ) & 0x000000ff ) ;
srcG = ( UInt8 ) ( ( fRenderInfo . fColor > > 8 ) & 0x000000ff ) ;
srcB = ( UInt8 ) ( ( fRenderInfo . fColor ) & 0x000000ff ) ;
for ( y = 0 ; y < c . fHeight ; y + + )
y = fRenderInfo . fClipRect . fY - fRenderInfo . fY + ( Int16 ) c . fBaseline ;
if ( y < 0 )
y = 0 ;
else
{
destBasePtr = ( UInt32 * ) ( ( UInt8 * ) destBasePtr + y * fRenderInfo . fDestStride ) ;
src + = y * fRenderInfo . fNumCols ;
}
thisHeight = fRenderInfo . fMaxHeight + ( Int16 ) c . fBaseline ;
if ( thisHeight > ( Int16 ) c . fHeight )
thisHeight = ( Int16 ) c . fHeight ;
for ( ; y < thisHeight ; y + + )
{
destPtr = destBasePtr ;
for ( x = 0 ; x < thisWidth ; x + + )
for ( x = xstart ; x < thisWidth ; x + + )
{
if ( src [ x ] = = 255 )
destPtr [ x ] = fRenderInfo . fColor ;
@ -907,8 +925,8 @@ void plFont::IRenderChar8To32FullAlpha( const plFont::plCharacter &c )
{
UInt8 * src = fBMapData + c . fBitmapOff ;
UInt32 * destPtr , * destBasePtr = ( UInt32 * ) ( fRenderInfo . fDestPtr - c . fBaseline * fRenderInfo . fDestStride ) ;
U Int16 x , y ;
UInt32 destColorOnly , thisWidth ;
Int16 x , y , thisHeight , xstart , thisWidth ;
UInt32 destColorOnly ;
// Unfortunately for some fonts, their right kern value actually is
@ -919,16 +937,32 @@ void plFont::IRenderChar8To32FullAlpha( const plFont::plCharacter &c )
// should already be in the cache. If it does, time to upgrade the font
// format (again)
thisWidth = fWidth ; // + (Int32)c.fRightKern;
if ( thisWidth > = fRenderInfo . fMaxWidth )
thisWidth = fRenderInfo . fMaxWidth ;
if ( ( Int32 ) c . fHeight - ( Int32 ) c . fBaseline > = fRenderInfo . fMaxHeight | | thisWidth > = fRenderInfo . fMaxWidth | | c . fBaseline > fRenderInfo . fY )
return ;
xstart = fRenderInfo . fClipRect . fX - fRenderInfo . fX ;
if ( xstart < 0 )
xstart = 0 ;
destColorOnly = fRenderInfo . fColor & 0x00ffffff ;
for ( y = 0 ; y < c . fHeight ; y + + )
y = fRenderInfo . fClipRect . fY - fRenderInfo . fY + ( Int16 ) c . fBaseline ;
if ( y < 0 )
y = 0 ;
else
{
destBasePtr = ( UInt32 * ) ( ( UInt8 * ) destBasePtr + y * fRenderInfo . fDestStride ) ;
src + = y * fRenderInfo . fNumCols ;
}
thisHeight = fRenderInfo . fMaxHeight + ( Int16 ) c . fBaseline ;
if ( thisHeight > ( Int16 ) c . fHeight )
thisHeight = ( Int16 ) c . fHeight ;
for ( ; y < thisHeight ; y + + )
{
destPtr = destBasePtr ;
for ( x = 0 ; x < thisWidth ; x + + )
for ( x = xstart ; x < thisWidth ; x + + )
{
if ( src [ x ] ! = 0 )
destPtr [ x ] = ( src [ x ] < < 24 ) | destColorOnly ;
@ -942,8 +976,8 @@ void plFont::IRenderChar8To32Alpha( const plFont::plCharacter &c )
{
UInt8 val , * src = fBMapData + c . fBitmapOff ;
UInt32 * destPtr , * destBasePtr = ( UInt32 * ) ( fRenderInfo . fDestPtr - c . fBaseline * fRenderInfo . fDestStride ) ;
U Int16 x , y ;
UInt32 destColorOnly , alphaMult , fullAlpha , thisWidth ;
Int16 x , y , thisHeight , xstart , thisWidth ;
UInt32 destColorOnly , alphaMult , fullAlpha ;
// Unfortunately for some fonts, their right kern value actually is
@ -954,9 +988,12 @@ void plFont::IRenderChar8To32Alpha( const plFont::plCharacter &c )
// should already be in the cache. If it does, time to upgrade the font
// format (again)
thisWidth = fWidth ; // + (Int32)c.fRightKern;
if ( thisWidth > = fRenderInfo . fMaxWidth )
thisWidth = fRenderInfo . fMaxWidth ;
if ( ( Int32 ) c . fHeight - ( Int32 ) c . fBaseline > = fRenderInfo . fMaxHeight | | thisWidth > = fRenderInfo . fMaxWidth | | c . fBaseline > fRenderInfo . fY )
return ;
xstart = fRenderInfo . fClipRect . fX - fRenderInfo . fX ;
if ( xstart < 0 )
xstart = 0 ;
destColorOnly = fRenderInfo . fColor & 0x00ffffff ;
// alphaMult should come out to be a value to satisfy (fontAlpha * alphaMult >> 8) as the right alpha,
@ -964,10 +1001,23 @@ void plFont::IRenderChar8To32Alpha( const plFont::plCharacter &c )
fullAlpha = fRenderInfo . fColor & 0xff000000 ;
alphaMult = fullAlpha / 255 ;
for ( y = 0 ; y < c . fHeight ; y + + )
y = fRenderInfo . fClipRect . fY - fRenderInfo . fY + ( Int16 ) c . fBaseline ;
if ( y < 0 )
y = 0 ;
else
{
destBasePtr = ( UInt32 * ) ( ( UInt8 * ) destBasePtr + y * fRenderInfo . fDestStride ) ;
src + = y * fRenderInfo . fNumCols ;
}
thisHeight = fRenderInfo . fMaxHeight + ( Int16 ) c . fBaseline ;
if ( thisHeight > ( Int16 ) c . fHeight )
thisHeight = ( Int16 ) c . fHeight ;
for ( ; y < thisHeight ; y + + )
{
destPtr = destBasePtr ;
for ( x = 0 ; x < thisWidth ; x + + )
for ( x = xstart ; x < thisWidth ; x + + )
{
val = src [ x ] ;
if ( val = = 0xff )