package ar.com.hjg.pngj.chunks; import ar.com.hjg.pngj.ImageInfo; import ar.com.hjg.pngj.PngHelperInternal; import ar.com.hjg.pngj.PngjException; /** * bKGD Chunk. *

* see {@link http://www.w3.org/TR/PNG/#11bKGD} *

* This chunk structure depends on the image type */ public class PngChunkBKGD extends PngChunkSingle { public final static String ID = ChunkHelper.bKGD; // only one of these is meaningful private int gray; private int red; private int green; private int blue; private int paletteIndex; public PngChunkBKGD(ImageInfo info) { super(ChunkHelper.bKGD, info); } @Override public ChunkOrderingConstraint getOrderingConstraint() { return ChunkOrderingConstraint.AFTER_PLTE_BEFORE_IDAT; } @Override public ChunkRaw createRawChunk() { ChunkRaw c = null; if (imgInfo.greyscale) { c = createEmptyChunk(2, true); PngHelperInternal.writeInt2tobytes(gray, c.data, 0); } else if (imgInfo.indexed) { c = createEmptyChunk(1, true); c.data[0] = (byte) paletteIndex; } else { c = createEmptyChunk(6, true); PngHelperInternal.writeInt2tobytes(red, c.data, 0); PngHelperInternal.writeInt2tobytes(green, c.data, 0); PngHelperInternal.writeInt2tobytes(blue, c.data, 0); } return c; } @Override public void parseFromRaw(ChunkRaw c) { if (imgInfo.greyscale) { gray = PngHelperInternal.readInt2fromBytes(c.data, 0); } else if (imgInfo.indexed) { paletteIndex = (int) (c.data[0] & 0xff); } else { red = PngHelperInternal.readInt2fromBytes(c.data, 0); green = PngHelperInternal.readInt2fromBytes(c.data, 2); blue = PngHelperInternal.readInt2fromBytes(c.data, 4); } } /** * Set gray value (0-255 if bitdept=8) * * @param gray */ public void setGray(int gray) { if (!imgInfo.greyscale) throw new PngjException("only gray images support this"); this.gray = gray; } public int getGray() { if (!imgInfo.greyscale) throw new PngjException("only gray images support this"); return gray; } /** * Set pallette index * */ public void setPaletteIndex(int i) { if (!imgInfo.indexed) throw new PngjException("only indexed (pallete) images support this"); this.paletteIndex = i; } public int getPaletteIndex() { if (!imgInfo.indexed) throw new PngjException("only indexed (pallete) images support this"); return paletteIndex; } /** * 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"); red = r; green = g; blue = b; } public int[] getRGB() { if (imgInfo.greyscale || imgInfo.indexed) throw new PngjException("only rgb or rgba images support this"); return new int[] { red, green, blue }; } }