package org.andengine.util.color; /** * (c) Zynga 2011 * * @author Nicolas Gramlich <ngramlich@zynga.com> * @since 02:23:08 - 12.08.2011 */ public class Color { // =========================================================== // Constants // =========================================================== public static final int ABGR_PACKED_RED_SHIFT = 0; public static final int ABGR_PACKED_GREEN_SHIFT = 8; public static final int ABGR_PACKED_BLUE_SHIFT = 16; public static final int ABGR_PACKED_ALPHA_SHIFT = 24; public static final int ABGR_PACKED_RED_CLEAR = 0XFFFFFF00; public static final int ABGR_PACKED_GREEN_CLEAR = 0XFFFF00FF; public static final int ABGR_PACKED_BLUE_CLEAR = 0XFF00FFFF; public static final int ABGR_PACKED_ALPHA_CLEAR = 0X00FFFFFF; public static final int ARGB_PACKED_BLUE_SHIFT = 0; public static final int ARGB_PACKED_GREEN_SHIFT = 8; public static final int ARGB_PACKED_RED_SHIFT = 16; public static final int ARGB_PACKED_ALPHA_SHIFT = 24; public static final int ARGB_PACKED_BLUE_CLEAR = 0XFFFFFF00; public static final int ARGB_PACKED_GREEN_CLEAR = 0XFFFF00FF; public static final int ARGB_PACKED_RED_CLEAR = 0XFF00FFFF; public static final int ARGB_PACKED_ALPHA_CLEAR = 0X00FFFFFF; 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 YELLOW = new Color(1, 1, 0, 1); public static final Color GREEN = new Color(0, 1, 0, 1); public static final Color CYAN = new Color(0, 1, 1, 1); public static final Color BLUE = new Color(0, 0, 1, 1); public static final Color PINK = new Color(1, 0, 1, 1); public static final Color TRANSPARENT = new Color(0, 0, 0, 0); public static final int WHITE_ABGR_PACKED_INT = Color.WHITE.getABGRPackedInt(); public static final int BLACK_ABGR_PACKED_INT = Color.BLACK.getABGRPackedInt(); public static final int RED_ABGR_PACKED_INT = Color.RED.getABGRPackedInt(); public static final int YELLOW_ABGR_PACKED_INT = Color.YELLOW.getABGRPackedInt(); public static final int GREEN_ABGR_PACKED_INT = Color.GREEN.getABGRPackedInt(); public static final int CYAN_ABGR_PACKED_INT = Color.CYAN.getABGRPackedInt(); public static final int BLUE_ABGR_PACKED_INT = Color.BLUE.getABGRPackedInt(); public static final int PINK_ABGR_PACKED_INT = Color.PINK.getABGRPackedInt(); public static final int TRANSPARENT_ABGR_PACKED_INT = Color.TRANSPARENT.getABGRPackedInt(); public static final float WHITE_ABGR_PACKED_FLOAT = Color.WHITE.getABGRPackedFloat(); public static final float BLACK_ABGR_PACKED_FLOAT = Color.BLACK.getABGRPackedFloat(); public static final float RED_ABGR_PACKED_FLOAT = Color.RED.getABGRPackedFloat(); public static final float YELLOW_ABGR_PACKED_FLOAT = Color.YELLOW.getABGRPackedFloat(); public static final float GREEN_ABGR_PACKED_FLOAT = Color.GREEN.getABGRPackedFloat(); public static final float CYAN_ABGR_PACKED_FLOAT = Color.CYAN.getABGRPackedFloat(); public static final float BLUE_ABGR_PACKED_FLOAT = Color.BLUE.getABGRPackedFloat(); public static final float PINK_ABGR_PACKED_FLOAT = Color.PINK.getABGRPackedFloat(); public static final float TRANSPARENT_ABGR_PACKED_FLOAT = Color.TRANSPARENT.getABGRPackedFloat(); public static final int WHITE_ARGB_PACKED_INT = Color.WHITE.getARGBPackedInt(); public static final int BLACK_ARGB_PACKED_INT = Color.BLACK.getARGBPackedInt(); public static final int RED_ARGB_PACKED_INT = Color.RED.getARGBPackedInt(); public static final int YELLOW_ARGB_PACKED_INT = Color.YELLOW.getARGBPackedInt(); public static final int GREEN_ARGB_PACKED_INT = Color.GREEN.getARGBPackedInt(); public static final int CYAN_ARGB_PACKED_INT = Color.CYAN.getARGBPackedInt(); public static final int BLUE_ARGB_PACKED_INT = Color.BLUE.getARGBPackedInt(); public static final int PINK_ARGB_PACKED_INT = Color.PINK.getARGBPackedInt(); public static final int TRANSPARENT_ARGB_PACKED_INT = Color.TRANSPARENT.getARGBPackedInt(); // =========================================================== // Fields // =========================================================== private float mRed; private float mGreen; private float mBlue; private float mAlpha; private int mABGRPackedInt; private float mABGRPackedFloat; // =========================================================== // Constructors // =========================================================== public Color(final Color pColor) { this.set(pColor); } public Color(final float pRed, final float pGreen, final float pBlue) { this(pRed, pGreen, pBlue, 1); } public Color(final float pRed, final float pGreen, final float pBlue, final float pAlpha) { this.set(pRed, pGreen, pBlue, pAlpha); } // =========================================================== // Getter & Setter // =========================================================== public final float getRed() { return this.mRed; } public final float getGreen() { return this.mGreen; } public final float getBlue() { return this.mBlue; } public final float getAlpha() { return this.mAlpha; } public final void setRed(final float pRed) { this.mRed = pRed; this.packABGRRed(); } public final boolean setRedChecking(final float pRed) { if(this.mRed != pRed) { this.mRed = pRed; this.packABGRRed(); return true; } return false; } public final void setGreen(final float pGreen) { this.mGreen = pGreen; this.packABGRGreen(); } public final boolean setGreenChecking(final float pGreen) { if(this.mGreen != pGreen) { this.mGreen = pGreen; this.packABGRGreen(); return true; } return false; } public final void setBlue(final float pBlue) { this.mBlue = pBlue; this.packABGRBlue(); } public final boolean setBlueChecking(final float pBlue) { if(this.mBlue != pBlue) { this.mBlue = pBlue; this.packABGRBlue(); return true; } return false; } public final void setAlpha(final float pAlpha) { this.mAlpha = pAlpha; this.packABGRAlpha(); } public final boolean setAlphaChecking(final float pAlpha) { if(this.mAlpha != pAlpha) { this.mAlpha = pAlpha; this.packABGRAlpha(); return true; } return false; } public final void set(final float pRed, final float pGreen, final float pBlue) { this.mRed = pRed; this.mGreen = pGreen; this.mBlue = pBlue; this.packABGR(); } public final boolean setChecking(final float pRed, final float pGreen, final float pBlue) { if((this.mRed != pRed) || (this.mGreen != pGreen) || (this.mBlue != pBlue)) { this.mRed = pRed; this.mGreen = pGreen; this.mBlue = pBlue; this.packABGR(); return true; } return false; } public final void set(final float pRed, final float pGreen, final float pBlue, final float pAlpha) { this.mRed = pRed; this.mGreen = pGreen; this.mBlue = pBlue; this.mAlpha = pAlpha; this.packABGR(); } public final boolean setChecking(final float pRed, final float pGreen, final float pBlue, final float pAlpha) { if((this.mAlpha != pAlpha) || (this.mRed != pRed) || (this.mGreen != pGreen) || (this.mBlue != pBlue)) { this.mRed = pRed; this.mGreen = pGreen; this.mBlue = pBlue; this.mAlpha = pAlpha; this.packABGR(); return true; } return false; } public final void set(final Color pColor) { this.mRed = pColor.mRed; this.mGreen = pColor.mGreen; this.mBlue = pColor.mBlue; this.mAlpha = pColor.mAlpha; this.mABGRPackedInt = pColor.mABGRPackedInt; this.mABGRPackedFloat = pColor.mABGRPackedFloat; } public final boolean setChecking(final Color pColor) { if(this.mABGRPackedInt != pColor.mABGRPackedInt) { this.mRed = pColor.mRed; this.mGreen = pColor.mGreen; this.mBlue = pColor.mBlue; this.mAlpha = pColor.mAlpha; this.mABGRPackedInt = pColor.mABGRPackedInt; this.mABGRPackedFloat = pColor.mABGRPackedFloat; return true; } return false; } public final int getABGRPackedInt() { return this.mABGRPackedInt; } public final float getABGRPackedFloat() { return this.mABGRPackedFloat; } /** * @return the same format as {@link android.graphics.Color}. */ public final int getARGBPackedInt() { return ColorUtils.convertRGBAToARGBPackedInt(this.mRed, this.mGreen, this.mBlue, this.mAlpha); } public final void reset() { this.set(Color.WHITE); } // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== @Override public int hashCode() { return this.mABGRPackedInt; } @Override public boolean equals(final Object pObject) { if(this == pObject) { return true; } else if(pObject == null) { return false; } else if(this.getClass() != pObject.getClass()) { return false; } return this.equals((Color) pObject); } @Override public String toString() { return new StringBuilder() .append("[Red: ") .append(this.mRed) .append(", Green: ") .append(this.mGreen) .append(", Blue: ") .append(this.mBlue) .append(", Alpha: ") .append(this.mAlpha) .append("]") .toString(); } // =========================================================== // Methods // =========================================================== public boolean equals(final Color pColor) { return this.mABGRPackedInt == pColor.mABGRPackedInt; } private final void packABGRRed() { this.mABGRPackedInt = (this.mABGRPackedInt & Color.ABGR_PACKED_RED_CLEAR) | ((int)(255 * this.mRed) << Color.ABGR_PACKED_RED_CLEAR); this.mABGRPackedFloat = ColorUtils.convertPackedIntToPackedFloat(this.mABGRPackedInt); } private final void packABGRGreen() { this.mABGRPackedInt = (this.mABGRPackedInt & Color.ABGR_PACKED_GREEN_CLEAR) | ((int)(255 * this.mGreen) << Color.ABGR_PACKED_GREEN_CLEAR); this.mABGRPackedFloat = ColorUtils.convertPackedIntToPackedFloat(this.mABGRPackedInt); } private final void packABGRBlue() { this.mABGRPackedInt = (this.mABGRPackedInt & Color.ABGR_PACKED_BLUE_CLEAR) | ((int)(255 * this.mBlue) << Color.ABGR_PACKED_BLUE_CLEAR); this.mABGRPackedFloat = ColorUtils.convertPackedIntToPackedFloat(this.mABGRPackedInt); } private final void packABGRAlpha() { this.mABGRPackedInt = (this.mABGRPackedInt & Color.ABGR_PACKED_ALPHA_CLEAR) | ((int)(255 * this.mAlpha) << Color.ABGR_PACKED_ALPHA_SHIFT); this.mABGRPackedFloat = ColorUtils.convertPackedIntToPackedFloat(this.mABGRPackedInt); } private final void packABGR() { this.mABGRPackedInt = ColorUtils.convertRGBAToABGRPackedInt(this.mRed, this.mGreen, this.mBlue, this.mAlpha); this.mABGRPackedFloat = ColorUtils.convertPackedIntToPackedFloat(this.mABGRPackedInt); } public final void mix(final Color pColorA, final float pPercentageA, final Color pColorB, final float pPercentageB) { final float red = (pColorA.mRed * pPercentageA) + (pColorB.mRed * pPercentageB); final float green = (pColorA.mGreen * pPercentageA) + (pColorB.mGreen * pPercentageB); final float blue = (pColorA.mBlue * pPercentageA) + (pColorB.mBlue * pPercentageB); final float alpha = (pColorA.mAlpha * pPercentageA) + (pColorB.mAlpha * pPercentageB); this.set(red, green, blue, alpha); } // =========================================================== // Inner and Anonymous Classes // =========================================================== }