Transforms
Flip, rotate, and free-form transform pixels. All transforms operate on the active selection if one exists, otherwise on the whole active layer. Each transform is a single undo entry; floating selections are auto-committed first.
Where to find it
Tools panel → Transform — four icon buttons + a "Free Rotate / Scale…" link, plus the floating Maximize icon on the SelectionToolbar when a selection is active.
Flip — Shift+H / Shift+V
| Button | Hotkey | Effect |
|---|---|---|
| Flip Horizontal | Shift+H | Mirror left ↔ right |
| Flip Vertical | Shift+V | Mirror top ↔ bottom |
Works on any rectangular region. The flip is exact (no anti-aliasing).
Rotate 90° — Shift+R / Shift+Alt+R
| Button | Hotkey | Effect |
|---|---|---|
| Rotate CW | Shift+R | 90° clockwise |
| Rotate CCW | Shift+Alt+R | 90° counter-clockwise |
Requires a square area — either the selection bounding rect must be square, or the canvas itself must be square. If you try with a non-square area you get an alert and the operation is cancelled. For non-square rotates, use Free Rotate below.
The 90° rotation is exact (pixel-perfect, no resampling) — preferred over Free Rotate at 90° for that reason.
Free Rotate / Scale — Shift+T
Press Shift+T (or click the Maximize icon on the SelectionToolbar, or "Free Rotate / Scale…" in the Tools panel) to enter transform mode. You get two coupled UIs that share the same session — switch between them freely:
On-canvas handles (default)
- Four corner handles + four mid-side handles drive scale. By default each axis is independent; hold
Shiftwhile dragging a handle for uniform scale. - Rotation handle floats above the top edge — drag it to rotate. Hold
Shiftto snap to 45° increments. - The floating bbox grows freely as you transform; pixels rotated or scaled outside the original rect are preserved in the floating buffer (not clipped at the source).
Entercommits,Esccancels (reverts to the pristine snapshot at the original position). Clicking outside the floating bbox also auto-commits. Switching tools mid-session auto-commits too, so the open undo stroke can't orphan.
The shortcut is
Shift+T, notCtrl+T— Chrome reservesCtrl+Tfor "new tab" and JavaScript can'tpreventDefaultit.
Numeric dialog (for precision)
The Free Rotate / Scale dialog is still available and shares state with the handles — open it mid-session and the angle / scale fields show the live values instead of resetting to 0° / 1×.
Controls:
- Angle — slider from −180° to +180°, with quick-pick presets
−90 / −45 / 0 / 45 / 90 - Scale — 0.1× to 4×, with presets
0.5 / 0.75 / 1 / 1.5 / 2
Both transforms compose: scale first, then rotate.
Sampling and quality
Nearest-neighbour by design. Pixel art doesn't tolerate the smearing that bilinear/bicubic produce; you keep crisp pixel boundaries at the cost of some shape distortion at non-90° angles.
The transform always re-renders from the immutable source snapshot that's taken when the session opens — drag through 90 × 1° rotations and you get the same output as a single 90° rotation, with no nearest-neighbour accumulation. Treat free rotation as a starting point — clean up the result by hand for production-quality results.
Limits
- Pixels rotated or scaled outside the canvas (not the bbox — the actual project canvas) are silently dropped on commit, because
setPixelno-ops out of bounds. - The new bbox is capped at 64× the canvas area — runaway scales that would balloon memory are refused.
Tips
- For rotations of exactly 90/180/270°, prefer Rotate CW / CCW (pixel-perfect) over Free Rotate.
- If you want to rotate an asymmetric region by 90°, select the rect first so the bounding box is exactly the square you need.
- Free transform respects the selection mask shape — pixels outside the lasso silhouette stay transparent in the output, even if they're inside the rect bounds.
- For large rotations, plan to clean up jaggies on the diagonals manually with the Pencil afterward.
Related
- Selection — make a non-rectangular selection to constrain a transform
- Drawing tools — for cleaning up free-transform results
- Shape tools