osu-ds/source/Libraries/ByteMapFont.c
KonPet 183228e28e Change stuff to make it build
Removed the arm7 section
Changed the makefile to only use the arm9 stuff
Epicpkmn: Fix source/Graphics/GraphicsManager.cpp

Co-Authored-By: Pk11 <epicpkmn11@outlook.com>
Co-Authored-By: Kaisaan <34224128+Kaisaan@users.noreply.github.com>
2021-10-21 00:03:39 +02:00

203 lines
4.6 KiB
C

#include "ByteMapFont.h"
void LoadBMFont( BMFont *Fnt, const u8 *data )
{
u16 bCount;
u32 lOffset;
u8 bChar;
if( ( Fnt ) && ( data ) )
{
Fnt->Head = (BMFHeader *) data;
Fnt->pal = (BMFRGB *) &data[ 17 ];
lOffset = 17 + ( Fnt->Head->bPal * 3 );
lOffset += data[ lOffset ] + 1;
Fnt->wChars = data[ lOffset ] + ( data[ lOffset + 1 ] << 8 );
lOffset += 2;
for( bCount = 0; bCount < 256; bCount ++ )
{
Fnt->Ltrs[ bCount ] = 0;
}
for( bCount = 0; bCount < Fnt->wChars; bCount ++ )
{
bChar = data[ lOffset ];
Fnt->Ltrs[ bChar ] = (BMFLetter *) &data[ lOffset + 1 ];
lOffset += 6 + ( Fnt->Ltrs[ bChar ]->bWidth * Fnt->Ltrs[ bChar ]->bHeight );
}
// echo hack - fix wide spacing of some fonts
//Fnt->Ltrs[32]->bShift = 2;
}
}
// Make the color bolder - basically makes the color twice as bright
u16 bmfColorIntensityBold( u16 color )
{
u32 tcolor;
tcolor = ( color | ( color << 16 ) ) & 0x03E07C1F;
tcolor <<= 1;
tcolor += 0x00200401;
if( tcolor & 0x00000020 ) tcolor |= 0x0000001F;
if( tcolor & 0x00008000 ) tcolor |= 0x00007C00;
if( tcolor & 0x04000000 ) tcolor |= 0x03E00000;
return ( tcolor | ( tcolor >> 16 ) ) & 0xFFFF;
}
// Make the color fainter - basically makes the color duller by reducing the intensity by 2
u16 bmfColorIntensityFaint( u16 color )
{
u32 tcolor;
tcolor = ( color | ( color << 16 ) ) & 0x03E07C1F;
tcolor >>= 1;
// tcolor += 0x00200401;
// if( tcolor & 0x00000020 ) tcolor |= 0x0000001F;
// if( tcolor & 0x00008000 ) tcolor |= 0x00007C00;
// if( tcolor & 0x04000000 ) tcolor |= 0x03E00000;
return ( tcolor | ( tcolor >> 16 ) ) & 0xFFFF;
}
void bmfPutCharTransparent( BMFont *Fnt, u8 x, u8 y, u16 text, u16 back, u16* Buffer, u8 Ltr )
{
u8 i, j;
u16 *Offset;
u16 col;
u8 bRed, bGreen, bBlue, bPal;
if( Fnt->Ltrs[ Ltr ] )
{
Offset = Buffer + ( ( y + Fnt->Ltrs[ Ltr ]->bRelY ) << 8 );
for( i = 0; i < Fnt->Ltrs[ Ltr ]->bHeight; i ++ )
{
for( j = 0; j < Fnt->Ltrs[ Ltr ]->bWidth; j ++ )
{
bPal = Fnt->Ltrs[ Ltr ]->bData[ j + ( i * Fnt->Ltrs[ Ltr ]->bWidth ) ];
if( bPal > 0 )
{
bPal --;
bRed = Fnt->pal[ bPal ].bRed >> 1;
bGreen = Fnt->pal[ bPal ].bGreen >> 1;
bBlue = Fnt->pal[ bPal ].bBlue >> 1;
col = RGB5( bRed, bGreen, bBlue ) & text;
Offset[ x + j + Fnt->Ltrs[ Ltr ]->bRelX ] = col | BIT(15);
}
}
Offset += 256;
}
}
}
void bmfPutCharOpaque( BMFont *Fnt, u8 x, u8 y, u16 text, u16 back, u16* Buffer, u8 Ltr )
{
s8 i, j;
u16 *Offset;
u16 col;
u8 bRed, bGreen, bBlue, bPal;
s8 bHeight, bWidth, bXOff, bYOff;
u8 *bDataOffset;
if( Fnt->Ltrs[ Ltr ] )
{
bDataOffset = Fnt->Ltrs[ Ltr ]->bData;
bWidth = Fnt->Ltrs[ Ltr ]->bShift;
bHeight = Fnt->Head->bLineHeight;
bXOff = Fnt->Ltrs[ Ltr ]->bRelX;
bYOff = Fnt->Ltrs[ Ltr ]->bRelY;
Offset = Buffer + ( y << 8 );
for( i = 0; i <= bHeight; i ++ )
{
if( i < bYOff )
{
for( j = 0; j < bWidth + Fnt->Head->bAddSpace; j ++ )
{
Offset[ x + j ] = back;
}
}
if( ( i >= bYOff ) && ( i < bYOff + Fnt->Ltrs[ Ltr ]->bHeight ) )
{
for( j = 0; j <= bXOff; j ++ )
Offset[ x + j ] = back;
for( j = 0; j < Fnt->Ltrs[ Ltr ]->bWidth; j ++ )
{
bPal = *bDataOffset;
bDataOffset ++;
bRed = Fnt->pal[ bPal - 1 ].bRed >> 1;
bGreen = Fnt->pal[ bPal - 1 ].bGreen >> 1;
bBlue = Fnt->pal[ bPal - 1 ].bBlue >> 1;
col = (RGB15( bRed, bGreen, bBlue ) & text) | BIT(15);
if( bPal == 0 ) // Normally transparent color
col = back;
Offset[ x + j + Fnt->Ltrs[ Ltr ]->bRelX ] = col;
}
for( j = Fnt->Ltrs[ Ltr ]->bWidth + bXOff; j < Fnt->Ltrs[ Ltr ]->bShift + Fnt->Head->bAddSpace; j ++ )
Offset[ x + j ] = back;
}
if( i >= bYOff + Fnt->Ltrs[ Ltr ]->bHeight )
{
for( j = 0; j < Fnt->Ltrs[ Ltr ]->bShift + Fnt->Head->bAddSpace; j ++ )
{
Offset[ x + j ] = back;
}
}
Offset += 256;
}
/* for( i = 0; i < Fnt->Head->bLineHeight; i ++ )
{
Offset = Buffer + ( ( y + i + Fnt->Ltrs[ Ltr ]->bRelY ) << 8 );
for( j = 0; j < Fnt->Ltrs[ Ltr ]->bWidth; j ++ )
{
bPal = Fnt->Ltrs[ Ltr ]->bData[ j + ( i * Fnt->Ltrs[ Ltr ]->bWidth ) ];
if( bPal > 0 )
{
bPal --;
bRed = Fnt->pal[ bPal ].bRed >> 1;
bGreen = Fnt->pal[ bPal ].bGreen >> 1;
bBlue = Fnt->pal[ bPal ].bBlue >> 1;
col = RGB5( bRed, bGreen, bBlue ) & text;
}
else
{
col = back;
}
Offset[ x + j + Fnt->Ltrs[ Ltr ]->bRelX ] = col | BIT(15);
}
}
*/ }
}