diff --git a/AGENTS.md b/AGENTS.md index b7a84365..b7c56fc3 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -43,6 +43,11 @@ reproduce an image (for example, point lists traced from someone else's icon). `crates/media`, procedural looks in `crates/render`) are original work under the project licence and are listed in `ATTRIBUTION.md`. 7. **When in doubt, leave it out** and draw or generate it yourself. +8. **The one exception: first-party ArtCraft brand marks.** The ArtCraft name and logos in `docs/brand/` + (supplied by the ArtCraft team) are trademarks, all rights reserved, used with permission. They still + need a sidecar and an `ATTRIBUTION.md` row (licence `LicenseRef-ArtCraft-Trademark`). No other + non-open asset is allowed, and this exception never covers third-party marks (Adobe, Discord, GitHub + and other logos stay out; draw a generic icon instead). ## 2. Clean-room code diff --git a/ATTRIBUTION.md b/ATTRIBUTION.md index c87d06ae..ba2c2434 100644 --- a/ATTRIBUTION.md +++ b/ATTRIBUTION.md @@ -77,3 +77,19 @@ is traced or derived from Adobe artwork. | Demo footage (ocean sunset, aurora, city night, dunes, forest, plasma), bars and tone, counting leader, colour matte | `crates/media/src/generators.rs` | | Lumetri "Look" presets (Teal & Orange, Warm Film, …) | `crates/render/src/effects.rs` (`apply_look`): procedural colour transforms, not LUT files | | Colour palette and layout metrics | `crates/ui-egui/src/theme.rs`: colour values and sizes only; no artwork | + +## First-party brand marks + +The ArtCraft name and logo are trademarks of the ArtCraft team, used in FilmCraft with permission. They are not +openly licensed and are not covered by the project licence; forks must remove or replace them (AGENTS.md §1.8). + +| File | Author | Source | Licence | +|---|---|---|---| +| `docs/brand/artcraft-logo-white.png` | ArtCraft team | Original work: first-party ArtCraft brand mark (ArtCraft wordmark, light ink for dark backgrounds) | ArtCraft trademark, all rights reserved; used with permission (not MIT/Apache) | +| `docs/brand/artcraft-logo-white.svg` | ArtCraft team | Original work: first-party ArtCraft brand mark (ArtCraft wordmark, light ink for dark backgrounds) | ArtCraft trademark, all rights reserved; used with permission (not MIT/Apache) | +| `docs/brand/artcraft-logo.png` | ArtCraft team | Original work: first-party ArtCraft brand mark (ArtCraft wordmark (symbol + "ARTCRAFT"), dark ink for light backgrounds) | ArtCraft trademark, all rights reserved; used with permission (not MIT/Apache) | +| `docs/brand/artcraft-logo.svg` | ArtCraft team | Original work: first-party ArtCraft brand mark (ArtCraft wordmark (symbol + "ARTCRAFT"), dark ink for light backgrounds) | ArtCraft trademark, all rights reserved; used with permission (not MIT/Apache) | +| `docs/brand/artcraft-mark-black.png` | ArtCraft team | Original work: first-party ArtCraft brand mark (ArtCraft symbol ("A" mark), black) | ArtCraft trademark, all rights reserved; used with permission (not MIT/Apache) | +| `docs/brand/artcraft-mark-black.svg` | ArtCraft team | Original work: first-party ArtCraft brand mark (ArtCraft symbol ("A" mark), black) | ArtCraft trademark, all rights reserved; used with permission (not MIT/Apache) | +| `docs/brand/artcraft-mark.png` | ArtCraft team | Original work: first-party ArtCraft brand mark (ArtCraft symbol ("A" mark), blue) | ArtCraft trademark, all rights reserved; used with permission (not MIT/Apache) | +| `docs/brand/artcraft-mark.svg` | ArtCraft team | Original work: first-party ArtCraft brand mark (ArtCraft symbol ("A" mark), blue) | ArtCraft trademark, all rights reserved; used with permission (not MIT/Apache) | diff --git a/README.md b/README.md index fd1603d0..60f0871c 100644 --- a/README.md +++ b/README.md @@ -332,11 +332,11 @@ And [**ArtCraft**](https://getartcraft.com/) itself, our AI image and video stud **Footage and music in the screenshots:** NASA's Apollo 11 film and television footage from [images.nasa.gov](https://images.nasa.gov) (launch, Launch Control Center, lunar surface and recovery) and the Apollo 11 air-to-ground voice transcript, all US Government works in the public domain (NASA does not endorse this project); *Night of the Living Dead* (1968), *Carnival of Souls* (1962) and *Charade* (1963), all in the US public domain; *Earth Views from the ISS* by NASA; Chopin's Nocturne Op. 48 No. 1 and Ballade No. 1, performed for Musopen and released under CC0. The media itself is not in this repository. Sources and details for every asset are in [ATTRIBUTION.md](ATTRIBUTION.md). -FilmCraft is an independent implementation. It contains no Adobe code, icons, images, presets or LUTs, and no GPL or LGPL code; every icon is drawn in code and every asset is openly licensed and attributed ([AGENTS.md](AGENTS.md)). ffmpeg is used only as an external test oracle. Adobe and Premiere Pro are trademarks of Adobe Inc.; FilmCraft is not affiliated with Adobe. +FilmCraft is an independent implementation. It contains no Adobe code, icons, images, presets or LUTs, and no GPL or LGPL code; every icon is drawn in code and every asset is openly licensed and attributed ([AGENTS.md](AGENTS.md)), apart from the ArtCraft name and logo, which are trademarks of the ArtCraft team used with permission. ffmpeg is used only as an external test oracle. Adobe and Premiere Pro are trademarks of Adobe Inc.; FilmCraft is not affiliated with Adobe. ## License -FilmCraft is dual-licensed under [MIT](LICENSE-MIT) or [Apache-2.0](LICENSE-APACHE), at your option. Bundled assets keep their own open licences, listed in [ATTRIBUTION.md](ATTRIBUTION.md). +FilmCraft is dual-licensed under [MIT](LICENSE-MIT) or [Apache-2.0](LICENSE-APACHE), at your option. Bundled assets keep their own open licences, listed in [ATTRIBUTION.md](ATTRIBUTION.md). The ArtCraft name and logos in `docs/brand/` are trademarks of the ArtCraft team and are not covered by this licence.
diff --git a/crates/ui-egui/Cargo.toml b/crates/ui-egui/Cargo.toml index bba3e4ed..691a7685 100644 --- a/crates/ui-egui/Cargo.toml +++ b/crates/ui-egui/Cargo.toml @@ -28,6 +28,8 @@ serde = { workspace = true } serde_json = { workspace = true } log = { workspace = true } rayon = { workspace = true } +# ArtCraft wordmark (PNG) for the About dialog and Home screen. +image = { version = "0.25", default-features = false, features = ["png"] } # Thread/process CPU clocks for frame-job profiling (safe wrappers; see frames.rs). [target.'cfg(unix)'.dependencies] @@ -37,4 +39,3 @@ rustix = { version = "1", default-features = false, features = ["std", "time"] } pollster = "0.4" filmcraft-codecs = { workspace = true } egui_kittest = { workspace = true, features = ["eframe", "wgpu"] } -image = { version = "0.25", default-features = false, features = ["png"] } diff --git a/crates/ui-egui/src/brand.rs b/crates/ui-egui/src/brand.rs new file mode 100644 index 00000000..4c41d080 --- /dev/null +++ b/crates/ui-egui/src/brand.rs @@ -0,0 +1,33 @@ +//! The ArtCraft wordmark (first-party trademark, used with permission; see `docs/brand/` and +//! AGENTS.md §1.8), decoded once and kept as a texture. + +const LOGO_LIGHT_INK: &[u8] = include_bytes!("../../../docs/brand/artcraft-logo-white.png"); +const LOGO_DARK_INK: &[u8] = include_bytes!("../../../docs/brand/artcraft-logo.png"); + +/// The wordmark for a dark (`dark = true`) or light UI: light ink on dark themes. Its aspect +/// ratio is width / height of the returned texture. +pub fn wordmark(ctx: &egui::Context, dark: bool) -> Option { + let id = egui::Id::new(("artcraft-wordmark", dark)); + if let Some(t) = ctx.data(|d| d.get_temp::(id)) { + return Some(t); + } + let bytes = if dark { LOGO_LIGHT_INK } else { LOGO_DARK_INK }; + let img = image::load_from_memory_with_format(bytes, image::ImageFormat::Png).ok()?; + // Large enough to stay sharp at 2x for the sizes we draw (≤ 320 pt wide). + let img = img.resize(1024, 1024, image::imageops::FilterType::Lanczos3).to_rgba8(); + let color = egui::ColorImage::from_rgba_unmultiplied([img.width() as usize, img.height() as usize], img.as_raw()); + let tex = ctx.load_texture("artcraft-wordmark", color, egui::TextureOptions::LINEAR); + ctx.data_mut(|d| d.insert_temp(id, tex.clone())); + Some(tex) +} + +/// Draw the wordmark `height` points tall with its left edge at `left_center` (vertically centred). +/// Returns the drawn rect. +pub fn paint_wordmark(ui: &egui::Ui, left_center: egui::Pos2, height: f32, dark: bool) -> Option { + let tex = wordmark(ui.ctx(), dark)?; + let [w, h] = tex.size(); + let width = height * w as f32 / h.max(1) as f32; + let r = egui::Rect::from_min_size(egui::pos2(left_center.x, left_center.y - height / 2.0), egui::vec2(width, height)); + ui.painter().image(tex.id(), r, egui::Rect::from_min_max(egui::pos2(0.0, 0.0), egui::pos2(1.0, 1.0)), egui::Color32::WHITE); + Some(r) +} diff --git a/crates/ui-egui/src/lib.rs b/crates/ui-egui/src/lib.rs index 874edb80..410c0959 100644 --- a/crates/ui-egui/src/lib.rs +++ b/crates/ui-egui/src/lib.rs @@ -5,6 +5,7 @@ //! control-channel handlers. Swap it for another toolkit without touching the engine. pub mod automation; +pub mod brand; pub mod control; pub mod dock; pub mod frames; diff --git a/crates/ui-egui/src/panels/dialogs.rs b/crates/ui-egui/src/panels/dialogs.rs index f05f64b0..6bdd92a1 100644 --- a/crates/ui-egui/src/panels/dialogs.rs +++ b/crates/ui-egui/src/panels/dialogs.rs @@ -138,6 +138,10 @@ fn about(app: &mut FilmcraftApp, ui: &mut egui::Ui) { use crate::links; let t = app.tokens; ui.set_width(380.0); + // ArtCraft wordmark (first-party trademark, docs/brand/). + let (r, _) = ui.allocate_exact_size(egui::vec2(ui.available_width(), 30.0), egui::Sense::hover()); + crate::brand::paint_wordmark(ui, egui::pos2(r.min.x, r.center().y), 20.0, app.ui.dark); + ui.add_space(6.0); ui.heading("FilmCraft"); ui.label(format!("Version {}", env!("CARGO_PKG_VERSION"))); ui.label("A clean-room, pure-Rust non-linear video editor. Part of the ArtCraft family."); diff --git a/crates/ui-egui/src/panels/import_mode.rs b/crates/ui-egui/src/panels/import_mode.rs index a004dc03..813eea97 100644 --- a/crates/ui-egui/src/panels/import_mode.rs +++ b/crates/ui-egui/src/panels/import_mode.rs @@ -45,7 +45,10 @@ pub fn show(app: &mut FilmcraftApp, ui: &mut egui::Ui, rect: Rect) { } // Community and project links. let y = 90.0 + 150.0 + 36.0; - ui.painter().text(rect.min + vec2(24.0, y), Align2::LEFT_CENTER, "Community", Tokens::semibold(15.0), t.text); + // ArtCraft wordmark (first-party trademark, docs/brand/), then the section title. + let logo = crate::brand::paint_wordmark(ui, rect.min + vec2(24.0, y), 15.0, app.ui.dark); + let tx = logo.map_or(rect.min.x + 24.0, |r| r.max.x + 12.0); + ui.painter().text(pos2(tx, rect.min.y + y), Align2::LEFT_CENTER, "Community", Tokens::semibold(15.0), t.text); let mut x = rect.min.x + 24.0; for (i, (id, label, url)) in crate::links::ALL.iter().take(4).enumerate() { let primary = i == 0; diff --git a/docs/brand/artcraft-logo-white.png b/docs/brand/artcraft-logo-white.png new file mode 100644 index 00000000..8cfb31d9 Binary files /dev/null and b/docs/brand/artcraft-logo-white.png differ diff --git a/docs/brand/artcraft-logo-white.png.attribution b/docs/brand/artcraft-logo-white.png.attribution new file mode 100644 index 00000000..0a196ace --- /dev/null +++ b/docs/brand/artcraft-logo-white.png.attribution @@ -0,0 +1,8 @@ +asset: artcraft-logo-white.png +title: ArtCraft wordmark, light ink for dark backgrounds +author: ArtCraft team (Storyteller) +source: original work (first-party ArtCraft brand asset supplied by the ArtCraft team) +license: LicenseRef-ArtCraft-Trademark — ArtCraft name and logo are trademarks of the ArtCraft team, all rights reserved; used in FilmCraft with permission. Not covered by the project's MIT OR Apache-2.0 licence. +license-file: +added: 2026-10-01 by Claude (agent) for Brandon Thomas +notes: 3200x333 PNG. Bundled in the app (About dialog, Home screen) and shown in the README header. First-party brand mark: the one exception to the open-licence rule (AGENTS.md §1.8). Forks and redistributions must remove or replace it unless they have permission. diff --git a/docs/brand/artcraft-logo-white.svg b/docs/brand/artcraft-logo-white.svg new file mode 100644 index 00000000..4af80f75 --- /dev/null +++ b/docs/brand/artcraft-logo-white.svg @@ -0,0 +1,7 @@ + + ArtCraft + + + + + diff --git a/docs/brand/artcraft-logo-white.svg.attribution b/docs/brand/artcraft-logo-white.svg.attribution new file mode 100644 index 00000000..2932cd46 --- /dev/null +++ b/docs/brand/artcraft-logo-white.svg.attribution @@ -0,0 +1,8 @@ +asset: artcraft-logo-white.svg +title: ArtCraft wordmark, light ink for dark backgrounds +author: ArtCraft team (Storyteller) +source: original work (first-party ArtCraft brand asset supplied by the ArtCraft team) +license: LicenseRef-ArtCraft-Trademark — ArtCraft name and logo are trademarks of the ArtCraft team, all rights reserved; used in FilmCraft with permission. Not covered by the project's MIT OR Apache-2.0 licence. +license-file: +added: 2026-10-01 by Claude (agent) for Brandon Thomas +notes: SVG. Bundled in the app (About dialog, Home screen) and shown in the README header. First-party brand mark: the one exception to the open-licence rule (AGENTS.md §1.8). Forks and redistributions must remove or replace it unless they have permission. diff --git a/docs/brand/artcraft-logo.png b/docs/brand/artcraft-logo.png new file mode 100644 index 00000000..a4d1544c Binary files /dev/null and b/docs/brand/artcraft-logo.png differ diff --git a/docs/brand/artcraft-logo.png.attribution b/docs/brand/artcraft-logo.png.attribution new file mode 100644 index 00000000..4402860a --- /dev/null +++ b/docs/brand/artcraft-logo.png.attribution @@ -0,0 +1,8 @@ +asset: artcraft-logo.png +title: ArtCraft wordmark (symbol + "ARTCRAFT"), dark ink for light backgrounds +author: ArtCraft team (Storyteller) +source: original work (first-party ArtCraft brand asset supplied by the ArtCraft team) +license: LicenseRef-ArtCraft-Trademark — ArtCraft name and logo are trademarks of the ArtCraft team, all rights reserved; used in FilmCraft with permission. Not covered by the project's MIT OR Apache-2.0 licence. +license-file: +added: 2026-10-01 by Claude (agent) for Brandon Thomas +notes: 3200x333 PNG. Bundled in the app (About dialog, Home screen) and shown in the README header. First-party brand mark: the one exception to the open-licence rule (AGENTS.md §1.8). Forks and redistributions must remove or replace it unless they have permission. diff --git a/docs/brand/artcraft-logo.svg b/docs/brand/artcraft-logo.svg new file mode 100644 index 00000000..d63f3eae --- /dev/null +++ b/docs/brand/artcraft-logo.svg @@ -0,0 +1,7 @@ + + ArtCraft + + + + + diff --git a/docs/brand/artcraft-logo.svg.attribution b/docs/brand/artcraft-logo.svg.attribution new file mode 100644 index 00000000..048a9c92 --- /dev/null +++ b/docs/brand/artcraft-logo.svg.attribution @@ -0,0 +1,8 @@ +asset: artcraft-logo.svg +title: ArtCraft wordmark (symbol + "ARTCRAFT"), dark ink for light backgrounds +author: ArtCraft team (Storyteller) +source: original work (first-party ArtCraft brand asset supplied by the ArtCraft team) +license: LicenseRef-ArtCraft-Trademark — ArtCraft name and logo are trademarks of the ArtCraft team, all rights reserved; used in FilmCraft with permission. Not covered by the project's MIT OR Apache-2.0 licence. +license-file: +added: 2026-10-01 by Claude (agent) for Brandon Thomas +notes: SVG. Bundled in the app (About dialog, Home screen) and shown in the README header. First-party brand mark: the one exception to the open-licence rule (AGENTS.md §1.8). Forks and redistributions must remove or replace it unless they have permission. diff --git a/docs/brand/artcraft-mark-black.png b/docs/brand/artcraft-mark-black.png new file mode 100644 index 00000000..27664bc1 Binary files /dev/null and b/docs/brand/artcraft-mark-black.png differ diff --git a/docs/brand/artcraft-mark-black.png.attribution b/docs/brand/artcraft-mark-black.png.attribution new file mode 100644 index 00000000..db190c1e --- /dev/null +++ b/docs/brand/artcraft-mark-black.png.attribution @@ -0,0 +1,8 @@ +asset: artcraft-mark-black.png +title: ArtCraft symbol ("A" mark), black +author: ArtCraft team (Storyteller) +source: original work (first-party ArtCraft brand asset supplied by the ArtCraft team) +license: LicenseRef-ArtCraft-Trademark — ArtCraft name and logo are trademarks of the ArtCraft team, all rights reserved; used in FilmCraft with permission. Not covered by the project's MIT OR Apache-2.0 licence. +license-file: +added: 2026-10-01 by Claude (agent) for Brandon Thomas +notes: 1024x1024 PNG. Kept for brand use (README, docs). First-party brand mark: the one exception to the open-licence rule (AGENTS.md §1.8). Forks and redistributions must remove or replace it unless they have permission. diff --git a/docs/brand/artcraft-mark-black.svg b/docs/brand/artcraft-mark-black.svg new file mode 100644 index 00000000..63943537 --- /dev/null +++ b/docs/brand/artcraft-mark-black.svg @@ -0,0 +1,4 @@ + + ArtCraft + + diff --git a/docs/brand/artcraft-mark-black.svg.attribution b/docs/brand/artcraft-mark-black.svg.attribution new file mode 100644 index 00000000..d7fdfc91 --- /dev/null +++ b/docs/brand/artcraft-mark-black.svg.attribution @@ -0,0 +1,8 @@ +asset: artcraft-mark-black.svg +title: ArtCraft symbol ("A" mark), black +author: ArtCraft team (Storyteller) +source: original work (first-party ArtCraft brand asset supplied by the ArtCraft team) +license: LicenseRef-ArtCraft-Trademark — ArtCraft name and logo are trademarks of the ArtCraft team, all rights reserved; used in FilmCraft with permission. Not covered by the project's MIT OR Apache-2.0 licence. +license-file: +added: 2026-10-01 by Claude (agent) for Brandon Thomas +notes: SVG. Kept for brand use (README, docs). First-party brand mark: the one exception to the open-licence rule (AGENTS.md §1.8). Forks and redistributions must remove or replace it unless they have permission. diff --git a/docs/brand/artcraft-mark.png b/docs/brand/artcraft-mark.png new file mode 100644 index 00000000..dbb3dc08 Binary files /dev/null and b/docs/brand/artcraft-mark.png differ diff --git a/docs/brand/artcraft-mark.png.attribution b/docs/brand/artcraft-mark.png.attribution new file mode 100644 index 00000000..0976b0f4 --- /dev/null +++ b/docs/brand/artcraft-mark.png.attribution @@ -0,0 +1,8 @@ +asset: artcraft-mark.png +title: ArtCraft symbol ("A" mark), blue +author: ArtCraft team (Storyteller) +source: original work (first-party ArtCraft brand asset supplied by the ArtCraft team) +license: LicenseRef-ArtCraft-Trademark — ArtCraft name and logo are trademarks of the ArtCraft team, all rights reserved; used in FilmCraft with permission. Not covered by the project's MIT OR Apache-2.0 licence. +license-file: +added: 2026-10-01 by Claude (agent) for Brandon Thomas +notes: 1024x1024 PNG. Bundled in the app (About dialog, Home screen) and shown in the README header. First-party brand mark: the one exception to the open-licence rule (AGENTS.md §1.8). Forks and redistributions must remove or replace it unless they have permission. diff --git a/docs/brand/artcraft-mark.svg b/docs/brand/artcraft-mark.svg new file mode 100644 index 00000000..72e191f8 --- /dev/null +++ b/docs/brand/artcraft-mark.svg @@ -0,0 +1,4 @@ + + ArtCraft + + diff --git a/docs/brand/artcraft-mark.svg.attribution b/docs/brand/artcraft-mark.svg.attribution new file mode 100644 index 00000000..4e98a893 --- /dev/null +++ b/docs/brand/artcraft-mark.svg.attribution @@ -0,0 +1,8 @@ +asset: artcraft-mark.svg +title: ArtCraft symbol ("A" mark), blue +author: ArtCraft team (Storyteller) +source: original work (first-party ArtCraft brand asset supplied by the ArtCraft team) +license: LicenseRef-ArtCraft-Trademark — ArtCraft name and logo are trademarks of the ArtCraft team, all rights reserved; used in FilmCraft with permission. Not covered by the project's MIT OR Apache-2.0 licence. +license-file: +added: 2026-10-01 by Claude (agent) for Brandon Thomas +notes: SVG. Bundled in the app (About dialog, Home screen) and shown in the README header. First-party brand mark: the one exception to the open-licence rule (AGENTS.md §1.8). Forks and redistributions must remove or replace it unless they have permission.