chiark / gitweb /
Pass bbox to js
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 3 Apr 2021 21:28:41 +0000 (22:28 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 4 Apr 2021 19:07:53 +0000 (20:07 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
daemon/session.rs
src/pcrender.rs
src/updates.rs
templates/script.ts

index 8ddda535a95762cf2f05c7757673e84b4e7053a0..bf651ded5eaa1c5b1c70751b0b12768473135af7 100644 (file)
@@ -50,6 +50,7 @@ struct SessionPieceLoadJson<'r> {
   uos: &'r [UoDescription],
   moveable: PieceMoveable,
   occregion: Option<JsonString<&'r Region>>,
+  pub bbox: &'r Rect,
 }
 
 #[derive(Serialize,Debug)]
@@ -139,7 +140,7 @@ fn session_inner(form: Json<SessionForm>,
                           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<SessionForm>,
         pinned: gpc.pinned,
         angle: vangle,
         desc,
+        bbox: &bbox,
         moveable: gpc.moveable(),
         uos: &pri.ui_operations(&ig.gs, gpc, ipc)?,
         occregion,
index 44fdec36bc1feff97c09b2f8a9387baa32bba6ec..5adb59611f8c42f9506ac2c59d730b3adad708f5 100644 (file)
@@ -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##"<path id="surround{}" d="{}"/>"##,
            pri.vpid, o.surround_path()?)?;
-    defs
+    (defs, bbox)
   }
 
   #[throws(InternalError)]
index bbefa6c21348336dbd683fcd8c16be4d59aef7be..c8702358763d50ec8004b60d736924bf7fd6bedd 100644 (file)
@@ -112,6 +112,7 @@ pub struct PreparedPieceState {
   pub moveable: PieceMoveable,
   pub uos: Vec<UoDescription>,
   pub occregion: Option<JsonString<Region>>,
+  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<UoDescription>,
 }
 
index 35cfe3adb6065b2d420ac27700c12a1c044ad876..22b14fdaac8894e73bbe4ceea25762f3160bd5aa 100644 (file)
@@ -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 = <PieceHandler>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 = {