/*
* Copyright (c) 2013 by Gerrit Grunwald
*
* 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 eu.hansolo.enzo.common;
import javafx.scene.image.Image;
import javafx.scene.image.PixelWriter;
import javafx.scene.image.WritableImage;
import javafx.scene.paint.Color;
import java.util.Random;
/**
* Created by
* User: hansolo
* Date: 29.04.13
* Time: 12:59
*/
public class Util {
public static Image createGrayNoise(final double WIDTH, final double HEIGHT, final Color COLOR, final int VARIATION) {
int red = (int) (255 * COLOR.getRed());
int green = (int) (255 * COLOR.getRed());
int blue = (int) (255 * COLOR.getRed());
int variation = clamp(0, 255, VARIATION) / 2;
Color darkColor = Color.rgb(clamp(0, 255, red - variation), clamp(0, 255, green - variation), clamp(0, 255, blue - variation));
Color brightColor = Color.rgb(clamp(0, 255, red + variation), clamp(0, 255, green + variation), clamp(0, 255, blue + variation));
return createGrayNoise(WIDTH, HEIGHT, darkColor, brightColor);
}
public static Image createGrayNoise(final double WIDTH, final double HEIGHT, final Color DARK_COLOR, final Color BRIGHT_COLOR) {
if (WIDTH <= 0 || HEIGHT <= 0) {
return null;
}
final WritableImage IMAGE = new WritableImage((int) WIDTH, (int) HEIGHT);
final PixelWriter PIXEL_WRITER = IMAGE.getPixelWriter();
final Random RND = new Random();
double redDark = DARK_COLOR.getRed();
double greenDark = DARK_COLOR.getGreen();
double blueDark = DARK_COLOR.getBlue();
double redBright = DARK_COLOR.getRed();
double greenBright = DARK_COLOR.getGreen();
double blueBright = DARK_COLOR.getBlue();
int startRed = (int) (Math.min(redDark, redBright) * 255);
int startGreen = (int) (Math.min(greenDark, greenBright) * 255);
int startBlue = (int) (Math.min(blueDark, blueBright) * 255);
int start = returnLargest(startRed, startGreen, startBlue);
int deltaRed = Math.abs((int) ((BRIGHT_COLOR.getRed() - DARK_COLOR.getRed()) * 255));
int deltaGreen = Math.abs((int) ((BRIGHT_COLOR.getGreen() - DARK_COLOR.getGreen()) * 255));
int deltaBlue = Math.abs((int) ((BRIGHT_COLOR.getBlue() - DARK_COLOR.getBlue()) * 255));
int delta = returnLargest(deltaRed, deltaGreen, deltaBlue);
int gray;
for (int y = 0; y < HEIGHT; y++) {
for (int x = 0; x < WIDTH; x++) {
gray = delta > 0 ? start + RND.nextInt(delta) : start;
PIXEL_WRITER.setColor(x, y, Color.rgb(clamp(0, 255, gray), clamp(0, 255, gray), clamp(0, 255, gray)));
}
}
return IMAGE;
}
public static String colorToCss(final Color COLOR) {
return COLOR.toString().replace("0x", "#");
}
public static int clamp(final int MIN, final int MAX, final int VALUE) {
if (VALUE < MIN) return MIN;
if (VALUE > MAX) return MAX;
return VALUE;
}
public static long clamp(final long MIN, final long MAX, final long VALUE) {
if (VALUE < MIN) return MIN;
if (VALUE > MAX) return MAX;
return VALUE;
}
public static float clamp(final float MIN, final float MAX, final float VALUE) {
if (VALUE < MIN) return MIN;
if (VALUE > MAX) return MAX;
return VALUE;
}
public static double clamp(final double MIN, final double MAX, final double VALUE) {
if (VALUE < MIN) return MIN;
if (VALUE > MAX) return MAX;
return VALUE;
}
private static int returnLargest(final int A, final int B, final int C) {
if (A == B && A == C) {
return A;
} else if (A > B && A > C) {
return A;
} else if (B > A && B > C) {
return B;
} else if (C > A && C > B) {
return C;
}
return 0;
}
}