2 // System.Drawing.Fonts.cs
4 // (C) 2004 Ximian, Inc. http://www.ximian.com
9 using System.Runtime.Serialization;
10 using System.Runtime.InteropServices;
11 using System.ComponentModel;
13 namespace System.Drawing {
17 [Editor ("System.Drawing.Design.FontEditor, " + Consts.AssemblySystem_Drawing_Design, typeof (System.Drawing.Design.UITypeEditor))]
18 [TypeConverter(typeof(FontConverter))]
19 public sealed class Font : MarshalByRefObject, ISerializable, ICloneable, IDisposable
21 IntPtr fontObject = IntPtr.Zero;
23 private Font (SerializationInfo info, StreamingContext context)
27 void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
36 public void Dispose ()
38 if (fontObject!=IntPtr.Zero){
39 GDIPlus.GdipDeleteFont(fontObject);
40 GC.SuppressFinalize(this);
44 internal void unitConversion(GraphicsUnit fromUnit, GraphicsUnit toUnit, float nSrc, out float nTrg)
50 case GraphicsUnit.Display:
53 case GraphicsUnit.Document:
56 case GraphicsUnit.Inch:
59 case GraphicsUnit.Millimeter:
62 case GraphicsUnit.Pixel:
63 case GraphicsUnit.World:
64 inchs = nSrc / Graphics.systemDpiX;
66 case GraphicsUnit.Point:
70 throw new ArgumentException("Invalid GraphicsUnit");
74 case GraphicsUnit.Display:
77 case GraphicsUnit.Document:
80 case GraphicsUnit.Inch:
83 case GraphicsUnit.Millimeter:
86 case GraphicsUnit.Pixel:
87 case GraphicsUnit.World:
88 nTrg = inchs * Graphics.systemDpiX;
90 case GraphicsUnit.Point:
94 throw new ArgumentException("Invalid GraphicsUnit");
98 internal void setProperties(FontFamily family, float emSize, FontStyle style, GraphicsUnit unit, byte charSet, bool isVertical)
101 _fontFamily = family;
105 _gdiCharSet = charSet;
106 _gdiVerticalFont = isVertical;
108 unitConversion(unit, GraphicsUnit.Point, emSize, out _sizeInPoints);
110 _bold = _italic = _strikeout = _underline = false;
112 if ((style & FontStyle.Bold) == FontStyle.Bold)
115 if ((style & FontStyle.Italic) == FontStyle.Italic)
118 if ((style & FontStyle.Strikeout) == FontStyle.Strikeout)
121 if ((style & FontStyle.Underline) == FontStyle.Underline)
125 public static Font FromHfont(IntPtr font)
128 Font result = new Font("Arial", (float)12.0, FontStyle.Regular);
132 public IntPtr ToHfont ()
135 System.OperatingSystem osInfo = System.Environment.OSVersion;
137 // Sanity. Should we throw an exception?
138 if (fontObject==IntPtr.Zero){
142 if ((int)osInfo.Platform==128) {
143 // If we're on Unix we use our private gdiplus API
144 GDIPlus.GdipGetHfont(fontObject, out Hfont);
146 // This needs testing, but I don't have a working win32 mono
148 LOGFONTA lf = new LOGFONTA();
150 GDIPlus.GdipGetLogFontA(fontObject, IntPtr.Zero, ref lf);
151 Hfont=GDIPlus.CreateFontIndirectA(ref lf);
156 public Font(Font original, FontStyle style)
158 setProperties(original.FontFamily, original.Size, style, original.Unit,
159 original.GdiCharSet, original.GdiVerticalFont);
161 GDIPlus.GdipCreateFont(_fontFamily.NativeObject, Size, Style, Unit, out fontObject);
164 public Font(FontFamily family, float emSize)
165 : this(family, emSize, FontStyle.Regular, GraphicsUnit.Point, (byte)0, false)
169 public Font(FontFamily family, float emSize, FontStyle style)
170 : this(family, emSize, style, GraphicsUnit.Point, (byte)0, false)
174 public Font(FontFamily family, float emSize, FontStyle style, GraphicsUnit unit)
175 : this(family, emSize, style, unit, (byte)0, false)
179 public Font(FontFamily family, float emSize, FontStyle style, GraphicsUnit unit, byte charSet)
180 : this(family, emSize, style, unit, charSet, false)
184 public Font(FontFamily family, float emSize, FontStyle style, GraphicsUnit unit, byte charSet, bool isVertical)
186 setProperties(family, emSize, style, unit, charSet, isVertical);
187 GDIPlus.GdipCreateFont(family.NativeObject, emSize, style, unit, out fontObject);
190 public Font(string familyName, float emSize)
191 : this(familyName, emSize, FontStyle.Regular, GraphicsUnit.Point, (byte)0, false)
195 public Font(string familyName, float emSize, FontStyle style)
196 : this(familyName, emSize, style, GraphicsUnit.Point, (byte)0, false)
200 public Font(string familyName, float emSize, FontStyle style, GraphicsUnit unit)
201 : this(familyName, emSize, style, unit, (byte)0, false)
205 public Font(string familyName, float emSize, FontStyle style, GraphicsUnit unit, byte charSet)
206 : this(familyName, emSize, style, unit, charSet, false)
210 public Font(string familyName, float emSize, FontStyle style, GraphicsUnit unit, byte charSet, bool isVertical)
212 FontFamily family = new FontFamily(familyName);
213 setProperties(family, emSize, style, unit, charSet, isVertical);
215 GDIPlus.GdipCreateFont(family.NativeObject, emSize, style, unit, out fontObject);
218 public object Clone()
220 return new Font(this, Style);
223 internal IntPtr NativeObject{
239 private FontFamily _fontFamily;
240 public FontFamily FontFamily {
246 private byte _gdiCharSet;
247 public byte GdiCharSet {
253 private bool _gdiVerticalFont;
254 public bool GdiVerticalFont {
256 return _gdiVerticalFont;
267 private bool _italic;
274 private string _name;
288 private float _sizeInPoints;
289 public float SizeInPoints {
291 return _sizeInPoints;
295 private bool _strikeout;
296 public bool Strikeout {
302 private FontStyle _style;
303 public FontStyle Style {
309 private bool _underline;
310 public bool Underline {
316 private GraphicsUnit _unit;
317 public GraphicsUnit Unit {
323 public override System.String ToString()
325 return ("[Font: Name="+ _name +", Size="+ _size+", Style="+ _style +", Units="+ _unit +", GdiCharSet="+ _gdiCharSet
326 +", GdiVerticalFont="+ _gdiVerticalFont + "]");