package uk.co.mmscomputing.io; import java.io.*; public class ModHuffmanOutputStream extends BitOutputStream implements ModHuffmanTable{ protected int state=WHITE; public ModHuffmanOutputStream(){ super(); state=WHITE; } public ModHuffmanOutputStream(OutputStream out){ super(out); state=WHITE; } public void flush()throws IOException{ super.flush(); state=WHITE; } public void reset()throws IOException{ super.reset(); state=WHITE; } public int getState(){ return state; } public void writeEOL()throws IOException{ super.flush(); write(0,4);write(EOLCW,12); state=WHITE; } public void write(int runlen)throws IOException{ if(state==WHITE){ writeWhite(runlen);state=BLACK; }else{ writeBlack(runlen);state=WHITE; } } private void writeWhite(int runlen)throws IOException{ int[] rle; while(runlen>2623){ // 2560+63=2623 write(0x00000F80,12); runlen-=2560; } if(runlen>63){ // max 2560 int makeup=runlen/64-1; rle=makeUpWhite[makeup]; write(rle[0],rle[2]); } rle=termWhite[runlen&0x3F]; // max 63 write(rle[0],rle[2]); } private void writeBlack(int runlen)throws IOException{ int[] rle; while(runlen>2623){ // 2560+63=2623 write(0x00000F80,12); runlen-=2560; } if(runlen>63){ // max 2560 int makeup=runlen/64-1; rle=makeUpBlack[makeup]; write(rle[0],rle[2]); } rle=termBlack[runlen&0x3F]; // max 63 write(rle[0],rle[2]); } public static void main(String[] argv){ try{ ByteArrayOutputStream baos=new ByteArrayOutputStream(); ModHuffmanOutputStream mhos=new ModHuffmanOutputStream(baos); mhos.writeWhite(1728); // 1728 white standard G3 fax line => B2 59 01 // mhos.writeWhite(2048); // 2048 white B4 fax line => 80 CC 0A // mhos.writeWhite(2432); // 2432 white A3 fax line => 80 CD 0A mhos.flush();mhos.close(); byte[] buf=baos.toByteArray(); for(int i=0;i<buf.length;i++){ System.out.println("["+i+"]="+Integer.toHexString(buf[i]&0x000000FF)); } }catch(Exception e){ e.printStackTrace(); } } }