123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281 |
- /* Copyright (C) 2000, 2003 Free Software Foundation
-
- This file is part of libgcj.
-
- This software is copyrighted work licensed under the terms of the
- Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
- details. */
- package gnu.awt.xlib;
- import java.awt.Image;
- import java.awt.Graphics;
- import java.awt.Graphics2D;
- import java.awt.GraphicsConfiguration;
- import java.awt.image.ColorModel;
- import java.awt.image.ImageObserver;
- import java.awt.image.ImageProducer;
- import java.awt.image.ImageConsumer;
- import java.util.Hashtable;
- import gnu.awt.j2d.DirectRasterGraphics;
- import gnu.awt.j2d.Graphics2DImpl;
- import gnu.awt.j2d.IntegerGraphicsState;
- import gnu.gcj.xlib.Drawable;
- import gnu.gcj.xlib.Pixmap;
- import gnu.gcj.xlib.Screen;
- import gnu.gcj.xlib.Visual;
- import gnu.gcj.xlib.GC;
- /** Image class for xlib off-screen buffers.
- * The image is stored in a server-side pixmap for best performance.
- * This class supports getGraphics, so you can draw on the pixmap, and is
- * specially handled when doing drawImage, so that the image copy is done
- * entirely in the X server.
- * This class does not support rasterization, for which you'd need an XImage.
- *
- * @author scott gilbertson <scottg@mantatest.com> <sgilbertson@cogeco.ca>
- */
- public class XOffScreenImage extends Image
- implements IntegerGraphicsState.ScreenCoupledImage,
- ImageConsumer
- {
- private Pixmap pixmap;
- private XGraphicsConfiguration config;
- private int width;
- private int height;
- private Drawable drawable;
- private ImageProducer prod;
- private GC gc;
- private ColorModel pixmapColorModel;
-
- /** Create a new XOffScreenImage
- * @param config Graphics configuration, to compare against on-screen
- * components and to create the appropriate Graphics
- * @param drawable The drawable with which the image is compatible
- * @param width The width of the image
- * @param height The height of the image
- * @param cm The ColorModel associated with drawable
- */
- XOffScreenImage (XGraphicsConfiguration config, Drawable drawable, int width, int height, ColorModel cm)
- {
- this.config = config;
- this.width = width;
- this.height = height;
- this.drawable = drawable;
- pixmapColorModel = cm;
- pixmap = new Pixmap (drawable, width, height, drawable.getDepth ());
- gc = GC.create (pixmap);
- }
-
- /** Create a new XOffScreenImage and obtain image data from an ImageProducer
- * @param config Graphics configuration, to compare against on-screen
- * components and to create the appropriate Graphics
- * @param drawable The drawable with which the image is compatible
- * @param prod The source of image data for this image
- * @param cm The ColorModel associated with drawable
- */
- XOffScreenImage (XGraphicsConfiguration config, Drawable drawable, ImageProducer prod, ColorModel cm)
- {
- this.config = config;
- this.width = 0; // size will be overridden in a moment
- this.height = 0;
- this.drawable = drawable;
- this.prod = prod;
- pixmapColorModel = cm;
- prod.startProduction (this);
- }
-
- /** Get the pixmap which contains this image
- * @return The pixmap
- */
- public Pixmap getPixmap ()
- {
- return pixmap;
- }
-
- /** Flushes (that is, destroys) any resources used for this image. This
- * includes the actual image data.
- */
- public void flush ()
- {
- // FIXME: should dispose pixmap
- pixmap = null;
- }
-
- /** Returns a graphics context object for drawing an off-screen object.
- * This method is only valid for off-screen objects.
- *
- * @return a graphics context object for an off-screen object
- * @see Graphics#createImage(int, int)
- */
- public Graphics getGraphics ()
- {
- DirectRasterGraphics gfxDevice = new XGraphics (pixmap, config);
- IntegerGraphicsState igState = new IntegerGraphicsState (gfxDevice);
- Graphics2DImpl gfx2d = new Graphics2DImpl (config);
- gfx2d.setState (igState);
- return gfx2d;
- }
-
- /** Returns the height of the image, or -1 if it is unknown. If the
- * image height is unknown, the observer object will be notified when
- * the value is known.
- *
- * @param observer the image observer for this object
- * @return the height in pixels
- * @see #getWidth(ImageObserver)
- */
- public int getHeight (ImageObserver observer)
- {
- return height;
- }
-
- /** Returns the height of the image, or -1 if it is unknown. If the
- * image height is unknown, the observer object will be notified when
- * the value is known.
- *
- * @return the height in pixels
- * @see #getWidth()
- */
- public int getHeight ()
- {
- return height;
- }
-
- /** Returns the image producer object for this object. The producer is the
- * object which generates pixels for this image.
- *
- * @return the image producer for this object
- */
- public ImageProducer getSource ()
- {
- if (prod == null)
- throw new UnsupportedOperationException ("getSource not supported");
- else
- return prod;
- }
-
- /** Returns the width of the image, or -1 if it is unknown. If the
- * image width is unknown, the observer object will be notified when
- * the value is known.
- *
- * @param observer the image observer for this object
- * @return the width in pixels
- * @see #getHeight(ImageObserver)
- */
- public int getWidth (ImageObserver observer)
- {
- return width;
- }
-
- /** Returns the width of the image, or -1 if it is unknown. If the
- * image width is unknown, the observer object will be notified when
- * the value is known.
- *
- * @return the width in pixels
- * @see #getHeight()
- */
- public int getWidth ()
- {
- return width;
- }
- /** This method requests a named property for an object. The value of the
- * property is returned. The value <code>UndefinedProperty</code> is
- * returned if there is no property with the specified name. The value
- * <code>null</code> is returned if the properties for the object are
- * not yet known. In this case, the specified image observer is notified
- * when the properties are known.
- *
- * @param name the requested property name
- * @param observer the image observer for this object
- * @return the named property, if available
- * @see #UndefinedProperty
- */
- public Object getProperty (String name, ImageObserver observer)
- {
- return null;
- }
-
- /** Get the GraphicsConfiguration to which this image is coupled
- * @return the GraphicsConfiguration
- */
- public GraphicsConfiguration getGraphicsConfiguration ()
- {
- return config;
- }
-
- public void imageComplete (int status)
- {
- }
-
- public void setColorModel (ColorModel model)
- {
- }
-
- public void setDimensions (int width, int height)
- {
- this.width = width;
- this.height = height;
- pixmap = new Pixmap (drawable, width, height, drawable.getDepth ());
- gc = GC.create (pixmap);
- }
-
- public void setHints (int flags)
- {
- }
-
- public void setPixels (int x, int y, int w, int h, ColorModel model, int[] pixels, int offset, int scansize)
- {
- int idx = 0;
- float[] normalizedComponents = new float [4];
- int[] unnormalizedComponents = { 0, 0, 0, 0xff };
- normalizedComponents[3] = 1;
- for (int yp=y; yp < (y + h); yp++)
- {
- for (int xp=x; xp < (x + w); xp++)
- {
- int p = (yp - y) * scansize + (xp - x) + offset;
- // FIXME: there HAS to be a more efficient mechanism for color mapping
- normalizedComponents[0] = (float)model.getRed (pixels[p]) / 255F;
- normalizedComponents[1] = (float)model.getGreen (pixels[p]) / 255F;
- normalizedComponents[2] = (float)model.getBlue (pixels[p]) / 255F;
- pixmapColorModel.getUnnormalizedComponents (normalizedComponents, 0,
- unnormalizedComponents, 0);
- int pixelColor = pixmapColorModel.getDataElement (unnormalizedComponents, 0);
- gc.setForeground (pixelColor);
- gc.drawPoint (xp, yp);
- }
- }
- }
-
- public void setPixels (int x, int y, int w, int h, ColorModel model, byte[] pixels, int offset, int scansize)
- {
- int idx = 0;
- float[] normalizedComponents = new float [4];
- int[] unnormalizedComponents = { 0, 0, 0, 0xff };
- normalizedComponents[3] = 1;
- for (int yp=y; yp < (y + h); yp++)
- {
- for (int xp=x; xp < (x + w); xp++)
- {
- // FIXME: there HAS to be a more efficient mechanism for color mapping
- int p = (yp - y) * scansize + (xp - x) + offset;
- normalizedComponents[0] = (float)model.getRed (pixels[p]) / 255F;
- normalizedComponents[1] = (float)model.getGreen (pixels[p]) / 255F;
- normalizedComponents[2] = (float)model.getBlue (pixels[p]) / 255F;
- pixmapColorModel.getUnnormalizedComponents (normalizedComponents, 0,
- unnormalizedComponents, 0);
- int pixelColor = pixmapColorModel.getDataElement (unnormalizedComponents, 0);
- gc.setForeground (pixelColor);
- gc.drawPoint (xp, yp);
- }
- }
- }
-
- public void setProperties (Hashtable props)
- {
- }
-
- }
|