public IEnumerable <RectangleF> GetBoundingRectsForGlyphs(TFont font, ForEach <TGlyph> glyphs, int nVariants)
        {
            var glyphArray = new TGlyph[nVariants];

            glyphs.CopyTo(glyphArray);
            var rects = new CGRect[nVariants];

            font.CtFont.GetBoundingRects(CTFontOrientation.Horizontal, glyphArray, rects, nVariants);
            return(rects.Select(rect => (RectangleF)rect));
        }
        public (IEnumerable <float> Advances, float Total) GetAdvancesForGlyphs(TFont font, ForEach <TGlyph> glyphs, int nGlyphs)
        {
            var glyphArray = new TGlyph[nGlyphs];

            glyphs.CopyTo(glyphArray);
            var advanceSizes    = new CGSize[nGlyphs];
            var combinedAdvance = font.CtFont.GetAdvancesForGlyphs(CTFontOrientation.Default, glyphArray, advanceSizes, nGlyphs);

            return(advanceSizes.Select(advance => (float)advance.Width), (float)combinedAdvance);
        }
        public void DrawGlyphsAtPoints(ForEach <TGlyph> glyphs, TFont font, ForEach <PointF> points, Color?color)
        {
            DebugWriteLine(glyphs, points);
            var cgPoints = points.Select(p => (CGPoint)p);
            var cgArray  = new RentedArray <CGPoint>(cgPoints.Count);

            cgPoints.CopyTo(cgArray.Array);
            var glyphArray = new RentedArray <TGlyph>(cgPoints.Count);

            glyphs.CopyTo(glyphArray.Array);
            var ctFont = font.CtFont;

            if (color.HasValue)
            {
                CgContext.SetFillColor(color.Value.ToCgColor());
            }
            ctFont.DrawGlyphs(CgContext, glyphArray.Array, cgArray.Array);
            cgArray.Return();
            glyphArray.Return();
        }