The canvas
no pictures
Canvas · 1200 × 900zoom 100%
Layers · top first
No pictures yet. Drop some on the left, and they will appear here in the order they are painted.
Three numbers where there used to be one. The readout this replaces added up each picture’s area and divided by the canvas: measured on four pictures it printed 36.0% whether they were stacked one on top of another (really 11.9% covered), spread out with no overlap (31.8%), or dragged completely off the canvas (0%). One number for three different collages, because it never looked at where anything was. The last card is that same sum, kept beside the measurement so the difference is a number rather than an argument.
Which arrangement gives these pictures the most canvas
no pictures
Every row below is laid out on the real canvas and measured, because a grid cell is not filled by a picture that does not share its shape. The batch table this replaces printed a coverage column from cell areas alone, with no picture aspect ratio anywhere in the calculation.
The grid, and what it leaves
Padding is the margin outside the block of cells; gap is the space between them. Both come out of the same canvas, so a large gap on a small canvas can drive a cell negative — the arrangement is refused with the numbers that caused it rather than drawn inside out.
One number for three different collages
four pictures, three arrangements
The readout this replaces summed each picture’s area and divided by the canvas. It never looked at where anything was, so two pictures stacked exactly on top of each other counted twice, and a picture dragged off the edge counted in full. The three panels below are not a picture of that: they are laid out and measured here, now, by the same code the studio runs.
Undo could never reach the start
measured on the shipped page
Every action saved the state it had just produced rather
than the one before it — pushUndo() ran after the
change, everywhere. So the stack held the state you were already in, and
the most recent step could never be taken back. Five one-pixel nudges
and five undos:
The first undo appeared to do nothing, because it restored the state the last action had just created. And a deleted picture never came back at all: undo re-applied saved properties onto layers that still existed, and could not re-create one that had been removed — three pictures, delete, undo, still two. Clear all had the same shape, which made it permanent. What replaces it records the state before each change and restores the whole layer list, so a removed picture comes back with the step that removed it.
What the export actually contained Fixed
The render path drew the pictures, the rule-of-thirds guides, the
selection rectangle, the four corner handles and the chequerboard
that means “nothing here” onto one canvas — and
then handed that same canvas to
toBlob(). So the editing chrome went into the file,
and ticking transparent background produced a PNG with no
transparency in it at all. Measured by driving the shipped page,
one picture on a 1200 × 900
canvas:
This one was found late, while rebuilding the parts that were thought to be sound — which is why the note above says most of the tool was fine and this panel says one of the three things it was most trusted for was not. What replaces it draws the content in one function and the chrome in another: the screen gets both, the file gets the first, and the coverage figure is read off the first as well, so what is measured is what you download.
Bootstrap coverage confidence interval Withdrawn
A bootstrap resamples observed data to estimate how much a statistic would vary. This read no data at all. It chose a column count uniformly at random, multiplied the padding and gap by a random factor between 0.5 and 1.5, evaluated a closed-form cell area, and reported the 2.5th and 97.5th percentiles of the result as a “95% confidence interval”. The interval described the range the tool had chosen to randomise over — nothing about the pictures on the canvas. Run on the shipped page:
The same answer three times, including for a canvas with nothing on it, because the collage was never an input. Widening the randomisation range would have widened the “confidence”, which is not something a confidence interval can do. The Efron (1979) citation goes with it: a real method named beside a routine that does not perform it lends that routine the method’s authority.
Batch layout analysis Rebuilt
It took a JSON array of hypothetical layouts and printed a coverage column for each, from the same sum-of-cell-areas formula — so the same failures, applied to layouts that do not exist yet, and with no picture aspect ratio in the calculation at all.
What is worth keeping from it is a real question: which grid gives these pictures the most canvas? That is answerable by laying each one out and measuring it, and it is now the Layout tab rather than a table of guesses.
What stays Unchanged
Nearly all of it, and the parts that matter for making a collage:
- the Canvas 2D drawing path — transform, rotate, scale, composite — which is correct, and the PNG and JPEG encoding that rides on it. What the export was given to encode is the part that changed;
- the affine transform arithmetic under Reference, which is correct and is what the tool actually does;
- drag, resize from a corner, rotate, snap-to-grid, the centre and rule-of-thirds guides, layer order, lock and hide;
- session save and reload as JSON.
The engine was never short of a way to draw. It was short of any statement about which of its numbers had looked at the canvas.
Where each number comes from
Two entries that are gone rather than reclassified
What leaves this page
1200 × 900
The export is the canvas, drawn again at the scale you choose. Anything hanging past the edge is not in it — which is why the studio reports off-canvas area separately rather than folding it into a coverage figure.
A session file records where every picture sits, how it is scaled and rotated, and the canvas settings. It does not contain the pictures: it is a description, and it needs the same files on hand to reopen. That is said here rather than discovered on the day it matters.
The reading that goes with it
Saved beside the image if you want it, so a collage handed to somebody else carries what was measured about it — and what was not:
No score, and no confidence interval. The page this replaces wrote a bootstrap CI into its research panel for a canvas it had not read; a reading that carries three measurements and names what it does not hold is a smaller claim and a true one.
Sources
Unusually for these rebuilds, the citations on the page being replaced were accurate. The Canvas 2D, PNG and JPEG entries describe what the tool genuinely does, and the affine transform arithmetic below is what the render path actually runs. They are carried across unchanged; what changed is what the research panel claimed on top of them.
Five of the six run, and they always did. The sixth is the one that mattered: a real method named beside a routine that did not perform it lends the routine the method’s authority, and a reader has no way to tell from the page which of the two they are looking at. A citation beside a feature is a claim about the code.
The arithmetic
Written once and used by both the drawing and the measuring, so the two cannot disagree about where a picture is.