Files
Ferrous-Solitaire/solitaire_engine/src/assets/icon_svg.rs
T
funman300 8325bf6cf7 chore: rename app from Solitaire Quest to Ferrous Solitaire
Replace all display-name occurrences across web pages, Rust source,
docs, and Cargo metadata. Update localStorage token key from sq_token
to fs_token. Tagline "Klondike Solitaire" retained as genre descriptor.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-13 17:04:45 -07:00

71 lines
3.3 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//! SVG builder for the Ferrous Solitaire application icon.
//!
//! Renders the project's signature `▌RS` Terminal mark (the same
//! cursor-block + monogram pair used on the splash boot-screen and
//! card backs) on a dark `#151515` background with a 1 px brick-red
//! border. Square aspect, authored in a 64-unit logical box and
//! scaled at the rasterisation site.
//!
//! Reads at every size from 16 px taskbar tile to 1024 px macOS
//! Retina icon — the high-contrast cursor block carries the
//! recognition load and the smaller `RS` letters sit beneath as
//! a secondary recognition cue.
//!
//! Same SVG-to-PNG pipeline as `card_face_svg` — `icon_generator`
//! example rasterises this at multiple target sizes and writes
//! into `assets/icon/`. The `icon_svg_pin` integration test hashes
//! rasterised RGBA bytes to guard against `usvg`/`resvg` drift.
use bevy::math::UVec2;
/// Default rasterisation target — single canonical size used by the
/// runtime `Window::icon` wiring. The generator example emits
/// additional sizes (16, 32, 48, 64, 128, 256, 512, 1024) for the
/// Linux hicolor hierarchy and for downstream `.ico` / `.icns`
/// packaging.
pub const TARGET: UVec2 = UVec2::new(256, 256);
/// Every size the `icon_generator` example emits. Covers Linux
/// hicolor (16, 24, 32, 48, 64, 128, 256, 512), Windows `.ico`
/// targets (16, 32, 48, 256), and macOS `.icns` targets (16, 32,
/// 64, 128, 256, 512, 1024).
pub const ICON_SIZES: &[u32] = &[16, 24, 32, 48, 64, 128, 256, 512, 1024];
const BG: &str = "#151515"; // BG_BASE
const ACCENT: &str = "#a54242"; // ACCENT_PRIMARY brick red
const FG: &str = "#d0d0d0"; // TEXT_PRIMARY
/// Build the icon SVG. Square aspect, 64 logical units per side.
pub fn icon_svg() -> String {
// Layout in a 64×64 logical box:
// border: 1 logical unit, brick-red, inset 0.5 to
// centre the stroke inside the pixmap.
// corner radius: 6 units (~9 % of side, scales smoothly down
// to 16 px where it disappears into pixel grid).
// `▌` cursor: 18 px tall, 6 px wide, brick-red, centred
// horizontally, sitting on a baseline at y=40
// so there's room for `RS` beneath it.
// `RS` mark: 14 px FiraMono Bold at y=58, foreground gray,
// letter-spaced for readability at small sizes.
//
// The `▌` glyph is U+258C (LEFT HALF BLOCK) — same character the
// splash and card-back monogram use, rendered upright at icon
// scale. FiraMono carries this at usable size (verified by the
// splash + card-back rendering), so `<text>` is safe here unlike
// the suit glyphs.
format!(
r##"<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64">
<rect x="0.5" y="0.5" width="63" height="63" rx="6" ry="6"
fill="{BG}" stroke="{ACCENT}" stroke-width="1"/>
<!-- Centred ▌ cursor block at y=22..40, brick-red. -->
<rect x="29" y="22" width="6" height="18" fill="{ACCENT}"/>
<!-- RS monogram beneath, foreground gray. text-anchor=middle so
the letterforms balance around the cursor block above. -->
<text x="32" y="56" font-family="Fira Mono" font-size="14" font-weight="700"
fill="{FG}" text-anchor="middle" letter-spacing="1">RS</text>
</svg>"##
)
}