2 // System.Drawing.FontFamily.cs
4 // (C) 2005 Mainsoft Corporation (http://www.mainsoft.com)
5 // Author: Konstantin Triger (kostat@mainsoft.com)
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 using System
.Drawing
.Text
;
32 using System
.Runtime
.InteropServices
;
33 using System
.Globalization
;
35 using geom
= java
.awt
.geom
;
36 using font
= java
.awt
.font
;
37 using TextAttribute
= java
.awt
.font
.TextAttribute
;
39 namespace System
.Drawing
{
41 public sealed class FontFamily
: MarshalByRefObject
, IDisposable
{
43 static readonly FontFamily _genericMonospace
;
44 static readonly FontFamily _genericSansSerif
;
45 static readonly FontFamily _genericSerif
;
46 static readonly FontCollection _installedFonts
;
47 internal static readonly awt
.Container Container
;
50 Container
= new awt
.Container();
51 _installedFonts
= new InstalledFontCollection();
52 _genericMonospace
= new FontFamily(GenericFontFamilies
.Monospace
);
53 _genericSansSerif
= new FontFamily(GenericFontFamilies
.SansSerif
);
54 _genericSerif
= new FontFamily(GenericFontFamilies
.Serif
);
57 private readonly string _name
;
59 private awt
.FontMetrics _fontMetrics
= null;
60 private FontStyle _lastStyle
= FontStyle
.Regular
;
61 private readonly awt
.Font _font
;
63 // this is unavailable through Java API, usually 2048 for TT fonts
64 const int UnitsPerEm
= 2048;
65 // the margin for text drawing
66 const int DrawMargin
= 571;
70 // dummy ctors to work around convertor problems
71 internal FontFamily() {}
72 internal FontFamily(IntPtr family
) {}
74 static string ToGenericFontName(GenericFontFamilies genericFamily
) {
75 switch(genericFamily
) {
76 case GenericFontFamilies
.SansSerif
:
78 case GenericFontFamilies
.Serif
:
85 public FontFamily(string familyName
) : this(familyName
, null) {
88 public FontFamily(string name
, FontCollection fontCollection
) {
90 throw new ArgumentNullException("name");
92 if (fontCollection
== null)
93 fontCollection
= _installedFonts
;
95 if (fontCollection
.Contains(name
))
98 _name
= ToGenericFontName(GenericFontFamilies
.SansSerif
);
99 fontCollection
= _installedFonts
;
102 _font
= fontCollection
.GetInitialFont( _name
);
105 public FontFamily(GenericFontFamilies genericFamily
) : this(ToGenericFontName(genericFamily
)) {
116 internal int GetDrawMargin(FontStyle style
) {
120 awt
.FontMetrics
GetMetrics(FontStyle style
) {
121 if ((_lastStyle
!= style
) || (_fontMetrics
== null)) {
122 java
.util
.Map attrib
= Font
.DeriveStyle( FamilyFont
.getAttributes(), style
, true);
123 attrib
.put(TextAttribute
.SIZE
, new java
.lang
.Float((float)(UnitsPerEm
<<1)));
124 _fontMetrics
= Container
.getFontMetrics( FamilyFont
.deriveFont( attrib
) );
129 public int GetCellAscent(FontStyle style
) {
130 return GetMetrics(style
).getMaxAscent()>>1;
133 public int GetCellDescent(FontStyle style
) {
134 return GetMetrics(style
).getMaxDecent()>>1;
137 public int GetEmHeight(FontStyle style
) {
141 public int GetLineSpacing(FontStyle style
) {
142 return GetMetrics(style
).getHeight()>>1;
145 public string GetName(int language
) {
147 CultureInfo culture
= new CultureInfo(language
, false);
148 java
.util
.Locale locale
= vmw
.@internal.EnvironmentUtils
.getLocaleFromCultureInfo( culture
);
150 return FamilyFont
.getFamily( locale
);
157 public bool IsStyleAvailable(FontStyle style
) {
158 //unable to get this infromation from java
162 #region static members
164 public static FontFamily
[] Families
{
166 return _installedFonts
.Families
;
170 public static FontFamily GenericMonospace
{
172 return (FontFamily
)_genericMonospace
.MemberwiseClone();
176 public static FontFamily GenericSansSerif
{
178 return (FontFamily
)_genericSansSerif
.MemberwiseClone();
182 public static FontFamily GenericSerif
{
184 return (FontFamily
)_genericSerif
.MemberwiseClone();
188 public static FontFamily
[] GetFamilies(Graphics graphics
) {
189 if (graphics
== null) {
190 throw new ArgumentNullException("graphics");
192 return _installedFonts
.Families
;
197 #region Object members
199 public override bool Equals(object obj
) {
203 if (!(obj
is FontFamily
))
206 return string.Compare(Name
, ((FontFamily
)obj
).Name
, true) == 0;
209 public override int GetHashCode() {
210 return Name
.ToLower().GetHashCode();
213 public override string ToString() {
214 return string.Format("[{0}: Name={1}]", GetType().Name
, Name
);
219 #region IDisposable Members
221 public void Dispose() {
226 internal awt
.Font FamilyFont
{