Library changes outside the platform's own dependencies (those came with the platform commits above). libs/asset and libs/flow move to the Stage repository with the apps that use them. Covers work ebf442a94..2b1a41df4 for libs: - wm: the Android super-app compiles tiles on the phone against the host engine - cargo-makepad: the super-app APK is packed by `android dyn-pack`, in Rust - cef: a page's audio can be captured instead of played - flow: the flow-ui app and the flowgraph canvas return to the workspace, with staged progress in libs/flow - svg: a stroke that bends tighter than its half width collapses its inner edge to the corner - the accent a name is written with stops deciding whether search finds it - ai stems: LaneDemixer, VocalsModel and the platform Stage origin/main needs - The regex engine accepts \b and \B, reports the earliest match so a scan can resume after it, and can decide word boundaries on ASCII so a code sear - workspace: Scope's settings carry the code map's tab width and the directories each prepared project hides from its map - cef, video, platform: what Stage's browser needs from the shared layers - platform, wm: work builds again on iOS, tvOS and wasm, and the window manager is warning-free on Windows - ci: tools/ci, a Splash runtime that watches a branch and runs every ci.splash it finds - stitch: the crate says what the rest of the repository says about its license - ci: a run is one target dir and one cargo batch per target, and the wall draws - apps: what the CI box found - Remove Flow, asset and VJ applications moved into Stage - tests: the workspace suite, run as a whole for the first time, passes outside the example UI tests - libs: no warnings in the workspace check on any row - tests: the last three failures of the CI box's night - gif: the crate's doc examples compile - cef: a hosted browser survives its host's exit - tests: the three binaries over ten seconds in release come under it - git: the memory ledger can take what it is asked for - script: re-entrant dispatch, thread index validation, Any-based handle downcasts, UTF-8 previews; regex: never_loop fix - fix(text): enable ttf-parser gvar-alloc for many-tuple variable fonts - platform, widgets, wm: a touch that is taken away is cancelled, never released - platform, wm: hosted apps ask the WM for what they cannot do themselves - wm on Android: apps build on the phone - task, cargo-makepad, widgets, audio: the task manager chooses its columns, graphs every process' network and disk traffic and installs itself as a D - flowgraph: ordered ports take many wires, sockets can override their icon, and the canvas embeds as a viewport - cef: captured frames and audio carry callback clocks and a navigation epoch - git: timings read a portable clock - ai: the hub's rig-fixture tests find the asset library without the asset client - ai llm: a Metal main buffer is filled in 32 MB chunks - diskmap: a scan lists each macOS directory in one getattrlistbulk call and classifies files without allocating or locking - platform, widgets, audio_route, ai: window crossfades and whole-frame presents, caption controls that click, themed menus, a stereo-pair audio tap, - builder: the Builder TUI matches the new terminal design, Windows executables carry app icons, and every app has one - sheets, score, git, home: saves cannot cut a file short or overwrite another one, and checkouts cannot write outside the repository - git: worktree status matches git on real repositories and can be cancelled - cuda: builds link only the CUDA toolkit they are given, never a system install - audio_route: one API on macOS, Windows and Linux, monitoring by default and processing only when asked, plus shaders that discard a value compile to - platform, widgets, ai: a restyle recompiles nothing it already has, shows only complete frames, and a window can own its caption - audio_route example: print the samples that reached the processor each second - widgets, builder: the big widget families are features, all on by default, and the Builder takes none of them - ai hub: a local chat with no model says so once, plainly - ai: Claude Desktop drives any app with the F10 panel - wm: children open no console windows on Windows - ai: Connect hands the .mcpb to Claude Desktop itself - civil-time: one local wall clock for every app, and it knows the zone on Windows - ai-speech: makepad-ai-sfx (and with it ai-h3) is built only for IndexTTS - script + wasm_bridge: no build script that reruns on every file - build: the AI stack, csg, Scope and Source Library join the one workspace - ai chat: the chat's backends are the CLI, MCP and cloud providers; the local model is the `localai` feature - widgets: every widget family is a crate of its own under widgets/families, and makepad-widgets links, re-exports and registers the ones its features - apps, examples, libs: each crate builds only the widget families it uses, and the design overlay is each app's own default feature - livepipe: takes makepad-widgets without its default families, now that the AI stack is in the one workspace - ai chat: a build without local AI starts on the first provider that answers here, not on "No model" - thiserror: RUSTC_BOOTSTRAP no longer turns on the unstable generic member access API - builder: makepad-builder.exe declares itself like a well-formed Windows program and stops a stalled build through a job object instead of taskkill - builder + ai-cuda: the CUDA kernel progress shows in the Builder's Compile row, not scribbled over its screen - repo: no third-party comic archive, generated models or sample asset in the tree - builder: the Windows Builder ships as source, runs in its own console, and apps compile with Rust's GNU toolchain or Microsoft's - win_resource: PNG decode and encode on makepad-fast-inflate instead of zune-png - builder: one folder layout everywhere, makepad-builder.zip with only the files a Windows build reads, a Rust download over parallel connections, and Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
50 lines
2.1 KiB
Rust
50 lines
2.1 KiB
Rust
//! Cuts an app icon rendered on an opaque white page (macOS QuickLook, see
|
|
//! tools/app_icons/render.sh) back to its rounded square: pixels outside the
|
|
//! square become transparent and edge pixels are un-blended from the white,
|
|
//! so the icon sits cleanly on any Dock or taskbar. The square is the shared
|
|
//! app icon background: x/y 64, size 896, corner radius 200 on 1024.
|
|
//! cargo run --release -p makepad-win-resource --example icon_mask -- icon_1024.png...
|
|
use makepad_win_resource::image::Image;
|
|
|
|
fn coverage(x: u32, y: u32, scale: f32) -> f32 {
|
|
let (lo, hi, r) = (64.0 * scale, 960.0 * scale, 200.0 * scale);
|
|
let mut inside = 0;
|
|
for sy in 0..4 {
|
|
for sx in 0..4 {
|
|
let px = x as f32 + (sx as f32 + 0.5) / 4.0;
|
|
let py = y as f32 + (sy as f32 + 0.5) / 4.0;
|
|
let cx = px.clamp(lo + r, hi - r);
|
|
let cy = py.clamp(lo + r, hi - r);
|
|
let within = px >= lo && px <= hi && py >= lo && py <= hi;
|
|
if within && (px - cx).powi(2) + (py - cy).powi(2) <= r * r {
|
|
inside += 1;
|
|
}
|
|
}
|
|
}
|
|
inside as f32 / 16.0
|
|
}
|
|
|
|
fn main() {
|
|
for path in std::env::args().skip(1) {
|
|
let png = std::fs::read(&path).unwrap_or_else(|e| panic!("{path}: {e}"));
|
|
let mut image = Image::decode_png(&png).unwrap_or_else(|e| panic!("{path}: {e}"));
|
|
let scale = image.width as f32 / 1024.0;
|
|
for y in 0..image.height {
|
|
for x in 0..image.width {
|
|
let i = (y * image.width + x) as usize * 4;
|
|
let a = coverage(x, y, scale);
|
|
let pixel = &mut image.rgba[i..i + 4];
|
|
if a == 0.0 {
|
|
pixel.copy_from_slice(&[0, 0, 0, 0]);
|
|
} else if a < 1.0 {
|
|
for c in &mut pixel[..3] {
|
|
*c = ((*c as f32 - 255.0 * (1.0 - a)) / a).clamp(0.0, 255.0).round() as u8;
|
|
}
|
|
pixel[3] = (a * 255.0).round() as u8;
|
|
}
|
|
}
|
|
}
|
|
std::fs::write(&path, image.encode_png().unwrap_or_else(|e| panic!("{path}: {e}"))).unwrap();
|
|
println!("{path}");
|
|
}
|
|
}
|