|
Printer |
|
package ij.plugin.filter;
import ij.*;
import ij.gui.*;
import ij.process.*;
import java.awt.*;
import java.util.Properties;
import java.awt.print.*;
/** This plugin implements the File/Page Setup and File/Print commands. */
public class Printer implements PlugInFilter, Printable {
private ImagePlus imp;
private static double scaling = 100.0;
private static boolean drawBorder;
private static boolean center = true;
private static boolean label;
private static boolean printSelection;
private static boolean rotate;
private static int fontSize = 12;
public int setup(String arg, ImagePlus imp) {
if (!IJ.isJava2())
{IJ.error("Print", "Printing requires Java 1.2 or later"); return DONE;}
if (arg.equals("setup"))
{pageSetup(); return DONE;}
this.imp = imp;
IJ.register(Printer.class);
return DOES_ALL+NO_CHANGES;
}
public void run(ImageProcessor ip) {
//pageSetup();
print(imp);
}
void pageSetup() {
GenericDialog gd = new GenericDialog("Page Setup");
gd.addNumericField("Scale:", scaling, 0, 3, "%");
gd.addCheckbox("Draw Border", drawBorder);
gd.addCheckbox("Center on Page", center);
gd.addCheckbox("Print Title", label);
gd.addCheckbox("Selection Only", printSelection);
gd.addCheckbox("Rotate 90"+IJ.degreeSymbol, rotate);
gd.showDialog();
if (gd.wasCanceled())
return;
scaling = gd.getNextNumber();
if (scaling<5.0) scaling = 5;
drawBorder = gd.getNextBoolean();
center = gd.getNextBoolean();
label = gd.getNextBoolean();
printSelection = gd.getNextBoolean();
rotate = gd.getNextBoolean();
}
void print(ImagePlus imp) {
PrinterJob pj = PrinterJob.getPrinterJob();
pj.setPrintable(this);
//pj.pageDialog(pj.defaultPage());
if (IJ.macroRunning() || pj.printDialog()) {
imp.startTiming();
try {pj.print(); }
catch (PrinterException e) {
IJ.log(""+e);
}
}
}
public int print(Graphics g, PageFormat pf, int pageIndex) {
if (pageIndex != 0) return NO_SUCH_PAGE;
ImageProcessor ip = imp.getProcessor();
Roi roi = imp.getRoi();
if (printSelection && roi!=null && roi.isArea() )
ip = ip.crop();
if (rotate)
ip = ip.rotateLeft();
//new ImagePlus("ip", ip.duplicate()).show();
int width = ip.getWidth();
int height = ip.getHeight();
int margin = 0;
if (drawBorder) margin = 1;
double scale = scaling/100.0;
int dstWidth = (int)(width*scale);
int dstHeight = (int)(height*scale);
int pageX = (int)pf.getImageableX();
int pageY = (int)pf.getImageableY();
int dstX = pageX+margin;
int dstY = pageY+margin;
Image img = ip.createImage();
double pageWidth = pf.getImageableWidth()-2*margin;
double pageHeight = pf.getImageableHeight()-2*margin; if (label && pageWidth-dstWidth<fontSize+5) {
dstY += fontSize+5;
pageHeight -= fontSize+5;
}
if (dstWidth>pageWidth || dstHeight>pageHeight) {
// scale to fit page
double hscale = pageWidth/dstWidth;
double vscale = pageHeight/dstHeight;
double scale2 = hscale<=vscale?hscale:vscale;
dstWidth = (int)(dstWidth*scale2);
dstHeight = (int)(dstHeight*scale2);
} else if (center) {
dstX += (pageWidth-dstWidth)/2;
dstY += (pageHeight-dstHeight)/2;
}
g.drawImage(img,
dstX, dstY, dstX+dstWidth, dstY+dstHeight,
0, 0, width, height,
null);
if (drawBorder)
g.drawRect(dstX-1, dstY-1, dstWidth+1, dstHeight+1);
if (label) {
g.setFont(new Font("SanSerif", Font.PLAIN, fontSize));
g.setColor(Color.black);
g.drawString(imp.getTitle(), pageX+5, pageY+fontSize);
}
return PAGE_EXISTS;
}
}
|
Printer |
|