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(); }
void Render() { if (layout == null) { return; } if (wrap) { layout.Width = (int)(Allocation.Width * Pango.Scale.PangoScale); } else { layout.Width = int.MaxValue; } Rectangle ink, log; layout.GetPixelExtents(out ink, out log); HeightRequest = ink.Y + ink.Height + 3; if (!wrap) { WidthRequest = ink.X + ink.Width + 3; } }