1 /* aNetHack 0.0.1 mhfont.c $ANH-Date: 1432512800 2015/05/25 00:13:20 $ $ANH-Branch: master $:$ANH-Revision: 1.18 $ */
2 /* Copyright (C) 2001 by Alex Kompel */
3 /* aNetHack may be freely redistributed. See license for details. */
5 /* font management and such */
11 /* font table - 64 fonts ought to be enough */
12 static struct font_table_entry
{
15 } font_table
[MAXFONTS
];
16 static int font_table_size
= 0;
17 HFONT version_splash_font
;
18 HFONT extrainfo_splash_font
;
20 #define NHFONT_CODE(win, attr) (((attr & 0xFF) << 8) | (win_type & 0xFF))
22 static void __cdecl
font_table_cleanup(void);
24 /* create font based on window type, charater attributes and
25 window device context */
27 mswin_get_font(int win_type
, int attr
, HDC hdc
, BOOL replace
)
33 static BOOL once
= FALSE
;
37 atexit(font_table_cleanup
);
40 ZeroMemory(&lgfnt
, sizeof(lgfnt
));
42 /* try find font in the table */
43 for (font_index
= 0; font_index
< font_table_size
; font_index
++)
44 if (NHFONT_CODE(win_type
, attr
) == font_table
[font_index
].code
)
47 if (!replace
&& font_index
< font_table_size
)
48 return font_table
[font_index
].hFont
;
52 lgfnt
.lfHeight
= -iflags
.wc_fontsiz_status
53 * GetDeviceCaps(hdc
, LOGPIXELSY
)
54 / 72; // height of font
55 lgfnt
.lfWidth
= 0; // average character width
56 lgfnt
.lfEscapement
= 0; // angle of escapement
57 lgfnt
.lfOrientation
= 0; // base-line orientation angle
58 lgfnt
.lfWeight
= FW_NORMAL
; // font weight
59 lgfnt
.lfItalic
= FALSE
; // italic attribute option
60 lgfnt
.lfUnderline
= FALSE
; // underline attribute option
61 lgfnt
.lfStrikeOut
= FALSE
; // strikeout attribute option
62 lgfnt
.lfCharSet
= mswin_charset(); // character set identifier
63 lgfnt
.lfOutPrecision
= OUT_DEFAULT_PRECIS
; // output precision
64 lgfnt
.lfClipPrecision
= CLIP_DEFAULT_PRECIS
; // clipping precision
65 lgfnt
.lfQuality
= DEFAULT_QUALITY
; // output quality
66 if (iflags
.wc_font_status
&& *iflags
.wc_font_status
) {
67 lgfnt
.lfPitchAndFamily
= DEFAULT_PITCH
; // pitch and family
68 NH_A2W(iflags
.wc_font_status
, lgfnt
.lfFaceName
, LF_FACESIZE
);
70 lgfnt
.lfPitchAndFamily
= FIXED_PITCH
; // pitch and family
75 lgfnt
.lfHeight
= -iflags
.wc_fontsiz_menu
76 * GetDeviceCaps(hdc
, LOGPIXELSY
)
77 / 72; // height of font
78 lgfnt
.lfWidth
= 0; // average character width
79 lgfnt
.lfEscapement
= 0; // angle of escapement
80 lgfnt
.lfOrientation
= 0; // base-line orientation angle
81 lgfnt
.lfWeight
= (attr
== ATR_BOLD
|| attr
== ATR_INVERSE
)
83 : FW_NORMAL
; // font weight
85 (attr
== ATR_BLINK
) ? TRUE
: FALSE
; // italic attribute option
87 (attr
== ATR_ULINE
) ? TRUE
: FALSE
; // underline attribute option
88 lgfnt
.lfStrikeOut
= FALSE
; // strikeout attribute option
89 lgfnt
.lfCharSet
= mswin_charset(); // character set identifier
90 lgfnt
.lfOutPrecision
= OUT_DEFAULT_PRECIS
; // output precision
91 lgfnt
.lfClipPrecision
= CLIP_DEFAULT_PRECIS
; // clipping precision
92 lgfnt
.lfQuality
= DEFAULT_QUALITY
; // output quality
93 if (iflags
.wc_font_menu
&& *iflags
.wc_font_menu
) {
94 lgfnt
.lfPitchAndFamily
= DEFAULT_PITCH
; // pitch and family
95 NH_A2W(iflags
.wc_font_menu
, lgfnt
.lfFaceName
, LF_FACESIZE
);
97 lgfnt
.lfPitchAndFamily
= FIXED_PITCH
; // pitch and family
102 font_size
= (attr
== ATR_INVERSE
) ? iflags
.wc_fontsiz_message
+ 1
103 : iflags
.wc_fontsiz_message
;
104 lgfnt
.lfHeight
= -font_size
* GetDeviceCaps(hdc
, LOGPIXELSY
)
105 / 72; // height of font
106 lgfnt
.lfWidth
= 0; // average character width
107 lgfnt
.lfEscapement
= 0; // angle of escapement
108 lgfnt
.lfOrientation
= 0; // base-line orientation angle
109 lgfnt
.lfWeight
= (attr
== ATR_BOLD
|| attr
== ATR_INVERSE
)
111 : FW_NORMAL
; // font weight
113 (attr
== ATR_BLINK
) ? TRUE
: FALSE
; // italic attribute option
115 (attr
== ATR_ULINE
) ? TRUE
: FALSE
; // underline attribute option
116 lgfnt
.lfStrikeOut
= FALSE
; // strikeout attribute option
117 lgfnt
.lfCharSet
= mswin_charset(); // character set identifier
118 lgfnt
.lfOutPrecision
= OUT_DEFAULT_PRECIS
; // output precision
119 lgfnt
.lfClipPrecision
= CLIP_DEFAULT_PRECIS
; // clipping precision
120 lgfnt
.lfQuality
= DEFAULT_QUALITY
; // output quality
121 if (iflags
.wc_font_message
&& *iflags
.wc_font_message
) {
122 lgfnt
.lfPitchAndFamily
= DEFAULT_PITCH
; // pitch and family
123 NH_A2W(iflags
.wc_font_message
, lgfnt
.lfFaceName
, LF_FACESIZE
);
125 lgfnt
.lfPitchAndFamily
= VARIABLE_PITCH
; // pitch and family
130 lgfnt
.lfHeight
= -iflags
.wc_fontsiz_text
131 * GetDeviceCaps(hdc
, LOGPIXELSY
)
132 / 72; // height of font
133 lgfnt
.lfWidth
= 0; // average character width
134 lgfnt
.lfEscapement
= 0; // angle of escapement
135 lgfnt
.lfOrientation
= 0; // base-line orientation angle
136 lgfnt
.lfWeight
= (attr
== ATR_BOLD
|| attr
== ATR_INVERSE
)
138 : FW_NORMAL
; // font weight
140 (attr
== ATR_BLINK
) ? TRUE
: FALSE
; // italic attribute option
142 (attr
== ATR_ULINE
) ? TRUE
: FALSE
; // underline attribute option
143 lgfnt
.lfStrikeOut
= FALSE
; // strikeout attribute option
144 lgfnt
.lfCharSet
= mswin_charset(); // character set identifier
145 lgfnt
.lfOutPrecision
= OUT_DEFAULT_PRECIS
; // output precision
146 lgfnt
.lfClipPrecision
= CLIP_DEFAULT_PRECIS
; // clipping precision
147 lgfnt
.lfQuality
= DEFAULT_QUALITY
; // output quality
148 if (iflags
.wc_font_text
&& *iflags
.wc_font_text
) {
149 lgfnt
.lfPitchAndFamily
= DEFAULT_PITCH
; // pitch and family
150 NH_A2W(iflags
.wc_font_text
, lgfnt
.lfFaceName
, LF_FACESIZE
);
152 lgfnt
.lfPitchAndFamily
= FIXED_PITCH
; // pitch and family
157 fnt
= CreateFontIndirect(&lgfnt
);
159 /* add font to the table */
160 if (font_index
== font_table_size
) {
161 if (font_table_size
>= MAXFONTS
)
162 panic("font table overflow!");
165 DeleteObject(font_table
[font_index
].hFont
);
168 font_table
[font_index
].code
= NHFONT_CODE(win_type
, attr
);
169 font_table
[font_index
].hFont
= fnt
;
177 if (SYMHANDLING(H_IBM
))
178 if (TranslateCharsetInfo((DWORD
*) GetOEMCP(), &cis
, TCI_SRCCODEPAGE
))
179 return cis
.ciCharset
;
182 else if (TranslateCharsetInfo((DWORD
*) GetACP(), &cis
, TCI_SRCCODEPAGE
))
183 return cis
.ciCharset
;
188 void __cdecl
font_table_cleanup(void)
191 for (i
= 0; i
< font_table_size
; i
++) {
192 DeleteObject(font_table
[i
].hFont
);