2 using System.Runtime.Serialization;
3 using System.Runtime.InteropServices;
4 using System.ComponentModel;
6 using TextAttribute = java.awt.font.TextAttribute;
8 namespace System.Drawing {
10 public sealed class Font: MarshalByRefObject, ISerializable, ICloneable, IDisposable {
14 const byte DEFAULT_CHARSET = 1;
16 private readonly GraphicsUnit _gUnit = GraphicsUnit.Point;
17 private readonly FontFamily _fontFamily;
18 private readonly awt.Font _jFont;
19 private readonly byte _charset;
22 private string systemFontName;
27 internal awt.Font NativeObject {
35 void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) {
36 info.AddValue("Name", Name);
37 info.AddValue("Size", Size);
38 info.AddValue("Style", Style, typeof(FontStyle));
39 info.AddValue("Unit", Unit, typeof(GraphicsUnit));
46 private Font (SerializationInfo info, StreamingContext context)
48 info.GetString("Name"),
49 info.GetSingle("Size"),
50 (FontStyle)info.GetValue("Style", typeof(FontStyle)),
51 (GraphicsUnit)info.GetValue("Unit", typeof(GraphicsUnit)) ) {
54 public Font(Font original, FontStyle style) {
55 _jFont = original.NativeObject.deriveFont( DeriveStyle(original.NativeObject.getAttributes(), style, true) );
56 _gUnit = original._gUnit;
57 _fontFamily = original._fontFamily;
58 _charset = original._charset;
61 public Font(FontFamily family, float emSize)
62 : this(family, emSize, FontStyle.Regular, GraphicsUnit.Point, DEFAULT_CHARSET, false) {
65 public Font(FontFamily family, float emSize, FontStyle style)
66 : this(family, emSize, style, GraphicsUnit.Point, DEFAULT_CHARSET, false) {
68 public Font(FontFamily family, float emSize, GraphicsUnit unit)
69 : this(family, emSize, FontStyle.Regular, unit, DEFAULT_CHARSET, false) {
72 public Font(FontFamily family, float emSize, FontStyle style, GraphicsUnit unit)
73 : this(family, emSize, style, unit, DEFAULT_CHARSET, false) {
76 public Font(FontFamily family, float emSize, FontStyle style, GraphicsUnit unit, byte charSet)
77 : this(family, emSize, style, unit, charSet, false) {
80 public Font(FontFamily family, float emSize, FontStyle style, GraphicsUnit unit, byte charSet, bool isVertical) {
82 throw new ArgumentNullException("family");
88 java.util.Hashtable attribs = new java.util.Hashtable();
89 attribs.put(TextAttribute.FAMILY, family.Name/*TODO: family doungrade possibility*/);
91 attribs.put(TextAttribute.POSTURE, TextAttribute.POSTURE_REGULAR);
93 float newSize = emSize * Graphics.UnitConversion[ (int)_gUnit ];
94 attribs.put(TextAttribute.SIZE, new java.lang.Float(newSize));
96 DeriveStyle(attribs, style, false);
98 _jFont = family.FamilyFont.deriveFont(attribs);
101 public Font(string familyName, float emSize)
102 : this(familyName, emSize, FontStyle.Regular, GraphicsUnit.Point, (byte)0, false) {
105 public Font(string familyName, float emSize, FontStyle style)
106 : this(familyName, emSize, style, GraphicsUnit.Point, (byte)0, false) {
109 public Font(string familyName, float emSize, GraphicsUnit unit)
110 : this(familyName, emSize, FontStyle.Regular, unit, (byte)0, false) {
113 public Font(string familyName, float emSize, FontStyle style, GraphicsUnit unit)
114 : this(familyName, emSize, style, unit, (byte)0, false) {
117 public Font(string familyName, float emSize, FontStyle style, GraphicsUnit unit, byte charSet)
118 : this(familyName, emSize, style, unit, charSet, false) {
121 public Font(string familyName, float emSize, FontStyle style, GraphicsUnit unit, byte charSet, bool isVertical)
122 : this (GetFontFamily (familyName), emSize, style, unit, charSet, isVertical) {
125 static FontFamily GetFontFamily (string familyName) {
127 if (familyName == null)
128 throw new ArgumentNullException ("familyName");
130 // NOTE: If family name is null, empty or invalid,
131 // MS creates Microsoft Sans Serif font.
133 return new FontFamily (familyName);
136 return FontFamily.GenericSansSerif;
142 #region IDisposable members
144 public void Dispose() {
151 public object Clone() {
152 return (Font)MemberwiseClone();
159 public IntPtr ToHfont ()
161 throw new NotImplementedException();
165 #region public properties
169 return _jFont.isBold();
173 public FontFamily FontFamily {
179 public byte GdiCharSet {
185 public bool GdiVerticalFont {
187 return Name.StartsWith("@");
193 return FontFamily.Container.getFontMetrics(NativeObject).getHeight();
199 return _jFont.isItalic();
205 return _jFont.getName();
211 return SizeInPoints / Graphics.UnitConversion[ (int)_gUnit ];
215 public float SizeInPoints {
217 return _jFont.getSize2D();
221 public bool Strikeout {
224 if((java.lang.Boolean)_jFont.getAttributes().get(TextAttribute.STRIKETHROUGH)
225 == TextAttribute.STRIKETHROUGH_ON )
234 public FontStyle Style {
236 FontStyle style = FontStyle.Regular;
238 style |= FontStyle.Bold;
240 style |= FontStyle.Italic;
242 style |= FontStyle.Underline;
244 style |= FontStyle.Strikeout;
250 public bool Underline {
253 if((java.lang.Integer)_jFont.getAttributes().get(TextAttribute.UNDERLINE)
254 == TextAttribute.UNDERLINE_ON )
263 [TypeConverter(typeof(FontConverter.FontUnitConverter))]
264 public GraphicsUnit Unit {
272 public bool IsSystemFont {
274 if (systemFontName == null)
277 return StringComparer.InvariantCulture.Compare (systemFontName, string.Empty) != 0;
282 public string SystemFontName {
284 return systemFontName;
288 internal string SysFontName {
290 systemFontName = value;
297 public override System.String ToString() {
298 return ("[Font: Name="+ Name +", Size="+ Size +", Style="+ Style +", Units="+ Unit +"]");
301 static internal java.util.Map DeriveStyle(java.util.Map attribs, FontStyle style, bool createNew) {
302 java.util.Map newAttribs;
304 newAttribs = new java.util.Hashtable( attribs.size() );
305 object [] keys = attribs.keySet().toArray();
306 for (int i=0; i < keys.Length; i++)
307 newAttribs.put( keys[i], attribs.get( keys[i] ) );
310 newAttribs = attribs;
313 if((style & FontStyle.Bold) == FontStyle.Bold)
314 newAttribs.put(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD);
316 newAttribs.remove(TextAttribute.WEIGHT);
319 if((style & FontStyle.Italic) == FontStyle.Italic)
320 newAttribs.put(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE);
322 newAttribs.put(TextAttribute.POSTURE, TextAttribute.POSTURE_REGULAR);
325 if((style & FontStyle.Underline) == FontStyle.Underline)
326 newAttribs.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON);
328 newAttribs.remove(TextAttribute.UNDERLINE);
331 if((style & FontStyle.Strikeout) == FontStyle.Strikeout)
332 newAttribs.put(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON);
334 newAttribs.remove(TextAttribute.STRIKETHROUGH);