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) {
59 buffer = Marshal.AllocHGlobal(GDIPlus.FACESIZE * UnicodeEncoding.CharSize);
60 Status status = GDIPlus.GdipGetFamilyName (nativeFontFamily, buffer, language);
61 GDIPlus.CheckStatus (status);
62 name = Marshal.PtrToStringUni(buffer);
66 //Need to come back here, is Arial the right thing to do
67 internal FontFamily() : this ("Arial", null)
78 internal IntPtr NativeObject
82 return nativeFontFamily;
86 nativeFontFamily = value;
90 public FontFamily(GenericFontFamilies genericFamily)
93 switch (genericFamily)
95 case GenericFontFamilies.Monospace:
96 status = GDIPlus.GdipGetGenericFontFamilyMonospace (out nativeFontFamily);
97 GDIPlus.CheckStatus (status);
100 case GenericFontFamilies.SansSerif:
101 status = GDIPlus.GdipGetGenericFontFamilySansSerif (out nativeFontFamily);
102 GDIPlus.CheckStatus (status);
105 case GenericFontFamilies.Serif:
106 status = GDIPlus.GdipGetGenericFontFamilySerif (out nativeFontFamily);
107 GDIPlus.CheckStatus (status);
110 default: // Undocumented default
111 status = GDIPlus.GdipGetGenericFontFamilyMonospace (out nativeFontFamily);
112 GDIPlus.CheckStatus (status);
118 public FontFamily(string familyName) : this (familyName, null)
122 public FontFamily (string familyName, FontCollection collection)
125 if ( collection != null )
126 status = GDIPlus.GdipCreateFontFamilyFromName (familyName, collection.nativeFontCollection, out nativeFontFamily);
128 status = GDIPlus.GdipCreateFontFamilyFromName (familyName, IntPtr.Zero, out nativeFontFamily);
129 GDIPlus.CheckStatus (status);
142 public static FontFamily GenericMonospace
147 IntPtr generic = IntPtr.Zero;
148 Status status = GDIPlus.GdipGetGenericFontFamilyMonospace (out generic);
149 GDIPlus.CheckStatus (status);
150 FontFamily genericMonospace = new FontFamily (generic);
151 genericMonospace.refreshName ();
152 return genericMonospace;
156 public static FontFamily GenericSansSerif
160 IntPtr generic = IntPtr.Zero;
161 Status status = GDIPlus.GdipGetGenericFontFamilySansSerif (out generic);
162 GDIPlus.CheckStatus (status);
163 FontFamily genericSansSerif = new FontFamily (generic);
164 genericSansSerif.refreshName ();
165 return genericSansSerif;
169 public static FontFamily GenericSerif
173 IntPtr generic = IntPtr.Zero;
174 Status status = GDIPlus.GdipGetGenericFontFamilySerif (out generic);
175 GDIPlus.CheckStatus (status);
176 FontFamily genericSerif = new FontFamily (generic);
177 genericSerif.refreshName ();
183 //Need to check how to get the Flags attribute to read
184 //bitwise value of the enumeration
185 internal int GetStyleCheck(FontStyle style)
192 case FontStyle.Italic:
195 case FontStyle.Regular:
198 case FontStyle.Strikeout:
201 case FontStyle.Underline:
208 public int GetCellAscent (FontStyle style)
212 int styleCheck = GetStyleCheck (style);
213 status = GDIPlus.GdipGetCellAscent (nativeFontFamily, styleCheck, out outProperty);
214 GDIPlus.CheckStatus (status);
216 return (int) outProperty;
219 public int GetCellDescent (FontStyle style)
223 int styleCheck = GetStyleCheck (style);
224 status = GDIPlus.GdipGetCellDescent (nativeFontFamily, styleCheck, out outProperty);
225 GDIPlus.CheckStatus (status);
227 return (int) outProperty;
230 public int GetEmHeight (FontStyle style)
234 int styleCheck = GetStyleCheck (style);
235 status = GDIPlus.GdipGetEmHeight (nativeFontFamily, styleCheck, out outProperty);
236 GDIPlus.CheckStatus (status);
238 return (int) outProperty;
241 public int GetLineSpacing (FontStyle style)
245 int styleCheck = GetStyleCheck (style);
246 status = GDIPlus.GdipGetLineSpacing (nativeFontFamily, styleCheck, out outProperty);
247 GDIPlus.CheckStatus (status);
249 return (int) outProperty;
252 public bool IsStyleAvailable (FontStyle style)
256 int styleCheck = GetStyleCheck (style);
257 status = GDIPlus.GdipIsStyleAvailable (nativeFontFamily, styleCheck, out outProperty);
258 GDIPlus.CheckStatus (status);
263 public void Dispose ()
265 Status status = GDIPlus.GdipDeleteFontFamily (nativeFontFamily);
266 if ( status == Status.Ok )
267 nativeFontFamily = IntPtr.Zero;
268 GC.SuppressFinalize(this);
271 public override bool Equals(object obj)
273 if (!(obj is FontFamily))
276 FontFamily o = (FontFamily) obj;
277 return (nativeFontFamily == o.nativeFontFamily);
280 public override int GetHashCode ()
282 return name.GetHashCode ();
286 public static FontFamily[] Families
290 return GetFamilies (null);
294 public static FontFamily[] GetFamilies (Graphics graphics)
296 InstalledFontCollection fntcol = new InstalledFontCollection ();
297 return fntcol.Families;
300 [MonoTODO ("We only support the default system language")]
301 public string GetName (int language)
306 public override string ToString ()
308 return "FontFamily :" + name;