Java tutorial
/******************************************************************************* * Copyright 2011 See AUTHORS file. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package com.badlogic.gdx.graphics; import com.badlogic.gdx.utils.NumberUtils; /** A color class, holding the r, g, b and alpha component as floats in the range [0,1]. All methods perform clamping on the * internal values after execution. * * @author mzechner */ public class Color { public static final Color CLEAR = new Color(0, 0, 0, 0); public static final Color WHITE = new Color(1, 1, 1, 1); public static final Color BLACK = new Color(0, 0, 0, 1); public static final Color RED = new Color(1, 0, 0, 1); public static final Color GREEN = new Color(0, 1, 0, 1); public static final Color BLUE = new Color(0, 0, 1, 1); public static final Color LIGHT_GRAY = new Color(0.75f, 0.75f, 0.75f, 1); public static final Color GRAY = new Color(0.5f, 0.5f, 0.5f, 1); public static final Color DARK_GRAY = new Color(0.25f, 0.25f, 0.25f, 1); public static final Color PINK = new Color(1, 0.68f, 0.68f, 1); public static final Color ORANGE = new Color(1, 0.78f, 0, 1); public static final Color YELLOW = new Color(1, 1, 0, 1); public static final Color MAGENTA = new Color(1, 0, 1, 1); public static final Color CYAN = new Color(0, 1, 1, 1); public static final Color OLIVE = new Color(0.5f, 0.5f, 0, 1); public static final Color PURPLE = new Color(0.5f, 0, 0.5f, 1); public static final Color MAROON = new Color(0.5f, 0, 0, 1); public static final Color TEAL = new Color(0, 0.5f, 0.5f, 1); public static final Color NAVY = new Color(0, 0, 0.5f, 1); @Deprecated public static Color tmp = new Color(); /** the red, green, blue and alpha components **/ public float r, g, b, a; /** Constructs a new Color with all components set to 0. */ public Color() { } /** @see #rgba8888ToColor(Color, int) */ public Color(int rgba8888) { rgba8888ToColor(this, rgba8888); } /** Constructor, sets the components of the color * * @param r the red component * @param g the green component * @param b the blue component * @param a the alpha component */ public Color(float r, float g, float b, float a) { this.r = r; this.g = g; this.b = b; this.a = a; clamp(); } /** Constructs a new color using the given color * * @param color the color */ public Color(Color color) { set(color); } /** Sets this color to the given color. * * @param color the Color */ public Color set(Color color) { this.r = color.r; this.g = color.g; this.b = color.b; this.a = color.a; return this; } /** Multiplies the this color and the given color * * @param color the color * @return this color. */ public Color mul(Color color) { this.r *= color.r; this.g *= color.g; this.b *= color.b; this.a *= color.a; return clamp(); } /** Multiplies all components of this Color with the given value. * * @param value the value * @return this color */ public Color mul(float value) { this.r *= value; this.g *= value; this.b *= value; this.a *= value; return clamp(); } /** Adds the given color to this color. * * @param color the color * @return this color */ public Color add(Color color) { this.r += color.r; this.g += color.g; this.b += color.b; this.a += color.a; return clamp(); } /** Subtracts the given color from this color * * @param color the color * @return this color */ public Color sub(Color color) { this.r -= color.r; this.g -= color.g; this.b -= color.b; this.a -= color.a; return clamp(); } /** Clamps this Color's components to a valid range [0 - 1] * @return this Color for chaining */ public Color clamp() { if (r < 0) r = 0; else if (r > 1) r = 1; if (g < 0) g = 0; else if (g > 1) g = 1; if (b < 0) b = 0; else if (b > 1) b = 1; if (a < 0) a = 0; else if (a > 1) a = 1; return this; } /** Sets this Color's component values. * * @param r Red component * @param g Green component * @param b Blue component * @param a Alpha component * * @return this Color for chaining */ public Color set(float r, float g, float b, float a) { this.r = r; this.g = g; this.b = b; this.a = a; return clamp(); } /** Sets this color's component values through an integer representation. * * @return this Color for chaining * @see #rgba8888ToColor(Color, int) */ public Color set(int rgba) { rgba8888ToColor(this, rgba); return this; } /** Adds the given color component values to this Color's values. * * @param r Red component * @param g Green component * @param b Blue component * @param a Alpha component * * @return this Color for chaining */ public Color add(float r, float g, float b, float a) { this.r += r; this.g += g; this.b += b; this.a += a; return clamp(); } /** Subtracts the given values from this Color's component values. * * @param r Red component * @param g Green component * @param b Blue component * @param a Alpha component * * @return this Color for chaining */ public Color sub(float r, float g, float b, float a) { this.r -= r; this.g -= g; this.b -= b; this.a -= a; return clamp(); } /** Multiplies this Color's color components by the given ones. * * @param r Red component * @param g Green component * @param b Blue component * @param a Alpha component * * @return this Color for chaining */ public Color mul(float r, float g, float b, float a) { this.r *= r; this.g *= g; this.b *= b; this.a *= a; return clamp(); } /** Linearly interpolates between this color and the target color by t which is in the range [0,1]. The result is stored in this * color. * @param target The target color * @param t The interpolation coefficient * @return This color for chaining. */ public Color lerp(final Color target, final float t) { this.r += t * (target.r - this.r); this.g += t * (target.g - this.g); this.b += t * (target.b - this.b); this.a += t * (target.a - this.a); return clamp(); } /** Linearly interpolates between this color and the target color by t which is in the range [0,1]. The result is stored in this * color. * @param r The red component of the target color * @param g The green component of the target color * @param b The blue component of the target color * @param a The alpha component of the target color * @param t The interpolation coefficient * @return This color for chaining. */ public Color lerp(final float r, final float g, final float b, final float a, final float t) { this.r += t * (r - this.r); this.g += t * (g - this.g); this.b += t * (b - this.b); this.a += t * (a - this.a); return clamp(); } /** Multiplies the RGB values by the alpha. */ public Color premultiplyAlpha() { r *= a; g *= a; b *= a; return this; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Color color = (Color) o; return toIntBits() == color.toIntBits(); } @Override public int hashCode() { int result = (r != +0.0f ? NumberUtils.floatToIntBits(r) : 0); result = 31 * result + (g != +0.0f ? NumberUtils.floatToIntBits(g) : 0); result = 31 * result + (b != +0.0f ? NumberUtils.floatToIntBits(b) : 0); result = 31 * result + (a != +0.0f ? NumberUtils.floatToIntBits(a) : 0); return result; } /** Packs the color components into a 32-bit integer with the format ABGR and then converts it to a float. * @return the packed color as a 32-bit float * @see NumberUtils#intToFloatColor(int) */ public float toFloatBits() { int color = ((int) (255 * a) << 24) | ((int) (255 * b) << 16) | ((int) (255 * g) << 8) | ((int) (255 * r)); return NumberUtils.intToFloatColor(color); } /** Packs the color components into a 32-bit integer with the format ABGR. * @return the packed color as a 32-bit int. */ public int toIntBits() { int color = ((int) (255 * a) << 24) | ((int) (255 * b) << 16) | ((int) (255 * g) << 8) | ((int) (255 * r)); return color; } /** Returns the color encoded as hex string with the format RRGGBBAA. */ public String toString() { String value = Integer.toHexString( ((int) (255 * r) << 24) | ((int) (255 * g) << 16) | ((int) (255 * b) << 8) | ((int) (255 * a))); while (value.length() < 8) value = "0" + value; return value; } /** Returns a new color from a hex string with the format RRGGBBAA. * @see #toString() */ public static Color valueOf(String hex) { int r = Integer.valueOf(hex.substring(0, 2), 16); int g = Integer.valueOf(hex.substring(2, 4), 16); int b = Integer.valueOf(hex.substring(4, 6), 16); int a = hex.length() != 8 ? 255 : Integer.valueOf(hex.substring(6, 8), 16); return new Color(r / 255f, g / 255f, b / 255f, a / 255f); } /** Packs the color components into a 32-bit integer with the format ABGR and then converts it to a float. Note that no range * checking is performed for higher performance. * @param r the red component, 0 - 255 * @param g the green component, 0 - 255 * @param b the blue component, 0 - 255 * @param a the alpha component, 0 - 255 * @return the packed color as a float * @see NumberUtils#intToFloatColor(int) */ public static float toFloatBits(int r, int g, int b, int a) { int color = (a << 24) | (b << 16) | (g << 8) | r; float floatColor = NumberUtils.intToFloatColor(color); return floatColor; } /** Packs the color components into a 32-bit integer with the format ABGR and then converts it to a float. * @return the packed color as a 32-bit float * @see NumberUtils#intToFloatColor(int) */ public static float toFloatBits(float r, float g, float b, float a) { int color = ((int) (255 * a) << 24) | ((int) (255 * b) << 16) | ((int) (255 * g) << 8) | ((int) (255 * r)); return NumberUtils.intToFloatColor(color); } /** Packs the color components into a 32-bit integer with the format ABGR. Note that no range checking is performed for higher * performance. * @param r the red component, 0 - 255 * @param g the green component, 0 - 255 * @param b the blue component, 0 - 255 * @param a the alpha component, 0 - 255 * @return the packed color as a 32-bit int */ public static int toIntBits(int r, int g, int b, int a) { return (a << 24) | (b << 16) | (g << 8) | r; } public static int alpha(float alpha) { return (int) (alpha * 255.0f); } public static int luminanceAlpha(float luminance, float alpha) { return ((int) (luminance * 255.0f) << 8) | (int) (alpha * 255); } public static int rgb565(float r, float g, float b) { return ((int) (r * 31) << 11) | ((int) (g * 63) << 5) | (int) (b * 31); } public static int rgba4444(float r, float g, float b, float a) { return ((int) (r * 15) << 12) | ((int) (g * 15) << 8) | ((int) (b * 15) << 4) | (int) (a * 15); } public static int rgb888(float r, float g, float b) { return ((int) (r * 255) << 16) | ((int) (g * 255) << 8) | (int) (b * 255); } public static int rgba8888(float r, float g, float b, float a) { return ((int) (r * 255) << 24) | ((int) (g * 255) << 16) | ((int) (b * 255) << 8) | (int) (a * 255); } public static int argb8888(float a, float r, float g, float b) { return ((int) (a * 255) << 24) | ((int) (r * 255) << 16) | ((int) (g * 255) << 8) | (int) (b * 255); } public static int rgb565(Color color) { return ((int) (color.r * 31) << 11) | ((int) (color.g * 63) << 5) | (int) (color.b * 31); } public static int rgba4444(Color color) { return ((int) (color.r * 15) << 12) | ((int) (color.g * 15) << 8) | ((int) (color.b * 15) << 4) | (int) (color.a * 15); } public static int rgb888(Color color) { return ((int) (color.r * 255) << 16) | ((int) (color.g * 255) << 8) | (int) (color.b * 255); } public static int rgba8888(Color color) { return ((int) (color.r * 255) << 24) | ((int) (color.g * 255) << 16) | ((int) (color.b * 255) << 8) | (int) (color.a * 255); } public static int argb8888(Color color) { return ((int) (color.a * 255) << 24) | ((int) (color.r * 255) << 16) | ((int) (color.g * 255) << 8) | (int) (color.b * 255); } /** Sets the Color components using the specified integer value in the format RGB565. This is inverse to the rgb565(r, g, b) * method. * * @param color The Color to be modified. * @param value An integer color value in RGB565 format. */ public static void rgb565ToColor(Color color, int value) { color.r = ((value & 0x0000F800) >>> 11) / 31f; color.g = ((value & 0x000007E0) >>> 5) / 63f; color.b = ((value & 0x0000001F) >>> 0) / 31f; } /** Sets the Color components using the specified integer value in the format RGBA4444. This is inverse to the rgba4444(r, g, b, * a) method. * * @param color The Color to be modified. * @param value An integer color value in RGBA4444 format. */ public static void rgba4444ToColor(Color color, int value) { color.r = ((value & 0x0000f000) >>> 12) / 15f; color.g = ((value & 0x00000f00) >>> 8) / 15f; color.b = ((value & 0x000000f0) >>> 4) / 15f; color.a = ((value & 0x0000000f)) / 15f; } /** Sets the Color components using the specified integer value in the format RGB888. This is inverse to the rgb888(r, g, b) * method. * * @param color The Color to be modified. * @param value An integer color value in RGB888 format. */ public static void rgb888ToColor(Color color, int value) { color.r = ((value & 0x00ff0000) >>> 16) / 255f; color.g = ((value & 0x0000ff00) >>> 8) / 255f; color.b = ((value & 0x000000ff)) / 255f; } /** Sets the Color components using the specified integer value in the format RGBA8888. This is inverse to the rgba8888(r, g, b, * a) method. * * @param color The Color to be modified. * @param value An integer color value in RGBA8888 format. */ public static void rgba8888ToColor(Color color, int value) { color.r = ((value & 0xff000000) >>> 24) / 255f; color.g = ((value & 0x00ff0000) >>> 16) / 255f; color.b = ((value & 0x0000ff00) >>> 8) / 255f; color.a = ((value & 0x000000ff)) / 255f; } /** Sets the Color components using the specified integer value in the format ARGB8888. This is the inverse to the argb8888(a, r, * g, b) method * * @param color The Color to be modified. * @param value An integer color value in ARGB8888 format. */ public static void argb8888ToColor(Color color, int value) { color.a = ((value & 0xff000000) >>> 24) / 255f; color.r = ((value & 0x00ff0000) >>> 16) / 255f; color.g = ((value & 0x0000ff00) >>> 8) / 255f; color.b = ((value & 0x000000ff)) / 255f; } /** Returns a temporary copy of this color. This is not thread safe, do not save a reference to this instance. * * @return a temporary copy of this color */ public Color tmp() { return tmp.set(this); } /** @return a copy of this color */ public Color cpy() { return new Color(this); } }