/*

   Stack_Extend.java
   
   GC - 26/11/2003

*/

import ij.*;
import ij.gui.*;
import ij.io.*;
import ij.measure.*;
import ij.process.*;
import ij.plugin.*;
import ij.plugin.frame.*;
import ij.plugin.PlugIn;
import ij.plugin.filter.PlugInFilter;

import java.io.*;
import java.util.*;
import java.lang.String;

import java.awt.*;
import java.awt.image.*; 
import java.awt.event.*;
import java.awt.Color;
import javax.swing.*;

/*****************************************/
public class Stack_Extend implements PlugInFilter {
/*****************************************/

   static ImagePlus img;
  
//---------------------------------------------
   public int setup(String arg, ImagePlus imp){
//---------------------------------------------
            
      this.img = imp;

      if (imp == null){
         IJ.showMessage("There are no images open");
         return DONE;
      }

 		if (arg.equals ("about")) {
         showAbout(); 
         return DONE;
      }

//    Si abilita l'elaborazione di stack a 8 o 16 bit ...
      return DOES_16+STACK_REQUIRED+NO_CHANGES;
   }                                  

//-------------------------------------     
   public void run(ImageProcessor ip) { 
//-------------------------------------     
      
      int imgType = img.getType();

      if (imgType != ImagePlus.GRAY16) {
         IJ.error("Image type allowed: 16-bit grayscale.");
         return;
      }

      ImageStack origStack = img.getStack();
      int origSlices = img.getStackSize();
      int newSlices = origSlices * 2 - 1;

      ImagePlus modifImg = new ImagePlus();
      if (modifImg == null) {
         IJ.showMessage("Mip", "Unable to create a new image.");
         return;
      }
    
      String origTitle = img.getTitle();
      
      modifImg = NewImage.createShortImage(origTitle + " Extended", 
                                           img.getWidth(), img.getHeight(),
                                           newSlices, NewImage.FILL_BLACK);
      
      if (modifImg == null) {
         IJ.showMessage("Mip", "Unable to create a new image.");
         return;
      }

      ImageStack modifStack = modifImg.getStack();
      int xDim = modifStack.getWidth();
      int yDim = modifStack.getHeight();

      ImageProcessor origSliceIp;
      ImageProcessor modifSliceIp;
      ImageProcessor nextOrigSliceIp;

      IJ.showStatus("Building extended stack ...");
         
      int sliceCurr = 1;
 
      for (sliceCurr = 1; sliceCurr <= origSlices; sliceCurr++) {

         IJ.showProgress((double)sliceCurr / origSlices);       

         origSliceIp = origStack.getProcessor(sliceCurr);

         modifSliceIp = modifStack.getProcessor(sliceCurr*2-1);
         modifSliceIp.setInterpolate(true);
         modifSliceIp.copyBits(origSliceIp, 0, 0, Blitter.COPY);

         if (sliceCurr < origSlices) {
         
            modifSliceIp = modifStack.getProcessor(sliceCurr*2);
            modifSliceIp.setInterpolate(true);

            nextOrigSliceIp = origStack.getProcessor(sliceCurr+1);

            int x,y;
            int pixVal1, pixVal2;
            int pixMean;
            
            for (x = 0; x < xDim; x++) {
               for (y = 0; y < yDim; y++) {

                  pixVal1 = origSliceIp.getPixel(x,y);
                  pixVal2 = nextOrigSliceIp.getPixel(x,y);
                  pixMean = (pixVal1 + pixVal2) / 2;

                  modifSliceIp.putPixel(x,y,pixMean);
               }
            }
         }
      }

      modifSliceIp = modifImg.getProcessor();
      modifSliceIp.resetMinAndMax ();
      modifImg.updateAndDraw();
      modifImg.show();

   }

//-------------------     
   void showAbout() {
//-------------------     

		IJ.showMessage("About Stack_Extend ...",
			"'Stack_Extend' creates a new stack, starting from the current one, \n" +
         "featuring (2n-1) slices instead of n.");
   }

}

// *** EOF ***

