diff --git a/Assets/SchOS Full Logo.svg b/Assets/SchOS Full Logo.svg deleted file mode 100644 index b7bc5c7..0000000 --- a/Assets/SchOS Full Logo.svg +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Assets/SchOS Text Logo.svg b/Assets/SchOS Text Logo.svg deleted file mode 100644 index 74e56ff..0000000 --- a/Assets/SchOS Text Logo.svg +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Makefile b/Makefile index b279425..27cb7a9 100644 --- a/Makefile +++ b/Makefile @@ -1045,7 +1045,7 @@ qemu-schfs: esp $(BUILD)/schfs.img $(OVMF_CODE) $(OVMF_VARS) # The mark, not the wordmark. "SchOS Text Logo.png" is the text form and would # be illegible scaled to LOGO_PX; the small logo this used to name is gone, # replaced by the full logo, which is the same mark slightly redrawn. -LOGO_SRC = Assets/SchOS Shift Mask.png +LOGO_SRC = docs/branding/shift-mask.png LOGO_PX = 128 logo: diff --git a/README.md b/README.md index 3954901..5b401fd 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@
-SchOS +SchOS **A 64-bit operating system, written from the metal up.** diff --git a/docs/README.md b/docs/README.md index 7a5de3f..9d6e620 100644 --- a/docs/README.md +++ b/docs/README.md @@ -10,8 +10,10 @@ different questions and go stale at four different rates. | **[guides/](guides/)** | *How to work on it* | Imperative. Build it, test it, add to it. | | **[history/](history/)** | *Why it is the way it is* | Past tense. Bugs whose cause is not visible from the fix. | -Plus one rule that belongs to no category and applies to everything: -**[licensing.md](licensing.md)** — read it before copying anyone else's code in. +Plus two that belong to no category and apply to everything: +**[licensing.md](licensing.md)** — read it before copying anyone else's code in — +and **[branding/](branding/)**, which holds the marks and the rules for using +them. --- @@ -98,6 +100,12 @@ good chance it is in there. | [layout.md](guides/layout.md) | Repository map, and how to add a program or a port. | | [adding-a-driver.md](guides/adding-a-driver.md) | Writing one, binding it, publishing its class vtable. | +## branding/ — the marks + +| | | +|---|---| +| [README](branding/README.md) | Shift the logo, Guru the icon, SchCotie the mascot: what each is for, the colour rule, and why a raster is committed next to its SVG. | + ## history/ — why it is the way it is | | | diff --git a/docs/branding/README.md b/docs/branding/README.md new file mode 100644 index 0000000..c498293 --- /dev/null +++ b/docs/branding/README.md @@ -0,0 +1,179 @@ +# Branding + +Three marks, three different jobs. They are not interchangeable and the +difference is not stylistic. + +| | | | +|---|---|---| +| **Shift** | *the logo* | An abstract mark. Non-human, non-animal. Signs the system. | +| **Guru** | *the icon* | A pictogram. Denotes one state. Has a face; has no body. | +| **SchCotie** | *the mascot* | A character. Has a body, poses and expressions. | + +The distinction that decides everything else: **a mascot has to be able to +do things.** An icon works once, at one size, in one state. A character has to +work confused, pleased, asleep and from behind — which is why it costs more and +why it is drawn last. + +--- + +## The one constraint everything answers to + +**The kernel draws its mark as a 128×128 single-channel coverage mask.** +`include/logo.h` holds no colour at all — two pixels per byte, sixteen levels of +ink — and the kernel composites it in whatever `include/theme.h` says. + +So any mark that will end up there has to survive as **a solid shape in one +colour at 128 px, and be recognisable at 24**. That rules out hairlines, thin +rings and anything that depends on a gradient to read. The mark this replaced +failed on all three counts. + +Colour is therefore the *last* decision, never the first. Design the silhouette, +then colour it. + +--- + +## Shift — the logo + +`shift.svg` + +Three slabs, displaced: the layer diagram in +[../architecture/README.md](../architecture/README.md) as a solid object, and +the kernel's name (**SchIFT**) as a shape. + +- **Any colour.** This is a fact about the pipeline, not a preference — the + coverage mask carries none, so the loader draws it in metal and the kernel in + the theme accent, from the same bytes. +- **With or without a wordmark.** Set "SchOS" beside it in **Roboto Bold**, + which is already in the tree (`ports/Roboto`), already Apache-2.0, and already + in `NOTICE`. +- Non-human and non-animal, permanently. The character work belongs to + SchCotie; a logo that starts growing a face has taken the mascot's job. + +## Guru — the icon + +`guru.svg` + +The crash face. Mythic rather than cartoon — closer to a temple carving than a +character — square or nearly so, with an expression that stays in the +`:(` / `:|` register. + +**Purple, and only purple, and only here.** `theme.h` states the rule it +enforces: + +> normal states are calm and dark; only failure is loud. PSOGM keeps the +> full-bleed purple entirely to itself, which is what makes it mean something. + +That purple is `PSOGM_BG #4B1D9A`, and it is deliberately **not** the accent +`#7C5CFF`. If Guru ever appears in accent violet on a splash, a sticker or a +README header, the deep purple stops meaning *the machine stopped* — and it is +the only colour in the system that means anything at all. + +So: Guru does not leave the crash screen. + +## SchCotie — the mascot + +*Not drawn yet.* + +A daemon: **the process that works while nobody is watching.** The horns are a +pun on the word; the meaning is the background job that keeps running after you +have walked away — which is `schinit` supervising, restarting what dies, awake +at 3am. Patient and watchful rather than mischievous. + +Horns carry **X** — POSIX, Unix, X11 — one substitution reading three ways. + +Two constraints that follow from the section above. A thin X is two diagonal +strokes and dissolves at small sizes, so it wants to be **solid wedges with the +X notched out as negative space**: the horn silhouette survives downscaling and +the X appears as you get closer. And it needs a **turnaround** — front, side, +three-quarter, matching heights on shared construction lines — because a +character drawn once at one angle only ever works at that angle. + +### The licensing point, which is not optional here + +**The BSD daemon is copyrighted.** Marshall Kirk McKusick holds it and the terms +are not a free licence. A character that reads as "Beastie, but purple, with X +horns" is a derivative-work argument, and this mark would be in every image +SchOS ships, beside a `NOTICE` file this project has been careful about. + +The concept is not the problem. A daemon is a Greek *daimon* and a Unix +background process — neither is ownable. What belongs to Beastie is the +execution: the pitchfork, the sneakers, that red, that face, that pose. Horns, a +tail and a small imp are generic and thousands of years old. + +**Draw from the idea. Do not have a picture of Beastie open while you do it.** + +--- + +## Colour + +From `include/theme.h`, which is the source of truth. Nothing here restates a +value it does not already define. + +| | | | +|---|---|---| +| `SCH_BG` | `#0C0E13` | Ground. Near-black with a blue cast, because pure black reads as "switched off". | +| `SCH_FG` | `#E6E8EC` | Primary text | +| `SCH_DIM` | `#707784` | Secondary | +| `SCH_ACCENT` | `#7C5CFF` | The one accent. Shift, SchCotie, anything calm. | +| `PSOGM_BG` | `#4B1D9A` | **Failure only.** Guru's ground and nothing else's. | + +## File formats + +**SVG, or PNG at high resolution with no lossy compression.** Nothing else. + +No JPEG anywhere — a mark is flat colour with hard edges, which is the exact +case JPEG is worst at, and the ringing it leaves around an edge is permanent. +No screenshots of marks. No re-exports of re-exports: go back to the SVG. + +**SVG is the source of truth for every mark.** A raster is something generated +from it, never edited. + +## What is in here, and why a raster is committed + +``` +shift.svg the logo, in colour +shift-mask.svg the same geometry in greys -- see below +shift-mask.png rasterised from it, committed on purpose +uberblock.svg SchFS +guru.svg the crash icon +superseded-*.png the old wordmark, kept for reference only +``` + +The pipeline is three stages: + +``` +shift-mask.svg --(inkscape)--> shift-mask.png --(make logo)--> include/logo.h +``` + +**Both intermediates are committed, and that is deliberate.** `inkscape` is not +a build prerequisite — see [../guides/building.md](../guides/building.md) — so a +build that required a vector rasteriser would stop working on most hosts for the +sake of a file that changes about once a year. The PNG is regenerated by hand +when the SVG changes, and `make logo` turns it into the header. + +### Why the mask is a separate file from the logo + +`tools/python/mklogo.py` reads ink as `(255 - luminance) * alpha`, so **tones +survive as coverage** rather than being flattened — and the relationship +inverts: *darkest here is brightest on screen*. Copying the violet fills from +`shift.svg` would light the object from below. + +So `shift-mask.svg` is the same geometry in greys chosen for how the mask reads. +Two files sharing one geometry is a drift hazard; the `` in both says so. +If either is edited, edit both. + +--- + +## What this does not cover + +- **No trademark position.** These are marks the project uses, not marks anyone + has registered or defended. +- **No usage rules for third parties** — nothing says what someone else may do + with them. Worth writing before anything is published. +- **SchCotie does not exist.** Everything above it is a brief, not a + description. +- **Guru is drawn but not wired in.** `panic.c` still renders `:(` from + primitives, and there is a real argument for keeping it — see the note in that + file about being "legible as a mood without being a picture of anything". +- **No wordmark lockup is specified.** "Roboto Bold beside it" is not a spacing + rule, a size ratio or a clear-space margin, and it will want to be. diff --git a/Assets/SchOS Guru.svg b/docs/branding/guru.svg similarity index 100% rename from Assets/SchOS Guru.svg rename to docs/branding/guru.svg diff --git a/Assets/SchOS Shift Mask.png b/docs/branding/shift-mask.png similarity index 100% rename from Assets/SchOS Shift Mask.png rename to docs/branding/shift-mask.png diff --git a/Assets/SchOS Shift Mask.svg b/docs/branding/shift-mask.svg similarity index 94% rename from Assets/SchOS Shift Mask.svg rename to docs/branding/shift-mask.svg index 8e2483b..6bd38d0 100644 --- a/Assets/SchOS Shift Mask.svg +++ b/docs/branding/shift-mask.svg @@ -1,6 +1,6 @@ SchOS — Shift, as an ink mask - SAME GEOMETRY AS "SchOS Shift.svg". Only the fills differ, and they are + SAME GEOMETRY AS "shift.svg". Only the fills differ, and they are greys because they are not colours: tools/python/mklogo.py reads ink as (255 - luminance) * alpha, so what is stored is coverage. The kernel then composites that coverage in whatever include/theme.h says the accent is. diff --git a/Assets/SchOS Shift.svg b/docs/branding/shift.svg similarity index 94% rename from Assets/SchOS Shift.svg rename to docs/branding/shift.svg index 4bd2cbf..ed9d5ba 100644 --- a/Assets/SchOS Shift.svg +++ b/docs/branding/shift.svg @@ -8,7 +8,7 @@ without it the slab has no thickness where it is widest, and the corner reads as a hole rather than an edge. - Geometry is shared with "SchOS Shift Mask.svg"; see that file. + Geometry is shared with "shift-mask.svg"; see that file. diff --git a/Assets/SchOS Full Logo.png b/docs/branding/superseded-full-logo.png similarity index 100% rename from Assets/SchOS Full Logo.png rename to docs/branding/superseded-full-logo.png diff --git a/Assets/SchOS Text Logo.png b/docs/branding/superseded-text-logo.png similarity index 100% rename from Assets/SchOS Text Logo.png rename to docs/branding/superseded-text-logo.png diff --git a/Assets/SchFS Uberblock.svg b/docs/branding/uberblock.svg similarity index 100% rename from Assets/SchFS Uberblock.svg rename to docs/branding/uberblock.svg diff --git a/include/logo.h b/include/logo.h index a50dae5..0510b0e 100644 --- a/include/logo.h +++ b/include/logo.h @@ -1,7 +1,7 @@ #pragma once // GENERATED by tools/mklogo.py -- do not edit. Run `make logo`. -// source: Assets/SchOS Shift Mask.png +// source: docs/branding/shift-mask.png // // An ink-coverage mask, not colour: 0 is background and full scale is // solid logo. Whoever draws it picks the colour, so the palette stays in diff --git a/tools/python/mklogo.py b/tools/python/mklogo.py index 587d2a6..bf8650d 100644 --- a/tools/python/mklogo.py +++ b/tools/python/mklogo.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -"""Turn Assets/*.png into a C header the kernel can draw. +"""Turn docs/branding/*.png into a C header the kernel can draw. Why this exists rather than a PNG decoder in the kernel: the boot logo is one fixed image that changes about never, so decoding it at runtime would mean @@ -13,7 +13,7 @@ is ink -- which lets the kernel composite it in whatever the theme's accent happens to be, anti-aliased, at one byte per pixel. Storing RGB would be four times the size and would hardcode a colour into the kernel image. - python3 tools/mklogo.py "Assets/SchOS Small Logo.png" include/logo.h 128 + python3 tools/python/mklogo.py docs/branding/shift-mask.png include/logo.h 128 """ import sys, zlib, struct