I have submitted a bug (#84145) and a couple of patches about pixel
rounding when drawing straight lines. The debate in the bugzilla
comments seem to be about to turn into a design argument about
subpixel positioning, which I think it would be more convienient to
have through a mailing list than a bug-tracking system.
The current status of the Gimp:
1. The position for a mouse button press is converted to a
floating-point value i such a way that the FP coordinates
refer to the upper-left corner of the area on the image
that is covered by the actual display pixel the mouse is
pointing to (with the displayed zoom and all that).
2. The paint tools (pencil, paintbrush, eraser, & friends)
simply use these floating-point coordinates for the center
of the brush.
3. Consequence of (1) and (2): When one paints a single click
with the paintbrush and a 1x1 brush in 1:1 zoom mode, what one
actually gets thanks to brush subsampling is a block of four
image pixels each being painted by 25%.
4. The same floating-point coordinates are used as endpoints of the
lines that are drawn when Shift is pressed.
5. For the preview line, the endpoints are rounded to nearest pixel
centers (which can be easily seen in zooms greater than about
500%), but this rounding is not performed when the paintcore
actually draws the line.
(There's another bug with the preview lines, but that is on the
order of one display pixel, not an image pixel).
6. As a consequence of (1) and (4), SW-NE lines drawn in 1:1 zoom
will get displaced by one pixel to the NW relative to the ideal
line between of the centers the user actually clicks on.
7. As a consequence of (1) and (5), the user does not always get the
line he is hoping for when he tries to draw a line in highly zoomed
mode (because the preview line does not look like the subpixel
position of the mouse is important when the button is clicked).
Here are some opinions about this:
a. The current behavior is clearly not internally inconsistent.
Something has to be done. We need some kind of consensus about what
"something" actually is, though.
b. I think of (1) as a bug in and of itself. The FP-coordinates that a
mouse position is translated into should be the coordinates of the
image point beneath the *center* of the display pixel. Would
anything break if this is fixed generally? I.e., does anyone depend
on the ability to point the mouse exactly on an image-pixel
c. The painting tools that do not subsample their brush will instead
round the brush center to the nearest pixel center each time a
brush "dab" is drawn. There seems to be little argument that the
also ought to round the endpoints of a straight line to pixel
centers before computing the intermediate points on the line.
d. Apparently there are people who want to be able to draw straight
lines between non-pixel-centers with the tools that do subsample
e. On the other hand, I personally think it is also important to be
able to draw anti-aliased lines between image-pixel centers without
having to succumb to finger cramps because the *display* pixel
smack in the middle of the desired image-pixel must be hit
precisely in with a pointing device. Some mice are a pain to
position more precisely than 2-3 pixels, and exactly a zoom mode is
what one would hope could mitigate that for precision editing.
f. Possible ways to reconcile (d) with (e) would include
- Adding a tool option that says whether line endpoints (and even
non-shift keypresses?) get rounded to pixel centers or not.
But down that way lies madness, or what?
- Defining a modifier key (meta?) to mean "round mouse positions
to image-pixel center". Which would mean that to draw a
15-degree-constrained straight line between pixel centers one
would need holding down *three* modifiers.
Both these designs seem to be somewhat lacking in elegance.
Henning Makholm "What a hideous colour khaki is."
Gimp-developer mailing list