From 761c0bbe7451d47e6d203c700d3960e2173a9f3e Mon Sep 17 00:00:00 2001 From: Blitz54 Date: Sat, 18 Oct 2025 00:44:01 -0500 Subject: [PATCH 1/7] sloppy AI code --- GLFontGen.exe | Bin 0 -> 153088 bytes GLFontGen.vcxproj.user | 1 + fontgen.cpp | 176 +++++++++++++++++++++++++++++++++-------- fontgen.rc | 54 +++++++------ resource.h | 4 + 5 files changed, 176 insertions(+), 59 deletions(-) create mode 100644 GLFontGen.exe create mode 100644 GLFontGen.vcxproj.user diff --git a/GLFontGen.exe b/GLFontGen.exe new file mode 100644 index 0000000000000000000000000000000000000000..ac9581c91e5e3bb28a44a5343d5baad0ecadd11f GIT binary patch literal 153088 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ðj=kA(!hv%EQWRR@gm@6f0Lsm<5H3l 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 XaEs91fa7E-GP)(M1PA_8Iq?4gtldl* literal 0 HcmV?d00001 diff --git a/GLFontGen.vcxproj.user b/GLFontGen.vcxproj.user new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/GLFontGen.vcxproj.user @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/fontgen.cpp b/fontgen.cpp index f43288c..f72c5ff 100644 --- a/fontgen.cpp +++ b/fontgen.cpp @@ -56,8 +56,8 @@ struct fontHeight_s { class glFontGenV2_c { public: void Init(const std::string_view fontName); - void Build(HDC dc); - void Finish(); + void Build(HDC dc, bool italic = false); + void Finish(bool italic = false); private: std::string fontName; @@ -69,7 +69,7 @@ void glFontGenV2_c::Init(const std::string_view i_fontName) fontName = i_fontName; } -void glFontGenV2_c::Build(HDC hdc) +void glFontGenV2_c::Build(HDC hdc, bool italic) { // Get metrics TEXTMETRIC tm; @@ -178,7 +178,9 @@ void glFontGenV2_c::Build(HDC hdc) // Open image file for writing std::stringstream tgaName; - tgaName << fontName << "." << height << ".tga"; + tgaName << fontName; + if (italic) tgaName << " Italic"; + tgaName << "." << height << ".tga"; std::ofstream out(tgaName.str(), std::ios_base::binary); if (!out) { return; @@ -270,10 +272,14 @@ void glFontGenV2_c::Build(HDC hdc) } } -void glFontGenV2_c::Finish() +void glFontGenV2_c::Finish(bool italic) { // Open info file for writing - std::ofstream tgf(fontName + ".tgf"); + std::stringstream tgfName; + tgfName << fontName; + if (italic) tgfName << " Italic"; + tgfName << ".tgf"; + std::ofstream tgf(tgfName.str()); if (!tgf) { return; } @@ -298,14 +304,14 @@ void glFontGenV2_c::Finish() // Main Dialog Box // =============== -static void BuildFont(HDC hdc, char* fontName, int size, int fontWeight, int fontPitch, glFontGenV2_c& gen) +static void BuildFont(HDC hdc, char* fontName, int size, int fontWeight, int fontPitch, BOOL italic, glFontGenV2_c& gen) { // Create font HFONT hf = CreateFont( size, 0, 0, 0, - fontWeight, FALSE, FALSE, FALSE, - DEFAULT_CHARSET, - OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, + fontWeight, italic, FALSE, FALSE, + DEFAULT_CHARSET, + OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, fontPitch | FF_MODERN, fontName ); if (hf == NULL) { @@ -316,7 +322,7 @@ static void BuildFont(HDC hdc, char* fontName, int size, int fontWeight, int fon HGDIOBJ prevf = SelectObject(hdc, hf); // Run font generator - gen.Build(hdc); + gen.Build(hdc, italic); // Delete font object SelectObject(hdc, prevf); @@ -325,9 +331,15 @@ static void BuildFont(HDC hdc, char* fontName, int size, int fontWeight, int fon static void BuildSelectedFonts(HWND hwndDlg) { - // Get font name - char fontName[64]; - GetDlgItemText(hwndDlg, IDC_FONTSEL, fontName, 64); + // Get font name from listbox selection + char fontName[64] = {}; + HWND hList = GetDlgItem(hwndDlg, IDC_FONTSEL); + int sel = (int)SendMessage(hList, LB_GETCURSEL, 0, 0); + if (sel == LB_ERR) { + return; + } + // Get selected text (handles ANSI/UNICODE via macro) + SendMessage(hList, LB_GETTEXT, sel, (LPARAM)fontName); if (*fontName == 0) { return; } @@ -335,44 +347,120 @@ static void BuildSelectedFonts(HWND hwndDlg) // Get font attributes int fontWeight = GetDlgItemInt(hwndDlg, IDC_FONTWEIGHT, NULL, 0); int fontPitch = (Button_GetCheck(GetDlgItem(hwndDlg, IDC_FONTFIXED))) ? FIXED_PITCH : VARIABLE_PITCH; + BOOL italic = Button_GetCheck(GetDlgItem(hwndDlg, IDC_FONTITALIC)); glFontGenV2_c gen; gen.Init(fontName); // Generate selected fonts HDC hdc = GetDC(hwndDlg); - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ10))) BuildFont(hdc, fontName, 10, fontWeight, fontPitch, gen); - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ12))) BuildFont(hdc, fontName, 12, fontWeight, fontPitch, gen); - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ14))) BuildFont(hdc, fontName, 14, fontWeight, fontPitch, gen); - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ16))) BuildFont(hdc, fontName, 16, fontWeight, fontPitch, gen); - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ18))) BuildFont(hdc, fontName, 18, fontWeight, fontPitch, gen); - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ20))) BuildFont(hdc, fontName, 20, fontWeight, fontPitch, gen); - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ22))) BuildFont(hdc, fontName, 22, fontWeight, fontPitch, gen); - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ24))) BuildFont(hdc, fontName, 24, fontWeight, fontPitch, gen); - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ26))) BuildFont(hdc, fontName, 26, fontWeight, fontPitch, gen); - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ28))) BuildFont(hdc, fontName, 28, fontWeight, fontPitch, gen); - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ32))) BuildFont(hdc, fontName, 32, fontWeight, fontPitch, gen); - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ36))) BuildFont(hdc, fontName, 36, fontWeight, fontPitch, gen); - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ40))) BuildFont(hdc, fontName, 40, fontWeight, fontPitch, gen); - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ48))) BuildFont(hdc, fontName, 48, fontWeight, fontPitch, gen); - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ56))) BuildFont(hdc, fontName, 56, fontWeight, fontPitch, gen); - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ64))) BuildFont(hdc, fontName, 64, fontWeight, fontPitch, gen); - - gen.Finish(); + + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZALL))) { + const int allSizes[] = { 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 32, 36, 40, 48, 56, 64 }; + for (int size : allSizes) + BuildFont(hdc, fontName, size, fontWeight, fontPitch, italic, gen); + } + else { + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ10))) BuildFont(hdc, fontName, 10, fontWeight, fontPitch, italic, gen); + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ12))) BuildFont(hdc, fontName, 12, fontWeight, fontPitch, italic, gen); + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ14))) BuildFont(hdc, fontName, 14, fontWeight, fontPitch, italic, gen); + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ16))) BuildFont(hdc, fontName, 16, fontWeight, fontPitch, italic, gen); + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ18))) BuildFont(hdc, fontName, 18, fontWeight, fontPitch, italic, gen); + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ20))) BuildFont(hdc, fontName, 20, fontWeight, fontPitch, italic, gen); + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ22))) BuildFont(hdc, fontName, 22, fontWeight, fontPitch, italic, gen); + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ24))) BuildFont(hdc, fontName, 24, fontWeight, fontPitch, italic, gen); + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ26))) BuildFont(hdc, fontName, 26, fontWeight, fontPitch, italic, gen); + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ28))) BuildFont(hdc, fontName, 28, fontWeight, fontPitch, italic, gen); + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ32))) BuildFont(hdc, fontName, 32, fontWeight, fontPitch, italic, gen); + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ36))) BuildFont(hdc, fontName, 36, fontWeight, fontPitch, italic, gen); + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ40))) BuildFont(hdc, fontName, 40, fontWeight, fontPitch, italic, gen); + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ48))) BuildFont(hdc, fontName, 48, fontWeight, fontPitch, italic, gen); + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ56))) BuildFont(hdc, fontName, 56, fontWeight, fontPitch, italic, gen); + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ64))) BuildFont(hdc, fontName, 64, fontWeight, fontPitch, italic, gen); + } + + gen.Finish(italic); MessageBox(hwndDlg, "Font generated successfully.", "OpenGL Font Generator", MB_ICONINFORMATION); } +// EnumFontProc: add names to the LISTBOX instead of combo static int __stdcall EnumFontProc(const LOGFONT *lf, const TEXTMETRIC *ltm, unsigned long FontType, LPARAM lParam) { - ComboBox_AddString((HWND)lParam, lf->lfFaceName); + HWND hList = (HWND)lParam; + // SendMessage will pick ANSI/UNICODE variant automatically + SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)lf->lfFaceName); return 1; } +static HFONT g_hPreviewFont = NULL; + +// Create or update the preview control font and text. +// Uses current selection, weight and italic settings to create a sample HFONT +static void UpdatePreview(HWND hwndDlg) +{ + // Get selected font name from listbox + char fontName[128] = {}; + HWND hList = GetDlgItem(hwndDlg, IDC_FONTSEL); + int sel = (int)SendMessageA(hList, LB_GETCURSEL, 0, 0); + if (sel == LB_ERR) return; + SendMessageA(hList, LB_GETTEXT, sel, (LPARAM)fontName); + if (fontName[0] == '\0') return; + + // Get preview text from edit control + char previewText[512] = {}; + GetDlgItemTextA(hwndDlg, IDC_PREVIEWTEXT, previewText, (int)std::size(previewText)); + if (previewText[0] == '\0') { + strcpy_s(previewText, "The quick brown fox jumps over the lazy dog"); + SetDlgItemTextA(hwndDlg, IDC_PREVIEWTEXT, previewText); + } + + // Get weight and italic + int fontWeight = GetDlgItemInt(hwndDlg, IDC_FONTWEIGHT, NULL, FALSE); + BOOL italic = Button_GetCheck(GetDlgItem(hwndDlg, IDC_FONTITALIC)); + + // Choose a reasonable preview point size (you can change this) + const int previewPoint = 18; + + // Convert points -> device pixels and request character height + HDC hdc = GetDC(hwndDlg); + const int dpiY = GetDeviceCaps(hdc, LOGPIXELSY); + ReleaseDC(hwndDlg, hdc); + const int lfHeight = -MulDiv(previewPoint, dpiY, 72); + + // Build LOGFONT + LOGFONTA lf; + memset(&lf, 0, sizeof(lf)); + lf.lfHeight = lfHeight; + lf.lfWeight = (fontWeight > 0) ? fontWeight : FW_NORMAL; + lf.lfItalic = italic ? 1 : 0; + lf.lfCharSet = DEFAULT_CHARSET; + lf.lfPitchAndFamily = FF_DONTCARE; + strncpy_s(lf.lfFaceName, fontName, _TRUNCATE); + + // Create HFONT + HFONT hNewFont = CreateFontIndirectA(&lf); + if (!hNewFont) return; + + // Apply to preview control + HWND hPreview = GetDlgItem(hwndDlg, IDC_PREVIEW); + // Set text first then font so control reports correct layout + SetWindowTextA(hPreview, previewText); + SendMessageA(hPreview, WM_SETFONT, (WPARAM)hNewFont, TRUE); + + // Destroy previous font + if (g_hPreviewFont) { + // safe to delete after setting new font (control now uses hNewFont) + DeleteObject(g_hPreviewFont); + } + g_hPreviewFont = hNewFont; +} + static int __stdcall DlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_CLOSE: + if (g_hPreviewFont) { DeleteObject(g_hPreviewFont); g_hPreviewFont = NULL; } EndDialog(hwndDlg, 1); break; @@ -392,7 +480,15 @@ static int __stdcall DlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPara // Add font names EnumFontFamilies(GetDC(hwndDlg), NULL, EnumFontProc, (LPARAM)GetDlgItem(hwndDlg, IDC_FONTSEL)); - ComboBox_SetCurSel(GetDlgItem(hwndDlg, IDC_FONTSEL), 0); + ListBox_SetCurSel(GetDlgItem(hwndDlg, IDC_FONTSEL), 0); + + // Default preview text + SetDlgItemTextA(hwndDlg, IDC_PREVIEWTEXT, "Path of Exile 2"); + // Check the "All" box by default + CheckDlgButton(hwndDlg, IDC_SZALL, BST_CHECKED); + + // Initialize preview + UpdatePreview(hwndDlg); break; @@ -402,8 +498,20 @@ static int __stdcall DlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPara BuildSelectedFonts(hwndDlg); break; case IDC_QUIT: + // cleanup preview font + if (g_hPreviewFont) { DeleteObject(g_hPreviewFont); g_hPreviewFont = NULL; } EndDialog(hwndDlg, 1); break; + case IDC_FONTSEL: + if (HIWORD(wParam) == LBN_SELCHANGE) { + UpdatePreview(hwndDlg); + } + break; + case IDC_PREVIEWTEXT: + if (HIWORD(wParam) == EN_CHANGE) { + UpdatePreview(hwndDlg); + } + break; } break; } diff --git a/fontgen.rc b/fontgen.rc index b3bb2dc..3c54f89 100644 --- a/fontgen.rc +++ b/fontgen.rc @@ -23,36 +23,40 @@ // Dialog // -IDD_MAIN DIALOGEX 0, 0, 191, 94 +IDD_MAIN DIALOGEX 0, 0, 460, 140 STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU CAPTION "OpenGL Font Generator" FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN - PUSHBUTTON "Generate",IDC_GEN,71,71,50,14 - PUSHBUTTON "Quit",IDC_QUIT,134,71,50,14 - COMBOBOX IDC_FONTSEL,71,7,113,114,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP - RTEXT "Weight:",IDC_STATIC,66,24,40,12,SS_CENTERIMAGE - COMBOBOX IDC_FONTWEIGHT,134,24,50,78,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "Fixed Pitch:",IDC_FONTFIXED,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_RIGHT | BS_VCENTER | WS_TABSTOP,66,40,51,12 - CONTROL "10px",IDC_SZ10,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,7,31,10 - CONTROL "12px",IDC_SZ12,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,17,31,10 - CONTROL "14px",IDC_SZ14,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,27,31,10 - CONTROL "16px",IDC_SZ16,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,37,31,10 - CONTROL "18px",IDC_SZ18,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,47,31,10 - CONTROL "20px",IDC_SZ20,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,57,31,10 - CONTROL "22px",IDC_SZ22,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,67,31,10 - CONTROL "24px",IDC_SZ24,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,77,31,10 - CONTROL "26px",IDC_SZ26,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,38,7,31,10 - CONTROL "28px",IDC_SZ28,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,38,17,31,10 - CONTROL "32px",IDC_SZ32,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,38,27,31,10 - CONTROL "36px",IDC_SZ36,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,38,37,31,10 - CONTROL "40px",IDC_SZ40,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,38,47,31,10 - CONTROL "48px",IDC_SZ48,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,38,57,31,10 - CONTROL "56px",IDC_SZ56,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,38,67,31,10 - CONTROL "64px",IDC_SZ64,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,38,77,31,10 + PUSHBUTTON "Generate", IDC_GEN, 81, 121, 50, 14 + PUSHBUTTON "Quit", IDC_QUIT, 144, 121, 50, 14 + LISTBOX IDC_FONTSEL, 81, 7, 120, 96, LBS_NOTIFY | LBS_SORT | WS_VSCROLL | WS_TABSTOP | WS_BORDER + // Preview box (static) and editable preview text + CONTROL "", IDC_PREVIEW, "Static", SS_LEFT | WS_BORDER | WS_GROUP, 205, 7, 238, 72 + EDITTEXT IDC_PREVIEWTEXT, 205, 86, 238, 18, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Weight:", IDC_STATIC, 76, 104, 40, 12, SS_CENTERIMAGE + COMBOBOX IDC_FONTWEIGHT, 144, 104, 50, 78, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Fixed Pitch:", IDC_FONTFIXED, "Button", BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_RIGHT | BS_VCENTER | WS_TABSTOP, 7, 105, 51, 12 + CONTROL "Italic", IDC_FONTITALIC, "Button", BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_RIGHT | BS_VCENTER | WS_TABSTOP, 7, 120, 51, 12 + CONTROL "All", IDC_SZALL, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 25, 7, 31, 10 + CONTROL "10px", IDC_SZ10, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 7, 17, 31, 10 + CONTROL "12px", IDC_SZ12, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 7, 27, 31, 10 + CONTROL "14px", IDC_SZ14, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 7, 37, 31, 10 + CONTROL "16px", IDC_SZ16, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 7, 47, 31, 10 + CONTROL "18px", IDC_SZ18, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 7, 57, 31, 10 + CONTROL "20px", IDC_SZ20, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 7, 67, 31, 10 + CONTROL "22px", IDC_SZ22, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 7, 77, 31, 10 + CONTROL "24px", IDC_SZ24, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 7, 87, 31, 10 + CONTROL "26px", IDC_SZ26, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 42, 17, 31, 10 + CONTROL "28px", IDC_SZ28, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 42, 27, 31, 10 + CONTROL "32px", IDC_SZ32, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 42, 37, 31, 10 + CONTROL "36px", IDC_SZ36, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 42, 47, 31, 10 + CONTROL "40px", IDC_SZ40, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 42, 57, 31, 10 + CONTROL "48px", IDC_SZ48, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 42, 67, 31, 10 + CONTROL "56px", IDC_SZ56, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 42, 77, 31, 10 + CONTROL "64px", IDC_SZ64, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 42, 87, 31, 10 END - ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO @@ -66,7 +70,7 @@ BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 184 TOPMARGIN, 7 - BOTTOMMARGIN, 85 + BOTTOMMARGIN, 200 END END #endif // APSTUDIO_INVOKED diff --git a/resource.h b/resource.h index c1d822a..e2a5257 100644 --- a/resource.h +++ b/resource.h @@ -9,6 +9,8 @@ #define IDC_CHOOSE 1003 #define IDC_FONTWEIGHT 1004 #define IDC_FONTFIXED 1005 +#define IDC_FONTITALIC 1051 +#define IDC_SZALL 1009 #define IDC_SZ10 1010 #define IDC_SZ12 1011 #define IDC_SZ14 1012 @@ -26,6 +28,8 @@ #define IDC_SZ56 1024 #define IDC_SZ64 1025 #define IDC_STATIC 200 +#define IDC_PREVIEW 2001 +#define IDC_PREVIEWTEXT 2002 // Next default values for new objects // From 02d68c907e44248f0f04c36ebdaba7361e0c1daf Mon Sep 17 00:00:00 2001 From: Blitz54 Date: Sat, 18 Oct 2025 01:04:38 -0500 Subject: [PATCH 2/7] Attempt at fixing merges --- GLFontGen.vcxproj.user | 1 - fontgen.cpp | 12 ------------ 2 files changed, 13 deletions(-) delete mode 100644 GLFontGen.vcxproj.user diff --git a/GLFontGen.vcxproj.user b/GLFontGen.vcxproj.user deleted file mode 100644 index 5f28270..0000000 --- a/GLFontGen.vcxproj.user +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/fontgen.cpp b/fontgen.cpp index 7eb2ec5..a37815d 100644 --- a/fontgen.cpp +++ b/fontgen.cpp @@ -183,18 +183,11 @@ void glFontGenV2_c::Build(HDC hdc, bool italic) } // Open image file for writing -<<<<<<< HEAD std::stringstream tgaName; tgaName << fontName; if (italic) tgaName << " Italic"; tgaName << "." << height << ".tga"; std::ofstream out(tgaName.str(), std::ios_base::binary); -======= - std::ostringstream tgaName; - tgaName << fontName << "." << height << ".tga"; - const auto tgaPath = outputDir / tgaName.str(); - std::ofstream out(tgaPath, std::ios_base::binary); ->>>>>>> 3e2c5b7fd5e9b3032874cd5d327b5d64baa28a35 if (!out) { return; } @@ -288,16 +281,11 @@ void glFontGenV2_c::Build(HDC hdc, bool italic) void glFontGenV2_c::Finish(bool italic) { // Open info file for writing -<<<<<<< HEAD std::stringstream tgfName; tgfName << fontName; if (italic) tgfName << " Italic"; tgfName << ".tgf"; std::ofstream tgf(tgfName.str()); -======= - const auto tgfPath = outputDir / (fontName + ".tgf"); - std::ofstream tgf(tgfPath); ->>>>>>> 3e2c5b7fd5e9b3032874cd5d327b5d64baa28a35 if (!tgf) { return; } From da25c1e97adfa33dc2706ae74699b9a909caf1bb Mon Sep 17 00:00:00 2001 From: Blitz54 Date: Sat, 18 Oct 2025 01:39:33 -0500 Subject: [PATCH 3/7] Save fixes --- GLFontGen.exe | Bin 153088 -> 50688 bytes fontgen.cpp | 23 +++++++++++++---------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/GLFontGen.exe b/GLFontGen.exe index ac9581c91e5e3bb28a44a5343d5baad0ecadd11f..f5f596f62cb81a3daf19a4f68cd59b59b635cef4 100644 GIT binary patch literal 50688 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%0ACY~1arI|{b@+0M!%7g0D>Ou82^(wN7yiI(p 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ðj=kA(!hv%EQWRR@gm@6f0Lsm<5H3l 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 XaEs91fa7E-GP)(M1PA_8Iq?4gtldl* diff --git a/fontgen.cpp b/fontgen.cpp index a37815d..faee555 100644 --- a/fontgen.cpp +++ b/fontgen.cpp @@ -183,11 +183,13 @@ void glFontGenV2_c::Build(HDC hdc, bool italic) } // Open image file for writing - std::stringstream tgaName; - tgaName << fontName; - if (italic) tgaName << " Italic"; - tgaName << "." << height << ".tga"; - std::ofstream out(tgaName.str(), std::ios_base::binary); + std::string tgaFileName = fontName; + if (italic) tgaFileName += " Italic"; + tgaFileName += "." + std::to_string(height) + ".tga"; + + const auto tgaPath = outputDir / tgaFileName; + std::ofstream out(tgaPath, std::ios_base::binary); + if (!out) { return; } @@ -281,11 +283,12 @@ void glFontGenV2_c::Build(HDC hdc, bool italic) void glFontGenV2_c::Finish(bool italic) { // Open info file for writing - std::stringstream tgfName; - tgfName << fontName; - if (italic) tgfName << " Italic"; - tgfName << ".tgf"; - std::ofstream tgf(tgfName.str()); + std::string tgfFileName = fontName; + if (italic) tgfFileName += " Italic"; + tgfFileName += ".tgf"; + + const auto tgfPath = outputDir / tgfFileName; + std::ofstream tgf(tgfPath); if (!tgf) { return; } From 77a212d9223a138f7e2c502186e407622ce098f4 Mon Sep 17 00:00:00 2001 From: Blitz54 Date: Mon, 20 Oct 2025 03:36:02 -0500 Subject: [PATCH 4/7] Some GPT suggestion for smoothing --- GLFontGen.exe | Bin 50688 -> 50688 bytes fontgen.cpp | 4 +++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/GLFontGen.exe b/GLFontGen.exe index f5f596f62cb81a3daf19a4f68cd59b59b635cef4..adb7b2f282479f43cf80c92576b29146eb7196b5 100644 GIT binary patch delta 10416 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 WjxG(nt0Q`uex811L&UM`e*YI|@?%*5 delta 10332 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 diff --git a/fontgen.cpp b/fontgen.cpp index faee555..a2c4568 100644 --- a/fontgen.cpp +++ b/fontgen.cpp @@ -117,7 +117,9 @@ void glFontGenV2_c::Build(HDC hdc, bool italic) const unsigned bbSpan = bbSize / ys; for (unsigned y = 0; y < ys; y++) { for (unsigned x = 0; x < xs; x++) { - glyph.dat[(y + yo) * xs + x] = (uint8_t)(bb[y * bbSpan + x] / 64.0 * 255.0); + float a = std::clamp(bb[y * bbSpan + x] / 64.0f, 0.0f, 1.0f); + a = powf(a, 0.5f); // light gamma correction, makes it smoother + glyph.dat[(y + yo) * xs + x] = (uint8_t)(a * 255.0f); } } } From 37a0631c6f8eec8f7e5861369dd0a5eecd27b90b Mon Sep 17 00:00:00 2001 From: Blitz54 Date: Thu, 23 Oct 2025 15:36:07 -0500 Subject: [PATCH 5/7] Bold toggle --- GLFontGen.exe | Bin 50688 -> 48128 bytes fontgen.aps | Bin 0 -> 83264 bytes fontgen.cpp | 167 ++++++++++++++++---------------------------------- fontgen.rc | 5 +- resource.h | 1 + 5 files changed, 56 insertions(+), 117 deletions(-) create mode 100644 fontgen.aps diff --git a/GLFontGen.exe b/GLFontGen.exe index adb7b2f282479f43cf80c92576b29146eb7196b5..564e649a8eaef3ad2c2b0b2ed619a3ec9dfd6ee6 100644 GIT binary patch delta 10178 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 delta 12336 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 bb = std::make_unique(bbSize); GetGlyphOutline(hdc, k, GGO_GRAY8_BITMAP, &gm, bbSize, bb.get(), &m2i); - // Get glyph info const unsigned xs = gm.gmBlackBoxX; const unsigned ys = gm.gmBlackBoxY; const int xo = gm.gmptGlyphOrigin.x; const int yo = tm.tmAscent - gm.gmptGlyphOrigin.y; const int glw = gm.gmCellIncX; - // Initialise glyph data auto& glyph = current_height.glyphs.emplace_back(); glyph.width = xs; glyph.spleft = xo; @@ -112,13 +109,12 @@ void glFontGenV2_c::Build(HDC hdc, bool italic) glyph.dat = std::make_unique(height * xs); memset(glyph.dat.get(), 0, height * xs); - // Copy glyph image if (bbSize) { const unsigned bbSpan = bbSize / ys; for (unsigned y = 0; y < ys; y++) { for (unsigned x = 0; x < xs; x++) { float a = std::clamp(bb[y * bbSpan + x] / 64.0f, 0.0f, 1.0f); - a = powf(a, 0.5f); // light gamma correction, makes it smoother + a = powf(a, 0.5f); glyph.dat[(y + yo) * xs + x] = (uint8_t)(a * 255.0f); } } @@ -127,11 +123,9 @@ void glFontGenV2_c::Build(HDC hdc, bool italic) const unsigned cellHeight = height + cellPadding; - // Find best image size - unsigned imgWidth, imgHeight; + unsigned imgWidth = 0, imgHeight = 0; unsigned bestDim = std::numeric_limits::max(); for (unsigned xmax = 32; xmax <= 2048; xmax <<= 1) { - // Find number of rows for this width unsigned numRow = 1; unsigned rowWidth = 0; for (size_t g = 0; g < current_height.glyphs.size(); g++) { @@ -162,11 +156,9 @@ void glFontGenV2_c::Build(HDC hdc, bool italic) } } - // Prepare RGBA image, and fill with 255,255,255,0 std::unique_ptr image = std::make_unique(imgWidth * imgHeight); std::fill_n(image.get(), imgWidth * imgHeight, 0x00FFFFFF); - // Write the glyphs into the alpha channel of the image unsigned ix = 0, iy = 0; for (auto& glyph : current_height.glyphs) { const unsigned cellWidth = glyph.width + cellPadding; @@ -184,21 +176,19 @@ void glFontGenV2_c::Build(HDC hdc, bool italic) ix += cellWidth; } - // Open image file for writing std::string tgaFileName = fontName; if (italic) tgaFileName += " Italic"; + if (bold) tgaFileName += " Bold"; // [ADDED] tgaFileName += "." + std::to_string(height) + ".tga"; const auto tgaPath = outputDir / tgaFileName; std::ofstream out(tgaPath, std::ios_base::binary); - if (!out) { return; } const auto WriteRaw = [&](const auto& val) { out.write((const char*)&val, sizeof(val)); }; - // Write header tgaHeader_s th; ZeroMemory(&th, sizeof(th)); th.it = 10; @@ -209,32 +199,27 @@ void glFontGenV2_c::Build(HDC hdc, bool italic) uint8_t hdr = 255; std::array packet; - const auto WritePacket = [&]() - { - WriteRaw(hdr); - if (hdr & 0x80) - WriteRaw(packet[0]); - else - out.write((const char*)packet.data(), 4 * (hdr + 1)); + const auto WritePacket = [&]() { + WriteRaw(hdr); + if (hdr & 0x80) + WriteRaw(packet[0]); + else + out.write((const char*)packet.data(), 4 * (hdr + 1)); }; - // Write image for (int y = imgHeight - 1; y >= 0; y--) { hdr = 255; - uint32_t lastPix; + uint32_t lastPix = 0; const uint32_t* line_start = &image[y * imgWidth]; for (const auto* p = line_start; p < line_start + imgWidth; ++p) { if (hdr == 255) { - // Start new packet hdr = 0; packet[hdr] = *p; } else if (hdr & 0x80) { - // Run-length packet, check for continuance if (*p == lastPix) { hdr++; if (hdr == 255) { - // Max length, write it WritePacket(); } } @@ -245,7 +230,6 @@ void glFontGenV2_c::Build(HDC hdc, bool italic) } } else if (hdr) { - // Raw packet, check if a run-length packet could be created with the last pixel if (*p == lastPix) { hdr--; WritePacket(); @@ -253,7 +237,6 @@ void glFontGenV2_c::Build(HDC hdc, bool italic) hdr = 129; } else if (hdr == 127) { - // Packet is already full, write it WritePacket(); hdr = 0; packet[hdr] = *p; @@ -264,7 +247,6 @@ void glFontGenV2_c::Build(HDC hdc, bool italic) } } else { - // New packet, check if this could become a run-length packet if (*p == lastPix) { hdr = 129; } @@ -276,17 +258,16 @@ void glFontGenV2_c::Build(HDC hdc, bool italic) lastPix = *p; } if (hdr < 255) { - // Leftover packet, write it WritePacket(); } } } -void glFontGenV2_c::Finish(bool italic) +void glFontGenV2_c::Finish(bool italic, bool bold) // [CHANGED] { - // Open info file for writing std::string tgfFileName = fontName; if (italic) tgfFileName += " Italic"; + if (bold) tgfFileName += " Bold"; // [ADDED] tgfFileName += ".tgf"; const auto tgfPath = outputDir / tgfFileName; @@ -296,12 +277,14 @@ void glFontGenV2_c::Finish(bool italic) } for (const auto& height_data : heights) { - // Write glyph attributes tgf << "HEIGHT " << height_data.height << ";\n"; for (size_t g = 0; g < height_data.glyphs.size(); g++) { const auto& glyph = height_data.glyphs[g]; - tgf << "GLYPH " << std::setw(3) << glyph.x << " " << std::setw(3) << glyph.y << " " << std::setw(2) << glyph.width << " " << std::setw(2) << glyph.spleft << " " << std::setw(2) << glyph.spright << ";\t// " << g; - if (isprint(g)) { + tgf << "GLYPH " << std::setw(3) << glyph.x << " " << std::setw(3) + << glyph.y << " " << std::setw(2) << glyph.width << " " + << std::setw(2) << glyph.spleft << " " << std::setw(2) + << glyph.spright << ";\t// " << g; + if (isprint((int)g)) { tgf << " (" << (char)g << ")"; } tgf << "\n"; @@ -311,16 +294,11 @@ void glFontGenV2_c::Finish(bool italic) heights.clear(); } -// =============== -// Main Dialog Box -// =============== - -static void BuildFont(HDC hdc, char* fontName, int size, int fontWeight, int fontPitch, BOOL italic, glFontGenV2_c& gen) +static void BuildFont(HDC hdc, char* fontName, int size, int fontWeight, int fontPitch, BOOL italic, BOOL bold, glFontGenV2_c& gen) // [CHANGED] { - // Create font HFONT hf = CreateFont( - size, 0, 0, 0, - fontWeight, italic, FALSE, FALSE, + size, 0, 0, 0, + bold ? FW_BOLD : fontWeight, italic, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, fontPitch | FF_MODERN, fontName @@ -329,88 +307,68 @@ static void BuildFont(HDC hdc, char* fontName, int size, int fontWeight, int fon return; } - // Select the font HGDIOBJ prevf = SelectObject(hdc, hf); - - // Run font generator - gen.Build(hdc, italic); - - // Delete font object + gen.Build(hdc, italic, bold); // [CHANGED] SelectObject(hdc, prevf); DeleteObject(hf); } static void BuildSelectedFonts(HWND hwndDlg) { - // Get font name from listbox selection char fontName[64] = {}; HWND hList = GetDlgItem(hwndDlg, IDC_FONTSEL); int sel = (int)SendMessage(hList, LB_GETCURSEL, 0, 0); if (sel == LB_ERR) { return; } - // Get selected text (handles ANSI/UNICODE via macro) SendMessage(hList, LB_GETTEXT, sel, (LPARAM)fontName); if (*fontName == 0) { return; } - // Get font attributes int fontWeight = GetDlgItemInt(hwndDlg, IDC_FONTWEIGHT, NULL, 0); int fontPitch = (Button_GetCheck(GetDlgItem(hwndDlg, IDC_FONTFIXED))) ? FIXED_PITCH : VARIABLE_PITCH; BOOL italic = Button_GetCheck(GetDlgItem(hwndDlg, IDC_FONTITALIC)); + BOOL bold = Button_GetCheck(GetDlgItem(hwndDlg, IDC_FONTBOLD)); // [ADDED] + + if (bold && fontWeight < FW_BOLD) + fontWeight = FW_BOLD; // [ADDED] glFontGenV2_c gen; gen.Init(fontName); - // Generate selected fonts HDC hdc = GetDC(hwndDlg); + const int allSizes[] = { 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 32, 36, 40, 48, 56, 64 }; + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZALL))) { - const int allSizes[] = { 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 32, 36, 40, 48, 56, 64 }; for (int size : allSizes) - BuildFont(hdc, fontName, size, fontWeight, fontPitch, italic, gen); + BuildFont(hdc, fontName, size, fontWeight, fontPitch, italic, bold, gen); // [CHANGED] } else { - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ10))) BuildFont(hdc, fontName, 10, fontWeight, fontPitch, italic, gen); - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ12))) BuildFont(hdc, fontName, 12, fontWeight, fontPitch, italic, gen); - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ14))) BuildFont(hdc, fontName, 14, fontWeight, fontPitch, italic, gen); - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ16))) BuildFont(hdc, fontName, 16, fontWeight, fontPitch, italic, gen); - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ18))) BuildFont(hdc, fontName, 18, fontWeight, fontPitch, italic, gen); - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ20))) BuildFont(hdc, fontName, 20, fontWeight, fontPitch, italic, gen); - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ22))) BuildFont(hdc, fontName, 22, fontWeight, fontPitch, italic, gen); - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ24))) BuildFont(hdc, fontName, 24, fontWeight, fontPitch, italic, gen); - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ26))) BuildFont(hdc, fontName, 26, fontWeight, fontPitch, italic, gen); - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ28))) BuildFont(hdc, fontName, 28, fontWeight, fontPitch, italic, gen); - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ32))) BuildFont(hdc, fontName, 32, fontWeight, fontPitch, italic, gen); - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ36))) BuildFont(hdc, fontName, 36, fontWeight, fontPitch, italic, gen); - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ40))) BuildFont(hdc, fontName, 40, fontWeight, fontPitch, italic, gen); - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ48))) BuildFont(hdc, fontName, 48, fontWeight, fontPitch, italic, gen); - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ56))) BuildFont(hdc, fontName, 56, fontWeight, fontPitch, italic, gen); - if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ64))) BuildFont(hdc, fontName, 64, fontWeight, fontPitch, italic, gen); + for (int size : allSizes) { + int ctrlId = IDC_SZ10 + ((size - 10) / 2); + if (Button_GetCheck(GetDlgItem(hwndDlg, ctrlId))) + BuildFont(hdc, fontName, size, fontWeight, fontPitch, italic, bold, gen); // [CHANGED] + } } - gen.Finish(italic); + gen.Finish(italic, bold); // [CHANGED] MessageBox(hwndDlg, "Font generated successfully.", "OpenGL Font Generator", MB_ICONINFORMATION); } -// EnumFontProc: add names to the LISTBOX instead of combo -static int __stdcall EnumFontProc(const LOGFONT *lf, const TEXTMETRIC *ltm, unsigned long FontType, LPARAM lParam) +static int __stdcall EnumFontProc(const LOGFONT* lf, const TEXTMETRIC* ltm, unsigned long FontType, LPARAM lParam) { HWND hList = (HWND)lParam; - // SendMessage will pick ANSI/UNICODE variant automatically SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)lf->lfFaceName); return 1; } static HFONT g_hPreviewFont = NULL; -// Create or update the preview control font and text. -// Uses current selection, weight and italic settings to create a sample HFONT static void UpdatePreview(HWND hwndDlg) { - // Get selected font name from listbox char fontName[128] = {}; HWND hList = GetDlgItem(hwndDlg, IDC_FONTSEL); int sel = (int)SendMessageA(hList, LB_GETCURSEL, 0, 0); @@ -418,7 +376,6 @@ static void UpdatePreview(HWND hwndDlg) SendMessageA(hList, LB_GETTEXT, sel, (LPARAM)fontName); if (fontName[0] == '\0') return; - // Get preview text from edit control char previewText[512] = {}; GetDlgItemTextA(hwndDlg, IDC_PREVIEWTEXT, previewText, (int)std::size(previewText)); if (previewText[0] == '\0') { @@ -426,42 +383,34 @@ static void UpdatePreview(HWND hwndDlg) SetDlgItemTextA(hwndDlg, IDC_PREVIEWTEXT, previewText); } - // Get weight and italic int fontWeight = GetDlgItemInt(hwndDlg, IDC_FONTWEIGHT, NULL, FALSE); BOOL italic = Button_GetCheck(GetDlgItem(hwndDlg, IDC_FONTITALIC)); + BOOL bold = Button_GetCheck(GetDlgItem(hwndDlg, IDC_FONTBOLD)); // [ADDED] - // Choose a reasonable preview point size (you can change this) const int previewPoint = 18; - // Convert points -> device pixels and request character height HDC hdc = GetDC(hwndDlg); const int dpiY = GetDeviceCaps(hdc, LOGPIXELSY); ReleaseDC(hwndDlg, hdc); const int lfHeight = -MulDiv(previewPoint, dpiY, 72); - // Build LOGFONT LOGFONTA lf; memset(&lf, 0, sizeof(lf)); lf.lfHeight = lfHeight; - lf.lfWeight = (fontWeight > 0) ? fontWeight : FW_NORMAL; + lf.lfWeight = bold ? FW_BOLD : ((fontWeight > 0) ? fontWeight : FW_NORMAL); // [CHANGED] lf.lfItalic = italic ? 1 : 0; lf.lfCharSet = DEFAULT_CHARSET; lf.lfPitchAndFamily = FF_DONTCARE; strncpy_s(lf.lfFaceName, fontName, _TRUNCATE); - // Create HFONT HFONT hNewFont = CreateFontIndirectA(&lf); if (!hNewFont) return; - // Apply to preview control HWND hPreview = GetDlgItem(hwndDlg, IDC_PREVIEW); - // Set text first then font so control reports correct layout SetWindowTextA(hPreview, previewText); SendMessageA(hPreview, WM_SETFONT, (WPARAM)hNewFont, TRUE); - // Destroy previous font if (g_hPreviewFont) { - // safe to delete after setting new font (control now uses hNewFont) DeleteObject(g_hPreviewFont); } g_hPreviewFont = hNewFont; @@ -475,8 +424,7 @@ static int __stdcall DlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPara EndDialog(hwndDlg, 1); break; - case WM_INITDIALOG: - // Add font weights + case WM_INITDIALOG: ComboBox_AddString(GetDlgItem(hwndDlg, IDC_FONTWEIGHT), "100"); ComboBox_AddString(GetDlgItem(hwndDlg, IDC_FONTWEIGHT), "200"); ComboBox_AddString(GetDlgItem(hwndDlg, IDC_FONTWEIGHT), "300"); @@ -489,18 +437,12 @@ static int __stdcall DlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPara ComboBox_AddString(GetDlgItem(hwndDlg, IDC_FONTWEIGHT), "1000"); ComboBox_SetCurSel(GetDlgItem(hwndDlg, IDC_FONTWEIGHT), 4); - // Add font names EnumFontFamilies(GetDC(hwndDlg), NULL, EnumFontProc, (LPARAM)GetDlgItem(hwndDlg, IDC_FONTSEL)); ListBox_SetCurSel(GetDlgItem(hwndDlg, IDC_FONTSEL), 0); - // Default preview text SetDlgItemTextA(hwndDlg, IDC_PREVIEWTEXT, "Path of Exile 2"); - // Check the "All" box by default CheckDlgButton(hwndDlg, IDC_SZALL, BST_CHECKED); - - // Initialize preview UpdatePreview(hwndDlg); - break; case WM_COMMAND: @@ -509,33 +451,28 @@ static int __stdcall DlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPara BuildSelectedFonts(hwndDlg); break; case IDC_QUIT: - // cleanup preview font if (g_hPreviewFont) { DeleteObject(g_hPreviewFont); g_hPreviewFont = NULL; } EndDialog(hwndDlg, 1); break; case IDC_FONTSEL: - if (HIWORD(wParam) == LBN_SELCHANGE) { - UpdatePreview(hwndDlg); - } - break; + case IDC_FONTITALIC: + case IDC_FONTBOLD: // [ADDED] + case IDC_FONTWEIGHT: case IDC_PREVIEWTEXT: - if (HIWORD(wParam) == EN_CHANGE) { + if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == LBN_SELCHANGE || HIWORD(wParam) == EN_CHANGE) UpdatePreview(hwndDlg); - } break; } break; - } - return FALSE; + default: + return 0; + } + return 1; } -int __stdcall WinMain(HINSTANCE hinst, HINSTANCE hinstP, LPSTR CmdLine, int ShowCmd) +int __stdcall WinMain(HINSTANCE hInst, HINSTANCE, char*, int) { - INITCOMMONCONTROLSEX icce; - icce.dwSize = sizeof(INITCOMMONCONTROLSEX); - icce.dwICC = ICC_STANDARD_CLASSES; - InitCommonControlsEx(&icce); - - return (int)DialogBox(hinst, MAKEINTRESOURCE(IDD_MAIN), NULL, DlgProc); + InitCommonControls(); + return DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_MAIN), 0, DlgProc, 0); } diff --git a/fontgen.rc b/fontgen.rc index 3c54f89..5c65606 100644 --- a/fontgen.rc +++ b/fontgen.rc @@ -36,8 +36,9 @@ BEGIN EDITTEXT IDC_PREVIEWTEXT, 205, 86, 238, 18, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP RTEXT "Weight:", IDC_STATIC, 76, 104, 40, 12, SS_CENTERIMAGE COMBOBOX IDC_FONTWEIGHT, 144, 104, 50, 78, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "Fixed Pitch:", IDC_FONTFIXED, "Button", BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_RIGHT | BS_VCENTER | WS_TABSTOP, 7, 105, 51, 12 - CONTROL "Italic", IDC_FONTITALIC, "Button", BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_RIGHT | BS_VCENTER | WS_TABSTOP, 7, 120, 51, 12 + CONTROL "Fixed Pitch:", IDC_FONTFIXED, "Button", BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_RIGHT | BS_VCENTER | WS_TABSTOP, 7, 100, 51, 12 + CONTROL "Italic", IDC_FONTITALIC, "Button", BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_RIGHT | BS_VCENTER | WS_TABSTOP, 7, 112, 51, 12 + CONTROL "Bold", IDC_FONTBOLD, "Button", BS_AUTOCHECKBOX | BS_LEFTTEXT | BS_RIGHT | BS_VCENTER | WS_TABSTOP, 7, 124, 51, 12 CONTROL "All", IDC_SZALL, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 25, 7, 31, 10 CONTROL "10px", IDC_SZ10, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 7, 17, 31, 10 CONTROL "12px", IDC_SZ12, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 7, 27, 31, 10 diff --git a/resource.h b/resource.h index e2a5257..9b19d56 100644 --- a/resource.h +++ b/resource.h @@ -9,6 +9,7 @@ #define IDC_CHOOSE 1003 #define IDC_FONTWEIGHT 1004 #define IDC_FONTFIXED 1005 +#define IDC_FONTBOLD 1045 #define IDC_FONTITALIC 1051 #define IDC_SZALL 1009 #define IDC_SZ10 1010 From 9857381c54483b8e60b722514e6967cf6890f223 Mon Sep 17 00:00:00 2001 From: LocalIdentity Date: Fri, 24 Oct 2025 07:57:47 +1100 Subject: [PATCH 6/7] Fix weird text output MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes the bold text generation where some glyphs has weird slashes through them Those diagonal streaks came from how we read the grayscale bitmap that Win32 gives back: each glyph row is padded to a 4-byte stride, but the old loop assumed rows were laid out tightly. When the glyph width isn’t a multiple of four (Liberation Sans 18 px “p” is 11px wide), we started sampling the next row at the wrong offset, hence the slanted lines. The copy loop now computes the stride correctly, guards against under/overflow on the destination row, and uses the right slice of the buffer for each scanline --- fontgen.cpp | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/fontgen.cpp b/fontgen.cpp index c6b6d82..5c87bf7 100644 --- a/fontgen.cpp +++ b/fontgen.cpp @@ -109,17 +109,37 @@ void glFontGenV2_c::Build(HDC hdc, bool italic, bool bold) // [CHANGED] glyph.dat = std::make_unique(height * xs); memset(glyph.dat.get(), 0, height * xs); - if (bbSize) { - const unsigned bbSpan = bbSize / ys; - for (unsigned y = 0; y < ys; y++) { - for (unsigned x = 0; x < xs; x++) { - float a = std::clamp(bb[y * bbSpan + x] / 64.0f, 0.0f, 1.0f); - a = powf(a, 0.5f); - glyph.dat[(y + yo) * xs + x] = (uint8_t)(a * 255.0f); + if (bbSize && ys > 0 && xs > 0) { + unsigned rowStride = ((xs + 3u) & ~3u); + if (rowStride == 0 || rowStride * ys > bbSize) { + rowStride = bbSize / ys; + } + if (rowStride == 0) { + rowStride = xs; + } + + for (unsigned y = 0; y < ys; y++) { + const int destRow = static_cast(y) + yo; + if (destRow < 0 || destRow >= static_cast(height)) { + continue; + } + + const size_t srcOffset = static_cast(y) * rowStride; + if (srcOffset + xs > bbSize) { + break; + } + const uint8_t* srcRow = bb.get() + srcOffset; + uint8_t* dstRow = glyph.dat.get() + static_cast(destRow) * xs; + + for (unsigned x = 0; x < xs; x++) { + const uint8_t raw = srcRow[x]; + float a = std::clamp(raw / 64.0f, 0.0f, 1.0f); + a = powf(a, 0.5f); + dstRow[x] = static_cast(a * 255.0f); + } } } } - } const unsigned cellHeight = height + cellPadding; From d824eea96bfdc38be16acb6fcdd818323feda163 Mon Sep 17 00:00:00 2001 From: Blitz54 Date: Thu, 23 Oct 2025 16:41:45 -0500 Subject: [PATCH 7/7] Undo comment removal from gpt --- GLFontGen.exe | Bin 48128 -> 51712 bytes fontgen.cpp | 116 +++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 91 insertions(+), 25 deletions(-) diff --git a/GLFontGen.exe b/GLFontGen.exe index 564e649a8eaef3ad2c2b0b2ed619a3ec9dfd6ee6..26ccce2549423b783f8f34bd58b9e780dca62d6b 100644 GIT binary patch delta 19603 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 PSVrqRGB5k4^~!$&C=ba) diff --git a/fontgen.cpp b/fontgen.cpp index 5c87bf7..773afc0 100644 --- a/fontgen.cpp +++ b/fontgen.cpp @@ -58,8 +58,8 @@ struct fontHeight_s { class glFontGenV2_c { public: void Init(const std::string_view fontName); - void Build(HDC dc, bool italic = false, bool bold = false); // [CHANGED] - void Finish(bool italic = false, bool bold = false); // [CHANGED] + void Build(HDC dc, bool italic = false, bool bold = false); + void Finish(bool italic = false, bool bold = false); private: std::string fontName; @@ -75,7 +75,7 @@ void glFontGenV2_c::Init(const std::string_view i_fontName) std::filesystem::create_directories(outputDir, ec); } -void glFontGenV2_c::Build(HDC hdc, bool italic, bool bold) // [CHANGED] +void glFontGenV2_c::Build(HDC hdc, bool italic, bool bold) { // Get metrics TEXTMETRIC tm; @@ -87,6 +87,7 @@ void glFontGenV2_c::Build(HDC hdc, bool italic, bool bold) // [CHANGED] current_height.height = height; for (unsigned k = 0; k < 128; k++) { + // Get glyph GLYPHMETRICS gm; const MAT2 m2i = { 0, 1, 0, 0, 0, 0, 0, 1 }; const unsigned bbSize = GetGlyphOutline(hdc, k, GGO_GRAY8_BITMAP, &gm, 0, NULL, &m2i); @@ -96,12 +97,14 @@ void glFontGenV2_c::Build(HDC hdc, bool italic, bool bold) // [CHANGED] std::unique_ptr bb = std::make_unique(bbSize); GetGlyphOutline(hdc, k, GGO_GRAY8_BITMAP, &gm, bbSize, bb.get(), &m2i); + // Get glyph info const unsigned xs = gm.gmBlackBoxX; const unsigned ys = gm.gmBlackBoxY; const int xo = gm.gmptGlyphOrigin.x; const int yo = tm.tmAscent - gm.gmptGlyphOrigin.y; const int glw = gm.gmCellIncX; + // Initialise glyph data auto& glyph = current_height.glyphs.emplace_back(); glyph.width = xs; glyph.spleft = xo; @@ -109,6 +112,7 @@ void glFontGenV2_c::Build(HDC hdc, bool italic, bool bold) // [CHANGED] glyph.dat = std::make_unique(height * xs); memset(glyph.dat.get(), 0, height * xs); + // Copy glyph image if (bbSize && ys > 0 && xs > 0) { unsigned rowStride = ((xs + 3u) & ~3u); if (rowStride == 0 || rowStride * ys > bbSize) { @@ -143,9 +147,11 @@ void glFontGenV2_c::Build(HDC hdc, bool italic, bool bold) // [CHANGED] const unsigned cellHeight = height + cellPadding; + // Find best image size unsigned imgWidth = 0, imgHeight = 0; unsigned bestDim = std::numeric_limits::max(); for (unsigned xmax = 32; xmax <= 2048; xmax <<= 1) { + // Find number of rows for this width unsigned numRow = 1; unsigned rowWidth = 0; for (size_t g = 0; g < current_height.glyphs.size(); g++) { @@ -176,9 +182,11 @@ void glFontGenV2_c::Build(HDC hdc, bool italic, bool bold) // [CHANGED] } } + // Prepare RGBA image, and fill with 255,255,255,0 std::unique_ptr image = std::make_unique(imgWidth * imgHeight); std::fill_n(image.get(), imgWidth * imgHeight, 0x00FFFFFF); + // Write the glyphs into the alpha channel of the image unsigned ix = 0, iy = 0; for (auto& glyph : current_height.glyphs) { const unsigned cellWidth = glyph.width + cellPadding; @@ -196,9 +204,10 @@ void glFontGenV2_c::Build(HDC hdc, bool italic, bool bold) // [CHANGED] ix += cellWidth; } + // Open image file for writing std::string tgaFileName = fontName; if (italic) tgaFileName += " Italic"; - if (bold) tgaFileName += " Bold"; // [ADDED] + if (bold) tgaFileName += " Bold"; tgaFileName += "." + std::to_string(height) + ".tga"; const auto tgaPath = outputDir / tgaFileName; @@ -209,6 +218,7 @@ void glFontGenV2_c::Build(HDC hdc, bool italic, bool bold) // [CHANGED] const auto WriteRaw = [&](const auto& val) { out.write((const char*)&val, sizeof(val)); }; + // Write header tgaHeader_s th; ZeroMemory(&th, sizeof(th)); th.it = 10; @@ -225,21 +235,25 @@ void glFontGenV2_c::Build(HDC hdc, bool italic, bool bold) // [CHANGED] WriteRaw(packet[0]); else out.write((const char*)packet.data(), 4 * (hdr + 1)); - }; - + }; + + // Write image for (int y = imgHeight - 1; y >= 0; y--) { hdr = 255; uint32_t lastPix = 0; const uint32_t* line_start = &image[y * imgWidth]; for (const auto* p = line_start; p < line_start + imgWidth; ++p) { if (hdr == 255) { + // Start new packet hdr = 0; packet[hdr] = *p; } else if (hdr & 0x80) { + // Run-length packet, check for continuance if (*p == lastPix) { hdr++; if (hdr == 255) { + // Max length, write it WritePacket(); } } @@ -250,6 +264,7 @@ void glFontGenV2_c::Build(HDC hdc, bool italic, bool bold) // [CHANGED] } } else if (hdr) { + // Raw packet, check if a run-length packet could be created with the last pixel if (*p == lastPix) { hdr--; WritePacket(); @@ -257,6 +272,7 @@ void glFontGenV2_c::Build(HDC hdc, bool italic, bool bold) // [CHANGED] hdr = 129; } else if (hdr == 127) { + // Packet is already full, write it WritePacket(); hdr = 0; packet[hdr] = *p; @@ -267,6 +283,7 @@ void glFontGenV2_c::Build(HDC hdc, bool italic, bool bold) // [CHANGED] } } else { + // New packet, check if this could become a run-length packet if (*p == lastPix) { hdr = 129; } @@ -278,16 +295,18 @@ void glFontGenV2_c::Build(HDC hdc, bool italic, bool bold) // [CHANGED] lastPix = *p; } if (hdr < 255) { + // Leftover packet, write it WritePacket(); } } } -void glFontGenV2_c::Finish(bool italic, bool bold) // [CHANGED] +void glFontGenV2_c::Finish(bool italic, bool bold) { + // Open info file for writing std::string tgfFileName = fontName; if (italic) tgfFileName += " Italic"; - if (bold) tgfFileName += " Bold"; // [ADDED] + if (bold) tgfFileName += " Bold"; tgfFileName += ".tgf"; const auto tgfPath = outputDir / tgfFileName; @@ -297,6 +316,7 @@ void glFontGenV2_c::Finish(bool italic, bool bold) // [CHANGED] } for (const auto& height_data : heights) { + // Write glyph attributes tgf << "HEIGHT " << height_data.height << ";\n"; for (size_t g = 0; g < height_data.glyphs.size(); g++) { const auto& glyph = height_data.glyphs[g]; @@ -314,8 +334,13 @@ void glFontGenV2_c::Finish(bool italic, bool bold) // [CHANGED] heights.clear(); } -static void BuildFont(HDC hdc, char* fontName, int size, int fontWeight, int fontPitch, BOOL italic, BOOL bold, glFontGenV2_c& gen) // [CHANGED] +// =============== +// Main Dialog Box +// =============== + +static void BuildFont(HDC hdc, char* fontName, int size, int fontWeight, int fontPitch, BOOL italic, BOOL bold, glFontGenV2_c& gen) { + // Create font HFONT hf = CreateFont( size, 0, 0, 0, bold ? FW_BOLD : fontWeight, italic, FALSE, FALSE, @@ -326,15 +351,20 @@ static void BuildFont(HDC hdc, char* fontName, int size, int fontWeight, int fon if (hf == NULL) { return; } - + // Select the font HGDIOBJ prevf = SelectObject(hdc, hf); - gen.Build(hdc, italic, bold); // [CHANGED] + + // Run font generator + gen.Build(hdc, italic, bold); + + // Delete font object SelectObject(hdc, prevf); DeleteObject(hf); } static void BuildSelectedFonts(HWND hwndDlg) { + // Get font name char fontName[64] = {}; HWND hList = GetDlgItem(hwndDlg, IDC_FONTSEL); int sel = (int)SendMessage(hList, LB_GETCURSEL, 0, 0); @@ -346,49 +376,68 @@ static void BuildSelectedFonts(HWND hwndDlg) return; } + // Get font attributes int fontWeight = GetDlgItemInt(hwndDlg, IDC_FONTWEIGHT, NULL, 0); int fontPitch = (Button_GetCheck(GetDlgItem(hwndDlg, IDC_FONTFIXED))) ? FIXED_PITCH : VARIABLE_PITCH; BOOL italic = Button_GetCheck(GetDlgItem(hwndDlg, IDC_FONTITALIC)); - BOOL bold = Button_GetCheck(GetDlgItem(hwndDlg, IDC_FONTBOLD)); // [ADDED] + BOOL bold = Button_GetCheck(GetDlgItem(hwndDlg, IDC_FONTBOLD)); if (bold && fontWeight < FW_BOLD) - fontWeight = FW_BOLD; // [ADDED] + fontWeight = FW_BOLD; glFontGenV2_c gen; gen.Init(fontName); + // Generate selected fonts HDC hdc = GetDC(hwndDlg); - const int allSizes[] = { 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 32, 36, 40, 48, 56, 64 }; - + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZALL))) { + const int allSizes[] = { 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 32, 36, 40, 48, 56, 64 }; for (int size : allSizes) - BuildFont(hdc, fontName, size, fontWeight, fontPitch, italic, bold, gen); // [CHANGED] + BuildFont(hdc, fontName, size, fontWeight, fontPitch, italic, bold, gen); } else { - for (int size : allSizes) { - int ctrlId = IDC_SZ10 + ((size - 10) / 2); - if (Button_GetCheck(GetDlgItem(hwndDlg, ctrlId))) - BuildFont(hdc, fontName, size, fontWeight, fontPitch, italic, bold, gen); // [CHANGED] - } + + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ10))) BuildFont(hdc, fontName, 10, fontWeight, fontPitch, italic, bold, gen); + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ12))) BuildFont(hdc, fontName, 12, fontWeight, fontPitch, italic, bold, gen); + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ14))) BuildFont(hdc, fontName, 14, fontWeight, fontPitch, italic, bold, gen); + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ16))) BuildFont(hdc, fontName, 16, fontWeight, fontPitch, italic, bold, gen); + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ18))) BuildFont(hdc, fontName, 18, fontWeight, fontPitch, italic, bold, gen); + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ20))) BuildFont(hdc, fontName, 20, fontWeight, fontPitch, italic, bold, gen); + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ22))) BuildFont(hdc, fontName, 22, fontWeight, fontPitch, italic, bold, gen); + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ24))) BuildFont(hdc, fontName, 24, fontWeight, fontPitch, italic, bold, gen); + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ26))) BuildFont(hdc, fontName, 26, fontWeight, fontPitch, italic, bold, gen); + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ28))) BuildFont(hdc, fontName, 28, fontWeight, fontPitch, italic, bold, gen); + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ32))) BuildFont(hdc, fontName, 32, fontWeight, fontPitch, italic, bold, gen); + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ36))) BuildFont(hdc, fontName, 36, fontWeight, fontPitch, italic, bold, gen); + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ40))) BuildFont(hdc, fontName, 40, fontWeight, fontPitch, italic, bold, gen); + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ48))) BuildFont(hdc, fontName, 48, fontWeight, fontPitch, italic, bold, gen); + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ56))) BuildFont(hdc, fontName, 56, fontWeight, fontPitch, italic, bold, gen); + if (Button_GetCheck(GetDlgItem(hwndDlg, IDC_SZ64))) BuildFont(hdc, fontName, 64, fontWeight, fontPitch, italic, bold, gen); } - gen.Finish(italic, bold); // [CHANGED] + gen.Finish(italic, bold); MessageBox(hwndDlg, "Font generated successfully.", "OpenGL Font Generator", MB_ICONINFORMATION); } +// EnumFontProc: add names to the LISTBOX instead of combo static int __stdcall EnumFontProc(const LOGFONT* lf, const TEXTMETRIC* ltm, unsigned long FontType, LPARAM lParam) { HWND hList = (HWND)lParam; + // SendMessage will pick ANSI/UNICODE variant automatically SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)lf->lfFaceName); return 1; } static HFONT g_hPreviewFont = NULL; +// Create or update the preview control font and text. +// Uses current selection, weight and italic settings to create a sample HFONT static void UpdatePreview(HWND hwndDlg) { + // Get selected font name from listbox char fontName[128] = {}; HWND hList = GetDlgItem(hwndDlg, IDC_FONTSEL); int sel = (int)SendMessageA(hList, LB_GETCURSEL, 0, 0); @@ -396,6 +445,7 @@ static void UpdatePreview(HWND hwndDlg) SendMessageA(hList, LB_GETTEXT, sel, (LPARAM)fontName); if (fontName[0] == '\0') return; + // Get preview text from edit control char previewText[512] = {}; GetDlgItemTextA(hwndDlg, IDC_PREVIEWTEXT, previewText, (int)std::size(previewText)); if (previewText[0] == '\0') { @@ -403,34 +453,43 @@ static void UpdatePreview(HWND hwndDlg) SetDlgItemTextA(hwndDlg, IDC_PREVIEWTEXT, previewText); } + // Get weight, italic, and bold int fontWeight = GetDlgItemInt(hwndDlg, IDC_FONTWEIGHT, NULL, FALSE); BOOL italic = Button_GetCheck(GetDlgItem(hwndDlg, IDC_FONTITALIC)); - BOOL bold = Button_GetCheck(GetDlgItem(hwndDlg, IDC_FONTBOLD)); // [ADDED] + BOOL bold = Button_GetCheck(GetDlgItem(hwndDlg, IDC_FONTBOLD)); + // Choose a reasonable preview point size (you can change this) const int previewPoint = 18; + // Convert points -> device pixels and request character height HDC hdc = GetDC(hwndDlg); const int dpiY = GetDeviceCaps(hdc, LOGPIXELSY); ReleaseDC(hwndDlg, hdc); const int lfHeight = -MulDiv(previewPoint, dpiY, 72); + // Build LOGFONT LOGFONTA lf; memset(&lf, 0, sizeof(lf)); lf.lfHeight = lfHeight; - lf.lfWeight = bold ? FW_BOLD : ((fontWeight > 0) ? fontWeight : FW_NORMAL); // [CHANGED] + lf.lfWeight = bold ? FW_BOLD : ((fontWeight > 0) ? fontWeight : FW_NORMAL); lf.lfItalic = italic ? 1 : 0; lf.lfCharSet = DEFAULT_CHARSET; lf.lfPitchAndFamily = FF_DONTCARE; strncpy_s(lf.lfFaceName, fontName, _TRUNCATE); + // Create HFONT HFONT hNewFont = CreateFontIndirectA(&lf); if (!hNewFont) return; + // Apply to preview control HWND hPreview = GetDlgItem(hwndDlg, IDC_PREVIEW); + // Set text first then font so control reports correct layout SetWindowTextA(hPreview, previewText); SendMessageA(hPreview, WM_SETFONT, (WPARAM)hNewFont, TRUE); + // Destroy previous font if (g_hPreviewFont) { + // safe to delete after setting new font (control now uses hNewFont) DeleteObject(g_hPreviewFont); } g_hPreviewFont = hNewFont; @@ -445,6 +504,7 @@ static int __stdcall DlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPara break; case WM_INITDIALOG: + // Add font weights ComboBox_AddString(GetDlgItem(hwndDlg, IDC_FONTWEIGHT), "100"); ComboBox_AddString(GetDlgItem(hwndDlg, IDC_FONTWEIGHT), "200"); ComboBox_AddString(GetDlgItem(hwndDlg, IDC_FONTWEIGHT), "300"); @@ -457,12 +517,17 @@ static int __stdcall DlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPara ComboBox_AddString(GetDlgItem(hwndDlg, IDC_FONTWEIGHT), "1000"); ComboBox_SetCurSel(GetDlgItem(hwndDlg, IDC_FONTWEIGHT), 4); + // Add font names EnumFontFamilies(GetDC(hwndDlg), NULL, EnumFontProc, (LPARAM)GetDlgItem(hwndDlg, IDC_FONTSEL)); ListBox_SetCurSel(GetDlgItem(hwndDlg, IDC_FONTSEL), 0); + // Default preview text SetDlgItemTextA(hwndDlg, IDC_PREVIEWTEXT, "Path of Exile 2"); + // Check the "All" box by default CheckDlgButton(hwndDlg, IDC_SZALL, BST_CHECKED); + // Initialize preview UpdatePreview(hwndDlg); + break; case WM_COMMAND: @@ -471,12 +536,13 @@ static int __stdcall DlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPara BuildSelectedFonts(hwndDlg); break; case IDC_QUIT: + // cleanup preview font if (g_hPreviewFont) { DeleteObject(g_hPreviewFont); g_hPreviewFont = NULL; } EndDialog(hwndDlg, 1); break; case IDC_FONTSEL: case IDC_FONTITALIC: - case IDC_FONTBOLD: // [ADDED] + case IDC_FONTBOLD: case IDC_FONTWEIGHT: case IDC_PREVIEWTEXT: if (HIWORD(wParam) == BN_CLICKED || HIWORD(wParam) == LBN_SELCHANGE || HIWORD(wParam) == EN_CHANGE)