package ij.plugin.filter;
import ij.*;
import ij.gui.*;
import ij.process.*;
import ij.measure.*;
import ij.util.*;
import ij.plugin.frame.ContrastAdjuster;
import java.awt.*;
import java.util.*;
/** This plugin implements the Image/Lookup Tables/Apply LUT command. */
public class LutApplier implements PlugInFilter {
ImagePlus imp;
int min, max;
boolean canceled;
public int setup(String arg, ImagePlus imp) {
this.imp = imp;
int baseOptions = DOES_8G+DOES_8C+DOES_RGB+SUPPORTS_MASKING;
if (imp!=null && imp.getType()==ImagePlus.COLOR_RGB)
return baseOptions+NO_UNDO;
else
return baseOptions;
}
public void run(ImageProcessor ip) {
apply(imp, ip);
}
void apply(ImagePlus imp, ImageProcessor ip) {
if (ip.getMinThreshold()!=ImageProcessor.NO_THRESHOLD) {
imp.unlock();
IJ.runPlugIn("ij.plugin.Thresholder", "skip");
return;
}
min = (int)ip.getMin();
max = (int)ip.getMax();
if (min==0 && max==255) {
IJ.error("Apply LUT", "The display range must first be updated\n"
+"using Image>Adjust>Brightness/Contrast\n"
+"or threshold levels defined using\n"
+"Image>Adjust>Threshold.");
return;
}
if (imp.getType()==ImagePlus.COLOR_RGB) {
if (imp.getStackSize()>1)
applyRGBStack(imp);
else {
ip.reset();
Undo.setup(Undo.TRANSFORM, imp);
ip.setMinAndMax(min, max);
//ip.snapshot();
}
if (canceled) ip.reset();
resetContrastAdjuster();
return;
}
ip.resetMinAndMax();
int[] table = new int[256];
for (int i=0; i<256; i++) {
if (i<=min)
table[i] = 0;
else if (i>=max)
table[i] = 255;
else
table[i] = (int)(((double)(i-min)/(max-min))*255);
}
if (imp.getStackSize()>1) {
ImageStack stack = imp.getStack();
int flags = IJ.setupDialog(imp, 0);
if (flags==PlugInFilter.DONE)
{ip.setMinAndMax(min, max); return;}
if (flags==PlugInFilter.DOES_STACKS) {
new StackProcessor(stack, ip).applyTable(table);
Undo.reset();
} else
ip.applyTable(table);
} else
ip.applyTable(table);
resetContrastAdjuster();
}
void resetContrastAdjuster() {
Frame frame = WindowManager.getFrame("B&C");
if (frame==null)
frame = WindowManager.getFrame("W&L");
if (frame!=null && (frame instanceof ContrastAdjuster))
((ContrastAdjuster)frame).updateAndDraw();
}
void applyRGBStack(ImagePlus imp) {
int current = imp.getCurrentSlice();
int n = imp.getStackSize();
if (!IJ.showMessageWithCancel("Update Entire Stack?",
"Apply brightness and contrast settings\n"+
"to all "+n+" slices in the stack?\n \n"+
"NOTE: There is no Undo for this operation.")) {
canceled = true;
return;
}
for (int i=1; i<=n; i++) {
if (i!=current) {
imp.setSlice(i);
ImageProcessor ip = imp.getProcessor();
ip.setMinAndMax(min, max);
IJ.showProgress((double)i/n);
}
}
imp.setSlice(current);
}
}