/* PixelGrabber.java -- Java class for providing image data 
   Copyright (C) 1999 Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */


package java.awt.image;

import java.awt.Image;
import java.util.Hashtable;

/**
   PixelGrabber is an ImageConsumer designed to extract a rectangular region of pixels
   from an Image
 */
public class PixelGrabber implements ImageConsumer 
{
    int x, y, width, height, status, scansize, offset;
    ColorModel model = ColorModel.getRGBdefault();
    //int hints;
    //Hashtable props;
    int pixel_bufferi[];
    byte pixel_bufferb[];
    boolean grabbing;
    ImageProducer ip;

    /**
     * Create a PixelGrabber used to grab pixels from the specified Image 
     * in the specified rectangle
     *
     * @param img the Image to grab pixels from
     * @param x the x coordinate of the rectangle
     * @param y the y coordinate of the rectangle
     * @param w the width of the rectangle
     * @param h the height of the rectangle
     * @param pixels the array of pixel values
     * @param offset the index of the first pixels in the <code>pixels</code> array
     * @param scansize the width to use in extracting pixels from the <code>pixels</code> array
     */
    public PixelGrabber(Image img, int x, int y, int w, int h,
			int pix[], int off, int scansize)
    {
	this( img.getSource(), x, y, w, h, pix, off, scansize );
    }

    /**
     * Create a PixelGrabber used to grab pixels from the specified ImageProducer
     * in the specified rectangle
     *
     * @param ip the ImageProducer to grab pixels from
     * @param x the x coordinate of the rectangle
     * @param y the y coordinate of the rectangle
     * @param w the width of the rectangle
     * @param h the height of the rectangle
     * @param pixels the array of pixel values
     * @param offset the index of the first pixels in the <code>pixels</code> array
     * @param scansize the width to use in extracting pixels from the <code>pixels</code> array
     */
    public PixelGrabber(ImageProducer ip, int x, int y, int w, int h,
			int pix[], int off, int scansize)
    {
	this.ip = ip;
	this.x = x;
	this.y = y;
	this.width = w;
	this.height = h;
	this.pixel_bufferi = pix;
	this.offset = off;
	this.scansize = scansize;
	pixel_bufferb = new byte[pix.length * 4];
    }


    /**
     * Create a PixelGrabber used to grab pixels from the specified Image 
     * in the specified rectangle
     *
     * @param img the Image to grab pixels from
     * @param x the x coordinate of the rectangle
     * @param y the y coordinate of the rectangle
     * @param w the width of the rectangle
     * @param h the height of the rectangle
     * @param forceRGB true to force conversion to RGB
     */
    public PixelGrabber(Image img,
			int x, int y,
			int w, int h,
			boolean forceRGB)
    {
	//FIXME
    }

    /**
       Start Grabbing Pixels
     */
    public synchronized void startGrabbing()
    {
	if ( grabbing == false )
	    {
		grabbing = true;
		ip.startProduction( this );
	    }
    }

    /**
       Abort the grabbing of pixels
     */
    public synchronized void abortGrabbing()
    {
	if ( grabbing == true )
	    {
		grabbing = false;
		ip.removeConsumer( this );
	    }
    }

    /**
       Grab the Pixels.

       @return true if successful

       @throws InterruptedExcpetion if interrupted by another thread.
     */
    public boolean grabPixels() throws InterruptedException
    {
      return grabPixels(0);
    }

    /**
       Grab the Pixels and abort if it takes too long

       @return true if successful

       @throws InterruptedExcpetion if interrupted by another thread.
               or time runs out
     */
    public synchronized boolean grabPixels(long ms) throws InterruptedException
    {
	startGrabbing();
	
	if (ms < 0)
	  return (status == ImageObserver.ALLBITS);
	
	wait(ms);
	
	if (status == ImageObserver.ALLBITS)
	    return true;
	else
	    return false;
    }

    /**
       Get the status of the pixel grabbing representing by ImageObserver flags

       @return the status
    */
    public synchronized int getStatus()
    {
	return status;
    }

    /**
       Return width of pixel region

       @return width of region
    */
    public synchronized int getWidth()
    {
	return width;
    }

    /**
       Return height of pixel region
       
       @return height of region
    */
    public synchronized int getHeight()
    {
	return height;
    }

    /**
       Returns the grabbed pixel buffer 

       @return a byte or int array
    */
    public synchronized Object getPixels()
    {
	if( pixel_bufferi != null )
	    return pixel_bufferi;
	return pixel_bufferb;
    }

    /**
       Get the ColorModel of the image
       
       @return the ColorModel
    */
    public synchronized ColorModel getColorModel()
    {
	return model;
    }

    /**
     * An <code>ImageProducer</code> indicates the size of the image
     * being produced using this method.
     * 
     * @param width the width of the image
     * @param height the height of the image 
     */
    public  void setDimensions(int width, int height)
    {
    }

    /**
     * An <code>ImageProducer</code> can set a list of properties
     * associated with this image by using this method.
     *
     * @param props the list of properties associated with this image 
     */
    public  void setProperties(Hashtable props)
    {
	//this.props = props; //FIXME - DO WE NEED THIS
    }

    /**
     * This <code>ColorModel</code> should indicate the model used by
     * the majority of calls to <code>setPixels</code>.  Each call to
     * <code>setPixels</code> could however indicate a different
     * <code>ColorModel</code>.
     *
     * @param model the color model to be used most often by setPixels
     * @see ColorModel 
     */
    public  void setColorModel(ColorModel model)
    {
	this.model = model;
    }

    /**
     * The <code>ImageProducer</code> should call this method with a
     * bit mask of hints from any of <code>RANDOMPIXELORDER</code>,
     * <code>TOPDOWNLEFTRIGHT</code>, <code>COMPLETESCANLINES</code>,
     * <code>SINGLEPASS</code>, <code>SINGLEFRAME</code>.
     * 
     * @param flags a bit mask of hints
     */
    public  void setHints(int flags)
    {
	//hints = flags; // FIXME - DO NOT KNOW WHAT TO DO WITH THE HINTS
    }

    /**
     * This function delivers a rectangle of pixels where any
     * pixel(m,n) is stored in the array as a <code>byte</code> at
     * index (n * scansize + m + offset).  
     */
    public  void setPixels(int x, int y, int w, int h, 
			   ColorModel model, byte[] pixels, int offset, int scansize)
    {
	//FIXME - I hate bytes
	int xp, yp;
	for( xp = x; xp < ( x + w); xp++ )
	    for( yp = y; yp < (y + h); yp++ )
		if( xp >= this.x && 
		    yp >= this.y && 
		    xp <= ( this.x + this.width ) && 
		    yp <= ( this.y + this.height ) ) {
		    pixel_bufferb[(yp - this.y) * this.scansize + (xp - this.x) + this.offset] =
			pixels[ offset + yp * scansize + xp ];
		}

    }

    /**
     * This function delivers a rectangle of pixels where any
     * pixel(m,n) is stored in the array as an <code>int</code> at
     * index (n * scansize + m + offset).  
     */
    public  void setPixels(int x, int y, int w, int h, 
			   ColorModel model, int[] pixels, int offset, int scansize)
    {
	int xp, yp;
	for( xp = x; xp < ( x + w); xp++ )
	    for( yp = y; yp < (y + h); yp++ )
		if( xp >= this.x && 
		    yp >= this.y && 
		    xp <= ( this.x + this.width ) && 
		    yp <= ( this.y + this.height ) ) {
		    pixel_bufferi[(yp - this.y) * this.scansize + (xp - this.x) + this.offset] =
			pixels[ offset + yp * scansize + xp ];
		}
    }

    /**
     * The <code>ImageProducer</code> calls this method to indicate a
     * single frame or the entire image is complete.  The method is
     * also used to indicate an error in loading or producing the
     * image.  
     */
    public synchronized void imageComplete(int status)
    {
	this.status = status;
    }

    /**
       @deprecated by getStatus
    */
    public synchronized int status()
    {
	return getStatus();
    }

}
