package org.andengine.util.color; /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 11:13:45 - 04.08.2010 */ public class ColorUtils { // =========================================================== // Constants // =========================================================== private static final float[] HSV_TO_COLOR = new float[3]; private static final int HSV_TO_COLOR_HUE_INDEX = 0; private static final int HSV_TO_COLOR_SATURATION_INDEX = 1; private static final int HSV_TO_COLOR_VALUE_INDEX = 2; private static final int INT_BITS_TO_FLOAT_MASK = 0xFFFFFFFF; // private static final int INT_BITS_TO_FLOAT_MASK = 0xFEFFFFFF; // To avoid producing NaN in the int->float conversion. // =========================================================== // Fields // =========================================================== // =========================================================== // Constructors // =========================================================== // =========================================================== // Getter & Setter // =========================================================== // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== // =========================================================== // Methods // =========================================================== /** * @param pHue [0 .. 360) * @param pSaturation [0...1] * @param pValue [0...1] */ public static final int convertHSVToARGBPackedInt(final float pHue, final float pSaturation, final float pValue) { ColorUtils.HSV_TO_COLOR[ColorUtils.HSV_TO_COLOR_HUE_INDEX] = pHue; ColorUtils.HSV_TO_COLOR[ColorUtils.HSV_TO_COLOR_SATURATION_INDEX] = pSaturation; ColorUtils.HSV_TO_COLOR[ColorUtils.HSV_TO_COLOR_VALUE_INDEX] = pValue; return android.graphics.Color.HSVToColor(ColorUtils.HSV_TO_COLOR); } /** * @param pHue [0 .. 360) * @param pSaturation [0...1] * @param pValue [0...1] */ public static final Color convertHSVToColor(final float pHue, final float pSaturation, final float pValue) { return ColorUtils.convertARGBPackedIntToColor(ColorUtils.convertHSVToARGBPackedInt(pHue, pSaturation, pValue)); } public static Color convertARGBPackedIntToColor(final int pARGBPackedInt) { final float alpha = ColorUtils.extractAlphaFromARGBPackedInt(pARGBPackedInt); final float red = ColorUtils.extractRedFromARGBPackedInt(pARGBPackedInt); final float green = ColorUtils.extractGreenFromARGBPackedInt(pARGBPackedInt); final float blue = ColorUtils.extractBlueFromARGBPackedInt(pARGBPackedInt); return new Color(red, green, blue, alpha); } public static Color convertABGRPackedIntToColor(final int pABGRPackedInt) { final float alpha = ColorUtils.extractAlphaFromABGRPackedInt(pABGRPackedInt); final float blue = ColorUtils.extractBlueFromABGRPackedInt(pABGRPackedInt); final float green = ColorUtils.extractGreenFromABGRPackedInt(pABGRPackedInt); final float red = ColorUtils.extractRedFromABGRPackedInt(pABGRPackedInt); return new Color(red, green, blue, alpha); } public static final int convertRGBAToARGBPackedInt(final float pRed, final float pGreen, final float pBlue, final float pAlpha) { return ((int)(255 * pAlpha) << Color.ARGB_PACKED_ALPHA_SHIFT) | ((int)(255 * pRed) << Color.ARGB_PACKED_RED_SHIFT) | ((int)(255 * pGreen) << Color.ARGB_PACKED_GREEN_SHIFT) | ((int)(255 * pBlue) << Color.ARGB_PACKED_BLUE_SHIFT); } public static final float convertRGBAToARGBPackedFloat(final float pRed, final float pGreen, final float pBlue, final float pAlpha) { return ColorUtils.convertPackedIntToPackedFloat(ColorUtils.convertRGBAToARGBPackedInt(pRed, pGreen, pBlue, pAlpha)); } public static final int convertRGBAToABGRPackedInt(final float pRed, final float pGreen, final float pBlue, final float pAlpha) { return ((int)(255 * pAlpha) << Color.ABGR_PACKED_ALPHA_SHIFT) | ((int)(255 * pBlue) << Color.ABGR_PACKED_BLUE_SHIFT) | ((int)(255 * pGreen) << Color.ABGR_PACKED_GREEN_SHIFT) | ((int)(255 * pRed) << Color.ABGR_PACKED_RED_SHIFT); } public static final float convertRGBAToABGRPackedFloat(final float pRed, final float pGreen, final float pBlue, final float pAlpha) { return ColorUtils.convertPackedIntToPackedFloat(ColorUtils.convertRGBAToABGRPackedInt(pRed, pGreen, pBlue, pAlpha)); } public static final float convertPackedIntToPackedFloat(final int pPackedInt) { return Float.intBitsToFloat(pPackedInt & ColorUtils.INT_BITS_TO_FLOAT_MASK); } public static float extractRedFromABGRPackedInt(final int pABGRPackedInt) { return ((pABGRPackedInt >> Color.ABGR_PACKED_RED_SHIFT) & 0xFF) / 255.0f; } public static float extractGreenFromABGRPackedInt(final int pABGRPackedInt) { return ((pABGRPackedInt >> Color.ABGR_PACKED_GREEN_SHIFT) & 0xFF) / 255.0f; } public static float extractBlueFromABGRPackedInt(final int pABGRPackedInt) { return ((pABGRPackedInt >> Color.ABGR_PACKED_BLUE_SHIFT) & 0xFF) / 255.0f; } public static float extractAlphaFromABGRPackedInt(final int pABGRPackedInt) { return ((pABGRPackedInt >> Color.ABGR_PACKED_ALPHA_SHIFT) & 0xFF) / 255.0f; } public static float extractBlueFromARGBPackedInt(final int pARGBPackedInt) { return ((pARGBPackedInt >> Color.ARGB_PACKED_BLUE_SHIFT) & 0xFF) / 255.0f; } public static float extractGreenFromARGBPackedInt(final int pARGBPackedInt) { return ((pARGBPackedInt >> Color.ARGB_PACKED_GREEN_SHIFT) & 0xFF) / 255.0f; } public static float extractRedFromARGBPackedInt(final int pARGBPackedInt) { return ((pARGBPackedInt >> Color.ARGB_PACKED_RED_SHIFT) & 0xFF) / 255.0f; } public static float extractAlphaFromARGBPackedInt(final int pARGBPackedInt) { return ((pARGBPackedInt >> Color.ARGB_PACKED_ALPHA_SHIFT) & 0xFF) / 255.0f; } // =========================================================== // Inner and Anonymous Classes // =========================================================== }