All checks were successful
ClarkeIS Build / Build-Docker-Image (push) Successful in 44s
173 lines
5.3 KiB
JavaScript
173 lines
5.3 KiB
JavaScript
function frame(e) {
|
|
for (let el of document.querySelectorAll("body > div")) {
|
|
if (el.style.display != "none") {
|
|
el.style.display = "none";
|
|
window.app[el.id].exit();
|
|
}
|
|
}
|
|
document.getElementById(e).style.display = "";
|
|
window.app[e].enter();
|
|
}
|
|
|
|
let canvas = document.getElementById("precanvas");
|
|
let ctx = canvas.getContext("2d");
|
|
let video = document.getElementById("magic_video");
|
|
|
|
function takepicture() {
|
|
let box = video.getBoundingClientRect();
|
|
video.classList.add("unbounded");
|
|
document.getElementById("endcamera").style.display = "";
|
|
ctx.canvas.classList.remove("offscreen");
|
|
document.getElementById("camview").classList.add("took")
|
|
// si c'est portrait, nous doivons le tourner à landscape (parce que le canvas ont besoin d'un photo landscape pour marcher bien)
|
|
// [un peu plus tard] pourquoi a-moi apprendré le français? c'est horrible
|
|
if (box.height > box.width) {
|
|
canvas.width = box.height;
|
|
canvas.height = box.width;
|
|
ctx.translate(box.width/2, box.height/2);
|
|
ctx.rotate(Math.PI / 2);
|
|
ctx.drawImage(video, -box.width/2, -box.height/2, box.width, box.height);
|
|
ctx.rotate(-Math.PI / 2);
|
|
ctx.translate(-box.width/2, -box.height/2);
|
|
}
|
|
else {
|
|
canvas.width = box.width;
|
|
canvas.height = box.height;
|
|
ctx.drawImage(video, 0, 0, box.width, box.height);
|
|
}
|
|
video.classList.remove("unbounded");
|
|
}
|
|
|
|
function setdetails() {
|
|
frame("details");
|
|
}
|
|
|
|
|
|
if ("geolocation" in navigator) {
|
|
document.getElementById("here").style.display = "";
|
|
}
|
|
|
|
function populateLocation() {
|
|
navigator.geolocation.getCurrentPosition(pos => {
|
|
document.getElementById("long").value = pos.coords.longitude;
|
|
document.getElementById("lat").value = pos.coords.latitude;
|
|
});
|
|
}
|
|
|
|
function render() {
|
|
frame("finalresult");
|
|
}
|
|
|
|
window.app = {
|
|
"home": {
|
|
enter() {
|
|
let preview = document.getElementById("preview");
|
|
navigator.mediaDevices.getUserMedia({ video: {
|
|
facingMode: { ideal: "environment" }
|
|
}, audio : false }).then((stream) => {
|
|
video.srcObject = stream;
|
|
video.play();
|
|
preview.srcObject = stream;
|
|
preview.play();
|
|
window.app.stream = stream;
|
|
});
|
|
},
|
|
exit() {
|
|
window.app.stream.getTracks().forEach(track => {
|
|
track.stop();
|
|
});
|
|
}
|
|
},
|
|
"details": {
|
|
enter() {
|
|
},
|
|
exit() {
|
|
|
|
}
|
|
},
|
|
"finalresult": {
|
|
enter() {
|
|
(async () => {
|
|
let iframe = document.getElementById("final");
|
|
const pdfDoc = await PDFLib.PDFDocument.create();
|
|
const page = pdfDoc.addPage([1440, 960]);
|
|
page.moveTo(0, 960 - 96);
|
|
page.drawText(document.getElementById("title").value, { size : 96 });
|
|
page.moveTo(0, 960 - 152);
|
|
page.drawText(new Date().toLocaleString(), { size : 48});
|
|
let lat = document.getElementById("lat").value;
|
|
let long = document.getElementById("long").value;
|
|
let res = await reverse_geocode(lat, long);
|
|
page.moveTo(0, 960 - 208);
|
|
page.drawText(res, { size : 48 });
|
|
page.moveTo(0, 960 - 256);
|
|
page.drawText("https://maps.google.com/maps?q=" + lat + "," + long, { size : 48 });
|
|
page.moveTo(0, 960 - 308);
|
|
page.drawText("Notes: " + document.getElementById("notes").value, { size : 48 });
|
|
let static = await maps_static(lat, long);
|
|
let embeddedImage = await pdfDoc.embedPng(static);
|
|
let dims = embeddedImage.scale(1);
|
|
page.drawImage(embeddedImage, {
|
|
x: 365 * 2,
|
|
y: 960 - 320 - dims.height,
|
|
width : dims.width,
|
|
height : dims.height
|
|
});
|
|
let image = document.getElementById("precanvas");
|
|
let static2 = await fetch(image.toDataURL('image/png')).then(res => res.arrayBuffer());
|
|
let embeddedImage2 = await pdfDoc.embedPng(static2);
|
|
let dims2 = embeddedImage2.scale(1);
|
|
page.drawImage(embeddedImage2, {
|
|
x: 0,
|
|
y: 960 - 320 - dims2.height / dims2.width * 720,
|
|
width : 720,
|
|
height : dims2.height / dims2.width * 720
|
|
});
|
|
//ctx.drawImage(image, 0, 320, 720, image.height / image.width * 720);
|
|
const dataURI = await pdfDoc.saveAsBase64({ dataUri: true });
|
|
iframe.src = dataURI;
|
|
})()
|
|
},
|
|
exit() {
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
frame("home");
|
|
|
|
|
|
async function reverse_geocode(lat, long) {
|
|
let res = await fetch("https://maps.googleapis.com/maps/api/geocode/json?zoom=6&latlng=" + lat + "," + long + "&key=AIzaSyD_zbdxwN7_aOMNH69eAL9bSS814Ix-UM8");
|
|
let json = await res.json();
|
|
return json.results[0].formatted_address;
|
|
}
|
|
|
|
|
|
async function maps_static(lat, long) {
|
|
return await fetch("https://maps.googleapis.com/maps/api/staticmap?size=710x600&key=AIzaSyD_zbdxwN7_aOMNH69eAL9bSS814Ix-UM8&markers=label:S%7C" + lat + "," + long).then((res) => res.arrayBuffer());
|
|
}
|
|
|
|
|
|
function getFilename() {
|
|
var title = "camera-info-";
|
|
for (char of document.getElementById("title").value) {
|
|
let cc = char.charCodeAt(0);
|
|
if ((cc > 47 && cc < 58) || (cc > 64 && cc < 91) || (cc > 96 && cc < 123)) {
|
|
title += char.toLowerCase();
|
|
}
|
|
else {
|
|
title += '-';
|
|
}
|
|
}
|
|
return title + ".pdf";
|
|
}
|
|
|
|
|
|
function download() {
|
|
let canvas = document.getElementById("final");
|
|
let anchor = document.createElement("a");
|
|
anchor.href = canvas.src;
|
|
anchor.download = getFilename();
|
|
anchor.click();
|
|
} |