117 lines
3.2 KiB
Java
117 lines
3.2 KiB
Java
package com.thebrokenrail.gestus.skin;
|
|
|
|
import javax.imageio.ImageIO;
|
|
import java.awt.image.BufferedImage;
|
|
import java.io.IOException;
|
|
import java.net.MalformedURLException;
|
|
import java.net.URL;
|
|
import java.util.UUID;
|
|
|
|
public final class SkinColor {
|
|
public final int chest;
|
|
public final int legs;
|
|
public final int boots;
|
|
|
|
private SkinColor(int chest, int legs, int boots) {
|
|
this.chest = chest;
|
|
this.legs = legs;
|
|
this.boots = boots;
|
|
}
|
|
|
|
private static class Color {
|
|
private final int data;
|
|
|
|
private Color(int data) {
|
|
this.data = data;
|
|
}
|
|
|
|
private Color(int red, int green, int blue) {
|
|
data = 255 << 24 | (red & 255) << 16 | (green & 255) << 8 | (blue & 255);
|
|
}
|
|
|
|
private Color(long red, long green, long blue) {
|
|
this((int) red, (int) green, (int) blue);
|
|
}
|
|
|
|
public int getRed() {
|
|
return data >> 16 & 255;
|
|
}
|
|
|
|
public int getGreen() {
|
|
return data >> 8 & 255;
|
|
}
|
|
|
|
public int getBlue() {
|
|
return data & 255;
|
|
}
|
|
|
|
public int getData() {
|
|
return (getRed() << 16) | (getGreen() << 8) | getBlue();
|
|
}
|
|
}
|
|
|
|
private static Color averageColor(BufferedImage image, int x0, int y0, int w, int h) {
|
|
int x1 = x0 + w;
|
|
int y1 = y0 + h;
|
|
|
|
long sumRed = 0;
|
|
long sumGreen = 0;
|
|
long sumBlue = 0;
|
|
|
|
int num = 0;
|
|
|
|
for (int x = x0; x < x1; x++) {
|
|
for (int y = y0; y < y1; y++) {
|
|
int data = image.getRGB(x, y);
|
|
if ((data >> 24 & 255) == 255) {
|
|
Color pixel = new Color(data);
|
|
sumRed += pixel.getRed();
|
|
sumGreen += pixel.getGreen();
|
|
sumBlue += pixel.getBlue();
|
|
num++;
|
|
}
|
|
}
|
|
}
|
|
|
|
return new Color(sumRed / num, sumGreen / num, sumBlue / num);
|
|
}
|
|
|
|
private static Color averageColor(Color color1, Color color2) {
|
|
long sumRed = color1.getRed() + color2.getRed();
|
|
long sumGreen = color1.getGreen() + color2.getGreen();
|
|
long sumBlue = color1.getBlue() + color2.getBlue();
|
|
return new Color(sumRed / 2, sumGreen / 2, sumBlue / 2);
|
|
}
|
|
|
|
public static SkinColor get(UUID uuid) {
|
|
String skin = SkinJSON.get(uuid);
|
|
if (skin != null) {
|
|
URL url;
|
|
try {
|
|
url = new URL(skin);
|
|
} catch (MalformedURLException e) {
|
|
return null;
|
|
}
|
|
|
|
BufferedImage image;
|
|
try {
|
|
image = ImageIO.read(url);
|
|
} catch (IOException e) {
|
|
return null;
|
|
}
|
|
|
|
int chest = averageColor(image, 16, 20, 23, 11).getData();
|
|
int legs = averageColor(averageColor(image, 16, 52, 11, 11), averageColor(image, 0, 20, 11, 11)).getData();
|
|
int boots = averageColor(averageColor(image, 20, 48, 7, 3), averageColor(image, 44, 16, 7, 3)).getData();
|
|
|
|
return new SkinColor(chest, legs, boots);
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public static SkinColor blank() {
|
|
return new SkinColor(-1, -1, -1);
|
|
}
|
|
}
|