diff options
Diffstat (limited to 'src/jogl/classes/jogamp/opengl/util/pngj/chunks/PngChunkSBIT.java')
-rw-r--r-- | src/jogl/classes/jogamp/opengl/util/pngj/chunks/PngChunkSBIT.java | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/src/jogl/classes/jogamp/opengl/util/pngj/chunks/PngChunkSBIT.java b/src/jogl/classes/jogamp/opengl/util/pngj/chunks/PngChunkSBIT.java new file mode 100644 index 000000000..6850d260d --- /dev/null +++ b/src/jogl/classes/jogamp/opengl/util/pngj/chunks/PngChunkSBIT.java @@ -0,0 +1,124 @@ +package jogamp.opengl.util.pngj.chunks;
+
+import jogamp.opengl.util.pngj.ImageInfo;
+import jogamp.opengl.util.pngj.PngHelper;
+import jogamp.opengl.util.pngj.PngjException;
+
+/*
+ */
+public class PngChunkSBIT extends PngChunk {
+ // http://www.w3.org/TR/PNG/#11sBIT
+ // this chunk structure depends on the image type
+
+ // significant bits
+ private int graysb, alphasb;
+ private int redsb, greensb, bluesb;
+
+ public PngChunkSBIT(ImageInfo info) {
+ super(ChunkHelper.sBIT, info);
+ }
+
+ @Override
+ public boolean mustGoBeforeIDAT() {
+ return true;
+ }
+
+ @Override
+ public boolean mustGoBeforePLTE() {
+ return true;
+ }
+
+ private int getLen() {
+ int len = imgInfo.greyscale ? 1 : 3;
+ if (imgInfo.alpha)
+ len += 1;
+ return len;
+ }
+
+ @Override
+ public void parseFromChunk(ChunkRaw c) {
+ if (c.len != getLen())
+ throw new PngjException("bad chunk length " + c);
+ if (imgInfo.greyscale) {
+ graysb = PngHelper.readInt1fromByte(c.data, 0);
+ if (imgInfo.alpha)
+ alphasb = PngHelper.readInt1fromByte(c.data, 1);
+ } else {
+ redsb = PngHelper.readInt1fromByte(c.data, 0);
+ greensb = PngHelper.readInt1fromByte(c.data, 1);
+ bluesb = PngHelper.readInt1fromByte(c.data, 2);
+ if (imgInfo.alpha)
+ alphasb = PngHelper.readInt1fromByte(c.data, 3);
+ }
+ }
+
+ @Override
+ public ChunkRaw createChunk() {
+ ChunkRaw c = null;
+ c = createEmptyChunk(getLen(), true);
+ if (imgInfo.greyscale) {
+ c.data[0] = (byte) graysb;
+ if (imgInfo.alpha)
+ c.data[1] = (byte) alphasb;
+ } else {
+ c.data[0] = (byte) redsb;
+ c.data[1] = (byte) greensb;
+ c.data[2] = (byte) bluesb;
+ if (imgInfo.alpha)
+ c.data[3] = (byte) alphasb;
+ }
+ return c;
+ }
+
+ @Override
+ public void cloneDataFromRead(PngChunk other) {
+ PngChunkSBIT otherx = (PngChunkSBIT) other;
+ graysb = otherx.graysb;
+ redsb = otherx.redsb;
+ greensb = otherx.greensb;
+ bluesb = otherx.bluesb;
+ alphasb = otherx.alphasb;
+ }
+
+ public void setGraysb(int gray) {
+ if (!imgInfo.greyscale)
+ throw new PngjException("only greyscale images support this");
+ graysb = gray;
+ }
+
+ public int getGraysb() {
+ if (!imgInfo.greyscale)
+ throw new PngjException("only greyscale images support this");
+ return graysb;
+ }
+
+ public void setAlphasb(int a) {
+ if (!imgInfo.alpha)
+ throw new PngjException("only images with alpha support this");
+ alphasb = a;
+ }
+
+ public int getAlphasb() {
+ if (!imgInfo.alpha)
+ throw new PngjException("only images with alpha support this");
+ return alphasb;
+ }
+
+ /**
+ * Set rgb values
+ *
+ */
+ public void setRGB(int r, int g, int b) {
+ if (imgInfo.greyscale || imgInfo.indexed)
+ throw new PngjException("only rgb or rgba images support this");
+ redsb = r;
+ greensb = g;
+ bluesb = b;
+ }
+
+ public int[] getRGB() {
+ if (imgInfo.greyscale || imgInfo.indexed)
+ throw new PngjException("only rgb or rgba images support this");
+ return new int[] { redsb, greensb, bluesb };
+ }
+}
|