From 34c88ee3facc05a57dc90e3a9c610d664a5ebf6d Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 3 Apr 2021 22:28:41 +0100 Subject: [PATCH] Pass bbox to js Signed-off-by: Ian Jackson --- daemon/session.rs | 4 +++- src/pcrender.rs | 13 +++++++++---- src/updates.rs | 2 ++ templates/script.ts | 5 +++++ 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/daemon/session.rs b/daemon/session.rs index 8ddda535..bf651ded 100644 --- a/daemon/session.rs +++ b/daemon/session.rs @@ -50,6 +50,7 @@ struct SessionPieceLoadJson<'r> { uos: &'r [UoDescription], moveable: PieceMoveable, occregion: Option>, + pub bbox: &'r Rect, } #[derive(Serialize,Debug)] @@ -139,7 +140,7 @@ fn session_inner(form: Json, piece, gpc, ipc); let pri = if let Some(pri) = pri { pri } else { continue /*invisible*/}; - let defs = pri.make_defs(ioccults, &ig.gs, gpc, ipc)?; + let (defs, bbox) = pri.make_defs(ioccults, &ig.gs, gpc, ipc)?; alldefs.push((pri.vpid, defs)); let desc = pri.describe(ioccults,&ig.gs.occults, &gpc, ipc); @@ -155,6 +156,7 @@ fn session_inner(form: Json, pinned: gpc.pinned, angle: vangle, desc, + bbox: &bbox, moveable: gpc.moveable(), uos: &pri.ui_operations(&ig.gs, gpc, ipc)?, occregion, diff --git a/src/pcrender.rs b/src/pcrender.rs index 44fdec36..5adb5961 100644 --- a/src/pcrender.rs +++ b/src/pcrender.rs @@ -119,10 +119,12 @@ impl PieceRenderInstructions { let (pos, zlevel) = pri.pos_zlevel(gpc); let occregion = gpc.occult.active_region(&gs.occults)? .map(|r| JsonString(r.clone())); + let (svg, bbox) = pri.make_defs(ioccults, gs, gpc, ipc)?; let r = PreparedPieceState { pos : pos, held : gpc.held, - svg : pri.make_defs(ioccults, gs, gpc, ipc)?, + svg : svg, + bbox : bbox, z : zlevel.z.clone(), zg : zlevel.zg, angle : pri.angle(gpc).to_compass(), @@ -141,8 +143,10 @@ impl PieceRenderInstructions { gpc: &GPiece, ipc: &IPiece) -> PreparedPieceImage { let pri = self; + let (svg, bbox) = pri.make_defs(ioccults, gs, gpc, ipc)?; let r = PreparedPieceImage { - svg : pri.make_defs(ioccults, gs, gpc, ipc)?, + svg : svg, + bbox : bbox, uos : pri.ui_operations(gs, gpc, ipc)?, }; dbgc!(pri, ipc, gpc, r); @@ -173,7 +177,7 @@ impl PieceRenderInstructions { #[throws(IE)] pub fn make_defs<'p>(&self, ioccults: &IOccults, gs: &GameState, - gpc: &GPiece, ipc: &IPiece) -> Html + gpc: &GPiece, ipc: &IPiece) -> (Html, Rect) { let pri = self; let instead = pri.instead(ioccults, ipc)?; @@ -184,6 +188,7 @@ impl PieceRenderInstructions { }; let angle = pri.angle(gpc); + let bbox = o.bbox_approx()?; let dragraise = match o.thresh_dragraise()? { Some(n) if n < 0 => throw!(SvgE::NegativeDragraise), @@ -211,7 +216,7 @@ impl PieceRenderInstructions { hwrite!(&mut defs, r##""##, pri.vpid, o.surround_path()?)?; - defs + (defs, bbox) } #[throws(InternalError)] diff --git a/src/updates.rs b/src/updates.rs index bbefa6c2..c8702358 100644 --- a/src/updates.rs +++ b/src/updates.rs @@ -112,6 +112,7 @@ pub struct PreparedPieceState { pub moveable: PieceMoveable, pub uos: Vec, pub occregion: Option>, + pub bbox: Rect, } #[derive(Debug,Copy,Clone,Serialize,Deserialize,Eq)] @@ -126,6 +127,7 @@ impl Default for PieceMoveable { fn default() -> Self { PieceMoveable::Yes } } #[derive(Debug,Clone,Serialize)] pub struct PreparedPieceImage { pub svg: Html, + pub bbox: Rect, pub uos: Vec, } diff --git a/templates/script.ts b/templates/script.ts index 35cfe3ad..22b14fda 100644 --- a/templates/script.ts +++ b/templates/script.ts @@ -80,6 +80,7 @@ type PieceInfo = { queued_moves : number, last_seen_moved : DOMHighResTimeStamp | null, // non-0 means halo'd held_us_inoccult: boolean, + bbox: [Pos, Pos], } let wasm : InitOutput; @@ -1299,6 +1300,7 @@ type PreparedPieceState = { uos: UoDescription[], moveable: PieceMoveable, occregion: string | null, + bbox: [Pos, Pos], } pieceops.ModifyQuiet = function @@ -1358,6 +1360,7 @@ function piece_modify_image(piece: PieceId, p: PieceInfo, p.delem.innerHTML = info.svg; p.pelem= piece_element('piece',piece)!; p.uos = info.uos; + p.bbox = info.bbox; } function piece_modify(piece: PieceId, p: PieceInfo, info: PreparedPieceState, @@ -1380,6 +1383,7 @@ function piece_modify_core(piece: PieceId, p: PieceInfo, p.pinned = info.pinned; p.moveable = info.moveable; p.angle = info.angle; + p.bbox = info.bbox; piece_set_zlevel_from(piece,p,info); let occregions_changed = occregion_update(piece, p, info); piece_checkconflict_nrda(piece,p,conflict_expected); @@ -1408,6 +1412,7 @@ function redisplay_held_ancillaries() { type PreparedPieceImage = { svg: string, uos: UoDescription[], + bbox: [Pos, Pos], } type TransmitUpdateEntry_Image = { -- 2.30.2