chiark / gitweb /
work around firefox GetScreenCTM bug
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 30 Nov 2020 11:28:15 +0000 (11:28 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 30 Nov 2020 11:28:15 +0000 (11:28 +0000)
Well this is a bodge!

  https://bugzilla.mozilla.org/show_bug.cgi?id=1610093
  https://bugzilla.mozilla.org/show_bug.cgi?id=972041
  https://bugzilla.mozilla.org/show_bug.cgi?id=1446011

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
templates/script.ts

index 792fe056bd8d709941c3c68a6530eb5518df0951..642aeb79baf0875542e2a220237da2e7df25f44e 100644 (file)
@@ -103,6 +103,8 @@ var ctoken : string;
 var uo_map : { [k: string]: UoRecord | null } = Object.create(null);
 var keyops_local : { [opname: string]: (uo: UoRecord) => void } = Object();
 var last_log_ts: wasm_bindgen.TimestampAbbreviator;
+var last_zoom_factor : number = 1.0;
+var firefox_bug_zoom_factor_compensation : number = 1.0;
 
 var svg_ns : string;
 var space : SVGGraphicsElement;
@@ -744,8 +746,8 @@ function redisplay_ancillaries(piece: PieceId, p: PieceInfo) {
 
 function drag_mousemove(e: MouseEvent) {
   var ctm = space.getScreenCTM()!;
-  var ddx = (e.clientX - dcx!)/ctm.a;
-  var ddy = (e.clientY - dcy!)/ctm.d;
+  var ddx = (e.clientX - dcx!)/(ctm.a * firefox_bug_zoom_factor_compensation);
+  var ddy = (e.clientY - dcy!)/(ctm.d * firefox_bug_zoom_factor_compensation);
   var ddr2 = ddx*ddx + ddy*ddy;
   if (!(dragging & DRAGGING.YES)) {
     if (ddr2 > DRAGTHRESH) {
@@ -903,8 +905,19 @@ function zoom_activate() {
   let pct = zoom_pct();
   if (pct !== undefined) {
     let fact = pct * 0.01;
+    let last_ctm_a = space.getScreenCTM()!.a;
     (document.getElementsByTagName('body')[0] as HTMLElement)
       .style.transform = 'scale('+fact+','+fact+')';
+    if (fact != last_zoom_factor) {
+      if (last_ctm_a == space.getScreenCTM()!.a) {
+       console.log('FIREFOX GETSCREENCTM BUG');
+       firefox_bug_zoom_factor_compensation = fact;
+      } else {
+       console.log('No firefox getscreenctm bug');
+       firefox_bug_zoom_factor_compensation = 1.0;
+      }
+      last_zoom_factor = fact;
+    }
   }
   zoom_btn.disabled = true;
 }