package uk.co.mmscomputing.imageio.tiff; import java.io.*; abstract public class TIFFClassFOutputStream extends FilterOutputStream implements TIFFConstants{ protected ByteArrayOutputStream buf=null; protected boolean lastByteWasZero; protected int width,height,offset,xres,yres; public TIFFClassFOutputStream(OutputStream out)throws IOException{ super(out); writeHeader(); xres=204;yres=196; } public void setXYResolution(int xres,int yres){this.xres=xres;this.yres=yres;} public void write(int cw)throws IOException{ // MH,MR,MMR code 'bytes' lastByteWasZero=(cw==0x00); // check for possible end of line code buf.write(cw); // write code word } public void write(byte[] b)throws IOException{ write(b,0,b.length); } public void write(byte[] b,int off,int len)throws IOException{ for(int i=0;i<len;i++){write(b[off+i]);} } protected void writeShort(int i) throws IOException{ out.write(i&0x000000FF); // first : LSB least significant byte out.write((i>>8)&0x000000FF); // MSB most significant byte } protected void writeInt(int i) throws IOException{ out.write(i&0x000000FF); // first : LSB least significant byte out.write((i>>8)&0x000000FF); out.write((i>>16)&0x000000FF); out.write((i>>24)&0x000000FF); // MSB most significant byte } protected void writeHeader()throws IOException{ writeShort(0x00004949); // 0: II = intel = little endian writeShort(42); // 2: version, magic value // writeInt(8); // 4: offset first Image File Directory offset=8; // 8: header size } public void writePageHeader(int width)throws IOException{ buf=new ByteArrayOutputStream(); this.width=width; this.height=0; lastByteWasZero=false; } abstract public void writePageEnd()throws IOException; public void writeDocumentEnd()throws IOException{ writeInt(0); // end of file: ptr to next ifd == NULL } }