From c48651f2bc8596878a4362289d2da8b52d7efcca Mon Sep 17 00:00:00 2001 From: Tim <6703801+timzifer@users.noreply.github.com> Date: Thu, 10 Sep 2026 09:47:15 +0200 Subject: [PATCH] feat: dial and orbit, where the separator is the geometry MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A semantic version is separated by dots and a dash. These two renderers take that literally: each component gets a field of its own, and the field boundary is the punctuation. In dial the separator is an angle — four quadrants, and the spokes between them are the dots. In orbit it is a radius — four concentric rings, major innermost, read outwards in the order the version is written. Within a field the value is written in binary, one cell per bit, most significant first: outermost band in dial, first cell clockwise from noon in orbit. Binary rather than a tally because version components are unbounded and a tally stops being readable somewhere around sixteen. The field width is common to all four fields and rounded up to a whole nibble, so the mark reads as a table and cells can be counted in groups of four by eye. Both are ordered renderers, like cistercian: nothing is hashed, 1.4.2 and 1.4.3 differ by one cell, and the suite holds them to uniqueness rather than to the distance thresholds. Unlike cistercian they come with a decoder, so injectivity is demonstrated rather than argued — the round-trip test reads the number back out of the cells for values up to the full range of uint64. The unset cells are drawn faintly rather than left blank. With only the set bits shown, a small version lights a handful of cells at one end of its field and the rest of the mark is empty: no visible grid, nothing to count against, no way to tell which bit position a mark belongs to. The ghosts turn it into a form with boxes to tick, which is the difference between a mark that can be read and one that merely could be in principle. The prerelease field is the exception. It carries hash bits from the prerelease stream rather than a number, because there is no useful ordering over "rc.1" against "beta.2". The field says that this is a prerelease and which one, without pretending to be legible, and an empty field means a release — the distinction that actually matters at a glance. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01KwWthYNYf1egKNFrFS83Dm --- README.md | 23 ++- distinctness_test.go | 5 + docs/gallery/dial-1.4.2.svg | 10 ++ docs/gallery/dial-family.png | Bin 0 -> 11684 bytes docs/gallery/dial-sheet.png | Bin 0 -> 44999 bytes docs/gallery/orbit-1.4.2.svg | 9 + docs/gallery/orbit-family.png | Bin 0 -> 7801 bytes docs/gallery/orbit-sheet.png | Bin 0 -> 32587 bytes render_codex.go | 312 ++++++++++++++++++++++++++++++++++ render_codex_test.go | 161 ++++++++++++++++++ 10 files changed, 519 insertions(+), 1 deletion(-) create mode 100644 docs/gallery/dial-1.4.2.svg create mode 100644 docs/gallery/dial-family.png create mode 100644 docs/gallery/dial-sheet.png create mode 100644 docs/gallery/orbit-1.4.2.svg create mode 100644 docs/gallery/orbit-family.png create mode 100644 docs/gallery/orbit-sheet.png create mode 100644 render_codex.go create mode 100644 render_codex_test.go diff --git a/README.md b/README.md index 146aef4..2b4fa7e 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,10 @@ Fields are length-prefixed, so `1.23.4` and `12.3.4` cannot collide. **2 — Parameter mapping.** A `Renderer` draws its parameters from those streams and decides what the mark *means*. This is the stage that determines whether -the library is useful. +the library is useful. Not every renderer hashes: `cistercian`, `dial` and +`orbit` encode the number itself, so the version can be read back out of the +mark. Those are marked `Ordered` and are held to uniqueness rather than to the +distance thresholds — being systematic is the point of them. **3 — Render primitives.** A `canvas.Canvas` turns drawing calls into SVG, pixels or terminal cells. This stage decides only how it looks. Every renderer @@ -134,6 +137,8 @@ blazon dist -r truchet | `truchet` | Truchet tiles. Arcs meet at cell edge midpoints, so the marks join across the grid into loops and labyrinths. | | `polar` | A bitmap in rings and sectors instead of rows and columns, mirrored across a fold from the archetype stream, with a centre device in the hole and a radial profile that varies ring by ring. | | `cistercian` | Medieval numerals: one stave per version component, four digits per stave. Legible — you can read the version back out of it. | +| `dial` | One quadrant per component, the value written in binary as radial bands. The separator is the angle: the spokes are the dots of the version string. | +| `orbit` | One ring per component, major innermost, the value written in binary as cells running clockwise from noon. The separator is the radius. | | `bishop` | The drunken bishop walk from OpenSSH randomart, for the terminal. | ## Output @@ -177,6 +182,14 @@ Family: `1.0.0` → `1.0.1` → `1.0.2` → `1.1.0` → `2.0.0` ![cistercian family strip](docs/gallery/cistercian-family.png) +### dial + +![dial across a version corpus](docs/gallery/dial-sheet.png) + +Family: `1.0.0` → `1.0.1` → `1.0.2` → `1.1.0` → `2.0.0` + +![dial family strip](docs/gallery/dial-family.png) + ### flowfield ![flowfield across a version corpus](docs/gallery/flowfield-sheet.png) @@ -185,6 +198,14 @@ Family: `1.0.0` → `1.0.1` → `1.0.2` → `1.1.0` → `2.0.0` ![flowfield family strip](docs/gallery/flowfield-family.png) +### orbit + +![orbit across a version corpus](docs/gallery/orbit-sheet.png) + +Family: `1.0.0` → `1.0.1` → `1.0.2` → `1.1.0` → `2.0.0` + +![orbit family strip](docs/gallery/orbit-family.png) + ### polar ![polar across a version corpus](docs/gallery/polar-sheet.png) diff --git a/distinctness_test.go b/distinctness_test.go index f2a2240..fb9e81e 100644 --- a/distinctness_test.go +++ b/distinctness_test.go @@ -35,6 +35,11 @@ var thresholds = map[string]blazontest.Thresholds{ // skips the distance thresholds for it and checks that no two versions // share a mark instead, which is why this entry is empty. "cistercian": {}, + // dial and orbit are ordered for the same reason: they write the version + // in binary, one field per component, with the field boundary standing in + // for the dot. + "dial": {}, + "orbit": {}, "bishop": { MinPatch: 14, MinMinor: 23, diff --git a/docs/gallery/dial-1.4.2.svg b/docs/gallery/dial-1.4.2.svg new file mode 100644 index 0000000..7175d3e --- /dev/null +++ b/docs/gallery/dial-1.4.2.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/docs/gallery/dial-family.png b/docs/gallery/dial-family.png new file mode 100644 index 0000000000000000000000000000000000000000..d92ff1694ad2872df682a5d83fd75706ddaf3b3b GIT binary patch literal 11684 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 XDw@!!2Vo4ifS0m@hJ3lKW$1qay=(r{ literal 0 HcmV?d00001 diff --git a/docs/gallery/orbit-1.4.2.svg b/docs/gallery/orbit-1.4.2.svg new file mode 100644 index 0000000..411ee8a --- /dev/null +++ b/docs/gallery/orbit-1.4.2.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/gallery/orbit-family.png b/docs/gallery/orbit-family.png new file mode 100644 index 0000000000000000000000000000000000000000..b9eb0fc332ba0d825e7c56f2e36b701c928c72d6 GIT binary patch literal 7801 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 z largest { + largest = v.Minor + } + if v.Patch > largest { + largest = v.Patch + } + n := bits.Len64(largest) + if n < codexMinBits { + n = codexMinBits + } + n = (n + 3) / 4 * 4 + if n > 64 { + n = 64 + } + return n +} + +// codexField is one component's cells, most significant first. +type codexField struct { + // present is false for the prerelease field of a released version, which + // is drawn as an empty field rather than as zero. + present bool + // noise marks a field whose bits are hashed rather than counted. + noise bool + cells []bool +} + +// codexFields lays out the four fields for a version. +func codexFields(p *Params, width int) [codexFieldCount]codexField { + v := p.Version() + var out [codexFieldCount]codexField + + for i, value := range []uint64{v.Major, v.Minor, v.Patch} { + out[i] = codexField{present: true, cells: codexCells(value, width)} + } + + if v.IsPrerelease() { + out[3] = codexField{ + present: true, + noise: true, + cells: codexCells(p.Pre().Uint(uint(width)), width), + } + } + return out +} + +// codexCells renders a value most-significant-bit first. +func codexCells(value uint64, width int) []bool { + cells := make([]bool, width) + for i := 0; i < width; i++ { + shift := uint(width - 1 - i) + if shift < 64 && value>>shift&1 == 1 { + cells[i] = true + } + } + return cells +} + +// codexValue reads a field back. It exists for the round-trip test: an ordered +// renderer's promise is that the number can be recovered, and the honest way +// to check that is to recover it. +func codexValue(cells []bool) uint64 { + var v uint64 + for _, on := range cells { + v = v<<1 | boolBit(on) + } + return v +} + +func boolBit(b bool) uint64 { + if b { + return 1 + } + return 0 +} + +// ghostAlpha is how strongly an unset cell is drawn. +// +// Drawing the empty cells at all is what makes these renderers readable. With +// only the set bits shown, a small version lights a handful of cells at one end +// of its field and the rest of the mark is blank: there is no visible grid, so +// there is nothing to count against and no way to see which bit position a +// mark belongs to. The ghosts turn the mark into a form with boxes to tick. +const ghostAlpha = 36 + +// fade returns a colour at the given alpha, premultiplied as image/color +// expects. +func fade(c color.Color, alpha uint8) color.RGBA { + r, g, b, _ := c.RGBA() + a := uint32(alpha) + return color.RGBA{ + R: uint8(r * a / 0xffff >> 8), + G: uint8(g * a / 0xffff >> 8), + B: uint8(b * a / 0xffff >> 8), + A: alpha, + } +} + +// codexInk maps a field to a palette slot. Major, minor and patch each get +// their own, so the eye can find the field it wants without counting. +func codexInk(field int) int { + if field >= 3 { + return 2 + } + return field +} + +// dialRenderer gives each component a quadrant, and writes its bits as radial +// bands. The separator is the angle: the spokes at the quadrant boundaries are +// the dots of the version string. +// +// Reading order is clockwise from noon, the way a clock is read: major in the +// first quadrant, then minor, patch and prerelease. Within a quadrant the +// outermost band is the most significant bit, so a larger number reaches +// further out. +type dialRenderer struct{} + +func (dialRenderer) Name() string { return "dial" } + +func (dialRenderer) Caps() Caps { return Caps{Ordered: true} } + +func (dialRenderer) Render(ctx *Context) error { + p := ctx.Params + cx, cy := ctx.Box.Center() + outer := ctx.Box.Min() / 2 + + width := codexWidth(p.Version()) + fields := codexFields(p, width) + + // The hub is where the spokes meet; the bands start outside it. + hub := outer * 0.15 + inner := outer * 0.24 + // A gap on each side of a quadrant boundary, so the separator reads as a + // separator rather than as two touching fields. + const quadrantGap = 0.06 + + bandStep := (outer - inner) / float64(width) + + for f, field := range fields { + if !field.present { + continue + } + // Quadrants run clockwise from noon. In canvas coordinates y grows + // downwards, so increasing angle is already clockwise. + base := -math.Pi/2 + math.Pi/2*float64(f) + a0 := base + math.Pi/2*quadrantGap + a1 := base + math.Pi/2*(1-quadrantGap) + + ink := ctx.Palette.Ink(codexInk(f)) + + // The grid first, then the bits on top of it. + for i := range field.cells { + band := width - 1 - i + r0 := inner + bandStep*float64(band) + canvas.AnnularSector(ctx.Canvas, cx, cy, r0, r0+bandStep*0.82, a0, a1) + } + ctx.Canvas.Fill(fade(ink, ghostAlpha)) + + any := false + for i, on := range field.cells { + if !on { + continue + } + any = true + // Cell 0 is the most significant bit and sits outermost. + band := width - 1 - i + r0 := inner + bandStep*float64(band) + canvas.AnnularSector(ctx.Canvas, cx, cy, r0, r0+bandStep*0.82, a0, a1) + } + if any { + ctx.Canvas.Fill(ink) + } + } + + // The spokes, drawn last so they sit on top of the bands: these are the + // punctuation. + for f := 0; f < codexFieldCount; f++ { + a := -math.Pi/2 + math.Pi/2*float64(f) + ctx.Canvas.MoveTo(cx+hub*math.Cos(a), cy+hub*math.Sin(a)) + ctx.Canvas.LineTo(cx+outer*math.Cos(a), cy+outer*math.Sin(a)) + } + ctx.Canvas.Stroke(ctx.Palette.Ink(0), outer*0.016) + + circle(ctx.Canvas, cx, cy, hub*0.6) + ctx.Canvas.Fill(ctx.Palette.Ink(0)) + + MarkPrerelease(ctx) + return nil +} + +// orbitRenderer gives each component a ring, and writes its bits as cells +// around it. The separator is the radius: crossing from one ring to the next +// is the dot. +// +// Major is innermost, so the version reads outwards in the order it is +// written. Each ring starts at noon and runs clockwise, most significant bit +// first; a tick at noon marks where to start reading. +type orbitRenderer struct{} + +func (orbitRenderer) Name() string { return "orbit" } + +func (orbitRenderer) Caps() Caps { return Caps{Ordered: true} } + +func (orbitRenderer) Render(ctx *Context) error { + p := ctx.Params + cx, cy := ctx.Box.Center() + outer := ctx.Box.Min() / 2 + + width := codexWidth(p.Version()) + fields := codexFields(p, width) + + // A hole in the middle, then one ring per field. + hole := outer * 0.22 + ringStep := (outer - hole) / codexFieldCount + // A share of each ring left blank, so the radius reads as a separator. + const ringGap = 0.22 + // A share of each cell left blank, so neighbouring bits stay countable. + const cellGap = 0.12 + + for f, field := range fields { + if !field.present { + continue + } + r0 := hole + ringStep*float64(f) + r1 := r0 + ringStep*(1-ringGap) + + step := 2 * math.Pi / float64(width) + ink := ctx.Palette.Ink(codexInk(f)) + + for i := range field.cells { + a0 := -math.Pi/2 + step*float64(i) + canvas.AnnularSector(ctx.Canvas, cx, cy, r0, r1, a0, a0+step*(1-cellGap)) + } + ctx.Canvas.Fill(fade(ink, ghostAlpha)) + + any := false + for i, on := range field.cells { + if !on { + continue + } + any = true + // Cell 0 is the most significant bit and starts at noon. + a0 := -math.Pi/2 + step*float64(i) + canvas.AnnularSector(ctx.Canvas, cx, cy, r0, r1, a0, a0+step*(1-cellGap)) + } + if any { + ctx.Canvas.Fill(ink) + } + } + + // The noon tick: without it a ring of bits has no beginning and the mark + // is decorative rather than readable. + ctx.Canvas.MoveTo(cx, cy-hole*0.55) + ctx.Canvas.LineTo(cx, cy-outer) + ctx.Canvas.Stroke(ctx.Palette.Ink(0), outer*0.02) + + MarkPrerelease(ctx) + return nil +} diff --git a/render_codex_test.go b/render_codex_test.go new file mode 100644 index 0000000..d7bb453 --- /dev/null +++ b/render_codex_test.go @@ -0,0 +1,161 @@ +package blazon + +import ( + "fmt" + "testing" +) + +func TestCodexWidth(t *testing.T) { + cases := []struct { + in string + want int + }{ + {"0.0.0", 8}, + {"1.4.2", 8}, + {"255.0.0", 8}, + {"256.0.0", 12}, + {"0.4095.0", 12}, + {"0.0.4096", 16}, + {"18446744073709551615.0.0", 64}, + } + for _, c := range cases { + v, err := ParseVersion(c.in) + if err != nil { + t.Fatalf("%s: %v", c.in, err) + } + if got := codexWidth(v); got != c.want { + t.Errorf("codexWidth(%s) = %d, want %d", c.in, got, c.want) + } + } +} + +func TestCodexWidthIsAWholeNibble(t *testing.T) { + for _, s := range []string{"0.0.0", "1.4.2", "300.12.5", "70000.0.0", "1.0.0-rc.1"} { + v, _ := ParseVersion(s) + if w := codexWidth(v); w%4 != 0 { + t.Errorf("codexWidth(%s) = %d, which is not a whole nibble", s, w) + } + } +} + +// TestCodexRoundTrip is the promise an ordered renderer makes, checked by +// keeping it: the number has to come back out of the cells. +func TestCodexRoundTrip(t *testing.T) { + versions := []string{ + "0.0.0", "0.0.1", "1.0.0", "1.4.2", "1.4.3", "12.4.7", + "300.12.5", "65535.1.0", "1.0.0-rc.1", "18446744073709551615.0.0", + } + for _, s := range versions { + v, err := ParseVersion(s) + if err != nil { + t.Fatalf("%s: %v", s, err) + } + p := NewParams(NewSeed(v), PolicyFamilyAmplified) + width := codexWidth(v) + fields := codexFields(p, width) + + got := Version{ + Major: codexValue(fields[0].cells), + Minor: codexValue(fields[1].cells), + Patch: codexValue(fields[2].cells), + } + if got != v.Core() { + t.Errorf("%s decoded to %s", s, got) + } + } +} + +func TestCodexMostSignificantBitComesFirst(t *testing.T) { + v, _ := ParseVersion("1.0.0") + p := NewParams(NewSeed(v), PolicyFamilyAmplified) + cells := codexFields(p, 8)[0].cells + + // The value 1 is the least significant bit, so only the last cell is lit. + for i, on := range cells { + want := i == len(cells)-1 + if on != want { + t.Fatalf("cell %d of major=1 is %v, want %v (cells %v)", i, on, want, cells) + } + } +} + +func TestCodexPrereleaseFieldOnlyForPrereleases(t *testing.T) { + release, _ := ParseVersion("1.0.0") + pre, _ := ParseVersion("1.0.0-rc.1") + + rf := codexFields(NewParams(NewSeed(release), PolicyFamilyAmplified), 8) + if rf[3].present { + t.Error("a released version has a prerelease field") + } + pf := codexFields(NewParams(NewSeed(pre), PolicyFamilyAmplified), 8) + if !pf[3].present { + t.Fatal("a prerelease has no prerelease field") + } + if !pf[3].noise { + t.Error("the prerelease field is not marked as hashed") + } + // The core fields must be untouched by the prerelease. + for i := 0; i < 3; i++ { + if fmt.Sprint(rf[i].cells) != fmt.Sprint(pf[i].cells) { + t.Errorf("field %d differs between 1.0.0 and 1.0.0-rc.1", i) + } + } +} + +// TestCodexPrereleasesDiffer guards the one thing the noise field is for. +func TestCodexPrereleasesDiffer(t *testing.T) { + seen := map[string]string{} + for _, s := range []string{"1.0.0-alpha.1", "1.0.0-alpha.2", "1.0.0-beta.1", "1.0.0-rc.1", "1.0.0-rc.2"} { + v, _ := ParseVersion(s) + f := codexFields(NewParams(NewSeed(v), PolicyFamilyAmplified), 8) + key := fmt.Sprint(f[3].cells) + if prev, dup := seen[key]; dup { + t.Errorf("%s and %s produced the same prerelease field", prev, s) + continue + } + seen[key] = s + } +} + +func TestCodexRenderersAreOrdered(t *testing.T) { + for _, name := range []string{"dial", "orbit"} { + r, ok := Lookup(name) + if !ok { + t.Fatalf("%s is not registered", name) + } + if !r.Caps().Ordered { + t.Errorf("%s does not declare itself ordered", name) + } + + o := Options{Renderer: name, Size: 128, Palette: PaletteMono, Background: BackgroundLight} + a, err := SVG("1.4.2", o) + if err != nil { + t.Fatal(err) + } + b, err := SVG("1.4.3", o) + if err != nil { + t.Fatal(err) + } + if string(a) == string(b) { + t.Fatalf("%s: 1.4.2 and 1.4.3 render identically", name) + } + // One bit apart in the patch field, so nearly the whole document is + // shared. A hashing renderer would share almost nothing. + if shared := commonPrefix(string(a), string(b)); shared < len(a)/3 { + t.Errorf("%s: only %d of %d bytes shared between 1.4.2 and 1.4.3", + name, shared, len(a)) + } + } +} + +func TestFadeIsPremultiplied(t *testing.T) { + opaque := Palette{}.Ink(0) // opaque black + got := fade(opaque, 128) + if got.A != 128 { + t.Errorf("alpha = %d, want 128", got.A) + } + // Premultiplied: no channel may exceed alpha. + if got.R > got.A || got.G > got.A || got.B > got.A { + t.Errorf("%+v is not premultiplied", got) + } +}