git-svn-id: https://pdfsharp.svn.codeplex.com/svn@39620 56d0cb2f-6006-4f69-a5a2-94740...
[pdfsharp:pdfsharp.git] / PDFsharp / code / PdfSharp / PdfSharp.Drawing / XFont.cs
1 #region PDFsharp - A .NET library for processing PDF\r
2 //\r
3 // Authors:\r
4 //   Stefan Lange (mailto:Stefan.Lange@pdfsharp.com)\r
5 //\r
6 // Copyright (c) 2005-2009 empira Software GmbH, Cologne (Germany)\r
7 //\r
8 // http://www.pdfsharp.com\r
9 // http://sourceforge.net/projects/pdfsharp\r
10 //\r
11 // Permission is hereby granted, free of charge, to any person obtaining a\r
12 // copy of this software and associated documentation files (the "Software"),\r
13 // to deal in the Software without restriction, including without limitation\r
14 // the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
15 // and/or sell copies of the Software, and to permit persons to whom the\r
16 // Software is furnished to do so, subject to the following conditions:\r
17 //\r
18 // The above copyright notice and this permission notice shall be included\r
19 // in all copies or substantial portions of the Software.\r
20 //\r
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
22 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
23 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\r
24 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
25 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r
26 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER \r
27 // DEALINGS IN THE SOFTWARE.\r
28 #endregion\r
29 \r
30 using System;\r
31 using System.Collections.Generic;\r
32 using System.Diagnostics;\r
33 using System.Runtime.InteropServices;\r
34 using System.ComponentModel;\r
35 using System.IO;\r
36 #if GDI\r
37 using System.Drawing;\r
38 using System.Drawing.Drawing2D;\r
39 #endif\r
40 #if WPF\r
41 using System.Windows;\r
42 using System.Windows.Media;\r
43 #endif\r
44 using PdfSharp.Internal;\r
45 using PdfSharp.Fonts;\r
46 using PdfSharp.Fonts.OpenType;\r
47 using PdfSharp.Pdf;\r
48 using PdfSharp.Pdf.Advanced;\r
49 \r
50 // WPFHACK\r
51 #pragma warning disable 162\r
52 \r
53 namespace PdfSharp.Drawing\r
54 {\r
55   /// <summary>\r
56   /// Defines an object used to draw text.\r
57   /// </summary>\r
58   [DebuggerDisplay("'{Name}', {Size}")]\r
59   public class XFont\r
60   {\r
61     /// <summary>\r
62     /// Initializes a new instance of the <see cref="XFont"/> class.\r
63     /// </summary>\r
64     /// <param name="familyName">Name of the font family.</param>\r
65     /// <param name="emSize">The em size.</param>\r
66     public XFont(string familyName, double emSize)\r
67     {\r
68       this.familyName = familyName;\r
69       this.emSize = emSize;\r
70       this.style = XFontStyle.Regular;\r
71       this.pdfOptions = new XPdfFontOptions();\r
72       Initialize();\r
73     }\r
74 \r
75     /// <summary>\r
76     /// Initializes a new instance of the <see cref="XFont"/> class.\r
77     /// </summary>\r
78     /// <param name="familyName">Name of the font family.</param>\r
79     /// <param name="emSize">The em size.</param>\r
80     /// <param name="style">The font style.</param>\r
81     public XFont(string familyName, double emSize, XFontStyle style)\r
82     {\r
83       this.familyName = familyName;\r
84       this.emSize = emSize;\r
85       this.style = style;\r
86       this.pdfOptions = new XPdfFontOptions();\r
87       Initialize();\r
88     }\r
89 \r
90     /// <summary>\r
91     /// Initializes a new instance of the <see cref="XFont"/> class.\r
92     /// </summary>\r
93     /// <param name="familyName">Name of the font family.</param>\r
94     /// <param name="emSize">The em size.</param>\r
95     /// <param name="style">The font style.</param>\r
96     /// <param name="pdfOptions">Additional PDF options.</param>\r
97     public XFont(string familyName, double emSize, XFontStyle style, XPdfFontOptions pdfOptions)\r
98     {\r
99       this.familyName = familyName;\r
100       this.emSize = emSize;\r
101       this.style = style;\r
102       this.pdfOptions = pdfOptions;\r
103       Initialize();\r
104     }\r
105 \r
106 #if GDI // #PFC\r
107     /// <summary>\r
108     /// Initializes a new instance of the <see cref="XFont"/> class.\r
109     /// </summary>\r
110     /// <param name="family">The font family.</param>\r
111     /// <param name="emSize">The em size.</param>\r
112     /// <param name="style">The font style.</param>\r
113     /// <param name="pdfOptions">Additional PDF options.</param>\r
114     public XFont(System.Drawing.FontFamily family, double emSize, XFontStyle style, XPdfFontOptions pdfOptions /*,\r
115       XPrivateFontCollection privateFontCollection*/\r
116                                                     )\r
117     {\r
118       this.familyName = null;\r
119       this.gdifamily = family;\r
120       this.emSize = emSize;\r
121       this.style = style;\r
122       this.pdfOptions = pdfOptions;\r
123       Initialize();\r
124     }\r
125 #endif\r
126 \r
127 #if GDI\r
128 #if UseGdiObjects\r
129     /// <summary>\r
130     /// Initializes a new instance of the <see cref="XFont"/> class from a System.Drawing.Font.\r
131     /// </summary>\r
132     /// <param name="font">A System.Drawing.Font.</param>\r
133     /// <param name="pdfOptions">Additional PDF options.</param>\r
134     public XFont(Font font, XPdfFontOptions pdfOptions)\r
135     {\r
136       if (font.Unit != GraphicsUnit.World)\r
137         throw new ArgumentException("Font must use GraphicsUnit.World.");\r
138       this.font = font;\r
139       this.familyName = font.Name;\r
140       this.emSize = font.Size;\r
141       this.style = FontStyleFrom(font);\r
142       this.pdfOptions = pdfOptions;\r
143       Initialize();\r
144     }\r
145 #endif\r
146 #endif\r
147 \r
148     /// <summary>\r
149     /// Connects the specifications of a font from XFont to a real glyph type face.\r
150     /// </summary>\r
151     void Initialize()\r
152     {\r
153       XFontMetrics fm;\r
154 \r
155 #if DEBUG___\r
156       FontData[] fontDataArray = FontDataStock.Global.GetFontDataList();\r
157       if (fontDataArray.Length > 0)\r
158       {\r
159         ////        GetType();\r
160         ////#if GDI\r
161         ////        var x = XPrivateFontCollection.global.GlobalPrivateFontCollection;\r
162         ////        families = x.Families;\r
163 \r
164         ////        bool fff = families[0].IsStyleAvailable(System.Drawing.FontStyle.Regular);\r
165         ////        fff.GetType();\r
166         ////        this.font = new Font(families[0].Name, 12, System.Drawing.FontStyle.Regular, GraphicsUnit.Pixel);\r
167 \r
168         ////        this.font = new Font("Oblivious", 12, System.Drawing.FontStyle.Regular, GraphicsUnit.Pixel);\r
169 \r
170         ////        this.font = new Font(families[0], 12, System.Drawing.FontStyle.Regular, GraphicsUnit.Pixel);\r
171 \r
172         ////        System.Drawing.FontFamily f = new System.Drawing.FontFamily(families[0].Name);\r
173         ////        f.GetType();\r
174         ////#endif\r
175       }\r
176 #endif\r
177 #if GDI\r
178       if (this.font == null)\r
179       {\r
180         if (this.gdifamily != null)\r
181         {\r
182           this.font = new Font(this.gdifamily, (float)this.emSize, (System.Drawing.FontStyle)this.style, GraphicsUnit.World);\r
183           this.familyName = this.gdifamily.Name; // Do we need this???\r
184         }\r
185         else\r
186         {\r
187           // First check private fonts\r
188           this.font = XPrivateFontCollection.TryFindPrivateFont(this.familyName, this.emSize, (System.Drawing.FontStyle)this.style) ??\r
189             new Font(this.familyName, (float)this.emSize, (System.Drawing.FontStyle)this.style, GraphicsUnit.World);\r
190         }\r
191 #if DEBUG\r
192         // new Font returns MSSansSerif if the requested font was not found ...\r
193         //Debug.Assert(this.familyName == this.font.FontFamily.Name);\r
194 #endif\r
195       }\r
196 \r
197       fm = Metrics;\r
198       System.Drawing.FontFamily fontFamily = this.font.FontFamily;\r
199       this.unitsPerEm = fm.UnitsPerEm;\r
200 \r
201       System.Drawing.FontFamily fontFamily2 = this.font.FontFamily;\r
202       this.cellSpace = fontFamily2.GetLineSpacing(font.Style);\r
203       //Debug.Assert(this.cellSpace == fm.Ascent + Math.Abs(fm.Descent) + fm.Leading, "Value differs from information retrieved from font image.");\r
204 \r
205       this.cellAscent = fontFamily.GetCellAscent(font.Style);\r
206 #pragma warning disable 1030\r
207 #warning delTHHO\r
208       //!!!delTHHO 14.08.2008 Debug.Assert(this.cellAscent == fm.Ascent, "Value differs from information retrieved from font image.");\r
209       //Debug.Assert(this.cellAscent == fm.Ascent, "Value differs from information retrieved from font image.");\r
210 \r
211       this.cellDescent = fontFamily.GetCellDescent(font.Style);\r
212 #if DEBUG\r
213       int desc = Math.Abs(fm.Descent);\r
214       if (this.cellDescent != desc)\r
215         Debug.Assert(false, "Value differs from information retrieved from font image.");\r
216 #endif\r
217 #endif\r
218 #if WPF\r
219 #if !SILVERLIGHT\r
220       if (this.family == null)\r
221       {\r
222         Debug.Assert(this.typeface == null);\r
223         this.typeface = XPrivateFontCollection.TryFindTypeface(Name, this.style, out this.family);\r
224 #if true\r
225         if (this.typeface != null)\r
226         {\r
227           GlyphTypeface glyphTypeface;\r
228 \r
229           ICollection<Typeface> list = this.family.GetTypefaces();\r
230           foreach (Typeface tf in list)\r
231           {\r
232             if (!tf.TryGetGlyphTypeface(out glyphTypeface))\r
233               Debugger.Break();\r
234           }\r
235 \r
236           if (!this.typeface.TryGetGlyphTypeface(out glyphTypeface))\r
237             throw new InvalidOperationException(PSSR.CannotGetGlyphTypeface(Name));\r
238         }\r
239 #endif\r
240       }\r
241 \r
242       if (this.family == null)\r
243         this.family = new System.Windows.Media.FontFamily(Name);\r
244 \r
245       if (typeface == null)\r
246         this.typeface = FontHelper.CreateTypeface(this.family, style);\r
247 \r
248       fm = Metrics;\r
249       Debug.Assert(this.unitsPerEm == 0 || this.unitsPerEm == fm.UnitsPerEm);\r
250       this.unitsPerEm = fm.UnitsPerEm;\r
251 \r
252       //Debug.Assert(this.cellSpace == 0 || this.cellSpace == fm.Ascent + Math.Abs(fm.Descent) + fm.Leading);\r
253       this.cellSpace = fm.Ascent + Math.Abs(fm.Descent) + fm.Leading;\r
254 \r
255       Debug.Assert(this.cellAscent == 0 || this.cellAscent == fm.Ascent);\r
256       this.cellAscent = fm.Ascent;\r
257 \r
258       Debug.Assert(this.cellDescent == 0 || this.cellDescent == Math.Abs(fm.Descent));\r
259       this.cellDescent = Math.Abs(fm.Descent);\r
260 #else\r
261 \r
262 #endif\r
263 #endif\r
264     }\r
265 \r
266 #if GDI\r
267     // Fonts can be created from familyName or from family!\r
268     //string familyName;\r
269     /// <summary>\r
270     /// Gets the GDI family.\r
271     /// </summary>\r
272     /// <value>The GDI family.</value>\r
273     public System.Drawing.FontFamily GdiFamily\r
274     {\r
275       get { return this.gdifamily; }\r
276       //set { this.gdifamily = value; }\r
277     }\r
278     System.Drawing.FontFamily gdifamily;\r
279 #endif\r
280 \r
281 #if GDI\r
282     internal static XFontStyle FontStyleFrom(Font font)\r
283     {\r
284       return\r
285         (font.Bold ? XFontStyle.Bold : 0) |\r
286         (font.Italic ? XFontStyle.Italic : 0) |\r
287         (font.Strikeout ? XFontStyle.Strikeout : 0) |\r
288         (font.Underline ? XFontStyle.Underline : 0);\r
289     }\r
290 #endif\r
291 \r
292     //// Methods\r
293     //public Font(Font prototype, FontStyle newStyle);\r
294     //public Font(FontFamily family, float emSize);\r
295     //public Font(string familyName, float emSize);\r
296     //public Font(FontFamily family, float emSize, FontStyle style);\r
297     //public Font(FontFamily family, float emSize, GraphicsUnit unit);\r
298     //public Font(string familyName, float emSize, FontStyle style);\r
299     //public Font(string familyName, float emSize, GraphicsUnit unit);\r
300     //public Font(FontFamily family, float emSize, FontStyle style, GraphicsUnit unit);\r
301     //public Font(string familyName, float emSize, FontStyle style, GraphicsUnit unit);\r
302     ////public Font(FontFamily family, float emSize, FontStyle style, GraphicsUnit unit, byte gdiCharSet);\r
303     ////public Font(string familyName, float emSize, FontStyle style, GraphicsUnit unit, byte gdiCharSet);\r
304     ////public Font(FontFamily family, float emSize, FontStyle style, GraphicsUnit unit, byte gdiCharSet, bool gdiVerticalFont);\r
305     ////public Font(string familyName, float emSize, FontStyle style, GraphicsUnit unit, byte gdiCharSet, bool gdiVerticalFont);\r
306 \r
307 \r
308     //public object Clone();\r
309     //private static FontFamily CreateFontFamilyWithFallback(string familyName);\r
310 \r
311     //private void Dispose(bool disposing);\r
312     //public override bool Equals(object obj);\r
313     //protected override void Finalize();\r
314     //public static Font FromHdc(IntPtr hdc);\r
315     //public static Font FromHfont(IntPtr hfont);\r
316     //public static Font FromLogFont(object lf);\r
317     //public static Font FromLogFont(object lf, IntPtr hdc);\r
318     //public override int GetHashCode();\r
319 \r
320     /// <summary>\r
321     /// Returns the line spacing, in pixels, of this font. The line spacing is the vertical distance\r
322     /// between the base lines of two consecutive lines of text. Thus, the line spacing includes the\r
323     /// blank space between lines along with the height of the character itself.\r
324     /// </summary>\r
325     public double GetHeight()\r
326     {\r
327 #if GDI\r
328       RealizeGdiFont();\r
329       double gdiValue = this.font.GetHeight();\r
330 #if DEBUG\r
331       float myValue = (float)(this.cellSpace * this.emSize / this.unitsPerEm);\r
332       //Debug.Assert(DoubleUtil.AreClose((float)value, myValue), "Check formula.");\r
333       Debug.Assert(DoubleUtil.AreRoughlyEqual(gdiValue, myValue, 5), "Check formula.");\r
334 \r
335       //// 2355*(0.3/2048)*96 = 33.11719 \r
336       //double myValue = this.cellSpace * (this.size / 72 / this.unitsPerEm) * 96;\r
337       //double myValue2 = (float)(this.cellSpace * (this.size / /*72 /*/ this.unitsPerEm) /* 72*/);\r
338       //Int64 i1 = (Int64)(value * 1000 + .5);\r
339       //Int64 i2 = (Int64)(myValue2 * 1000 + .5);\r
340       //Debug.Assert(i1 == i2, "??");\r
341 #endif\r
342       return gdiValue;\r
343 #endif\r
344 #if WPF\r
345       double value = this.cellSpace * this.emSize / this.unitsPerEm;\r
346       return value;\r
347 #endif\r
348     }\r
349 \r
350     /// <summary>\r
351     /// Returns the line spacing, in the current unit of a specified Graphics object, of this font.\r
352     /// The line spacing is the vertical distance between the base lines of two consecutive lines of\r
353     /// text. Thus, the line spacing includes the blank space between lines along with the height of\r
354     /// </summary>\r
355     public double GetHeight(XGraphics graphics)\r
356     {\r
357 #if GDI && !WPF\r
358       RealizeGdiFont();\r
359       double value = this.font.GetHeight(graphics.gfx);\r
360       Debug.Assert(value == this.font.GetHeight(graphics.gfx.DpiY));\r
361       double value2 = this.cellSpace * this.emSize / this.unitsPerEm;\r
362       Debug.Assert(value - value2 < 1e-3, "??");\r
363       return this.font.GetHeight(graphics.gfx);\r
364 #endif\r
365 #if WPF && !GDI\r
366       double value = this.cellSpace * this.emSize / this.unitsPerEm;\r
367       return value;\r
368 #endif\r
369 #if GDI && WPF\r
370       if (graphics.targetContext == XGraphicTargetContext.GDI)\r
371       {\r
372         RealizeGdiFont();\r
373 #if DEBUG\r
374         double value = this.font.GetHeight(graphics.gfx);\r
375 \r
376         // 2355*(0.3/2048)*96 = 33.11719 \r
377         double myValue = this.cellSpace * (this.emSize / (96 * this.unitsPerEm)) * 96;\r
378         myValue = this.cellSpace * this.emSize / this.unitsPerEm;\r
379         //Debug.Assert(value == myValue, "??");\r
380         //Debug.Assert(value - myValue < 1e-3, "??");\r
381 #endif\r
382         return this.font.GetHeight(graphics.gfx);\r
383       }\r
384       else if (graphics.targetContext == XGraphicTargetContext.WPF)\r
385       {\r
386         double value = this.cellSpace * this.emSize / this.unitsPerEm;\r
387         return value;\r
388       }\r
389       Debug.Assert(false);\r
390       return 0;\r
391 #endif\r
392     }\r
393 \r
394     //public float GetHeight(float dpi);\r
395     //public IntPtr ToHfont();\r
396     //public void ToLogFont(object logFont);\r
397     //public void ToLogFont(object logFont, Graphics graphics);\r
398     //public override string ToString();\r
399 \r
400     // Properties\r
401 \r
402     /// <summary>\r
403     /// Gets the XFontFamily object associated with this XFont object.\r
404     /// </summary>\r
405     [Browsable(false)]\r
406     public XFontFamily FontFamily\r
407     {\r
408       get\r
409       {\r
410         if (this.fontFamily == null)\r
411         {\r
412 #if GDI\r
413           RealizeGdiFont();\r
414           this.fontFamily = new XFontFamily(this.font.FontFamily);\r
415 #endif\r
416 #if WPF\r
417 #if !SILVERLIGHT\r
418           Debug.Assert(this.family != null);\r
419           this.fontFamily = new XFontFamily(this.family);\r
420 #else\r
421           // AGHACK\r
422 #endif\r
423 #endif\r
424         }\r
425         return this.fontFamily;\r
426       }\r
427     }\r
428     XFontFamily fontFamily;\r
429 \r
430     /// <summary>\r
431     /// Gets the face name of this Font object.\r
432     /// </summary>\r
433     public string Name\r
434     {\r
435       get\r
436       {\r
437 #if GDI\r
438         RealizeGdiFont();\r
439         return this.font.Name;\r
440 #endif\r
441 #if WPF || SILVERLIGHT\r
442         //RealizeGdiFont();\r
443         return this.familyName;\r
444 #endif\r
445       }\r
446     }\r
447 \r
448     /// <summary>\r
449     /// Gets the em-size of this Font object measured in the unit of this Font object.\r
450     /// </summary>\r
451     public double Size\r
452     {\r
453       get { return this.emSize; }\r
454     }\r
455     double emSize;\r
456 \r
457 \r
458     /// <summary>\r
459     /// Gets the line spacing of this font.\r
460     /// </summary>\r
461     [Browsable(false)]\r
462     public int Height\r
463     {\r
464       // Implementation from System.Drawing.Font.cs\r
465       get { return (int)Math.Ceiling(GetHeight()); }\r
466       // DELETE\r
467       //      {\r
468       //#if GDI && !WPF\r
469       //        RealizeGdiFont();\r
470       //        return this.font.Height;\r
471       //#endif\r
472       //#if WPF && !GDI\r
473       //        return (int)this.size;\r
474       //#endif\r
475       //#if GDI && WPF\r
476       //        // netmassdownloader -d "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5" -output G:\dotnet-massdownload\SourceCode -v\r
477       //        RealizeGdiFont();\r
478       //        int gdiHeight = this.font.Height;\r
479       //        double wpfHeight1 = this.cellSpace * this.size / this.unitsPerEm;\r
480       //        //int wpfHeight = (int)wpfHeight1+Math.Round(wpfHeight1, \r
481       //        int wpfHeight = Convert.ToInt32(wpfHeight1 + 0.5);\r
482       //        Debug.Assert(gdiHeight == wpfHeight);\r
483       //        return gdiHeight;\r
484       //#endif\r
485       //      }\r
486     }\r
487 \r
488     /// <summary>\r
489     /// Gets style information for this Font object.\r
490     /// </summary>\r
491     [Browsable(false)]\r
492     public XFontStyle Style\r
493     {\r
494       get { return this.style; }\r
495     }\r
496     XFontStyle style;\r
497 \r
498     /// <summary>\r
499     /// Indicates whether this XFont object is bold.\r
500     /// </summary>\r
501     public bool Bold\r
502     {\r
503       get { return (this.style & XFontStyle.Bold) == XFontStyle.Bold; }\r
504     }\r
505 \r
506     /// <summary>\r
507     /// Indicates whether this XFont object is italic.\r
508     /// </summary>\r
509     public bool Italic\r
510     {\r
511       get { return (this.style & XFontStyle.Italic) == XFontStyle.Italic; }\r
512     }\r
513 \r
514     /// <summary>\r
515     /// Indicates whether this XFont object is stroke out.\r
516     /// </summary>\r
517     public bool Strikeout\r
518     {\r
519       get { return (this.style & XFontStyle.Strikeout) == XFontStyle.Strikeout; }\r
520     }\r
521 \r
522     /// <summary>\r
523     /// Indicates whether this XFont object is underlined.\r
524     /// </summary>\r
525     public bool Underline\r
526     {\r
527       get { return (this.style & XFontStyle.Underline) == XFontStyle.Underline; }\r
528     }\r
529 \r
530     /// <summary>\r
531     /// Temporary HACK for XPS to PDF converter.\r
532     /// </summary>\r
533     internal bool IsVertical\r
534     {\r
535       get { return this.isVertical; }\r
536       set { this.isVertical = value; }\r
537     }\r
538     bool isVertical;\r
539 \r
540 \r
541     /// <summary>\r
542     /// Gets the PDF options of the font.\r
543     /// </summary>\r
544     public XPdfFontOptions PdfOptions\r
545     {\r
546       get\r
547       {\r
548         if (this.pdfOptions == null)\r
549           this.pdfOptions = new XPdfFontOptions();\r
550         return this.pdfOptions;\r
551       }\r
552     }\r
553     XPdfFontOptions pdfOptions;\r
554 \r
555     /// <summary>\r
556     /// Indicates whether this XFont is encoded as Unicode.\r
557     /// </summary>\r
558     internal bool Unicode\r
559     {\r
560       get { return this.pdfOptions != null ? this.pdfOptions.FontEncoding == PdfFontEncoding.Unicode : false; }\r
561     }\r
562 \r
563     /// <summary>\r
564     /// Gets the metrics.\r
565     /// </summary>\r
566     /// <value>The metrics.</value>\r
567     public XFontMetrics Metrics\r
568     {\r
569       get\r
570       {\r
571         if (this.fontMetrics == null)\r
572         {\r
573           FontDescriptor descriptor = FontDescriptorStock.Global.CreateDescriptor(this);\r
574           this.fontMetrics = descriptor.FontMetrics;\r
575         }\r
576         return this.fontMetrics;\r
577       }\r
578     }\r
579     XFontMetrics fontMetrics;\r
580 \r
581 #if GDI\r
582 #if UseGdiObjects\r
583     /// <summary>\r
584     /// Implicit conversion form Font to XFont\r
585     /// </summary>\r
586     public static implicit operator XFont(Font font)\r
587     {\r
588       //XFont xfont = new XFont(font.Name, font.Size, FontStyleFrom(font));\r
589       XFont xfont = new XFont(font, null);\r
590       return xfont;\r
591     }\r
592 #endif\r
593 \r
594     internal Font RealizeGdiFont()\r
595     {\r
596       //if (this.font == null)\r
597       //  this.font = new Font(this.familyName, this.size, (FontStyle)this.style);\r
598       return this.font;\r
599     }\r
600     internal Font font;\r
601 #endif\r
602 \r
603 #if WPF && !SILVERLIGHT\r
604     internal Typeface RealizeWpfTypeface()\r
605     {\r
606       return this.typeface;\r
607     }\r
608     internal System.Windows.Media.FontFamily family;\r
609     internal Typeface typeface;\r
610 #endif\r
611 \r
612     internal string familyName;\r
613     internal int unitsPerEm;\r
614     internal int cellSpace;\r
615     internal int cellAscent;\r
616     internal int cellDescent;\r
617 \r
618     /// <summary>\r
619     /// Cache PdfFontTable.FontSelector to speed up finding the right PdfFont\r
620     /// if this font is used more than once.\r
621     /// </summary>\r
622     internal PdfFontTable.FontSelector selector;\r
623   }\r
624 }\r