2 // System.Drawing.FontFamily.cs
5 // Dennis Hayes (dennish@Raytek.com)
6 // Alexandre Pigolkine (pigolkine@gmx.de)
8 // Copyright (C) 2002/2004 Ximian, Inc http://www.ximian.com
10 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 using System
.Drawing
.Text
;
34 using System
.Runtime
.InteropServices
;
36 namespace System
.Drawing
{
38 public sealed class FontFamily
: MarshalByRefObject
, IDisposable
41 static private FontFamily genericMonospace
= null;
42 static private FontFamily genericSansSerif
= null;
43 static private FontFamily genericSerif
= null;
45 internal IntPtr nativeFontFamily
= IntPtr
.Zero
;
47 internal FontFamily(IntPtr fntfamily
)
49 nativeFontFamily
= fntfamily
;
53 internal void refreshName()
55 if (nativeFontFamily
!= IntPtr
.Zero
) {
57 StringBuilder sBuilder
= new StringBuilder (GDIPlus
.FACESIZE
* UnicodeEncoding
.CharSize
);
58 Status status
= GDIPlus
.GdipGetFamilyName (nativeFontFamily
, sBuilder
, language
);
59 GDIPlus
.CheckStatus (status
);
60 name
= sBuilder
.ToString();
64 //Need to come back here, is Arial the right thing to do
65 internal FontFamily() : this ("Arial", null)
76 internal IntPtr NativeObject
80 return nativeFontFamily
;
84 nativeFontFamily
= value;
88 public FontFamily(GenericFontFamilies genericFamily
)
91 switch (genericFamily
)
93 case GenericFontFamilies
.Monospace
:
94 status
= GDIPlus
.GdipGetGenericFontFamilyMonospace (out nativeFontFamily
);
95 GDIPlus
.CheckStatus (status
);
98 case GenericFontFamilies
.SansSerif
:
99 status
= GDIPlus
.GdipGetGenericFontFamilySansSerif (out nativeFontFamily
);
100 GDIPlus
.CheckStatus (status
);
103 case GenericFontFamilies
.Serif
:
104 status
= GDIPlus
.GdipGetGenericFontFamilySerif (out nativeFontFamily
);
105 GDIPlus
.CheckStatus (status
);
108 default: // Undocumented default
109 status
= GDIPlus
.GdipGetGenericFontFamilyMonospace (out nativeFontFamily
);
110 GDIPlus
.CheckStatus (status
);
116 public FontFamily(string familyName
) : this (familyName
, null)
120 public FontFamily (string familyName
, FontCollection collection
)
123 if ( collection
!= null )
124 status
= GDIPlus
.GdipCreateFontFamilyFromName (familyName
, collection
.nativeFontCollection
, out nativeFontFamily
);
126 status
= GDIPlus
.GdipCreateFontFamilyFromName (familyName
, IntPtr
.Zero
, out nativeFontFamily
);
127 GDIPlus
.CheckStatus (status
);
140 public static FontFamily GenericMonospace
144 if (genericMonospace
== null)
146 IntPtr generic
= IntPtr
.Zero
;
147 Status status
= GDIPlus
.GdipGetGenericFontFamilyMonospace (out generic
);
148 GDIPlus
.CheckStatus (status
);
149 genericMonospace
= new FontFamily (generic
);
150 genericMonospace
.refreshName ();
153 return genericMonospace
;
157 public static FontFamily GenericSansSerif
161 if (genericSansSerif
== null)
163 IntPtr generic
= IntPtr
.Zero
;
164 Status status
= GDIPlus
.GdipGetGenericFontFamilySansSerif (out generic
);
165 GDIPlus
.CheckStatus (status
);
166 genericSansSerif
= new FontFamily (generic
);
167 genericSansSerif
.refreshName ();
170 return genericSansSerif
;
174 public static FontFamily GenericSerif
178 if (genericSerif
== null)
180 IntPtr generic
= IntPtr
.Zero
;
181 Status status
= GDIPlus
.GdipGetGenericFontFamilySerif (out generic
);
182 GDIPlus
.CheckStatus (status
);
183 genericSerif
= new FontFamily (generic
);
184 genericSerif
.refreshName ();
191 //Need to check how to get the Flags attribute to read
192 //bitwise value of the enumeration
193 internal int GetStyleCheck(FontStyle style
)
200 case FontStyle
.Italic
:
203 case FontStyle
.Regular
:
206 case FontStyle
.Strikeout
:
209 case FontStyle
.Underline
:
216 public int GetCellAscent (FontStyle style
)
220 int styleCheck
= GetStyleCheck (style
);
221 status
= GDIPlus
.GdipGetCellAscent (nativeFontFamily
, styleCheck
, out outProperty
);
222 GDIPlus
.CheckStatus (status
);
224 return (int) outProperty
;
227 public int GetCellDescent (FontStyle style
)
231 int styleCheck
= GetStyleCheck (style
);
232 status
= GDIPlus
.GdipGetCellDescent (nativeFontFamily
, styleCheck
, out outProperty
);
233 GDIPlus
.CheckStatus (status
);
235 return (int) outProperty
;
238 public int GetEmHeight (FontStyle style
)
242 int styleCheck
= GetStyleCheck (style
);
243 status
= GDIPlus
.GdipGetEmHeight (nativeFontFamily
, styleCheck
, out outProperty
);
244 GDIPlus
.CheckStatus (status
);
246 return (int) outProperty
;
249 public int GetLineSpacing (FontStyle style
)
253 int styleCheck
= GetStyleCheck (style
);
254 status
= GDIPlus
.GdipGetLineSpacing (nativeFontFamily
, styleCheck
, out outProperty
);
255 GDIPlus
.CheckStatus (status
);
257 return (int) outProperty
;
260 public bool IsStyleAvailable (FontStyle style
)
264 int styleCheck
= GetStyleCheck (style
);
265 status
= GDIPlus
.GdipIsStyleAvailable (nativeFontFamily
, styleCheck
, out outProperty
);
266 GDIPlus
.CheckStatus (status
);
271 public void Dispose ()
273 Status status
= GDIPlus
.GdipDeleteFontFamily (nativeFontFamily
);
274 if ( status
== Status
.Ok
)
275 nativeFontFamily
= IntPtr
.Zero
;
278 public override bool Equals(object obj
)
280 if (!(obj
is FontFamily
))
283 return (this == (FontFamily
) obj
);
286 public override int GetHashCode ()
288 return name
.GetHashCode ();
292 public FontFamily
[] Families
296 return GetFamilies (null);
300 public static FontFamily
[] GetFamilies (Graphics graphics
)
302 InstalledFontCollection fntcol
= new InstalledFontCollection ();
303 return fntcol
.Families
;
306 [MonoTODO ("We only support the default system language")]
307 public string GetName (int language
)
312 public override string ToString ()
314 return "FontFamily :" + name
;