package ij.io;
import java.io.*;
import ij.*;
import ij.process.*;
import ij.measure.*;

/** Saves an image described by an ImageProcessor object as a tab-delimited text file. */
public class TextEncoder {

    private ImageProcessor ip;
    private Calibration cal;
    private int precision;

    /** Constructs a TextEncoder from an ImageProcessor and optional Calibration. */
    public TextEncoder (ImageProcessor ip, Calibration cal, int precision) {
        this.ip = ip;
        this.cal = cal;
        this.precision = precision;
    }

    /** Saves the image as a tab-delimited text file. */
    public void write(DataOutputStream out) throws IOException {
        PrintWriter pw = new PrintWriter(out);
        boolean calibrated = cal!=null && cal.calibrated();
        if (calibrated)
            ip.setCalibrationTable(cal.getCTable());
        else
            ip.setCalibrationTable(null);
        boolean intData = !calibrated && ((ip instanceof ByteProcessor) || (ip instanceof ShortProcessor));
        int width = ip.getWidth();
        int height = ip.getHeight();
        int inc = height/20;
        if (inc<1) inc = 1;
        //IJ.showStatus("Exporting as text...");
        double value;
        for (int y=0; y<height; y++) {
            for (int x=0; x<width; x++) {
                value = ip.getPixelValue(x,y);
                if (intData)
                    pw.print((int)value);
                else
                    pw.print(IJ.d2s(value, precision));
                if (x!=(width-1))
                    pw.print("\t");
            }
            pw.println();
            if (y%inc==0) IJ.showProgress((double)y/height);
        }
        pw.close();
        IJ.showProgress(1.0);
        //IJ.showStatus("");
    }
    
}