public unsafe void DrawTextLayout(TextLayout layout, Color color, float x, float y) { layout.Run(); layout.Font.ApplyToSKPaint(skPaint, PageUnit, DpiX); skPaint.Color = new SKColor((uint)color.Value); skPaint.Style = SKPaintStyle.Fill; skPaint.TextEncoding = SKTextEncoding.Utf16; skPaint.IsAntialias = true; var cy = y + GraphicsUnitConverter.Convert(GraphicsUnit.Pixel, PageUnit, layout.OffsetY, DpiY); fixed(char *ptr = layout.Text) { for (int i = 0; i < layout.lines.Count; i++) { cy += GraphicsUnitConverter.Convert(GraphicsUnit.Pixel, PageUnit, -layout.Font.FontMetrics.Ascent, DpiY); var length = layout.lines[i].widths.Length; SKPoint *pos = stackalloc SKPoint[length]; var cx = x + GraphicsUnitConverter.Convert(GraphicsUnit.Pixel, PageUnit, layout.lines[i].offsetX, DpiX); for (int j = 0; j < length; j++) { pos[j].X = cx; pos[j].Y = cy; cx += GraphicsUnitConverter.Convert(GraphicsUnit.Pixel, PageUnit, layout.lines[i].widths[j], DpiX); } SkiaApi.sk_canvas_draw_pos_text(skCanvas.Handle, ((byte *)ptr) + layout.lines[i].startByteIndex, new IntPtr(layout.lines[i].byteLength), pos, skPaint.Handle); cy += GraphicsUnitConverter.Convert(GraphicsUnit.Pixel, PageUnit, layout.Font.FontMetrics.Descent + layout.Font.FontMetrics.Leading, DpiX); } } //System.Diagnostics.Debug.WriteLine("Graphics.DrawTextLayout at {0},{1} with: {2}",x,y,layout.Text); }
internal unsafe static extern void sk_canvas_draw_pos_text(IntPtr canvas, /* char */ void *text, /* size_t */ IntPtr byteLength, SKPoint *param3, IntPtr paint);