public void DrawString(Color color, FontConfig font, int x, int y, string text) { x -= origin.X; y -= origin.Y; var xftColorPtr = Marshal.AllocHGlobal(Marshal.SizeOf <XftColor>()); try { XRenderColor xColor = new XRenderColor(color); LibXft.XftColorAllocValue( display, visual, colormap, ref xColor, xftColorPtr ); try { XftFontExt fontExt = objectCache.GetXftFont(font); var fontInfo = Marshal.PtrToStructure <XftFont>(fontExt.MainFont); int xOffset = DrawString(xftDraw, xftColorPtr, fontExt, x, y + fontInfo.ascent, text); if (font.IsUnderline) { int lineHeight = Convert.ToInt32(Math.Max(font.Size / 10, 1)); LibXRender.XRenderFillRectangle( display, PictOp.PictOpOver, pictureId, ref xColor, x, y + fontInfo.ascent + (fontInfo.descent - lineHeight) / 2, (uint)xOffset, (uint)lineHeight ); } if (font.IsStrikeout) { int lineHeight = Convert.ToInt32(Math.Max(font.Size / 20, 1)); LibXRender.XRenderFillRectangle ( display, PictOp.PictOpOver, pictureId, ref xColor, x, y + fontInfo.ascent - (2 * fontInfo.ascent + 3 * lineHeight) / 6, (uint)xOffset, (uint)lineHeight ); } } finally { LibXft.XftColorFree(display, visual, colormap, xftColorPtr); } } finally { Marshal.FreeHGlobal(xftColorPtr); } }
public void FillRectangle(Color color, int x, int y, int width, int height) { // todo: <= 0 instead? if (width < 0 || height < 0) { return; } x -= origin.X; y -= origin.Y; XRenderColor xColor = new XRenderColor(color); LibXRender.XRenderFillRectangle(display, PictOp.PictOpOver, pictureId, ref xColor, x, y, (uint)width, (uint)height); }