Changelog

# Changelog

All notable changes to **epaper-image** are documented in this file. The project
follows [semantic versioning](https://semver.org/).

## v0.2.0

Adds linear-light previews of any size, and colour panels built at runtime from
measured inks. The converter now outputs ink codes only, which breaks the API.

**Panel output:** EL133UF1 frames change. Two cusp table entries move by one,
which reseeds the dither, so the frames differ pixel by pixel but look the same
on the panel. Grey and mono output is unchanged.

### Breaking changes

- `epi_converter_pop` writes `width` ink codes into a `uint8_t*`. Pack them for
  the panel with `epi_pack_row`, or pass them to `epi_preview_push`. Firmware
  streaming to a panel needs that call and a row buffer, and the converter's
  workspace shrinks by one row.
- `epi_output_t`, `EPI_OUT_*`, `epi_config_t.output` and `epi_output_row_size`
  are removed.
- A panel whose codes don't fit a packed format is rejected by `epi_pack_row`,
  not at converter init.
- `epi_grey_panel_init` takes a new `const char** reason`, which may be `NULL`.
  It gets a short static string on every `EPI_ERR_INVALID_ARG`.

### Added

- `epi_preview_*` reduces rows of ink codes to an RGB preview of any smaller
  size, averaging in linear light with integer weights, so the output is the
  same on every platform.
- `epi_pack_row`, `epi_pack_row_size` and `epi_pack_format_t` pack a row of ink
  codes for the panel.
- `epi_colour_panel_init` and `epi_colour_panel_size` build a colour panel from
  5 to 16 measured inks in caller storage, with no allocation or libm, and the
  same result on every target. This takes about 6 s on a 240 MHz ESP32-S3. An
  optional `epi_progress_fn_t` callback can yield to other tasks, or cancel,
  which returns the new `EPI_ERR_CANCELLED`.
- `convert` gains `--preview-scale`.

Init rejects inks whose nominal colours disagree with the measurements: a white
ink (the largest measured Y) whose nominal Y is below another ink's, or a black
ink (the smallest measured Y) whose nominal Y is above another ink's.

### Tools and packaging

- `panelgen` now runs the library's derivation, so a built-in panel equals the
  runtime panel from the same inks. It no longer needs numpy or scipy.
- The component package leaves out `.clang-format`, `.clang-format-ignore`,
  `.gitignore`, `docs/Doxyfile`, `docs/html` and `docs/xml`.

## v0.1.1

`epi_panel_t` can now be forward-declared, so a header can use it without
including `<epaper_image.h>`: `typedef struct epi_panel epi_panel_t;`. Its fields
and layout are unchanged, existing code still compiles, and panel output is
unchanged.

Also tidies the remaining American spellings in code comments and docs. The
public API was already British and doesn't change.

## v0.1.0

First release of epaper-image, a C11 library that converts images for e-paper
panels: streaming resampling, tone adjustment, palette matching and error
diffusion.

Built-in panels: EL133UF1 (Spectra 6) and GDEY075T7 (mono and 4 greys).