[cairo] Cairo and ISO C++
Bill Spitzak
spitzak at gmail.com
Thu Jan 16 12:39:28 PST 2014
Emmanuel PACAUD wrote:
>> You cannot adjust all the strokes to the nearest pixel because this will
>> either cause identical objects to vary in size, or identical gaps
>> between objects to vary in size. Both look much uglier than
>> antialiasing.
>
> Well, that is more or less what we do in goffice, the graphing library
> of gnumeric, and it's not that ugly. All layout measurements are done in
> points, and we get crisp rendering whatever the zoom level is.
I just feel that it is better to have the application do this. For
instance in your sample output it might be better to preserve the
thickness of the bars when they don't touch. I also notice that you did
not adjust the vertical lines in the first sample and rendered them with
antialiasing instead.
In any case you are right, a cairo backend could adjust all paths before
rendering. An application doing something more intelligent would have no
problem taking this into account and may want to use it.
A scheme I think may work is to adjust paths by moving horizontal and
vertical tangents to the nearest integer, and all other parts by an
interpolation between the movement of the nearest two snapped parts. It
would also have to round line widths to an integer and offset strokes by
.5,.5 for odd integers. The biggest trick is to not add gaps or overlaps
when programs try to draw touching objects or place strokes inside or
outside objects, I think if you assume the program knows the line width
is 1 or larger that this can be made to work.
And it probably wants to adjust the transform of source images to the
nearest integer. It should do this even if there is rotation or scale,
because otherwise the image may jump slightly if it is animated.
More information about the cairo
mailing list