Exemple #1
0
        public Size MeasureString(FontConfig font, string text)
        {
            XftFontExt fontExt = objectCache.GetXftFont(font);

            byte[] utf32Text = Encoding.UTF32.GetBytes(text);

            int      width           = 0;
            GCHandle utf32TextHandle = GCHandle.Alloc(utf32Text, GCHandleType.Pinned);

            try
            {
                IntPtr utf32TextPtr = utf32TextHandle.AddrOfPinnedObject();
                foreach (var range in fontExt.GetRanges(utf32Text))
                {
                    LibXft.XftTextExtents32(
                        display,
                        range.Font,
                        utf32TextPtr + range.Start,
                        (range.End - range.Start) / 4,
                        out var extents
                        );
                    width += extents.xOff;
                }
            }
            finally
            {
                utf32TextHandle.Free();
            }

            var fontInfo = Marshal.PtrToStructure <XftFont>(fontExt.MainFont);

            return(new Size(width, fontInfo.height));
        }
Exemple #2
0
 private int DrawStringRange(
     IntPtr xftDraw,
     IntPtr xftColorPtr,
     IntPtr font,
     int x,
     int y,
     IntPtr utf32TextPtr,
     int rangeStart,
     int rangeEnd
     )
 {
     LibXft.XftTextExtents32(
         display,
         font,
         utf32TextPtr + rangeStart,
         (rangeEnd - rangeStart) / 4,
         out var extents
         );
     LibXft.XftDrawString32(
         xftDraw,
         xftColorPtr,
         font,
         x,
         y,
         utf32TextPtr + rangeStart,
         (rangeEnd - rangeStart) / 4
         );
     return(extents.xOff);
 }