(DISTFILES): Comment out a few missing files.
[mono-project.git] / mcs / class / System.Drawing / System.Drawing / FontFamily.cs
blob86c0f4bd6743059450d1fe56f81a8dc149289c4d
1 //
2 // System.Drawing.FontFamily.cs
3 //
4 // Author:
5 // Dennis Hayes (dennish@Raytek.com)
6 // Alexandre Pigolkine (pigolkine@gmx.de)
7 //
8 // Copyright (C) 2002/2004 Ximian, Inc http://www.ximian.com
9 //
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:
19 //
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
22 //
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.
31 using System;
32 using System.Drawing.Text;
33 using System.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;
44 private string name;
45 internal IntPtr nativeFontFamily = IntPtr.Zero;
47 internal FontFamily(IntPtr fntfamily)
49 nativeFontFamily = fntfamily;
50 refreshName();
53 internal void refreshName()
55 if (nativeFontFamily != IntPtr.Zero) {
56 int language = 0;
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)
71 ~FontFamily()
73 Dispose ();
76 internal IntPtr NativeObject
78 get
80 return nativeFontFamily;
82 set
84 nativeFontFamily = value;
88 public FontFamily(GenericFontFamilies genericFamily)
90 Status status;
91 switch (genericFamily)
93 case GenericFontFamilies.Monospace:
94 status = GDIPlus.GdipGetGenericFontFamilyMonospace (out nativeFontFamily);
95 GDIPlus.CheckStatus (status);
96 refreshName ();
97 break;
98 case GenericFontFamilies.SansSerif:
99 status = GDIPlus.GdipGetGenericFontFamilySansSerif (out nativeFontFamily);
100 GDIPlus.CheckStatus (status);
101 refreshName ();
102 break;
103 case GenericFontFamilies.Serif:
104 status = GDIPlus.GdipGetGenericFontFamilySerif (out nativeFontFamily);
105 GDIPlus.CheckStatus (status);
106 refreshName ();
107 break;
108 default: // Undocumented default
109 status = GDIPlus.GdipGetGenericFontFamilyMonospace (out nativeFontFamily);
110 GDIPlus.CheckStatus (status);
111 refreshName ();
112 break;
116 public FontFamily(string familyName) : this (familyName, null)
120 public FontFamily (string familyName, FontCollection collection)
122 Status status;
123 if ( collection != null )
124 status = GDIPlus.GdipCreateFontFamilyFromName (familyName, collection.nativeFontCollection, out nativeFontFamily);
125 else
126 status = GDIPlus.GdipCreateFontFamilyFromName (familyName, IntPtr.Zero, out nativeFontFamily);
127 GDIPlus.CheckStatus (status);
129 refreshName ();
132 public string Name
134 get
136 return name;
140 public static FontFamily GenericMonospace
142 get
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
159 get
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
176 get
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 ();
186 return genericSerif;
190 //[MONO TODO]
191 //Need to check how to get the Flags attribute to read
192 //bitwise value of the enumeration
193 internal int GetStyleCheck(FontStyle style)
195 int styleCheck = 0 ;
196 switch ( style) {
197 case FontStyle.Bold:
198 styleCheck = 1;
199 break;
200 case FontStyle.Italic:
201 styleCheck = 2;
202 break;
203 case FontStyle.Regular:
204 styleCheck = 0;
205 break;
206 case FontStyle.Strikeout:
207 styleCheck = 8;
208 break;
209 case FontStyle.Underline:
210 styleCheck = 4;
211 break;
213 return styleCheck;
216 public int GetCellAscent (FontStyle style)
218 Status status;
219 uint outProperty;
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)
229 Status status;
230 uint outProperty;
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)
240 Status status;
241 uint outProperty;
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)
251 Status status;
252 uint outProperty;
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)
262 Status status;
263 bool outProperty;
264 int styleCheck = GetStyleCheck (style);
265 status = GDIPlus.GdipIsStyleAvailable (nativeFontFamily, styleCheck, out outProperty);
266 GDIPlus.CheckStatus (status);
268 return outProperty;
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))
281 return false;
283 return (this == (FontFamily) obj);
286 public override int GetHashCode ()
288 return name.GetHashCode ();
292 public FontFamily[] Families
294 get {
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)
309 return name;
312 public override string ToString ()
314 return "FontFamily :" + name;