Gallery › Painting

Plum Branch in Ink

A sumi-e plum branch in which width is everything: each stroke narrows to a brush-lifted point.

Plum Branch in Ink, a sumi-e ink painting of a plum branch with blossoms, grass and a soft wash behind
Click the picture for the full-size render.

How it is made

Every stroke in the picture (trunk, forking branches, grass at the foot, even the background wash) is one centre line walked by artkit's walkpath and filled by paintkit's pkribbon. A pressure curve narrows each branch to a point, the grass blades taper independently at each end, and jitter gives the loaded-ink edge.

Details

Category
Painting
Libraries
artkit, paintkit
Added
2026-08-22
Built in
issue #40
Page size
700 × 900 points

Source

View source the whole program in a scrolling window, or read gallery/plum_branch.ps on GitHub. To draw it yourself, from a checkout of the repository:

pscat --page 700x900 gallery/plum_branch.ps
The first 40 of 195 lines of the source
%!PS-Adobe-3.0
%%Title: Plum Branch in Ink
%%BoundingBox: 0 0 700 900
%%EndComments

% A sumi-e style plum-blossom branch, built to make variable width the
% subject rather than decoration: every stroke of ink here -- trunk,
% forking branches, grass at the foot -- is a single bezier or turtle
% centerline handed to lib/paintkit.ps's `pkribbon` (issue #41), which
% walks it with lib/artkit.ps's `walkpath` (issue #40) and fills a
% ribbon whose width answers to a pressure curve, independent start/
% end tapers, and jitter, the way a loaded ink brush answers to how
% hard it's pressed and how it lifts off the paper. A plain `stroke`
% can only give a path one uniform width; that's exactly the
% limitation this piece exists to not have.
%
% Pressure profile: `{ dup mul 1 exch sub }` -- a quadratic ease-out
% (1 - t^2) -- stays near full width through the body of a branch and
% narrows quickly only near the very tip, so the ink reads as a branch
% tapering into a twig rather than a uniform line running out of paint.
% Every branch's own tip degrades to a point automatically (pkribbon's
% zero-half-width rule) once that curve reaches 0, so /EndCap /pointed
% never has to fight a drawn cap. Grass blades invert the idea:
% /StartTaper and /EndTaper (independent of Pressure) narrow both ends
% of a blade that never gets fully wide, since a blade of grass has no
% "body" the way a branch does.
%
% Seeded rand: same file, same ink, run to run.

(lib/artkit.ps) run
(lib/paintkit.ps) run
7 srand

/pb-ink      [0.16 0.12 0.10] def   % warm near-black sumi ink
/pb-paper    [0.97 0.94 0.87] def   % warm cream paper
/pb-wash     [0.91 0.87 0.78] def   % faint background wash, close to paper
/pb-blossom-rgb [0.82 0.30 0.42] def % the one accent: plum pink
/pb-bud      [0.64 0.20 0.33] def   % darker pink, unopened buds
/pb-seal     [0.72 0.14 0.14] def   % seal red