mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-13 23:26:07 +09:00
added sources for Slick
Former-commit-id: 1647fa32ef6894bd7db44f741f07c2f4dcdf9054 Former-commit-id: 0e5810dcfbe1fd59b13e7cabe9f1e93c5542da2d
This commit is contained in:
@@ -0,0 +1,151 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user