mirror of
https://github.com/SwingTheVine/Wplace-BlueMarble.git
synced 2026-04-21 15:21:58 +00:00
SVG shinanigans
This commit is contained in:
parent
42da8020bf
commit
1f2d86f73c
2 changed files with 36 additions and 4 deletions
23
src/main.js
23
src/main.js
|
|
@ -6,7 +6,7 @@ import Overlay from './Overlay.js';
|
||||||
import Observers from './observers.js';
|
import Observers from './observers.js';
|
||||||
import ApiManager from './apiManager.js';
|
import ApiManager from './apiManager.js';
|
||||||
import TemplateManager from './templateManager.js';
|
import TemplateManager from './templateManager.js';
|
||||||
import { consoleLog, consoleWarn } from './utils.js';
|
import { calculateRelativeLuminance, consoleLog, consoleWarn } from './utils.js';
|
||||||
|
|
||||||
const name = GM_info.script.name.toString(); // Name of userscript
|
const name = GM_info.script.name.toString(); // Name of userscript
|
||||||
const version = GM_info.script.version.toString(); // Version of userscript
|
const version = GM_info.script.version.toString(); // Version of userscript
|
||||||
|
|
@ -292,7 +292,7 @@ function buildWindowMain() {
|
||||||
.addHr().buildElement()
|
.addHr().buildElement()
|
||||||
.addDiv({'class': 'bm-container'})
|
.addDiv({'class': 'bm-container'})
|
||||||
.addDiv({'class': 'bm-container'})
|
.addDiv({'class': 'bm-container'})
|
||||||
.addButton({'class': 'bm-button-circle bm-button-pin', 'style': 'margin-top: 0;', 'innerHTML': '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 4 6"><circle cx="2" cy="2" r="2"></circle><path d="M2 6 L3.7 3 L0.3 3 Z"></path><circle cx="2" cy="2" r="0.7" fill="white"></circle></svg></svg>'},
|
.addButton({'class': 'bm-button-circle bm-button-pin', 'style': 'margin-top: 0;', 'innerHTML': '<svg viewBox="0 0 4 6"><path d="M.5,3.4A2,2 0 1 1 3.5,3.4L2,6"/><circle cx="2" cy="2" r=".7" fill="#fff"/></svg>'},
|
||||||
(instance, button) => {
|
(instance, button) => {
|
||||||
button.onclick = () => {
|
button.onclick = () => {
|
||||||
const coords = instance.apiManager?.coordsTilePixel; // Retrieves the coords from the API manager
|
const coords = instance.apiManager?.coordsTilePixel; // Retrieves the coords from the API manager
|
||||||
|
|
@ -509,9 +509,24 @@ function buildWindowFilter() {
|
||||||
const colorList = new Overlay(name, version);
|
const colorList = new Overlay(name, version);
|
||||||
colorList.addDiv({'id': 'bm-filter-container-colors', 'class': 'bm-container'})
|
colorList.addDiv({'id': 'bm-filter-container-colors', 'class': 'bm-container'})
|
||||||
|
|
||||||
// For each color in the palette, construct the DOM tree
|
// For each color in the palette...
|
||||||
for (const color of palette) {
|
for (const color of palette) {
|
||||||
colorList.addDiv({'class': 'bm-container'})
|
|
||||||
|
// Relative Luminance
|
||||||
|
const lumin = calculateRelativeLuminance(color.rgb);
|
||||||
|
|
||||||
|
// Calculates if white or black text would contrast better with the palette color
|
||||||
|
const textColorForPaletteColorBackground =
|
||||||
|
(((1.05) / (lumin + 0.05)) > ((lumin + 0.05) / 0.05))
|
||||||
|
? 'white' : 'black';
|
||||||
|
|
||||||
|
// <svg viewBox="0 1 12 6"><mask id="a"><path d="M0,0H12V8L0,2" fill="#fff"/></mask><path d="M0,4Q6-2 12,4Q6,10 0,4H4A2,2 0 1 0 6,2Q6,4 4,4ZM1,2L10,6.5L9.5,7L.5,2.5" mask="url(#a)"/></svg>
|
||||||
|
|
||||||
|
// Construct the DOM tree
|
||||||
|
colorList.addDiv({'class': 'bm-container flex-space-between'})
|
||||||
|
.addDiv({'class': '' + textColorForPaletteColorBackground, 'style': `border: thick double white`})
|
||||||
|
.addButton({'class': 'bm-button-trans', 'innerHTML': `<svg viewBox="0 .5 6 3"><path d="M0,2Q3-1 6,2Q3,5 0,2H2A1,1 0 1 0 3,1Q3,2 2,2"/></svg>`}).buildElement()
|
||||||
|
.buildElement()
|
||||||
.addP({'textContent': `Color ID: ${color.id?.toString()?.padStart(2, '0')}, Name: ${color.name}`}).buildElement()
|
.addP({'textContent': `Color ID: ${color.id?.toString()?.padStart(2, '0')}, Name: ${color.name}`}).buildElement()
|
||||||
.buildElement()
|
.buildElement()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
17
src/utils.js
17
src/utils.js
|
|
@ -127,6 +127,23 @@ export function base64ToUint8(base64) {
|
||||||
return array;
|
return array;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Calcualtes the relative luminance of an RGB value
|
||||||
|
* @param {Array<Number, Number, Number>} array - The RGB values as an array
|
||||||
|
* @returns {Number} The relative luminance as a Number
|
||||||
|
* @since 0.88.180
|
||||||
|
*/
|
||||||
|
export function calculateRelativeLuminance(array) {
|
||||||
|
|
||||||
|
// Convert the 0-255 range to 0-1
|
||||||
|
const srgb = array.map(channel => {
|
||||||
|
channel /= 255;
|
||||||
|
return (channel <= 0.03928) ? (channel / 12.92) : Math.pow((channel + 0.055) / 1.055, 2.4);
|
||||||
|
});
|
||||||
|
|
||||||
|
// https://en.wikipedia.org/wiki/Relative_luminance#Relative_luminance_and_%22gamma_encoded%22_colorspaces
|
||||||
|
return (0.2126 * srgb[0]) + (0.7152 * srgb[1]) + (0.0722 * srgb[2]);
|
||||||
|
}
|
||||||
|
|
||||||
/** Returns the coordinate input fields
|
/** Returns the coordinate input fields
|
||||||
* @returns {Element[]} The 4 coordinate Inputs
|
* @returns {Element[]} The 4 coordinate Inputs
|
||||||
* @since 0.74.0
|
* @since 0.74.0
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue