/* * JAME 6.2.1 * http://jame.sourceforge.net * * Copyright 2001, 2016 Andrea Medeghini * * This file is based on code from idx3dIII * Copyright 1999, 2000 Peter Walser * http://www.idx3d.ch/idx3d/idx3d.html * * This file is part of JAME. * * JAME is an application for creating fractals and other graphics artifacts. * * JAME is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * JAME is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with JAME. If not, see <http://www.gnu.org/licenses/>. * */ package net.sf.jame.core.media.g3d; public final class Color { public static final int MASK7Bit = 0xFEFEFF; public static final int ALPHA = 0xFF000000; public static final int RGB = 0xFFFFFF; private Color() { } public static int getAlpha(final int c) { return ((c >> 24) & 255); } public static int getRed(final int c) { return ((c >> 16) & 255); } public static int getGreen(final int c) { return ((c >> 8) & 255); } public static int getBlue(final int c) { return ((c >> 0) & 255); } public static int getCropColor(final int r, final int g, final int b) { return Color.ALPHA | (Math.crop(r, 0, 255) << 16) | (Math.crop(g, 0, 255) << 8) | Math.crop(b, 0, 255); } public static int getCropColor(final int a, final int r, final int g, final int b) { return (Math.crop(a, 0, 255) << 24) | (Math.crop(r, 0, 255) << 16) | (Math.crop(g, 0, 255) << 8) | Math.crop(b, 0, 255); } public static int getColor(final int a, final int r, final int g, final int b) { return ((a & 255) << 24) | ((r & 255) << 16) | ((g & 255) << 8) | (b & 255); } public static int getGray(final int color) { final int r = ((color >> 16) & 255); final int g = ((color >> 8) & 255); final int b = (color & 255); final int Y = ((r * 3) + (g * 6) + b) / 10; return (color & 0xFF000000) | (Y << 16) | (Y << 8) | Y; } public static int getAverage(final int color) { return (color & 0xFF000000) | (((color >> 16) & 255) + ((color >> 8) & 255) + (color & 255)) / 3; } public static int add(final int color1, final int color2) { final int c = (color1 & Color.MASK7Bit) + (color2 & Color.MASK7Bit); int overflow = c & 0x1010100; overflow = overflow - (overflow >> 8); return (color1 & 0xFF000000) | (overflow | c); } public static int sub(final int color1, final int color2) { final int c = (color1 & Color.MASK7Bit) + (~color2 & Color.MASK7Bit); int overflow = ~c & 0x1010100; overflow = overflow - (overflow >> 8); return (color1 & 0xFF000000) | (~overflow & c); } public static int inv(final int color) { return (color & 0xFF000000) | (~color); } public static int scale(final int color, final int factor) { if (factor == 0) { return (color & 0xFF000000); } if (factor == 255) { return color; } if (factor == 127) { return (color & 0xFF000000) | ((color & 0xFEFEFE) >> 1); } final int r = (((color >> 16) & 255) * factor) >> 8; final int g = (((color >> 8) & 255) * factor) >> 8; final int b = ((color & 255) * factor) >> 8; return (color & 0xFF000000) | (r << 16) | (g << 8) | b; } public static int mul(final int color1, final int color2) { if ((color1 & Color.RGB) == 0) { return (color1 & 0xFF000000); } if ((color2 & Color.RGB) == 0) { return (color1 & 0xFF000000); } final int r = (((color1 >> 16) & 255) * ((color2 >> 16) & 255)) >> 8; final int g = (((color1 >> 8) & 255) * ((color2 >> 8) & 255)) >> 8; final int b = ((color1 & 255) * (color2 & 255)) >> 8; return (color1 & 0xFF000000) | (r << 16) | (g << 8) | b; } public static int mix(final int color1, final int color2) { return (color1 & 0xFF000000) | (((color1 & 0xFEFEFEFE) >> 1) + ((color2 & 0xFEFEFEFE) >> 1)); } public static int mix(final int color1, final int color2, final int alpha) { if (alpha == 0) { return color1; } if (alpha == 255) { return color2; } if (alpha == 127) { return Color.mix(color1, color2); } final int r = ((alpha * (((color2 >> 16) & 255) - ((color1 >> 16) & 255))) >> 8) + ((color1 >> 16) & 255); final int g = ((alpha * (((color2 >> 8) & 255) - ((color1 >> 8) & 255))) >> 8) + ((color1 >> 8) & 255); final int b = ((alpha * ((color2 & 255) - (color1 & 255))) >> 8) + (color1 & 255); return (color1 & 0xFF000000) | (r << 16) | (g << 8) | b; } public static final int random() { return Color.ALPHA | (int) (java.lang.Math.random() * 16777216); } }