package uk.co.mmscomputing.device.sane; import java.io.*; import java.awt.image.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; import uk.co.mmscomputing.util.JarImageIcon; import uk.co.mmscomputing.concurrent.Semaphore; import uk.co.mmscomputing.device.scanner.ScannerDevice; import uk.co.mmscomputing.device.scanner.ScannerIOException; import uk.co.mmscomputing.device.sane.gui.SaneAcquirePanel; import uk.co.mmscomputing.device.sane.option.*; public class SaneDevice implements SaneConstants,ScannerDevice{ static final private int buffersize = 1 << 15; private String name; private int saneHandle; private boolean cancelled,userCancelled,adfmode; private int state,adfcount; private boolean showUI; // show user interface private boolean showPB; // show user progress bar private JProgressBar pbar; // progressbar to be shown private Semaphore blocker; // sane function are non reentrant; make sure we call them one after another SaneDevice(String device){ super(); saneHandle = 0; name = device; cancelled = false; userCancelled = false; adfmode = false; adfcount = -1; // -1: no limit; 0: don't scan; >0 scan count pages state = SANE_STATE_EXIT; showUI = true; showPB = true; pbar = null; blocker = new Semaphore(1,true); } public String getName(){ return name;} public int getState(){ return state;} void setState(int s){ state=s;jsane.signalStateChange(this);} synchronized boolean isState(int state){ return this.state==state;} public boolean isBusy(){ return !isState(SANE_STATE_EXIT);} public void checkBusy()throws SaneIOException{ if(isBusy()){throw new SaneIOException(getClass(),"checkBusy","SaneDevice.ex.isbusy",name);} } public boolean getADFMode(){ return adfmode;} public void setADFMode(boolean mode){ adfmode=mode;} public int getADFCount(){ return adfcount;} public void setADFCount(int count){ adfcount=count;} public boolean isOpen(){ return (state==SANE_STATE_OPEN)||(state==SANE_STATE_READY); } public void setShowUserInterface(boolean enable){showUI=enable;} public void setShowProgressBar(boolean enable){showPB=enable;} public void setProgressBar(JProgressBar pbar){this.pbar=pbar;} private void setProgressBar(String str){if(pbar!=null){pbar.setString(str);}} private void resetProgressBar(int max){if(pbar!=null){pbar.setValue(0);pbar.setMaximum(max);}} private void setProgressBar(int progress){ if(pbar!=null){ pbar.setValue(progress); if(progress>10*1024*1024){ progress>>=20; pbar.setString(""+progress+" MB"); }else if(progress>10*1024){ progress>>=10; pbar.setString(""+progress+" kB"); } } } // option descriptors public int getNumberOfOptions()throws SaneIOException{ return jsane.getNumberOfOptions(saneHandle); } public OptionDescriptor getOptionDescriptor(int option){ return jsane.getOptionDescriptor(saneHandle,option); } public OptionDescriptor[] getOptionDescriptors()throws SaneIOException{ OptionDescriptor[] list=new OptionDescriptor[getNumberOfOptions()]; for(int i=0;i>3)*3); int height =p.lines; // System.err.println(getClass().getName()+".createRGBImage:\n\tp.bytesPerLine="+p.bytesPerLine); BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); Raster raster = image.getRaster(); DataBufferInt db = (DataBufferInt)raster.getDataBuffer(); int[] data = db.getData(); in=new BufferedInputStream(in,buffersize); resetProgressBar(height); setProgressBar(0); int r,g,b,k=0,pixel; if(p.depth==8){ // P6 colour for(int y=0;y>3); int height =p.lines; BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); Raster raster = image.getRaster(); DataBufferInt db = (DataBufferInt)raster.getDataBuffer(); int[] data = db.getData(); int r,g,b,k=0,pixel,sample; red =new BufferedInputStream(red,buffersize); green=new BufferedInputStream(green,buffersize); blue =new BufferedInputStream(blue,buffersize); resetProgressBar(height); setProgressBar(0); if(p.depth==8){ for(int y=0;y"+device+""); msg.setBorder(new EmptyBorder(10,10,10,10)); q.add(msg,BorderLayout.CENTER); JPanel p=new JPanel(); p.setLayout(new BorderLayout()); setBorder(new EmptyBorder(5,0,5,0)); p.add(this,BorderLayout.NORTH); JPanel buttons=new JPanel(); buttons.setLayout(new GridLayout(0,3)); buttons.add(new JPanel()); JButton button=new JButton( new AbstractAction("cancel"){public void actionPerformed(ActionEvent ev){setCancel(true);}} ); buttons.add(button); buttons.add(new JPanel()); p.add(buttons,BorderLayout.CENTER); q.add(p,BorderLayout.SOUTH); panel.setLayout(new BorderLayout()); panel.setOpaque(true); panel.add(q,BorderLayout.NORTH); dialog = new JFrame(jsane.getResource("SaneDevice.ProgressMonitor.title")); dialog.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); dialog.setContentPane(panel); dialog.pack(); } void open(){ dialog.setLocationRelativeTo(null); dialog.toFront(); dialog.setVisible(true); } void close(){ dialog.dispose(); } } } /* [1] SANE Standard Version 1.03 (Scanner Access Now Easy) 2002-10-10 http://www.mostang.com/sane */