62 lines
1.7 KiB
Java
62 lines
1.7 KiB
Java
package ar.com.hjg.pngj.chunks;
|
|
|
|
import java.io.ByteArrayOutputStream;
|
|
import java.io.IOException;
|
|
|
|
import ar.com.hjg.pngj.ImageInfo;
|
|
import ar.com.hjg.pngj.PngjException;
|
|
|
|
/**
|
|
* zTXt chunk.
|
|
* <p>
|
|
* see http://www.w3.org/TR/PNG/#11zTXt
|
|
*/
|
|
public class PngChunkZTXT extends PngChunkTextVar {
|
|
public final static String ID = ChunkHelper.zTXt;
|
|
|
|
// http://www.w3.org/TR/PNG/#11zTXt
|
|
public PngChunkZTXT(ImageInfo info) {
|
|
super(ID, info);
|
|
}
|
|
|
|
@Override
|
|
public ChunkRaw createRawChunk() {
|
|
if (key == null || key.trim().length() == 0)
|
|
throw new PngjException("Text chunk key must be non empty");
|
|
try {
|
|
ByteArrayOutputStream ba = new ByteArrayOutputStream();
|
|
ba.write(ChunkHelper.toBytes(key));
|
|
ba.write(0); // separator
|
|
ba.write(0); // compression method: 0
|
|
byte[] textbytes = ChunkHelper.compressBytes(ChunkHelper.toBytes(val), true);
|
|
ba.write(textbytes);
|
|
byte[] b = ba.toByteArray();
|
|
ChunkRaw chunk = createEmptyChunk(b.length, false);
|
|
chunk.data = b;
|
|
return chunk;
|
|
} catch (IOException e) {
|
|
throw new PngjException(e);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void parseFromRaw(ChunkRaw c) {
|
|
int nullsep = -1;
|
|
for (int i = 0; i < c.data.length; i++) { // look for first zero
|
|
if (c.data[i] != 0)
|
|
continue;
|
|
nullsep = i;
|
|
break;
|
|
}
|
|
if (nullsep < 0 || nullsep > c.data.length - 2)
|
|
throw new PngjException("bad zTXt chunk: no separator found");
|
|
key = ChunkHelper.toString(c.data, 0, nullsep);
|
|
int compmet = (int) c.data[nullsep + 1];
|
|
if (compmet != 0)
|
|
throw new PngjException("bad zTXt chunk: unknown compression method");
|
|
byte[] uncomp = ChunkHelper.compressBytes(c.data, nullsep + 2, c.data.length - nullsep - 2, false); // uncompress
|
|
val = ChunkHelper.toString(uncomp);
|
|
}
|
|
|
|
}
|