diff --git a/crates/sylpheed-formats/examples/rest_scale_of.rs b/crates/sylpheed-formats/examples/rest_scale_of.rs new file mode 100644 index 00000000..eb238a81 --- /dev/null +++ b/crates/sylpheed-formats/examples/rest_scale_of.rs @@ -0,0 +1,32 @@ +//! The resting SCALE of each element, so a drawn quad's size can be predicted. +//! +//! One additive draw on both the main menu and `EXTRAS` measures 819.2 x 720 px +//! and matches no sprite at 1x or 2x. Scale is the missing factor: the keyframe +//! carries scale_x / scale_y in percent, and a sprite drawn at 200 % x 500 % is +//! nothing like its stored size. +//! +//! cargo run -p sylpheed-formats --example rest_scale_of -- 5 6 4 +use sylpheed_formats::{pak::PakArchive, ui_layout}; +use std::path::PathBuf; + +fn main() { + let root = PathBuf::from(std::env::var("SYLPHEED_DISC").expect("SYLPHEED_DISC")); + let ar = PakArchive::open(root.join("dat/GP_TITLE.pak")).expect("GP_TITLE"); + let builds: Vec = std::env::args().skip(1).filter_map(|a| a.parse().ok()).collect(); + for build in if builds.is_empty() { vec![5usize, 6] } else { builds } { + let by = ar.read(&ar.entries()[build]).expect("entry"); + let b = ui_layout::parse_build(&by).expect("build"); + println!("=== GP_TITLE entry {build} ==="); + println!("{:<22} {:>10} {:>7} {:>7} {:>12} {}", "element", "pivot(w,h)", "sx%", "sy%", "drawn px", "at 1x/2x of pivot*2"); + for e in &b.elements { + let k = match e.rest() { Some(k) => k, None => continue }; + let w = e.pivot_x * 2; + let h = e.pivot_y * 2; + let dw = w as f64 * k.scale_x as f64 / 100.0; + let dh = h as f64 * k.scale_y as f64 / 100.0; + println!("{:<22} {:>4},{:<5} {:>7} {:>7} {:>6.1}x{:<5.1} {:>6.1}x{:<5.1}", + e.name, w, h, k.scale_x, k.scale_y, dw, dh, dw * 2.0, dh * 2.0); + } + println!(); + } +} diff --git a/docs/re/captures/ui-draws/blend-extras-run2-2026-08-31.log b/docs/re/captures/ui-draws/blend-extras-run2-2026-08-31.log new file mode 100644 index 00000000..6e2d1a5b --- /dev/null +++ b/docs/re/captures/ui-draws/blend-extras-run2-2026-08-31.log @@ -0,0 +1,106 @@ +# every draw in SUBMISSION ORDER, undeduplicated, frames 2..7 +# tex dimensions identify the sprite; base is the guest address + 0 prim=8 indices=3 vs=0x0A6D1DD7767FDF27 ps=0x2E372EA28CC404B7 blend=0x00010001[c:src=1 op=0 dst=0 a:src=1 op=0 dst=0] cc=0x00000000 mask=0xFFFF + vb=0x14EF66F8 stride=28 attrs=[57@0 38@12 ] fmt0=57 v: [-0.50,-0.50,z=0.00000] [1279.50,-0.50,z=0.00000] [1279.50,719.50,z=0.00000] + 1 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x07010701[c:src=1 op=0 dst=7 a:src=1 op=0 dst=7] cc=0x8700000C mask=0xF tex[base=0x11C30000 1280x768 fmt=6] + vb=0x14EF6750 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-1.00,1.00,z=0.00000,col=FFFFFFFF] [1.00,1.00,z=0.00000,col=FFFFFFFF] [1.00,-1.00,z=0.00000,col=FFFFFFFF] [-1.00,-1.00,z=0.00000,col=FFFFFFFF] + 2 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x01010101[c:src=1 op=0 dst=1 a:src=1 op=0 dst=1] cc=0x8700000C mask=0xF tex[base=0x11C30000 1280x768 fmt=6] + vb=0x14EF67B0 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [0.10,1.58,z=0.00000,col=A4FFFFFF] [0.64,1.02,z=0.00000,col=A4FFFFFF] [-0.20,-1.57,z=0.00000,col=A4FFFFFF] [-0.74,-1.02,z=0.00000,col=A4FFFFFF] + 3 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x01010101[c:src=1 op=0 dst=1 a:src=1 op=0 dst=1] cc=0x8700000C mask=0xF tex[base=0x0BFE0000 1280x768 fmt=6] + vb=0x14EF6810 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.68,1.02,z=0.00000,col=9DFFFFFF] [-0.24,1.81,z=0.00000,col=9DFFFFFF] [1.35,-1.02,z=0.00000,col=9DFFFFFF] [0.91,-1.81,z=0.00000,col=9DFFFFFF] + 4 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x07010701[c:src=1 op=0 dst=7 a:src=1 op=0 dst=7] cc=0x8700000C mask=0xF tex[base=0x0C3B0000 1280x768 fmt=6] + vb=0x14EF6870 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-1.00,1.00,z=0.00000,col=FFFFFFFF] [1.00,1.00,z=0.00000,col=FFFFFFFF] [1.00,-1.00,z=0.00000,col=FFFFFFFF] [-1.00,-1.00,z=0.00000,col=FFFFFFFF] + 5 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0x5773DC18083C4C20 blend=0x07010701[c:src=1 op=0 dst=7 a:src=1 op=0 dst=7] cc=0x8700000C mask=0xF + vb=0x14EF68D0 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-1.00,1.00,z=0.00000,col=40000000] [1.00,1.00,z=0.00000,col=40000000] [1.00,-1.00,z=0.00000,col=40000000] [-1.00,-1.00,z=0.00000,col=40000000] + 6 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x01010101[c:src=1 op=0 dst=1 a:src=1 op=0 dst=1] cc=0x8700000C mask=0xF tex[base=0x0BFE0000 1280x768 fmt=6] + vb=0x14EF6930 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.64,1.00,z=0.00000,col=FFFFFFFF] [0.64,1.00,z=0.00000,col=FFFFFFFF] [0.64,-1.00,z=0.00000,col=FFFFFFFF] [-0.64,-1.00,z=0.00000,col=FFFFFFFF] + 7 prim=13 indices=24 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x01010101[c:src=1 op=0 dst=1 a:src=1 op=0 dst=1] cc=0x8700000C mask=0xF tex[base=0x11C30000 1280x768 fmt=6] + vb=0x14EF6990 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.48,0.67,z=0.00000,col=80FFFFFF] [0.48,0.67,z=0.00000,col=80FFFFFF] [0.48,-0.77,z=0.00000,col=80FFFFFF] [-0.48,-0.77,z=0.00000,col=80FFFFFF] [-0.31,0.36,z=0.00000,col=FFFFFFFF] [0.07,0.36,z=0.00000,col=FFFFFFFF] [0.07,-0.25,z=0.00000,col=FFFFFFFF] [-0.31,-0.25,z=0.00000,col=FFFFFFFF] [-0.09,0.12,z=0.00000,col=FFFFFFFF] [0.31,0.12,z=0.00000,col=FFFFFFFF] [0.31,-0.47,z=0.00000,col=FFFFFFFF] [-0.09,-0.47,z=0.00000,col=FFFFFFFF] [-0.32,0.60,z=0.00000,col=FFFFFFFF] [0.31,0.60,z=0.00000,col=FFFFFFFF] [0.31,0.59,z=0.00000,col=FFFFFFFF] [-0.32,0.59,z=0.00000,col=FFFFFFFF] [-0.33,0.63,z=0.00000,col=FFFFFFFF] [0.33,0.63,z=0.00000,col=FFFFFFFF] [0.33,0.61,z=0.00000,col=FFFFFFFF] [-0.33,0.61,z=0.00000,col=FFFFFFFF] [-0.34,0.66,z=0.00000,col=FFFFFFFF] [0.34,0.66,z=0.00000,col=FFFFFFFF] [0.34,0.64,z=0.00000,col=FFFFFFFF] [-0.34,0.64,z=0.00000,col=FFFFFFFF] + 8 prim=13 indices=24 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x07010701[c:src=1 op=0 dst=7 a:src=1 op=0 dst=7] cc=0x8700000C mask=0xF tex[base=0x11C30000 1280x768 fmt=6] + vb=0x14EF6BD0 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.27,-0.51,z=0.00000,col=FFFFFFFF] [0.28,-0.51,z=0.00000,col=FFFFFFFF] [0.28,-0.62,z=0.00000,col=FFFFFFFF] [-0.27,-0.62,z=0.00000,col=FFFFFFFF] [-0.14,0.72,z=0.00000,col=FFFFFFFF] [0.14,0.72,z=0.00000,col=FFFFFFFF] [0.14,0.63,z=0.00000,col=FFFFFFFF] [-0.14,0.63,z=0.00000,col=FFFFFFFF] [-0.18,0.24,z=0.00000,col=FFFFFFFF] [0.24,0.24,z=0.00000,col=FFFFFFFF] [0.24,0.08,z=0.00000,col=FFFFFFFF] [-0.18,0.08,z=0.00000,col=FFFFFFFF] [-0.15,0.16,z=0.00000,col=FFFFFFFF] [-0.20,0.08,z=0.00000,col=FFFFFFFF] [-0.25,0.16,z=0.00000,col=FFFFFFFF] [-0.20,0.25,z=0.00000,col=FFFFFFFF] [-0.17,-0.00,z=0.00000,col=FFFFFFFF] [0.22,-0.00,z=0.00000,col=FFFFFFFF] [0.22,-0.12,z=0.00000,col=FFFFFFFF] [-0.17,-0.12,z=0.00000,col=FFFFFFFF] [-0.17,-0.23,z=0.00000,col=FFFFFFFF] [0.00,-0.23,z=0.00000,col=FFFFFFFF] [0.00,-0.35,z=0.00000,col=FFFFFFFF] [-0.17,-0.35,z=0.00000,col=FFFFFFFF] + 9 prim=8 indices=3 vs=0x72CBCAA6A7984111 ps=0xE59B2B3DA4AA9008 blend=0x07010701[c:src=1 op=0 dst=7 a:src=1 op=0 dst=7] cc=0x8700000C mask=0xF tex[base=0x10000000 1x1 fmt=26] + 10 prim=8 indices=3 vs=0x72CBCAA6A7984111 ps=0xE59B2B3DA4AA9008 blend=0x07010701[c:src=1 op=0 dst=7 a:src=1 op=0 dst=7] cc=0x8700000C mask=0xF tex[base=0x10000000 1x1 fmt=26] +--- frame 3 --- + 11 prim=8 indices=3 vs=0x0A6D1DD7767FDF27 ps=0x2E372EA28CC404B7 blend=0x00010001[c:src=1 op=0 dst=0 a:src=1 op=0 dst=0] cc=0x00000000 mask=0xFFFF + vb=0x14F16EB8 stride=28 attrs=[57@0 38@12 ] fmt0=57 v: [-0.50,-0.50,z=0.00000] [1279.50,-0.50,z=0.00000] [1279.50,719.50,z=0.00000] + 12 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x07010701[c:src=1 op=0 dst=7 a:src=1 op=0 dst=7] cc=0x8700000C mask=0xF tex[base=0x11C30000 1280x768 fmt=6] + vb=0x14F16F10 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-1.00,1.00,z=0.00000,col=FFFFFFFF] [1.00,1.00,z=0.00000,col=FFFFFFFF] [1.00,-1.00,z=0.00000,col=FFFFFFFF] [-1.00,-1.00,z=0.00000,col=FFFFFFFF] + 13 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x01010101[c:src=1 op=0 dst=1 a:src=1 op=0 dst=1] cc=0x8700000C mask=0xF tex[base=0x11C30000 1280x768 fmt=6] + vb=0x14F16F70 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [0.11,1.58,z=0.00000,col=A4FFFFFF] [0.65,1.02,z=0.00000,col=A4FFFFFF] [-0.20,-1.57,z=0.00000,col=A4FFFFFF] [-0.74,-1.02,z=0.00000,col=A4FFFFFF] + 14 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x01010101[c:src=1 op=0 dst=1 a:src=1 op=0 dst=1] cc=0x8700000C mask=0xF tex[base=0x0BFE0000 1280x768 fmt=6] + vb=0x14F16FD0 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.69,1.02,z=0.00000,col=9DFFFFFF] [-0.25,1.81,z=0.00000,col=9DFFFFFF] [1.35,-1.02,z=0.00000,col=9DFFFFFF] [0.90,-1.81,z=0.00000,col=9DFFFFFF] + 15 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x07010701[c:src=1 op=0 dst=7 a:src=1 op=0 dst=7] cc=0x8700000C mask=0xF tex[base=0x0C3B0000 1280x768 fmt=6] + vb=0x14F17030 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-1.00,1.00,z=0.00000,col=FFFFFFFF] [1.00,1.00,z=0.00000,col=FFFFFFFF] [1.00,-1.00,z=0.00000,col=FFFFFFFF] [-1.00,-1.00,z=0.00000,col=FFFFFFFF] + 16 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0x5773DC18083C4C20 blend=0x07010701[c:src=1 op=0 dst=7 a:src=1 op=0 dst=7] cc=0x8700000C mask=0xF + vb=0x14F17090 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-1.00,1.00,z=0.00000,col=40000000] [1.00,1.00,z=0.00000,col=40000000] [1.00,-1.00,z=0.00000,col=40000000] [-1.00,-1.00,z=0.00000,col=40000000] + 17 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x01010101[c:src=1 op=0 dst=1 a:src=1 op=0 dst=1] cc=0x8700000C mask=0xF tex[base=0x0BFE0000 1280x768 fmt=6] + vb=0x14F170F0 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.64,1.00,z=0.00000,col=FFFFFFFF] [0.64,1.00,z=0.00000,col=FFFFFFFF] [0.64,-1.00,z=0.00000,col=FFFFFFFF] [-0.64,-1.00,z=0.00000,col=FFFFFFFF] + 18 prim=13 indices=24 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x01010101[c:src=1 op=0 dst=1 a:src=1 op=0 dst=1] cc=0x8700000C mask=0xF tex[base=0x11C30000 1280x768 fmt=6] + vb=0x14F17150 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.48,0.67,z=0.00000,col=80FFFFFF] [0.48,0.67,z=0.00000,col=80FFFFFF] [0.48,-0.77,z=0.00000,col=80FFFFFF] [-0.48,-0.77,z=0.00000,col=80FFFFFF] [-0.31,0.36,z=0.00000,col=FFFFFFFF] [0.07,0.36,z=0.00000,col=FFFFFFFF] [0.07,-0.25,z=0.00000,col=FFFFFFFF] [-0.31,-0.25,z=0.00000,col=FFFFFFFF] [-0.09,0.12,z=0.00000,col=FFFFFFFF] [0.31,0.12,z=0.00000,col=FFFFFFFF] [0.31,-0.47,z=0.00000,col=FFFFFFFF] [-0.09,-0.47,z=0.00000,col=FFFFFFFF] [-0.32,0.60,z=0.00000,col=FFFFFFFF] [0.31,0.60,z=0.00000,col=FFFFFFFF] [0.31,0.59,z=0.00000,col=FFFFFFFF] [-0.32,0.59,z=0.00000,col=FFFFFFFF] [-0.33,0.63,z=0.00000,col=FFFFFFFF] [0.33,0.63,z=0.00000,col=FFFFFFFF] [0.33,0.61,z=0.00000,col=FFFFFFFF] [-0.33,0.61,z=0.00000,col=FFFFFFFF] [-0.34,0.66,z=0.00000,col=FFFFFFFF] [0.34,0.66,z=0.00000,col=FFFFFFFF] [0.34,0.64,z=0.00000,col=FFFFFFFF] [-0.34,0.64,z=0.00000,col=FFFFFFFF] + 19 prim=13 indices=24 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x07010701[c:src=1 op=0 dst=7 a:src=1 op=0 dst=7] cc=0x8700000C mask=0xF tex[base=0x11C30000 1280x768 fmt=6] + vb=0x14F17390 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.27,-0.51,z=0.00000,col=FFFFFFFF] [0.28,-0.51,z=0.00000,col=FFFFFFFF] [0.28,-0.62,z=0.00000,col=FFFFFFFF] [-0.27,-0.62,z=0.00000,col=FFFFFFFF] [-0.14,0.72,z=0.00000,col=FFFFFFFF] [0.14,0.72,z=0.00000,col=FFFFFFFF] [0.14,0.63,z=0.00000,col=FFFFFFFF] [-0.14,0.63,z=0.00000,col=FFFFFFFF] [-0.18,0.24,z=0.00000,col=FFFFFFFF] [0.24,0.24,z=0.00000,col=FFFFFFFF] [0.24,0.08,z=0.00000,col=FFFFFFFF] [-0.18,0.08,z=0.00000,col=FFFFFFFF] [-0.15,0.15,z=0.00000,col=FFFFFFFF] [-0.20,0.07,z=0.00000,col=FFFFFFFF] [-0.25,0.17,z=0.00000,col=FFFFFFFF] [-0.20,0.25,z=0.00000,col=FFFFFFFF] [-0.17,-0.00,z=0.00000,col=FFFFFFFF] [0.22,-0.00,z=0.00000,col=FFFFFFFF] [0.22,-0.12,z=0.00000,col=FFFFFFFF] [-0.17,-0.12,z=0.00000,col=FFFFFFFF] [-0.17,-0.23,z=0.00000,col=FFFFFFFF] [0.00,-0.23,z=0.00000,col=FFFFFFFF] [0.00,-0.35,z=0.00000,col=FFFFFFFF] [-0.17,-0.35,z=0.00000,col=FFFFFFFF] + 20 prim=8 indices=3 vs=0x72CBCAA6A7984111 ps=0xE59B2B3DA4AA9008 blend=0x07010701[c:src=1 op=0 dst=7 a:src=1 op=0 dst=7] cc=0x8700000C mask=0xF tex[base=0x10000000 1x1 fmt=26] + 21 prim=8 indices=3 vs=0x72CBCAA6A7984111 ps=0xE59B2B3DA4AA9008 blend=0x07010701[c:src=1 op=0 dst=7 a:src=1 op=0 dst=7] cc=0x8700000C mask=0xF tex[base=0x10000000 1x1 fmt=26] +--- frame 4 --- + 22 prim=8 indices=3 vs=0x0A6D1DD7767FDF27 ps=0x2E372EA28CC404B7 blend=0x00010001[c:src=1 op=0 dst=0 a:src=1 op=0 dst=0] cc=0x00000000 mask=0xFFFF + vb=0x14F37678 stride=28 attrs=[57@0 38@12 ] fmt0=57 v: [-0.50,-0.50,z=0.00000] [1279.50,-0.50,z=0.00000] [1279.50,719.50,z=0.00000] + 23 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x07010701[c:src=1 op=0 dst=7 a:src=1 op=0 dst=7] cc=0x8700000C mask=0xF tex[base=0x11C30000 1280x768 fmt=6] + vb=0x14F376D0 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-1.00,1.00,z=0.00000,col=FFFFFFFF] [1.00,1.00,z=0.00000,col=FFFFFFFF] [1.00,-1.00,z=0.00000,col=FFFFFFFF] [-1.00,-1.00,z=0.00000,col=FFFFFFFF] + 24 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x01010101[c:src=1 op=0 dst=1 a:src=1 op=0 dst=1] cc=0x8700000C mask=0xF tex[base=0x11C30000 1280x768 fmt=6] + vb=0x14F37730 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [0.11,1.58,z=0.00000,col=A4FFFFFF] [0.65,1.02,z=0.00000,col=A4FFFFFF] [-0.19,-1.57,z=0.00000,col=A4FFFFFF] [-0.73,-1.02,z=0.00000,col=A4FFFFFF] + 25 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x01010101[c:src=1 op=0 dst=1 a:src=1 op=0 dst=1] cc=0x8700000C mask=0xF tex[base=0x0BFE0000 1280x768 fmt=6] + vb=0x14F37790 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.69,1.02,z=0.00000,col=9EFFFFFF] [-0.25,1.81,z=0.00000,col=9EFFFFFF] [1.34,-1.02,z=0.00000,col=9EFFFFFF] [0.90,-1.81,z=0.00000,col=9EFFFFFF] + 26 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x07010701[c:src=1 op=0 dst=7 a:src=1 op=0 dst=7] cc=0x8700000C mask=0xF tex[base=0x0C3B0000 1280x768 fmt=6] + vb=0x14F377F0 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-1.00,1.00,z=0.00000,col=FFFFFFFF] [1.00,1.00,z=0.00000,col=FFFFFFFF] [1.00,-1.00,z=0.00000,col=FFFFFFFF] [-1.00,-1.00,z=0.00000,col=FFFFFFFF] + 27 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0x5773DC18083C4C20 blend=0x07010701[c:src=1 op=0 dst=7 a:src=1 op=0 dst=7] cc=0x8700000C mask=0xF + vb=0x14F37850 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-1.00,1.00,z=0.00000,col=40000000] [1.00,1.00,z=0.00000,col=40000000] [1.00,-1.00,z=0.00000,col=40000000] [-1.00,-1.00,z=0.00000,col=40000000] + 28 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x01010101[c:src=1 op=0 dst=1 a:src=1 op=0 dst=1] cc=0x8700000C mask=0xF tex[base=0x0BFE0000 1280x768 fmt=6] + vb=0x14F378B0 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.64,1.00,z=0.00000,col=FFFFFFFF] [0.64,1.00,z=0.00000,col=FFFFFFFF] [0.64,-1.00,z=0.00000,col=FFFFFFFF] [-0.64,-1.00,z=0.00000,col=FFFFFFFF] + 29 prim=13 indices=24 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x01010101[c:src=1 op=0 dst=1 a:src=1 op=0 dst=1] cc=0x8700000C mask=0xF tex[base=0x11C30000 1280x768 fmt=6] + vb=0x14F37910 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.48,0.67,z=0.00000,col=80FFFFFF] [0.48,0.67,z=0.00000,col=80FFFFFF] [0.48,-0.77,z=0.00000,col=80FFFFFF] [-0.48,-0.77,z=0.00000,col=80FFFFFF] [-0.31,0.36,z=0.00000,col=FFFFFFFF] [0.07,0.36,z=0.00000,col=FFFFFFFF] [0.07,-0.25,z=0.00000,col=FFFFFFFF] [-0.31,-0.25,z=0.00000,col=FFFFFFFF] [-0.09,0.12,z=0.00000,col=FFFFFFFF] [0.31,0.12,z=0.00000,col=FFFFFFFF] [0.31,-0.47,z=0.00000,col=FFFFFFFF] [-0.09,-0.47,z=0.00000,col=FFFFFFFF] [-0.32,0.60,z=0.00000,col=FFFFFFFF] [0.31,0.60,z=0.00000,col=FFFFFFFF] [0.31,0.59,z=0.00000,col=FFFFFFFF] [-0.32,0.59,z=0.00000,col=FFFFFFFF] [-0.33,0.63,z=0.00000,col=FFFFFFFF] [0.33,0.63,z=0.00000,col=FFFFFFFF] [0.33,0.61,z=0.00000,col=FFFFFFFF] [-0.33,0.61,z=0.00000,col=FFFFFFFF] [-0.34,0.66,z=0.00000,col=FFFFFFFF] [0.34,0.66,z=0.00000,col=FFFFFFFF] [0.34,0.64,z=0.00000,col=FFFFFFFF] [-0.34,0.64,z=0.00000,col=FFFFFFFF] + 30 prim=13 indices=24 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x07010701[c:src=1 op=0 dst=7 a:src=1 op=0 dst=7] cc=0x8700000C mask=0xF tex[base=0x11C30000 1280x768 fmt=6] + vb=0x14F37B50 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.27,-0.51,z=0.00000,col=FFFFFFFF] [0.28,-0.51,z=0.00000,col=FFFFFFFF] [0.28,-0.62,z=0.00000,col=FFFFFFFF] [-0.27,-0.62,z=0.00000,col=FFFFFFFF] [-0.14,0.72,z=0.00000,col=FFFFFFFF] [0.14,0.72,z=0.00000,col=FFFFFFFF] [0.14,0.63,z=0.00000,col=FFFFFFFF] [-0.14,0.63,z=0.00000,col=FFFFFFFF] [-0.18,0.24,z=0.00000,col=FFFFFFFF] [0.24,0.24,z=0.00000,col=FFFFFFFF] [0.24,0.08,z=0.00000,col=FFFFFFFF] [-0.18,0.08,z=0.00000,col=FFFFFFFF] [-0.15,0.15,z=0.00000,col=FFFFFFFF] [-0.20,0.07,z=0.00000,col=FFFFFFFF] [-0.25,0.17,z=0.00000,col=FFFFFFFF] [-0.20,0.25,z=0.00000,col=FFFFFFFF] [-0.17,-0.00,z=0.00000,col=FFFFFFFF] [0.22,-0.00,z=0.00000,col=FFFFFFFF] [0.22,-0.12,z=0.00000,col=FFFFFFFF] [-0.17,-0.12,z=0.00000,col=FFFFFFFF] [-0.17,-0.23,z=0.00000,col=FFFFFFFF] [0.00,-0.23,z=0.00000,col=FFFFFFFF] [0.00,-0.35,z=0.00000,col=FFFFFFFF] [-0.17,-0.35,z=0.00000,col=FFFFFFFF] + 31 prim=8 indices=3 vs=0x72CBCAA6A7984111 ps=0xE59B2B3DA4AA9008 blend=0x07010701[c:src=1 op=0 dst=7 a:src=1 op=0 dst=7] cc=0x8700000C mask=0xF tex[base=0x10000000 1x1 fmt=26] + 32 prim=8 indices=3 vs=0x72CBCAA6A7984111 ps=0xE59B2B3DA4AA9008 blend=0x07010701[c:src=1 op=0 dst=7 a:src=1 op=0 dst=7] cc=0x8700000C mask=0xF tex[base=0x10000000 1x1 fmt=26] +--- frame 5 --- + 33 prim=8 indices=3 vs=0x0A6D1DD7767FDF27 ps=0x2E372EA28CC404B7 blend=0x00010001[c:src=1 op=0 dst=0 a:src=1 op=0 dst=0] cc=0x00000000 mask=0xFFFF + vb=0x14F57E38 stride=28 attrs=[57@0 38@12 ] fmt0=57 v: [-0.50,-0.50,z=0.00000] [1279.50,-0.50,z=0.00000] [1279.50,719.50,z=0.00000] + 34 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x07010701[c:src=1 op=0 dst=7 a:src=1 op=0 dst=7] cc=0x8700000C mask=0xF tex[base=0x11C30000 1280x768 fmt=6] + vb=0x14F57E90 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-1.00,1.00,z=0.00000,col=FFFFFFFF] [1.00,1.00,z=0.00000,col=FFFFFFFF] [1.00,-1.00,z=0.00000,col=FFFFFFFF] [-1.00,-1.00,z=0.00000,col=FFFFFFFF] + 35 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x01010101[c:src=1 op=0 dst=1 a:src=1 op=0 dst=1] cc=0x8700000C mask=0xF tex[base=0x11C30000 1280x768 fmt=6] + vb=0x14F57EF0 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [0.12,1.58,z=0.00000,col=A5FFFFFF] [0.66,1.02,z=0.00000,col=A5FFFFFF] [-0.19,-1.57,z=0.00000,col=A5FFFFFF] [-0.73,-1.02,z=0.00000,col=A5FFFFFF] + 36 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x01010101[c:src=1 op=0 dst=1 a:src=1 op=0 dst=1] cc=0x8700000C mask=0xF tex[base=0x0BFE0000 1280x768 fmt=6] + vb=0x14F57F50 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.70,1.02,z=0.00000,col=9EFFFFFF] [-0.25,1.81,z=0.00000,col=9EFFFFFF] [1.34,-1.02,z=0.00000,col=9EFFFFFF] [0.90,-1.81,z=0.00000,col=9EFFFFFF] + 37 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x07010701[c:src=1 op=0 dst=7 a:src=1 op=0 dst=7] cc=0x8700000C mask=0xF tex[base=0x0C3B0000 1280x768 fmt=6] + vb=0x14F57FB0 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-1.00,1.00,z=0.00000,col=FFFFFFFF] [1.00,1.00,z=0.00000,col=FFFFFFFF] [1.00,-1.00,z=0.00000,col=FFFFFFFF] [-1.00,-1.00,z=0.00000,col=FFFFFFFF] + 38 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0x5773DC18083C4C20 blend=0x07010701[c:src=1 op=0 dst=7 a:src=1 op=0 dst=7] cc=0x8700000C mask=0xF + vb=0x14F58010 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-1.00,1.00,z=0.00000,col=40000000] [1.00,1.00,z=0.00000,col=40000000] [1.00,-1.00,z=0.00000,col=40000000] [-1.00,-1.00,z=0.00000,col=40000000] + 39 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x01010101[c:src=1 op=0 dst=1 a:src=1 op=0 dst=1] cc=0x8700000C mask=0xF tex[base=0x0BFE0000 1280x768 fmt=6] + vb=0x14F58070 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.64,1.00,z=0.00000,col=FFFFFFFF] [0.64,1.00,z=0.00000,col=FFFFFFFF] [0.64,-1.00,z=0.00000,col=FFFFFFFF] [-0.64,-1.00,z=0.00000,col=FFFFFFFF] + 40 prim=13 indices=24 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x01010101[c:src=1 op=0 dst=1 a:src=1 op=0 dst=1] cc=0x8700000C mask=0xF tex[base=0x11C30000 1280x768 fmt=6] + vb=0x14F580D0 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.48,0.67,z=0.00000,col=80FFFFFF] [0.48,0.67,z=0.00000,col=80FFFFFF] [0.48,-0.77,z=0.00000,col=80FFFFFF] [-0.48,-0.77,z=0.00000,col=80FFFFFF] [-0.31,0.36,z=0.00000,col=FFFFFFFF] [0.07,0.36,z=0.00000,col=FFFFFFFF] [0.07,-0.25,z=0.00000,col=FFFFFFFF] [-0.31,-0.25,z=0.00000,col=FFFFFFFF] [-0.09,0.12,z=0.00000,col=FFFFFFFF] [0.31,0.12,z=0.00000,col=FFFFFFFF] [0.31,-0.47,z=0.00000,col=FFFFFFFF] [-0.09,-0.47,z=0.00000,col=FFFFFFFF] [-0.32,0.60,z=0.00000,col=FFFFFFFF] [0.31,0.60,z=0.00000,col=FFFFFFFF] [0.31,0.59,z=0.00000,col=FFFFFFFF] [-0.32,0.59,z=0.00000,col=FFFFFFFF] [-0.33,0.63,z=0.00000,col=FFFFFFFF] [0.33,0.63,z=0.00000,col=FFFFFFFF] [0.33,0.61,z=0.00000,col=FFFFFFFF] [-0.33,0.61,z=0.00000,col=FFFFFFFF] [-0.34,0.66,z=0.00000,col=FFFFFFFF] [0.34,0.66,z=0.00000,col=FFFFFFFF] [0.34,0.64,z=0.00000,col=FFFFFFFF] [-0.34,0.64,z=0.00000,col=FFFFFFFF] + 41 prim=13 indices=24 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x07010701[c:src=1 op=0 dst=7 a:src=1 op=0 dst=7] cc=0x8700000C mask=0xF tex[base=0x11C30000 1280x768 fmt=6] + vb=0x14F58310 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.27,-0.51,z=0.00000,col=FFFFFFFF] [0.28,-0.51,z=0.00000,col=FFFFFFFF] [0.28,-0.62,z=0.00000,col=FFFFFFFF] [-0.27,-0.62,z=0.00000,col=FFFFFFFF] [-0.14,0.72,z=0.00000,col=FFFFFFFF] [0.14,0.72,z=0.00000,col=FFFFFFFF] [0.14,0.63,z=0.00000,col=FFFFFFFF] [-0.14,0.63,z=0.00000,col=FFFFFFFF] [-0.18,0.24,z=0.00000,col=FFFFFFFF] [0.24,0.24,z=0.00000,col=FFFFFFFF] [0.24,0.08,z=0.00000,col=FFFFFFFF] [-0.18,0.08,z=0.00000,col=FFFFFFFF] [-0.15,0.14,z=0.00000,col=FFFFFFFF] [-0.21,0.08,z=0.00000,col=FFFFFFFF] [-0.25,0.18,z=0.00000,col=FFFFFFFF] [-0.19,0.25,z=0.00000,col=FFFFFFFF] [-0.17,-0.00,z=0.00000,col=FFFFFFFF] [0.22,-0.00,z=0.00000,col=FFFFFFFF] [0.22,-0.12,z=0.00000,col=FFFFFFFF] [-0.17,-0.12,z=0.00000,col=FFFFFFFF] [-0.17,-0.23,z=0.00000,col=FFFFFFFF] [0.00,-0.23,z=0.00000,col=FFFFFFFF] [0.00,-0.35,z=0.00000,col=FFFFFFFF] [-0.17,-0.35,z=0.00000,col=FFFFFFFF] + 42 prim=8 indices=3 vs=0x72CBCAA6A7984111 ps=0xE59B2B3DA4AA9008 blend=0x07010701[c:src=1 op=0 dst=7 a:src=1 op=0 dst=7] cc=0x8700000C mask=0xF tex[base=0x10000000 1x1 fmt=26] + 43 prim=8 indices=3 vs=0x72CBCAA6A7984111 ps=0xE59B2B3DA4AA9008 blend=0x07010701[c:src=1 op=0 dst=7 a:src=1 op=0 dst=7] cc=0x8700000C mask=0xF tex[base=0x10000000 1x1 fmt=26] +--- frame 7 --- + 44 prim=8 indices=3 vs=0x0A6D1DD7767FDF27 ps=0x2E372EA28CC404B7 blend=0x00010001[c:src=1 op=0 dst=0 a:src=1 op=0 dst=0] cc=0x00000000 mask=0xFFFF + vb=0x14F98678 stride=28 attrs=[57@0 38@12 ] fmt0=57 v: [-0.50,-0.50,z=0.00000] [1279.50,-0.50,z=0.00000] [1279.50,719.50,z=0.00000] + 45 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x07010701[c:src=1 op=0 dst=7 a:src=1 op=0 dst=7] cc=0x8700000C mask=0xF tex[base=0x11C30000 1280x768 fmt=6] + vb=0x14F986D0 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-1.00,1.00,z=0.00000,col=FFFFFFFF] [1.00,1.00,z=0.00000,col=FFFFFFFF] [1.00,-1.00,z=0.00000,col=FFFFFFFF] [-1.00,-1.00,z=0.00000,col=FFFFFFFF] + 46 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x01010101[c:src=1 op=0 dst=1 a:src=1 op=0 dst=1] cc=0x8700000C mask=0xF tex[base=0x11C30000 1280x768 fmt=6] + vb=0x14F98730 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [0.13,1.58,z=0.00000,col=A5FFFFFF] [0.67,1.02,z=0.00000,col=A5FFFFFF] [-0.17,-1.57,z=0.00000,col=A5FFFFFF] [-0.71,-1.02,z=0.00000,col=A5FFFFFF] + 47 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x01010101[c:src=1 op=0 dst=1 a:src=1 op=0 dst=1] cc=0x8700000C mask=0xF tex[base=0x0BFE0000 1280x768 fmt=6] + vb=0x14F98790 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.71,1.02,z=0.00000,col=9EFFFFFF] [-0.27,1.81,z=0.00000,col=9EFFFFFF] [1.32,-1.02,z=0.00000,col=9EFFFFFF] [0.88,-1.81,z=0.00000,col=9EFFFFFF] + 48 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x07010701[c:src=1 op=0 dst=7 a:src=1 op=0 dst=7] cc=0x8700000C mask=0xF tex[base=0x0C3B0000 1280x768 fmt=6] + vb=0x14F987F0 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-1.00,1.00,z=0.00000,col=FFFFFFFF] [1.00,1.00,z=0.00000,col=FFFFFFFF] [1.00,-1.00,z=0.00000,col=FFFFFFFF] [-1.00,-1.00,z=0.00000,col=FFFFFFFF] + 49 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0x5773DC18083C4C20 blend=0x07010701[c:src=1 op=0 dst=7 a:src=1 op=0 dst=7] cc=0x8700000C mask=0xF + vb=0x14F98850 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-1.00,1.00,z=0.00000,col=40000000] [1.00,1.00,z=0.00000,col=40000000] [1.00,-1.00,z=0.00000,col=40000000] [-1.00,-1.00,z=0.00000,col=40000000] + 50 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x01010101[c:src=1 op=0 dst=1 a:src=1 op=0 dst=1] cc=0x8700000C mask=0xF tex[base=0x0BFE0000 1280x768 fmt=6] + vb=0x14F988B0 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.64,1.00,z=0.00000,col=FFFFFFFF] [0.64,1.00,z=0.00000,col=FFFFFFFF] [0.64,-1.00,z=0.00000,col=FFFFFFFF] [-0.64,-1.00,z=0.00000,col=FFFFFFFF] + 51 prim=13 indices=24 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x01010101[c:src=1 op=0 dst=1 a:src=1 op=0 dst=1] cc=0x8700000C mask=0xF tex[base=0x11C30000 1280x768 fmt=6] + vb=0x14F98910 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.48,0.67,z=0.00000,col=80FFFFFF] [0.48,0.67,z=0.00000,col=80FFFFFF] [0.48,-0.77,z=0.00000,col=80FFFFFF] [-0.48,-0.77,z=0.00000,col=80FFFFFF] [-0.31,0.36,z=0.00000,col=FFFFFFFF] [0.07,0.36,z=0.00000,col=FFFFFFFF] [0.07,-0.25,z=0.00000,col=FFFFFFFF] [-0.31,-0.25,z=0.00000,col=FFFFFFFF] [-0.09,0.12,z=0.00000,col=FFFFFFFF] [0.31,0.12,z=0.00000,col=FFFFFFFF] [0.31,-0.47,z=0.00000,col=FFFFFFFF] [-0.09,-0.47,z=0.00000,col=FFFFFFFF] [-0.32,0.60,z=0.00000,col=FFFFFFFF] [0.31,0.60,z=0.00000,col=FFFFFFFF] [0.31,0.59,z=0.00000,col=FFFFFFFF] [-0.32,0.59,z=0.00000,col=FFFFFFFF] [-0.33,0.63,z=0.00000,col=FFFFFFFF] [0.33,0.63,z=0.00000,col=FFFFFFFF] [0.33,0.61,z=0.00000,col=FFFFFFFF] [-0.33,0.61,z=0.00000,col=FFFFFFFF] [-0.34,0.66,z=0.00000,col=FFFFFFFF] [0.34,0.66,z=0.00000,col=FFFFFFFF] [0.34,0.64,z=0.00000,col=FFFFFFFF] [-0.34,0.64,z=0.00000,col=FFFFFFFF] + 52 prim=13 indices=24 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 blend=0x07010701[c:src=1 op=0 dst=7 a:src=1 op=0 dst=7] cc=0x8700000C mask=0xF tex[base=0x11C30000 1280x768 fmt=6] + vb=0x14F98B50 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.27,-0.51,z=0.00000,col=FFFFFFFF] [0.28,-0.51,z=0.00000,col=FFFFFFFF] [0.28,-0.62,z=0.00000,col=FFFFFFFF] [-0.27,-0.62,z=0.00000,col=FFFFFFFF] [-0.14,0.72,z=0.00000,col=FFFFFFFF] [0.14,0.72,z=0.00000,col=FFFFFFFF] [0.14,0.63,z=0.00000,col=FFFFFFFF] [-0.14,0.63,z=0.00000,col=FFFFFFFF] [-0.18,0.24,z=0.00000,col=FFFFFFFF] [0.24,0.24,z=0.00000,col=FFFFFFFF] [0.24,0.08,z=0.00000,col=FFFFFFFF] [-0.18,0.08,z=0.00000,col=FFFFFFFF] [-0.16,0.12,z=0.00000,col=FFFFFFFF] [-0.22,0.08,z=0.00000,col=FFFFFFFF] [-0.24,0.20,z=0.00000,col=FFFFFFFF] [-0.18,0.24,z=0.00000,col=FFFFFFFF] [-0.17,-0.00,z=0.00000,col=FFFFFFFF] [0.22,-0.00,z=0.00000,col=FFFFFFFF] [0.22,-0.12,z=0.00000,col=FFFFFFFF] [-0.17,-0.12,z=0.00000,col=FFFFFFFF] [-0.17,-0.23,z=0.00000,col=FFFFFFFF] [0.00,-0.23,z=0.00000,col=FFFFFFFF] [0.00,-0.35,z=0.00000,col=FFFFFFFF] [-0.17,-0.35,z=0.00000,col=FFFFFFFF] + 53 prim=8 indices=3 vs=0x72CBCAA6A7984111 ps=0xE59B2B3DA4AA9008 blend=0x07010701[c:src=1 op=0 dst=7 a:src=1 op=0 dst=7] cc=0x8700000C mask=0xF tex[base=0x10000000 1x1 fmt=26] + 54 prim=8 indices=3 vs=0x72CBCAA6A7984111 ps=0xE59B2B3DA4AA9008 blend=0x07010701[c:src=1 op=0 dst=7 a:src=1 op=0 dst=7] cc=0x8700000C mask=0xF tex[base=0x10000000 1x1 fmt=26] diff --git a/docs/re/data/ui-blend-extras-complete.txt b/docs/re/data/ui-blend-extras-complete.txt new file mode 100644 index 00000000..88b59b85 --- /dev/null +++ b/docs/re/data/ui-blend-extras-complete.txt @@ -0,0 +1,147 @@ +# EXTRAS, COMPLETE. Every element named, every blend measured. 2026-08-31, run 2. +# +# The first EXTRAS capture reported four of this screen's elements as appearing in +# NO draw. They were in a draw all along: the 24-index additive batch holds SIX +# quads and Canary's vertex dump was capped at 8 vertices = two. Cap raised to 64. +# +# Two changes to the matcher, both because it had been dressing a failure up as a +# near miss: +# +# * a candidate size is now the declaration's `pivot * 2` scaled by the RESTING +# keyframe's scale, as well as the texture's own size at 1x and 2x. That is +# the only thing that names `pteff10` -- it ships as 409x144 and is drawn at +# 200 % x 500 % = 816x720. Scale-guessing could not name it at all and offered +# a near miss against something else. +# * the tolerance is the NDC PRINT QUANTISATION, not a fudge factor. The log +# prints NDC to two decimals, so a width is quantised to 6.4 px and a height to +# 3.6 px, and a match is reported in units of that. +# +# CONTROL: the two rotated sweep strips, measured independently at 1134 and 1303 +# px in data/title-sweep-drawn-at-rest.txt, reproduce on every screen. +# +# ⚠️ The three full-screen 1280x720 alpha-over draws are NOT individually +# identified: ptbase, pteff05, pteff02.prm and pteff00.prm all declare 1280x720, +# so size cannot separate them. Two of the three carry a bound texture and one +# does not, which narrows it and does not close it. All four are alpha-over, so +# nothing in the answer turns on it -- but the label the tool prints for those +# rows is A candidate, not an identification. + +=== EXTRAS (GP_TITLE entry 6), 55 draws over 6 frames, vertex cap 64 === +draw prim idx blend state quad px (w x h) best name match + 1 13 4 0x07010701 alpha-over(premul) 1280.0 x 720.0 ptbase.t32 [declared] + 2 13 4 0x01010101 ADDITIVE 883.2 x 1134.0 (no match, nearest pteff10.t32 [declared] off 125.5 quanta) + 3 13 4 0x01010101 ADDITIVE 1299.2 x 1303.2 (no match, nearest ptbase.t32 [declared] off 165.0 quanta) + 4 13 4 0x07010701 alpha-over(premul) 1280.0 x 720.0 ptbase.t32 [declared] + 5 13 4 0x07010701 alpha-over(premul) 1280.0 x 720.0 ptbase.t32 [declared] + 6 13 4 0x01010101 ADDITIVE 819.2 x 720.0 pteff10.t32 [declared] + 7 13 24 0x01010101 ADDITIVE 614.4 x 518.4 pteff20.t32 [texture@2x] + 7 13 24 0x01010101 ADDITIVE 243.2 x 219.6 ptframe3.t32 [declared] + 7 13 24 0x01010101 ADDITIVE 256.0 x 212.4 ptframe4.t32 [declared] + 7 13 24 0x01010101 ADDITIVE 403.2 x 3.6 pteff21.t32 [texture] + 7 13 24 0x01010101 ADDITIVE 422.4 x 7.2 pteff22.t32 [texture] + 7 13 24 0x01010101 ADDITIVE 435.2 x 7.2 pteff23.t32 [texture] + 8 13 24 0x07010701 alpha-over(premul) 352.0 x 39.6 ptmsg2.t32 [texture] + 8 13 24 0x07010701 alpha-over(premul) 179.2 x 32.4 pttitle.t32 [texture] + 8 13 24 0x07010701 alpha-over(premul) 268.8 x 57.6 ptbtn11f.t32 [texture] + 8 13 24 0x07010701 alpha-over(premul) 64.0 x 61.2 (no match, nearest ptbtn13.rat [declared] off 7.6 quanta) + 8 13 24 0x07010701 alpha-over(premul) 249.6 x 43.2 ptbtn12.t32 [texture] + 8 13 24 0x07010701 alpha-over(premul) 108.8 x 43.2 ptbtn13.t32 [texture] + 12 13 4 0x07010701 alpha-over(premul) 1280.0 x 720.0 ptbase.t32 [declared] + 13 13 4 0x01010101 ADDITIVE 889.6 x 1134.0 (no match, nearest pteff10.t32 [declared] off 126.5 quanta) + 14 13 4 0x01010101 ADDITIVE 1305.6 x 1303.2 (no match, nearest ptbase.t32 [declared] off 166.0 quanta) + 15 13 4 0x07010701 alpha-over(premul) 1280.0 x 720.0 ptbase.t32 [declared] + 16 13 4 0x07010701 alpha-over(premul) 1280.0 x 720.0 ptbase.t32 [declared] + 17 13 4 0x01010101 ADDITIVE 819.2 x 720.0 pteff10.t32 [declared] + 18 13 24 0x01010101 ADDITIVE 614.4 x 518.4 pteff20.t32 [texture@2x] + 18 13 24 0x01010101 ADDITIVE 243.2 x 219.6 ptframe3.t32 [declared] + 18 13 24 0x01010101 ADDITIVE 256.0 x 212.4 ptframe4.t32 [declared] + 18 13 24 0x01010101 ADDITIVE 403.2 x 3.6 pteff21.t32 [texture] + 18 13 24 0x01010101 ADDITIVE 422.4 x 7.2 pteff22.t32 [texture] + 18 13 24 0x01010101 ADDITIVE 435.2 x 7.2 pteff23.t32 [texture] + 19 13 24 0x07010701 alpha-over(premul) 352.0 x 39.6 ptmsg2.t32 [texture] + 19 13 24 0x07010701 alpha-over(premul) 179.2 x 32.4 pttitle.t32 [texture] + 19 13 24 0x07010701 alpha-over(premul) 268.8 x 57.6 ptbtn11f.t32 [texture] + 19 13 24 0x07010701 alpha-over(premul) 64.0 x 64.8 (no match, nearest ptbtn13.rat [declared] off 8.6 quanta) + 19 13 24 0x07010701 alpha-over(premul) 249.6 x 43.2 ptbtn12.t32 [texture] + 19 13 24 0x07010701 alpha-over(premul) 108.8 x 43.2 ptbtn13.t32 [texture] + 23 13 4 0x07010701 alpha-over(premul) 1280.0 x 720.0 ptbase.t32 [declared] + 24 13 4 0x01010101 ADDITIVE 883.2 x 1134.0 (no match, nearest pteff10.t32 [declared] off 125.5 quanta) + 25 13 4 0x01010101 ADDITIVE 1299.2 x 1303.2 (no match, nearest ptbase.t32 [declared] off 165.0 quanta) + 26 13 4 0x07010701 alpha-over(premul) 1280.0 x 720.0 ptbase.t32 [declared] + 27 13 4 0x07010701 alpha-over(premul) 1280.0 x 720.0 ptbase.t32 [declared] + 28 13 4 0x01010101 ADDITIVE 819.2 x 720.0 pteff10.t32 [declared] + 29 13 24 0x01010101 ADDITIVE 614.4 x 518.4 pteff20.t32 [texture@2x] + 29 13 24 0x01010101 ADDITIVE 243.2 x 219.6 ptframe3.t32 [declared] + 29 13 24 0x01010101 ADDITIVE 256.0 x 212.4 ptframe4.t32 [declared] + 29 13 24 0x01010101 ADDITIVE 403.2 x 3.6 pteff21.t32 [texture] + 29 13 24 0x01010101 ADDITIVE 422.4 x 7.2 pteff22.t32 [texture] + 29 13 24 0x01010101 ADDITIVE 435.2 x 7.2 pteff23.t32 [texture] + 30 13 24 0x07010701 alpha-over(premul) 352.0 x 39.6 ptmsg2.t32 [texture] + 30 13 24 0x07010701 alpha-over(premul) 179.2 x 32.4 pttitle.t32 [texture] + 30 13 24 0x07010701 alpha-over(premul) 268.8 x 57.6 ptbtn11f.t32 [texture] + 30 13 24 0x07010701 alpha-over(premul) 64.0 x 64.8 (no match, nearest ptbtn13.rat [declared] off 8.6 quanta) + 30 13 24 0x07010701 alpha-over(premul) 249.6 x 43.2 ptbtn12.t32 [texture] + 30 13 24 0x07010701 alpha-over(premul) 108.8 x 43.2 ptbtn13.t32 [texture] + 34 13 4 0x07010701 alpha-over(premul) 1280.0 x 720.0 ptbase.t32 [declared] + 35 13 4 0x01010101 ADDITIVE 889.6 x 1134.0 (no match, nearest pteff10.t32 [declared] off 126.5 quanta) + 36 13 4 0x01010101 ADDITIVE 1305.6 x 1303.2 (no match, nearest ptbase.t32 [declared] off 166.0 quanta) + 37 13 4 0x07010701 alpha-over(premul) 1280.0 x 720.0 ptbase.t32 [declared] + 38 13 4 0x07010701 alpha-over(premul) 1280.0 x 720.0 ptbase.t32 [declared] + 39 13 4 0x01010101 ADDITIVE 819.2 x 720.0 pteff10.t32 [declared] + 40 13 24 0x01010101 ADDITIVE 614.4 x 518.4 pteff20.t32 [texture@2x] + 40 13 24 0x01010101 ADDITIVE 243.2 x 219.6 ptframe3.t32 [declared] + 40 13 24 0x01010101 ADDITIVE 256.0 x 212.4 ptframe4.t32 [declared] + 40 13 24 0x01010101 ADDITIVE 403.2 x 3.6 pteff21.t32 [texture] + 40 13 24 0x01010101 ADDITIVE 422.4 x 7.2 pteff22.t32 [texture] + 40 13 24 0x01010101 ADDITIVE 435.2 x 7.2 pteff23.t32 [texture] + 41 13 24 0x07010701 alpha-over(premul) 352.0 x 39.6 ptmsg2.t32 [texture] + 41 13 24 0x07010701 alpha-over(premul) 179.2 x 32.4 pttitle.t32 [texture] + 41 13 24 0x07010701 alpha-over(premul) 268.8 x 57.6 ptbtn11f.t32 [texture] + 41 13 24 0x07010701 alpha-over(premul) 64.0 x 61.2 (no match, nearest ptbtn13.rat [declared] off 7.6 quanta) + 41 13 24 0x07010701 alpha-over(premul) 249.6 x 43.2 ptbtn12.t32 [texture] + 41 13 24 0x07010701 alpha-over(premul) 108.8 x 43.2 ptbtn13.t32 [texture] + 45 13 4 0x07010701 alpha-over(premul) 1280.0 x 720.0 ptbase.t32 [declared] + 46 13 4 0x01010101 ADDITIVE 883.2 x 1134.0 (no match, nearest pteff10.t32 [declared] off 125.5 quanta) + 47 13 4 0x01010101 ADDITIVE 1299.2 x 1303.2 (no match, nearest ptbase.t32 [declared] off 165.0 quanta) + 48 13 4 0x07010701 alpha-over(premul) 1280.0 x 720.0 ptbase.t32 [declared] + 49 13 4 0x07010701 alpha-over(premul) 1280.0 x 720.0 ptbase.t32 [declared] + 50 13 4 0x01010101 ADDITIVE 819.2 x 720.0 pteff10.t32 [declared] + 51 13 24 0x01010101 ADDITIVE 614.4 x 518.4 pteff20.t32 [texture@2x] + 51 13 24 0x01010101 ADDITIVE 243.2 x 219.6 ptframe3.t32 [declared] + 51 13 24 0x01010101 ADDITIVE 256.0 x 212.4 ptframe4.t32 [declared] + 51 13 24 0x01010101 ADDITIVE 403.2 x 3.6 pteff21.t32 [texture] + 51 13 24 0x01010101 ADDITIVE 422.4 x 7.2 pteff22.t32 [texture] + 51 13 24 0x01010101 ADDITIVE 435.2 x 7.2 pteff23.t32 [texture] + 52 13 24 0x07010701 alpha-over(premul) 352.0 x 39.6 ptmsg2.t32 [texture] + 52 13 24 0x07010701 alpha-over(premul) 179.2 x 32.4 pttitle.t32 [texture] + 52 13 24 0x07010701 alpha-over(premul) 268.8 x 57.6 ptbtn11f.t32 [texture] + 52 13 24 0x07010701 alpha-over(premul) 51.2 x 57.6 (no match, nearest ptbtneff02.t32 [texture] off 4.7 quanta) + 52 13 24 0x07010701 alpha-over(premul) 249.6 x 43.2 ptbtn12.t32 [texture] + 52 13 24 0x07010701 alpha-over(premul) 108.8 x 43.2 ptbtn13.t32 [texture] + +CONTROL — the two rotated sweep strips measured independently at 1134 and 1303 px: + tall quads found: ['1134', '1303'] + PASS + +=== the resting scale that makes pteff10 identifiable === +=== GP_TITLE entry 6 === +element pivot(w,h) sx% sy% drawn px at 1x/2x of pivot*2 +ptframe3.t32 246,220 100 100 246.0x220.0 492.0x440.0 +ptframe4.t32 256,210 100 100 256.0x210.0 512.0x420.0 +ptbtn11.rat 256,44 100 100 256.0x44.0 512.0x88.0 +ptbtn12.rat 252,44 100 100 252.0x44.0 504.0x88.0 +ptbtn13.rat 82,44 100 100 82.0x44.0 164.0x88.0 +ptmsg2.t32 384,38 100 100 384.0x38.0 768.0x76.0 +pteff20.t32 308,260 200 200 616.0x520.0 1232.0x1040.0 +pteff21.t32 404,6 100 100 404.0x6.0 808.0x12.0 +pteff22.t32 424,8 100 100 424.0x8.0 848.0x16.0 +pteff23.t32 440,8 100 100 440.0x8.0 880.0x16.0 +pttitle.t32 194,36 100 100 194.0x36.0 388.0x72.0 +ptbase.t32 640,360 200 200 1280.0x720.0 2560.0x1440.0 +pteff05.t32 1280,720 100 100 1280.0x720.0 2560.0x1440.0 +pteff02.prm 1280,720 100 100 1280.0x720.0 2560.0x1440.0 +ptloop01.rat 400,180 100 100 400.0x180.0 800.0x360.0 +ptloop02.rat 400,180 100 100 400.0x180.0 800.0x360.0 +pteff10.t32 408,144 200 500 816.0x720.0 1632.0x1440.0 +pteff00.prm 1280,720 100 100 1280.0x720.0 2560.0x1440.0 + diff --git a/docs/re/structures/ui-blend-mode-measured.md b/docs/re/structures/ui-blend-mode-measured.md index 48dbb40c..ae31cff0 100644 --- a/docs/re/structures/ui-blend-mode-measured.md +++ b/docs/re/structures/ui-blend-mode-measured.md @@ -223,3 +223,63 @@ measures submission and geometry, not the light they add. A port whose render looks worse with them visible has either a placement, a phase or a magnitude problem — but "the game does not draw them here" is not available as an explanation any more. + +## ✅ 2026-08-31 (final) — `EXTRAS` is COMPLETE, and the four missing elements are ADDITIVE + +The four elements the port measured as the worst on `EXTRAS`, and which appeared +in no draw, were in a draw all along. `EXTRAS`' 24-index additive batch holds +**six** quads; Canary's vertex dump printed the first **two**. + +[`data/ui-blend-extras-complete.txt`](../data/ui-blend-extras-complete.txt) · +[`captures/ui-draws/blend-extras-run2-2026-08-31.log`](../captures/ui-draws/blend-extras-run2-2026-08-31.log) + +| draw | quad px | element | blend | +|---|---|---|---| +| 7 | 614.4 × 518.4 | `pteff20` | **ADDITIVE** | +| 7 | 243.2 × 219.6 | `ptframe3` | **ADDITIVE** | +| 7 | 256.0 × 212.4 | **`ptframe4`** | **ADDITIVE** | +| 7 | 403.2 × 3.6 | **`pteff21`** | **ADDITIVE** | +| 7 | 422.4 × 7.2 | **`pteff22`** | **ADDITIVE** | +| 7 | 435.2 × 7.2 | **`pteff23`** | **ADDITIVE** | +| 6 | 819.2 × 720 | **`pteff10`** | **ADDITIVE** | +| 8 | 352.0 × 39.6 | `ptmsg2` | alpha-over | +| 8 | 179.2 × 32.4 | `pttitle` | alpha-over | +| 8 | 268.8 × 57.6 | `ptbtn11f` | alpha-over | +| 8 | 249.6 × 43.2 | `ptbtn12` | alpha-over | +| 8 | 108.8 × 43.2 | `ptbtn13` | alpha-over | + +**All six are in one draw with `ptframe3`, whose state was already measured**, so +this is the one-way implication doing real work: same draw ⇒ same state. + +### `pteff10` is identified, and it needs the resting SCALE + +`pteff10` ships as **409 × 144** and is drawn at **200 % × 500 % = 816 × 720**. +The matcher's old "try 1× and 2×" rule could not name it at any scale, and +reported a near miss against something else instead — a failure wearing the +clothes of an answer. Candidates are now the declaration's `pivot × 2` scaled by +the **resting keyframe**, as well as the texture at 1× and 2×, and the tolerance +is the log's own **NDC print quantisation** (two decimals → 6.4 px in x, 3.6 px +in y) rather than a chosen number. + +🟡 **And `pteff10` being additive is a live tension worth stating.** The port +measures it as **nearly exact** rendered alpha-over. Both can be true — it is a +dim, wholly semi-transparent glow (max alpha 130) over a dark background, where +additive and alpha-over nearly coincide — but it is the one row of this table +that a rendering check does *not* independently corroborate, and it should be +adopted knowing that. + +### What is still not identified, on any screen + +* **the two rotated sweep strips** — matched by their AABB, not by a declared + size, because they are rotated nested leaves. The control pins them at 1134 and + 1303 px on every screen and the port has an independent 884 px footprint for + the width, so they are identified; the matcher simply cannot do it by size. +* **the focus ring** — drawn at 64.0 × 61.2 against `ptbtneff01`/`02`'s 42 × 46. + It spins and scales, so its AABB is not its sprite size. Alpha-over on both + screens. +* **the three full-screen 1280 × 720 alpha-over draws** — `ptbase`, `pteff05`, + `pteff02.prm` and `pteff00.prm` all declare 1280 × 720, so size cannot separate + them. Two of the three carry a bound texture and one does not, which narrows it + and does not close it. All four candidates are alpha-over, so nothing turns on + it — but the label the tool prints on those rows is **a candidate, not an + identification**. diff --git a/tools/re-capture/ui_blend_map.py b/tools/re-capture/ui_blend_map.py index 89f0a233..0c165b9f 100755 --- a/tools/re-capture/ui_blend_map.py +++ b/tools/re-capture/ui_blend_map.py @@ -45,32 +45,49 @@ def blend_name(raw): return "%s+%s" % (FACTOR.get(src, src), FACTOR.get(dst, dst)) -def sprite_sizes(builds): - """name -> (w, h), straight off the disc via the formats crate. +def candidates(builds): + """Every size a UI draw could legitimately have, with a label and a basis. - `builds` is a list because the live title is TWO builds composited -- 4 draws - the art and 2 draws the `PRESS (A)` plate over it -- so a capture of the - title contains elements from both and a one-build size table cannot name - them all. + Two bases, because neither alone names every element: + + declared the declaration's `pivot * 2` scaled by the RESTING keyframe's + scale_x/scale_y. This is the only thing that names `pteff10`, + which ships as 409x144 and is drawn at 200 % x 500 % = 816x720 -- + a scale-guessing matcher called it "no match" and offered a near + miss against something else instead. + texture the decoded `.t32`'s own pixel size, at 1x and 2x. Needed because + the pivot is NOT always half the texture (`ptmsg2` declares + 384x38 for a 354x38 sprite) and because a button's focused `f` + variant has a texture and no declaration of its own. + + `builds` is a list: the live title is TWO builds composited, 4 for the art + and 2 for the `PRESS (A)` plate. """ - out = subprocess.run( - ["cargo", "run", "--release", "-q", "-p", "sylpheed-formats", - "--example", "frame_alpha_census", "--"] + [str(b) for b in builds], - capture_output=True, text=True, cwd="/work", - env={**__import__("os").environ, "SYLPHEED_DISC": "/disc"}).stdout - sizes = {} - for line in out.splitlines(): + env = {**__import__("os").environ, "SYLPHEED_DISC": "/disc"} + def run(example): + return subprocess.run( + ["cargo", "run", "--release", "-q", "-p", "sylpheed-formats", + "--example", example, "--"] + [str(b) for b in builds], + capture_output=True, text=True, cwd="/work", env=env).stdout + out = [] + for line in run("rest_scale_of").splitlines(): + m = re.match(r"(\S+\.(?:t32|prm|rat))\s+\d+,\d+\s+\d+\s+\d+\s+([\d.]+)x([\d.]+)", line) + if m: + out.append((m.group(1), "declared", float(m.group(2)), float(m.group(3)))) + for line in run("frame_alpha_census").splitlines(): m = re.match(r"(\S+\.t32)\s+(\d+)x(\d+)", line) if m: - sizes[m.group(1)] = (int(m.group(2)), int(m.group(3))) - return sizes + w, h = float(m.group(2)), float(m.group(3)) + out.append((m.group(1), "texture", w, h)) + out.append((m.group(1), "texture@2x", w * 2, h * 2)) + return out def main(): path = sys.argv[1] spec = sys.argv[sys.argv.index("--build") + 1] if "--build" in sys.argv else "5" builds = [int(b) for b in spec.split(",")] - sizes = sprite_sizes(builds) + cands = candidates(builds) lines = open(path).read().splitlines() rows = [] for i, line in enumerate(lines): @@ -95,19 +112,17 @@ def main(): w = (max(xs) - min(xs)) / 2 * W h = (max(ys) - min(ys)) / 2 * H heights.append(h) - # A sprite is drawn at its native size or at 2x: the screen is - # 1280x720 and the design space is 640x360, so `ptbase` (640x360) - # covers the screen while `pteff05` (1280x720) is 1:1. Both are - # tried and the scale is reported, because guessing one would - # silently mis-name half the draws. - best, bd, bs = "-", 1e9, 1 - for n, (sw, sh) in sizes.items(): - for sc in (1, 2): - d = abs(sw * sc - w) + abs(sh * sc - h) - if d < bd: - best, bd, bs = n, d, sc - tag = ("%s @%dx" % (best, bs)) if bd <= 8 else \ - "(no match, nearest %s @%dx off %.0f)" % (best, bs, bd) + # The log prints NDC to TWO DECIMALS, so a width is quantised to + # 0.01 * 1280 / 2 = 6.4 px and a height to 3.6 px. The tolerance + # below is that quantisation, not a fudge factor: a match inside it + # is as close as this instrument can report. + best, bd, bb = "-", 1e9, "" + for n, basis, sw, sh in cands: + d = abs(sw - w) / 6.4 + abs(sh - h) / 3.6 + if d < bd: + best, bd, bb = n, d, basis + tag = ("%s [%s]" % (best, bb)) if bd <= 2.0 else \ + "(no match, nearest %s [%s] off %.1f quanta)" % (best, bb, bd) print("%4d %4d %4d 0x%08X %-20s %7.1f x %7.1f %s" % (idx, prim, nidx, raw, blend_name(raw), w, h, tag)) tall = sorted(h for h in heights if h > 900)