diff --git a/plugin/contents/ui/dancer.html b/plugin/contents/ui/dancer.html index 3d83afe..c4382ac 100644 --- a/plugin/contents/ui/dancer.html +++ b/plugin/contents/ui/dancer.html @@ -1224,10 +1224,33 @@ if (typeof CONSTELLATIONS !== 'undefined') { for (const constellation of CONSTELLATIONS) { if (!constellation.art) continue; const img = new Image(); - img.onload = () => projectSky(); + const entry = { img, render: null }; + img.onload = () => { + /* Os originais usam preto como transparência. Convertê-lo em alpha + evita que a transformação afim revele os limites retangulares. */ + const out = document.createElement('canvas'); + out.width = constellation.art.size[0]; + out.height = constellation.art.size[1]; + const oc = out.getContext('2d', { willReadFrequently: true }); + oc.drawImage(img, 0, 0, out.width, out.height); + const pixels = oc.getImageData(0, 0, out.width, out.height); + for (let i = 0; i < pixels.data.length; i += 4) { + const r = pixels.data[i], g = pixels.data[i + 1], b = pixels.data[i + 2]; + const light = Math.max(r, g, b); + const mask = Math.max(0, Math.min(1, (light - 9) / 118)); + pixels.data[i] = 105 + light * 0.42; + pixels.data[i + 1] = 175 + light * 0.27; + pixels.data[i + 2] = 235 + light * 0.08; + pixels.data[i + 3] = pixels.data[i + 3] * mask; + } + oc.clearRect(0, 0, out.width, out.height); + oc.putImageData(pixels, 0, 0); + entry.render = out; + projectSky(); + }; img.onerror = () => console.error('[skeledance] falha na arte de ' + constellation.name); img.src = constellation.art.file; - constellationArtImages.set(constellation.id, img); + constellationArtImages.set(constellation.id, entry); } } const VIEW_AZ = 90; // centro da tela olha para o LESTE — a tela física do @@ -1435,8 +1458,8 @@ function constellationArtTransform(source, target) { function drawConstellationArt(c, constellation, lst, W, horizonPx) { const art = constellation.art; - const img = constellationArtImages.get(constellation.id); - if (!art || !img || !img.complete || !img.naturalWidth) return; + const imageEntry = constellationArtImages.get(constellation.id); + if (!art || !imageEntry || !imageEntry.render) return; const target = art.anchors.map(anchor => { const aa = altAz(anchor.sky[0], anchor.sky[1], lst); @@ -1459,9 +1482,9 @@ function drawConstellationArt(c, constellation, lst, W, horizonPx) { c.rect(0, 0, W, horizonPx); c.clip(); c.globalCompositeOperation = 'screen'; - c.globalAlpha = 0.19; + c.globalAlpha = 0.24; c.setTransform(...matrix); - c.drawImage(img, 0, 0, art.size[0], art.size[1]); + c.drawImage(imageEntry.render, 0, 0, art.size[0], art.size[1]); c.restore(); }