app icon: owl with ear tufts (owner's ArtCraft drawing), Dock/taskbar/launcher wiring, palette docs
- assets/app-icon/: canonical SVG + light SVG, 1024 PNG, macOS runtime PNG, .icns, .ico, hicolor theme, LICENSE.txt and README (palette, geometry, provenance, regeneration). - packaging/icons.sh regenerates everything with resvg, iconutil and the new `cargo xtask ico`. - Native app sets the window icon (with_icon) and the Wayland app id; build.rs embeds the .ico and VERSIONINFO into filmcraft.exe on Windows (winresource, Windows-host build-dep only). - packaging/linux/ai.storyteller.filmcraft.desktop with Icon=ai.storyteller.filmcraft. - Web app: favicon.svg replaced by favicon.png from the same artwork; sidecars and ATTRIBUTION.md updated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No files matched your search
@@ -25,7 +25,22 @@ iconography, images or other Adobe assets; open licences only; every asset attri
|
||||
| `docs/images/filmcraft-scopes.png` | FilmCraft contributors | Original work: FilmCraft UI crop (scopes of a Charade (1963) frame, public domain) | MIT OR Apache-2.0 |
|
||||
| `docs/images/filmcraft-effects.png` | FilmCraft contributors | Original work: FilmCraft screenshot crop; NASA Earth Views (US Government work, public domain) | MIT OR Apache-2.0; footage public domain |
|
||||
| `docs/images/filmcraft-timeline.png` | FilmCraft contributors | Original work: FilmCraft UI crop; thumbnails from Night of the Living Dead (1968) and Carnival of Souls (1962), CC0 Chopin waveform | MIT OR Apache-2.0; film frames public domain |
|
||||
| `apps/filmcraft-web/web/favicon.svg` | FilmCraft contributors | Original work: web app icon (disc, sprocket ring, play triangle) drawn from basic SVG shapes | MIT OR Apache-2.0 |
|
||||
| `assets/app-icon/filmcraft.svg` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; canonical vector | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
|
||||
| `assets/app-icon/filmcraft-small.svg` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; lighter vector | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
|
||||
| `assets/app-icon/filmcraft-1024.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; 1024 px render | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
|
||||
| `assets/app-icon/filmcraft-macos-512.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; macOS runtime Dock icon (512 px) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
|
||||
| `assets/app-icon/filmcraft.icns` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; macOS .icns | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
|
||||
| `assets/app-icon/filmcraft.ico` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; Windows .ico (16-256 px) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
|
||||
| `assets/app-icon/hicolor/16x16/apps/ai.storyteller.filmcraft.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; Linux hicolor theme 16 px | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
|
||||
| `assets/app-icon/hicolor/24x24/apps/ai.storyteller.filmcraft.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; Linux hicolor theme 24 px | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
|
||||
| `assets/app-icon/hicolor/32x32/apps/ai.storyteller.filmcraft.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; Linux hicolor theme 32 px | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
|
||||
| `assets/app-icon/hicolor/48x48/apps/ai.storyteller.filmcraft.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; Linux hicolor theme 48 px | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
|
||||
| `assets/app-icon/hicolor/64x64/apps/ai.storyteller.filmcraft.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; Linux hicolor theme 64 px | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
|
||||
| `assets/app-icon/hicolor/128x128/apps/ai.storyteller.filmcraft.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; Linux hicolor theme 128 px | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
|
||||
| `assets/app-icon/hicolor/256x256/apps/ai.storyteller.filmcraft.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; Linux hicolor theme 256 px | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
|
||||
| `assets/app-icon/hicolor/512x512/apps/ai.storyteller.filmcraft.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; Linux hicolor theme 512 px | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
|
||||
| `assets/app-icon/hicolor/scalable/apps/ai.storyteller.filmcraft.svg` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; Linux hicolor theme scalable | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
|
||||
| `apps/filmcraft-web/web/favicon.png` | Brandon Thomas (FilmCraft owner) | Original work: FilmCraft app icon (owl with ear tufts), drawn by the owner in ArtCraft and vectorised; 128 px | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) |
|
||||
|
||||
## Golden test images
|
||||
|
||||
|
||||
@@ -1671,6 +1671,7 @@ dependencies = [
|
||||
"rfd",
|
||||
"serde_json",
|
||||
"winit",
|
||||
"winresource",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -5777,10 +5778,12 @@ version = "1.1.6+spec-1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "920602543f0911ab71da12c50d59701da54c196d1a2bf5cb4b75667f137a406a"
|
||||
dependencies = [
|
||||
"indexmap",
|
||||
"serde_core",
|
||||
"serde_spanned 1.1.1",
|
||||
"toml_datetime 1.1.1+spec-1.1.0",
|
||||
"toml_parser",
|
||||
"toml_writer",
|
||||
"winnow 1.0.4",
|
||||
]
|
||||
|
||||
@@ -5847,6 +5850,12 @@ dependencies = [
|
||||
"winnow 1.0.4",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml_writer"
|
||||
version = "1.1.2+spec-1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2"
|
||||
|
||||
[[package]]
|
||||
name = "tracing"
|
||||
version = "0.1.44"
|
||||
@@ -6967,6 +6976,16 @@ dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "winresource"
|
||||
version = "0.1.31"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0986a8b1d586b7d3e4fe3d9ea39fb451ae22869dcea4aa109d287a374d866087"
|
||||
dependencies = [
|
||||
"toml 1.1.6+spec-1.1.0",
|
||||
"version_check",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen"
|
||||
version = "0.57.1"
|
||||
|
||||
@@ -7,6 +7,10 @@
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<img alt="FilmCraft icon: an engraved owl on FilmCraft violet (#8b5cf6)" src="assets/app-icon/filmcraft-1024.png" width="128">
|
||||
</p>
|
||||
|
||||
<h1 align="center">FilmCraft</h1>
|
||||
|
||||
<p align="center">
|
||||
|
||||
|
After Width: | Height: | Size: 17 KiB |
@@ -0,0 +1,8 @@
|
||||
asset: favicon.png
|
||||
title: FilmCraft web app icon (favicon and loading image), 128 px
|
||||
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
|
||||
source: original work (drawn by the owner in ArtCraft, then vectorised)
|
||||
license: MIT OR Apache-2.0
|
||||
license-file: assets/app-icon/LICENSE.txt
|
||||
added: 2026-10-02 by Claude (agent) for Brandon Thomas
|
||||
notes: Rendered from assets/app-icon/filmcraft.svg with resvg by packaging/icons.sh. Replaces the earlier hand-drawn favicon.svg.
|
||||
@@ -1,16 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
|
||||
<!-- FilmCraft web icon: original work (a film reel ring with a play triangle). -->
|
||||
<circle cx="32" cy="32" r="30" fill="#14343a"/>
|
||||
<circle cx="32" cy="32" r="22" fill="none" stroke="#f0a24a" stroke-width="5"/>
|
||||
<g fill="#14343a">
|
||||
<circle cx="32" cy="10" r="2.2"/>
|
||||
<circle cx="32" cy="54" r="2.2"/>
|
||||
<circle cx="10" cy="32" r="2.2"/>
|
||||
<circle cx="54" cy="32" r="2.2"/>
|
||||
<circle cx="16.4" cy="16.4" r="2.2"/>
|
||||
<circle cx="47.6" cy="47.6" r="2.2"/>
|
||||
<circle cx="16.4" cy="47.6" r="2.2"/>
|
||||
<circle cx="47.6" cy="16.4" r="2.2"/>
|
||||
</g>
|
||||
<path d="M26 21.5 L44 32 L26 42.5 Z" fill="#f4f1ea"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 689 B |
@@ -1,9 +0,0 @@
|
||||
asset: favicon.svg
|
||||
title: FilmCraft web app icon (favicon / install icon)
|
||||
author: FilmCraft contributors
|
||||
source: original work
|
||||
license: MIT OR Apache-2.0
|
||||
added: 2026-10-01 by FilmCraft contributors (Claude agent, M13 web app)
|
||||
notes: Hand-written SVG: a dark teal disc, an orange ring with eight sprocket dots and a play
|
||||
triangle, drawn from scratch from basic shapes. Not derived from any other product's
|
||||
icon.
|
||||
@@ -5,7 +5,7 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="color-scheme" content="dark">
|
||||
<title>FilmCraft</title>
|
||||
<link rel="icon" href="favicon.svg" type="image/svg+xml">
|
||||
<link rel="icon" href="favicon.png" type="image/png">
|
||||
<style>
|
||||
html, body { margin: 0; height: 100%; overflow: hidden; background: #1b1c1f; }
|
||||
canvas { position: absolute; inset: 0; width: 100%; height: 100%; display: block; }
|
||||
@@ -20,7 +20,7 @@
|
||||
</head>
|
||||
<body>
|
||||
<canvas id="filmcraft_canvas"></canvas>
|
||||
<div id="loading"><img src="favicon.svg" alt=""><div id="status">Loading FilmCraft…</div></div>
|
||||
<div id="loading"><img src="favicon.png" alt=""><div id="status">Loading FilmCraft…</div></div>
|
||||
<script type="module">
|
||||
import init, { start } from "./filmcraft_web.js";
|
||||
const t0 = performance.now();
|
||||
|
||||
@@ -5,6 +5,7 @@ version.workspace = true
|
||||
edition.workspace = true
|
||||
license.workspace = true
|
||||
default-run = "filmcraft"
|
||||
build = "build.rs"
|
||||
|
||||
[lints]
|
||||
workspace = true
|
||||
@@ -32,3 +33,7 @@ objc2-app-kit = { version = "0.3", default-features = false, features = ["std",
|
||||
objc2 = "0.6"
|
||||
# Same winit as eframe: macOS event-loop options (no app activation when driven by an agent).
|
||||
winit = { version = "0.30", default-features = false }
|
||||
|
||||
# Icon + VERSIONINFO for filmcraft.exe (build.rs); only needed when building on Windows.
|
||||
[target.'cfg(windows)'.build-dependencies]
|
||||
winresource = "0.1"
|
||||
@@ -0,0 +1,43 @@
|
||||
//! Windows only: embed the app icon and version info (VERSIONINFO) into `filmcraft.exe`, so it
|
||||
//! shows in Explorer, the taskbar, the Start menu and Alt-Tab.
|
||||
//!
|
||||
//! On every other target this does nothing (`winresource` is only a build-dependency on Windows
|
||||
//! hosts). A missing resource compiler is a warning, unless `FILMCRAFT_REQUIRE_WINRES=1` (for
|
||||
//! release builds) turns it into an error.
|
||||
|
||||
fn main() {
|
||||
println!("cargo:rerun-if-changed=build.rs");
|
||||
println!("cargo:rerun-if-changed=../../assets/app-icon/filmcraft.ico");
|
||||
println!("cargo:rerun-if-env-changed=FILMCRAFT_REQUIRE_WINRES");
|
||||
if std::env::var("CARGO_CFG_TARGET_OS").as_deref() != Ok("windows") {
|
||||
return;
|
||||
}
|
||||
windows::embed_resources();
|
||||
}
|
||||
|
||||
#[cfg(windows)]
|
||||
mod windows {
|
||||
pub fn embed_resources() {
|
||||
let mut res = winresource::WindowsResource::new();
|
||||
res.set_icon("../../assets/app-icon/filmcraft.ico")
|
||||
.set("ProductName", "FilmCraft")
|
||||
.set("FileDescription", "FilmCraft video editor")
|
||||
.set("LegalCopyright", "Copyright (c) the FilmCraft contributors. MIT OR Apache-2.0.")
|
||||
.set("OriginalFilename", "filmcraft.exe")
|
||||
.set("InternalName", "filmcraft");
|
||||
if let Err(e) = res.compile() {
|
||||
if std::env::var_os("FILMCRAFT_REQUIRE_WINRES").is_some() {
|
||||
panic!("embedding Windows resources failed: {e}");
|
||||
}
|
||||
println!("cargo:warning=filmcraft.exe built without icon/version resources: {e}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Cross-compiling for Windows from macOS or Linux: `winresource` is not available on this host.
|
||||
#[cfg(not(windows))]
|
||||
mod windows {
|
||||
pub fn embed_resources() {
|
||||
println!("cargo:warning=filmcraft.exe built without icon/version resources (cross-compiled from a non-Windows host)");
|
||||
}
|
||||
}
|
||||
@@ -25,6 +25,20 @@ use filmcraft_engine::autosave::{AutosaveConfig, default_data_dir};
|
||||
use filmcraft_ui_egui::FilmcraftApp;
|
||||
use serde_json::json;
|
||||
|
||||
/// Reverse-DNS app id: Linux `.desktop` file, hicolor icon name and Wayland app id.
|
||||
const APP_ID: &str = "ai.storyteller.filmcraft";
|
||||
|
||||
/// The window, Dock, taskbar and app-switcher icon (`assets/app-icon/`, regenerated by
|
||||
/// `packaging/icons.sh`). macOS gets the tile inside Apple's transparent margin so it matches the
|
||||
/// size of other Dock icons; Windows and Linux get the full-bleed tile.
|
||||
fn app_icon() -> egui::IconData {
|
||||
#[cfg(target_os = "macos")]
|
||||
let png: &[u8] = include_bytes!("../../../assets/app-icon/filmcraft-macos-512.png");
|
||||
#[cfg(not(target_os = "macos"))]
|
||||
let png: &[u8] = include_bytes!("../../../assets/app-icon/hicolor/256x256/apps/ai.storyteller.filmcraft.png");
|
||||
eframe::icon_data::from_png_bytes(png).unwrap_or_default()
|
||||
}
|
||||
|
||||
fn main() -> eframe::Result {
|
||||
app_nap::disable();
|
||||
let mut control_port: Option<u16> = std::env::var("FILMCRAFT_CONTROL_PORT").ok().and_then(|p| p.parse().ok());
|
||||
@@ -58,7 +72,10 @@ fn main() -> eframe::Result {
|
||||
.with_titlebar_shown(false)
|
||||
.with_title_shown(false)
|
||||
// Started for an agent (`--control`): open without taking the user's keyboard focus.
|
||||
.with_active(control_port.is_none()),
|
||||
.with_active(control_port.is_none())
|
||||
.with_icon(app_icon())
|
||||
// Wayland matches the window to `packaging/linux/ai.storyteller.filmcraft.desktop`.
|
||||
.with_app_id(APP_ID),
|
||||
event_loop_builder: agent_event_loop(control_port.is_some()),
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
FilmCraft app icon (filmcraft.svg and every file derived from it in this directory:
|
||||
filmcraft-small.svg, filmcraft-1024.png, filmcraft-macos-512.png, filmcraft.icns, filmcraft.ico,
|
||||
hicolor/, and apps/filmcraft-web/web/favicon.png).
|
||||
|
||||
Original artwork made for this project by the FilmCraft owner (Brandon Thomas) in ArtCraft, then
|
||||
vectorised. No third-party material. Licensed like the rest of FilmCraft, under either of
|
||||
|
||||
* Apache License, Version 2.0 (https://www.apache.org/licenses/LICENSE-2.0)
|
||||
* MIT license (https://opensource.org/licenses/MIT)
|
||||
|
||||
at your option.
|
||||
|
||||
Regenerate the derived files with packaging/icons.sh.
|
||||
@@ -0,0 +1,60 @@
|
||||
# FilmCraft app icon
|
||||
|
||||
**Creature:** an owl with ear tufts, in a frontal head-and-shoulders portrait. It is the template the
|
||||
other Crafting App icons follow.
|
||||
|
||||
## Palette
|
||||
|
||||
Exactly three colours:
|
||||
|
||||
| Colour | Hex | Used for |
|
||||
|---|---|---|
|
||||
| Ink | `#0b0b0c` | line work and the figure's contour |
|
||||
| Paper | `#efe9dc` | the figure (the owl) |
|
||||
| FilmCraft violet (app colour) | `#8b5cf6` | the full-bleed field behind the figure |
|
||||
|
||||
## Geometry and style
|
||||
|
||||
- A 512-unit viewBox tile, rounded square `rx=112`, with the app colour full bleed (no frame or border).
|
||||
- An engraving-style portrait in the owl-template framing: the top of the head near y 80–100, the
|
||||
eyes at about 40 % of the height, and the shoulders running off the bottom edge.
|
||||
- macOS renders (`filmcraft.icns`, `filmcraft-macos-512.png`) put the tile in Apple's grid (824 of
|
||||
1024 px, transparent margin). Windows, Linux and the web use the full-bleed tile.
|
||||
|
||||
## Provenance
|
||||
|
||||
The owner drew it in ArtCraft as a 2880 px engraving-style image. The original is kept in craftrules
|
||||
at `craftrules/assets/app-icons/filmcraft/source.png` (not in this repo). It was vectorised with
|
||||
craftrules `assets/logo-options/_tools/vectorize_tile.py`, which keys the drawing to the three-colour
|
||||
palette and traces the ink with potrace. Licence: [LICENSE.txt](LICENSE.txt) (MIT OR Apache-2.0).
|
||||
|
||||
## Files
|
||||
|
||||
| File | What |
|
||||
|---|---|
|
||||
| `filmcraft.svg` | canonical artwork, traced at 2048 px (about 1 MB) |
|
||||
| `filmcraft-small.svg` | lighter trace at 1024 px (about 450 KB), for when size matters |
|
||||
| `filmcraft-1024.png` | 1024 px render |
|
||||
| `filmcraft-macos-512.png` | runtime Dock icon on macOS (embedded by `apps/filmcraft/src/main.rs`) |
|
||||
| `filmcraft.icns` | macOS bundle icon (`CFBundleIconFile`) |
|
||||
| `filmcraft.ico` | Windows icon, 16–256 px (embedded in `filmcraft.exe` by `apps/filmcraft/build.rs`) |
|
||||
| `hicolor/<size>/apps/ai.storyteller.filmcraft.png`, `hicolor/scalable/…svg` | Linux icon theme, used by `packaging/linux/ai.storyteller.filmcraft.desktop` |
|
||||
|
||||
The web app's `apps/filmcraft-web/web/favicon.png` (128 px) comes from the same artwork.
|
||||
|
||||
## How the icon reaches each OS
|
||||
|
||||
- **macOS:** the window icon set at startup (`ViewportBuilder::with_icon`) is the Dock and app-switcher
|
||||
icon when the app runs unbundled. A future `.app` bundle points `CFBundleIconFile` at `filmcraft.icns`.
|
||||
- **Windows:** `build.rs` embeds `filmcraft.ico` as the exe's resource icon (Explorer, Start menu,
|
||||
pinned taskbar), and the runtime icon covers the window, taskbar and Alt-Tab.
|
||||
- **Linux:** the runtime icon plus `with_app_id("ai.storyteller.filmcraft")`, which Wayland matches to
|
||||
the `.desktop` file. Install the `hicolor/` tree under `/usr/share/icons/hicolor/` and the desktop
|
||||
file under `/usr/share/applications/`.
|
||||
|
||||
## Regenerate
|
||||
|
||||
`packaging/icons.sh` (needs `resvg`; `iconutil` on macOS for the `.icns`; the `.ico` is packed by
|
||||
`cargo xtask ico`). To change the artwork, replace `filmcraft.svg` and `filmcraft-small.svg` with new
|
||||
exports from craftrules, then run the script. Every derived file needs its `.attribution` sidecar
|
||||
and a row in `ATTRIBUTION.md`.
|
||||
|
After Width: | Height: | Size: 391 KiB |
@@ -0,0 +1,8 @@
|
||||
asset: filmcraft-1024.png
|
||||
title: FilmCraft app icon, 1024 px render
|
||||
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
|
||||
source: original work (drawn by the owner in ArtCraft, then vectorised)
|
||||
license: MIT OR Apache-2.0
|
||||
license-file: assets/app-icon/LICENSE.txt
|
||||
added: 2026-10-02 by Claude (agent) for Brandon Thomas
|
||||
notes: Rendered from filmcraft.svg with resvg by packaging/icons.sh.
|
||||
|
After Width: | Height: | Size: 122 KiB |
@@ -0,0 +1,8 @@
|
||||
asset: filmcraft-macos-512.png
|
||||
title: FilmCraft app icon, macOS runtime Dock icon (512 px)
|
||||
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
|
||||
source: original work (drawn by the owner in ArtCraft, then vectorised)
|
||||
license: MIT OR Apache-2.0
|
||||
license-file: assets/app-icon/LICENSE.txt
|
||||
added: 2026-10-02 by Claude (agent) for Brandon Thomas
|
||||
notes: Rendered from filmcraft.svg with resvg by packaging/icons.sh, inside Apple's 824/1024 icon grid (transparent margin). Embedded in the app by apps/filmcraft/src/main.rs.
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><clipPath id="t"><rect width="512" height="512" rx="112"/></clipPath></defs><g clip-path="url(#t)"><rect width="512" height="512" fill="#8b5cf6"/><path fill="#efe9dc" fill-rule="evenodd" d="M156 504C155 503 155 501 155 501C155 501 154 500 153 499C152 498 151 495 150 493C149 491 148 489 148 489C147 488 143 482 141 479C141 478 139 476 138 474C136 472 135 469 134 462C133 458 133 458 132 458C131 459 131 458 130 456C129 455 128 453 128 451C126 449 125 447 124 444C124 442 123 441 123 440C122 439 121 438 121 437C121 436 121 435 120 435C119 434 119 431 119 428C119 427 118 425 118 425C117 422 114 413 114 411C114 410 114 408 113 408C113 407 111 403 111 400C110 399 110 398 109 397C109 396 108 393 108 390C107 387 107 385 106 384C106 384 105 382 105 379C105 377 105 373 105 371C105 369 104 367 104 366C104 365 103 364 104 361C104 357 104 355 103 351C103 349 103 346 103 344C103 342 103 340 102 340C102 339 102 337 102 336C103 332 103 332 102 334C102 335 101 336 101 336C100 336 101 334 103 324C104 315 104 315 103 316C102 317 102 315 103 310C105 305 105 304 104 303C103 303 103 302 104 299C104 295 104 295 103 295C102 296 102 296 103 293C105 290 105 289 104 289C103 290 103 290 104 287C105 284 105 283 104 284C103 284 103 283 105 280C106 278 106 277 106 276C106 276 105 274 106 272C106 268 106 268 105 268C104 269 103 263 104 258C104 254 104 254 103 254C102 254 102 254 102 253C102 252 102 250 102 246C102 245 102 243 102 242C103 239 102 239 101 240C100 242 99 241 100 239C101 237 101 236 100 236C100 236 99 235 100 235C101 233 101 231 100 230C100 230 100 228 101 227C102 226 102 225 102 224C101 223 101 221 102 219C102 218 103 210 102 203C102 202 103 200 103 199C103 197 103 197 103 196C102 196 102 193 103 190C104 189 104 187 104 185C104 183 104 182 105 180C107 177 107 175 107 175C106 174 108 169 109 168C111 166 112 163 111 162C111 161 112 160 113 158C113 157 114 155 114 155C114 155 114 154 115 153C115 151 116 150 116 150C116 149 116 148 119 145C122 140 124 138 122 138C121 139 121 138 123 136C124 136 124 135 123 135C123 135 124 134 125 132C126 131 127 129 127 129C127 128 128 127 129 126C130 125 131 123 131 123C130 122 132 120 133 119C134 118 134 117 132 118C131 118 131 117 133 116C134 115 134 115 132 116L130 116 131 115C131 114 131 113 131 113C130 112 131 110 132 110C134 109 133 108 131 109C128 109 126 109 129 108C131 107 130 106 128 106C125 106 124 106 126 104C127 103 127 103 125 103C122 104 122 103 124 101C124 101 124 100 124 99C124 99 124 98 125 98C125 97 125 96 124 95C124 94 124 93 124 92C126 90 126 90 124 90C123 90 123 90 125 89C126 88 126 88 125 88C125 88 125 88 125 86C125 84 125 84 124 85C123 85 123 84 125 82C126 80 125 80 123 82L121 84 122 82C122 81 123 80 123 80C124 80 123 79 122 79C120 80 120 80 121 79C123 76 122 75 120 77C119 77 118 77 119 76C119 76 119 75 119 75C119 74 119 74 120 73C122 72 121 72 118 72C116 72 114 72 115 72C115 72 117 71 119 71C120 70 120 69 119 69C118 69 117 69 116 69C113 69 113 67 115 65C116 64 115 63 112 64C111 64 110 64 110 64C110 63 112 62 115 62C119 61 118 60 113 59C108 58 109 57 115 58C118 58 120 59 123 60C127 62 127 62 128 61C128 61 129 61 130 61C132 60 132 60 129 58C127 58 127 57 128 57C129 57 129 57 129 57C129 56 129 56 128 55C128 55 128 55 128 54C128 53 125 52 123 51C121 51 121 49 124 49C127 48 124 46 120 46C117 45 117 44 119 44C120 44 120 44 119 43C118 43 119 43 122 43C125 43 125 43 122 41C117 37 115 35 118 36C121 37 121 36 119 34C117 32 115 26 117 28C118 28 118 29 119 28C120 28 121 28 122 29C125 31 125 30 123 28L122 26 124 27C124 27 126 27 126 27C127 28 128 27 128 27C128 26 127 26 127 26C127 26 126 26 126 25C126 25 127 25 127 25C128 25 129 26 130 26C132 26 136 28 138 30C141 32 142 32 140 30C140 29 140 28 140 28C139 27 141 28 144 33C145 35 147 37 148 37C150 38 150 38 149 36C148 35 148 34 149 35C149 35 151 37 153 40C156 46 156 47 156 42C156 40 157 39 158 40C158 40 158 40 159 40C160 39 160 40 164 48C166 51 167 53 168 54C168 54 170 52 169 51C168 49 170 51 172 55C173 57 174 59 174 59C174 59 175 59 176 60C177 63 179 62 177 59C176 56 177 57 179 60C179 61 180 62 181 62C182 62 182 61 182 61C181 60 181 58 182 58C182 58 183 59 183 61C184 65 185 66 185 63C184 62 185 61 185 61C185 61 186 62 186 62C186 63 186 64 187 64C188 65 189 67 189 69C189 70 188 69 187 68C187 66 186 65 186 67C186 68 187 69 188 69C189 70 189 70 189 71C189 72 189 72 190 72C190 72 190 71 190 70C190 66 191 67 191 72C192 77 192 80 192 76C192 76 193 76 193 76C193 76 194 76 194 76C194 78 194 78 195 77C195 76 196 77 196 78C196 79 195 81 195 82L195 84 196 82C197 82 197 81 197 80C197 80 198 79 198 79C199 79 199 79 198 81C196 86 196 88 198 85C199 83 200 83 199 86C199 88 199 88 201 87C202 86 202 90 201 92C200 94 202 94 205 94C207 93 208 93 210 94C211 94 213 94 214 94C216 94 217 94 218 95C219 95 221 96 222 96C223 96 225 96 225 96C226 96 227 96 228 96C231 95 235 95 236 96C238 96 243 97 245 97C250 97 252 97 253 98C255 98 257 99 260 99C263 99 265 99 265 99C266 100 266 100 267 100C268 99Line truncated
|
||||
|
After Width: | Height: | Size: 444 KiB |
@@ -0,0 +1,8 @@
|
||||
asset: filmcraft-small.svg
|
||||
title: FilmCraft app icon, lighter vector
|
||||
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
|
||||
source: original work (drawn by the owner in ArtCraft, then vectorised)
|
||||
license: MIT OR Apache-2.0
|
||||
license-file: assets/app-icon/LICENSE.txt
|
||||
added: 2026-10-02 by Claude (agent) for Brandon Thomas
|
||||
notes: The same drawing traced at 1024 px (smaller file). Copied unchanged from craftrules assets/app-icons/filmcraft/icon.svg.
|
||||
@@ -0,0 +1,8 @@
|
||||
asset: filmcraft.icns
|
||||
title: FilmCraft app icon, macOS .icns
|
||||
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
|
||||
source: original work (drawn by the owner in ArtCraft, then vectorised)
|
||||
license: MIT OR Apache-2.0
|
||||
license-file: assets/app-icon/LICENSE.txt
|
||||
added: 2026-10-02 by Claude (agent) for Brandon Thomas
|
||||
notes: Built from resvg renders of filmcraft.svg (Apple icon grid) with iconutil by packaging/icons.sh.
|
||||
|
After Width: | Height: | Size: 89 KiB |
@@ -0,0 +1,8 @@
|
||||
asset: filmcraft.ico
|
||||
title: FilmCraft app icon, Windows .ico (16-256 px)
|
||||
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
|
||||
source: original work (drawn by the owner in ArtCraft, then vectorised)
|
||||
license: MIT OR Apache-2.0
|
||||
license-file: assets/app-icon/LICENSE.txt
|
||||
added: 2026-10-02 by Claude (agent) for Brandon Thomas
|
||||
notes: PNG renders of filmcraft.svg (resvg) packed by cargo xtask ico in packaging/icons.sh. Embedded in filmcraft.exe by apps/filmcraft/build.rs.
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><clipPath id="t"><rect width="512" height="512" rx="112"/></clipPath></defs><g clip-path="url(#t)"><rect width="512" height="512" fill="#8b5cf6"/><path fill="#efe9dc" fill-rule="evenodd" d="M156.4 504.8C156.1 504.3 155.6 502.8 155.1 501.4C154.4 499.3 154.2 498.9 153.7 498.8C153.4 498.7 153 498.6 152.8 498.4C151.9 497.7 149.2 492 148.7 490C148.6 489.6 148.1 489.1 147.7 488.8C147.2 488.5 146.5 487.7 146 487C145.6 486.2 144.4 484.3 143.4 482.8C142.4 481.2 141.2 479 140.7 477.8C140.1 476.3 139.8 475.6 139.4 475.5C138.8 475.3 137 473.1 136.2 471.6C135.6 470.5 134.5 467.2 134.2 465.3C134.1 464.4 133.8 462.9 133.6 462C133.4 461.1 133.2 460.1 133.2 459.7C133.2 459.4 133.1 458.7 132.9 458.2C132.7 457.7 132.5 457 132.5 456.6C132.5 455.5 132.1 456 131.8 457.3C131.6 459 130.8 459.2 130.5 457.7C130.1 456.2 128.7 452.9 128.1 452.2C126.9 450.9 125.6 448.2 125 445.7C124.1 441.9 123.8 441 123 440.4C122.3 439.8 121.6 438.4 121 436.4C120.8 435.8 120.5 435.1 120.2 435C119.5 434.6 118.7 431.7 118.6 428.6C118.5 427.1 118.3 425.5 118.1 425.1C117.9 424.7 117.3 422.9 116.7 421.1C116.2 419.3 115.5 417.4 115.2 416.8C114.7 415.6 114.1 412.4 113.9 409.9C113.7 408.4 113.6 408.2 113.1 408C112.8 407.9 112.5 407.7 112.5 407.6C112.5 406.2 111.9 404.1 111.5 403.7C111 403.1 110.2 400.1 110.2 398.8C110.3 398.4 110.1 397.8 109.8 397.5C108.8 396 107.5 390.2 107.2 385.2C107.1 384.6 107 384.4 106.6 384.3C105.8 384.2 105.7 383.7 105.5 379.4C105.4 376.6 105.2 375.3 104.9 374.5C104.5 373.6 104.4 372.7 104.4 370.1C104.4 367.4 104.3 366.8 103.9 366.2C103.3 365.3 103.5 360.4 104.1 358C104.6 356.3 104.6 354.9 104.1 354C103.9 353.6 103.7 352.1 103.5 350.6C103.4 349.1 103.1 347.8 103 347.6C102.4 346.9 102.2 344.9 102.5 342.6C102.8 340.4 102.8 340.2 102.4 339.9C102 339.6 102 339.4 102.1 338.5C102.3 337.3 102.9 333.9 103.1 332.6C103.4 331.2 102.9 331.7 102.1 333.5C101.4 335.3 100.9 336 100.6 335.7C100.4 335.5 101 331.6 101.8 328.2C102 327.1 102.5 324.7 102.8 323C103.4 319.2 103.9 316.7 104.2 315.4C104.5 314.1 104.1 314.3 103.4 315.8C102.9 316.7 102.6 317 102.4 316.8C102 316.4 102.7 312.1 103.4 310C104.3 307.8 105 305.1 105 304.1C105 303.2 104.7 302.8 104.4 303.3C104.2 303.5 104.1 303.4 103.8 303.1C103.4 302.5 103.4 300 104 297.3C104.3 296 104.4 294.8 104.4 294.8C104.3 294.7 103.8 295.1 103.3 295.6C102 296.9 101.8 296.4 102.9 294.2C104.1 291.8 105.2 288.5 105 288.4C104.9 288.3 104.4 288.7 104 289.4C102.6 291.4 102.3 290.6 103.5 287.9C104.9 284.8 105 284.6 105.1 283.7C105.3 282.5 105.1 282.5 104 283.7C103.4 284.2 102.9 284.5 102.9 284.5C102.8 284.4 103.5 282.8 104.5 280.9C106.4 277.3 106.5 277 105.9 276.5C105.4 276.1 105.4 271.7 105.9 269C106 268 106.1 267 106.1 266.9C105.8 266.5 105.5 266.8 105.3 267.9C104.8 269.9 104.3 269.6 104.2 267.2C104.2 266.4 104 265.4 103.8 265.1C103.4 264.4 103.3 260.8 103.7 258.2C104.1 255.9 104.2 253.2 104.1 253.3C104 253.3 103.6 253.7 103.1 254.2C102.7 254.7 102.2 255 102 254.9C101.6 254.7 101.7 252.7 102.1 250.8C102.5 249.3 102.5 249.2 102 248.8C101.1 248.1 101.2 244.8 102.1 242.9C103.3 240.3 102.7 238.2 101.3 240.2C100.8 240.9 100.5 241.1 100 241.1C98.9 241.1 98.9 240.9 99.6 239.6C100.3 238.2 100.9 235.9 100.6 235.5C100.5 235.3 100.2 235.4 99.8 235.9C98.8 236.8 98.7 236.4 99.5 234.9C99.9 234.2 100.4 232.9 100.6 231.9C101.1 229.8 101.1 229.9 100.6 230.1C99.9 230.4 100 229.5 101 227.6C102.2 225.2 102.3 224.2 101.4 223.6C100.6 223.1 100.6 222.1 101.4 219.8C101.7 218.9 101.9 218.1 101.9 218C101.8 217.9 101.9 217.2 102.1 216.4C102.4 214.8 102.4 213.1 102.1 210.9C102 210.1 102.1 208.9 102.3 207.8C102.6 206.4 102.7 205.1 102.6 203.2C102.5 201.2 102.5 200.4 102.8 199.7C103.1 199.2 103.2 198.6 103.1 198.4C103 198.2 103.1 198 103.2 197.9C103.7 197.6 103.5 196.9 103 196.4C102.3 195.7 102.4 192.1 103.3 189.9C103.7 188.8 103.9 187.5 104 185.4C104.2 182.2 104.7 180.5 105.9 178.8C106.2 178.4 106.5 177.8 106.5 177.6C106.5 177.3 106.7 176.6 107 176.1C107.5 175 107.4 174.6 106.6 174.9C105.4 175.4 107.6 169.2 109.3 167.4C110 166.6 110.5 165.8 110.5 165.6C110.5 165.3 110.8 164.4 111.1 163.6C111.7 162.1 111.7 161.5 111.1 162C110.4 162.6 110.6 161.8 111.4 160.4C113.7 156.4 114.1 155.5 113.6 155.1C113.1 154.8 113.5 153.9 115.4 151.3C116.5 149.7 116.7 149 115.8 149.9C115.5 150.1 115.2 150.2 115.1 150C114.9 149.7 117.2 146.4 119.2 144.2C120.9 142.4 123.5 138 123.2 137.6C123.1 137.5 122.6 137.7 122.1 138.1C120.5 139.3 120.9 138.5 122.8 136.6C124.6 134.8 124.9 134 123.5 134.8C121.9 135.8 122.1 135.3 124.4 132.7C125.4 131.5 126.3 130.4 126.2 130.3C126.2 130.1 126.6 129.7 126.9 129.2C127.6 128.5 127.6 128.4 127 128.6C126 128.9 126.5 128.2 128.8 126C131 123.8 131.3 123.4 130.6 122.9C130.2 122.6 131.5 120.2 133.2 118.4C133.8 117.8 134.2 117.1 134.2 116.8C134.3 116.4 134.2 116.4 133.9 116.8C133.5 117.4 131.1 118.3 130.9 118C130.8 117.9 131.5 117.3 132.3 116.6C133.2 116 134.1 115.3 134.2 115.1C134.6 114.7 134.7 114.7 130.4 116.1C128.1 116.8 128.2 116.8 128.2 116.5C128.2 116.4 128.7 116 129.3 1Line truncated
|
||||
|
After Width: | Height: | Size: 1017 KiB |
@@ -0,0 +1,8 @@
|
||||
asset: filmcraft.svg
|
||||
title: FilmCraft app icon, canonical vector (owl with ear tufts)
|
||||
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
|
||||
source: original work (drawn by the owner in ArtCraft, then vectorised)
|
||||
license: MIT OR Apache-2.0
|
||||
license-file: assets/app-icon/LICENSE.txt
|
||||
added: 2026-10-02 by Claude (agent) for Brandon Thomas
|
||||
notes: SVG traced at 2048 px with craftrules assets/logo-options/_tools/vectorize_tile.py from the owner's ArtCraft drawing (craftrules assets/app-icons/filmcraft/source.png). Three colours: ink #0b0b0c, paper #efe9dc, app colour #8b5cf6; 512 viewBox, rx=112. See assets/app-icon/README.md.
|
||||
|
After Width: | Height: | Size: 17 KiB |
@@ -0,0 +1,8 @@
|
||||
asset: ai.storyteller.filmcraft.png
|
||||
title: FilmCraft app icon, Linux hicolor theme 128 px
|
||||
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
|
||||
source: original work (drawn by the owner in ArtCraft, then vectorised)
|
||||
license: MIT OR Apache-2.0
|
||||
license-file: assets/app-icon/LICENSE.txt
|
||||
added: 2026-10-02 by Claude (agent) for Brandon Thomas
|
||||
notes: Rendered from filmcraft.svg with resvg by packaging/icons.sh.
|
||||
|
After Width: | Height: | Size: 685 B |
@@ -0,0 +1,8 @@
|
||||
asset: ai.storyteller.filmcraft.png
|
||||
title: FilmCraft app icon, Linux hicolor theme 16 px
|
||||
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
|
||||
source: original work (drawn by the owner in ArtCraft, then vectorised)
|
||||
license: MIT OR Apache-2.0
|
||||
license-file: assets/app-icon/LICENSE.txt
|
||||
added: 2026-10-02 by Claude (agent) for Brandon Thomas
|
||||
notes: Rendered from filmcraft.svg with resvg by packaging/icons.sh.
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -0,0 +1,8 @@
|
||||
asset: ai.storyteller.filmcraft.png
|
||||
title: FilmCraft app icon, Linux hicolor theme 24 px
|
||||
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
|
||||
source: original work (drawn by the owner in ArtCraft, then vectorised)
|
||||
license: MIT OR Apache-2.0
|
||||
license-file: assets/app-icon/LICENSE.txt
|
||||
added: 2026-10-02 by Claude (agent) for Brandon Thomas
|
||||
notes: Rendered from filmcraft.svg with resvg by packaging/icons.sh.
|
||||
|
After Width: | Height: | Size: 57 KiB |
@@ -0,0 +1,8 @@
|
||||
asset: ai.storyteller.filmcraft.png
|
||||
title: FilmCraft app icon, Linux hicolor theme 256 px
|
||||
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
|
||||
source: original work (drawn by the owner in ArtCraft, then vectorised)
|
||||
license: MIT OR Apache-2.0
|
||||
license-file: assets/app-icon/LICENSE.txt
|
||||
added: 2026-10-02 by Claude (agent) for Brandon Thomas
|
||||
notes: Rendered from filmcraft.svg with resvg by packaging/icons.sh.
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
@@ -0,0 +1,8 @@
|
||||
asset: ai.storyteller.filmcraft.png
|
||||
title: FilmCraft app icon, Linux hicolor theme 32 px
|
||||
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
|
||||
source: original work (drawn by the owner in ArtCraft, then vectorised)
|
||||
license: MIT OR Apache-2.0
|
||||
license-file: assets/app-icon/LICENSE.txt
|
||||
added: 2026-10-02 by Claude (agent) for Brandon Thomas
|
||||
notes: Rendered from filmcraft.svg with resvg by packaging/icons.sh.
|
||||
|
After Width: | Height: | Size: 3.2 KiB |
@@ -0,0 +1,8 @@
|
||||
asset: ai.storyteller.filmcraft.png
|
||||
title: FilmCraft app icon, Linux hicolor theme 48 px
|
||||
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
|
||||
source: original work (drawn by the owner in ArtCraft, then vectorised)
|
||||
license: MIT OR Apache-2.0
|
||||
license-file: assets/app-icon/LICENSE.txt
|
||||
added: 2026-10-02 by Claude (agent) for Brandon Thomas
|
||||
notes: Rendered from filmcraft.svg with resvg by packaging/icons.sh.
|
||||
|
After Width: | Height: | Size: 160 KiB |
@@ -0,0 +1,8 @@
|
||||
asset: ai.storyteller.filmcraft.png
|
||||
title: FilmCraft app icon, Linux hicolor theme 512 px
|
||||
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
|
||||
source: original work (drawn by the owner in ArtCraft, then vectorised)
|
||||
license: MIT OR Apache-2.0
|
||||
license-file: assets/app-icon/LICENSE.txt
|
||||
added: 2026-10-02 by Claude (agent) for Brandon Thomas
|
||||
notes: Rendered from filmcraft.svg with resvg by packaging/icons.sh.
|
||||
|
After Width: | Height: | Size: 5.1 KiB |
@@ -0,0 +1,8 @@
|
||||
asset: ai.storyteller.filmcraft.png
|
||||
title: FilmCraft app icon, Linux hicolor theme 64 px
|
||||
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
|
||||
source: original work (drawn by the owner in ArtCraft, then vectorised)
|
||||
license: MIT OR Apache-2.0
|
||||
license-file: assets/app-icon/LICENSE.txt
|
||||
added: 2026-10-02 by Claude (agent) for Brandon Thomas
|
||||
notes: Rendered from filmcraft.svg with resvg by packaging/icons.sh.
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><clipPath id="t"><rect width="512" height="512" rx="112"/></clipPath></defs><g clip-path="url(#t)"><rect width="512" height="512" fill="#8b5cf6"/><path fill="#efe9dc" fill-rule="evenodd" d="M156 504C155 503 155 501 155 501C155 501 154 500 153 499C152 498 151 495 150 493C149 491 148 489 148 489C147 488 143 482 141 479C141 478 139 476 138 474C136 472 135 469 134 462C133 458 133 458 132 458C131 459 131 458 130 456C129 455 128 453 128 451C126 449 125 447 124 444C124 442 123 441 123 440C122 439 121 438 121 437C121 436 121 435 120 435C119 434 119 431 119 428C119 427 118 425 118 425C117 422 114 413 114 411C114 410 114 408 113 408C113 407 111 403 111 400C110 399 110 398 109 397C109 396 108 393 108 390C107 387 107 385 106 384C106 384 105 382 105 379C105 377 105 373 105 371C105 369 104 367 104 366C104 365 103 364 104 361C104 357 104 355 103 351C103 349 103 346 103 344C103 342 103 340 102 340C102 339 102 337 102 336C103 332 103 332 102 334C102 335 101 336 101 336C100 336 101 334 103 324C104 315 104 315 103 316C102 317 102 315 103 310C105 305 105 304 104 303C103 303 103 302 104 299C104 295 104 295 103 295C102 296 102 296 103 293C105 290 105 289 104 289C103 290 103 290 104 287C105 284 105 283 104 284C103 284 103 283 105 280C106 278 106 277 106 276C106 276 105 274 106 272C106 268 106 268 105 268C104 269 103 263 104 258C104 254 104 254 103 254C102 254 102 254 102 253C102 252 102 250 102 246C102 245 102 243 102 242C103 239 102 239 101 240C100 242 99 241 100 239C101 237 101 236 100 236C100 236 99 235 100 235C101 233 101 231 100 230C100 230 100 228 101 227C102 226 102 225 102 224C101 223 101 221 102 219C102 218 103 210 102 203C102 202 103 200 103 199C103 197 103 197 103 196C102 196 102 193 103 190C104 189 104 187 104 185C104 183 104 182 105 180C107 177 107 175 107 175C106 174 108 169 109 168C111 166 112 163 111 162C111 161 112 160 113 158C113 157 114 155 114 155C114 155 114 154 115 153C115 151 116 150 116 150C116 149 116 148 119 145C122 140 124 138 122 138C121 139 121 138 123 136C124 136 124 135 123 135C123 135 124 134 125 132C126 131 127 129 127 129C127 128 128 127 129 126C130 125 131 123 131 123C130 122 132 120 133 119C134 118 134 117 132 118C131 118 131 117 133 116C134 115 134 115 132 116L130 116 131 115C131 114 131 113 131 113C130 112 131 110 132 110C134 109 133 108 131 109C128 109 126 109 129 108C131 107 130 106 128 106C125 106 124 106 126 104C127 103 127 103 125 103C122 104 122 103 124 101C124 101 124 100 124 99C124 99 124 98 125 98C125 97 125 96 124 95C124 94 124 93 124 92C126 90 126 90 124 90C123 90 123 90 125 89C126 88 126 88 125 88C125 88 125 88 125 86C125 84 125 84 124 85C123 85 123 84 125 82C126 80 125 80 123 82L121 84 122 82C122 81 123 80 123 80C124 80 123 79 122 79C120 80 120 80 121 79C123 76 122 75 120 77C119 77 118 77 119 76C119 76 119 75 119 75C119 74 119 74 120 73C122 72 121 72 118 72C116 72 114 72 115 72C115 72 117 71 119 71C120 70 120 69 119 69C118 69 117 69 116 69C113 69 113 67 115 65C116 64 115 63 112 64C111 64 110 64 110 64C110 63 112 62 115 62C119 61 118 60 113 59C108 58 109 57 115 58C118 58 120 59 123 60C127 62 127 62 128 61C128 61 129 61 130 61C132 60 132 60 129 58C127 58 127 57 128 57C129 57 129 57 129 57C129 56 129 56 128 55C128 55 128 55 128 54C128 53 125 52 123 51C121 51 121 49 124 49C127 48 124 46 120 46C117 45 117 44 119 44C120 44 120 44 119 43C118 43 119 43 122 43C125 43 125 43 122 41C117 37 115 35 118 36C121 37 121 36 119 34C117 32 115 26 117 28C118 28 118 29 119 28C120 28 121 28 122 29C125 31 125 30 123 28L122 26 124 27C124 27 126 27 126 27C127 28 128 27 128 27C128 26 127 26 127 26C127 26 126 26 126 25C126 25 127 25 127 25C128 25 129 26 130 26C132 26 136 28 138 30C141 32 142 32 140 30C140 29 140 28 140 28C139 27 141 28 144 33C145 35 147 37 148 37C150 38 150 38 149 36C148 35 148 34 149 35C149 35 151 37 153 40C156 46 156 47 156 42C156 40 157 39 158 40C158 40 158 40 159 40C160 39 160 40 164 48C166 51 167 53 168 54C168 54 170 52 169 51C168 49 170 51 172 55C173 57 174 59 174 59C174 59 175 59 176 60C177 63 179 62 177 59C176 56 177 57 179 60C179 61 180 62 181 62C182 62 182 61 182 61C181 60 181 58 182 58C182 58 183 59 183 61C184 65 185 66 185 63C184 62 185 61 185 61C185 61 186 62 186 62C186 63 186 64 187 64C188 65 189 67 189 69C189 70 188 69 187 68C187 66 186 65 186 67C186 68 187 69 188 69C189 70 189 70 189 71C189 72 189 72 190 72C190 72 190 71 190 70C190 66 191 67 191 72C192 77 192 80 192 76C192 76 193 76 193 76C193 76 194 76 194 76C194 78 194 78 195 77C195 76 196 77 196 78C196 79 195 81 195 82L195 84 196 82C197 82 197 81 197 80C197 80 198 79 198 79C199 79 199 79 198 81C196 86 196 88 198 85C199 83 200 83 199 86C199 88 199 88 201 87C202 86 202 90 201 92C200 94 202 94 205 94C207 93 208 93 210 94C211 94 213 94 214 94C216 94 217 94 218 95C219 95 221 96 222 96C223 96 225 96 225 96C226 96 227 96 228 96C231 95 235 95 236 96C238 96 243 97 245 97C250 97 252 97 253 98C255 98 257 99 260 99C263 99 265 99 265 99C266 100 266 100 267 100C268 99Line truncated
|
||||
|
After Width: | Height: | Size: 444 KiB |
@@ -0,0 +1,8 @@
|
||||
asset: ai.storyteller.filmcraft.svg
|
||||
title: FilmCraft app icon, Linux hicolor theme scalable
|
||||
author: Brandon Thomas (FilmCraft owner), for the FilmCraft project
|
||||
source: original work (drawn by the owner in ArtCraft, then vectorised)
|
||||
license: MIT OR Apache-2.0
|
||||
license-file: assets/app-icon/LICENSE.txt
|
||||
added: 2026-10-02 by Claude (agent) for Brandon Thomas
|
||||
notes: Copy of filmcraft-small.svg, made by packaging/icons.sh.
|
||||
@@ -0,0 +1,63 @@
|
||||
#!/usr/bin/env bash
|
||||
# Regenerate every derived app icon from assets/app-icon/filmcraft.svg (the canonical artwork; a
|
||||
# 512-unit full-bleed tile with rx=112). filmcraft-small.svg is a lighter trace of the same drawing
|
||||
# and is copied, not generated.
|
||||
#
|
||||
# Needs: resvg (brew install resvg / cargo install resvg). On macOS, iconutil also writes the
|
||||
# .icns. The outputs are committed, so builds and packaging never need these tools.
|
||||
#
|
||||
# packaging/icons.sh
|
||||
set -euo pipefail
|
||||
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
DIR="$ROOT/assets/app-icon"
|
||||
SVG="$DIR/filmcraft.svg"
|
||||
APP_ID="ai.storyteller.filmcraft"
|
||||
TMP="$(mktemp -d)"
|
||||
trap 'rm -rf "$TMP"' EXIT
|
||||
|
||||
command -v resvg >/dev/null || { echo "error: resvg not found (brew install resvg)" >&2; exit 1; }
|
||||
|
||||
# macOS icons follow Apple's grid: the tile body is 824 of 1024 px with a transparent margin, so
|
||||
# the Dock shows it at the same size as other apps. 512 * 1024 / 824 = 636.27 units, margin 62.14.
|
||||
MAC="$TMP/mac.svg"
|
||||
sed 's/viewBox="0 0 512 512"/viewBox="-62.14 -62.14 636.27 636.27"/' "$SVG" >"$MAC"
|
||||
grep -q 'viewBox="-62.14' "$MAC" || { echo "error: unexpected viewBox in $SVG" >&2; exit 1; }
|
||||
|
||||
render() { resvg -w "$2" -h "$2" "$1" "$3" </dev/null; }
|
||||
|
||||
render "$SVG" 1024 "$DIR/filmcraft-1024.png"
|
||||
# Runtime window/Dock icon on macOS (apps/filmcraft/src/main.rs embeds it).
|
||||
render "$MAC" 512 "$DIR/filmcraft-macos-512.png"
|
||||
|
||||
# Linux hicolor theme. Windows and Linux use the full-bleed tile.
|
||||
for s in 16 24 32 48 64 128 256 512; do
|
||||
mkdir -p "$DIR/hicolor/${s}x${s}/apps"
|
||||
render "$SVG" "$s" "$DIR/hicolor/${s}x${s}/apps/$APP_ID.png"
|
||||
done
|
||||
mkdir -p "$DIR/hicolor/scalable/apps"
|
||||
cp "$DIR/filmcraft-small.svg" "$DIR/hicolor/scalable/apps/$APP_ID.svg"
|
||||
|
||||
# Web app favicon and loading image.
|
||||
render "$SVG" 128 "$ROOT/apps/filmcraft-web/web/favicon.png"
|
||||
|
||||
# Windows .ico.
|
||||
ICO_PNGS=()
|
||||
for s in 16 20 24 32 40 48 64 128 256; do
|
||||
render "$SVG" "$s" "$TMP/ico-$s.png"
|
||||
ICO_PNGS+=("$TMP/ico-$s.png")
|
||||
done
|
||||
(cd "$ROOT" && cargo run -q -p xtask -- ico "$DIR/filmcraft.ico" "${ICO_PNGS[@]}")
|
||||
|
||||
# macOS .icns.
|
||||
if command -v iconutil >/dev/null; then
|
||||
SET="$TMP/filmcraft.iconset"
|
||||
mkdir -p "$SET"
|
||||
for s in 16 32 128 256 512; do
|
||||
render "$MAC" "$s" "$SET/icon_${s}x${s}.png"
|
||||
render "$MAC" $((s * 2)) "$SET/icon_${s}x${s}@2x.png"
|
||||
done
|
||||
iconutil -c icns -o "$DIR/filmcraft.icns" "$SET"
|
||||
else
|
||||
echo "warning: iconutil not found (macOS only); filmcraft.icns not regenerated" >&2
|
||||
fi
|
||||
echo "icons written to $DIR"
|
||||
@@ -0,0 +1,13 @@
|
||||
[Desktop Entry]
|
||||
Type=Application
|
||||
Name=FilmCraft
|
||||
GenericName=Video Editor
|
||||
Comment=Edit video, color and sound
|
||||
Exec=filmcraft %F
|
||||
TryExec=filmcraft
|
||||
Icon=ai.storyteller.filmcraft
|
||||
Terminal=false
|
||||
StartupNotify=true
|
||||
StartupWMClass=ai.storyteller.filmcraft
|
||||
Categories=AudioVideo;Video;AudioVideoEditing;
|
||||
Keywords=video;editor;film;timeline;color;grading;nle;
|
||||
@@ -0,0 +1,104 @@
|
||||
//! `cargo xtask ico <out.ico> <in.png>…`: pack PNG images into a Windows `.ico`.
|
||||
//!
|
||||
//! Vista and later read PNG-compressed icon entries, so each PNG is stored as is. The size comes
|
||||
//! from the PNG's IHDR chunk; 256 px is written as 0, per the ICO format.
|
||||
|
||||
use std::path::Path;
|
||||
|
||||
/// Width and height from a PNG's IHDR chunk.
|
||||
pub fn png_size(png: &[u8]) -> Result<(u32, u32), String> {
|
||||
const SIG: &[u8] = b"\x89PNG\r\n\x1a\n";
|
||||
if png.len() < 24 || &png[..8] != SIG || &png[12..16] != b"IHDR" {
|
||||
return Err("not a PNG file".into());
|
||||
}
|
||||
let w = u32::from_be_bytes([png[16], png[17], png[18], png[19]]);
|
||||
let h = u32::from_be_bytes([png[20], png[21], png[22], png[23]]);
|
||||
Ok((w, h))
|
||||
}
|
||||
|
||||
/// An ICO file holding `pngs`, which must be square and at most 256 px.
|
||||
pub fn pack(pngs: &[Vec<u8>]) -> Result<Vec<u8>, String> {
|
||||
if pngs.is_empty() || pngs.len() > u16::MAX as usize {
|
||||
return Err("need at least one PNG".into());
|
||||
}
|
||||
let mut out = Vec::new();
|
||||
out.extend_from_slice(&0u16.to_le_bytes()); // reserved
|
||||
out.extend_from_slice(&1u16.to_le_bytes()); // type: icon
|
||||
out.extend_from_slice(&(pngs.len() as u16).to_le_bytes());
|
||||
let mut offset = 6 + 16 * pngs.len();
|
||||
for png in pngs {
|
||||
let (w, h) = png_size(png)?;
|
||||
if w != h || w == 0 || w > 256 {
|
||||
return Err(format!("icon images must be square and at most 256 px, got {w}x{h}"));
|
||||
}
|
||||
let dim = if w == 256 { 0 } else { w as u8 };
|
||||
out.extend_from_slice(&[dim, dim, 0, 0]); // width, height, palette size, reserved
|
||||
out.extend_from_slice(&1u16.to_le_bytes()); // colour planes
|
||||
out.extend_from_slice(&32u16.to_le_bytes()); // bits per pixel
|
||||
out.extend_from_slice(&(png.len() as u32).to_le_bytes());
|
||||
out.extend_from_slice(&(offset as u32).to_le_bytes());
|
||||
offset += png.len();
|
||||
}
|
||||
for png in pngs {
|
||||
out.extend_from_slice(png);
|
||||
}
|
||||
Ok(out)
|
||||
}
|
||||
|
||||
pub fn run(args: &[&str]) -> Result<(), String> {
|
||||
let [out, inputs @ ..] = args else {
|
||||
return Err("usage: cargo xtask ico <out.ico> <in.png>…".into());
|
||||
};
|
||||
let pngs = inputs.iter().map(|p| std::fs::read(p).map_err(|e| format!("read {p}: {e}"))).collect::<Result<Vec<_>, _>>()?;
|
||||
let ico = pack(&pngs)?;
|
||||
std::fs::write(Path::new(out), &ico).map_err(|e| format!("write {out}: {e}"))?;
|
||||
println!("{out}: {} images, {} bytes", pngs.len(), ico.len());
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
fn fake_png(size: u32) -> Vec<u8> {
|
||||
let mut v = b"\x89PNG\r\n\x1a\n\0\0\0\x0dIHDR".to_vec();
|
||||
v.extend_from_slice(&size.to_be_bytes());
|
||||
v.extend_from_slice(&size.to_be_bytes());
|
||||
v.extend_from_slice(&[8, 6, 0, 0, 0, 1, 2, 3, 4]);
|
||||
v
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn packs_directory_and_payloads() {
|
||||
let a = fake_png(16);
|
||||
let b = fake_png(256);
|
||||
let ico = pack(&[a.clone(), b.clone()]).unwrap();
|
||||
assert_eq!(&ico[..6], &[0, 0, 1, 0, 2, 0]);
|
||||
// Entry 0: 16 px at offset 6 + 32.
|
||||
assert_eq!(&ico[6..8], &[16, 16]);
|
||||
assert_eq!(u32::from_le_bytes(ico[14..18].try_into().unwrap()), a.len() as u32);
|
||||
assert_eq!(u32::from_le_bytes(ico[18..22].try_into().unwrap()), 38);
|
||||
// Entry 1: 256 px stored as 0, right after the first payload.
|
||||
assert_eq!(&ico[22..24], &[0, 0]);
|
||||
assert_eq!(u32::from_le_bytes(ico[34..38].try_into().unwrap()), 38 + a.len() as u32);
|
||||
assert_eq!(&ico[38..38 + a.len()], &a[..]);
|
||||
assert_eq!(&ico[38 + a.len()..], &b[..]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn rejects_bad_input() {
|
||||
assert!(pack(&[]).is_err());
|
||||
assert!(pack(&[fake_png(512)]).is_err());
|
||||
assert!(pack(&[b"GIF89a".to_vec()]).is_err());
|
||||
assert_eq!(png_size(&fake_png(48)).unwrap(), (48, 48));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn committed_icon_is_valid() {
|
||||
let path = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("../assets/app-icon/filmcraft.ico");
|
||||
let Ok(ico) = std::fs::read(&path) else { return };
|
||||
assert_eq!(&ico[..4], &[0, 0, 1, 0]);
|
||||
let n = u16::from_le_bytes([ico[4], ico[5]]) as usize;
|
||||
assert!(n >= 4, "expected several sizes in {}", path.display());
|
||||
}
|
||||
}
|
||||
@@ -11,8 +11,11 @@
|
||||
//! - `fixtures [crate…]`: pre-generate the ffmpeg fixture matrix of the oracle tests (runs each
|
||||
//! crate's ignored `generate_fixtures` test, i.e. the same generators the tests use) and print
|
||||
//! what was made, reused or skipped.
|
||||
//! - `ico <out.ico> <in.png>…`: pack PNGs into a Windows `.ico` (used by `packaging/icons.sh`).
|
||||
//! - `ci`: fmt check, clippy -D warnings, tests, layers, assets, wasm.
|
||||
|
||||
mod ico;
|
||||
|
||||
use std::process::{Command, ExitCode};
|
||||
|
||||
use serde_json::Value;
|
||||
@@ -346,6 +349,7 @@ fn serve_dir(dir: &std::path::Path, port: u16) -> Result<(), String> {
|
||||
"js" => "text/javascript",
|
||||
"wasm" => "application/wasm",
|
||||
"svg" => "image/svg+xml",
|
||||
"png" => "image/png",
|
||||
"json" => "application/json",
|
||||
"mp4" => "video/mp4",
|
||||
"webm" => "video/webm",
|
||||
@@ -435,7 +439,11 @@ fn main() -> ExitCode {
|
||||
"ci" => ci(),
|
||||
"bench-playback" => bench_playback(),
|
||||
"web" => web(&std::env::args().skip(2).collect::<Vec<_>>()),
|
||||
_ => Err("usage: cargo xtask <layers|assets|wasm|web [--dev] [--serve PORT]|fixtures [crate…]|ci|bench-playback [args]>".into()),
|
||||
"ico" => {
|
||||
let rest: Vec<String> = std::env::args().skip(2).collect();
|
||||
ico::run(&rest.iter().map(String::as_str).collect::<Vec<_>>())
|
||||
}
|
||||
_ => Err("usage: cargo xtask <layers|assets|wasm|web [--dev] [--serve PORT]|fixtures [crate…]|ico OUT IN…|ci|bench-playback [args]>".into()),
|
||||
};
|
||||
match r {
|
||||
Ok(()) => ExitCode::SUCCESS,
|
||||
|
||||