Skip to content

Coordinate spaces ​

SpaceRangeUsed by
image0..1 over the source after EXIF orientationredact, annotate
crop0..1 over the crop output rectanglesticker, frame, watermark
SourcePxpixels of the logical full resolutionstroke widths, font sizes, blur radii, frame thickness

The renderer knows the logical size and the actual buffer size at every stage and scales SourcePx values by their ratio. A 3 px stroke looks the same on a 2048 px working copy and on the 8000 px original. Pixelate cells snap to the logical grid so both show the same blocks. A cell is never smaller than 2 buffer pixels, because the mean of a one-pixel cell is the pixel itself. Below that size, the working copy shows larger blocks than the original.

Resize targets are absolute output pixels. A truth render produces them exactly, also above the source size when upscale is true. In preview mode they become a ratio, and a working copy is never upscaled.

The crop rectangle under rotation ​

The crop rectangle is normalised to the bounding box of the rotated source, not to the source itself: the output is rect × rotated bounding box, so the same rectangle covers more pixels the further the image is turned, and a rectangle that touches the box's edge takes in area outside the turned image, which fill paints.

The default crop tool therefore writes a new rectangle with every change of angle, and the log stays a plain crop.set with rect and rotation. With the slider, the frame stays where it is on the stage and keeps its size in pixels while the image turns behind it; it then shrinks about its centre, aspect kept, until every corner lies inside the turned image, so turning back restores the original crop unless that shrink had to happen. With the 90° buttons, the crop turns with the image: the output is the previous output turned by a quarter. Handle drags stop at the turned image's edge for the same reason. The crop option outside: 'allow' lifts both constraints for a host that wants the painted area. A host that writes crop.set itself decides for itself.