annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #include "shared.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 static unsigned query_dpi()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 unsigned ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 HDC dc = GetDC(0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 ret = GetDeviceCaps(dc,LOGPIXELSY);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 ReleaseDC(0,dc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 #if 0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 struct t_font_description
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 enum {m_facename_length = LF_FACESIZE*2};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 t_uint32 m_height;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 t_uint32 m_weight;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 t_uint8 m_italic;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 t_uint8 m_charset;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 char m_facename[m_facename_length];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 static void make_logfont(LOGFONT & p_logfont,const t_font_description & p_desc)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 p_logfont.lfHeight = - MulDiv(p_desc.m_height, query_dpi(), t_font_description::m_height_dpi);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 p_logfont.lfWidth = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 p_logfont.lfEscapement = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 p_logfont.lfOrientation = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 p_logfont.lfWeight = p_desc.m_weight;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 p_logfont.lfItalic = p_desc.m_italic;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 p_logfont.lfUnderline = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 p_logfont.lfStrikeOut = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 p_logfont.lfCharSet = p_desc.m_charset;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 p_logfont.lfOutPrecision = 3;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 p_logfont.lfClipPrecision = 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 p_logfont.lfQuality = 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 p_logfont.lfPitchAndFamily = 34;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 pfc::stringToBuffer(p_logfont.lfFaceName,pfc::stringcvt::string_os_from_utf8(p_desc.m_facename,tabsize(p_desc.m_facename)));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 static void make_description(t_font_description & p_desc,const LOGFONT & p_logfont)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 p_desc.m_height = MulDiv(pfc::abs_t(p_logfont.lfHeight), t_font_description::m_height_dpi, query_dpi());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 p_desc.m_weight = p_logfont.lfWeight;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 p_desc.m_italic = p_logfont.lfItalic;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 p_desc.m_charset = p_logfont.lfCharSet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 pfc::stringToBuffer(p_desc.m_facename,pfc::stringcvt::string_utf8_from_os(p_logfont.lfFaceName,tabsize(p_logfont.lfFaceName)));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 HFONT SHARED_EXPORT t_font_description::create() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 LOGFONT temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 make_logfont(temp,*this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 return CreateFontIndirect(&temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 static UINT_PTR CALLBACK choose_font_hook(HWND wnd,UINT msg,WPARAM wp,LPARAM lp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 switch(msg)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 case WM_INITDIALOG:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 CHOOSEFONT * cf = reinterpret_cast<CHOOSEFONT*>(lp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 reinterpret_cast<modal_dialog_scope*>(cf->lCustData)->initialize(FindOwningPopup(wnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 bool SHARED_EXPORT t_font_description::popup_dialog(HWND p_parent)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 modal_dialog_scope scope;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 LOGFONT logfont;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 make_logfont(logfont,*this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 CHOOSEFONT cf = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 cf.lStructSize = sizeof(cf);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 cf.hwndOwner = p_parent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 cf.lpLogFont = &logfont;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 cf.Flags = CF_SCREENFONTS|CF_FORCEFONTEXIST|CF_INITTOLOGFONTSTRUCT|CF_ENABLEHOOK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 cf.nFontType = SCREEN_FONTTYPE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 cf.lCustData = reinterpret_cast<LPARAM>(&scope);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 cf.lpfnHook = choose_font_hook;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 if (ChooseFont(&cf))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 make_description(*this,logfont);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 else return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 void SHARED_EXPORT t_font_description::from_font(HFONT p_font)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 LOGFONT logfont;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 PFC_ASSERT_SUCCESS( GetObject((HGDIOBJ) p_font, sizeof(logfont), &logfont) != 0 );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 make_description(*this,logfont);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 t_font_description SHARED_EXPORT t_font_description::g_from_font(HFONT p_font)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 t_font_description temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 temp.from_font(p_font);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 return temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 t_font_description SHARED_EXPORT t_font_description::g_from_logfont(LOGFONT const & lf) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 t_font_description ret; make_description(ret, lf); return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 t_font_description SHARED_EXPORT t_font_description::g_from_system(int id) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 LOGFONT lf;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 if (FAILED( GetThemeSysFont(NULL, id, &lf) ) ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 PFC_ASSERT(!"Should not get here!");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 return g_from_font( (HFONT) GetStockObject(DEFAULT_GUI_FONT) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 return g_from_logfont(lf);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 }