package ij.plugin.filter;
import ij.*;
import ij.gui.*;
import ij.process.*;
import java.awt.*;
import java.awt.geom.*;
/** This plugin implements the Image/Rotate/Arbitrarily command. */
public class Rotator implements ExtendedPlugInFilter, DialogListener {
private int flags = DOES_ALL|SUPPORTS_MASKING|PARALLELIZE_STACKS;
private static double angle = 15.0;
private static boolean fillWithBackground;
private static boolean enlarge;
private static int gridLines = 1;
private ImagePlus imp;
private int bitDepth;
private boolean canEnlarge;
private boolean isEnlarged;
private GenericDialog gd;
private PlugInFilterRunner pfr;
private String[] methods = ImageProcessor.getInterpolationMethods();
private static int interpolationMethod = ImageProcessor.BILINEAR;
public int setup(String arg, ImagePlus imp) {
this.imp = imp;
if (imp!=null) {
bitDepth = imp.getBitDepth();
Roi roi = imp.getRoi();
Rectangle r = roi!=null?roi.getBounds():null;
canEnlarge = r==null || (r.x==0&&r.y==0&&r.width==imp.getWidth()&&r.height==imp.getHeight());
}
return flags;
}
public void run(ImageProcessor ip) {
if(enlarge && gd.wasOKed()) synchronized(this) {
if (!isEnlarged) {
enlargeCanvas();
isEnlarged=true;
}
}
if (isEnlarged) { //enlarging may have made the ImageProcessor invalid, also for the parallel threads
int slice = pfr.getSliceNumber();
if (imp.getStackSize()==1)
ip = imp.getProcessor();
else
ip = imp.getStack().getProcessor(slice);
}
ip.setInterpolationMethod(interpolationMethod);
if (fillWithBackground) {
Color bgc = Toolbar.getBackgroundColor();
if (bitDepth==8)
ip.setBackgroundValue(ip.getBestIndex(bgc));
else if (bitDepth==24)
ip.setBackgroundValue(bgc.getRGB());
} else
ip.setBackgroundValue(0);
ip.rotate(angle);
if (!gd.wasOKed())
drawGridLines(gridLines);
if (isEnlarged && imp.getStackSize()==1) {
imp.changes = true;
imp.updateAndDraw();
Undo.setup(Undo.COMPOUND_FILTER_DONE, imp);
}
}
void enlargeCanvas() {
imp.unlock();
if (imp.getStackSize()==1)
Undo.setup(Undo.COMPOUND_FILTER, imp);
IJ.run("Select All");
IJ.run("Rotate...", "angle="+angle);
Roi roi = imp.getRoi();
Rectangle r = roi.getBounds();
if (r.width
Ads help maintain this website.