/* GraphicsConfiguration.java -- describes characteristics of graphics
   Copyright (C) 2000, 2001, 2002 Free Software Foundation

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., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 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;

import gnu.classpath.NotImplementedException;

import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.VolatileImage;

/**
 * This class describes the configuration of various graphics devices, such
 * as a monitor or printer. Different configurations may exist for the same
 * device, according to the different native modes supported.
 *
 * <p>Virtual devices are supported (for example, in a multiple screen
 * environment, a virtual device covers all screens simultaneously); the
 * configuration will have a non-zero relative coordinate system in such
 * a case.
 *
 * @author Eric Blake (ebb9@email.byu.edu)
 * @see Window
 * @see Frame
 * @see GraphicsEnvironment
 * @see GraphicsDevice
 * @since 1.0
 * @status updated to 1.4
 */
public abstract class GraphicsConfiguration
{
  
  /** The cached image capabilities. */
  private ImageCapabilities imageCapabilities;
  
  /** The cached buffer capabilities. */
  private BufferCapabilities bufferCapabilities;
  
  /**
   * The default constructor.
   *
   * @see GraphicsDevice#getConfigurations()
   * @see GraphicsDevice#getDefaultConfiguration()
   * @see GraphicsDevice#getBestConfiguration(GraphicsConfigTemplate)
   * @see Graphics2D#getDeviceConfiguration()
   */
  protected GraphicsConfiguration ()
  {
  }

  /**
   * Gets the associated device that this configuration describes.
   *
   * @return the device
   */
  public abstract GraphicsDevice getDevice();

  /**
   * Returns a buffered image optimized to this device, so that blitting can
   * be supported in the buffered image.
   *
   * @param w the width of the buffer
   * @param h the height of the buffer
   * @return the buffered image, or null if none is supported
   */
  public abstract BufferedImage createCompatibleImage(int w, int h);

  /**
   * Returns a buffered volatile image optimized to this device, so that
   * blitting can be supported in the buffered image. Because the buffer is
   * volatile, it can be optimized by native graphics accelerators.
   *
   * @param w the width of the buffer
   * @param h the height of the buffer
   * @return the buffered image, or null if none is supported
   * @see Component#createVolatileImage(int, int)
   * @since 1.4
   */
  public abstract VolatileImage createCompatibleVolatileImage(int w, int h);

  /**
   * Returns a buffered volatile image optimized to this device, and with the
   * given capabilities, so that blitting can be supported in the buffered
   * image. Because the buffer is volatile, it can be optimized by native
   * graphics accelerators.
   *
   * @param w the width of the buffer
   * @param h the height of the buffer
   * @param caps the desired capabilities of the image buffer
   * @return the buffered image, or null if none is supported
   * @throws AWTException if the capabilities cannot be met
   * @since 1.4
   */
  public VolatileImage createCompatibleVolatileImage(int w, int h,
                                                     ImageCapabilities caps)
    throws AWTException
  {
    throw new AWTException("not implemented");
  }

  /**
   * Returns a buffered volatile image optimized to this device, and
   * with the given transparency. Because the buffer is volatile, it
   * can be optimized by native graphics accelerators.
   *
   * @param width the width of the buffer
   * @param height the height of the buffer
   * @param transparency the transparency value for the buffer
   * @return the buffered image, or null if none is supported
   * @since 1.5
   */
  public abstract VolatileImage createCompatibleVolatileImage(int width,
                                                              int height,
                                                              int transparency);

  /**
   * Returns a buffered image optimized to this device, and with the specified
   * transparency, so that blitting can be supported in the buffered image.
   *
   * @param w the width of the buffer
   * @param h the height of the buffer
   * @param transparency the transparency of the buffer
   * @return the buffered image, or null if none is supported
   * @see Transparency#OPAQUE
   * @see Transparency#BITMASK
   * @see Transparency#TRANSLUCENT
   */
  public abstract BufferedImage createCompatibleImage(int w, int h,
                                                      int transparency);

  /**
   * Gets the color model of the corresponding device.
   *
   * @return the color model
   */
  public abstract ColorModel getColorModel();

  /**
   * Gets a color model for the corresponding device which supports the desired
   * transparency level.
   *
   * @param transparency the transparency of the model
   * @return the color model, with transparency
   * @see Transparency#OPAQUE
   * @see Transparency#BITMASK
   * @see Transparency#TRANSLUCENT
   */
  public abstract ColorModel getColorModel(int transparency);

  /**
   * Returns a transform that maps user coordinates to device coordinates. The
   * preferred mapping is about 72 user units to 1 inch (2.54 cm) of physical
   * space. This is often the identity transform. The device coordinates have
   * the origin at the upper left, with increasing x to the right, and
   * increasing y to the bottom.
   *
   * @return the transformation from user space to device space
   * @see #getNormalizingTransform()
   */
  public abstract AffineTransform getDefaultTransform();

  /**
   * Returns a transform that maps user coordinates to device coordinates. The
   * exact mapping is 72 user units to 1 inch (2.54 cm) of physical space.
   * This is often the identity transform. The device coordinates have the
   * origin at the upper left, with increasing x to the right, and increasing
   * y to the bottom. Note that this is more accurate (and thus, sometimes more
   * costly) than the default transform.
   *
   * @return the normalized transformation from user space to device space
   * @see #getDefaultTransform()
   */
  public abstract AffineTransform getNormalizingTransform();

  /**
   * Returns the bounds of the configuration, in device coordinates. If this
   * is a virtual device (for example, encompassing several screens), the
   * bounds may have a non-zero origin.
   *
   * @return the device bounds
   * @since 1.3
   */
  public abstract Rectangle getBounds();

  /**
   * Returns the buffering capabilities of this configuration.
   *
   * @return the buffer capabilities
   * @since 1.4
   */
  public BufferCapabilities getBufferCapabilities()
  {
    if (imageCapabilities == null)
      getImageCapabilities();
    
    if (bufferCapabilities == null)
      bufferCapabilities = new BufferCapabilities(imageCapabilities,
                                                  imageCapabilities, null);
    return bufferCapabilities;
  }

  /**
   * Returns the imaging capabilities of this configuration.
   *
   * @return the image capabilities
   * @since 1.4
   */
  public ImageCapabilities getImageCapabilities()
  {
    if (imageCapabilities == null)
      imageCapabilities = new ImageCapabilities(false);
    return imageCapabilities;
  }
} // class GraphicsConfiguration
