package uk.co.mmscomputing.imageio.tiff; import java.io.*; import uk.co.mmscomputing.io.IntFilterInputStream; public class TIFFSubSamplingInputStream extends IntFilterInputStream{ protected int width,yf,xf,positioning; public TIFFSubSamplingInputStream(InputStream in,int width)throws IOException{ super(in);this.width=width; } public TIFFSubSamplingInputStream(InputStream in,int width,int yf,int xf,int positioning)throws IOException{ this(in,width); setSubSampling(yf,xf); setPositioning(positioning); } public void setSubSampling(int yf,int xf){this.yf=yf;this.xf=xf;} public void setPositioning(int positioning){this.positioning=positioning;} // todo. public int read()throws IOException{ throw new IOException(getClass().getName()+".read:\t\nInternal Error: Please use read(int[] buf,int off,int len)."); } protected void readDataUnit(int[] buf, int off,int maxy,int maxx)throws IOException{ int yoff=off; int y=0; while(y<maxy){ int x=0; while(x<maxx){ buf[yoff+x]=((in.read()&0x000000FF)<<16); x++; } while(x<xf){ in.read();x++; } yoff+=width;y++; } while(y<yf){ for(int x=0;x<xf;x++){ in.read(); } y++; } int cb=(in.read()&0x000000FF)<<8; int cr=in.read()&0x000000FF; yoff=off; for(y=0;y<maxy;y++){ for(int x=0;x<maxx;x++){ buf[yoff+x]|=cb|cr; } yoff+=width; } } public int read(int[] buf, int off, int len)throws IOException{ int maxy=len/width; for(int y=0;y<maxy;y+=yf){ for(int x=0;x<width;x+=xf){ readDataUnit( buf, off+y*width+x, ((maxy -y)>=yf)?yf:maxy &(yf-1), ((width-x)>=xf)?xf:width&(xf-1) ); } } return len; } }