mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-10 05:41:51 +09:00
Former-commit-id: 1647fa32ef6894bd7db44f741f07c2f4dcdf9054 Former-commit-id: 0e5810dcfbe1fd59b13e7cabe9f1e93c5542da2d
152 lines
3.5 KiB
Java
152 lines
3.5 KiB
Java
package org.newdawn.slick.opengl;
|
|
|
|
import java.io.BufferedInputStream;
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.nio.ByteBuffer;
|
|
import java.util.ArrayList;
|
|
|
|
import org.newdawn.slick.util.Log;
|
|
|
|
/**
|
|
* A composite data source that checks multiple loaders in order of
|
|
* preference
|
|
*
|
|
* @author kevin
|
|
*/
|
|
public class CompositeImageData implements LoadableImageData {
|
|
/** The list of images sources in order of preference to try loading the data with */
|
|
private ArrayList sources = new ArrayList();
|
|
/** The data source that worked and was used - or null if no luck */
|
|
private LoadableImageData picked;
|
|
|
|
/**
|
|
* Add a potentional source of image data
|
|
*
|
|
* @param data The data source to try
|
|
*/
|
|
public void add(LoadableImageData data) {
|
|
sources.add(data);
|
|
}
|
|
|
|
/**
|
|
* @see org.newdawn.slick.opengl.LoadableImageData#loadImage(java.io.InputStream)
|
|
*/
|
|
public ByteBuffer loadImage(InputStream fis) throws IOException {
|
|
return loadImage(fis, false, null);
|
|
}
|
|
|
|
/**
|
|
* @see org.newdawn.slick.opengl.LoadableImageData#loadImage(java.io.InputStream, boolean, int[])
|
|
*/
|
|
public ByteBuffer loadImage(InputStream fis, boolean flipped, int[] transparent) throws IOException {
|
|
return loadImage(fis, flipped, false, transparent);
|
|
}
|
|
|
|
/**
|
|
* @see org.newdawn.slick.opengl.LoadableImageData#loadImage(java.io.InputStream, boolean, boolean, int[])
|
|
*/
|
|
public ByteBuffer loadImage(InputStream is, boolean flipped, boolean forceAlpha, int[] transparent) throws IOException {
|
|
CompositeIOException exception = new CompositeIOException();
|
|
ByteBuffer buffer = null;
|
|
|
|
BufferedInputStream in = new BufferedInputStream(is, is.available());
|
|
in.mark(is.available());
|
|
|
|
// cycle through our source until one of them works
|
|
for (int i=0;i<sources.size();i++) {
|
|
in.reset();
|
|
try {
|
|
LoadableImageData data = (LoadableImageData) sources.get(i);
|
|
|
|
buffer = data.loadImage(in, flipped, forceAlpha, transparent);
|
|
picked = data;
|
|
break;
|
|
} catch (Exception e) {
|
|
Log.warn(sources.get(i).getClass()+" failed to read the data", e);
|
|
exception.addException(e);
|
|
}
|
|
}
|
|
|
|
if (picked == null) {
|
|
throw exception;
|
|
}
|
|
|
|
return buffer;
|
|
}
|
|
|
|
/**
|
|
* Check the state of the image data and throw a
|
|
* runtime exception if theres a problem
|
|
*/
|
|
private void checkPicked() {
|
|
if (picked == null) {
|
|
throw new RuntimeException("Attempt to make use of uninitialised or invalid composite image data");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @see org.newdawn.slick.opengl.ImageData#getDepth()
|
|
*/
|
|
public int getDepth() {
|
|
checkPicked();
|
|
|
|
return picked.getDepth();
|
|
}
|
|
|
|
/**
|
|
* @see org.newdawn.slick.opengl.ImageData#getHeight()
|
|
*/
|
|
public int getHeight() {
|
|
checkPicked();
|
|
|
|
return picked.getHeight();
|
|
}
|
|
|
|
/**
|
|
* @see org.newdawn.slick.opengl.ImageData#getImageBufferData()
|
|
*/
|
|
public ByteBuffer getImageBufferData() {
|
|
checkPicked();
|
|
|
|
return picked.getImageBufferData();
|
|
}
|
|
|
|
/**
|
|
* @see org.newdawn.slick.opengl.ImageData#getTexHeight()
|
|
*/
|
|
public int getTexHeight() {
|
|
checkPicked();
|
|
|
|
return picked.getTexHeight();
|
|
}
|
|
|
|
/**
|
|
* @see org.newdawn.slick.opengl.ImageData#getTexWidth()
|
|
*/
|
|
public int getTexWidth() {
|
|
checkPicked();
|
|
|
|
return picked.getTexWidth();
|
|
}
|
|
|
|
/**
|
|
* @see org.newdawn.slick.opengl.ImageData#getWidth()
|
|
*/
|
|
public int getWidth() {
|
|
checkPicked();
|
|
|
|
return picked.getWidth();
|
|
}
|
|
|
|
/**
|
|
* @see org.newdawn.slick.opengl.LoadableImageData#configureEdging(boolean)
|
|
*/
|
|
public void configureEdging(boolean edging) {
|
|
for (int i=0;i<sources.size();i++) {
|
|
((LoadableImageData) sources.get(i)).configureEdging(edging);
|
|
}
|
|
}
|
|
|
|
}
|