Here you can find the source of hsva(double hue, double saturation, double value, double alpha)
static double hsva(double hue, double saturation, double value, double alpha)
//package com.java2s; /**/*from w w w .j av a2 s . c o m*/ * MIT License (MIT) * * Copyright (c) 2014 Volker Berlin * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * UT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * * @author Volker Berlin * @license: The MIT license <http://opensource.org/licenses/MIT> */ public class Main { private static final int[][] HSVA_PERM = { { 0, 3, 1 }, // { 2, 0, 1 }, // { 1, 0, 3 }, // { 1, 2, 0 }, // { 3, 1, 0 }, // { 0, 1, 2 } }; static double hsva(double hue, double saturation, double value, double alpha) { hue = ((hue % 360) / 360) * 360; int i = (int) Math.floor((hue / 60) % 6); double f = (hue / 60) - i; double[] vs = { value, value * (1 - saturation), value * (1 - f * saturation), value * (1 - (1 - f) * saturation) }; return rgba(vs[HSVA_PERM[i][0]] * 255, vs[HSVA_PERM[i][1]] * 255, vs[HSVA_PERM[i][2]] * 255, alpha); } static double rgba(double r, double g, double b, double a) { return Double.longBitsToDouble(Math.round(a * 0xFFFF) << 48 | (colorLargeDigit(r) << 32) | (colorLargeDigit(g) << 16) | colorLargeDigit(b)); } static double rgba(int r, int g, int b, double a) { return Double.longBitsToDouble(Math.round(a * 0xFFFF) << 48 | (colorLargeDigit(r) << 32) | (colorLargeDigit(g) << 16) | colorLargeDigit(b)); } private static long colorLargeDigit(double value) { value *= 0x100; if (value >= 0xFFFF) { return 0xFFFF; } else if (value <= 0) { return 0; } else { return Math.round(value); } } }