mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-11-24 11:45:27 +01:00
91 lines
3.0 KiB
Java
91 lines
3.0 KiB
Java
|
package org.pngquant;
|
||
|
|
||
|
import org.pngquant.*;
|
||
|
import java.awt.image.*;
|
||
|
|
||
|
/**
|
||
|
* Quantization result that holds palette and options for remapping.
|
||
|
*/
|
||
|
public class Result extends LiqObject {
|
||
|
|
||
|
/**
|
||
|
* Throws when quantization fails (e.g. due to failing to achieve minimum quality)
|
||
|
*/
|
||
|
public Result(PngQuant pngquant, Image image) throws PngQuantException {
|
||
|
handle = liq_quantize_image(pngquant.handle, image.handle);
|
||
|
if (handle == 0) {
|
||
|
throw new PngQuantException();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return BufferedImage remapped to palette this Result has been created with or null on failure.
|
||
|
*/
|
||
|
public BufferedImage getRemapped(Image orig_image) {
|
||
|
byte[] pal = liq_get_palette(handle);
|
||
|
IndexColorModel color = new IndexColorModel(8, pal.length/4, pal, 0, true);
|
||
|
BufferedImage img = new BufferedImage(
|
||
|
orig_image.getWidth(), orig_image.getHeight(),
|
||
|
BufferedImage.TYPE_BYTE_INDEXED, color);
|
||
|
|
||
|
byte[] data = get8bitDataFromImage(img);
|
||
|
if (data == null) return null;
|
||
|
|
||
|
if (!liq_write_remapped_image(handle, orig_image.handle, data)) return null;
|
||
|
|
||
|
return img;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Dithering strength. Floyd-Steinberg is always used and in
|
||
|
* speed settings 1-5 high-quality adaptive dithering is used.
|
||
|
* @see PngQuant.setSpeed()
|
||
|
* @link http://pngquant.org/lib/#liq_set_dithering_level
|
||
|
*
|
||
|
* @param dither_level Dithering in range 0 (none) and 1 (full)
|
||
|
*/
|
||
|
public native boolean setDitheringLevel(float dither_level);
|
||
|
|
||
|
/**
|
||
|
* The default is 0.45455 (1/2.2) which is PNG's approximation of sRGB.
|
||
|
*/
|
||
|
public native boolean setGamma(double gamma);
|
||
|
public native double getGamma();
|
||
|
|
||
|
/**
|
||
|
* Mean Square Error of remapping of image used to create this result.
|
||
|
* @link http://pngquant.org/lib/#liq_get_quantization_error
|
||
|
*
|
||
|
* @return MSE or -1 if not available
|
||
|
*/
|
||
|
public native double getMeanSquareError();
|
||
|
|
||
|
/**
|
||
|
* @link http://pngquant.org/lib/#liq_get_quantization_quality
|
||
|
* @return Actually achieved quality in 0-100 range on scale compatible with PngQuant.setQuality()
|
||
|
*/
|
||
|
public native int getQuality();
|
||
|
|
||
|
public void close() {
|
||
|
if (handle != 0) {
|
||
|
liq_result_destroy(handle);
|
||
|
handle = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private static byte[] get8bitDataFromImage(BufferedImage image) {
|
||
|
if (image.getType() == BufferedImage.TYPE_BYTE_INDEXED) {
|
||
|
DataBuffer buffer = image.getRaster().getDataBuffer();
|
||
|
if (buffer instanceof DataBufferByte) {
|
||
|
return ((DataBufferByte)buffer).getData();
|
||
|
}
|
||
|
}
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
private static native byte[] liq_get_palette(long handle);
|
||
|
private static native long liq_quantize_image(long attr, long image);
|
||
|
private static native boolean liq_write_remapped_image(long handle, long image, byte[] buffer);
|
||
|
private static native void liq_result_destroy(long handle);
|
||
|
}
|