/*******************************************************************************
* Copyright 2017 Ivan Shubin http://galenframework.com
*
* 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 com.galenframework.rainbow4j;
import com.galenframework.rainbow4j.colorscheme.ColorDistribution;
import java.awt.Color;
import java.util.LinkedList;
import java.util.List;
public class Spectrum {
private final int[][][] data;
private int pixelsAmount;
private int precision;
public Spectrum(int[][][] data, int width, int height) {
this.precision = data.length;
this.data = data;
this.pixelsAmount = width * height;
}
/**
*
* @param red 0 to 255 value of red
* @param green 0 to 255 value of green
* @param blue 0 to 255 value of blue
* @param range 0 to 255 value of range within which it should take histogram value
* @return
*/
public double getPercentage(int red, int green, int blue, int range) {
long counter = 0;
int cr = Math.min(red * precision / 256, precision - 1);
int cg = Math.min(green * precision / 256, precision - 1);
int cb = Math.min(blue * precision / 256, precision - 1);
int crange = Math.min(range * precision / 256, precision - 1);
int rRange[] = new int[]{Math.max(0, cr - crange), Math.min(cr + crange, precision - 1)};
int gRange[] = new int[]{Math.max(0, cg - crange), Math.min(cg + crange, precision - 1)};
int bRange[] = new int[]{Math.max(0, cb - crange), Math.min(cb + crange, precision - 1)};
for (int ir = rRange[0]; ir <= rRange[1]; ir++) {
for (int ig = gRange[0]; ig <= gRange[1]; ig++) {
for (int ib = bRange[0]; ib <= bRange[1]; ib++) {
counter += data[ir][ig][ib];
}
}
}
return 100.d * counter/pixelsAmount;
}
public void printColors() {
for (int r = 0; r<precision; r++) {
for (int g = 0; g<precision; g++) {
for (int b = 0; b<precision; b++) {
if (data[r][g][b] > 0) {
System.out.println(String.format("(%d, %d, %d) = %d", r, g, b, data[r][g][b]));
}
}
}
}
}
public int getPrecision() {
return precision;
}
public List<ColorDistribution> getColorDistribution(int minPercentage) {
double usage = 0;
List<ColorDistribution> colors = new LinkedList<>();
for (int r = 0; r<precision; r++) {
for (int g = 0; g<precision; g++) {
for (int b = 0; b<precision; b++) {
usage = data[r][g][b] * 100 / pixelsAmount;
if (usage >= minPercentage) {
colors.add(new ColorDistribution(new Color(r, g, b), usage));
}
}
}
}
return colors;
}
}