package uk.co.mmscomputing.imageio.tiff;
import java.io.*;
public class TIFFSubSamplingOutputStream extends FilterOutputStream{
protected int w,yf,xf;
protected byte[] red,green,blue;
protected int y,x,col;
protected boolean needToFlush;
protected int ww;
public TIFFSubSamplingOutputStream(OutputStream out,int width,int yf,int xf){
super(out);
this.w=width;this.yf=yf;this.xf=xf;
y=0;x=0;col=0;needToFlush=false;
ww = ((width+xf-1)/xf)*xf;
red = new byte[ww*yf];
green = new byte[ww*yf];
blue = new byte[ww*yf];
}
protected void writeDataUnits()throws IOException{
for(int x=0;x<ww;x+=xf){
for(int y=0;y<ww*yf;y+=ww){
for(int xx=0;xx<xf;xx++){
out.write(red [y+x+xx]);
}
}
for(int y=0;y<ww*yf;y+=ww){
for(int xx=0;xx<xf;xx++){
out.write(green[y+x+xx]);
}
}
for(int y=0;y<ww*yf;y+=ww){
for(int xx=0;xx<xf;xx++){
out.write(blue [y+x+xx]);
}
}
}
needToFlush=false;
}
public void write(int b)throws IOException{
int off=y*ww+x;
switch(col++){
case 0:
red [off]=(byte)b;
break;
case 1:
green[off]=(byte)b;
break;
case 2:
blue [off]=(byte)b;
x++;col=0;
break;
}
if(x==w){y++;x=0;}
if(y==yf){
y=0;writeDataUnits();
}else{
needToFlush=true;
}
}
public void flush()throws IOException{
if(needToFlush){
writeDataUnits();
}
y=0;x=0;col=0;
super.flush();
}
public static void main(String[] argv){
try{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
TIFFSubSamplingOutputStream os = new TIFFSubSamplingOutputStream(baos,10,4,4);
for(int y=0;y<2;y++){
for(int x=0;x<10;x++){
os.write((y<<6)+(x<<2));
os.write((y<<6)+(x<<2)+1);
os.write((y<<6)+(x<<2)+2);
}
}
os.flush();os.close();
byte[] buf=baos.toByteArray();
for(int i=0;i<buf.length;i++){
// System.out.println("["+i+"]="+Integer.toHexString(buf[i]&0x000000FF));
int b=buf[i];
int y=(b>>6)&0x03;
int x=(b>>2)&0x0F;
int c=b&0x03;
System.out.println("["+i+"] => y="+y+" x="+x+" c="+c);
}
}catch(Exception e){
e.printStackTrace();
}
}
}