clone

a photo toolkit for your phone that never uploads: fuji film looks for raw files, social crops, error level analysis

Lines switch in sheet, direct sheet close handlers, reload on SW takeover

Dami committed cc5dc79
commit
cc5dc795aab71199b6a4e01ae518549dcac808f4
parent
e716e076f2caad416e3ccd7f65e180da3069d282
author
Dami <dami.etoile@gmail.com>
3 files changed, +7 -4
Mapp.mjs9+++++----
Mhome.mjs1+
Mperspective.html1+
M app.mjs +5 -4
@@ -71,7 +71,7 @@ async function detect(){
7171 try{7272 const a=pixels(scaledCanvas(original,960)),start=performance.now();7373 const result=await rpc('detect',{...a},[a.pixels.buffer]);74- lines=result.lines;analysisSize={w:result.w,h:result.h};hasDetected=true;showLines=true;74+ lines=result.lines;analysisSize={w:result.w,h:result.h};hasDetected=true;showLines=true;$('show-lines').checked=true;7575 let v=0,h=0,rejected=0,other=0;7676 for(let i=4;i<lines.length;i+=6){const t=lines[i];if(!(t&1))other++;else if(!(t&4))rejected++;else if(t&2)v++;else h++;}7777 $('line-count').textContent=`${v+h} lines`;
@@ -97,7 +97,8 @@ function scheduleRender(){updateLabels();clearTimeout(renderTimer);renderTimer=s
9797 9898 $('detect').onclick=detect;fitButtons.forEach(b=>b.onclick=()=>fit(Number(b.dataset.mode)));9999 $('rotation').oninput=scheduleRender;$('strength').oninput=scheduleRender;100-$('lines').onclick=()=>{showLines=!showLines;syncControls();drawOverlay();};100+function setLines(v){showLines=v;$('show-lines').checked=v;syncControls();drawOverlay();}101+$('lines').onclick=()=>setLines(!showLines);$('show-lines').onchange=()=>setLines($('show-lines').checked);101102 $('guides').onclick=()=>{showGuides=!showGuides;syncControls();drawOverlay();};102103 $('show-rejected').onchange=drawOverlay;103104 $('compare').onclick=()=>{showBefore=!showBefore;draw();};
@@ -115,7 +116,7 @@ stage.addEventListener('dragleave',()=>zone.classList.remove('over'));
115116 stage.addEventListener('drop',e=>{e.preventDefault();zone.classList.remove('over');const file=e.dataTransfer.files[0];if(file)openFile(file);});116117 117118 // Sheets118-function sheet(id){const d=$(id);d.onclick=e=>{if(e.target===d||e.target.closest('[data-close]'))d.close();};return d;}119+function sheet(id){const d=$(id);for(const b of d.querySelectorAll('[data-close]'))b.onclick=()=>d.close();d.addEventListener('click',e=>{if(e.target===d)d.close();});return d;}119120 const cropSheet=sheet('crop-sheet'),saveSheet=sheet('save-sheet'),linesSheet=sheet('lines-sheet');120121 function syncCrop(){for(const b of cropSheet.querySelectorAll('[data-crop]'))b.setAttribute('aria-checked',String(b.dataset.crop===cropMode));}121122 $('crop').onclick=()=>cropSheet.showModal();
@@ -152,6 +153,6 @@ async function save(format){
152153 }catch(e){status(e.message,true);}finally{setBusy(false);}153154 }154155 new ResizeObserver(drawOverlay).observe(canvas);155-if('serviceWorker'in navigator)navigator.serviceWorker.register('./sw.js').catch(()=>{});156+if('serviceWorker'in navigator){navigator.serviceWorker.register('./sw.js').catch(()=>{});let hadController=Boolean(navigator.serviceWorker.controller);navigator.serviceWorker.addEventListener('controllerchange',()=>{if(hadController&&!original)location.reload();hadController=true;});}156157 syncCrop();157158 try{await rpc('init');}catch(e){status(e.message,true);}finally{setBusy(false);}
M home.mjs +1 -0
M perspective.html +1 -0