You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
322 lines
6.5 KiB
322 lines
6.5 KiB
// ref: 0x10001058 |
|
void __fastcall artfont_SetArtFont(int nFont) |
|
{ |
|
switch ( nFont ) |
|
{ |
|
case 0: |
|
sgpCurrFont = &font16g; |
|
break; |
|
case 2: |
|
sgpCurrFont = &font24g; |
|
break; |
|
case 3: |
|
sgpCurrFont = &font24s; |
|
break; |
|
case 4: |
|
sgpCurrFont = &font30g; |
|
break; |
|
case 5: |
|
sgpCurrFont = &font30s; |
|
break; |
|
case 6: |
|
sgpCurrFont = &font42g; |
|
break; |
|
case 7: |
|
sgpCurrFont = &font42y; |
|
break; |
|
default: |
|
sgpCurrFont = &font16s; |
|
break; |
|
} |
|
} |
|
|
|
// ref: 0x10001098 |
|
void __cdecl artfont_InitAllFonts() |
|
{ |
|
font42g.active = 0; |
|
font42y.active = 0; |
|
font30g.active = 0; |
|
font30s.active = 0; |
|
font24g.active = 0; |
|
font24s.active = 0; |
|
font16g.active = 0; |
|
font16s.active = 0; |
|
sgpCurrFont = 0; |
|
} |
|
|
|
// ref: 0x100010C8 |
|
void __cdecl artfont_FreeAllFonts() |
|
{ |
|
artfont_FreeArtFont(&font42g); |
|
artfont_FreeArtFont(&font42y); |
|
artfont_FreeArtFont(&font30g); |
|
artfont_FreeArtFont(&font30s); |
|
artfont_FreeArtFont(&font24g); |
|
artfont_FreeArtFont(&font24s); |
|
artfont_FreeArtFont(&font16g); |
|
artfont_FreeArtFont(&font16s); |
|
sgpCurrFont = 0; |
|
} |
|
|
|
// ref: 0x10001120 |
|
void __fastcall artfont_FreeArtFont(FontStruct *pFont) |
|
{ |
|
HANDLE *v2; // esi |
|
signed int v3; // ebx |
|
|
|
if ( pFont->active ) |
|
{ |
|
v2 = pFont->fonttrans; |
|
v3 = 256; |
|
do |
|
{ |
|
if ( *v2 ) |
|
{ |
|
STransDelete(*v2); |
|
*v2 = 0; |
|
} |
|
++v2; |
|
--v3; |
|
} |
|
while ( v3 ); |
|
pFont->active = 0; |
|
} |
|
} |
|
|
|
// ref: 0x10001159 |
|
BOOL __cdecl artfont_LoadAllFonts() |
|
{ |
|
artfont_LoadArtFont(&font30g, "ui_art\\font30.bin", "ui_art\\font30g.pcx"); |
|
artfont_LoadArtFont(&font30s, "ui_art\\font30.bin", "ui_art\\font30s.pcx"); |
|
artfont_LoadArtFont(&font24g, "ui_art\\font24.bin", "ui_art\\font24g.pcx"); |
|
artfont_LoadArtFont(&font24s, "ui_art\\font24.bin", "ui_art\\font24s.pcx"); |
|
artfont_LoadArtFont(&font16g, "ui_art\\font16.bin", "ui_art\\font16g.pcx"); |
|
artfont_LoadArtFont(&font16s, "ui_art\\font16.bin", "ui_art\\font16s.pcx"); |
|
artfont_LoadArtFont(&font42g, "ui_art\\font42.bin", "ui_art\\font42g.pcx"); |
|
artfont_LoadArtFont(&font42y, "ui_art\\font42.bin", "ui_art\\font42y.pcx"); |
|
return 1; |
|
} |
|
|
|
// ref: 0x100011FB |
|
void __fastcall artfont_LoadArtFont(FontStruct *pFont, const char *pszBinFile, const char *pszFileName) |
|
{ |
|
LONG v4; // eax |
|
signed int v5; // edi |
|
unsigned char v6; // al |
|
int v7; // ecx |
|
int a5[4]; // [esp+8h] [ebp-20h] |
|
DWORD size[2]; // [esp+18h] [ebp-10h] |
|
BYTE *pBuffer; // [esp+20h] [ebp-8h] |
|
HANDLE phFile; // [esp+24h] [ebp-4h] |
|
HANDLE *a1a; // [esp+30h] [ebp+8h] |
|
|
|
if ( !pFont->active && SFileOpenFile(pszBinFile, &phFile) ) |
|
{ |
|
v4 = SFileGetFileSize(phFile, 0); |
|
if ( SFileReadFile(phFile, pFont, v4, 0, 0) ) |
|
{ |
|
SFileCloseFile(phFile); |
|
local_LoadArtImage(pszFileName, &pBuffer, size); |
|
memset(pFont->fonttrans, 0, 0x400u); |
|
if ( pBuffer ) |
|
{ |
|
v5 = 0; |
|
a1a = pFont->fonttrans; |
|
do |
|
{ |
|
v6 = pFont->fontbin[v5 + 2]; |
|
if ( v6 ) |
|
{ |
|
v7 = pFont->fontbin[1]; |
|
a5[2] = v6; |
|
a5[1] = v5 * v7; |
|
a5[0] = 0; |
|
a5[3] = v7 + v5 * v7 - 1; |
|
STransCreateI(pBuffer, size[0], size[1], 8, (int)a5, 16777248, a1a); |
|
} |
|
++a1a; |
|
++v5; |
|
} |
|
while ( v5 <= 256 ); |
|
pFont->active = 1; |
|
SMemFree(pBuffer, "C:\\Src\\Diablo\\DiabloUI\\artfont.cpp", 206, 0); |
|
} |
|
} |
|
else |
|
{ |
|
SFileCloseFile(phFile); |
|
} |
|
} |
|
} |
|
|
|
// ref: 0x100012F6 |
|
int __cdecl artfont_GetFontMaxHeight() |
|
{ |
|
int result; // eax |
|
|
|
if ( sgpCurrFont && sgpCurrFont->active ) |
|
result = sgpCurrFont->fontbin[1]; |
|
else |
|
result = 0; |
|
return result; |
|
} |
|
|
|
// ref: 0x10001310 |
|
int __cdecl artfont_GetFontDefWidth() |
|
{ |
|
int result; // eax |
|
|
|
if ( sgpCurrFont && sgpCurrFont->active ) |
|
result = sgpCurrFont->fontbin[0]; |
|
else |
|
result = 0; |
|
return result; |
|
} |
|
|
|
// ref: 0x10001329 |
|
int __fastcall artfont_GetFontWidth(char *str) |
|
{ |
|
int result; // eax |
|
unsigned char i; // bl |
|
unsigned char v3; // bl |
|
int v4; // esi |
|
|
|
result = 0; |
|
if ( !sgpCurrFont || !sgpCurrFont->active ) |
|
return 0; |
|
for ( i = *str; *str; i = *str ) |
|
{ |
|
v3 = sgpCurrFont->fontbin[i + 2]; |
|
if ( v3 ) |
|
v4 = v3; |
|
else |
|
v4 = sgpCurrFont->fontbin[0]; |
|
result += v4; |
|
++str; |
|
} |
|
return result; |
|
} |
|
|
|
// ref: 0x1000136C |
|
void __cdecl artfont_cpp_init() |
|
{ |
|
artfont_cpp_float = 2139095040; |
|
} |
|
// 10026BB0: using guessed type int artfont_cpp_float; |
|
|
|
// ref: 0x10001377 |
|
int __fastcall artfont_GetFontBreak(char *str) |
|
{ |
|
int result; // eax |
|
unsigned char v2; // dl |
|
unsigned char v3; // dl |
|
|
|
result = 0; |
|
if ( !sgpCurrFont || !sgpCurrFont->active ) |
|
return 0; |
|
while ( 1 ) |
|
{ |
|
v3 = *str; |
|
if ( !*str ) |
|
break; |
|
if ( v3 == '\n' ) |
|
break; |
|
if ( v3 == ' ' ) |
|
break; |
|
v2 = sgpCurrFont->fontbin[v3 + 2]; |
|
if ( !v2 ) |
|
break; |
|
result += v2; |
|
++str; |
|
} |
|
return result; |
|
} |
|
|
|
// ref: 0x100013B3 |
|
void __cdecl artfont_delete_operator(void *ptr) |
|
{ |
|
if ( ptr ) |
|
SMemFree(ptr, "delete", -1, 0); |
|
} |
|
|
|
// ref: 0x100013CD |
|
void __fastcall artfont_PrintFontStr(char *str, DWORD **pSurface, int sx, int sy) |
|
{ |
|
FontStruct *v5; // esi |
|
unsigned char v6; // cl |
|
int v7; // edi |
|
unsigned char v8; // dl |
|
int v9; // edi |
|
DWORD *v10; // ecx |
|
HANDLE hTrans; // [esp+Ch] [ebp-8h] |
|
HANDLE hTransa; // [esp+Ch] [ebp-8h] |
|
|
|
if ( pSurface ) |
|
{ |
|
if ( *pSurface ) |
|
{ |
|
v5 = sgpCurrFont; |
|
if ( sgpCurrFont ) |
|
{ |
|
if ( sgpCurrFont->active ) |
|
{ |
|
if ( sx < 0 ) |
|
sx = 0; |
|
if ( sy < 0 ) |
|
sy = 0; |
|
v6 = *str; |
|
if ( *str ) |
|
{ |
|
while ( 1 ) |
|
{ |
|
hTrans = (HANDLE)(sy + v5->fontbin[1]); |
|
if ( sy + v5->fontbin[1] > (signed int)pSurface[2] ) |
|
return; |
|
if ( v6 == '\n' ) |
|
break; |
|
v7 = v6; |
|
v8 = v5->fontbin[v6 + 2]; |
|
if ( !v8 ) |
|
{ |
|
v9 = v5->fontbin[0]; |
|
if ( sx + v9 + artfont_GetFontBreak(++str) < (signed int)pSurface[1] ) |
|
{ |
|
sx += v9; |
|
} |
|
else |
|
{ |
|
sx = 0; |
|
sy = (int)hTrans; |
|
} |
|
goto LABEL_23; |
|
} |
|
hTransa = v5->fonttrans[v6]; |
|
if ( v5->fonttrans[v6] ) |
|
{ |
|
v10 = pSurface[1]; |
|
if ( sx + v8 <= (signed int)v10 ) |
|
{ |
|
STransBlt(*pSurface, sx, sy, (int)v10, hTransa); |
|
v5 = sgpCurrFont; |
|
sx += sgpCurrFont->fontbin[v7 + 2]; |
|
goto LABEL_22; |
|
} |
|
sx = 0; |
|
sy += v5->fontbin[1]; |
|
} |
|
LABEL_23: |
|
v6 = *str; |
|
if ( !*str ) |
|
return; |
|
} |
|
sx = 0; |
|
sy += v5->fontbin[1]; |
|
LABEL_22: |
|
++str; |
|
goto LABEL_23; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
}
|
|
|