Mercurial > foo_out_sdl
diff foosdk/sdk/foobar2000/shared/font_description.cpp @ 1:20d02a178406 default tip
*: check in everything else
yay
| author | Paper <paper@tflc.us> |
|---|---|
| date | Mon, 05 Jan 2026 02:15:46 -0500 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/foosdk/sdk/foobar2000/shared/font_description.cpp Mon Jan 05 02:15:46 2026 -0500 @@ -0,0 +1,126 @@ +#include "shared.h" + + +static unsigned query_dpi() +{ + unsigned ret; + HDC dc = GetDC(0); + ret = GetDeviceCaps(dc,LOGPIXELSY); + ReleaseDC(0,dc); + return ret; +} + + +#if 0 +struct t_font_description +{ + enum {m_facename_length = LF_FACESIZE*2}; + + t_uint32 m_height; + t_uint32 m_weight; + t_uint8 m_italic; + t_uint8 m_charset; + char m_facename[m_facename_length]; +} +#endif + +static void make_logfont(LOGFONT & p_logfont,const t_font_description & p_desc) +{ + p_logfont.lfHeight = - MulDiv(p_desc.m_height, query_dpi(), t_font_description::m_height_dpi); + p_logfont.lfWidth = 0; + p_logfont.lfEscapement = 0; + p_logfont.lfOrientation = 0; + p_logfont.lfWeight = p_desc.m_weight; + p_logfont.lfItalic = p_desc.m_italic; + p_logfont.lfUnderline = 0; + p_logfont.lfStrikeOut = 0; + p_logfont.lfCharSet = p_desc.m_charset; + p_logfont.lfOutPrecision = 3; + p_logfont.lfClipPrecision = 2; + p_logfont.lfQuality = 1; + p_logfont.lfPitchAndFamily = 34; + pfc::stringToBuffer(p_logfont.lfFaceName,pfc::stringcvt::string_os_from_utf8(p_desc.m_facename,tabsize(p_desc.m_facename))); +} + +static void make_description(t_font_description & p_desc,const LOGFONT & p_logfont) +{ + p_desc.m_height = MulDiv(pfc::abs_t(p_logfont.lfHeight), t_font_description::m_height_dpi, query_dpi()); + p_desc.m_weight = p_logfont.lfWeight; + p_desc.m_italic = p_logfont.lfItalic; + p_desc.m_charset = p_logfont.lfCharSet; + pfc::stringToBuffer(p_desc.m_facename,pfc::stringcvt::string_utf8_from_os(p_logfont.lfFaceName,tabsize(p_logfont.lfFaceName))); +} + +HFONT SHARED_EXPORT t_font_description::create() const +{ + LOGFONT temp; + make_logfont(temp,*this); + return CreateFontIndirect(&temp); +} + +static UINT_PTR CALLBACK choose_font_hook(HWND wnd,UINT msg,WPARAM wp,LPARAM lp) +{ + switch(msg) + { + case WM_INITDIALOG: + { + CHOOSEFONT * cf = reinterpret_cast<CHOOSEFONT*>(lp); + reinterpret_cast<modal_dialog_scope*>(cf->lCustData)->initialize(FindOwningPopup(wnd)); + } + return 0; + default: + return 0; + } +} + +bool SHARED_EXPORT t_font_description::popup_dialog(HWND p_parent) +{ + modal_dialog_scope scope; + + LOGFONT logfont; + make_logfont(logfont,*this); + + CHOOSEFONT cf = {}; + cf.lStructSize = sizeof(cf); + cf.hwndOwner = p_parent; + cf.lpLogFont = &logfont; + cf.Flags = CF_SCREENFONTS|CF_FORCEFONTEXIST|CF_INITTOLOGFONTSTRUCT|CF_ENABLEHOOK; + cf.nFontType = SCREEN_FONTTYPE; + cf.lCustData = reinterpret_cast<LPARAM>(&scope); + cf.lpfnHook = choose_font_hook; + if (ChooseFont(&cf)) + { + make_description(*this,logfont); + return true; + } + else return false; +} + + +void SHARED_EXPORT t_font_description::from_font(HFONT p_font) +{ + LOGFONT logfont; + PFC_ASSERT_SUCCESS( GetObject((HGDIOBJ) p_font, sizeof(logfont), &logfont) != 0 ); + make_description(*this,logfont); +} + +t_font_description SHARED_EXPORT t_font_description::g_from_font(HFONT p_font) +{ + t_font_description temp; + temp.from_font(p_font); + return temp; +} + + +t_font_description SHARED_EXPORT t_font_description::g_from_logfont(LOGFONT const & lf) { + t_font_description ret; make_description(ret, lf); return ret; +} + +t_font_description SHARED_EXPORT t_font_description::g_from_system(int id) { + LOGFONT lf; + if (FAILED( GetThemeSysFont(NULL, id, &lf) ) ) { + PFC_ASSERT(!"Should not get here!"); + return g_from_font( (HFONT) GetStockObject(DEFAULT_GUI_FONT) ); + } + return g_from_logfont(lf); +}
