Last active
April 16, 2025 00:31
-
-
Save shifterbit/2e16f96f044e5aba70f5d49ba550f9a6 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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