Browse Source

Pixel-accurately clip characters to the available space instead of omitting whole characters that stick out.

In addition to being a prerequisite for shadowed text, this also fixes an issue sometimes seen at the bottom of the mini KI player list where characters with a descender were missing.
Christian Walther 10 years ago
parent
commit
1f0277e3e0
  1. 4
      MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIEditBoxMod.cpp
  2. 1
      MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plGImage/plDynamicTextMap.cpp
  3. 104
      MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plGImage/plFont.cpp

4
MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIEditBoxMod.cpp

@ -197,9 +197,9 @@ void pfGUIEditBoxMod::IUpdate( void )
oldCursorPos = cursorPos; oldCursorPos = cursorPos;
cursorPos -= (Int16)fScrollPos; cursorPos -= (Int16)fScrollPos;
if( 4 + cursorPos > fDynTextMap->GetVisibleWidth() - 18 ) if( 4 + cursorPos > fDynTextMap->GetVisibleWidth() - 4 - 2 )
{ {
fScrollPos += ( 4 + cursorPos ) - ( fDynTextMap->GetVisibleWidth() - 18 ); fScrollPos += ( 4 + cursorPos ) - ( fDynTextMap->GetVisibleWidth() - 4 - 2 );
} }
else if( 4 + cursorPos < 4 ) else if( 4 + cursorPos < 4 )
{ {

1
MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plGImage/plDynamicTextMap.cpp

@ -517,6 +517,7 @@ void plDynamicTextMap::DrawString( UInt16 x, UInt16 y, const wchar_t *text )
SetJustify( fJustify ); SetJustify( fJustify );
fCurrFont->SetRenderFlag( plFont::kRenderWrap | plFont::kRenderClip, false ); fCurrFont->SetRenderFlag( plFont::kRenderWrap | plFont::kRenderClip, false );
fCurrFont->SetRenderClipRect( 0, 0, fVisWidth, fVisHeight );
fCurrFont->SetRenderColor( fFontColor.ToARGB32() ); fCurrFont->SetRenderColor( fFontColor.ToARGB32() );
fCurrFont->SetRenderFlag( plFont::kRenderIntoAlpha, fFontBlockRGB ); fCurrFont->SetRenderFlag( plFont::kRenderIntoAlpha, fFontBlockRGB );
fCurrFont->RenderString( this, x, y, text ); fCurrFont->RenderString( this, x, y, text );

104
MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plGImage/plFont.cpp

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

Loading…
Cancel
Save