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 @@
+
**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 `