public void DrawString(RectangleD layout, string text, Cairo.Color color, ObjectFont font, StringTrimming trimming, HorizontalAlignment hAlign = HorizontalAlignment.Left, bool wrap = false) { double x = Math.Ceiling(layout.X * drawingScaleX); double y = Math.Ceiling(layout.Y * drawingScaleY); double width = Math.Floor(layout.Width * drawingScaleX); double height = Math.Floor(layout.Height * drawingScaleY); SetupPangoLayout(text, font, trimming, wrap ? (float?)width : null); cairoContext.Save(); cairoContext.Rectangle(x, y, width, height); cairoContext.Clip(); cairoContext.Antialias = Antialias.None; Pango.Rectangle ink, logical; pangoLayout.GetPixelExtents(out ink, out logical); if (ink.X < 0) { x -= ink.X; logical.Width -= ink.X; } switch (hAlign) { case HorizontalAlignment.Left: pangoLayout.Alignment = Alignment.Left; break; case HorizontalAlignment.Center: pangoLayout.Alignment = Alignment.Center; if (width > logical.Width) { x += (width - logical.Width) / 2; } break; case HorizontalAlignment.Right: pangoLayout.Alignment = Alignment.Right; if (width > logical.Width) { x += width - logical.Width; } break; } cairoContext.MoveTo(x, y); cairoContext.Color = color; cairoContext.ShowLayout(pangoLayout); cairoContext.Restore(); }
private void SetupPangoLayout(string text, ObjectFont font, StringTrimming trimming, double?width) { PangoStyle style = new PangoStyle { ExactSize = font.Size, FontFamily = DataHelper.GetPreferredFont(text) ?? (font.NameSpecified ? font.Name : DataHelper.DefaultDocumentsFont) }; if (font.Italic) { style.Italic = true; } if (font.Bold) { style.Bold = true; } if (font.Underline) { style.Underline = true; } if (font.StrikeThrought) { style.Strikethrough = true; } pangoLayout.SetMarkup(style.GetMarkup(text)); pangoLayout.Ellipsize = EllipsizeMode.None; pangoLayout.Wrap = WrapMode.Word; if (width != null) { pangoLayout.Width = (int)(width * Scale.PangoScale); } else { pangoLayout.Width = -1; if (trimming != StringTrimming.None) { pangoLayout.Ellipsize = EllipsizeMode.End; } } }
public SizeD MeasureString(string text, ObjectFont font, double?width) { bool emptyString = string.IsNullOrWhiteSpace(text); if (emptyString) { text = "W"; } SetupPangoLayout(text, font, StringTrimming.Character, width != null ? width * drawingScaleX : null); Pango.Rectangle ink, logical; pangoLayout.GetPixelExtents(out ink, out logical); if (ink.X < 0) { logical.Width -= ink.X; } if (emptyString) { logical.Width = 0; } return(new SizeD(logical.Width / drawingScaleX, logical.Height / drawingScaleY)); }
/// <summary> /// Gets the name of the specified font in the format used by <c>Pango</c>. /// </summary> /// <param name="font">The font.</param> /// <returns>The name of the specified font in the format used by <c>Pango</c>.</returns> public static string GetPangoName(ObjectFont font) { return(GetPangoName(font.Name, font.Bold, font.Italic, font.Size)); }