docs: a branding folder, and the three marks are not interchangeable

Shift is the logo, Guru is the icon, SchCotie is the mascot, and the difference
between them is not stylistic. An icon works once, at one size, in one state. A
mascot has to be able to *do* things -- confused, pleased, asleep, seen from
behind -- which is why it costs more and is drawn last. Written down because
this is exactly the kind of decision that gets re-derived badly.

Assets/ becomes docs/branding/, which also fixes two things:

  * Filenames had spaces in them, so every reference needed quoting. They are
    lowercase and hyphenated now.
  * Assets/ held hand-written SVG and generated PNG in one directory, which is
    the one rule docs/guides/layout.md states.

The guide records what was previously only in people's heads:

  * The constraint everything answers to -- include/logo.h is a 128x128
    single-channel coverage mask, so a mark has to survive as a solid shape in
    one colour and be recognisable at 24 px. Colour is the last decision, never
    the first.
  * Guru's purple is load-bearing. PSOGM_BG #4B1D9A is deliberately not the
    accent #7C5CFF, and theme.h's rule is that the full-bleed purple belongs
    entirely to failure. If Guru appears in accent violet on a sticker, the deep
    purple stops meaning "the machine stopped" -- and it is the only colour in
    the system that means anything.
  * Why shift-mask.svg is a separate file from shift.svg. mklogo.py reads ink as
    (255 - luminance) * alpha, so tones survive as coverage and the relationship
    inverts: darkest here is brightest on screen. Copying the violet fills would
    light the object from below.
  * Why a raster is committed beside its SVG. inkscape is not a build
    prerequisite, so requiring a vector rasteriser would break the build on most
    hosts for a file that changes about once a year.
  * That the BSD daemon is copyrighted and SchCotie must be drawn from the
    concept rather than from Beastie. A daemon is a Greek daimon and a Unix
    background process; neither is ownable. The pitchfork, the sneakers and that
    face are.

Format rule: SVG, or PNG at high resolution with no lossy compression, nothing
else. SVG is the source of truth for every mark and a raster is generated from
it, never edited.

include/logo.h regenerates byte-identical from the new path -- only the source
comment differs. The two old wordmark SVGs were deleted outside this session and
are left deleted; their PNGs are kept as superseded-*.png for reference.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VQ7Qx8E1q1M1bbCq8QLHS2
This commit is contained in:
Nexoniarz 2026-09-12 18:19:09 +02:00
commit d73985633b
15 changed files with 196 additions and 277 deletions

View file

@ -1,138 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="1920"
height="1080"
viewBox="0 0 1920 1080"
version="1.1"
id="svg1"
inkscape:version="1.4.4 (dcaf3e7, 2026-05-05)"
sodipodi:docname="SchOS Full Logo.svg"
inkscape:export-filename="SchOS Full Logo.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#000000"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="0.68489583"
inkscape:cx="960"
inkscape:cy="516.13688"
inkscape:window-width="1920"
inkscape:window-height="1009"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="g8" />
<defs
id="defs1">
<rect
x="-11.054408"
y="184.24013"
width="818.02616"
height="644.84044"
id="rect9" />
<linearGradient
id="linearGradient2"
inkscape:collect="always">
<stop
style="stop-color:#c4c4c4;stop-opacity:1;"
offset="0"
id="stop2" />
<stop
style="stop-color:#949494;stop-opacity:1;"
offset="0.20117648"
id="stop4" />
<stop
style="stop-color:#454545;stop-opacity:1;"
offset="0.50764704"
id="stop5" />
<stop
style="stop-color:#808080;stop-opacity:1;"
offset="0.78088236"
id="stop9" />
<stop
style="stop-color:#363636;stop-opacity:1;"
offset="1"
id="stop3" />
</linearGradient>
<linearGradient
id="linearGradient5"
inkscape:collect="always">
<stop
style="stop-color:#c9c9c9;stop-opacity:1;"
offset="0"
id="stop6" />
<stop
style="stop-color:#636363;stop-opacity:1;"
offset="0.5"
id="stop8" />
<stop
style="stop-color:#a2a2a2;stop-opacity:1;"
offset="1"
id="stop7" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5"
id="linearGradient7"
x1="354.53467"
y1="585.88361"
x2="968.30945"
y2="585.88361"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.9035284,0,0,1.9035284,85.366084,-529.36246)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2"
id="linearGradient3"
x1="502.47748"
y1="461.89429"
x2="822.14758"
y2="730.12933"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.9035284,0,0,1.9035284,85.366084,-529.36246)" />
</defs>
<g
inkscape:label="logo"
inkscape:groupmode="layer"
id="layer1"
transform="matrix(0.9235878,0,0,0.9235878,-243.88631,0.4743235)">
<g
id="g8"
inkscape:label="SmallLogo">
<g
id="text1"
style="font-size:426.811px;line-height:0.8;font-family:miracode;-inkscape-font-specification:miracode;text-align:center;text-anchor:middle;fill:url(#linearGradient3);stroke-width:22.2296;paint-order:markers fill stroke"
aria-label="Sch&#10;OS"
inkscape:label="1">
<path
d="m 1163.8119,274.38449 10.3739,10.37388 v 14.81982 l -10.3739,10.37388 h -7.4099 -7.4099 -40.0135 -47.4235 -40.0135 l -29.63964,29.63965 29.63964,29.63966 h 40.0135 40.0136 7.4099 7.4099 l 5.1869,5.18694 5.187,5.18694 37.0495,37.04956 5.187,5.18694 5.1869,5.18694 v 7.40991 7.40992 40.01353 40.01353 7.40991 7.40992 l -5.1869,5.18694 -5.187,5.18694 -37.0495,37.04956 -5.187,5.18694 -5.1869,5.18694 h -7.4099 -7.4099 -40.0136 -40.0135 -7.4099 -7.4099 l -5.187,-5.18694 -5.18689,-5.18694 -37.04957,-37.04956 -5.18694,-5.18694 -5.18694,-5.18694 v -14.81983 l 10.37388,-10.37388 h 14.81983 l 5.18694,5.18694 5.18694,5.18694 37.04955,37.04957 h 40.0135 40.0136 l 37.0495,-37.04957 v -40.01353 -40.01353 l -37.0495,-37.04957 h -40.0136 -40.0135 -7.4099 -7.4099 l -5.187,-5.18694 -5.18689,-5.18694 -37.04957,-37.04956 -5.18694,-5.18694 -5.18694,-5.18694 v -14.81983 l 5.18694,-5.18694 5.18694,-5.18694 37.04957,-37.04956 5.18689,-5.18694 5.187,-5.18694 h 7.4099 7.4099 40.0135 47.4235 40.0135 7.4099 z m 284.5405,237.11722 10.3738,10.37388 v 14.81983 l -5.1869,5.18694 -5.1869,5.18694 -37.0496,37.04956 -5.187,5.18694 -5.1869,5.18694 h -7.4099 -7.4099 -40.0136 -40.0135 -7.4099 -7.4099 l -5.1869,-5.18694 -5.187,-5.18694 -37.0496,-37.04956 -5.1869,-5.18694 -5.1869,-5.18694 v -7.40992 -7.40991 -40.01353 -40.01353 -7.40992 -7.40991 l 5.1869,-5.18694 5.1869,-5.18694 37.0496,-37.04956 5.187,-5.18694 5.1869,-5.18694 h 7.4099 7.4099 40.0135 40.0136 7.4099 7.4099 l 5.1869,5.18694 5.187,5.18694 37.0496,37.04956 5.1869,5.18694 5.1869,5.18694 v 14.81983 l -10.3738,10.37388 h -14.8199 l -5.1869,-5.18694 -5.187,-5.18694 -37.0495,-37.04957 h -40.0136 -40.0135 l -37.0495,37.04957 v 40.01353 40.01353 l 37.0495,37.04957 h 40.0135 40.0136 l 37.0495,-37.04957 5.187,-5.18694 5.1869,-5.18694 z m 94.8466,-237.11722 10.3739,10.37388 v 7.40991 7.40991 40.01353 47.42345 47.42344 4.44595 l 11.8558,-11.85586 5.187,-5.18694 5.1869,-5.18694 37.0496,-37.04956 5.1869,-5.18694 5.1869,-5.18694 h 7.41 7.4099 32.6036 7.4099 7.4099 l 5.187,5.18694 5.1869,5.18694 37.0496,37.04956 5.1869,5.18694 5.1869,5.18694 v 7.40991 7.40992 40.01353 47.42344 40.01354 7.40991 7.40991 l -10.3738,10.37388 h -14.8199 l -10.3738,-10.37388 v -7.40991 -7.40991 -40.01354 -47.42344 -40.01353 l -37.0496,-37.04957 h -32.6036 l -37.0496,37.04957 -5.1869,5.18694 -5.187,5.18694 -37.0495,37.04956 v 40.01353 40.01354 7.40991 7.40991 l -10.3739,10.37388 h -14.8198 l -10.3739,-10.37388 v -7.40991 -7.40991 -40.01354 -40.01353 -7.40991 -7.40991 -40.01354 -47.42344 -47.42345 -40.01353 -7.40991 -7.40991 l 10.3739,-10.37388 z"
id="path2"
inkscape:label="2" />
<path
d="m 1203.8253,615.8333 h 40.0136 7.4099 7.4099 l 5.1869,5.18694 5.187,5.18693 37.0495,37.04957 5.187,5.18694 5.1869,5.18694 v 7.40991 7.40992 40.01353 47.42344 47.42345 40.01353 7.40991 7.40992 l -5.1869,5.18694 -5.187,5.18693 -37.0495,37.04957 -5.187,5.18694 -5.1869,5.18694 h -7.4099 -7.4099 -40.0136 -40.0135 -7.4099 -7.4099 l -5.187,-5.18694 -5.1869,-5.18694 -37.0496,-37.04957 -5.1869,-5.18693 -5.1869,-5.18694 v -7.40992 -7.40991 -40.01353 -47.42345 -47.42344 -40.01353 -7.40992 -7.40991 l 5.1869,-5.18694 5.1869,-5.18694 37.0496,-37.04957 5.1869,-5.18693 5.187,-5.18694 h 7.4099 7.4099 z m 0,35.56758 h -40.0135 l -37.0496,37.04957 v 40.01353 47.42344 47.42345 40.01353 l 37.0496,37.04957 h 40.0135 40.0136 l 37.0495,-37.04957 v -40.01353 -47.42345 -47.42344 -40.01353 l -37.0495,-37.04957 z m 386.7973,-35.56758 10.3738,10.37387 V 641.027 l -10.3738,10.37388 h -7.41 -7.4099 -40.0135 -47.4235 -40.0135 l -29.6396,29.63965 29.6396,29.63966 h 40.0135 40.0136 7.4099 7.4099 l 5.1869,5.18694 5.187,5.18693 37.0496,37.04957 5.1869,5.18694 5.1869,5.18694 v 7.40991 7.40992 40.01353 40.01353 7.40991 7.40992 l -5.1869,5.18694 -5.1869,5.18693 -37.0496,37.04957 -5.187,5.18694 -5.1869,5.18694 h -7.4099 -7.4099 -40.0136 -40.0135 -7.4099 -7.4099 l -5.1869,-5.18694 -5.187,-5.18694 -37.0496,-37.04957 -5.1869,-5.18693 -5.1869,-5.18694 V 863.3244 l 10.3738,-10.37388 h 14.8199 l 5.1869,5.18694 5.187,5.18694 37.0495,37.04957 h 40.0135 40.0136 l 37.0495,-37.04957 v -40.01353 -40.01353 l -37.0495,-37.04957 h -40.0136 -40.0135 -7.4099 -7.4099 l -5.1869,-5.18694 -5.187,-5.18694 -37.0496,-37.04957 -5.1869,-5.18693 -5.1869,-5.18694 v -14.81983 l 5.1869,-5.18694 5.1869,-5.18694 37.0496,-37.04957 5.187,-5.18693 5.1869,-5.18694 h 7.4099 7.4099 40.0135 47.4235 40.0135 7.4099 z"
id="path3"
inkscape:label="1" />
</g>
<path
id="path1"
style="fill:none;stroke:url(#linearGradient7);stroke-width:67.0141;paint-order:markers fill stroke"
d="m 1895.0629,585.88361 c 0,304.12212 -246.5396,550.66179 -550.6618,550.66179 -304.1222,0 -550.66125,-246.53967 -550.66125,-550.66179 0,-304.12212 246.53905,-550.661802 550.66125,-550.661802 208.3753,0 389.7181,115.740002 483.2487,286.440342 42.9766,78.43538 67.4131,168.47469 67.4131,264.22146 z"
sodipodi:nodetypes="ssssss"
inkscape:label="2" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 8.5 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 23 KiB

View file

@ -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 # 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, # 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. # 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_PX = 128
logo: logo:

View file

@ -1,6 +1,6 @@
<div align="center"> <div align="center">
<img src="Assets/SchOS%20Full%20Logo.png" alt="SchOS" width="360"> <img src="docs/branding/superseded-full-logo.png" alt="SchOS" width="360">
**A 64-bit operating system, written from the metal up.** **A 64-bit operating system, written from the metal up.**

View file

@ -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. | | **[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. | | **[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: Plus two that belong to no category and apply to everything:
**[licensing.md](licensing.md)** — read it before copying anyone else's code in. **[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. | | [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. | | [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 ## history/ — why it is the way it is
| | | | | |

179
docs/branding/README.md Normal file
View file

@ -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 `<desc>` 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.

View file

Before

Width:  |  Height:  |  Size: 655 B

After

Width:  |  Height:  |  Size: 655 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Before After
Before After

View file

@ -1,6 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200" width="200" height="200"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200" width="200" height="200">
<title>SchOS — Shift, as an ink mask</title> <title>SchOS — Shift, as an ink mask</title>
<desc>SAME GEOMETRY AS "SchOS Shift.svg". Only the fills differ, and they are <desc>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 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 (255 - luminance) * alpha, so what is stored is coverage. The kernel then
composites that coverage in whatever include/theme.h says the accent is. composites that coverage in whatever include/theme.h says the accent is.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Before After
Before After

View file

@ -8,7 +8,7 @@
without it the slab has no thickness where it is widest, and the corner reads without it the slab has no thickness where it is widest, and the corner reads
as a hole rather than an edge. as a hole rather than an edge.
Geometry is shared with "SchOS Shift Mask.svg"; see that file.</desc> Geometry is shared with "shift-mask.svg"; see that file.</desc>
<!-- bottom slab --> <!-- bottom slab -->
<path fill="#3C2E85" d="M54 126 L158 126 L128 156 L24 156 Z"/> <path fill="#3C2E85" d="M54 126 L158 126 L128 156 L24 156 Z"/>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 86 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Before After
Before After

View file

@ -1,7 +1,7 @@
#pragma once #pragma once
// GENERATED by tools/mklogo.py -- do not edit. Run `make logo`. // 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 // 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 // solid logo. Whoever draws it picks the colour, so the palette stays in

View file

@ -1,5 +1,5 @@
#!/usr/bin/env python3 #!/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 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 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 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. 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 import sys, zlib, struct