@@ -160,4 +160,89 @@ public static void OpenWebLink(string url)
160
160
/// <returns>可用的字体名</returns>
161
161
public static string CheckFontName ( string name ) =>
162
162
( SkiaSharp . SKFontManager . Default . MatchFamily ( name ) ?? SkiaSharp . SKTypeface . Default ) . FamilyName ;
163
+
164
+ /// <summary>
165
+ /// 获取字体名称,会根据字体名称返回一个可用的字体名称
166
+ /// 如果字体名称不存在,则返回默认字体名称
167
+ /// </summary>
168
+ /// <param name="name">字体名</param>
169
+ /// <returns>可用的字体名</returns>
170
+ public static string CheckMonoFontName ( string name )
171
+ {
172
+ var fontMgr = SkiaSharp . SKFontManager . Default ;
173
+ var font = fontMgr . MatchFamily ( name ) ?? SkiaSharp . SKTypeface . Default ;
174
+ if ( font . IsFixedPitch ) //是等宽字体
175
+ return font . FamilyName ;
176
+
177
+ //不同的操作系统下的等宽字体都试试
178
+ string [ ] defaultFontList =
179
+ [
180
+ "Consolas" ,
181
+ "Menlo" ,
182
+ "Monaco" ,
183
+ "DejaVu Sans Mono" ,
184
+ "Liberation Mono" ,
185
+ "Ubuntu Mono" ,
186
+ "Source Code Pro" ,
187
+ "Fira Code" ,
188
+ "Courier New" ,
189
+ "Courier" ,
190
+ ] ;
191
+ foreach ( var defaultFont in defaultFontList )
192
+ {
193
+ font = fontMgr . MatchFamily ( defaultFont ) ;
194
+ if ( font == null )
195
+ continue ;
196
+ if ( font . IsFixedPitch )
197
+ return font . FamilyName ;
198
+ }
199
+ //如果没有找到等宽字体,返回第一个等宽字体
200
+ foreach ( var f in fontMgr . FontFamilies )
201
+ {
202
+ font = fontMgr . MatchFamily ( f ) ;
203
+ if ( font . IsFixedPitch )
204
+ return font . FamilyName ;
205
+ }
206
+ //如果还是没有找到,返回默认字体
207
+ return SkiaSharp . SKTypeface . Default . FamilyName ;
208
+ }
209
+
210
+ /// <summary>
211
+ /// 计算终端窗口可以显示的行数和列数
212
+ /// </summary>
213
+ /// <param name="width">窗口宽度</param>
214
+ /// <param name="height">窗口高度</param>
215
+ /// <param name="font">字体名称</param>
216
+ /// <param name="fontSize">字体大小</param>
217
+ /// <returns>(列数宽度,行数高度)</returns>
218
+ public static ( int , int ) CalculateSize ( double width , double height , string font , double fontSize )
219
+ {
220
+ //根据当前字体大小和窗口大小,计算出可以显示的行数和列数
221
+ //按实际的字符宽度和高度来计算
222
+ var fontFamily = SkiaSharp . SKFontManager . Default . MatchFamily ( font ) ?? SkiaSharp . SKTypeface . Default ;
223
+
224
+ //计算出每个字符的宽度和高度,用skiasharp的接口来计算
225
+ //主要字符之间会有间距,所以需要用实际的字符来计算
226
+ var paint = new SkiaSharp . SKPaint
227
+ {
228
+ Typeface = fontFamily ,
229
+ TextSize = ( float ) fontSize
230
+ } ;
231
+
232
+ //计算出一行能放下多少个字符,暂时用最宽的字符来计算
233
+ var charWidth = paint . MeasureText ( "W" ) ;
234
+ var charSpacing = paint . FontMetrics . Leading ;
235
+ int columns = ( int ) ( width / ( charWidth + charSpacing ) ) ;
236
+
237
+ //计算出能放下多少行
238
+ var charHeight = Math . Abs ( paint . FontMetrics . Ascent - paint . FontMetrics . Descent + paint . FontMetrics . Leading ) ;
239
+ int rows = ( int ) ( height / charHeight ) ;
240
+
241
+ //注意不要让行数和列数为0
242
+ if ( rows <= 0 ) rows = 1 ;
243
+ if ( columns <= 0 ) columns = 1 ;
244
+
245
+ //返回
246
+ return ( columns , rows ) ;
247
+ }
163
248
}
0 commit comments