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)); }
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); }