The canvas

no pictures

Canvas · 1200 × 900zoom 100%

The collage as it will be exported.

Layers · top first

No pictures yet. Drop some on the left, and they will appear here in the order they are painted.

What is on the canvas
canvas covered
0.0%
measured from the pixels
overlapping
0.0%
of the canvas, painted twice
outside the canvas
0.0%
of picture area, not exported
history
0
steps, back to the start
the old readout said
0.0%
sum of picture areas

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.