Hbm-s-Nuclear-Tech-GIT/src/main/java/com/hbm/render/icon/RGBMutatorInterpolatedComponentRemap.java

73 lines
2.2 KiB
Java

package com.hbm.render.icon;
import java.awt.image.BufferedImage;
public class RGBMutatorInterpolatedComponentRemap implements RGBMutator {
int sourceLight;
int sourceDark;
int targetLight;
int targetDark;
public RGBMutatorInterpolatedComponentRemap(int sourceLight, int sourceDark, int targetLight, int targetDark) {
this.sourceLight = sourceLight;
this.sourceDark = sourceDark;
this.targetLight = targetLight;
this.targetDark = targetDark;
}
@Override
public void mutate(BufferedImage image, int frame, int frameCount) {
for(int x = 0; x < image.getWidth(); x++) {
for(int y = 0; y < image.getHeight(); y++) {
int pix = image.getRGB(x, y);
int rgb = shiftColor(sourceLight, sourceDark, targetLight, targetDark, pix);
image.setRGB(x, y, rgb);
}
}
}
private static int shiftColor(int boundLighter, int boundDarker, int lighter, int darker, int pix) {
int a = (pix & 0xff000000) >> 24;
int r = (pix & 0xff0000) >> 16;
int g = (pix & 0xff00) >> 8;
int b = (pix & 0xff);
int nR = (int) shiftComponent(compR(lighter), compR(darker), compR(boundLighter), compR(boundDarker), r);
int nG = (int) shiftComponent(compG(lighter), compG(darker), compG(boundLighter), compG(boundDarker), g);
int nB = (int) shiftComponent(compB(lighter), compB(darker), compB(boundLighter), compB(boundDarker), b);
r = nR & 0xff;
g = nG & 0xff;
b = nB & 0xff;
return (a << 24) | (r << 16) | (g << 8) | b;
}
private static double shiftComponent(int lighter, int darker, int boundLighter, int boundDarker, int component) {
double scaledComponent = getPosFromComp(boundLighter, boundDarker, component);
return getCompFromFunc(lighter, darker, scaledComponent);
}
private static double getCompFromFunc(int lower, int upper, double interp) {
double d0 = (double) lower;
double d1 = (double) upper;
return d0 + interp * (d1 - d0);
}
private static double getPosFromComp(int lower, int upper, double val) {
double d0 = (double) lower;
double d1 = (double) upper;
return (val - d0) / (d1 - d0);
}
private static int compR(int col) { return (col & 0xff0000) >> 16; }
private static int compG(int col) { return (col & 0xff00) >> 8; }
private static int compB(int col) { return (col & 0xff); }
}