// ----- MeasureString ------------------------------------------------------------------------ /// <summary> /// Measures the specified string when drawn with the specified font. /// </summary> public XSize MeasureString(string text, XFont font, XStringFormat stringFormat) { // TODO: Here comes a lot of code in the future: kerning etc... if (text == null) throw new ArgumentNullException("text"); if (font == null) throw new ArgumentNullException("font"); if (stringFormat == null) throw new ArgumentNullException("stringFormat"); #if GDI && !WPF return XSize.FromSizeF(this.gfx.MeasureString(text, font.RealizeGdiFont(), new PointF(0, 0), stringFormat.RealizeGdiStringFormat())); #endif #if WPF && !GDI #if !SILVERLIGHT //FormattedText formattedText = new FormattedText(text, new CultureInfo("en-us"), // FlowDirection.LeftToRight, font.typeface, font.Size, System.Windows.Media.Brushes.Black); FormattedText formattedText = FontHelper.CreateFormattedText(text, font.typeface, font.Size, System.Windows.Media.Brushes.Black); return new XSize(formattedText.WidthIncludingTrailingWhitespace, formattedText.Height); #else return dc.MeasureString(this, text, font, stringFormat); #endif #endif #if WPF && GDI if (this.targetContext == XGraphicTargetContext.GDI) { XSize gdiSize = XSize.FromSizeF(this.gfx.MeasureString(text, font.RealizeGdiFont(), new PointF(0, 0), stringFormat.RealizeGdiStringFormat())); #if DEBUG Debug.WriteLine(gdiSize); #endif return gdiSize; } if (this.targetContext == XGraphicTargetContext.WPF) { //double h = font.Height; //FormattedText formattedText = new FormattedText(text, new CultureInfo("en-us"), // FlowDirection.LeftToRight, font.typeface, font.Size, System.Windows.Media.Brushes.Black); FormattedText formattedText = FontHelper.CreateFormattedText(text, font.typeface, font.Size, System.Windows.Media.Brushes.Black); XSize wpfSize = new XSize(formattedText.WidthIncludingTrailingWhitespace, formattedText.Height); #if DEBUG Debug.WriteLine(wpfSize); #endif return wpfSize; } Debug.Assert(false); return XSize.Empty; #endif }
/// <summary> /// Adds a text string to this path. /// </summary> public void AddString(string s, XFontFamily family, XFontStyle style, double emSize, XRect layoutRect, XStringFormat format) { this.gdipPath.AddString(s, family.family, (int)style, (float)emSize, layoutRect.ToRectangleF(), format.RealizeGdiStringFormat()); }
/// <summary> /// Draws the specified text string. /// </summary> public void DrawString(string text, XFont font, XBrush brush, XRect layoutRectangle, XStringFormat format) { if (text == null) throw new ArgumentNullException("text"); if (font == null) throw new ArgumentNullException("font"); if (brush == null) throw new ArgumentNullException("brush"); if (format != null && format.LineAlignment == XLineAlignment.BaseLine && layoutRectangle.Height != 0) throw new InvalidOperationException("DrawString: With XLineAlignment.BaseLine the height of the layout rectangle must be 0."); if (text.Length == 0) return; if (format == null) format = XStringFormats.Default; if (this.drawGraphics) { #if GDI if (this.targetContext == XGraphicTargetContext.GDI) { RectangleF rect = layoutRectangle.ToRectangleF(); if (format.LineAlignment == XLineAlignment.BaseLine) { double lineSpace = font.GetHeight(this); int cellSpace = font.FontFamily.GetLineSpacing(font.Style); int cellAscent = font.FontFamily.GetCellAscent(font.Style); int cellDescent = font.FontFamily.GetCellDescent(font.Style); double cyAscent = lineSpace * cellAscent / cellSpace; cyAscent = lineSpace * font.cellAscent / font.cellSpace; rect.Offset(0, (float)-cyAscent); } this.gfx.DrawString(text, font.RealizeGdiFont(), brush.RealizeGdiBrush(), rect, format != null ? format.RealizeGdiStringFormat() : null); } #endif #if WPF if (this.targetContext == XGraphicTargetContext.WPF) { #if !SILVERLIGHT double x = layoutRectangle.X; double y = layoutRectangle.Y; double lineSpace = font.GetHeight(this); double cyAscent = lineSpace * font.cellAscent / font.cellSpace; double cyDescent = lineSpace * font.cellDescent / font.cellSpace; bool bold = (font.Style & XFontStyle.Bold) != 0; bool italic = (font.Style & XFontStyle.Italic) != 0; bool strikeout = (font.Style & XFontStyle.Strikeout) != 0; bool underline = (font.Style & XFontStyle.Underline) != 0; //FormattedText formattedText = new FormattedText(text, new CultureInfo("en-us"), // WPFHACK // FlowDirection.LeftToRight, font.typeface, font.Size, brush.RealizeWpfBrush()); FormattedText formattedText = FontHelper.CreateFormattedText(text, font.typeface, font.Size, brush.RealizeWpfBrush()); //formattedText.SetTextDecorations(TextDecorations.OverLine); switch (format.Alignment) { case XStringAlignment.Near: // nothing to do, this is the default //formattedText.TextAlignment = TextAlignment.Left; break; case XStringAlignment.Center: x += layoutRectangle.Width / 2; formattedText.TextAlignment = TextAlignment.Center; break; case XStringAlignment.Far: x += layoutRectangle.Width; formattedText.TextAlignment = TextAlignment.Right; break; } if (PageDirection == XPageDirection.Downwards) { switch (format.LineAlignment) { case XLineAlignment.Near: //y += cyAscent; break; case XLineAlignment.Center: // TODO use CapHeight. PDFlib also uses 3/4 of ascent y += -formattedText.Baseline + (cyAscent * 1 / 3) + layoutRectangle.Height / 2; //y += -formattedText.Baseline + (font.Size * font.Metrics.CapHeight / font.unitsPerEm / 2) + layoutRectangle.Height / 2; break; case XLineAlignment.Far: y += -formattedText.Baseline - cyDescent + layoutRectangle.Height; break; case XLineAlignment.BaseLine: y -= formattedText.Baseline; break; } } else { // TODOWPF: make unit test switch (format.LineAlignment) { case XLineAlignment.Near: //y += cyDescent; break; case XLineAlignment.Center: // TODO use CapHeight. PDFlib also uses 3/4 of ascent //y += -(cyAscent * 3 / 4) / 2 + rect.Height / 2; break; case XLineAlignment.Far: //y += -cyAscent + rect.Height; break; case XLineAlignment.BaseLine: // nothing to do break; } } //if (bold && !descriptor.IsBoldFace) //{ // // TODO: emulate bold by thicker outline //} //if (italic && !descriptor.IsBoldFace) //{ // // TODO: emulate italic by shearing transformation //} if (underline) { formattedText.SetTextDecorations(TextDecorations.Underline); //double underlinePosition = lineSpace * realizedFont.FontDescriptor.descriptor.UnderlinePosition / font.cellSpace; //double underlineThickness = lineSpace * realizedFont.FontDescriptor.descriptor.UnderlineThickness / font.cellSpace; //DrawRectangle(null, brush, x, y - underlinePosition, width, underlineThickness); } if (strikeout) { formattedText.SetTextDecorations(TextDecorations.Strikethrough); //double strikeoutPosition = lineSpace * realizedFont.FontDescriptor.descriptor.StrikeoutPosition / font.cellSpace; //double strikeoutSize = lineSpace * realizedFont.FontDescriptor.descriptor.StrikeoutSize / font.cellSpace; //DrawRectangle(null, brush, x, y - strikeoutPosition - strikeoutSize, width, strikeoutSize); } //this.dc.DrawText(formattedText, layoutRectangle.Location.ToPoint()); this.dc.DrawText(formattedText, new System.Windows.Point(x, y)); #else dc.DrawString(this, text, font, brush, layoutRectangle, format); #endif } #endif } if (this.renderer != null) this.renderer.DrawString(text, font, brush, layoutRectangle, format); }
/// <summary> /// Adds a text string to this path. /// </summary> public void AddString(string s, XFontFamily family, XFontStyle style, double emSize, XRect layoutRect, XStringFormat format) { if (s == null) throw new ArgumentNullException("s"); if (family == null) throw new ArgumentNullException("family"); if (format == null) format = XStringFormats.Default; if (format.LineAlignment == XLineAlignment.BaseLine && layoutRect.Height != 0) throw new InvalidOperationException( "DrawString: With XLineAlignment.BaseLine the height of the layout rectangle must be 0."); if (s.Length == 0) return; XFont font = new XFont(family.Name, emSize, style); #if CORE DiagnosticsHelper.HandleNotImplemented("XGraphicsPath.AddString"); #endif #if (GDI || CORE_) && !WPF //Gfx.DrawString(text, font.Realize_GdiFont(), brush.RealizeGdiBrush(), rect, // format != null ? format.RealizeGdiStringFormat() : null); if (family.GdiFamily == null) throw new NotFiniteNumberException(PSSR.NotImplementedForFontsRetrievedWithFontResolver(family.Name)); RectangleF rect = layoutRect.ToRectangleF(); rect.Offset(new PointF(0, SimulateBaselineOffset(family, style, emSize, format))); try { Lock.EnterGdiPlus(); _gdipPath.AddString(s, family.GdiFamily, (int)style, (float)emSize, rect, format.RealizeGdiStringFormat()); } finally { Lock.ExitGdiPlus(); } #endif #if WPF && !GDI if (family.WpfFamily == null) throw new NotFiniteNumberException(PSSR.NotImplementedForFontsRetrievedWithFontResolver(family.Name)); #if !SILVERLIGHT // Just a first sketch, but currently we do not need it and there is enough to do... double x = layoutRect.X; double y = layoutRect.Y; //double lineSpace = font.GetHeight(this); //double cyAscent = lineSpace * font.cellAscent / font.cellSpace; //double cyDescent = lineSpace * font.cellDescent / font.cellSpace; //double cyAscent = family.GetCellAscent(style) * family.GetLineSpacing(style) / family.getl; //fontlineSpace * font.cellAscent / font.cellSpace; //double cyDescent =family.GetCellDescent(style); // lineSpace * font.cellDescent / font.cellSpace; double lineSpace = font.GetHeight(); double cyAscent = lineSpace * font.CellAscent / font.CellSpace; double cyDescent = lineSpace * font.CellDescent / font.CellSpace; bool bold = (style & XFontStyle.Bold) != 0; bool italic = (style & XFontStyle.Italic) != 0; bool strikeout = (style & XFontStyle.Strikeout) != 0; bool underline = (style & XFontStyle.Underline) != 0; Typeface typeface = FontHelper.CreateTypeface(family.WpfFamily, style); //FormattedText formattedText = new FormattedText(s, CultureInfo.CurrentCulture, FlowDirection.LeftToRight, typeface, emSize, WpfBrushes.Black); FormattedText formattedText = FontHelper.CreateFormattedText(s, typeface, emSize, WpfBrushes.Black); switch (format.Alignment) { case XStringAlignment.Near: // nothing to do, this is the default //formattedText.TextAlignment = TextAlignment.Left; break; case XStringAlignment.Center: x += layoutRect.Width / 2; formattedText.TextAlignment = TextAlignment.Center; break; case XStringAlignment.Far: x += layoutRect.Width; formattedText.TextAlignment = TextAlignment.Right; break; } //if (PageDirection == XPageDirection.Downwards) //{ switch (format.LineAlignment) { case XLineAlignment.Near: //y += cyAscent; break; case XLineAlignment.Center: // TO/DO use CapHeight. PDFlib also uses 3/4 of ascent //y += -formattedText.Baseline + (cyAscent * 2 / 4) + layoutRect.Height / 2; // GDI seems to make it this simple: // TODO: Check WPF's vertical alignment and make all implementations fit. $MaOs y += layoutRect.Height / 2 - lineSpace / 2; break; case XLineAlignment.Far: y += -formattedText.Baseline - cyDescent + layoutRect.Height; break; case XLineAlignment.BaseLine: y -= formattedText.Baseline; break; } //} //else //{ // // TODOWPF // switch (format.LineAlignment) // { // case XLineAlignment.Near: // //y += cyDescent; // break; // case XLineAlignment.Center: // // TODO use CapHeight. PDFlib also uses 3/4 of ascent // //y += -(cyAscent * 3 / 4) / 2 + rect.Height / 2; // break; // case XLineAlignment.Far: // //y += -cyAscent + rect.Height; // break; // case XLineAlignment.BaseLine: // // nothing to do // break; // } //} //if (bold && !descriptor.IsBoldFace) //{ // // TODO: emulate bold by thicker outline //} //if (italic && !descriptor.IsItalicFace) //{ // // TODO: emulate italic by shearing transformation //} if (underline) { //double underlinePosition = lineSpace * realizedFont.FontDescriptor.descriptor.UnderlinePosition / font.cellSpace; //double underlineThickness = lineSpace * realizedFont.FontDescriptor.descriptor.UnderlineThickness / font.cellSpace; //DrawRectangle(null, brush, x, y - underlinePosition, width, underlineThickness); } if (strikeout) { //double strikeoutPosition = lineSpace * realizedFont.FontDescriptor.descriptor.StrikeoutPosition / font.cellSpace; //double strikeoutSize = lineSpace * realizedFont.FontDescriptor.descriptor.StrikeoutSize / font.cellSpace; //DrawRectangle(null, brush, x, y - strikeoutPosition - strikeoutSize, width, strikeoutSize); } //dc.DrawText(formattedText, layoutRectangle.Location.ToPoint()); //dc.DrawText(formattedText, new SysPoint(x, y)); Geometry geo = formattedText.BuildGeometry(new Point(x, y)); _pathGeometry.AddGeometry(geo); #else // AG-HACK throw new InvalidOperationException("Silverlight cannot create geometry of glyphs."); // TODO: no, yagni #endif #endif }
/// <summary> /// Adds a text string to this path. /// </summary> public void AddString(string s, XFontFamily family, XFontStyle style, double emSize, XPoint origin, XStringFormat format) { this.gdipPath.AddString(s, family.family, (int)style, (float)emSize, origin.ToPointF(), format.RealizeGdiStringFormat()); }
/// <summary> /// Adds a text string to this path. /// </summary> public void AddString(string s, XFontFamily family, XFontStyle style, double emSize, XPoint origin, XStringFormat format) { try { #if CORE DiagnosticsHelper.HandleNotImplemented("XGraphicsPath.AddString"); #endif #if GDI if (family.GdiFamily == null) throw new NotFiniteNumberException(PSSR.NotImplementedForFontsRetrievedWithFontResolver(family.Name)); PointF p = origin.ToPointF(); p.Y += SimulateBaselineOffset(family, style, emSize, format); try { Lock.EnterGdiPlus(); _gdipPath.AddString(s, family.GdiFamily, (int)style, (float)emSize, p, format.RealizeGdiStringFormat()); } finally { Lock.ExitGdiPlus(); } #endif #if WPF if (family.WpfFamily == null) throw new NotFiniteNumberException(PSSR.NotImplementedForFontsRetrievedWithFontResolver(family.Name)); #if !SILVERLIGHT XFont font = new XFont(family.Name, emSize, style); double x = origin.X; double y = origin.Y; double lineSpace = font.GetHeight(); double cyAscent = lineSpace * font.CellAscent / font.CellSpace; double cyDescent = lineSpace * font.CellDescent / font.CellSpace; Typeface typeface = FontHelper.CreateTypeface(family.WpfFamily, style); FormattedText formattedText = FontHelper.CreateFormattedText(s, typeface, emSize, WpfBrushes.Black); switch (format.Alignment) { case XStringAlignment.Near: // nothing to do, this is the default //formattedText.TextAlignment = TextAlignment.Left; break; case XStringAlignment.Center: formattedText.TextAlignment = TextAlignment.Center; break; case XStringAlignment.Far: formattedText.TextAlignment = TextAlignment.Right; break; } switch (format.LineAlignment) { case XLineAlignment.Near: //y += cyAscent; break; case XLineAlignment.Center: // TODO use CapHeight. PDFlib also uses 3/4 of ascent y += -lineSpace / 2; //-formattedText.Baseline + (cyAscent * 2 / 4); break; case XLineAlignment.Far: y += -formattedText.Baseline - cyDescent; break; case XLineAlignment.BaseLine: y -= formattedText.Baseline; break; } Geometry geo = formattedText.BuildGeometry(new XPoint(x, y)); _pathGeometry.AddGeometry(geo); #else // AG-HACK throw new InvalidOperationException("Silverlight cannot create geometry of glyphs."); // TODO: Get the outline directly from the font. #endif #endif } catch { throw; } }
/// <summary> /// Adds a text string to this path. /// </summary> public void AddString(string s, XFontFamily family, XFontStyle style, double emSize, RectangleF layoutRect, XStringFormat format) { if (family.GdiFamily == null) throw new NotFiniteNumberException(PSSR.NotImplementedForFontsRetrievedWithFontResolver(family.Name)); RectangleF rect = new RectangleF(layoutRect.X, layoutRect.Y, layoutRect.Width, layoutRect.Height); rect.Offset(new PointF(0, SimulateBaselineOffset(family, style, emSize, format))); try { Lock.EnterGdiPlus(); _gdipPath.AddString(s, family.GdiFamily, (int)style, (float)emSize, layoutRect, format.RealizeGdiStringFormat()); } finally { Lock.ExitGdiPlus(); } }
// ----- MeasureString ------------------------------------------------------------------------ /// <summary> /// Measures the specified string when drawn with the specified font. /// </summary> public XSize MeasureString(string text, XFont font, XStringFormat stringFormat) { // TODO: Here comes a lot of code in the future: kerning etc... if (text == null) throw new ArgumentNullException("text"); if (font == null) throw new ArgumentNullException("font"); if (stringFormat == null) throw new ArgumentNullException("stringFormat"); return XSize.FromSizeF(this.gfx.MeasureString(text, font.RealizeGdiFont(), new PointF(0, 0), stringFormat.RealizeGdiStringFormat())); }
/// <summary> /// Draws the specified text string. /// </summary> public void DrawString(string s, XFont font, XBrush brush, XRect layoutRectangle, XStringFormat format) { if (s == null) throw new ArgumentNullException("s"); if (font == null) throw new ArgumentNullException("font"); if (brush == null) throw new ArgumentNullException("brush"); if (format.LineAlignment == XLineAlignment.BaseLine && layoutRectangle.Height != 0) throw new InvalidOperationException("DrawString: With XLineAlignment.BaseLine the height of the layout rectangle must be 0."); if (s.Length == 0) return; if (format == null) format = XStringFormat.Default; if (this.drawGraphics) { RectangleF rect = layoutRectangle.ToRectangleF(); if (format.LineAlignment == XLineAlignment.BaseLine) { // TODO optimze double lineSpace = font.GetHeight(this); int cellSpace = font.FontFamily.GetLineSpacing(font.Style); int cellAscent = font.FontFamily.GetCellAscent(font.Style); int cellDescent = font.FontFamily.GetCellDescent(font.Style); double cyAscent = lineSpace * cellAscent / cellSpace; cyAscent = lineSpace * font.cellAscent / font.cellSpace; rect.Offset(0, (float)-cyAscent); } this.gfx.DrawString(s, font.RealizeGdiFont(), brush.RealizeGdiBrush(), rect, format != null ? format.RealizeGdiStringFormat() : null); } if (this.renderer != null) this.renderer.DrawString(s, font, brush, layoutRectangle, format); }
/// <summary> /// Adds a text string to this path. /// </summary> public void AddString(string s, XFontFamily family, XFontStyle style, double emSize, XRect layoutRect, XStringFormat format) { if (s == null) throw new ArgumentNullException("s"); if (family == null) throw new ArgumentNullException("family"); if (format.LineAlignment == XLineAlignment.BaseLine && layoutRect.Height != 0) throw new InvalidOperationException("DrawString: With XLineAlignment.BaseLine the height of the layout rectangle must be 0."); if (s.Length == 0) return; if (format == null) format = XStringFormats.Default; XFont font = new XFont(family.Name, emSize, style); #if GDI && !WPF RectangleF rc = layoutRect.ToRectangleF(); if (format.LineAlignment == XLineAlignment.BaseLine) { double lineSpace = font.GetHeight(); int cellSpace = font.FontFamily.GetLineSpacing(font.Style); int cellAscent = font.FontFamily.GetCellAscent(font.Style); int cellDescent = font.FontFamily.GetCellDescent(font.Style); double cyAscent = lineSpace * cellAscent / cellSpace; cyAscent = lineSpace * font.cellAscent / font.cellSpace; rc.Offset(0, (float)-cyAscent); } //this.gfx.DrawString(text, font.RealizeGdiFont(), brush.RealizeGdiBrush(), rect, // format != null ? format.RealizeGdiStringFormat() : null); this.gdipPath.AddString(s, family.gdiFamily, (int)style, (float)emSize, rc, format.RealizeGdiStringFormat()); #endif #if WPF && !GDI // Just a first sketch, but currently we do not need it and there is enough to do... double x = layoutRect.X; double y = layoutRect.Y; //double lineSpace = font.GetHeight(this); //double cyAscent = lineSpace * font.cellAscent / font.cellSpace; //double cyDescent = lineSpace * font.cellDescent / font.cellSpace; //double cyAscent = family.GetCellAscent(style) * family.GetLineSpacing(style) / family.getl; //fontlineSpace * font.cellAscent / font.cellSpace; //double cyDescent =family.GetCellDescent(style); // lineSpace * font.cellDescent / font.cellSpace; double lineSpace = font.GetHeight(); double cyAscent = lineSpace * font.cellAscent / font.cellSpace; double cyDescent = lineSpace * font.cellDescent / font.cellSpace; bool bold = (style & XFontStyle.Bold) != 0; bool italic = (style & XFontStyle.Italic) != 0; bool strikeout = (style & XFontStyle.Strikeout) != 0; bool underline = (style & XFontStyle.Underline) != 0; Typeface typeface = FontHelper.CreateTypeface(family, style); FormattedText formattedText = new FormattedText(s, CultureInfo.CurrentCulture, FlowDirection.LeftToRight, typeface, emSize, System.Windows.Media.Brushes.Black); switch (format.Alignment) { case XStringAlignment.Near: // nothing to do, this is the default //formattedText.TextAlignment = TextAlignment.Left; break; case XStringAlignment.Center: x += layoutRect.Width / 2; formattedText.TextAlignment = TextAlignment.Center; break; case XStringAlignment.Far: x += layoutRect.Width; formattedText.TextAlignment = TextAlignment.Right; break; } //if (PageDirection == XPageDirection.Downwards) //{ switch (format.LineAlignment) { case XLineAlignment.Near: //y += cyAscent; break; case XLineAlignment.Center: // TODO use CapHeight. PDFlib also uses 3/4 of ascent y += -formattedText.Baseline + (cyAscent * 2 / 4) + layoutRect.Height / 2; break; case XLineAlignment.Far: y += -formattedText.Baseline - cyDescent + layoutRect.Height; break; case XLineAlignment.BaseLine: y -= formattedText.Baseline; break; } //} //else //{ // // TODOWPF // switch (format.LineAlignment) // { // case XLineAlignment.Near: // //y += cyDescent; // break; // case XLineAlignment.Center: // // TODO use CapHeight. PDFlib also uses 3/4 of ascent // //y += -(cyAscent * 3 / 4) / 2 + rect.Height / 2; // break; // case XLineAlignment.Far: // //y += -cyAscent + rect.Height; // break; // case XLineAlignment.BaseLine: // // nothing to do // break; // } //} //if (bold && !descriptor.IsBoldFace) //{ // // TODO: emulate bold by thicker outline //} //if (italic && !descriptor.IsBoldFace) //{ // // TODO: emulate italic by shearing transformation //} if (underline) { //double underlinePosition = lineSpace * realizedFont.FontDescriptor.descriptor.UnderlinePosition / font.cellSpace; //double underlineThickness = lineSpace * realizedFont.FontDescriptor.descriptor.UnderlineThickness / font.cellSpace; //DrawRectangle(null, brush, x, y - underlinePosition, width, underlineThickness); } if (strikeout) { //double strikeoutPosition = lineSpace * realizedFont.FontDescriptor.descriptor.StrikeoutPosition / font.cellSpace; //double strikeoutSize = lineSpace * realizedFont.FontDescriptor.descriptor.StrikeoutSize / font.cellSpace; //DrawRectangle(null, brush, x, y - strikeoutPosition - strikeoutSize, width, strikeoutSize); } //this.dc.DrawText(formattedText, layoutRectangle.Location.ToPoint()); //this.dc.DrawText(formattedText, new System.Windows.Point(x, y)); Geometry geo = formattedText.BuildGeometry(new Point(x, y)); this.pathGeometry.AddGeometry(geo); #endif }
/// <summary> /// Adds a text string to this path. /// </summary> public void AddString(string s, XFontFamily family, XFontStyle style, double emSize, RectangleF layoutRect, XStringFormat format) { // TODOWPF this.gdipPath.AddString(s, family.gdiFamily, (int)style, (float)emSize, layoutRect, format.RealizeGdiStringFormat()); }
/// <summary> /// Adds a text string to this path. /// </summary> public void AddString(string s, XFontFamily family, XFontStyle style, double emSize, XPoint origin, XStringFormat format) { try { #if GDI // TODOWPF this.gdipPath.AddString(s, family.gdiFamily, (int)style, (float)emSize, origin.ToPointF(), format.RealizeGdiStringFormat()); #endif #if WPF Typeface typeface = FontHelper.CreateTypeface(family, style); FormattedText ft = new FormattedText(s, CultureInfo.CurrentCulture, FlowDirection.LeftToRight, typeface, emSize, System.Windows.Media.Brushes.Black); Geometry geo = ft.BuildGeometry(origin); this.pathGeometry.AddGeometry(geo); #endif } catch { } }