package uk.co.mmscomputing.imageio.tiff;
import java.io.*;
public class TIFFClassFMMROutputStream extends TIFFClassFOutputStream{
public TIFFClassFMMROutputStream(OutputStream out)throws IOException{
super(out);
}
public void write(int cw)throws IOException{ // MMR code 'bytes'
if(lastByteWasZero){ // 0x00,0x80 end of line code words
if((cw&0x00FF)==0x80){ // signal new line
lastByteWasZero=false;
height++; // end of line increase height
return;
}
super.write(0); // if not part of end of line code, write last 0 byte
}
if(cw==0x00){ // check for possible end of line code
lastByteWasZero=true; // don't write 0 byte just yet, maybe end of line code
}else{
super.write(cw); // write code word
}
}
public void writePageEnd()throws IOException{
if(lastByteWasZero){buf.write(0);}
int align=buf.size()&0x01;
byte[] data=buf.toByteArray();
int ifdoffset=offset+data.length+align+16; // data.length+xres.size+yres.size
writeInt(ifdoffset); // ptr to ifd; write data in front of ifd
out.write(data); // write to image stream
if(align>0){out.write(0);} // word alignment
writeInt(xres); // xres -16
writeInt(1);
writeInt(yres); // yres -8
writeInt(1);
writeShort(12); // IFD +0: count directory entries
// entries need to be in tag order !
writeShort(ImageWidth); // 256 +2
writeShort(LONG);
writeInt(1);
writeInt(width);
writeShort(ImageLength); // 257 +14
writeShort(LONG);
writeInt(1);
writeInt(height);
writeShort(Compression); // 259 +26
writeShort(SHORT);
writeInt(1);
writeInt(CCITTFAXT6);
writeShort(PhotometricInterpretation); // 262 +38
writeShort(SHORT);
writeInt(1);
writeInt(WhiteIsZero);
writeShort(FillOrder); // 266 +50
writeShort(SHORT);
writeInt(1);
writeInt(2); // 2 = Least Significant Bit first
writeShort(StripOffsets); // 273 +62
writeShort(LONG);
writeInt(1); // all data in one strip !
writeInt(offset);
writeShort(RowsPerStrip); // 278 +74
writeShort(LONG);
writeInt(1);
writeInt(height); // all data in one strip !
writeShort(StripByteCounts); // 279 +86
writeShort(LONG);
writeInt(1);
writeInt(data.length); // all data in one strip !
writeShort(XResolution); // 282 +98
writeShort(RATIONAL);
writeInt(1);
writeInt(ifdoffset-16); // 203.0
writeShort(YResolution); // 283 +110
writeShort(RATIONAL);
writeInt(1);
writeInt(ifdoffset-8); // 196.0
writeShort(T6Options); // 293 +122
writeShort(LONG);
writeInt(1);
writeInt(0); // 293 MMR;
writeShort(ResolutionUnit); // 296 +134
writeShort(SHORT);
writeInt(1);
writeInt(Inch);
offset=ifdoffset+150;
}
}