Home | History | Annotate | Download | only in graphics
      1 /*******************************************************************************
      2  * Copyright 2011 See AUTHORS file.
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *   http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  ******************************************************************************/
     16 
     17 package com.badlogic.gdx.graphics;
     18 
     19 import com.badlogic.gdx.utils.NumberUtils;
     20 
     21 /** A color class, holding the r, g, b and alpha component as floats in the range [0,1]. All methods perform clamping on the
     22  * internal values after execution.
     23  *
     24  * @author mzechner */
     25 public class Color {
     26 	public static final Color CLEAR = new Color(0, 0, 0, 0);
     27 	public static final Color BLACK = new Color(0, 0, 0, 1);
     28 
     29 	public static final Color WHITE = new Color(0xffffffff);
     30 	public static final Color LIGHT_GRAY = new Color(0xbfbfbfff);
     31 	public static final Color GRAY = new Color(0x7f7f7fff);
     32 	public static final Color DARK_GRAY = new Color(0x3f3f3fff);
     33 
     34 	public static final Color BLUE = new Color(0, 0, 1, 1);
     35 	public static final Color NAVY = new Color(0, 0, 0.5f, 1);
     36 	public static final Color ROYAL = new Color(0x4169e1ff);
     37 	public static final Color SLATE = new Color(0x708090ff);
     38 	public static final Color SKY = new Color(0x87ceebff);
     39 	public static final Color CYAN = new Color(0, 1, 1, 1);
     40 	public static final Color TEAL = new Color(0, 0.5f, 0.5f, 1);
     41 
     42 	public static final Color GREEN = new Color(0x00ff00ff);
     43 	public static final Color CHARTREUSE = new Color(0x7fff00ff);
     44 	public static final Color LIME = new Color(0x32cd32ff);
     45 	public static final Color FOREST = new Color(0x228b22ff);
     46 	public static final Color OLIVE = new Color(0x6b8e23ff);
     47 
     48 	public static final Color YELLOW = new Color(0xffff00ff);
     49 	public static final Color GOLD = new Color(0xffd700ff);
     50 	public static final Color GOLDENROD = new Color(0xdaa520ff);
     51 	public static final Color ORANGE = new Color(0xffa500ff);
     52 
     53 	public static final Color BROWN = new Color(0x8b4513ff);
     54 	public static final Color TAN = new Color(0xd2b48cff);
     55 	public static final Color FIREBRICK = new Color(0xb22222ff);
     56 
     57 	public static final Color RED = new Color(0xff0000ff);
     58 	public static final Color SCARLET = new Color(0xff341cff);
     59 	public static final Color CORAL = new Color(0xff7f50ff);
     60 	public static final Color SALMON = new Color(0xfa8072ff);
     61 	public static final Color PINK = new Color(0xff69b4ff);
     62 	public static final Color MAGENTA = new Color(1, 0, 1, 1);
     63 
     64 	public static final Color PURPLE = new Color(0xa020f0ff);
     65 	public static final Color VIOLET = new Color(0xee82eeff);
     66 	public static final Color MAROON = new Color(0xb03060ff);
     67 
     68 	/** the red, green, blue and alpha components **/
     69 	public float r, g, b, a;
     70 
     71 	/** Constructs a new Color with all components set to 0. */
     72 	public Color () {
     73 	}
     74 
     75 	/** @see #rgba8888ToColor(Color, int) */
     76 	public Color (int rgba8888) {
     77 		rgba8888ToColor(this, rgba8888);
     78 	}
     79 
     80 	/** Constructor, sets the components of the color
     81 	 *
     82 	 * @param r the red component
     83 	 * @param g the green component
     84 	 * @param b the blue component
     85 	 * @param a the alpha component */
     86 	public Color (float r, float g, float b, float a) {
     87 		this.r = r;
     88 		this.g = g;
     89 		this.b = b;
     90 		this.a = a;
     91 		clamp();
     92 	}
     93 
     94 	/** Constructs a new color using the given color
     95 	 *
     96 	 * @param color the color */
     97 	public Color (Color color) {
     98 		set(color);
     99 	}
    100 
    101 	/** Sets this color to the given color.
    102 	 *
    103 	 * @param color the Color */
    104 	public Color set (Color color) {
    105 		this.r = color.r;
    106 		this.g = color.g;
    107 		this.b = color.b;
    108 		this.a = color.a;
    109 		return this;
    110 	}
    111 
    112 	/** Multiplies the this color and the given color
    113 	 *
    114 	 * @param color the color
    115 	 * @return this color. */
    116 	public Color mul (Color color) {
    117 		this.r *= color.r;
    118 		this.g *= color.g;
    119 		this.b *= color.b;
    120 		this.a *= color.a;
    121 		return clamp();
    122 	}
    123 
    124 	/** Multiplies all components of this Color with the given value.
    125 	 *
    126 	 * @param value the value
    127 	 * @return this color */
    128 	public Color mul (float value) {
    129 		this.r *= value;
    130 		this.g *= value;
    131 		this.b *= value;
    132 		this.a *= value;
    133 		return clamp();
    134 	}
    135 
    136 	/** Adds the given color to this color.
    137 	 *
    138 	 * @param color the color
    139 	 * @return this color */
    140 	public Color add (Color color) {
    141 		this.r += color.r;
    142 		this.g += color.g;
    143 		this.b += color.b;
    144 		this.a += color.a;
    145 		return clamp();
    146 	}
    147 
    148 	/** Subtracts the given color from this color
    149 	 *
    150 	 * @param color the color
    151 	 * @return this color */
    152 	public Color sub (Color color) {
    153 		this.r -= color.r;
    154 		this.g -= color.g;
    155 		this.b -= color.b;
    156 		this.a -= color.a;
    157 		return clamp();
    158 	}
    159 
    160 	/** Clamps this Color's components to a valid range [0 - 1]
    161 	 * @return this Color for chaining */
    162 	public Color clamp () {
    163 		if (r < 0)
    164 			r = 0;
    165 		else if (r > 1) r = 1;
    166 
    167 		if (g < 0)
    168 			g = 0;
    169 		else if (g > 1) g = 1;
    170 
    171 		if (b < 0)
    172 			b = 0;
    173 		else if (b > 1) b = 1;
    174 
    175 		if (a < 0)
    176 			a = 0;
    177 		else if (a > 1) a = 1;
    178 		return this;
    179 	}
    180 
    181 	/** Sets this Color's component values.
    182 	 *
    183 	 * @param r Red component
    184 	 * @param g Green component
    185 	 * @param b Blue component
    186 	 * @param a Alpha component
    187 	 *
    188 	 * @return this Color for chaining */
    189 	public Color set (float r, float g, float b, float a) {
    190 		this.r = r;
    191 		this.g = g;
    192 		this.b = b;
    193 		this.a = a;
    194 		return clamp();
    195 	}
    196 
    197 	/** Sets this color's component values through an integer representation.
    198 	 *
    199 	 * @return this Color for chaining
    200 	 * @see #rgba8888ToColor(Color, int) */
    201 	public Color set (int rgba) {
    202 		rgba8888ToColor(this, rgba);
    203 		return this;
    204 	}
    205 
    206 	/** Adds the given color component values to this Color's values.
    207 	 *
    208 	 * @param r Red component
    209 	 * @param g Green component
    210 	 * @param b Blue component
    211 	 * @param a Alpha component
    212 	 *
    213 	 * @return this Color for chaining */
    214 	public Color add (float r, float g, float b, float a) {
    215 		this.r += r;
    216 		this.g += g;
    217 		this.b += b;
    218 		this.a += a;
    219 		return clamp();
    220 	}
    221 
    222 	/** Subtracts the given values from this Color's component values.
    223 	 *
    224 	 * @param r Red component
    225 	 * @param g Green component
    226 	 * @param b Blue component
    227 	 * @param a Alpha component
    228 	 *
    229 	 * @return this Color for chaining */
    230 	public Color sub (float r, float g, float b, float a) {
    231 		this.r -= r;
    232 		this.g -= g;
    233 		this.b -= b;
    234 		this.a -= a;
    235 		return clamp();
    236 	}
    237 
    238 	/** Multiplies this Color's color components by the given ones.
    239 	 *
    240 	 * @param r Red component
    241 	 * @param g Green component
    242 	 * @param b Blue component
    243 	 * @param a Alpha component
    244 	 *
    245 	 * @return this Color for chaining */
    246 	public Color mul (float r, float g, float b, float a) {
    247 		this.r *= r;
    248 		this.g *= g;
    249 		this.b *= b;
    250 		this.a *= a;
    251 		return clamp();
    252 	}
    253 
    254 	/** Linearly interpolates between this color and the target color by t which is in the range [0,1]. The result is stored in
    255 	 * this color.
    256 	 * @param target The target color
    257 	 * @param t The interpolation coefficient
    258 	 * @return This color for chaining. */
    259 	public Color lerp (final Color target, final float t) {
    260 		this.r += t * (target.r - this.r);
    261 		this.g += t * (target.g - this.g);
    262 		this.b += t * (target.b - this.b);
    263 		this.a += t * (target.a - this.a);
    264 		return clamp();
    265 	}
    266 
    267 	/** Linearly interpolates between this color and the target color by t which is in the range [0,1]. The result is stored in
    268 	 * this color.
    269 	 * @param r The red component of the target color
    270 	 * @param g The green component of the target color
    271 	 * @param b The blue component of the target color
    272 	 * @param a The alpha component of the target color
    273 	 * @param t The interpolation coefficient
    274 	 * @return This color for chaining. */
    275 	public Color lerp (final float r, final float g, final float b, final float a, final float t) {
    276 		this.r += t * (r - this.r);
    277 		this.g += t * (g - this.g);
    278 		this.b += t * (b - this.b);
    279 		this.a += t * (a - this.a);
    280 		return clamp();
    281 	}
    282 
    283 	/** Multiplies the RGB values by the alpha. */
    284 	public Color premultiplyAlpha () {
    285 		r *= a;
    286 		g *= a;
    287 		b *= a;
    288 		return this;
    289 	}
    290 
    291 	@Override
    292 	public boolean equals (Object o) {
    293 		if (this == o) return true;
    294 		if (o == null || getClass() != o.getClass()) return false;
    295 		Color color = (Color)o;
    296 		return toIntBits() == color.toIntBits();
    297 	}
    298 
    299 	@Override
    300 	public int hashCode () {
    301 		int result = (r != +0.0f ? NumberUtils.floatToIntBits(r) : 0);
    302 		result = 31 * result + (g != +0.0f ? NumberUtils.floatToIntBits(g) : 0);
    303 		result = 31 * result + (b != +0.0f ? NumberUtils.floatToIntBits(b) : 0);
    304 		result = 31 * result + (a != +0.0f ? NumberUtils.floatToIntBits(a) : 0);
    305 		return result;
    306 	}
    307 
    308 	/** Packs the color components into a 32-bit integer with the format ABGR and then converts it to a float.
    309 	 * @return the packed color as a 32-bit float
    310 	 * @see NumberUtils#intToFloatColor(int) */
    311 	public float toFloatBits () {
    312 		int color = ((int)(255 * a) << 24) | ((int)(255 * b) << 16) | ((int)(255 * g) << 8) | ((int)(255 * r));
    313 		return NumberUtils.intToFloatColor(color);
    314 	}
    315 
    316 	/** Packs the color components into a 32-bit integer with the format ABGR.
    317 	 * @return the packed color as a 32-bit int. */
    318 	public int toIntBits () {
    319 		int color = ((int)(255 * a) << 24) | ((int)(255 * b) << 16) | ((int)(255 * g) << 8) | ((int)(255 * r));
    320 		return color;
    321 	}
    322 
    323 	/** Returns the color encoded as hex string with the format RRGGBBAA. */
    324 	public String toString () {
    325 		String value = Integer
    326 			.toHexString(((int)(255 * r) << 24) | ((int)(255 * g) << 16) | ((int)(255 * b) << 8) | ((int)(255 * a)));
    327 		while (value.length() < 8)
    328 			value = "0" + value;
    329 		return value;
    330 	}
    331 
    332 	/** Returns a new color from a hex string with the format RRGGBBAA.
    333 	 * @see #toString() */
    334 	public static Color valueOf (String hex) {
    335 		hex = hex.charAt(0) == '#' ? hex.substring(1) : hex;
    336 		int r = Integer.valueOf(hex.substring(0, 2), 16);
    337 		int g = Integer.valueOf(hex.substring(2, 4), 16);
    338 		int b = Integer.valueOf(hex.substring(4, 6), 16);
    339 		int a = hex.length() != 8 ? 255 : Integer.valueOf(hex.substring(6, 8), 16);
    340 		return new Color(r / 255f, g / 255f, b / 255f, a / 255f);
    341 	}
    342 
    343 	/** Packs the color components into a 32-bit integer with the format ABGR and then converts it to a float. Note that no range
    344 	 * checking is performed for higher performance.
    345 	 * @param r the red component, 0 - 255
    346 	 * @param g the green component, 0 - 255
    347 	 * @param b the blue component, 0 - 255
    348 	 * @param a the alpha component, 0 - 255
    349 	 * @return the packed color as a float
    350 	 * @see NumberUtils#intToFloatColor(int) */
    351 	public static float toFloatBits (int r, int g, int b, int a) {
    352 		int color = (a << 24) | (b << 16) | (g << 8) | r;
    353 		float floatColor = NumberUtils.intToFloatColor(color);
    354 		return floatColor;
    355 	}
    356 
    357 	/** Packs the color components into a 32-bit integer with the format ABGR and then converts it to a float.
    358 	 * @return the packed color as a 32-bit float
    359 	 * @see NumberUtils#intToFloatColor(int) */
    360 	public static float toFloatBits (float r, float g, float b, float a) {
    361 		int color = ((int)(255 * a) << 24) | ((int)(255 * b) << 16) | ((int)(255 * g) << 8) | ((int)(255 * r));
    362 		return NumberUtils.intToFloatColor(color);
    363 	}
    364 
    365 	/** Packs the color components into a 32-bit integer with the format ABGR. Note that no range checking is performed for higher
    366 	 * performance.
    367 	 * @param r the red component, 0 - 255
    368 	 * @param g the green component, 0 - 255
    369 	 * @param b the blue component, 0 - 255
    370 	 * @param a the alpha component, 0 - 255
    371 	 * @return the packed color as a 32-bit int */
    372 	public static int toIntBits (int r, int g, int b, int a) {
    373 		return (a << 24) | (b << 16) | (g << 8) | r;
    374 	}
    375 
    376 	public static int alpha (float alpha) {
    377 		return (int)(alpha * 255.0f);
    378 	}
    379 
    380 	public static int luminanceAlpha (float luminance, float alpha) {
    381 		return ((int)(luminance * 255.0f) << 8) | (int)(alpha * 255);
    382 	}
    383 
    384 	public static int rgb565 (float r, float g, float b) {
    385 		return ((int)(r * 31) << 11) | ((int)(g * 63) << 5) | (int)(b * 31);
    386 	}
    387 
    388 	public static int rgba4444 (float r, float g, float b, float a) {
    389 		return ((int)(r * 15) << 12) | ((int)(g * 15) << 8) | ((int)(b * 15) << 4) | (int)(a * 15);
    390 	}
    391 
    392 	public static int rgb888 (float r, float g, float b) {
    393 		return ((int)(r * 255) << 16) | ((int)(g * 255) << 8) | (int)(b * 255);
    394 	}
    395 
    396 	public static int rgba8888 (float r, float g, float b, float a) {
    397 		return ((int)(r * 255) << 24) | ((int)(g * 255) << 16) | ((int)(b * 255) << 8) | (int)(a * 255);
    398 	}
    399 
    400 	public static int argb8888 (float a, float r, float g, float b) {
    401 		return ((int)(a * 255) << 24) | ((int)(r * 255) << 16) | ((int)(g * 255) << 8) | (int)(b * 255);
    402 	}
    403 
    404 	public static int rgb565 (Color color) {
    405 		return ((int)(color.r * 31) << 11) | ((int)(color.g * 63) << 5) | (int)(color.b * 31);
    406 	}
    407 
    408 	public static int rgba4444 (Color color) {
    409 		return ((int)(color.r * 15) << 12) | ((int)(color.g * 15) << 8) | ((int)(color.b * 15) << 4) | (int)(color.a * 15);
    410 	}
    411 
    412 	public static int rgb888 (Color color) {
    413 		return ((int)(color.r * 255) << 16) | ((int)(color.g * 255) << 8) | (int)(color.b * 255);
    414 	}
    415 
    416 	public static int rgba8888 (Color color) {
    417 		return ((int)(color.r * 255) << 24) | ((int)(color.g * 255) << 16) | ((int)(color.b * 255) << 8) | (int)(color.a * 255);
    418 	}
    419 
    420 	public static int argb8888 (Color color) {
    421 		return ((int)(color.a * 255) << 24) | ((int)(color.r * 255) << 16) | ((int)(color.g * 255) << 8) | (int)(color.b * 255);
    422 	}
    423 
    424 	/** Sets the Color components using the specified integer value in the format RGB565. This is inverse to the rgb565(r, g, b)
    425 	 * method.
    426 	 *
    427 	 * @param color The Color to be modified.
    428 	 * @param value An integer color value in RGB565 format. */
    429 	public static void rgb565ToColor (Color color, int value) {
    430 		color.r = ((value & 0x0000F800) >>> 11) / 31f;
    431 		color.g = ((value & 0x000007E0) >>> 5) / 63f;
    432 		color.b = ((value & 0x0000001F) >>> 0) / 31f;
    433 	}
    434 
    435 	/** Sets the Color components using the specified integer value in the format RGBA4444. This is inverse to the rgba4444(r, g,
    436 	 * b, a) method.
    437 	 *
    438 	 * @param color The Color to be modified.
    439 	 * @param value An integer color value in RGBA4444 format. */
    440 	public static void rgba4444ToColor (Color color, int value) {
    441 		color.r = ((value & 0x0000f000) >>> 12) / 15f;
    442 		color.g = ((value & 0x00000f00) >>> 8) / 15f;
    443 		color.b = ((value & 0x000000f0) >>> 4) / 15f;
    444 		color.a = ((value & 0x0000000f)) / 15f;
    445 	}
    446 
    447 	/** Sets the Color components using the specified integer value in the format RGB888. This is inverse to the rgb888(r, g, b)
    448 	 * method.
    449 	 *
    450 	 * @param color The Color to be modified.
    451 	 * @param value An integer color value in RGB888 format. */
    452 	public static void rgb888ToColor (Color color, int value) {
    453 		color.r = ((value & 0x00ff0000) >>> 16) / 255f;
    454 		color.g = ((value & 0x0000ff00) >>> 8) / 255f;
    455 		color.b = ((value & 0x000000ff)) / 255f;
    456 	}
    457 
    458 	/** Sets the Color components using the specified integer value in the format RGBA8888. This is inverse to the rgba8888(r, g,
    459 	 * b, a) method.
    460 	 *
    461 	 * @param color The Color to be modified.
    462 	 * @param value An integer color value in RGBA8888 format. */
    463 	public static void rgba8888ToColor (Color color, int value) {
    464 		color.r = ((value & 0xff000000) >>> 24) / 255f;
    465 		color.g = ((value & 0x00ff0000) >>> 16) / 255f;
    466 		color.b = ((value & 0x0000ff00) >>> 8) / 255f;
    467 		color.a = ((value & 0x000000ff)) / 255f;
    468 	}
    469 
    470 	/** Sets the Color components using the specified integer value in the format ARGB8888. This is the inverse to the argb8888(a,
    471 	 * r, g, b) method
    472 	 *
    473 	 * @param color The Color to be modified.
    474 	 * @param value An integer color value in ARGB8888 format. */
    475 	public static void argb8888ToColor (Color color, int value) {
    476 		color.a = ((value & 0xff000000) >>> 24) / 255f;
    477 		color.r = ((value & 0x00ff0000) >>> 16) / 255f;
    478 		color.g = ((value & 0x0000ff00) >>> 8) / 255f;
    479 		color.b = ((value & 0x000000ff)) / 255f;
    480 	}
    481 
    482 	/** @return a copy of this color */
    483 	public Color cpy () {
    484 		return new Color(this);
    485 	}
    486 }
    487