diff --git a/src/java/org/lwjgl/util/Color.java b/src/java/org/lwjgl/util/Color.java
new file mode 100644
index 00000000..4e6c06e5
--- /dev/null
+++ b/src/java/org/lwjgl/util/Color.java
@@ -0,0 +1,395 @@
+/*
+ * Copyright (c) 2002 Shaven Puppy Ltd
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'Shaven Puppy' nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.lwjgl.util;
+import java.io.Serializable;
+import java.nio.ByteBuffer;
+
+/**
+ * $Id$
+ * A mutable Color class
+ * @author $Author$
+ * @version $Revision$
+ */
+public final class Color implements ReadableColor, Serializable, WritableColor {
+
+ static final long serialVersionUID = 1L;
+
+ /** Color components, publicly accessible */
+ private byte red, green, blue, alpha;
+
+ /**
+ * Constructor for Color.
+ */
+ public Color() {
+ this(0, 0, 0, 255);
+ }
+
+ /**
+ * Constructor for Color. Alpha defaults to 255.
+ */
+ public Color(int r, int g, int b) {
+ this(r, g, b, 255);
+ }
+
+ /**
+ * Constructor for Color. Alpha defaults to 255.
+ */
+ public Color(byte r, byte g, byte b) {
+ this(r, g, b, (byte) 255);
+ }
+
+ /**
+ * Constructor for Color.
+ */
+ public Color(int r, int g, int b, int a) {
+ set(r, g, b, a);
+ }
+
+ /**
+ * Constructor for Color.
+ */
+ public Color(byte r, byte g, byte b, byte a) {
+ set(r, g, b, a);
+ }
+
+ /**
+ * Constructor for Color
+ */
+ public Color(ReadableColor c) {
+ setColor(c);
+ }
+
+ /**
+ * Set a color
+ */
+ public void set(int r, int g, int b, int a) {
+ red = (byte) r;
+ green = (byte) g;
+ blue = (byte) b;
+ alpha = (byte) a;
+ }
+
+ /**
+ * Set a color
+ */
+ public void set(byte r, byte g, byte b, byte a) {
+ this.red = r;
+ this.green = g;
+ this.blue = b;
+ this.alpha = a;
+ }
+
+ /**
+ * Set a color
+ */
+ public void set(int r, int g, int b) {
+ set(r, g, b, 255);
+ }
+
+ /**
+ * Set a color
+ */
+ public void set(byte r, byte g, byte b) {
+ set(r, g, b, (byte) 255);
+ }
+
+ /**
+ * Accessor
+ */
+ public int getRed() {
+ return red & 0xFF;
+ }
+
+ /**
+ * Accessor
+ */
+ public int getGreen() {
+ return green & 0xFF;
+ }
+
+ /**
+ * Accessor
+ */
+ public int getBlue() {
+ return blue & 0xFF;
+ }
+
+ /**
+ * Accessor
+ */
+ public int getAlpha() {
+ return alpha & 0xFF;
+ }
+
+ /**
+ * Set the Red component
+ */
+ public void setRed(int red) {
+ this.red = (byte) red;
+ }
+
+ /**
+ * Set the Green component
+ */
+ public void setGreen(int green) {
+ this.green = (byte) green;
+ }
+
+ /**
+ * Set the Blue component
+ */
+ public void setBlue(int blue) {
+ this.blue = (byte) blue;
+ }
+
+ /**
+ * Set the Alpha component
+ */
+ public void setAlpha(int alpha) {
+ this.alpha = (byte) alpha;
+ }
+
+ /**
+ * Set the Red component
+ */
+ public void setRed(byte red) {
+ this.red = red;
+ }
+
+ /**
+ * Set the Green component
+ */
+ public void setGreen(byte green) {
+ this.green = green;
+ }
+
+ /**
+ * Set the Blue component
+ */
+ public void setBlue(byte blue) {
+ this.blue = blue;
+ }
+
+ /**
+ * Set the Alpha component
+ */
+ public void setAlpha(byte alpha) {
+ this.alpha = alpha;
+ }
+
+ /**
+ * Stringify
+ */
+ public String toString() {
+ return "Color [" + getRed() + ", " + getGreen() + ", " + getBlue() + ", " + getAlpha() + "]";
+ }
+
+ /**
+ * Equals
+ */
+ public boolean equals(Object o) {
+ return (o != null)
+ && (o instanceof ReadableColor)
+ && (((ReadableColor) o).getRed() == this.getRed())
+ && (((ReadableColor) o).getGreen() == this.getGreen())
+ && (((ReadableColor) o).getBlue() == this.getBlue())
+ && (((ReadableColor) o).getAlpha() == this.getAlpha());
+ }
+
+ /**
+ * Hashcode
+ */
+ public int hashCode() {
+ return (red << 24) | (green << 16) | (blue << 8) | alpha;
+ }
+
+ /* (Overrides)
+ * @see com.shavenpuppy.jglib.ReadableColor#getAlphaByte()
+ */
+ public byte getAlphaByte() {
+ return alpha;
+ }
+
+ /* (Overrides)
+ * @see com.shavenpuppy.jglib.ReadableColor#getBlueByte()
+ */
+ public byte getBlueByte() {
+ return blue;
+ }
+
+ /* (Overrides)
+ * @see com.shavenpuppy.jglib.ReadableColor#getGreenByte()
+ */
+ public byte getGreenByte() {
+ return green;
+ }
+
+ /* (Overrides)
+ * @see com.shavenpuppy.jglib.ReadableColor#getRedByte()
+ */
+ public byte getRedByte() {
+ return red;
+ }
+
+ /* (Overrides)
+ * @see com.shavenpuppy.jglib.ReadableColor#writeRGBA(java.nio.ByteBuffer)
+ */
+ public void writeRGBA(ByteBuffer dest) {
+ dest.put(red);
+ dest.put(green);
+ dest.put(blue);
+ dest.put(alpha);
+ }
+
+ /* (Overrides)
+ * @see com.shavenpuppy.jglib.ReadableColor#writeRGB(java.nio.ByteBuffer)
+ */
+ public void writeRGB(ByteBuffer dest) {
+ dest.put(red);
+ dest.put(green);
+ dest.put(blue);
+ }
+
+ /* (Overrides)
+ * @see com.shavenpuppy.jglib.ReadableColor#writeABGR(java.nio.ByteBuffer)
+ */
+ public void writeABGR(ByteBuffer dest) {
+ dest.put(alpha);
+ dest.put(blue);
+ dest.put(green);
+ dest.put(red);
+ }
+
+ /* (Overrides)
+ * @see com.shavenpuppy.jglib.ReadableColor#writeARGB(java.nio.ByteBuffer)
+ */
+ public void writeARGB(ByteBuffer dest) {
+ dest.put(alpha);
+ dest.put(red);
+ dest.put(green);
+ dest.put(blue);
+ }
+
+ /* (Overrides)
+ * @see com.shavenpuppy.jglib.ReadableColor#writeBGR(java.nio.ByteBuffer)
+ */
+ public void writeBGR(ByteBuffer dest) {
+ dest.put(blue);
+ dest.put(green);
+ dest.put(red);
+ }
+
+ /* (Overrides)
+ * @see com.shavenpuppy.jglib.ReadableColor#writeBGRA(java.nio.ByteBuffer)
+ */
+ public void writeBGRA(ByteBuffer dest) {
+ dest.put(blue);
+ dest.put(green);
+ dest.put(red);
+ dest.put(alpha);
+ }
+
+ /**
+ * Read a color from a byte buffer
+ * @param src The source buffer
+ */
+ public void readRGBA(ByteBuffer src) {
+ red = src.get();
+ green = src.get();
+ blue = src.get();
+ alpha = src.get();
+ }
+
+ /**
+ * Read a color from a byte buffer
+ * @param src The source buffer
+ */
+ public void readRGB(ByteBuffer src) {
+ red = src.get();
+ green = src.get();
+ blue = src.get();
+ }
+
+ /**
+ * Read a color from a byte buffer
+ * @param src The source buffer
+ */
+ public void readARGB(ByteBuffer src) {
+ alpha = src.get();
+ red = src.get();
+ green = src.get();
+ blue = src.get();
+ }
+
+ /**
+ * Read a color from a byte buffer
+ * @param src The source buffer
+ */
+ public void readBGRA(ByteBuffer src) {
+ blue = src.get();
+ green = src.get();
+ red = src.get();
+ alpha = src.get();
+ }
+
+ /**
+ * Read a color from a byte buffer
+ * @param src The source buffer
+ */
+ public void readBGR(ByteBuffer src) {
+ blue = src.get();
+ green = src.get();
+ red = src.get();
+ }
+
+ /**
+ * Read a color from a byte buffer
+ * @param src The source buffer
+ */
+ public void readABGR(ByteBuffer src) {
+ alpha = src.get();
+ blue = src.get();
+ green = src.get();
+ red = src.get();
+ }
+
+ /**
+ * Set this color's color by copying another color
+ * @param src The source color
+ */
+ public void setColor(ReadableColor src) {
+ red = src.getRedByte();
+ green = src.getGreenByte();
+ blue = src.getBlueByte();
+ alpha = src.getAlphaByte();
+ }
+}
diff --git a/src/java/org/lwjgl/util/Dimension.java b/src/java/org/lwjgl/util/Dimension.java
new file mode 100644
index 00000000..89c6f6ad
--- /dev/null
+++ b/src/java/org/lwjgl/util/Dimension.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright (c) 2002 Shaven Puppy Ltd
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'Shaven Puppy' nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.lwjgl.util;
+
+import java.io.Serializable;
+
+/**
+ * $Id$
+ * A 2D integer Dimension class, which looks remarkably like an AWT one.
+ * @author $Author$
+ * @version $Revision$
+ */
+public final class Dimension implements Serializable, ReadableDimension, WritableDimension {
+
+ static final long serialVersionUID = 1L;
+
+ /** The dimensions! */
+ private int width, height;
+
+ /**
+ * Constructor for Dimension.
+ */
+ public Dimension() {
+ super();
+ }
+
+ /**
+ * Constructor for Dimension.
+ */
+ public Dimension(int w, int h) {
+ this.width = w;
+ this.height = h;
+ }
+
+ /**
+ * Constructor for Dimension.
+ */
+ public Dimension(ReadableDimension d) {
+ setSize(d);
+ }
+
+ public void setSize(int w, int h) {
+ this.width = w;
+ this.height = h;
+ }
+
+ public void setSize(ReadableDimension d) {
+ this.width = d.getWidth();
+ this.height = d.getHeight();
+ }
+
+ /* (Overrides)
+ * @see com.shavenpuppy.jglib.ReadableDimension#getSize(com.shavenpuppy.jglib.Dimension)
+ */
+ public void getSize(WritableDimension dest) {
+ dest.setSize(this);
+ }
+
+ /**
+ * Checks whether two dimension objects have equal values.
+ */
+ public boolean equals(Object obj) {
+ if (obj instanceof ReadableDimension) {
+ ReadableDimension d = (ReadableDimension) obj;
+ return (width == d.getWidth()) && (height == d.getHeight());
+ }
+ return false;
+ }
+
+ /**
+ * Returns the hash code for this Dimension.
+ *
+ * @return a hash code for this Dimension
+ */
+ public int hashCode() {
+ int sum = width + height;
+ return sum * (sum + 1) / 2 + width;
+ }
+
+ /**
+ * Returns a string representation of the values of this
+ * Dimension object's height and
+ * width fields. This method is intended to be used only
+ * for debugging purposes, and the content and format of the returned
+ * string may vary between implementations. The returned string may be
+ * empty but may not be null.
+ *
+ * @return a string representation of this Dimension
+ * object
+ */
+ public String toString() {
+ return getClass().getName() + "[width=" + width + ",height=" + height + "]";
+ }
+
+ /**
+ * Gets the height.
+ * @return Returns a int
+ */
+ public int getHeight() {
+ return height;
+ }
+
+ /**
+ * Sets the height.
+ * @param height The height to set
+ */
+ public void setHeight(int height) {
+ this.height = height;
+ }
+
+ /**
+ * Gets the width.
+ * @return Returns a int
+ */
+ public int getWidth() {
+ return width;
+ }
+
+ /**
+ * Sets the width.
+ * @param width The width to set
+ */
+ public void setWidth(int width) {
+ this.width = width;
+ }
+
+}
diff --git a/src/java/org/lwjgl/util/Display.java b/src/java/org/lwjgl/util/Display.java
new file mode 100644
index 00000000..c1b6c82d
--- /dev/null
+++ b/src/java/org/lwjgl/util/Display.java
@@ -0,0 +1,237 @@
+/*
+ * Copyright (c) 2002 Shaven Puppy Ltd
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'Shaven Puppy' nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.lwjgl.util;
+
+import java.lang.reflect.Field;
+import java.util.*;
+import java.util.ArrayList;
+import java.util.Comparator;
+
+import org.lwjgl.DisplayMode;
+import org.lwjgl.Sys;
+
+/**
+ * $Id$
+ * Display initialization utility, that can be used to find display modes and pick
+ * one for you based on your criteria.
+ * @author $Author$
+ * @version $Revision$
+ */
+public final class Display {
+
+ private static final boolean DEBUG = false;
+
+ /**
+ * Determine the available display modes that match the specified minimum and maximum criteria.
+ * If any given criterium is specified as -1 then it is ignored.
+ *
+ * @param minWidth the minimum display resolution in pixels
+ * @param minHeight the minimum display resolution in pixels
+ * @param maxWidth the maximum display resolution in pixels
+ * @param maxHeight the maximum display resolution in pixels
+ * @param minBPP the minimum bit depth per pixel
+ * @param maxBPP the maximum bit depth per pixel
+ * @param minFreq the minimum display frequency in Hz
+ * @param maxFreq the maximum display frequency in Hz
+ * @return an array of matching display modes
+ */
+ public static DisplayMode[] getAvailableDisplayModes(int minWidth, int minHeight, int maxWidth, int maxHeight, int minBPP, int maxBPP,
+ int minFreq, int maxFreq)
+ {
+ // First get the available display modes
+ DisplayMode[] modes = org.lwjgl.Display.getAvailableDisplayModes();
+
+ if (Sys.DEBUG || DEBUG) {
+ System.out.println("Available screen modes:");
+ for (int i = 0; i < modes.length; i ++) {
+ System.out.println(modes[i]);
+ }
+ }
+
+ ArrayList matches = new ArrayList(modes.length);
+
+ for (int i = 0; i < modes.length; i ++) {
+ assert modes[i] != null : ""+i+" "+modes.length;
+ if (minWidth != -1 && modes[i].width < minWidth)
+ continue;
+ if (maxWidth != -1 && modes[i].width > maxWidth)
+ continue;
+ if (minHeight != -1 && modes[i].height < minHeight)
+ continue;
+ if (maxHeight != -1 && modes[i].height > maxHeight)
+ continue;
+ if (minBPP != -1 && modes[i].bpp < minBPP)
+ continue;
+ if (maxBPP != -1 && modes[i].bpp > maxBPP)
+ continue;
+ //if (modes[i].bpp == 24)
+ // continue;
+ if (modes[i].freq != 0) {
+ if (minFreq != -1 && modes[i].freq < minFreq)
+ continue;
+ if (maxFreq != -1 && modes[i].freq > maxFreq)
+ continue;
+ }
+ matches.add(modes[i]);
+ }
+
+ DisplayMode[] ret = new DisplayMode[matches.size()];
+ matches.toArray(ret);
+ if (Sys.DEBUG && DEBUG) {
+ System.out.println("Filtered screen modes:");
+ for (int i = 0; i < ret.length; i ++) {
+ System.out.println(ret[i]);
+ }
+ }
+
+ return ret;
+ }
+
+ /**
+ * Create the display by choosing from a list of display modes based on an order of preference.
+ * You must supply a list of allowable display modes, probably by calling getAvailableDisplayModes(),
+ * and an array with the order in which you would like them sorted in descending order.
+ * This method attempts to create the topmost display mode; if that fails, it will try the next one,
+ * and so on, until there are no modes left. If no mode is set at the end, an exception is thrown.
+ * @param dm[] a list of display modes to choose from
+ * @param param[] the names of the DisplayMode fields in the order in which you would like them sorted.
+ * @param fullscreen whether to go fullscreen
+ * @param title The app title
+ * @return the chosen display mode
+ * @throws NoSuchFieldException if one of the params is not a field in DisplayMode
+ * @throws Exception if no display mode could be set
+ * @see org.lwjgj.DisplayMode
+ */
+ public static DisplayMode setDisplayMode(DisplayMode[] dm, final String[] param) throws Exception {
+
+
+ class Sorter implements Comparator {
+
+ final Field[] field;
+ final int[] order;
+ final boolean[] usePreferred;
+ final int[] preferred;
+
+ Sorter() throws NoSuchFieldException {
+ field = new Field[param.length];
+ order = new int[param.length];
+ preferred = new int[param.length];
+ usePreferred = new boolean[param.length];
+ for (int i = 0; i < field.length; i ++) {
+ int idx = param[i].indexOf('=');
+ if (idx > 0) {
+ preferred[i] = Integer.parseInt(param[i].substring(idx + 1, param[i].length()));
+ usePreferred[i] = true;
+ param[i] = param[i].substring(0, idx);
+ field[i] = DisplayMode.class.getField(param[i]);
+ } else if (param[i].charAt(0) == '-') {
+ field[i] = DisplayMode.class.getField(param[i].substring(1));
+ order[i] = -1;
+ } else {
+ field[i] = DisplayMode.class.getField(param[i]);
+ order[i] = 1;
+ }
+ }
+ }
+
+ /**
+ * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
+ */
+ public int compare(Object o1, Object o2) {
+ DisplayMode dm1 = (DisplayMode) o1;
+ DisplayMode dm2 = (DisplayMode) o2;
+
+ for (int i = 0; i < field.length; i ++) {
+ try {
+ int f1 = field[i].getInt(dm1);
+ int f2 = field[i].getInt(dm2);
+
+ if (usePreferred[i] && f1 != f2) {
+ if (f1 == preferred[i])
+ return -1;
+ else if (f2 == preferred[i])
+ return 1;
+ else {
+ // Score according to the difference between the values
+ int absf1 = Math.abs(f1 - preferred[i]);
+ int absf2 = Math.abs(f2 - preferred[i]);
+ if (absf1 < absf2)
+ return -1;
+ else if (absf1 > absf2)
+ return 1;
+ else
+ continue;
+ }
+ } else if (f1 < f2)
+ return order[i];
+ else if (f1 == f2)
+ continue;
+ else
+ return -order[i];
+
+ } catch (Exception e) {
+ assert false : e.getMessage();
+ }
+ }
+
+ return 0;
+ }
+ }
+
+ // Sort the display modes
+ Arrays.sort(dm, new Sorter());
+
+ // Try them out in the appropriate order
+ if (Sys.DEBUG || DEBUG) {
+ System.out.println("Sorted display modes:");
+ for (int i = 0; i < dm.length; i ++) {
+ System.out.println(dm[i]);
+ }
+ }
+ for (int i = 0; i < dm.length; i ++) {
+ try {
+ if (Sys.DEBUG || DEBUG)
+ System.out.println("Attempting to set displaymode: "+dm[i]);
+ org.lwjgl.Display.setDisplayMode(dm[i]);
+ return dm[i];
+ } catch (Exception e) {
+ if (Sys.DEBUG || DEBUG) {
+ System.out.println("Failed to set display mode to "+dm[i]);
+ e.printStackTrace();
+ }
+ }
+ }
+
+ throw new Exception("Failed to set display mode.");
+ }
+
+}
diff --git a/src/java/org/lwjgl/util/Point.java b/src/java/org/lwjgl/util/Point.java
new file mode 100644
index 00000000..ad6537a2
--- /dev/null
+++ b/src/java/org/lwjgl/util/Point.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright (c) 2002 Shaven Puppy Ltd
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'Shaven Puppy' nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.lwjgl.util;
+
+import java.io.Serializable;
+
+/**
+ * $Id$
+ * A 2D integer point class, which looks remarkably like an AWT one.
+ * @author $Author$
+ * @version $Revision$
+ */
+public final class Point implements ReadablePoint, WritablePoint, Serializable {
+
+ static final long serialVersionUID = 1L;
+
+ /** The location */
+ private int x, y;
+
+ /**
+ * Constructor for Point.
+ */
+ public Point() {
+ super();
+ }
+
+ /**
+ * Constructor for Point.
+ */
+ public Point(int x, int y) {
+ setLocation(x, y);
+ }
+
+ /**
+ * Constructor for Point.
+ */
+ public Point(ReadablePoint p) {
+ setLocation(p);
+ }
+
+ public void setLocation(int x, int y) {
+ this.x = x;
+ this.y = y;
+ }
+
+ public void setLocation(ReadablePoint p) {
+ this.x = p.getX();
+ this.y = p.getY();
+ }
+
+ public void setX(int x) {
+ this.x = x;
+ }
+
+ public void setY(int y) {
+ this.y = y;
+ }
+
+ /**
+ * Translate a point.
+ * @param x, y The translation to apply
+ */
+ public void translate(int dx, int dy) {
+ this.x += dx;
+ this.y += dy;
+ }
+
+ /**
+ * Translate a point.
+ * @param p The translation to apply
+ */
+ public void translate(ReadablePoint p) {
+ this.x += p.getX();
+ this.y += p.getY();
+ }
+
+ /**
+ * Un-translate a point.
+ * @param p The translation to apply
+ */
+ public void untranslate(ReadablePoint p) {
+ this.x -= p.getX();
+ this.y -= p.getY();
+ }
+
+ /**
+ * Determines whether an instance of Point2D is equal
+ * to this point. Two instances of Point2D are equal if
+ * the values of their x and y member
+ * fields, representing their position in the coordinate space, are
+ * the same.
+ * @param obj an object to be compared with this point
+ * @return true if the object to be compared is
+ * an instance of Point and has
+ * the same values; false otherwise
+ */
+ public boolean equals(Object obj) {
+ if (obj instanceof Point) {
+ Point pt = (Point) obj;
+ return (x == pt.x) && (y == pt.y);
+ }
+ return super.equals(obj);
+ }
+
+ /**
+ * Returns a string representation of this point and its location
+ * in the (x, y) coordinate space. This method is
+ * intended to be used only for debugging purposes, and the content
+ * and format of the returned string may vary between implementations.
+ * The returned string may be empty but may not be null.
+ *
+ * @return a string representation of this point
+ */
+ public String toString() {
+ return getClass().getName() + "[x=" + x + ",y=" + y + "]";
+ }
+
+ /**
+ * Returns the hash code for this Point.
+ *
+ * @return a hash code for this Point
+ */
+ public int hashCode() {
+ int sum = x + y;
+ return sum * (sum + 1) / 2 + x;
+ }
+
+ public int getX() {
+ return x;
+ }
+
+ public int getY() {
+ return y;
+ }
+
+ public void getLocation(WritablePoint dest) {
+ dest.setLocation(x, y);
+ }
+
+}
diff --git a/src/java/org/lwjgl/util/ReadableColor.java b/src/java/org/lwjgl/util/ReadableColor.java
new file mode 100644
index 00000000..a607a65c
--- /dev/null
+++ b/src/java/org/lwjgl/util/ReadableColor.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright (c) 2003 Shaven Puppy Ltd
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'Shaven Puppy' nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.lwjgl.util;
+
+import java.nio.ByteBuffer;
+
+/**
+ * $Id$
+ * Readonly interface for Colors
+ * @author $Author$
+ * @version $Revision$
+ */
+public interface ReadableColor {
+
+ /**
+ * Return the red component (0..255)
+ * @return int
+ */
+ public int getRed();
+
+ /**
+ * Return the red component (0..255)
+ * @return int
+ */
+ public int getGreen();
+
+ /**
+ * Return the red component (0..255)
+ * @return int
+ */
+ public int getBlue();
+
+ /**
+ * Return the red component (0..255)
+ * @return int
+ */
+ public int getAlpha();
+
+ /**
+ * Return the red component
+ * @return int
+ */
+ public byte getRedByte();
+
+ /**
+ * Return the red component
+ * @return int
+ */
+ public byte getGreenByte();
+
+ /**
+ * Return the red component
+ * @return int
+ */
+ public byte getBlueByte();
+
+ /**
+ * Return the red component
+ * @return int
+ */
+ public byte getAlphaByte();
+
+ /**
+ * Write the RGBA color directly out to a ByteBuffer
+ * @param dest the buffer to write to
+ */
+ public void writeRGBA(ByteBuffer dest);
+
+ /**
+ * Write the RGB color directly out to a ByteBuffer
+ * @param dest the buffer to write to
+ */
+ public void writeRGB(ByteBuffer dest);
+
+ /**
+ * Write the ABGR color directly out to a ByteBuffer
+ * @param dest the buffer to write to
+ */
+ public void writeABGR(ByteBuffer dest);
+
+ /**
+ * Write the BGR color directly out to a ByteBuffer
+ * @param dest the buffer to write to
+ */
+ public void writeBGR(ByteBuffer dest);
+
+ /**
+ * Write the BGRA color directly out to a ByteBuffer
+ * @param dest the buffer to write to
+ */
+ public void writeBGRA(ByteBuffer dest);
+
+ /**
+ * Write the ARGB color directly out to a ByteBuffer
+ * @param dest the buffer to write to
+ */
+ public void writeARGB(ByteBuffer dest);
+
+ /*
+ * Some standard colors
+ */
+ public static final ReadableColor RED = new Color(255, 0, 0);
+ public static final ReadableColor ORANGE = new Color(255, 128, 0);
+ public static final ReadableColor YELLOW = new Color(255, 255, 0);
+ public static final ReadableColor GREEN = new Color(0, 255, 0);
+ public static final ReadableColor CYAN = new Color(0, 255, 255);
+ public static final ReadableColor BLUE = new Color(0, 0, 255);
+ public static final ReadableColor PURPLE = new Color(255, 0, 255);
+ public static final ReadableColor WHITE = new Color(255, 255, 255);
+ public static final ReadableColor BLACK = new Color(0, 0, 0);
+ public static final ReadableColor LTGREY = new Color(192, 192, 192);
+ public static final ReadableColor DKGREY = new Color(64, 64, 64);
+ public static final ReadableColor GREY = new Color(128, 128, 128);
+
+
+
+}
diff --git a/src/java/org/lwjgl/util/ReadableDimension.java b/src/java/org/lwjgl/util/ReadableDimension.java
new file mode 100644
index 00000000..5d65f8a2
--- /dev/null
+++ b/src/java/org/lwjgl/util/ReadableDimension.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2003 Shaven Puppy Ltd
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'Shaven Puppy' nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.lwjgl.util;
+
+/**
+ * $Id$
+ * Readonly interface for Dimensions
+ * @author $Author$
+ * @version $Revision$
+
+ */
+public interface ReadableDimension {
+
+ /**
+ * Get the width
+ * @return int
+ */
+ public int getWidth();
+
+ /**
+ * Get the height
+ * @return int
+ */
+ public int getHeight();
+
+ /**
+ * Copy this ReadableDimension into a destination Dimension
+ * @param dest The destination
+ */
+ public void getSize(WritableDimension dest);
+
+}
diff --git a/src/java/org/lwjgl/util/ReadablePoint.java b/src/java/org/lwjgl/util/ReadablePoint.java
new file mode 100644
index 00000000..b63fd1ea
--- /dev/null
+++ b/src/java/org/lwjgl/util/ReadablePoint.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2003 Shaven Puppy Ltd
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'Shaven Puppy' nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.lwjgl.util;
+
+/**
+ * $Id$
+ * Readonly interface for Points
+ * @author $Author$
+ * @version $Revision$
+
+ */
+public interface ReadablePoint {
+
+ /**
+ * @return int
+ */
+ public int getX();
+
+ /**
+ * @return int
+ */
+ public int getY();
+
+ /**
+ * Copy this ReadablePoint into a destination Point
+ * @param dest The destination Point, or null, to create a new Point
+ */
+ public void getLocation(WritablePoint dest);
+}
diff --git a/src/java/org/lwjgl/util/ReadableRectangle.java b/src/java/org/lwjgl/util/ReadableRectangle.java
new file mode 100644
index 00000000..426427f9
--- /dev/null
+++ b/src/java/org/lwjgl/util/ReadableRectangle.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2003 Shaven Puppy Ltd
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'Shaven Puppy' nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.lwjgl.util;
+
+/**
+ * $Id$
+ * Readonly interface for Rectangles
+ * @author $Author$
+ * @version $Revision$
+
+ */
+public interface ReadableRectangle extends ReadableDimension, ReadablePoint {
+
+ /**
+ * Copy this readable rectangle's bounds into a destination Rectangle
+ * @param dest The destination Rectangle, or null, to create a new Rectangle
+ */
+ public void getBounds(WritableRectangle dest);
+
+}
diff --git a/src/java/org/lwjgl/util/Rectangle.java b/src/java/org/lwjgl/util/Rectangle.java
new file mode 100644
index 00000000..d4c9f485
--- /dev/null
+++ b/src/java/org/lwjgl/util/Rectangle.java
@@ -0,0 +1,578 @@
+/*
+ * Copyright (c) 2002 Shaven Puppy Ltd
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'Shaven Puppy' nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.lwjgl.util;
+
+import java.io.Serializable;
+
+/**
+ * $Id$
+ * A 2D integer Rectangle class which looks remarkably like an AWT one.
+ * @author $Author$
+ * @version $Revision$
+
+ */
+public final class Rectangle implements ReadableRectangle, WritableRectangle, Serializable {
+
+ static final long serialVersionUID = 1L;
+
+ /** Rectangle's bounds */
+ private int x, y, width, height;
+
+ /**
+ * Constructor for Rectangle.
+ */
+ public Rectangle() {
+ super();
+ }
+ /**
+ * Constructor for Rectangle.
+ */
+ public Rectangle(int x, int y, int w, int h) {
+ this.x = x;
+ this.y = y;
+ this.width = w;
+ this.height = h;
+ }
+ /**
+ * Constructor for Rectangle.
+ */
+ public Rectangle(ReadablePoint p, ReadableDimension d) {
+ x = p.getX();
+ y = p.getY();
+ width = d.getWidth();
+ height = d.getHeight();
+ }
+ /**
+ * Constructor for Rectangle.
+ */
+ public Rectangle(ReadableRectangle r) {
+ x = r.getX();
+ y = r.getY();
+ width = r.getWidth();
+ height = r.getHeight();
+ }
+
+ public void setLocation(int x, int y) {
+ this.x = x;
+ this.y = y;
+ }
+
+ public void setLocation(ReadablePoint p) {
+ this.x = p.getX();
+ this.y = p.getY();
+ }
+
+ public void setSize(int w, int h) {
+ this.width = w;
+ this.height = h;
+ }
+
+ public void setSize(ReadableDimension d) {
+ this.width = d.getWidth();
+ this.height = d.getHeight();
+ }
+
+ public void setBounds(int x, int y, int w, int h) {
+ this.x = x;
+ this.y = y;
+ this.width = w;
+ this.height = h;
+ }
+
+ public void setBounds(ReadablePoint p, ReadableDimension d) {
+ x = p.getX();
+ y = p.getY();
+ width = d.getWidth();
+ height = d.getHeight();
+ }
+
+ public void setBounds(ReadableRectangle r) {
+ x = r.getX();
+ y = r.getY();
+ width = r.getWidth();
+ height = r.getHeight();
+ }
+
+ /* (Overrides)
+ * @see com.shavenpuppy.jglib.ReadableRectangle#getBounds(com.shavenpuppy.jglib.Rectangle)
+ */
+ public void getBounds(WritableRectangle dest) {
+ dest.setBounds(x, y, width, height);
+ }
+
+ /* (Overrides)
+ * @see com.shavenpuppy.jglib.ReadablePoint#getLocation(com.shavenpuppy.jglib.Point)
+ */
+ public void getLocation(WritablePoint dest) {
+ dest.setLocation(x, y);
+ }
+
+ /* (Overrides)
+ * @see com.shavenpuppy.jglib.ReadableDimension#getSize(com.shavenpuppy.jglib.Dimension)
+ */
+ public void getSize(WritableDimension dest) {
+ dest.setSize(width, height);
+ }
+
+ /**
+ * Translate the rectangle by an amount.
+ * @param x, y The translation amount
+ */
+ public void translate(int x, int y) {
+ this.x += x;
+ this.y += y;
+ }
+
+ /**
+ * Translate the rectangle by an amount.
+ * @param point The translation amount
+ */
+ public void translate(ReadablePoint point) {
+ this.x += point.getX();
+ this.y += point.getY();
+ }
+
+ /**
+ * Un-translate the rectangle by an amount.
+ * @param point The translation amount
+ */
+ public void untranslate(ReadablePoint point) {
+ this.x -= point.getX();
+ this.y -= point.getY();
+ }
+
+ /**
+ * Checks whether or not this Rectangle contains the
+ * specified Point.
+ * @param p the Point to test
+ * @return true if the Point
+ * (x, y) is inside this
+ * Rectangle;
+ * false otherwise.
+ */
+ public boolean contains(ReadablePoint p) {
+ return contains(p.getX(), p.getY());
+ }
+
+ /**
+ * Checks whether or not this Rectangle contains the
+ * point at the specified location
+ * (x, y).
+ * @param X, Y the specified coordinates
+ * @return true if the point
+ * (x, y) is inside this
+ * Rectangle;
+ * false otherwise.
+ */
+ public boolean contains(int X, int Y) {
+ int w = this.width;
+ int h = this.height;
+ if ((w | h) < 0) {
+ // At least one of the dimensions is negative...
+ return false;
+ }
+ // Note: if either dimension is zero, tests below must return false...
+ int x = this.x;
+ int y = this.y;
+ if (X < x || Y < y) {
+ return false;
+ }
+ w += x;
+ h += y;
+ // overflow || intersect
+ return ((w < x || w > X) && (h < y || h > Y));
+ }
+
+ /**
+ * Checks whether or not this Rectangle entirely contains
+ * the specified Rectangle.
+ * @param r the specified Rectangle
+ * @return true if the Rectangle
+ * is contained entirely inside this Rectangle;
+ * false otherwise.
+ */
+ public boolean contains(ReadableRectangle r) {
+ return contains(r.getX(), r.getY(), r.getWidth(), r.getHeight());
+ }
+
+ /**
+ * Checks whether this Rectangle entirely contains
+ * the Rectangle
+ * at the specified location (X, Y) with the
+ * specified dimensions (W, H).
+ * @param X, Y the specified coordinates
+ * @param W the width of the Rectangle
+ * @param H the height of the Rectangle
+ * @return true if the Rectangle specified by
+ * (X, Y, W, H)
+ * is entirely enclosed inside this Rectangle;
+ * false otherwise.
+ */
+ public boolean contains(int X, int Y, int W, int H) {
+ int w = this.width;
+ int h = this.height;
+ if ((w | h | W | H) < 0) {
+ // At least one of the dimensions is negative...
+ return false;
+ }
+ // Note: if any dimension is zero, tests below must return false...
+ int x = this.x;
+ int y = this.y;
+ if (X < x || Y < y) {
+ return false;
+ }
+ w += x;
+ W += X;
+ if (W <= X) {
+ // X+W overflowed or W was zero, return false if...
+ // either original w or W was zero or
+ // x+w did not overflow or
+ // the overflowed x+w is smaller than the overflowed X+W
+ if (w >= x || W > w)
+ return false;
+ } else {
+ // X+W did not overflow and W was not zero, return false if...
+ // original w was zero or
+ // x+w did not overflow and x+w is smaller than X+W
+ if (w >= x && W > w)
+ return false;
+ }
+ h += y;
+ H += Y;
+ if (H <= Y) {
+ if (h >= y || H > h)
+ return false;
+ } else {
+ if (h >= y && H > h)
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Determines whether or not this Rectangle and the specified
+ * Rectangle intersect. Two rectangles intersect if
+ * their intersection is nonempty.
+ *
+ * @param r the specified Rectangle
+ * @return true if the specified Rectangle
+ * and this Rectangle intersect;
+ * false otherwise.
+ */
+ public boolean intersects(ReadableRectangle r) {
+ int tw = this.width;
+ int th = this.height;
+ int rw = r.getWidth();
+ int rh = r.getHeight();
+ if (rw <= 0 || rh <= 0 || tw <= 0 || th <= 0) {
+ return false;
+ }
+ int tx = this.x;
+ int ty = this.y;
+ int rx = r.getX();
+ int ry = r.getY();
+ rw += rx;
+ rh += ry;
+ tw += tx;
+ th += ty;
+ // overflow || intersect
+ return ((rw < rx || rw > tx) && (rh < ry || rh > ty) && (tw < tx || tw > rx) && (th < ty || th > ry));
+ }
+
+ /**
+ * Computes the intersection of this Rectangle with the
+ * specified Rectangle. Returns a new Rectangle
+ * that represents the intersection of the two rectangles.
+ * If the two rectangles do not intersect, the result will be
+ * an empty rectangle.
+ *
+ * @param r the specified Rectangle
+ * @return the largest Rectangle contained in both the
+ * specified Rectangle and in
+ * this Rectangle; or if the rectangles
+ * do not intersect, an empty rectangle.
+ */
+ public Rectangle intersection(ReadableRectangle r, Rectangle dest) {
+ int tx1 = this.x;
+ int ty1 = this.y;
+ int rx1 = r.getX();
+ int ry1 = r.getY();
+ long tx2 = tx1;
+ tx2 += this.width;
+ long ty2 = ty1;
+ ty2 += this.height;
+ long rx2 = rx1;
+ rx2 += r.getWidth();
+ long ry2 = ry1;
+ ry2 += r.getHeight();
+ if (tx1 < rx1)
+ tx1 = rx1;
+ if (ty1 < ry1)
+ ty1 = ry1;
+ if (tx2 > rx2)
+ tx2 = rx2;
+ if (ty2 > ry2)
+ ty2 = ry2;
+ tx2 -= tx1;
+ ty2 -= ty1;
+ // tx2,ty2 will never overflow (they will never be
+ // larger than the smallest of the two source w,h)
+ // they might underflow, though...
+ if (tx2 < Integer.MIN_VALUE)
+ tx2 = Integer.MIN_VALUE;
+ if (ty2 < Integer.MIN_VALUE)
+ ty2 = Integer.MIN_VALUE;
+ if (dest == null)
+ dest = new Rectangle(tx1, ty1, (int) tx2, (int) ty2);
+ else
+ dest.setBounds(tx1, ty1, (int) tx2, (int) ty2);
+ return dest;
+
+ }
+
+ /**
+ * Computes the union of this Rectangle with the
+ * specified Rectangle. Returns a new
+ * Rectangle that
+ * represents the union of the two rectangles
+ * @param r the specified Rectangle
+ * @return the smallest Rectangle containing both
+ * the specified Rectangle and this
+ * Rectangle.
+ */
+ public WritableRectangle union(ReadableRectangle r, WritableRectangle dest) {
+ int x1 = Math.min(x, r.getX());
+ int x2 = Math.max(x + width, r.getX() + r.getWidth());
+ int y1 = Math.min(y, r.getY());
+ int y2 = Math.max(y + height, r.getY() + r.getHeight());
+ dest.setBounds(x1, y1, x2 - x1, y2 - y1);
+ return dest;
+ }
+
+ /**
+ * Adds a point, specified by the integer arguments newx
+ * and newy, to this Rectangle. The
+ * resulting Rectangle is
+ * the smallest Rectangle that contains both the
+ * original Rectangle and the specified point.
+ *
+ * After adding a point, a call to contains with the
+ * added point as an argument does not necessarily return
+ * true. The contains method does not
+ * return true for points on the right or bottom
+ * edges of a Rectangle. Therefore, if the added point
+ * falls on the right or bottom edge of the enlarged
+ * Rectangle, contains returns
+ * false for that point.
+ * @param newx, newy the coordinates of the new point
+ */
+ public void add(int newx, int newy) {
+ int x1 = Math.min(x, newx);
+ int x2 = Math.max(x + width, newx);
+ int y1 = Math.min(y, newy);
+ int y2 = Math.max(y + height, newy);
+ x = x1;
+ y = y1;
+ width = x2 - x1;
+ height = y2 - y1;
+ }
+
+ /**
+ * Adds the specified Point to this
+ * Rectangle. The resulting Rectangle
+ * is the smallest Rectangle that contains both the
+ * original Rectangle and the specified
+ * Point.
+ *
+ * After adding a Point, a call to contains
+ * with the added Point as an argument does not
+ * necessarily return true. The contains
+ * method does not return true for points on the right
+ * or bottom edges of a Rectangle. Therefore if the added
+ * Point falls on the right or bottom edge of the
+ * enlarged Rectangle, contains returns
+ * false for that Point.
+ * @param pt the new Point to add to this
+ * Rectangle
+ */
+ public void add(ReadablePoint pt) {
+ add(pt.getX(), pt.getY());
+ }
+
+ /**
+ * Adds a Rectangle to this Rectangle.
+ * The resulting Rectangle is the union of the two
+ * rectangles.
+ * @param r the specified Rectangle
+ */
+ public void add(ReadableRectangle r) {
+ int x1 = Math.min(x, r.getX());
+ int x2 = Math.max(x + width, r.getX() + r.getWidth());
+ int y1 = Math.min(y, r.getY());
+ int y2 = Math.max(y + height, r.getY() + r.getHeight());
+ x = x1;
+ y = y1;
+ width = x2 - x1;
+ height = y2 - y1;
+ }
+
+ /**
+ * Resizes the Rectangle both horizontally and vertically.
+ *
+ * This method modifies the Rectangle so that it is
+ * h units larger on both the left and right side,
+ * and v units larger at both the top and bottom.
+ *
+ * The new Rectangle has (x - h,
+ * y - v) as its top-left corner, a
+ * width of
+ * width + 2h,
+ * and a height of
+ * height + 2v.
+ *
+ * If negative values are supplied for h and
+ * v, the size of the Rectangle
+ * decreases accordingly.
+ * The grow method does not check whether the resulting
+ * values of width and height are
+ * non-negative.
+ * @param h the horizontal expansion
+ * @param v the vertical expansion
+ */
+ public void grow(int h, int v) {
+ x -= h;
+ y -= v;
+ width += h * 2;
+ height += v * 2;
+ }
+
+ /**
+ * Determines whether or not this Rectangle is empty. A
+ * Rectangle is empty if its width or its height is less
+ * than or equal to zero.
+ * @return true if this Rectangle is empty;
+ * false otherwise.
+ */
+ public boolean isEmpty() {
+ return (width <= 0) || (height <= 0);
+ }
+ /**
+ * Checks whether two rectangles are equal.
+ *
+ * The result is true if and only if the argument is not
+ * null and is a Rectangle object that has the
+ * same top-left corner, width, and height as this Rectangle.
+ * @param obj the Object to compare with
+ * this Rectangle
+ * @return true if the objects are equal;
+ * false otherwise.
+ */
+ public boolean equals(Object obj) {
+ if (obj instanceof Rectangle) {
+ Rectangle r = (Rectangle) obj;
+ return ((x == r.x) && (y == r.y) && (width == r.width) && (height == r.height));
+ }
+ return super.equals(obj);
+ }
+
+ /**
+ * Debugging
+ * @return a String
+ */
+ public String toString() {
+ return getClass().getName() + "[x=" + x + ",y=" + y + ",width=" + width + ",height=" + height + "]";
+ }
+ /**
+ * Gets the height.
+ * @return Returns a int
+ */
+ public int getHeight() {
+ return height;
+ }
+
+ /**
+ * Sets the height.
+ * @param height The height to set
+ */
+ public void setHeight(int height) {
+ this.height = height;
+ }
+
+ /**
+ * Gets the width.
+ * @return Returns a int
+ */
+ public int getWidth() {
+ return width;
+ }
+
+ /**
+ * Sets the width.
+ * @param width The width to set
+ */
+ public void setWidth(int width) {
+ this.width = width;
+ }
+
+ /**
+ * Gets the x.
+ * @return Returns a int
+ */
+ public int getX() {
+ return x;
+ }
+
+ /**
+ * Sets the x.
+ * @param x The x to set
+ */
+ public void setX(int x) {
+ this.x = x;
+ }
+
+ /**
+ * Gets the y.
+ * @return Returns a int
+ */
+ public int getY() {
+ return y;
+ }
+
+ /**
+ * Sets the y.
+ * @param y The y to set
+ */
+ public void setY(int y) {
+ this.y = y;
+ }
+
+}
diff --git a/src/java/org/lwjgl/util/WritableColor.java b/src/java/org/lwjgl/util/WritableColor.java
new file mode 100644
index 00000000..fdade08f
--- /dev/null
+++ b/src/java/org/lwjgl/util/WritableColor.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 2003 Shaven Puppy Ltd
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'Shaven Puppy' nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.lwjgl.util;
+
+import java.nio.ByteBuffer;
+
+/**
+ * $Id$
+ * Write interface for Colors
+ * @author $Author$
+ * @version $Revision$
+
+ */
+public interface WritableColor {
+ /**
+ * Set a color
+ */
+ public void set(int r, int g, int b, int a);
+ /**
+ * Set a color
+ */
+ public void set(byte r, byte g, byte b, byte a);
+ /**
+ * Set a color
+ */
+ public void set(int r, int g, int b);
+ /**
+ * Set a color
+ */
+ public void set(byte r, byte g, byte b);
+ /**
+ * Set the Red component
+ */
+ public void setRed(int red);
+ /**
+ * Set the Green component
+ */
+ public void setGreen(int green);
+ /**
+ * Set the Blue component
+ */
+ public void setBlue(int blue);
+ /**
+ * Set the Alpha component
+ */
+ public void setAlpha(int alpha);
+ /**
+ * Set the Red component
+ */
+ public void setRed(byte red);
+ /**
+ * Set the Green component
+ */
+ public void setGreen(byte green);
+ /**
+ * Set the Blue component
+ */
+ public void setBlue(byte blue);
+ /**
+ * Set the Alpha component
+ */
+ public void setAlpha(byte alpha);
+ /**
+ * Read a color from a byte buffer
+ * @param src The source buffer
+ */
+ public void readRGBA(ByteBuffer src);
+ /**
+ * Read a color from a byte buffer
+ * @param src The source buffer
+ */
+ public void readRGB(ByteBuffer src);
+ /**
+ * Read a color from a byte buffer
+ * @param src The source buffer
+ */
+ public void readARGB(ByteBuffer src);
+ /**
+ * Read a color from a byte buffer
+ * @param src The source buffer
+ */
+ public void readBGRA(ByteBuffer src);
+ /**
+ * Read a color from a byte buffer
+ * @param src The source buffer
+ */
+ public void readBGR(ByteBuffer src);
+ /**
+ * Read a color from a byte buffer
+ * @param src The source buffer
+ */
+ public void readABGR(ByteBuffer src);
+ /**
+ * Set this color's color by copying another color
+ * @param src The source color
+ */
+ public void setColor(ReadableColor src);
+}
\ No newline at end of file
diff --git a/src/java/org/lwjgl/util/WritableDimension.java b/src/java/org/lwjgl/util/WritableDimension.java
new file mode 100644
index 00000000..1cb58000
--- /dev/null
+++ b/src/java/org/lwjgl/util/WritableDimension.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2003 Shaven Puppy Ltd
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'Shaven Puppy' nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.lwjgl.util;
+
+/**
+ * $Id$
+ * Write interface for Dimensions
+ * @author $Author$
+ * @version $Revision$
+
+ */
+public interface WritableDimension {
+ public void setSize(int w, int h);
+ public void setSize(ReadableDimension d);
+ /**
+ * Sets the height.
+ * @param height The height to set
+ */
+ public void setHeight(int height);
+ /**
+ * Sets the width.
+ * @param width The width to set
+ */
+ public void setWidth(int width);
+}
\ No newline at end of file
diff --git a/src/java/org/lwjgl/util/WritablePoint.java b/src/java/org/lwjgl/util/WritablePoint.java
new file mode 100644
index 00000000..016a4ae8
--- /dev/null
+++ b/src/java/org/lwjgl/util/WritablePoint.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2003 Shaven Puppy Ltd
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'Shaven Puppy' nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.lwjgl.util;
+
+/**
+ * $Id$
+ * Write interface for Points
+ * @author $Author$
+ * @version $Revision$
+ */
+public interface WritablePoint {
+ public void setLocation(int x, int y);
+ public void setLocation(ReadablePoint p);
+ public void setX(int x);
+ public void setY(int y);
+}
\ No newline at end of file
diff --git a/src/java/org/lwjgl/util/WritableRectangle.java b/src/java/org/lwjgl/util/WritableRectangle.java
new file mode 100644
index 00000000..7bb17ad8
--- /dev/null
+++ b/src/java/org/lwjgl/util/WritableRectangle.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2003 Shaven Puppy Ltd
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'Shaven Puppy' nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package org.lwjgl.util;
+
+/**
+ * $Id$
+ * Write interface for Rectangles
+ * @author $Author$
+ * @version $Revision$
+ */
+public interface WritableRectangle extends WritablePoint, WritableDimension {
+
+ /**
+ * Sets the bounds of the rectangle
+ * @param x, y, width, height
+ */
+ public void setBounds(int x, int y, int width, int height);
+
+ /**
+ * Sets the bounds of the rectangle
+ * @param location
+ * @param size
+ */
+ public void setBounds(ReadablePoint location, ReadableDimension size);
+
+ /**
+ * Sets the bounds of the rectangle
+ * @param src
+ */
+ public void setBounds(ReadableRectangle src);
+}
diff --git a/src/java/org/lwjgl/util/model/BonedModel.java b/src/java/org/lwjgl/util/model/BonedModel.java
index b28a0326..39a5e93d 100644
--- a/src/java/org/lwjgl/util/model/BonedModel.java
+++ b/src/java/org/lwjgl/util/model/BonedModel.java
@@ -34,6 +34,7 @@ package org.lwjgl.util.model;
import java.util.Map;
+import org.lwjgl.util.Color;
import org.lwjgl.util.vector.Vector2f;
@@ -60,11 +61,12 @@ public class BonedModel extends Model {
* @param material
* @param triangle
* @param skin[]
+ * @param color[]
* @param animation
* @param vertex
*/
- public BonedModel(String material, Triangle[] triangle, Vector2f[] skin, Map animation, BonedVertex[] vertex) {
- super(material, triangle, skin, animation);
+ public BonedModel(String material, Triangle[] triangle, Vector2f[] skin, Color[] color, Map animation, BonedVertex[] vertex) {
+ super(material, triangle, skin, color, animation);
this.vertex = vertex;
}
diff --git a/src/java/org/lwjgl/util/model/MeshedModel.java b/src/java/org/lwjgl/util/model/MeshedModel.java
index 4fbe5f9f..2ba2e710 100644
--- a/src/java/org/lwjgl/util/model/MeshedModel.java
+++ b/src/java/org/lwjgl/util/model/MeshedModel.java
@@ -34,6 +34,7 @@ package org.lwjgl.util.model;
import java.util.Map;
+import org.lwjgl.util.Color;
import org.lwjgl.util.vector.Vector2f;
@@ -57,10 +58,11 @@ public class MeshedModel extends Model {
* @param material
* @param triangle
* @param skin[]
+ * @param color[]
* @param animation
*/
- public MeshedModel(String material, Triangle[] triangle, Vector2f[] skin, Map animation) {
- super(material, triangle, skin, animation);
+ public MeshedModel(String material, Triangle[] triangle, Vector2f[] skin, Color[] color, Map animation) {
+ super(material, triangle, skin, color, animation);
}
}
diff --git a/src/java/org/lwjgl/util/model/Model.java b/src/java/org/lwjgl/util/model/Model.java
index 200f9050..24b49787 100644
--- a/src/java/org/lwjgl/util/model/Model.java
+++ b/src/java/org/lwjgl/util/model/Model.java
@@ -35,6 +35,7 @@ package org.lwjgl.util.model;
import java.io.Serializable;
import java.util.Map;
+import org.lwjgl.util.Color;
import org.lwjgl.util.vector.Vector2f;
@@ -60,6 +61,9 @@ public abstract class Model implements Serializable {
/** Skin */
private final Vector2f[] skin;
+ /** Colour */
+ private final Color[] color;
+
/** The animations: a Map of string names to Frame[] arrays */
private final Map animation;
@@ -68,12 +72,14 @@ public abstract class Model implements Serializable {
* @param material
* @param triangle
* @param skin[]
+ * @param color[]
* @param animation
*/
- public Model(String material, Triangle[] triangle, Vector2f[] skin, Map animation) {
+ public Model(String material, Triangle[] triangle, Vector2f[] skin, Color[] color, Map animation) {
this.material = material;
this.triangle = triangle;
this.skin = skin;
+ this.color = color;
this.animation = animation;
}
@@ -107,4 +113,12 @@ public abstract class Model implements Serializable {
return skin;
}
+ /**
+ * @return Returns the color
+ */
+ public final Color[] getColor() {
+ return color;
+ }
+
+
}
diff --git a/src/java/org/lwjgl/util/model/loader/Loader.java b/src/java/org/lwjgl/util/model/loader/Loader.java
index ad3695ab..f79bd52a 100644
--- a/src/java/org/lwjgl/util/model/loader/Loader.java
+++ b/src/java/org/lwjgl/util/model/loader/Loader.java
@@ -36,6 +36,7 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import org.lwjgl.util.Color;
import org.lwjgl.util.model.*;
import org.lwjgl.util.model.BoneFrame;
import org.lwjgl.util.model.BonedModel;
@@ -92,6 +93,7 @@ public class Loader {
material,
loadTriangles(),
loadSkin(),
+ loadColor(),
loadBoneAnimations(),
loadBonedVertices()
);
@@ -101,6 +103,7 @@ public class Loader {
material,
loadTriangles(),
loadSkin(),
+ loadColor(),
loadMeshAnimations()
);
} else {
@@ -149,6 +152,28 @@ public class Loader {
return skins;
}
+ /**
+ * Load the colour
+ * @return Color[]
+ * @throws Exception
+ */
+ private Color[] loadColor() throws Exception {
+ List colorElements = XMLUtil.getChildren(src.getDocumentElement(), "color");
+ if (colorElements.size() == 0) {
+ return null;
+ }
+ if (colorElements.size() != numVertices) {
+ throw new Exception("Color count incorrect, got "+colorElements.size()+", expected "+numVertices);
+ }
+ Color[] colors = new Color[colorElements.size()];
+ int colorCount = 0;
+ for (Iterator i = colorElements.iterator(); i.hasNext(); ) {
+ Element colorElement = (Element) i.next();
+ colors[colorCount++] = loadColor(colorElement);
+ }
+ return colors;
+ }
+
/**
* Load all the Triangles
* @return Triangle[]
@@ -317,6 +342,21 @@ public class Loader {
);
}
+ /**
+ * Load a colour from XML
+ * @param element
+ * @return a Color
+ * @throws Exception
+ */
+ private Color loadColor(Element element) throws Exception {
+ return new Color(
+ XMLUtil.getInt(element, "r"),
+ XMLUtil.getInt(element, "g"),
+ XMLUtil.getInt(element, "b"),
+ XMLUtil.getInt(element, "a", 255)
+ );
+ }
+
/**
* Load a boned Animation from XML
* @param element