Class ColorUtils
java.lang.Object
com.github.tommyettinger.textra.utils.ColorUtils
public class ColorUtils
extends java.lang.Object
A few static methods for commonly-used color handling tasks.
This has methods to convert from HSLA colors to RGBA and back again, for hue-changing effects mainly.
It also has
lerpColors(int, int, float) to blend RGBA colors, and multiplyAlpha(int, float) to
alter only the alpha channel on an RGBA or HSLA int color.-
Constructor Summary
Constructors Constructor Description ColorUtils() -
Method Summary
Modifier and Type Method Description static floatchannel(int color, int channel)Given a packed int color and a channel value from 0 to 3, gets the value of that channel as a float from 0.0f to 1.0f .static intchannelInt(int color, int channel)Given a packed int color and a channel value from 0 to 3, gets the value of that channel as an int from 0 to 255 .static intdarken(int start, float change)Interpolates from the int color start towards black by change.static intdescribe(java.lang.String description)Parses a color description and returns the approximate color it describes, as an RGBA8888 int color.static intdullen(int start, float change)Brings the chromatic components ofstartcloser to grayscale bychange(desaturating them).static intenrich(int start, float change)Pushes the chromatic components ofstartaway from grayscale by change (saturating them).static inthsb2rgb(float h, float s, float b, float a)Converts the four HSBA/HSVA components, each in the 0.0 to 1.0 range, to an int in RGBA8888 format.static inthsl2rgb(float h, float s, float l, float a)Converts the four HSLA components, each in the 0.0 to 1.0 range, to an int in RGBA8888 format.static intlerpColors(int s, int e, float change)Interpolates from the RGBA8888 int color start towards end by change.static intlighten(int start, float change)Interpolates from the int color start towards white by change.static intmix(int[] colors, int offset, int size)Given several colors, this gets an even mix of all colors in equal measure.static int[][]multiplyAllAlpha(int[][] colors, float multiplier)Given any purely-non-null 2D int array representing RGBA or HSLA colors, this multiplies the alpha channel of each color by multiplier, modifying the given array, and returns the changed array for chaining.static floatmultiplyAlpha(float color, float multiplier)Given a packed ABGR float color, this multiplies the alpha of that color by multiplier and returns another float color of the same format passed in.static intmultiplyAlpha(int color, float multiplier)Given an RGBA8888 or HSLA color as an int, this multiplies the alpha of that color by multiplier and returns another int color of the same format passed in.static intoffset(int color, float power)Gets an "offset color" for the originalcolorwhere high red, green, or blue channels become low values in that same channel, and vice versa, then blends the original with that offset, using more of the offset ifpoweris higher (closer to 1.0f).static intoffsetLightness(int color, float power)Gets an "offset color" for the originalcolor, lightening it if it is perceptually dark (under 40% luma by a simplistic measurement) or darkening it if it is perceptually light.static intrgb2hsb(float r, float g, float b, float a)Converts the four RGBA components, each in the 0.0 to 1.0 range, to an int in HSBA/HSVA format (hue, saturation, brightness/value, alpha).static intrgb2hsl(float r, float g, float b, float a)Converts the four RGBA components, each in the 0.0 to 1.0 range, to an int in HSLA format (hue, saturation, lightness, alpha).Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Constructor Details
-
ColorUtils
public ColorUtils()
-
-
Method Details
-
hsl2rgb
public static int hsl2rgb(float h, float s, float l, float a)Converts the four HSLA components, each in the 0.0 to 1.0 range, to an int in RGBA8888 format. I brought this over from colorful-gdx's FloatColors class. I can't recall where I got the original HSL(A) code from, but there's a strong chance it was written by cypherdare/cyphercove for their color space comparison.- Parameters:
h- hue, from 0.0 to 1.0s- saturation, from 0.0 to 1.0l- lightness, from 0.0 to 1.0a- alpha, from 0.0 to 1.0- Returns:
- an RGBA8888-format int
-
rgb2hsl
public static int rgb2hsl(float r, float g, float b, float a)Converts the four RGBA components, each in the 0.0 to 1.0 range, to an int in HSLA format (hue, saturation, lightness, alpha). This format is exactly like RGBA8888 but treats what would normally be red as hue, green as saturation, and blue as lightness; alpha is the same.- Parameters:
r- red, from 0.0 to 1.0g- green, from 0.0 to 1.0b- blue, from 0.0 to 1.0a- alpha, from 0.0 to 1.0- Returns:
- an "HSLA-format" int
-
hsb2rgb
public static int hsb2rgb(float h, float s, float b, float a)Converts the four HSBA/HSVA components, each in the 0.0 to 1.0 range, to an int in RGBA8888 format. I brought this over from colorful-gdx's FloatColors class. I can't recall where I got the original HSL(A) code from, but there's a strong chance it was written by cypherdare/cyphercove for their color space comparison. HSV and HSB are synonyms; it makes a little more sense to call the third channel brightness.- Parameters:
h- hue, from 0.0 to 1.0s- saturation, from 0.0 to 1.0b- brightness, from 0.0 to 1.0a- alpha, from 0.0 to 1.0- Returns:
- an RGBA8888-format int
-
rgb2hsb
public static int rgb2hsb(float r, float g, float b, float a)Converts the four RGBA components, each in the 0.0 to 1.0 range, to an int in HSBA/HSVA format (hue, saturation, brightness/value, alpha). This format is exactly like RGBA8888 but treats what would normally be red as hue, green as saturation, and blue as brightness/value; alpha is the same. HSV and HSB are synonyms; it makes a little more sense to call the third channel brightness.- Parameters:
r- red, from 0.0 to 1.0g- green, from 0.0 to 1.0b- blue, from 0.0 to 1.0a- alpha, from 0.0 to 1.0- Returns:
- an "HSBA/HSVA-format" int
-
channel
public static float channel(int color, int channel)Given a packed int color and a channel value from 0 to 3, gets the value of that channel as a float from 0.0f to 1.0f . Channel 0 refers to R in RGBA8888 and H inHSLAints, channel 1 refers to G or S, 2 refers to B or L, and 3 always refers to A.- Parameters:
color- a packed int color in any 32-bit, 4-channel formatchannel- which channel to access, as an index from 0 to 3 inclusive- Returns:
- the non-packed float value of the requested channel, from 0.0f to 1.0f inclusive
-
channelInt
public static int channelInt(int color, int channel)Given a packed int color and a channel value from 0 to 3, gets the value of that channel as an int from 0 to 255 . Channel 0 refers to R in RGBA8888 and H inHSLAints, channel 1 refers to G or S, 2 refers to B or L, and 3 always refers to A.- Parameters:
color- a packed int color in any 32-bit, 4-channel formatchannel- which channel to access, as an index from 0 to 3 inclusive- Returns:
- the int value of the requested channel, from 0 to 255 inclusive
-
lerpColors
public static int lerpColors(int s, int e, float change)Interpolates from the RGBA8888 int color start towards end by change. Both start and end should be RGBA8888 ints, and change can be between 0f (keep start) and 1f (only use end). This is a good way to reduce allocations of temporary Colors.- Parameters:
s- the starting color as a packed inte- the end/target color as a packed intchange- how much to go from start toward end, as a float between 0 and 1; higher means closer to end- Returns:
- an RGBA8888 int that represents a color between start and end
-
mix
public static int mix(int[] colors, int offset, int size)Given several colors, this gets an even mix of all colors in equal measure. Ifcolorsis null or has no items, this returns 256 (a transparent placeholder used byColorLookupfor "no color found"). This is mostly useful in conjunction withIntArray, using itsitemsfor colors, typically 0 for offset, and itssizefor size.- Parameters:
colors- an array of RGBA8888 int colors; all should use the same color spaceoffset- the index of the first item incolorsto usesize- how many items fromcolorsto use- Returns:
- an even mix of all colors given, as an RGBA8888 int color
-
lighten
public static int lighten(int start, float change)Interpolates from the int color start towards white by change. While change should be between 0f (return start as-is) and 1f (return white), start should be an RGBA8888 color. This is a good way to reduce allocations of temporary Colors, and is a little more efficient and clear than usinglerpColors(int, int, float)to lerp towards white. UnlikelerpColors(int, int, float), this keeps the alpha of start as-is.- Parameters:
start- the starting color as an RGBA8888 intchange- how much to go from start toward white, as a float between 0 and 1; higher means closer to white- Returns:
- an RGBA8888 int that represents a color between start and white
- See Also:
the counterpart method that darkens an int color
-
darken
public static int darken(int start, float change)Interpolates from the int color start towards black by change. While change should be between 0f (return start as-is) and 1f (return black), start should be an RGBA8888 color. This is a good way to reduce allocations of temporary Colors, and is a little more efficient and clear than usinglerpColors(int, int, float)to lerp towards black. UnlikelerpColors(int, int, float), this keeps the alpha of start as-is.- Parameters:
start- the starting color as an RGBA8888 intchange- how much to go from start toward black, as a float between 0 and 1; higher means closer to black- Returns:
- an RGBA8888 int that represents a color between start and black
- See Also:
the counterpart method that lightens an int color
-
dullen
public static int dullen(int start, float change)Brings the chromatic components ofstartcloser to grayscale bychange(desaturating them). While change should be between 0f (return start as-is) and 1f (return fully gray), start should be an RGBA8888 int color. This leaves alpha alone.
The algorithm used is from here.- Parameters:
start- the starting color as an RGBA8888 intchange- how much to change start to a desaturated color, as a float between 0 and 1; higher means a less saturated result- Returns:
- an RGBA8888 int that represents a color between start and a desaturated color
- See Also:
the counterpart method that makes an int color more saturated
-
enrich
public static int enrich(int start, float change)Pushes the chromatic components ofstartaway from grayscale by change (saturating them). While change should be between 0f (return start as-is) and 1f (return maximally saturated), start should be an RGBA8888 int color.
The algorithm used is from here.- Parameters:
start- the starting color as an RGBA8888 intchange- how much to change start to a saturated color, as a float between 0 and 1; higher means a more saturated result- Returns:
- an RGBA8888 int that represents a color between start and a saturated color
- See Also:
the counterpart method that makes an int color less saturated
-
offset
public static int offset(int color, float power)Gets an "offset color" for the originalcolorwhere high red, green, or blue channels become low values in that same channel, and vice versa, then blends the original with that offset, using more of the offset ifpoweris higher (closer to 1.0f). It is usually fine forpowerto be 0.5f . This can look... pretty strange for some input colors, and you may wantoffsetLightness(int, float)instead.- Parameters:
color- the original color as an RGBA8888 intpower- between 0.0f and 1.0f, this is how heavily the offset color should factor in to the result- Returns:
- a mix between
colorand its offset, with higherpowerusing more of the offset
-
offsetLightness
public static int offsetLightness(int color, float power)Gets an "offset color" for the originalcolor, lightening it if it is perceptually dark (under 40% luma by a simplistic measurement) or darkening it if it is perceptually light. This essentially uses the lightness to determine whether to calllighten(color, power)ordarken(color, power). It is usually fine forpowerto be 0.5f . This leaves hue alone, and doesn't change saturation much. The lightness measurement is effectivelyred * 3/8 + green * 1/2 + blue * 1/8.- Parameters:
color- the original color as an RGBA8888 intpower- between 0.0f and 1.0f, this is how much this should either lighten or darken the result- Returns:
- a variant on
color, either lighter or darker depending on its original lightness
-
multiplyAlpha
public static int multiplyAlpha(int color, float multiplier)Given an RGBA8888 or HSLA color as an int, this multiplies the alpha of that color by multiplier and returns another int color of the same format passed in. This clamps the alpha if it would go below 0 or above 255, and leaves the RGB or HSL channels alone.- Parameters:
color- an RGBA8888 or HSLA colormultiplier- a multiplier to apply to color's alpha- Returns:
- another color of the same format as the one given, with alpha multiplied
-
multiplyAlpha
public static float multiplyAlpha(float color, float multiplier)Given a packed ABGR float color, this multiplies the alpha of that color by multiplier and returns another float color of the same format passed in. This clamps the alpha if it would go below 0 or above 255, and leaves the RGB channels alone.- Parameters:
color- an RGBA8888 or HSLA colormultiplier- a multiplier to apply to color's alpha- Returns:
- another color of the same format as the one given, with alpha multiplied
-
multiplyAllAlpha
public static int[][] multiplyAllAlpha(int[][] colors, float multiplier)Given any purely-non-null 2D int array representing RGBA or HSLA colors, this multiplies the alpha channel of each color by multiplier, modifying the given array, and returns the changed array for chaining. This usesmultiplyAlpha(int, float)internally, so its documentation applies.- Parameters:
colors- a 2D int array of RGBA or HSLA colors, none of which can include null arraysmultiplier- a multiplier to apply to each color's alpha- Returns:
- colors, after having each item's alpha multiplied
-
describe
public static int describe(java.lang.String description)Parses a color description and returns the approximate color it describes, as an RGBA8888 int color. Color descriptions consist of one or more alphabetical words, separated by non-alphabetical characters (typically spaces and/or hyphens, though the underscore is treated as a letter). Any word that is the name of a color inPalettewill be looked up inPalette.NAMEDand tracked; if there is more than one of these color name words, the colors will be mixed usingmix(int[], int, int), or if there is just one color name word, then the corresponding color will be used.
The special adjectives "light" and "dark" change the lightness of the described color; likewise, "rich" and "dull" change the saturation (how different the color is from grayscale). All of these adjectives can have "-er" or "-est" appended to make their effect twice or three times as strong. Technically, the chars appended to an adjective don't matter, only their count, so "lightaa" is the same as "lighter" and "richcat" is the same as "richest". There's an unofficial fourth level as well, used when any 4 characters are appended to an adjective (as in "darkmost"); it has four times the effect of the original adjective. There are also the adjectives "bright" (equivalent to "light rich"), "pale" ("light dull"), "deep" ("dark rich"), and "weak" ("dark dull"). These can be amplified like the other four, except that "pale" goes to "paler", "palest", and then to "palemax" or (its equivalent) "palemost", where only the word length is checked.
If part of a color name or adjective is invalid, it is not considered; if the description is empty or fully invalid, this returns the RGBA8888 int value 256 (used as a placeholder byColorLookup).
Examples of valid descriptions include "blue", "dark green", "DULLER RED", "peach pink", "indigo purple mauve", "BRIGHT GOLD", "lightest, richer apricot-olive", and "LIGHTMOST rich MAROON indigo".- Parameters:
description- a color description, as a lower-case String matching the above format- Returns:
- an RGBA8888 int color as described
-