mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-10 13:51:53 +09:00
added sources for Slick
Former-commit-id: 1647fa32ef6894bd7db44f741f07c2f4dcdf9054 Former-commit-id: 0e5810dcfbe1fd59b13e7cabe9f1e93c5542da2d
This commit is contained in:
167
lib/slick-source/org/newdawn/slick/ImageBuffer.java
Normal file
167
lib/slick-source/org/newdawn/slick/ImageBuffer.java
Normal file
@@ -0,0 +1,167 @@
|
||||
package org.newdawn.slick;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.ByteOrder;
|
||||
|
||||
import org.lwjgl.BufferUtils;
|
||||
import org.newdawn.slick.opengl.ImageData;
|
||||
|
||||
/**
|
||||
* A utility for creating images from pixel operations
|
||||
*
|
||||
* Expected usage is:
|
||||
* <code>
|
||||
* ImageBuffer buffer = new ImageBuffer(320,200);
|
||||
* buffer.setRGBA(100,100,50,50,20,255);
|
||||
* ..
|
||||
* Image image = buffer.getImage();
|
||||
* </code>
|
||||
*
|
||||
* @author kevin
|
||||
*/
|
||||
public class ImageBuffer implements ImageData {
|
||||
/** The width of the image */
|
||||
private int width;
|
||||
/** The height of the image */
|
||||
private int height;
|
||||
/** The width of the texture */
|
||||
private int texWidth;
|
||||
/** The height of the texture */
|
||||
private int texHeight;
|
||||
/** The raw data generated for the image */
|
||||
private byte[] rawData;
|
||||
|
||||
/**
|
||||
*
|
||||
* @param width
|
||||
* @param height
|
||||
*/
|
||||
public ImageBuffer(int width, int height) {
|
||||
this.width = width;
|
||||
this.height = height;
|
||||
|
||||
texWidth = get2Fold(width);
|
||||
texHeight = get2Fold(height);
|
||||
|
||||
rawData = new byte[texWidth * texHeight * 4];
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the raw data stored within the image buffer
|
||||
*
|
||||
* @return The raw data in RGBA packed format from within the image buffer
|
||||
*/
|
||||
public byte[] getRGBA() {
|
||||
return rawData;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.newdawn.slick.opengl.ImageData#getDepth()
|
||||
*/
|
||||
public int getDepth() {
|
||||
return 32;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.newdawn.slick.opengl.ImageData#getHeight()
|
||||
*/
|
||||
public int getHeight() {
|
||||
return height;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.newdawn.slick.opengl.ImageData#getTexHeight()
|
||||
*/
|
||||
public int getTexHeight() {
|
||||
return texHeight;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.newdawn.slick.opengl.ImageData#getTexWidth()
|
||||
*/
|
||||
public int getTexWidth() {
|
||||
return texWidth;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.newdawn.slick.opengl.ImageData#getWidth()
|
||||
*/
|
||||
public int getWidth() {
|
||||
return width;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.newdawn.slick.opengl.ImageData#getImageBufferData()
|
||||
*/
|
||||
public ByteBuffer getImageBufferData() {
|
||||
ByteBuffer scratch = BufferUtils.createByteBuffer(rawData.length);
|
||||
scratch.put(rawData);
|
||||
scratch.flip();
|
||||
|
||||
return scratch;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a pixel in the image buffer
|
||||
*
|
||||
* @param x The x position of the pixel to set
|
||||
* @param y The y position of the pixel to set
|
||||
* @param r The red component to set (0->255)
|
||||
* @param g The green component to set (0->255)
|
||||
* @param b The blue component to set (0->255)
|
||||
* @param a The alpha component to set (0->255)
|
||||
*/
|
||||
public void setRGBA(int x, int y, int r, int g, int b, int a) {
|
||||
if ((x < 0) || (x >= width) || (y < 0) || (y >= height)) {
|
||||
throw new RuntimeException("Specified location: "+x+","+y+" outside of image");
|
||||
}
|
||||
|
||||
int ofs = ((x + (y * texWidth)) * 4);
|
||||
|
||||
if (ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN) {
|
||||
rawData[ofs] = (byte) b;
|
||||
rawData[ofs + 1] = (byte) g;
|
||||
rawData[ofs + 2] = (byte) r;
|
||||
rawData[ofs + 3] = (byte) a;
|
||||
} else {
|
||||
rawData[ofs] = (byte) r;
|
||||
rawData[ofs + 1] = (byte) g;
|
||||
rawData[ofs + 2] = (byte) b;
|
||||
rawData[ofs + 3] = (byte) a;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an image generated based on this buffer
|
||||
*
|
||||
* @return The image generated from this buffer
|
||||
*/
|
||||
public Image getImage() {
|
||||
return new Image(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an image generated based on this buffer
|
||||
*
|
||||
* @param filter The filtering method to use when scaling this image
|
||||
* @return The image generated from this buffer
|
||||
*/
|
||||
public Image getImage(int filter) {
|
||||
return new Image(this, filter);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the closest greater power of 2 to the fold number
|
||||
*
|
||||
* @param fold The target number
|
||||
* @return The power of 2
|
||||
*/
|
||||
private int get2Fold(int fold) {
|
||||
int ret = 2;
|
||||
while (ret < fold) {
|
||||
ret *= 2;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user