import {rn} from "utils/numberUtils"; import {layerIsOn, renderLayer} from "layers"; import {drawScaleBar} from "/src/modules/measurers"; export function handleZoom(isScaleChanged, isPositionChanged) { viewbox.attr("transform", `translate(${viewX} ${viewY}) scale(${scale})`); if (isPositionChanged && layerIsOn("toggleCoordinates")) renderLayer("coordinates"); if (isScaleChanged) { invokeActiveZooming(); drawScaleBar(scale); } // zoom image converter overlay if (customization === 1) { const canvas = document.getElementById("canvas"); if (!canvas || canvas.style.opacity === "0") return; const img = document.getElementById("imageToConvert"); if (!img) return; const ctx = canvas.getContext("2d"); ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.setTransform(scale, 0, 0, scale, viewX, viewY); ctx.drawImage(img, 0, 0, canvas.width, canvas.height); } } // active zooming feature export function invokeActiveZooming() { if (coastline.select("#sea_island").size() && +coastline.select("#sea_island").attr("auto-filter")) { // toggle shade/blur filter for coatline on zoom const filter = scale > 1.5 && scale <= 2.6 ? null : scale > 2.6 ? "url(#blurFilter)" : "url(#dropShadow)"; coastline.select("#sea_island").attr("filter", filter); } // rescale labels on zoom if (labels.style("display") !== "none") { labels.selectAll("g").each(function () { if (this.id === "burgLabels") return; const desired = +this.dataset.size; const relative = Math.max(rn((desired + desired / scale) / 2, 2), 1); if (rescaleLabels.checked) this.setAttribute("font-size", relative); const hidden = hideLabels.checked && (relative * scale < 6 || relative * scale > 60); if (hidden) this.classList.add("hidden"); else this.classList.remove("hidden"); }); } // rescale emblems on zoom if (emblems.style("display") !== "none") { emblems.selectAll("g").each(function () { const size = this.getAttribute("font-size") * scale; const hidden = hideEmblems.checked && (size < 25 || size > 300); if (hidden) this.classList.add("hidden"); else this.classList.remove("hidden"); if (!hidden && window.COArenderer && this.children.length && !this.children[0].getAttribute("href")) renderGroupCOAs(this); }); } // turn off ocean pattern if scale is big (improves performance) oceanPattern .select("rect") .attr("fill", scale > 10 ? "#fff" : "url(#oceanic)") .attr("opacity", scale > 10 ? 0.2 : null); // change states halo width if (!customization) { const desired = +statesHalo.attr("data-width"); const haloSize = rn(desired / scale ** 0.8, 2); statesHalo.attr("stroke-width", haloSize).style("display", haloSize > 0.1 ? "block" : "none"); } // rescale map markers +markers.attr("rescale") && pack.markers?.forEach(marker => { const {i, x, y, size = 30, hidden} = marker; const el = !hidden && document.getElementById(`marker${i}`); if (!el) return; const zoomedSize = Math.max(rn(size / 5 + 24 / scale, 2), 1); el.setAttribute("width", zoomedSize); el.setAttribute("height", zoomedSize); el.setAttribute("x", rn(x - zoomedSize / 2, 1)); el.setAttribute("y", rn(y - zoomedSize, 1)); }); // rescale rulers to have always the same size if (ruler.style("display") !== "none") { const size = rn((10 / scale ** 0.3) * 2, 2); ruler.selectAll("text").attr("font-size", size); } }