Mercurial > might-and-magic-trilogy
diff GUIFont.cpp @ 0:8b8875f5b359
Initial commit
author | Nomad |
---|---|
date | Fri, 05 Oct 2012 16:07:14 +0200 |
parents | |
children | 540178ef9b18 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/GUIFont.cpp Fri Oct 05 16:07:14 2012 +0200 @@ -0,0 +1,689 @@ +#include <string> + +#include "GUIFont.h" +#include "GUIWindow.h" +#include "Render.h" + +#include "mm7_data.h" + + + + + +struct GUIFont *pAutonoteFont; +struct GUIFont *pSpellFont; +struct GUIFont *pFontArrus; +struct GUIFont *pFontLucida; +struct GUIFont *pBook2Font; +struct GUIFont *pBookFont; +struct GUIFont *pFontCreate; +struct GUIFont *pFontCChar; +struct GUIFont *pFontComic; +struct GUIFont *pFontSmallnum; + + + + +//----- (0044D2FD) -------------------------------------------------------- +void GUIFont::_44D2FD_prolly_draw_credits_entry(GUIFont *pFont, int Str, int a4, unsigned int w, unsigned int h, unsigned __int16 a7, unsigned __int16 a8, const char *pString, unsigned __int16 *pPixels, unsigned int uPixelsWidth) +{ + int v11; // ebx@1 + int v12; // edi@1 + char *v13; // eax@1 + char *v14; // eax@1 + unsigned __int16 *v15; // esi@1 + GUIFont *v16; // edi@4 + signed int v17; // ecx@4 + signed int v18; // eax@6 + int v19; // [sp+Ch] [bp-5Ch]@1 + int v20; // [sp+10h] [bp-58h]@1 + unsigned int v21; // [sp+14h] [bp-54h]@1 + unsigned int v22; // [sp+18h] [bp-50h]@1 + unsigned int v23; // [sp+1Ch] [bp-4Ch]@1 + unsigned int v24; // [sp+20h] [bp-48h]@1 + GUIFont *v25; // [sp+60h] [bp-8h]@1 + GUIFont *v26; // [sp+64h] [bp-4h]@1 + char *Stra; // [sp+70h] [bp+8h]@1 + int a4a; // [sp+74h] [bp+Ch]@4 + int a7a; // [sp+80h] [bp+18h]@2 + + v11 = a7; + v22 = h; + v12 = Str; + v26 = this; + v24 = a4 + h - 1; + v21 = w; + v25 = pFont; + v23 = Str + w - 1; + ui_current_text_color = a7; + v19 = Str; + v20 = a4; + v13 = GUIFont::_44C933(pString, this, pFont, (int)&v19, 0, 1); + v14 = strtok(v13, "\n"); + Stra = v14; + v15 = &pPixels[uPixelsWidth * a4]; + if ( v14 ) + { + a7a = v12 >> 1; + while ( 1 ) + { + v16 = v26; + ui_current_text_color = v11; + v17 = 0; + a4a = v11; + if ( *v14 == '_' ) + { + v16 = v25; + a4a = a8; + ui_current_text_color = a8; + v17 = 1; + } + v18 = (signed int)(w - v16->GetLineWidth(&v14[v17])) >> 1; + if ( v18 < 0 ) + v18 = 0; + v16->_44D0B5(a4a, a8, (int)&v15[v18 + a7a], Stra, uPixelsWidth); + v15 += uPixelsWidth * (LOBYTE(v16->uFontHeight) - 3); + Stra = strtok(0, "\n"); + if ( !Stra ) + break; + v14 = Stra; + } + } +} +// 5C6DB4: using guessed type int ui_current_text_color; + + +//----- (0044D1E7) -------------------------------------------------------- +void GUIFont::DrawTextLine(unsigned int uDefaultColor, signed int uX, signed int uY, const char *Str, int a6) +{ + size_t v6; // ebx@1 + GUIFont *v7; // esi@1 + signed int v8; // edi@3 + unsigned __int8 v9; // cl@4 + int v10; // eax@5 + int v11; // ecx@5 + int v12; // ecx@6 + int v13; // ecx@7 + int v14; // ecx@9 + unsigned int v15; // edx@9 + unsigned __int16 v16; // cx@12 + unsigned __int8 *v17; // eax@12 + char Dest; // [sp+Ch] [bp-1Ch]@16 + char v19; // [sp+11h] [bp-17h]@16 + size_t v20; // [sp+20h] [bp-8h]@2 + int v21; // [sp+24h] [bp-4h]@1 + int uXa; // [sp+30h] [bp+8h]@9 + + v6 = 0; + v21 = uDefaultColor; + v7 = this; + if ( Str ) + { + v21 = ui_current_text_color; + v20 = strlen(Str); + if ( (signed int)v20 > 0 ) + { + v8 = uX; + do + { + if ( v7->IsCharValid(v9 = Str[v6]) ) + { + v10 = v9; + v11 = v9 - 9; + if ( v11 ) + { + v12 = v11 - 1; + if ( !v12 ) + return; + v13 = v12 - 2; + if ( v13 ) + { + if ( v13 != 1 ) + { + v14 = 3 * v10 + 9; + v15 = *((int *)&v7->cFirstChar + v14); + uXa = *((int *)&v7->cFirstChar + v14); + if ( v15 ) + { + if ( (signed int)v6 > 0 ) + v8 += v7->pMetrics[v10].uLeftSpacing; + v16 = v21; + v17 = (unsigned __int8 *)((char *)&v7[1] + v7->field_C20[v10]); + if ( !v21 ) + v16 = -1; + pRenderer->DrawText(v8, uY, v17, v15, LOBYTE(v7->uFontHeight), v7->pFontPalettes[0], v16, 0); + v8 += uXa; + if ( (signed int)v6 < (signed int)v20 ) + v8 += v7->pMetrics[(unsigned __int8)Str[v6]].uRightSpacing; + } + } + } + else + { + strncpy(&Dest, &Str[v6 + 1], 5u); + v19 = 0; + v21 = atoi(&Dest); + ui_current_text_color = v21; + v6 += 5; + } + } + } + ++v6; + } + while ( (signed int)v6 < (signed int)v20 ); + } + } +} +// 5C6DB4: using guessed type int ui_current_text_color; + + +//----- (0044D0B5) -------------------------------------------------------- +void GUIFont::_44D0B5(int a2, int a3, int a4, const char *pString, int a6) +{ + int v6; // ebx@1 + GUIFont *v7; // esi@1 + int v8; // edi@3 + unsigned __int8 v9; // cl@4 + int v10; // eax@5 + int v11; // ecx@5 + int v12; // ecx@6 + int v13; // ecx@7 + int v14; // ecx@8 + int v15; // ebx@10 + int v16; // edx@13 + __int16 v17; // ax@13 + char Dest; // [sp+Ch] [bp-20h]@17 + char v19; // [sp+11h] [bp-1Bh]@17 + size_t v20; // [sp+20h] [bp-Ch]@2 + int v21; // [sp+24h] [bp-8h]@1 + int v22; // [sp+28h] [bp-4h]@2 + const char *v23; // [sp+38h] [bp+Ch]@4 + + v6 = 0; + v21 = a2; + v7 = this; + if ( pString ) + { + v21 = ui_current_text_color; + v20 = strlen(pString); + v22 = 0; + if ( (signed int)v20 > 0 ) + { + v8 = a4; + do + { + v23 = &pString[v6]; + if ( v7->IsCharValid(pString[v6]) ) + { + v10 = v9; + v11 = v9 - 9; + if ( v11 ) + { + v12 = v11 - 1; + if ( !v12 ) + return; + v13 = v12 - 2; + if ( v13 ) + { + v14 = v13 - 1; + if ( v14 ) + { + if ( v14 != 82 ) + { + v15 = *((int *)&v7->cFirstChar + 3 * v10 + 9); + if ( v15 ) + { + if ( v22 > 0 ) + v8 += 2 * v7->pMetrics[v10].uLeftSpacing; + v16 = (int)((char *)&v7[1] + v7->field_C20[v10]); + v17 = v21; + if ( !v21 ) + v17 = -1; + sub_40F845(v8, v16, v15, LOBYTE(v7->uFontHeight), (int)v7->pFontPalettes[0], v17, 2 * a6); + v8 += 2 * v15; + if ( v22 < (signed int)v20 ) + v8 += 2 * v7->pMetrics[(unsigned __int8)*v23].uRightSpacing; + } + } + } + } + else + { + strncpy(&Dest, &pString[v6 + 1], 5u); + v19 = 0; + v21 = atoi(&Dest); + ui_current_text_color = v21; + v22 = v6 + 5; + } + } + } + v6 = v22++ + 1; + } + while ( v22 < (signed int)v20 ); + } + } +} +// 5C6DB4: using guessed type int ui_current_text_color; + + +//----- (0044C933) -------------------------------------------------------- +char *__fastcall GUIFont::_44C933(const char *pString, GUIFont *pFont, GUIFont *a3, int a4, int a5, int a6) +{ + const char *v6; // esi@1 + size_t v8; // eax@3 + size_t v9; // edi@3 + int v10; // eax@3 + GUIFont *v11; // esi@3 + int v12; // ebx@3 + char v13; // cl@5 + int v14; // edx@11 + int v15; // ecx@11 + int v16; // edx@12 + int v17; // edx@13 + int v18; // edx@14 + int v19; // edx@15 + int v20; // edi@17 + int v21; // edx@17 + int v22; // ecx@17 + int v23; // edi@18 + char v24; // zf@18 + int v25; // ecx@19 + int v26; // eax@19 + char v27; // dl@24 + int v28; // eax@46 + std::string v29; // [sp-18h] [bp-48h]@2 + const char *v30; // [sp-8h] [bp-38h]@2 + int v31; // [sp-4h] [bp-34h]@2 + const char *v32; // [sp+Ch] [bp-24h]@1 + char Str; // [sp+10h] [bp-20h]@46 + char v34; // [sp+13h] [bp-1Dh]@46 + GUIFont *v35; // [sp+14h] [bp-1Ch]@1 + int v36; // [sp+18h] [bp-18h]@3 + int v37; // [sp+1Ch] [bp-14h]@3 + int v38; // [sp+20h] [bp-10h]@4 + int v39; // [sp+24h] [bp-Ch]@3 + int v40; // [sp+28h] [bp-8h]@3 + int i; // [sp+2Ch] [bp-4h]@17 + std::string *v42; // [sp+38h] [bp+8h]@2 + + v6 = pString; + v35 = pFont; + v32 = pString; + if ( !pString ) + { + MessageBoxW(nullptr, L"Invalid string passed !", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Font.cpp:558", 0); + return 0; + } + v8 = strlen(pString); + v9 = v8; + v39 = v8; + strcpy(pTmpBuf3, v6); + v10 = a5; + v11 = v35; + v12 = 0; + v40 = 0; + v37 = a5; + v36 = 0; + if ( (signed int)v9 > 0 ) + { + v38 = v9 - 1; + do + { + v13 = pTmpBuf3[v12]; + if ( (unsigned __int8)v13 >= v11->cFirstChar && (unsigned __int8)v13 <= v11->cLastChar + || v13 == '\f' + || v13 == '\r' + || v13 == '\t' + || v13 == '\n' ) + { + v14 = (unsigned __int8)v13 - 9; + v15 = (int)&v11->pMetrics[(unsigned __int8)v13]; + if ( v14 ) + { + v16 = v14 - 1; + if ( v16 ) + { + v17 = v16 - 2; + if ( v17 ) + { + v18 = v17 - 1; + if ( v18 ) + { + v19 = v18 - 19; + if ( v19 ) + { + if ( v19 == 63 ) + { + v11 = a3; + } + else + { + v20 = *(int *)(v15 + 8); + v21 = *(int *)(v15 + 4); + v22 = *(int *)v15; + i = v20; + if ( (unsigned int)(v10 + v20 + v22 + v21) < *(int *)(a4 + 8) ) + { + v12 = v36; + if ( v36 > v40 ) + v10 += v22; + v10 += v21; + if ( v36 < v39 ) + v10 += i; + } + else + { + v23 = v40; + v24 = v11 == a3; + pTmpBuf3[v40] = 10; + if ( v24 ) + { + v25 = v38; + v26 = v23 + 1; + while ( v25 >= v26 ) + { + pTmpBuf3[v25] = byte_5C45AF[v25]; + --v25; + } + ++v39; + ++v38; + pTmpBuf3[v23++ + 1] = 95; + v40 = v26; + } + v12 = v36; + v10 = v37; + for ( i = v23; i <= v36; ++i ) + { + v27 = pTmpBuf3[i]; + if ( (unsigned __int8)v27 >= v11->cFirstChar && (unsigned __int8)v27 <= v11->cLastChar + || v27 == 12 + || v27 == 13 + || v27 == 9 + || v27 == 10 ) + { + if ( i > v23 ) + v10 += v11->pMetrics[(unsigned __int8)v27].uLeftSpacing; + v10 += *((int *)&v11->cFirstChar + 3 * (unsigned __int8)v27 + 9); + if ( i < v36 ) + v10 += v11->pMetrics[(unsigned __int8)v27].uRightSpacing; + } + } + } + } + } + else + { + v10 += *(int *)(v15 + 4); + v40 = v12; + } + } + else + { + if ( !a6 ) + return (char *)v32; + } + } + else + { + v12 += 5; + } + } + else + { + v10 = v37; + v11 = v35; + v40 = v12; + } + } + else + { + strncpy(&Str, &pTmpBuf3[v12 + 1], 3u); + v34 = 0; + v28 = atoi(&Str); + v10 = a5 + v28; + v12 += 3; + v37 = v10; + } + } + ++v12; + v36 = v12; + } + while ( v12 < v39 ); + } + return pTmpBuf3; +} + + +//----- (0044C6C2) -------------------------------------------------------- +int GUIFont::_44C6C2(const char *pInString, GUIWindow *pWindow, unsigned int uX, int a5) +{ + const char *v5; // esi@1 + int v6; // edi@1 + unsigned __int8 *v8; // ebx@3 + size_t v9; // eax@3 + signed int v10; // esi@3 + int v11; // edx@4 + unsigned __int8 v12; // cl@4 + GUIFont *v13; // [sp+Ch] [bp-4h]@1 + size_t uXa; // [sp+1Ch] [bp+Ch]@3 + + auto pFont = this; + v5 = pInString; + v6 = 0; + v13 = pFont; + if ( !pInString ) + return 0; + v8 = (unsigned __int8 *)FitTextInAWindow(pInString, pFont, pWindow, uX, 0); + v9 = strlen(v5); + v10 = 0; + uXa = v9; + if ( (signed int)v9 > 0 ) + { + while ( !IsCharValid(*v8) ) + { +LABEL_11: + ++v10; + ++v8; + if ( v10 >= (signed int)uXa ) + return (int)v8; + } + if ( v12 != 9 ) + { + if ( v12 == 10 ) + { + v6 = v6 + *(char *)(v11 + 5) - 3; + if ( v6 >= (signed int)(a5 * pWindow->uFrameHeight) ) + return (int)(v8 + 1); + goto LABEL_10; + } + if ( v12 == 12 ) + { + v8 += 5; + v10 += 5; +LABEL_10: + if ( v6 >= (signed int)(a5 * pWindow->uFrameHeight) ) + return (int)v8; + goto LABEL_11; + } + if ( v12 != 13 ) + goto LABEL_10; + } + v8 += 3; + v10 += 3; + goto LABEL_10; + } + return (int)v8; +} + + + +//----- (0044C62E) -------------------------------------------------------- +int GUIFont::GetStringHeight2(GUIFont *a2, const char *Str, int a4, int a5, int a6) +{ + GUIFont *v6; // edi@1 + int v8; // esi@3 + unsigned __int8 *v9; // ebx@3 + size_t v10; // eax@3 + unsigned __int8 v11; // cl@4 + signed int Stra; // [sp+Ch] [bp+8h]@3 + size_t v13; // [sp+14h] [bp+10h]@3 + + auto a1 = this; + v6 = a1; + if ( !Str ) + return 0; + v8 = LOBYTE(a1->uFontHeight) - 3; + v9 = (unsigned __int8 *)GUIFont::_44C933(Str, a1, a2, a4, a5, 0); + v10 = strlen(Str); + Stra = 0; + v13 = v10; + while ( Stra < (signed int)v13 ) + { + if ( GUIFont::IsCharValid(*v9) ) + { + if ( v11 == 9 ) + goto LABEL_9; + switch ( v11 ) + { + case 0xAu: + v8 = v8 + LOBYTE(v6->uFontHeight) - 3; + break; + case 0xCu: + v9 += 5; + Stra += 5; + break; + case 0xDu: +LABEL_9: + if ( a6 != 1 ) + { + v9 += 3; + Stra += 3; + } + break; + } + } + ++Stra; + ++v9; + } + return v8; +} + +//----- (0044C59D) -------------------------------------------------------- +int GUIFont::CalcTextHeight(const char *pString, GUIWindow *pWindow, int a4, int a5) +{ + const char *v5; // ebx@1 + GUIFont *v6; // edi@1 + int v8; // esi@3 + size_t v9; // eax@3 + signed int v10; // ebx@3 + unsigned __int8 v11; // cl@4 + size_t pWindowa; // [sp+10h] [bp+8h]@3 + unsigned __int8 *uX; // [sp+14h] [bp+Ch]@3 + + v5 = pString; + v6 = this; + if ( !pString ) + return 0; + v8 = LOBYTE(this->uFontHeight) - 3; + uX = (unsigned __int8 *)FitTextInAWindow(pString, this, pWindow, a4, 0); + v9 = strlen(v5); + v10 = 0; + pWindowa = v9; + while ( v10 < (signed int)pWindowa ) + { + if ( v6->IsCharValid(v11 = *uX) ) + { + if ( v11 == 9 ) + goto LABEL_9; + switch ( v11 ) + { + case 0xAu: + v8 = v8 + LOBYTE(v6->uFontHeight) - 3; + break; + case 0xCu: + uX += 5; + v10 += 5; + break; + case 0xDu: +LABEL_9: + if ( a5 != 1 ) + { + uX += 3; + v10 += 3; + } + break; + } + } + ++v10; + ++uX; + } + return v8; +} + + +//----- (0044C51E) -------------------------------------------------------- +int GUIFont::GetLineWidth(const char *pString) +{ + GUIFont *v2; // edi@1 + size_t v4; // ebp@3 + int v5; // esi@3 + signed int i; // ebx@3 + unsigned __int8 v7; // cl@4 + const char *v8; // [sp+0h] [bp-4h]@1 + + v8 = pString; + v2 = this; + if ( !pString ) + return 0; + v4 = strlen(pString); + v5 = 0; + for ( i = 0; i < (signed int)v4; ++i ) + { + if ( IsCharValid(v7 = v8[i]) ) + { + if ( v7 < 9u ) + goto LABEL_9; + if ( v7 <= 0xAu ) + return v5; + if ( v7 != '\f' ) + { + if ( v7 == '\r' ) + return v5; +LABEL_9: + if ( i > 0 ) + v5 += v2->pMetrics[v7].uLeftSpacing; + v5 += *((int *)&v2->cFirstChar + 3 * v7 + 9); + if ( i < (signed int)v4 ) + v5 += v2->pMetrics[v7].uRightSpacing; + continue; + } + i += 5; + } + } + return v5; +} + + + + +//----- (0044C502) -------------------------------------------------------- +int GUIFont::AlignText_Center(unsigned int uCenterX, const char *pString) +{ + signed int v3; // esi@1 + signed int result; // eax@2 + + v3 = (signed int)(uCenterX - GetLineWidth(pString)) >> 1; + if ( v3 >= 0 ) + result = v3; + else + result = 0; + return result; +} + + +//----- (0044C4DE) -------------------------------------------------------- +bool GUIFont::IsCharValid(char _c) +{ + unsigned char c = _c; + return c >= cFirstChar && c <= cLastChar || c == '\f' || c == '\r' || c == '\t' || c == '\n'; +} \ No newline at end of file