| class VectorscopeCC { | |
| static dot = { 'txt': null, 'img': null }; | |
| static updateCursor(r, g, b, mode) { | |
| const mag = Math.abs(r) + Math.abs(g) + Math.abs(b); | |
| var condX, condY; | |
| if (mag < Number.EPSILON) { | |
| condX = 0.0; | |
| condY = 0.0; | |
| } else { | |
| condX = 25 * Math.sqrt(r * r + g * g + b * b) * (r * -0.5 + g * -0.5 + b * 1.0) / mag; | |
| condY = 25 * Math.sqrt(r * r + g * g + b * b) * (r * -0.866 + g * 0.866 + b * 0.0) / mag; | |
| } | |
| this.dot[mode].style.left = `calc(50% + ${condX - 12}px)`; | |
| this.dot[mode].style.top = `calc(50% + ${condY - 12}px)`; | |
| } | |
| static registerPicker(wheel, sliders, dot) { | |
| ['mousemove', 'click'].forEach((event) => { | |
| wheel.addEventListener(event, (e) => { | |
| e.preventDefault(); | |
| if (e.type === 'mousemove' && e.buttons != 1) | |
| return; | |
| const rect = e.target.getBoundingClientRect(); | |
| const p_rect = e.target.parentNode.getBoundingClientRect(); | |
| const shift = (p_rect.width - rect.width) / 2.0; | |
| dot.style.left = `calc(${e.clientX - rect.left}px - 12px + ${shift}px)`; | |
| dot.style.top = `calc(${e.clientY - rect.top}px - 12px)`; | |
| const x = ((e.clientX - rect.left) - 100.0) / 25; | |
| const y = ((e.clientY - rect.top) - 100.0) / 25; | |
| const zeta = Math.atan(y / x); | |
| var degree = 0; | |
| if (x >= 0) { | |
| if (y >= 0) | |
| degree = zeta * 180 / Math.PI; | |
| else | |
| degree = 360 + zeta * 180 / Math.PI; | |
| } | |
| else if (x < 0) { | |
| degree = 180 + zeta * 180 / Math.PI; | |
| } | |
| var r = -(0.00077 * (433 * x * degree + 750 * y * degree) / degree); | |
| var g = y / 0.866 + r; | |
| var b = x + 0.5 * r + 0.5 * g; | |
| const mag = Math.sqrt(r * r + g * g + b * b); | |
| const len = Math.abs(r) + Math.abs(g) + Math.abs(b); | |
| r = (r / mag * len).toFixed(2); | |
| g = (g / mag * len).toFixed(2); | |
| b = (b / mag * len).toFixed(2); | |
| sliders[0][0].value = r; | |
| sliders[0][1].value = r; | |
| sliders[1][0].value = g; | |
| sliders[1][1].value = g; | |
| sliders[2][0].value = b; | |
| sliders[2][1].value = b; | |
| }); | |
| }); | |
| ['mouseleave', 'mouseup'].forEach((event) => { | |
| wheel.addEventListener(event, () => { | |
| updateInput(sliders[0][0]); | |
| updateInput(sliders[1][0]); | |
| updateInput(sliders[2][0]); | |
| }); | |
| }); | |
| } | |
| } | |
| onUiLoaded(() => { | |
| ['txt', 'img'].forEach((mode) => { | |
| const container = document.getElementById(`cc-colorwheel-${mode}`); | |
| container.style.height = '200px'; | |
| container.style.width = '200px'; | |
| const wheel = container.querySelector('img'); | |
| container.insertBefore(wheel, container.firstChild); | |
| while (container.firstChild !== container.lastChild) | |
| container.lastChild.remove(); | |
| wheel.ondragstart = (e) => { e.preventDefault(); return false; }; | |
| wheel.id = `cc-img-${mode}`; | |
| const sliders = [ | |
| [ | |
| document.getElementById(`cc-r-${mode}`).querySelector('input[type=number]'), | |
| document.getElementById(`cc-r-${mode}`).querySelector('input[type=range]') | |
| ], | |
| [ | |
| document.getElementById(`cc-g-${mode}`).querySelector('input[type=number]'), | |
| document.getElementById(`cc-g-${mode}`).querySelector('input[type=range]') | |
| ], | |
| [ | |
| document.getElementById(`cc-b-${mode}`).querySelector('input[type=number]'), | |
| document.getElementById(`cc-b-${mode}`).querySelector('input[type=range]') | |
| ] | |
| ]; | |
| const temp = document.getElementById(`cc-temp-${mode}`); | |
| const dot = temp.querySelector('img'); | |
| dot.id = `cc-dot-${mode}`; | |
| dot.style.left = 'calc(50% - 12px)'; | |
| dot.style.top = 'calc(50% - 12px)'; | |
| container.appendChild(dot); | |
| temp.remove(); | |
| VectorscopeCC.dot[mode] = dot; | |
| VectorscopeCC.registerPicker(wheel, sliders, dot); | |
| }); | |
| }); | |