aboutsummaryrefslogtreecommitdiffstats
path: root/src/jake2/imageio/PCX.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/jake2/imageio/PCX.java')
-rw-r--r--src/jake2/imageio/PCX.java229
1 files changed, 229 insertions, 0 deletions
diff --git a/src/jake2/imageio/PCX.java b/src/jake2/imageio/PCX.java
new file mode 100644
index 0000000..eb71465
--- /dev/null
+++ b/src/jake2/imageio/PCX.java
@@ -0,0 +1,229 @@
+/*
+ * Created on Nov 18, 2003
+ *
+ */
+package jake2.imageio;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+/**
+ * @author cwei
+ *
+ */
+public class PCX {
+
+ public static final int HEADER_SIZE = 128;
+
+ /**
+ * <code>
+ typedef struct
+ {
+ char manufacturer;
+ char version;
+ char encoding;
+ char bits_per_pixel;
+ unsigned short xmin,ymin,xmax,ymax;
+ unsigned short horzRes,vertRes;
+ unsigned char palette[48];
+ char reserved;
+ char color_planes;
+ unsigned short bytes_per_line;
+ unsigned short palette_type;
+ char filler[58];
+ unsigned char data; // unbounded
+ } pcx_t;
+
+ </code>
+ */
+ public static class Header {
+
+ // size of byte arrays
+ static final int PALETTE_SIZE = 48;
+ static final int FILLER_SIZE = 58;
+
+ byte manufacturer;
+ byte version;
+ byte encoding;
+ byte bitsPerPixel;
+ int xmin, ymin, xmax, ymax; // unsigned short
+ int horzRes, vertRes; // unsigned short
+ byte[] palette; //unsigned byte
+ byte reserved;
+ byte colorPlanes;
+ int bytesPerLine; // unsigned short
+ int paletteType; // unsigned short
+ byte[] filler;
+
+
+
+ public Header(byte[] headerBytes) {
+ if (headerBytes == null || headerBytes.length != 128) {
+ throw new IllegalArgumentException("invalid quake2 pcx header");
+ }
+
+ ByteBuffer b = ByteBuffer.wrap(headerBytes);
+ // is stored as little endian
+ b.order(ByteOrder.LITTLE_ENDIAN);
+
+ // fill header
+ manufacturer = b.get();
+ version = b.get();
+ encoding = b.get();
+ bitsPerPixel = b.get();
+ xmin = b.getShort() & 0xffff;
+ ymin = b.getShort() & 0xffff;
+ xmax = b.getShort() & 0xffff;
+ ymax = b.getShort() & 0xffff;
+ horzRes = b.getShort() & 0xffff;
+ vertRes = b.getShort() & 0xffff;
+ b.get(palette = new byte[PALETTE_SIZE]);
+ reserved = b.get();
+ colorPlanes = b.get();
+ bytesPerLine = b.getShort() & 0xffff;
+ paletteType = b.getShort() & 0xffff;
+ b.get(filler = new byte[FILLER_SIZE]);
+
+ // check some attributes
+ checkHeader();
+ }
+
+ private void checkHeader() {
+
+ if (this.getManufacturer() != 0x0a
+ || this.getVersion() != 5
+ || this.getEncoding() != 1
+ || this.getBitsPerPixel() != 8
+ || this.getXmax() >= 640
+ || this.getYmax() >= 480) {
+ throw new IllegalArgumentException("invalid quake2 pcx header");
+ }
+ }
+
+ /**
+ * @return
+ */
+ public byte getBitsPerPixel() {
+ return bitsPerPixel;
+ }
+
+ /**
+ * @return
+ */
+ public int getBytesPerLine() {
+ return bytesPerLine;
+ }
+
+ /**
+ * @return
+ */
+ public byte getColorPlanes() {
+ return colorPlanes;
+ }
+
+ /**
+ * @return
+ */
+ public byte getEncoding() {
+ return encoding;
+ }
+
+ /**
+ * @return
+ */
+ public byte[] getFiller() {
+ return filler;
+ }
+
+ /**
+ * @return
+ */
+ public int getHeight() {
+ return ymax - ymin + 1;
+ }
+
+ /**
+ * @return
+ */
+ public byte getManufacturer() {
+ return manufacturer;
+ }
+
+ /**
+ * @return
+ */
+ public byte[] getPalette() {
+ return palette;
+ }
+
+ /**
+ * @return
+ */
+ public int getPaletteType() {
+ return paletteType;
+ }
+
+ /**
+ * @return
+ */
+ public byte getReserved() {
+ return reserved;
+ }
+
+ /**
+ * @return
+ */
+ public byte getVersion() {
+ return version;
+ }
+
+ /**
+ * @return
+ */
+ public int getWidth() {
+ return xmax - xmin + 1;
+ }
+
+ /**
+ * @return
+ */
+ public int getXmax() {
+ return xmax;
+ }
+
+ /**
+ * @return
+ */
+ public int getXmin() {
+ return xmin;
+ }
+
+ /**
+ * @return
+ */
+ public int getYmax() {
+ return ymax;
+ }
+
+ /**
+ * @return
+ */
+ public int getYmin() {
+ return ymin;
+ }
+ /**
+ * @return
+ */
+ public int getHorzRes() {
+ return horzRes;
+ }
+
+ /**
+ * @return
+ */
+ public int getVertRes() {
+ return vertRes;
+ }
+
+ }
+} \ No newline at end of file