Skip to content

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.

Transform section in the tools panel


Flip — Shift+H / Shift+V

ButtonHotkeyEffect
Flip HorizontalShift+HMirror left ↔ right
Flip VerticalShift+VMirror top ↔ bottom

Works on any rectangular region. The flip is exact (no anti-aliasing).

Rotate 90° — Shift+R / Shift+Alt+R

ButtonHotkeyEffect
Rotate CWShift+R90° clockwise
Rotate CCWShift+Alt+R90° 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)

Free transform with on-canvas handles

  • Four corner handles + four mid-side handles drive scale. By default each axis is independent; hold Shift while dragging a handle for uniform scale.
  • Rotation handle floats above the top edge — drag it to rotate. Hold Shift to 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).
  • Enter commits, Esc cancels (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, not Ctrl+T — Chrome reserves Ctrl+T for "new tab" and JavaScript can't preventDefault it.

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 / .

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 setPixel no-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.

Motestack is a personal hobby project. The editor and these docs ship under no warranty — back up your `.mstack` files.