[XRender] Howto draw a hairline-trapezoid?
glynn at gclements.plus.com
Mon Jun 2 06:38:09 PDT 2008
Clemens Eisserer wrote:
> I have some troubles replacing XDrawLine with XRender code.
> XDrawLine seems to take care that the line "appears" 1px wide, whereas
> XRender does (mathematically correct) draw overlapping line segments,
> which looks like the 1px line has not a constant width.
> I created two demos which show the difference:
> The first circle was done using XDrawLine, the second with plain
> XRender (Cairo showed the same problems).
> Any idea how I could mimic the "old" XDrawLine behaviour with XRender?
What line width are you using for XDrawLine()? Zero or one?
The rendering of zero-width lines by XDrawLine() can vary between
drivers. The XChangeGC() manual page says:
Thin lines (zero line-width) are one-pixel-wide lines drawn using an
unspecified, device-dependent algorithm. There are only two con-
straints on this algorithm.
1. If a line is drawn unclipped from [x1,y1] to [x2,y2] and if
another line is drawn unclipped from [x1+dx,y1+dy] to
[x2+dx,y2+dy], a point [x,y] is touched by drawing the first line
if and only if the point [x+dx,y+dy] is touched by drawing the
2. The effective set of points comprising a line cannot be affected
by clipping. That is, a point is touched in a clipped line if and
only if the point lies inside the clipping region and the point
would be touched by the line when drawn unclipped.
A wide line drawn from [x1,y1] to [x2,y2] always draws the same pixels
as a wide line drawn from [x2,y2] to [x1,y1], not counting cap-style
and join-style. It is recommended that this property be true for thin
lines, but this is not required. A line-width of zero may differ from
a line-width of one in which pixels are drawn. This permits the use of
many manufacturers' line drawing hardware, which may run many times
faster than the more precisely specified wide lines.
Glynn Clements <glynn at gclements.plus.com>
More information about the xorg