Skip to content

Instantly share code, notes, and snippets.

@shifterbit
Last active April 16, 2025 00:31
Show Gist options
  • Select an option

  • Save shifterbit/2e16f96f044e5aba70f5d49ba550f9a6 to your computer and use it in GitHub Desktop.

Select an option

Save shifterbit/2e16f96f044e5aba70f5d49ba550f9a6 to your computer and use it in GitHub Desktop.
function createHSBCFilterToTarget(color: Int, targetColor: Int): HsbcColorFilter {
var hsbBase = RGBtoHSV(hexToRGB(color));
var hsbTarget = RGBtoHSV(hexToRGB(targetColor));
// I May or may have fumbled this section for brightness and contrast but it should work probably maybe possibly
var difference = {
hue: hsbTarget.h - hsbBase.h,
saturation: hsbTarget.s - hsbBase.s,
brightness: (hsbTarget.v - hsbBase.v) / 255,
};
difference.hue = (Math.isNaN(difference.hue)) ? 0 : difference.hue;
difference.saturation = (Math.isNaN(difference.saturation)) ? 0 : difference.saturation;
difference.brightness = (Math.isNaN(difference.brightness)) ? 0 : difference.brightness;
var filter = new HsbcColorFilter();
filter.hue = Math.toRadians(difference.hue);
filter.saturation = difference.saturation;
filter.brightness = difference.brightness;
return filter;
}
function RGBAToHex(rgba: {r: Int, g: Int, b: Int, a: Float}) {
var alpha = (rgba.a!=null&&rgba.a>=0)?rgba.a:0;
var red = (rgba.r=null&&rgba.r>=0)?rgba.r:0;
var green = (rgba.g!=null&&rgba.g>=0)?rgba.g:0;
var blue = (rgba.b!=null&&rgba.b>=0)?rgba.b:0;
return (alpha << 24) + (red << 16) + (green << 8) + (blue);
}
function hexToRGBA(hex: Int): { r: Int, g: Int, b: Int, a: Int } {
var a = (hex >> 24) & 0xFF;
var r = (hex >> 16) & 0xFF;
var g = (hex >> 8) & 0xFF;
var b = hex & 0xFF;
return {
r: r,
g: g,
b: b,
a: a
}
}
function RGBtoHSV(color: { r: Int, g: Int, b: Int }) {
var r, g, b, h, s, v;
r = color.r;
g = color.g;
b = color.b;
var min = Math.min(r, Math.min(g, b));
var max = Math.max(r, Math.max(g, b));
v = max;
delta = max - min;
if (max != 0)
s = delta / max; // s
else {
// r = g = b = 0 // s = 0, v is undefined
s = 0;
h = -1;
return { h: h, s: s, v: 0 };
}
if (r == max) {
h = (g - b) / delta; // between yellow & magenta
} else if (g == max) {
h = 2 + (b - r) / delta; // between cyan & yellow
} else {
h = 4 + (r - g) / delta; // between magenta & cyan
}
h *= 60; // degrees
if (h < 0) {
h += 360;
}
if (Math.isNaN(h)) {
h = 0;
}
return { h: h, s: s, v: v };
};
function HSVtoRGB(color: { h: Int, s: Int, v: Int }) {
var i;
var h, s, v, r, g, b;
h = color.h;
s = color.s;
v = color.v;
if (s == 0) {
// achromatic (grey)
r = g = b = v;
return { r: r, g: g, b: b };
}
h = h / 60; // sector 0 to 5
i = Math.floor(h);
f = h - i; // factorial part of h
p = v * (1 - s);
q = v * (1 - s * f);
t = v * (1 - s * (1 - f));
switch (i) {
case 0:
r = v;
g = t;
b = p;
case 1:
r = q;
g = v;
b = p;
case 2:
r = p;
g = v;
b = t;
case 3:
r = p;
g = q;
b = v;
case 4:
r = t;
g = p;
b = v;
default: // case 5:
r = v;
g = p;
b = q;
}
return { r: r, g: g, b: b };
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment