summaryrefslogtreecommitdiff
path: root/libjava/classpath/gnu/java/awt/java2d
diff options
context:
space:
mode:
authorAndrew Haley <aph@redhat.com>2016-09-30 16:24:48 +0000
committerAndrew Haley <aph@gcc.gnu.org>2016-09-30 16:24:48 +0000
commit07b78716af6a9d7c9fd1e94d9baf94a52c873947 (patch)
tree3f22b3241c513ad168c8353805614ae1249410f4 /libjava/classpath/gnu/java/awt/java2d
parenteae993948bae8b788c53772bcb9217c063716f93 (diff)
downloadgcc-07b78716af6a9d7c9fd1e94d9baf94a52c873947.tar.gz
Makefile.def: Remove libjava.
2016-09-30 Andrew Haley <aph@redhat.com> * Makefile.def: Remove libjava. * Makefile.tpl: Likewise. * Makefile.in: Regenerate. * configure.ac: Likewise. * configure: Likewise. * gcc/java: Remove. * libjava: Likewise. From-SVN: r240662
Diffstat (limited to 'libjava/classpath/gnu/java/awt/java2d')
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/AbstractGraphics2D.java2094
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/ActiveEdges.java197
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/AlphaCompositeContext.java316
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/CubicSegment.java184
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/ImagePaint.java192
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/LineSegment.java118
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/PixelCoverage.java132
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/Pixelizer.java56
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/PolyEdge.java171
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/PolyEdgeComparator.java70
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/QuadSegment.java260
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/RasterGraphics.java118
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/Scanline.java91
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/ScanlineConverter.java451
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/ScanlineCoverage.java630
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/Segment.java158
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/ShapeCache.java90
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/ShapeWrapper.java119
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/TextCacheKey.java153
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/TexturePaintContext.java211
20 files changed, 0 insertions, 5811 deletions
diff --git a/libjava/classpath/gnu/java/awt/java2d/AbstractGraphics2D.java b/libjava/classpath/gnu/java/awt/java2d/AbstractGraphics2D.java
deleted file mode 100644
index 1334866f270..00000000000
--- a/libjava/classpath/gnu/java/awt/java2d/AbstractGraphics2D.java
+++ /dev/null
@@ -1,2094 +0,0 @@
-/* AbstractGraphics2D.java -- Abstract Graphics2D implementation
- Copyright (C) 2006 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., 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 gnu.java.awt.java2d;
-
-import gnu.java.util.LRUCache;
-
-import java.awt.AWTError;
-import java.awt.AlphaComposite;
-import java.awt.AWTPermission;
-import java.awt.BasicStroke;
-import java.awt.Color;
-import java.awt.Composite;
-import java.awt.CompositeContext;
-import java.awt.Dimension;
-import java.awt.Font;
-import java.awt.FontMetrics;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.Image;
-import java.awt.Paint;
-import java.awt.PaintContext;
-import java.awt.Point;
-import java.awt.Polygon;
-import java.awt.Rectangle;
-import java.awt.RenderingHints;
-import java.awt.Shape;
-import java.awt.Stroke;
-import java.awt.Toolkit;
-import java.awt.RenderingHints.Key;
-import java.awt.font.FontRenderContext;
-import java.awt.font.GlyphVector;
-import java.awt.geom.AffineTransform;
-import java.awt.geom.Arc2D;
-import java.awt.geom.Area;
-import java.awt.geom.Ellipse2D;
-import java.awt.geom.GeneralPath;
-import java.awt.geom.Line2D;
-import java.awt.geom.NoninvertibleTransformException;
-import java.awt.geom.RoundRectangle2D;
-import java.awt.image.BufferedImage;
-import java.awt.image.BufferedImageOp;
-import java.awt.image.ColorModel;
-import java.awt.image.DataBuffer;
-import java.awt.image.FilteredImageSource;
-import java.awt.image.ImageObserver;
-import java.awt.image.ImageProducer;
-import java.awt.image.Raster;
-import java.awt.image.RenderedImage;
-import java.awt.image.ReplicateScaleFilter;
-import java.awt.image.SampleModel;
-import java.awt.image.WritableRaster;
-import java.awt.image.renderable.RenderableImage;
-import java.text.AttributedCharacterIterator;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.Map;
-import java.util.WeakHashMap;
-
-/**
- * This is a 100% Java implementation of the Java2D rendering pipeline. It is
- * meant as a base class for Graphics2D implementations.
- *
- * <h2>Backend interface</h2>
- * <p>
- * The backend must at the very least provide a Raster which the the rendering
- * pipeline can paint into. This must be implemented in
- * {@link #getDestinationRaster()}. For some backends that might be enough, like
- * when the target surface can be directly access via the raster (like in
- * BufferedImages). Other targets need some way to synchronize the raster with
- * the surface, which can be achieved by implementing the
- * {@link #updateRaster(Raster, int, int, int, int)} method, which always gets
- * called after a chunk of data got painted into the raster.
- * </p>
- * <p>Alternativly the backend can provide a method for filling Shapes by
- * overriding the protected method fillShape(). This can be accomplished
- * by a polygon filling function of the backend. Keep in mind though that
- * Shapes can be quite complex (i.e. non-convex and containing holes, etc)
- * which is not supported by all polygon fillers. Also it must be noted
- * that fillShape() is expected to handle painting and compositing as well as
- * clipping and transformation. If your backend can't support this natively,
- * then you can fallback to the implementation in this class. You'll need
- * to provide a writable Raster then, see above.</p>
- * <p>Another alternative is to implement fillScanline() which only requires
- * the backend to be able to draw horizontal lines in device space,
- * which is usually very cheap.
- * The implementation should still handle painting and compositing,
- * but no more clipping and transformation is required by the backend.</p>
- * <p>The backend is free to provide implementations for the various raw*
- * methods for optimized AWT 1.1 style painting of some primitives. This should
- * accelerate painting of Swing greatly. When doing so, the backend must also
- * keep track of the clip and translation, probably by overriding
- * some clip and translate methods. Don't forget to message super in such a
- * case.</p>
- *
- * <h2>Acceleration options</h2>
- * <p>
- * The fact that it is
- * pure Java makes it a little slow. However, there are several ways of
- * accelerating the rendering pipeline:
- * <ol>
- * <li><em>Optimization hooks for AWT 1.1 - like graphics operations.</em>
- * The most important methods from the {@link java.awt.Graphics} class
- * have a corresponding <code>raw*</code> method, which get called when
- * several optimization conditions are fullfilled. These conditions are
- * described below. Subclasses can override these methods and delegate
- * it directly to a native backend.</li>
- * <li><em>Native PaintContexts and CompositeContext.</em> The implementations
- * for the 3 PaintContexts and AlphaCompositeContext can be accelerated
- * using native code. These have proved to two of the most performance
- * critical points in the rendering pipeline and cannot really be done quickly
- * in plain Java because they involve lots of shuffling around with large
- * arrays. In fact, you really would want to let the graphics card to the
- * work, they are made for this.</li>
- * <li>Provide an accelerated implementation for fillShape(). For instance,
- * OpenGL can fill shapes very efficiently. There are some considerations
- * to be made though, see above for details.</li>
- * </ol>
- * </p>
- *
- * @author Roman Kennke (kennke@aicas.com)
- */
-public abstract class AbstractGraphics2D
- extends Graphics2D
- implements Cloneable, Pixelizer
-{
- /**
- * Caches scaled versions of an image.
- *
- * @see #drawImage(Image, int, int, int, int, ImageObserver)
- */
- protected static final WeakHashMap<Image, HashMap<Dimension,Image>> imageCache =
- new WeakHashMap<Image, HashMap<Dimension, Image>>();
-
- /**
- * Wether we use anti aliasing for rendering text by default or not.
- */
- private static final boolean DEFAULT_TEXT_AA =
- Boolean.getBoolean("gnu.java2d.default_text_aa");
-
- /**
- * The default font to use on the graphics object.
- */
- private static final Font FONT = new Font("SansSerif", Font.PLAIN, 12);
-
- /**
- * The size of the LRU cache used for caching GlyphVectors.
- */
- private static final int GV_CACHE_SIZE = 50;
-
- /**
- * Caches certain shapes to avoid massive creation of such Shapes in
- * the various draw* and fill* methods.
- */
- private static final ShapeCache shapeCache = new ShapeCache();
-
- /**
- * A pool of scanline converters. It is important to reuse scanline
- * converters because they keep their datastructures in place. We pool them
- * for use in multiple threads.
- */
- private static final LinkedList<ScanlineConverter> scanlineConverters =
- new LinkedList<ScanlineConverter>();
-
- /**
- * Caches glyph vectors for better drawing performance.
- */
- private static final Map<TextCacheKey,GlyphVector> gvCache =
- Collections.synchronizedMap(new LRUCache<TextCacheKey,GlyphVector>(GV_CACHE_SIZE));
-
- /**
- * This key is used to search in the gvCache without allocating a new
- * key each time.
- */
- private static final TextCacheKey searchTextKey = new TextCacheKey();
-
- /**
- * The transformation for this Graphics2D instance
- */
- protected AffineTransform transform;
-
- /**
- * The foreground.
- */
- private Paint paint;
-
- /**
- * The paint context during rendering.
- */
- private PaintContext paintContext = null;
-
- /**
- * The background.
- */
- private Color background = Color.WHITE;
-
- /**
- * Foreground color, as set by setColor.
- */
- private Color foreground = Color.BLACK;
- private boolean isForegroundColorNull = true;
-
- /**
- * The current font.
- */
- private Font font;
-
- /**
- * The current composite setting.
- */
- private Composite composite;
-
- /**
- * The current stroke setting.
- */
- private Stroke stroke;
-
- /**
- * The current clip. This clip is in user coordinate space.
- */
- private Shape clip;
-
- /**
- * The rendering hints.
- */
- private RenderingHints renderingHints;
-
- /**
- * The raster of the destination surface. This is where the painting is
- * performed.
- */
- private WritableRaster destinationRaster;
-
- /**
- * Indicates if certain graphics primitives can be rendered in an optimized
- * fashion. This will be the case if the following conditions are met:
- * - The transform may only be a translation, no rotation, shearing or
- * scaling.
- * - The paint must be a solid color.
- * - The composite must be an AlphaComposite.SrcOver.
- * - The clip must be a Rectangle.
- * - The stroke must be a plain BasicStroke().
- *
- * These conditions represent the standard settings of a new
- * AbstractGraphics2D object and will be the most commonly used setting
- * in Swing rendering and should therefore be optimized as much as possible.
- */
- private boolean isOptimized = true;
-
- private static final BasicStroke STANDARD_STROKE = new BasicStroke();
-
- private static final HashMap<Key, Object> STANDARD_HINTS;
- static
- {
-
- HashMap<Key, Object> hints = new HashMap<Key, Object>();
- hints.put(RenderingHints.KEY_TEXT_ANTIALIASING,
- RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT);
- hints.put(RenderingHints.KEY_ANTIALIASING,
- RenderingHints.VALUE_ANTIALIAS_DEFAULT);
-
- STANDARD_HINTS = hints;
- }
-
- /**
- * Creates a new AbstractGraphics2D instance.
- */
- protected AbstractGraphics2D()
- {
- transform = new AffineTransform();
- background = Color.WHITE;
- composite = AlphaComposite.SrcOver;
- stroke = STANDARD_STROKE;
- renderingHints = new RenderingHints(STANDARD_HINTS);
- }
-
- /**
- * Draws the specified shape. The shape is passed through the current stroke
- * and is then forwarded to {@link #fillShape}.
- *
- * @param shape the shape to draw
- */
- public void draw(Shape shape)
- {
- // Stroke the shape.
- Shape strokedShape = stroke.createStrokedShape(shape);
- // Fill the stroked shape.
- fillShape(strokedShape, false);
- }
-
-
- /**
- * Draws the specified image and apply the transform for image space ->
- * user space conversion.
- *
- * This method is implemented to special case RenderableImages and
- * RenderedImages and delegate to
- * {@link #drawRenderableImage(RenderableImage, AffineTransform)} and
- * {@link #drawRenderedImage(RenderedImage, AffineTransform)} accordingly.
- * Other image types are not yet handled.
- *
- * @param image the image to be rendered
- * @param xform the transform from image space to user space
- * @param obs the image observer to be notified
- */
- public boolean drawImage(Image image, AffineTransform xform,
- ImageObserver obs)
- {
- Rectangle areaOfInterest = new Rectangle(0, 0, image.getWidth(obs),
- image.getHeight(obs));
- return drawImageImpl(image, xform, obs, areaOfInterest);
- }
-
- /**
- * Draws the specified image and apply the transform for image space ->
- * user space conversion. This method only draw the part of the image
- * specified by <code>areaOfInterest</code>.
- *
- * This method is implemented to special case RenderableImages and
- * RenderedImages and delegate to
- * {@link #drawRenderableImage(RenderableImage, AffineTransform)} and
- * {@link #drawRenderedImage(RenderedImage, AffineTransform)} accordingly.
- * Other image types are not yet handled.
- *
- * @param image the image to be rendered
- * @param xform the transform from image space to user space
- * @param obs the image observer to be notified
- * @param areaOfInterest the area in image space that is rendered
- */
- private boolean drawImageImpl(Image image, AffineTransform xform,
- ImageObserver obs, Rectangle areaOfInterest)
- {
- boolean ret;
- if (image == null)
- {
- ret = true;
- }
- else if (image instanceof RenderedImage)
- {
- // FIXME: Handle the ImageObserver.
- drawRenderedImageImpl((RenderedImage) image, xform, areaOfInterest);
- ret = true;
- }
- else if (image instanceof RenderableImage)
- {
- // FIXME: Handle the ImageObserver.
- drawRenderableImageImpl((RenderableImage) image, xform, areaOfInterest);
- ret = true;
- }
- else
- {
- // FIXME: Implement rendering of other Image types.
- ret = false;
- }
- return ret;
- }
-
- /**
- * Renders a BufferedImage and applies the specified BufferedImageOp before
- * to filter the BufferedImage somehow. The resulting BufferedImage is then
- * passed on to {@link #drawRenderedImage(RenderedImage, AffineTransform)}
- * to perform the final rendering.
- *
- * @param image the source buffered image
- * @param op the filter to apply to the buffered image before rendering
- * @param x the x coordinate to render the image to
- * @param y the y coordinate to render the image to
- */
- public void drawImage(BufferedImage image, BufferedImageOp op, int x, int y)
- {
- BufferedImage filtered =
- op.createCompatibleDestImage(image, image.getColorModel());
- AffineTransform t = new AffineTransform();
- t.translate(x, y);
- drawRenderedImage(filtered, t);
- }
-
- /**
- * Renders the specified image to the destination raster. The specified
- * transform is used to convert the image into user space. The transform
- * of this AbstractGraphics2D object is used to transform from user space
- * to device space.
- *
- * The rendering is performed using the scanline algorithm that performs the
- * rendering of other shapes and a custom Paint implementation, that supplies
- * the pixel values of the rendered image.
- *
- * @param image the image to render to the destination raster
- * @param xform the transform from image space to user space
- */
- public void drawRenderedImage(RenderedImage image, AffineTransform xform)
- {
- Rectangle areaOfInterest = new Rectangle(image.getMinX(),
- image.getHeight(),
- image.getWidth(),
- image.getHeight());
- drawRenderedImageImpl(image, xform, areaOfInterest);
- }
-
- /**
- * Renders the specified image to the destination raster. The specified
- * transform is used to convert the image into user space. The transform
- * of this AbstractGraphics2D object is used to transform from user space
- * to device space. Only the area specified by <code>areaOfInterest</code>
- * is finally rendered to the target.
- *
- * The rendering is performed using the scanline algorithm that performs the
- * rendering of other shapes and a custom Paint implementation, that supplies
- * the pixel values of the rendered image.
- *
- * @param image the image to render to the destination raster
- * @param xform the transform from image space to user space
- */
- private void drawRenderedImageImpl(RenderedImage image,
- AffineTransform xform,
- Rectangle areaOfInterest)
- {
- // First we compute the transformation. This is made up of 3 parts:
- // 1. The areaOfInterest -> image space transform.
- // 2. The image space -> user space transform.
- // 3. The user space -> device space transform.
- AffineTransform t = new AffineTransform();
- t.translate(- areaOfInterest.x - image.getMinX(),
- - areaOfInterest.y - image.getMinY());
- t.concatenate(xform);
- t.concatenate(transform);
- AffineTransform it = null;
- try
- {
- it = t.createInverse();
- }
- catch (NoninvertibleTransformException ex)
- {
- // Ignore -- we return if the transform is not invertible.
- }
- if (it != null)
- {
- // Transform the area of interest into user space.
- GeneralPath aoi = new GeneralPath(areaOfInterest);
- aoi.transform(xform);
- // Render the shape using the standard renderer, but with a temporary
- // ImagePaint.
- ImagePaint p = new ImagePaint(image, it);
- Paint savedPaint = paint;
- try
- {
- paint = p;
- fillShape(aoi, false);
- }
- finally
- {
- paint = savedPaint;
- }
- }
- }
-
- /**
- * Renders a renderable image. This produces a RenderedImage, which is
- * then passed to {@link #drawRenderedImage(RenderedImage, AffineTransform)}
- * to perform the final rendering.
- *
- * @param image the renderable image to be rendered
- * @param xform the transform from image space to user space
- */
- public void drawRenderableImage(RenderableImage image, AffineTransform xform)
- {
- Rectangle areaOfInterest = new Rectangle((int) image.getMinX(),
- (int) image.getHeight(),
- (int) image.getWidth(),
- (int) image.getHeight());
- drawRenderableImageImpl(image, xform, areaOfInterest);
-
- }
-
- /**
- * Renders a renderable image. This produces a RenderedImage, which is
- * then passed to {@link #drawRenderedImage(RenderedImage, AffineTransform)}
- * to perform the final rendering. Only the area of the image specified
- * by <code>areaOfInterest</code> is rendered.
- *
- * @param image the renderable image to be rendered
- * @param xform the transform from image space to user space
- */
- private void drawRenderableImageImpl(RenderableImage image,
- AffineTransform xform,
- Rectangle areaOfInterest)
- {
- // TODO: Maybe make more clever usage of a RenderContext here.
- RenderedImage rendered = image.createDefaultRendering();
- drawRenderedImageImpl(rendered, xform, areaOfInterest);
- }
-
- /**
- * Draws the specified string at the specified location.
- *
- * @param text the string to draw
- * @param x the x location, relative to the bounding rectangle of the text
- * @param y the y location, relative to the bounding rectangle of the text
- */
- public void drawString(String text, int x, int y)
- {
- GlyphVector gv;
- synchronized (searchTextKey)
- {
- TextCacheKey tck = searchTextKey;
- FontRenderContext frc = getFontRenderContext();
- tck.setString(text);
- tck.setFont(font);
- tck.setFontRenderContext(frc);
- if (gvCache.containsKey(tck))
- {
- gv = gvCache.get(tck);
- }
- else
- {
- gv = font.createGlyphVector(frc, text.toCharArray());
- gvCache.put(new TextCacheKey(text, font, frc), gv);
- }
- }
- drawGlyphVector(gv, x, y);
- }
-
- /**
- * Draws the specified string at the specified location.
- *
- * @param text the string to draw
- * @param x the x location, relative to the bounding rectangle of the text
- * @param y the y location, relative to the bounding rectangle of the text
- */
- public void drawString(String text, float x, float y)
- {
- FontRenderContext ctx = getFontRenderContext();
- GlyphVector gv = font.createGlyphVector(ctx, text.toCharArray());
- drawGlyphVector(gv, x, y);
- }
-
- /**
- * Draws the specified string (as AttributedCharacterIterator) at the
- * specified location.
- *
- * @param iterator the string to draw
- * @param x the x location, relative to the bounding rectangle of the text
- * @param y the y location, relative to the bounding rectangle of the text
- */
- public void drawString(AttributedCharacterIterator iterator, int x, int y)
- {
- FontRenderContext ctx = getFontRenderContext();
- GlyphVector gv = font.createGlyphVector(ctx, iterator);
- drawGlyphVector(gv, x, y);
- }
-
- /**
- * Draws the specified string (as AttributedCharacterIterator) at the
- * specified location.
- *
- * @param iterator the string to draw
- * @param x the x location, relative to the bounding rectangle of the text
- * @param y the y location, relative to the bounding rectangle of the text
- */
- public void drawString(AttributedCharacterIterator iterator, float x, float y)
- {
- FontRenderContext ctx = getFontRenderContext();
- GlyphVector gv = font.createGlyphVector(ctx, iterator);
- drawGlyphVector(gv, x, y);
- }
-
- /**
- * Fills the specified shape with the current foreground.
- *
- * @param shape the shape to fill
- */
- public void fill(Shape shape)
- {
- fillShape(shape, false);
- }
-
- public boolean hit(Rectangle rect, Shape text, boolean onStroke)
- {
- // FIXME: Implement this.
- throw new UnsupportedOperationException("Not yet implemented");
- }
-
- /**
- * Sets the composite.
- *
- * @param comp the composite to set
- */
- public void setComposite(Composite comp)
- {
- if (! (comp instanceof AlphaComposite))
- {
- // FIXME: this check is only required "if this Graphics2D
- // context is drawing to a Component on the display screen".
- SecurityManager sm = System.getSecurityManager();
- if (sm != null)
- sm.checkPermission(new AWTPermission("readDisplayPixels"));
- }
-
- composite = comp;
- if (! (comp.equals(AlphaComposite.SrcOver)))
- isOptimized = false;
- else
- updateOptimization();
- }
-
- /**
- * Sets the current foreground.
- *
- * @param p the foreground to set.
- */
- public void setPaint(Paint p)
- {
- if (p != null)
- {
- paint = p;
-
- if (! (paint instanceof Color))
- {
- isOptimized = false;
- }
- else
- {
- this.foreground = (Color) paint;
- isForegroundColorNull = false;
- updateOptimization();
- }
- }
- else
- {
- this.foreground = Color.BLACK;
- isForegroundColorNull = true;
- }
-
- // free resources if needed, then put the paint context to null
- if (this.paintContext != null)
- this.paintContext.dispose();
-
- this.paintContext = null;
- }
-
- /**
- * Sets the stroke for this graphics object.
- *
- * @param s the stroke to set
- */
- public void setStroke(Stroke s)
- {
- stroke = s;
- if (! stroke.equals(new BasicStroke()))
- isOptimized = false;
- else
- updateOptimization();
- }
-
- /**
- * Sets the specified rendering hint.
- *
- * @param hintKey the key of the rendering hint
- * @param hintValue the value
- */
- public void setRenderingHint(Key hintKey, Object hintValue)
- {
- renderingHints.put(hintKey, hintValue);
- }
-
- /**
- * Returns the rendering hint for the specified key.
- *
- * @param hintKey the rendering hint key
- *
- * @return the rendering hint for the specified key
- */
- public Object getRenderingHint(Key hintKey)
- {
- return renderingHints.get(hintKey);
- }
-
- /**
- * Sets the specified rendering hints.
- *
- * @param hints the rendering hints to set
- */
- public void setRenderingHints(Map hints)
- {
- renderingHints.clear();
- renderingHints.putAll(hints);
- }
-
- /**
- * Adds the specified rendering hints.
- *
- * @param hints the rendering hints to add
- */
- public void addRenderingHints(Map hints)
- {
- renderingHints.putAll(hints);
- }
-
- /**
- * Returns the current rendering hints.
- *
- * @return the current rendering hints
- */
- public RenderingHints getRenderingHints()
- {
- return (RenderingHints) renderingHints.clone();
- }
-
- /**
- * Translates the coordinate system by (x, y).
- *
- * @param x the translation X coordinate
- * @param y the translation Y coordinate
- */
- public void translate(int x, int y)
- {
- transform.translate(x, y);
-
- // Update the clip. We special-case rectangular clips here, because they
- // are so common (e.g. in Swing).
- if (clip != null)
- {
- if (clip instanceof Rectangle)
- {
- Rectangle r = (Rectangle) clip;
- r.x -= x;
- r.y -= y;
- setClip(r);
- }
- else
- {
- AffineTransform clipTransform = new AffineTransform();
- clipTransform.translate(-x, -y);
- updateClip(clipTransform);
- }
- }
- }
-
- /**
- * Translates the coordinate system by (tx, ty).
- *
- * @param tx the translation X coordinate
- * @param ty the translation Y coordinate
- */
- public void translate(double tx, double ty)
- {
- transform.translate(tx, ty);
-
- // Update the clip. We special-case rectangular clips here, because they
- // are so common (e.g. in Swing).
- if (clip != null)
- {
- if (clip instanceof Rectangle)
- {
- Rectangle r = (Rectangle) clip;
- r.x -= tx;
- r.y -= ty;
- }
- else
- {
- AffineTransform clipTransform = new AffineTransform();
- clipTransform.translate(-tx, -ty);
- updateClip(clipTransform);
- }
- }
- }
-
- /**
- * Rotates the coordinate system by <code>theta</code> degrees.
- *
- * @param theta the angle be which to rotate the coordinate system
- */
- public void rotate(double theta)
- {
- transform.rotate(theta);
- if (clip != null)
- {
- AffineTransform clipTransform = new AffineTransform();
- clipTransform.rotate(-theta);
- updateClip(clipTransform);
- }
- updateOptimization();
- }
-
- /**
- * Rotates the coordinate system by <code>theta</code> around the point
- * (x, y).
- *
- * @param theta the angle by which to rotate the coordinate system
- * @param x the point around which to rotate, X coordinate
- * @param y the point around which to rotate, Y coordinate
- */
- public void rotate(double theta, double x, double y)
- {
- transform.rotate(theta, x, y);
- if (clip != null)
- {
- AffineTransform clipTransform = new AffineTransform();
- clipTransform.rotate(-theta, x, y);
- updateClip(clipTransform);
- }
- updateOptimization();
- }
-
- /**
- * Scales the coordinate system by the factors <code>scaleX</code> and
- * <code>scaleY</code>.
- *
- * @param scaleX the factor by which to scale the X axis
- * @param scaleY the factor by which to scale the Y axis
- */
- public void scale(double scaleX, double scaleY)
- {
- transform.scale(scaleX, scaleY);
- if (clip != null)
- {
- AffineTransform clipTransform = new AffineTransform();
- clipTransform.scale(1 / scaleX, 1 / scaleY);
- updateClip(clipTransform);
- }
- updateOptimization();
- }
-
- /**
- * Shears the coordinate system by <code>shearX</code> and
- * <code>shearY</code>.
- *
- * @param shearX the X shearing
- * @param shearY the Y shearing
- */
- public void shear(double shearX, double shearY)
- {
- transform.shear(shearX, shearY);
- if (clip != null)
- {
- AffineTransform clipTransform = new AffineTransform();
- clipTransform.shear(-shearX, -shearY);
- updateClip(clipTransform);
- }
- updateOptimization();
- }
-
- /**
- * Transforms the coordinate system using the specified transform
- * <code>t</code>.
- *
- * @param t the transform
- */
- public void transform(AffineTransform t)
- {
- transform.concatenate(t);
- try
- {
- AffineTransform clipTransform = t.createInverse();
- updateClip(clipTransform);
- }
- catch (NoninvertibleTransformException ex)
- {
- // TODO: How can we deal properly with this?
- ex.printStackTrace();
- }
- updateOptimization();
- }
-
- /**
- * Sets the transformation for this Graphics object.
- *
- * @param t the transformation to set
- */
- public void setTransform(AffineTransform t)
- {
- // Transform clip into target space using the old transform.
- updateClip(transform);
- transform.setTransform(t);
- // Transform the clip back into user space using the inverse new transform.
- try
- {
- updateClip(transform.createInverse());
- }
- catch (NoninvertibleTransformException ex)
- {
- // TODO: How can we deal properly with this?
- ex.printStackTrace();
- }
- updateOptimization();
- }
-
- /**
- * Returns the transformation of this coordinate system.
- *
- * @return the transformation of this coordinate system
- */
- public AffineTransform getTransform()
- {
- return (AffineTransform) transform.clone();
- }
-
- /**
- * Returns the current foreground.
- *
- * @return the current foreground
- */
- public Paint getPaint()
- {
- return paint;
- }
-
-
- /**
- * Returns the current composite.
- *
- * @return the current composite
- */
- public Composite getComposite()
- {
- return composite;
- }
-
- /**
- * Sets the current background.
- *
- * @param color the background to set.
- */
- public void setBackground(Color color)
- {
- background = color;
- }
-
- /**
- * Returns the current background.
- *
- * @return the current background
- */
- public Color getBackground()
- {
- return background;
- }
-
- /**
- * Returns the current stroke.
- *
- * @return the current stroke
- */
- public Stroke getStroke()
- {
- return stroke;
- }
-
- /**
- * Intersects the clip of this graphics object with the specified clip.
- *
- * @param s the clip with which the current clip should be intersected
- */
- public void clip(Shape s)
- {
- // Initialize clip if not already present.
- if (clip == null)
- setClip(s);
-
- // This is so common, let's optimize this.
- else if (clip instanceof Rectangle && s instanceof Rectangle)
- {
- Rectangle clipRect = (Rectangle) clip;
- Rectangle r = (Rectangle) s;
- computeIntersection(r.x, r.y, r.width, r.height, clipRect);
- // Call setClip so that subclasses get notified.
- setClip(clipRect);
- }
- else
- {
- Area current;
- if (clip instanceof Area)
- current = (Area) clip;
- else
- current = new Area(clip);
-
- Area intersect;
- if (s instanceof Area)
- intersect = (Area) s;
- else
- intersect = new Area(s);
-
- current.intersect(intersect);
- clip = current;
- isOptimized = false;
- // Call setClip so that subclasses get notified.
- setClip(clip);
- }
- }
-
- public FontRenderContext getFontRenderContext()
- {
- // Protect our own transform from beeing modified.
- AffineTransform tf = new AffineTransform(transform);
- // TODO: Determine antialias and fractionalmetrics parameters correctly.
- return new FontRenderContext(tf, false, true);
- }
-
- /**
- * Draws the specified glyph vector at the specified location.
- *
- * @param gv the glyph vector to draw
- * @param x the location, x coordinate
- * @param y the location, y coordinate
- */
- public void drawGlyphVector(GlyphVector gv, float x, float y)
- {
- translate(x, y);
- fillShape(gv.getOutline(), true);
- translate(-x, -y);
- }
-
- /**
- * Creates a copy of this graphics object.
- *
- * @return a copy of this graphics object
- */
- public Graphics create()
- {
- AbstractGraphics2D copy = (AbstractGraphics2D) clone();
- return copy;
- }
-
- /**
- * Creates and returns a copy of this Graphics object. This should
- * be overridden by subclasses if additional state must be handled when
- * cloning. This is called by {@link #create()}.
- *
- * @return a copy of this Graphics object
- */
- protected Object clone()
- {
- try
- {
- AbstractGraphics2D copy = (AbstractGraphics2D) super.clone();
- // Copy the clip. If it's a Rectangle, preserve that for optimization.
- if (clip instanceof Rectangle)
- copy.clip = new Rectangle((Rectangle) clip);
- else if (clip != null)
- copy.clip = new GeneralPath(clip);
- else
- copy.clip = null;
-
- copy.renderingHints = new RenderingHints(null);
- copy.renderingHints.putAll(renderingHints);
- copy.transform = new AffineTransform(transform);
- // The remaining state is inmmutable and doesn't need to be copied.
- return copy;
- }
- catch (CloneNotSupportedException ex)
- {
- AWTError err = new AWTError("Unexpected exception while cloning");
- err.initCause(ex);
- throw err;
- }
- }
-
- /**
- * Returns the current foreground.
- */
- public Color getColor()
- {
- if (isForegroundColorNull)
- return null;
-
- return this.foreground;
- }
-
- /**
- * Sets the current foreground.
- *
- * @param color the foreground to set
- */
- public void setColor(Color color)
- {
- this.setPaint(color);
- }
-
- public void setPaintMode()
- {
- // FIXME: Implement this.
- throw new UnsupportedOperationException("Not yet implemented");
- }
-
- public void setXORMode(Color color)
- {
- // FIXME: Implement this.
- throw new UnsupportedOperationException("Not yet implemented");
- }
-
- /**
- * Returns the current font.
- *
- * @return the current font
- */
- public Font getFont()
- {
- return font;
- }
-
- /**
- * Sets the font on this graphics object. When <code>f == null</code>, the
- * current setting is not changed.
- *
- * @param f the font to set
- */
- public void setFont(Font f)
- {
- if (f != null)
- font = f;
- }
-
- /**
- * Returns the font metrics for the specified font.
- *
- * @param font the font for which to fetch the font metrics
- *
- * @return the font metrics for the specified font
- */
- public FontMetrics getFontMetrics(Font font)
- {
- return Toolkit.getDefaultToolkit().getFontMetrics(font);
- }
-
- /**
- * Returns the bounds of the current clip.
- *
- * @return the bounds of the current clip
- */
- public Rectangle getClipBounds()
- {
- Rectangle b = null;
- if (clip != null)
- b = clip.getBounds();
- return b;
- }
-
- /**
- * Intersects the current clipping region with the specified rectangle.
- *
- * @param x the x coordinate of the rectangle
- * @param y the y coordinate of the rectangle
- * @param width the width of the rectangle
- * @param height the height of the rectangle
- */
- public void clipRect(int x, int y, int width, int height)
- {
- clip(new Rectangle(x, y, width, height));
- }
-
- /**
- * Sets the clip to the specified rectangle.
- *
- * @param x the x coordinate of the clip rectangle
- * @param y the y coordinate of the clip rectangle
- * @param width the width of the clip rectangle
- * @param height the height of the clip rectangle
- */
- public void setClip(int x, int y, int width, int height)
- {
- setClip(new Rectangle(x, y, width, height));
- }
-
- /**
- * Returns the current clip.
- *
- * @return the current clip
- */
- public Shape getClip()
- {
- return clip;
- }
-
- /**
- * Sets the current clipping area to <code>clip</code>.
- *
- * @param c the clip to set
- */
- public void setClip(Shape c)
- {
- clip = c;
- if (! (clip instanceof Rectangle))
- isOptimized = false;
- else
- updateOptimization();
- }
-
- public void copyArea(int x, int y, int width, int height, int dx, int dy)
- {
- if (isOptimized)
- rawCopyArea(x, y, width, height, dx, dy);
- else
- copyAreaImpl(x, y, width, height, dx, dy);
- }
-
- /**
- * Draws a line from (x1, y1) to (x2, y2).
- *
- * This implementation transforms the coordinates and forwards the call to
- * {@link #rawDrawLine}.
- */
- public void drawLine(int x1, int y1, int x2, int y2)
- {
- if (isOptimized)
- {
- int tx = (int) transform.getTranslateX();
- int ty = (int) transform.getTranslateY();
- rawDrawLine(x1 + tx, y1 + ty, x2 + tx, y2 + ty);
- }
- else
- {
- ShapeCache sc = shapeCache;
- if (sc.line == null)
- sc.line = new Line2D.Float();
- sc.line.setLine(x1, y1, x2, y2);
- draw(sc.line);
- }
- }
-
- public void drawRect(int x, int y, int w, int h)
- {
- if (isOptimized)
- {
- int tx = (int) transform.getTranslateX();
- int ty = (int) transform.getTranslateY();
- rawDrawRect(x + tx, y + ty, w, h);
- }
- else
- {
- ShapeCache sc = shapeCache;
- if (sc.rect == null)
- sc.rect = new Rectangle();
- sc.rect.setBounds(x, y, w, h);
- draw(sc.rect);
- }
- }
-
- /**
- * Fills a rectangle with the current paint.
- *
- * @param x the upper left corner, X coordinate
- * @param y the upper left corner, Y coordinate
- * @param width the width of the rectangle
- * @param height the height of the rectangle
- */
- public void fillRect(int x, int y, int width, int height)
- {
- if (isOptimized)
- {
- rawFillRect(x + (int) transform.getTranslateX(),
- y + (int) transform.getTranslateY(), width, height);
- }
- else
- {
- ShapeCache sc = shapeCache;
- if (sc.rect == null)
- sc.rect = new Rectangle();
- sc.rect.setBounds(x, y, width, height);
- fill(sc.rect);
- }
- }
-
- /**
- * Fills a rectangle with the current background color.
- *
- * This implementation temporarily sets the foreground color to the
- * background and forwards the call to {@link #fillRect(int, int, int, int)}.
- *
- * @param x the upper left corner, X coordinate
- * @param y the upper left corner, Y coordinate
- * @param width the width of the rectangle
- * @param height the height of the rectangle
- */
- public void clearRect(int x, int y, int width, int height)
- {
- if (isOptimized)
- rawClearRect(x, y, width, height);
- else
- {
- Paint savedForeground = getPaint();
- setPaint(getBackground());
- fillRect(x, y, width, height);
- setPaint(savedForeground);
- }
- }
-
- /**
- * Draws a rounded rectangle.
- *
- * @param x the x coordinate of the rectangle
- * @param y the y coordinate of the rectangle
- * @param width the width of the rectangle
- * @param height the height of the rectangle
- * @param arcWidth the width of the arcs
- * @param arcHeight the height of the arcs
- */
- public void drawRoundRect(int x, int y, int width, int height, int arcWidth,
- int arcHeight)
- {
- ShapeCache sc = shapeCache;
- if (sc.roundRect == null)
- sc.roundRect = new RoundRectangle2D.Float();
- sc.roundRect.setRoundRect(x, y, width, height, arcWidth, arcHeight);
- draw(sc.roundRect);
- }
-
- /**
- * Fills a rounded rectangle.
- *
- * @param x the x coordinate of the rectangle
- * @param y the y coordinate of the rectangle
- * @param width the width of the rectangle
- * @param height the height of the rectangle
- * @param arcWidth the width of the arcs
- * @param arcHeight the height of the arcs
- */
- public void fillRoundRect(int x, int y, int width, int height, int arcWidth,
- int arcHeight)
- {
- ShapeCache sc = shapeCache;
- if (sc.roundRect == null)
- sc.roundRect = new RoundRectangle2D.Float();
- sc.roundRect.setRoundRect(x, y, width, height, arcWidth, arcHeight);
- fill(sc.roundRect);
- }
-
- /**
- * Draws the outline of an oval.
- *
- * @param x the upper left corner of the bounding rectangle of the ellipse
- * @param y the upper left corner of the bounding rectangle of the ellipse
- * @param width the width of the ellipse
- * @param height the height of the ellipse
- */
- public void drawOval(int x, int y, int width, int height)
- {
- ShapeCache sc = shapeCache;
- if (sc.ellipse == null)
- sc.ellipse = new Ellipse2D.Float();
- sc.ellipse.setFrame(x, y, width, height);
- draw(sc.ellipse);
- }
-
- /**
- * Fills an oval.
- *
- * @param x the upper left corner of the bounding rectangle of the ellipse
- * @param y the upper left corner of the bounding rectangle of the ellipse
- * @param width the width of the ellipse
- * @param height the height of the ellipse
- */
- public void fillOval(int x, int y, int width, int height)
- {
- ShapeCache sc = shapeCache;
- if (sc.ellipse == null)
- sc.ellipse = new Ellipse2D.Float();
- sc.ellipse.setFrame(x, y, width, height);
- fill(sc.ellipse);
- }
-
- /**
- * Draws an arc.
- */
- public void drawArc(int x, int y, int width, int height, int arcStart,
- int arcAngle)
- {
- ShapeCache sc = shapeCache;
- if (sc.arc == null)
- sc.arc = new Arc2D.Float();
- sc.arc.setArc(x, y, width, height, arcStart, arcAngle, Arc2D.OPEN);
- draw(sc.arc);
- }
-
- /**
- * Fills an arc.
- */
- public void fillArc(int x, int y, int width, int height, int arcStart,
- int arcAngle)
- {
- ShapeCache sc = shapeCache;
- if (sc.arc == null)
- sc.arc = new Arc2D.Float();
- sc.arc.setArc(x, y, width, height, arcStart, arcAngle, Arc2D.PIE);
- draw(sc.arc);
- }
-
- public void drawPolyline(int[] xPoints, int[] yPoints, int npoints)
- {
- ShapeCache sc = shapeCache;
- if (sc.polyline == null)
- sc.polyline = new GeneralPath();
- GeneralPath p = sc.polyline;
- p.reset();
- if (npoints > 0)
- p.moveTo(xPoints[0], yPoints[0]);
- for (int i = 1; i < npoints; i++)
- p.lineTo(xPoints[i], yPoints[i]);
- fill(p);
- }
-
- /**
- * Draws the outline of a polygon.
- */
- public void drawPolygon(int[] xPoints, int[] yPoints, int npoints)
- {
- ShapeCache sc = shapeCache;
- if (sc.polygon == null)
- sc.polygon = new Polygon();
- sc.polygon.reset();
- sc.polygon.xpoints = xPoints;
- sc.polygon.ypoints = yPoints;
- sc.polygon.npoints = npoints;
- draw(sc.polygon);
- }
-
- /**
- * Fills the outline of a polygon.
- */
- public void fillPolygon(int[] xPoints, int[] yPoints, int npoints)
- {
- ShapeCache sc = shapeCache;
- if (sc.polygon == null)
- sc.polygon = new Polygon();
- sc.polygon.reset();
- sc.polygon.xpoints = xPoints;
- sc.polygon.ypoints = yPoints;
- sc.polygon.npoints = npoints;
- fill(sc.polygon);
- }
-
- /**
- * Draws the specified image at the specified location. This forwards
- * to {@link #drawImage(Image, AffineTransform, ImageObserver)}.
- *
- * @param image the image to render
- * @param x the x location to render to
- * @param y the y location to render to
- * @param observer the image observer to receive notification
- */
- public boolean drawImage(Image image, int x, int y, ImageObserver observer)
- {
- boolean ret;
- if (isOptimized)
- {
- ret = rawDrawImage(image, x + (int) transform.getTranslateX(),
- y + (int) transform.getTranslateY(), observer);
- }
- else
- {
- AffineTransform t = new AffineTransform();
- t.translate(x, y);
- ret = drawImage(image, t, observer);
- }
- return ret;
- }
-
- /**
- * Draws the specified image at the specified location. The image
- * is scaled to the specified width and height. This forwards
- * to {@link #drawImage(Image, AffineTransform, ImageObserver)}.
- *
- * @param image the image to render
- * @param x the x location to render to
- * @param y the y location to render to
- * @param width the target width of the image
- * @param height the target height of the image
- * @param observer the image observer to receive notification
- */
- public boolean drawImage(Image image, int x, int y, int width, int height,
- ImageObserver observer)
- {
- AffineTransform t = new AffineTransform();
- int imWidth = image.getWidth(observer);
- int imHeight = image.getHeight(observer);
- if (imWidth == width && imHeight == height)
- {
- // No need to scale, fall back to non-scaling loops.
- return drawImage(image, x, y, observer);
- }
- else
- {
- Image scaled = prepareImage(image, width, height);
- // Ideally, this should notify the observer about the scaling progress.
- return drawImage(scaled, x, y, observer);
- }
- }
-
- /**
- * Draws the specified image at the specified location. This forwards
- * to {@link #drawImage(Image, AffineTransform, ImageObserver)}.
- *
- * @param image the image to render
- * @param x the x location to render to
- * @param y the y location to render to
- * @param bgcolor the background color to use for transparent pixels
- * @param observer the image observer to receive notification
- */
- public boolean drawImage(Image image, int x, int y, Color bgcolor,
- ImageObserver observer)
- {
- AffineTransform t = new AffineTransform();
- t.translate(x, y);
- // TODO: Somehow implement the background option.
- return drawImage(image, t, observer);
- }
-
- /**
- * Draws the specified image at the specified location. The image
- * is scaled to the specified width and height. This forwards
- * to {@link #drawImage(Image, AffineTransform, ImageObserver)}.
- *
- * @param image the image to render
- * @param x the x location to render to
- * @param y the y location to render to
- * @param width the target width of the image
- * @param height the target height of the image
- * @param bgcolor the background color to use for transparent pixels
- * @param observer the image observer to receive notification
- */
- public boolean drawImage(Image image, int x, int y, int width, int height,
- Color bgcolor, ImageObserver observer)
- {
- AffineTransform t = new AffineTransform();
- t.translate(x, y);
- double scaleX = (double) image.getWidth(observer) / (double) width;
- double scaleY = (double) image.getHeight(observer) / (double) height;
- t.scale(scaleX, scaleY);
- // TODO: Somehow implement the background option.
- return drawImage(image, t, observer);
- }
-
- /**
- * Draws an image fragment to a rectangular area of the target.
- *
- * @param image the image to render
- * @param dx1 the first corner of the destination rectangle
- * @param dy1 the first corner of the destination rectangle
- * @param dx2 the second corner of the destination rectangle
- * @param dy2 the second corner of the destination rectangle
- * @param sx1 the first corner of the source rectangle
- * @param sy1 the first corner of the source rectangle
- * @param sx2 the second corner of the source rectangle
- * @param sy2 the second corner of the source rectangle
- * @param observer the image observer to be notified
- */
- public boolean drawImage(Image image, int dx1, int dy1, int dx2, int dy2,
- int sx1, int sy1, int sx2, int sy2,
- ImageObserver observer)
- {
- int sx = Math.min(sx1, sx1);
- int sy = Math.min(sy1, sy2);
- int sw = Math.abs(sx1 - sx2);
- int sh = Math.abs(sy1 - sy2);
- int dx = Math.min(dx1, dx1);
- int dy = Math.min(dy1, dy2);
- int dw = Math.abs(dx1 - dx2);
- int dh = Math.abs(dy1 - dy2);
-
- AffineTransform t = new AffineTransform();
- t.translate(sx - dx, sy - dy);
- double scaleX = (double) sw / (double) dw;
- double scaleY = (double) sh / (double) dh;
- t.scale(scaleX, scaleY);
- Rectangle areaOfInterest = new Rectangle(sx, sy, sw, sh);
- return drawImageImpl(image, t, observer, areaOfInterest);
- }
-
- /**
- * Draws an image fragment to a rectangular area of the target.
- *
- * @param image the image to render
- * @param dx1 the first corner of the destination rectangle
- * @param dy1 the first corner of the destination rectangle
- * @param dx2 the second corner of the destination rectangle
- * @param dy2 the second corner of the destination rectangle
- * @param sx1 the first corner of the source rectangle
- * @param sy1 the first corner of the source rectangle
- * @param sx2 the second corner of the source rectangle
- * @param sy2 the second corner of the source rectangle
- * @param bgcolor the background color to use for transparent pixels
- * @param observer the image observer to be notified
- */
- public boolean drawImage(Image image, int dx1, int dy1, int dx2, int dy2,
- int sx1, int sy1, int sx2, int sy2, Color bgcolor,
- ImageObserver observer)
- {
- // FIXME: Do something with bgcolor.
- return drawImage(image, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, observer);
- }
-
- /**
- * Disposes this graphics object.
- */
- public void dispose()
- {
- // Nothing special to do here.
- }
-
- /**
- * Fills the specified shape. Override this if your backend can efficiently
- * fill shapes. This is possible on many systems via a polygon fill
- * method or something similar. But keep in mind that Shapes can be quite
- * complex (non-convex, with holes etc), which is not necessarily supported
- * by all polygon fillers. Also note that you must perform clipping
- * before filling the shape.
- *
- * @param s the shape to fill
- * @param isFont <code>true</code> if the shape is a font outline
- */
- protected void fillShape(Shape s, boolean isFont)
- {
- // Determine if we need to antialias stuff.
- boolean antialias = false;
- if (isFont)
- {
- Object v = renderingHints.get(RenderingHints.KEY_TEXT_ANTIALIASING);
- // We default to antialiasing for text rendering.
- antialias = v == RenderingHints.VALUE_TEXT_ANTIALIAS_ON
- || (v == RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT
- && DEFAULT_TEXT_AA);
- }
- else
- {
- Object v = renderingHints.get(RenderingHints.KEY_ANTIALIASING);
- antialias = (v == RenderingHints.VALUE_ANTIALIAS_ON);
- }
- ScanlineConverter sc = getScanlineConverter();
- int resolution = 0;
- int yRes = 0;
- if (antialias)
- {
- // Adjust resolution according to rendering hints.
- resolution = 2;
- yRes = 4;
- }
- sc.renderShape(this, s, clip, transform, resolution, yRes, renderingHints);
- freeScanlineConverter(sc);
- }
-
- /**
- * Returns the color model of this Graphics object.
- *
- * @return the color model of this Graphics object
- */
- protected abstract ColorModel getColorModel();
-
- /**
- * Returns the bounds of the target.
- *
- * @return the bounds of the target
- */
- protected abstract Rectangle getDeviceBounds();
-
- /**
- * Draws a line in optimization mode. The implementation should respect the
- * clip and translation. It can assume that the clip is a rectangle and that
- * the transform is only a translating transform.
- *
- * @param x0 the starting point, X coordinate
- * @param y0 the starting point, Y coordinate
- * @param x1 the end point, X coordinate
- * @param y1 the end point, Y coordinate
- */
- protected void rawDrawLine(int x0, int y0, int x1, int y1)
- {
- ShapeCache sc = shapeCache;
- if (sc.line == null)
- sc.line = new Line2D.Float();
- sc.line.setLine(x0, y0, x1, y1);
- draw(sc.line);
- }
-
- protected void rawDrawRect(int x, int y, int w, int h)
- {
- ShapeCache sc = shapeCache;
- if (sc.rect == null)
- sc.rect = new Rectangle();
- sc.rect.setBounds(x, y, w, h);
- draw(sc.rect);
- }
-
- /**
- * Clears a rectangle in optimization mode. The implementation should respect the
- * clip and translation. It can assume that the clip is a rectangle and that
- * the transform is only a translating transform.
- *
- * @param x the upper left corner, X coordinate
- * @param y the upper left corner, Y coordinate
- * @param w the width
- * @param h the height
- */
- protected void rawClearRect(int x, int y, int w, int h)
- {
- Paint savedForeground = getPaint();
- setPaint(getBackground());
- rawFillRect(x, y, w, h);
- setPaint(savedForeground);
- }
-
- /**
- * Fills a rectangle in optimization mode. The implementation should respect
- * the clip but can assume that it is a rectangle.
- *
- * @param x the upper left corner, X coordinate
- * @param y the upper left corner, Y coordinate
- * @param w the width
- * @param h the height
- */
- protected void rawFillRect(int x, int y, int w, int h)
- {
- ShapeCache sc = shapeCache;
- if (sc.rect == null)
- sc.rect = new Rectangle();
- sc.rect.setBounds(x, y, w, h);
- fill(sc.rect);
- }
-
- /**
- * Draws an image in optimization mode. The implementation should respect
- * the clip but can assume that it is a rectangle.
- *
- * @param image the image to be painted
- * @param x the location, X coordinate
- * @param y the location, Y coordinate
- * @param obs the image observer to be notified
- *
- * @return <code>true</code> when the image is painted completely,
- * <code>false</code> if it is still rendered
- */
- protected boolean rawDrawImage(Image image, int x, int y, ImageObserver obs)
- {
- AffineTransform t = new AffineTransform();
- t.translate(x, y);
- return drawImage(image, t, obs);
- }
-
- /**
- * Copies a rectangular region to another location.
- *
- * @param x the upper left corner, X coordinate
- * @param y the upper left corner, Y coordinate
- * @param w the width
- * @param h the height
- * @param dx
- * @param dy
- */
- protected void rawCopyArea(int x, int y, int w, int h, int dx, int dy)
- {
- copyAreaImpl(x, y, w, h, dx, dy);
- }
-
- // Private implementation methods.
-
- /**
- * Copies a rectangular area of the target raster to a different location.
- */
- private void copyAreaImpl(int x, int y, int w, int h, int dx, int dy)
- {
- // FIXME: Implement this properly.
- throw new UnsupportedOperationException("Not implemented yet.");
- }
-
- /**
- * Paints a scanline between x0 and x1. Override this when your backend
- * can efficiently draw/fill horizontal lines.
- *
- * @param x0 the left offset
- * @param x1 the right offset
- * @param y the scanline
- */
- public void renderScanline(int y, ScanlineCoverage c)
- {
- PaintContext pCtx = getPaintContext();
-
- int x0 = c.getMinX();
- int x1 = c.getMaxX();
- Raster paintRaster = pCtx.getRaster(x0, y, x1 - x0, 1);
-
- // Do the anti aliasing thing.
- float coverageAlpha = 0;
- float maxCoverage = c.getMaxCoverage();
- ColorModel cm = pCtx.getColorModel();
- DataBuffer db = paintRaster.getDataBuffer();
- Point loc = new Point(paintRaster.getMinX(), paintRaster.getMinY());
- SampleModel sm = paintRaster.getSampleModel();
- WritableRaster writeRaster = Raster.createWritableRaster(sm, db, loc);
- WritableRaster alphaRaster = cm.getAlphaRaster(writeRaster);
- int pixel;
- ScanlineCoverage.Iterator iter = c.iterate();
- while (iter.hasNext())
- {
- ScanlineCoverage.Range range = iter.next();
- coverageAlpha = range.getCoverage() / maxCoverage;
- if (coverageAlpha < 1.0)
- {
- for (int x = range.getXPos(); x < range.getXPosEnd(); x++)
- {
- pixel = alphaRaster.getSample(x, y, 0);
- pixel = (int) (pixel * coverageAlpha);
- alphaRaster.setSample(x, y, 0, pixel);
- }
- }
- }
- ColorModel paintColorModel = pCtx.getColorModel();
- CompositeContext cCtx = composite.createContext(paintColorModel,
- getColorModel(),
- renderingHints);
- WritableRaster raster = getDestinationRaster();
- WritableRaster targetChild = raster.createWritableTranslatedChild(-x0, -y);
-
- cCtx.compose(paintRaster, targetChild, targetChild);
- updateRaster(raster, x0, y, x1 - x0, 1);
- cCtx.dispose();
- }
-
-
- /**
- * Initializes this graphics object. This must be called by subclasses in
- * order to correctly initialize the state of this object.
- */
- protected void init()
- {
- setPaint(Color.BLACK);
- setFont(FONT);
- isOptimized = true;
- }
-
- /**
- * Returns a WritableRaster that is used by this class to perform the
- * rendering in. It is not necessary that the target surface immediately
- * reflects changes in the raster. Updates to the raster are notified via
- * {@link #updateRaster}.
- *
- * @return the destination raster
- */
- protected WritableRaster getDestinationRaster()
- {
- // TODO: Ideally we would fetch the xdrawable's surface pixels for
- // initialization of the raster.
- Rectangle db = getDeviceBounds();
- if (destinationRaster == null)
- {
- int[] bandMasks = new int[]{ 0xFF0000, 0xFF00, 0xFF };
- destinationRaster = Raster.createPackedRaster(DataBuffer.TYPE_INT,
- db.width, db.height,
- bandMasks, null);
- // Initialize raster with white.
- int x0 = destinationRaster.getMinX();
- int x1 = destinationRaster.getWidth() + x0;
- int y0 = destinationRaster.getMinY();
- int y1 = destinationRaster.getHeight() + y0;
- int numBands = destinationRaster.getNumBands();
- for (int y = y0; y < y1; y++)
- {
- for (int x = x0; x < x1; x++)
- {
- for (int b = 0; b < numBands; b++)
- destinationRaster.setSample(x, y, b, 255);
- }
- }
- }
- return destinationRaster;
- }
-
- /**
- * Notifies the backend that the raster has changed in the specified
- * rectangular area. The raster that is provided in this method is always
- * the same as the one returned in {@link #getDestinationRaster}.
- * Backends that reflect changes to this raster directly don't need to do
- * anything here.
- *
- * @param raster the updated raster, identical to the raster returned
- * by {@link #getDestinationRaster()}
- * @param x the upper left corner of the updated region, X coordinate
- * @param y the upper lef corner of the updated region, Y coordinate
- * @param w the width of the updated region
- * @param h the height of the updated region
- */
- protected void updateRaster(Raster raster, int x, int y, int w, int h)
- {
- // Nothing to do here. Backends that need to update their surface
- // to reflect the change should override this method.
- }
-
- // Some helper methods.
-
- /**
- * Helper method to check and update the optimization conditions.
- */
- private void updateOptimization()
- {
- int transformType = transform.getType();
- boolean optimizedTransform = false;
- if (transformType == AffineTransform.TYPE_IDENTITY
- || transformType == AffineTransform.TYPE_TRANSLATION)
- optimizedTransform = true;
-
- boolean optimizedClip = (clip == null || clip instanceof Rectangle);
- isOptimized = optimizedClip
- && optimizedTransform && paint instanceof Color
- && composite == AlphaComposite.SrcOver
- && stroke.equals(new BasicStroke());
- }
-
- /**
- * Calculates the intersection of two rectangles. The result is stored
- * in <code>rect</code>. This is basically the same
- * like {@link Rectangle#intersection(Rectangle)}, only that it does not
- * create new Rectangle instances. The tradeoff is that you loose any data in
- * <code>rect</code>.
- *
- * @param x upper-left x coodinate of first rectangle
- * @param y upper-left y coodinate of first rectangle
- * @param w width of first rectangle
- * @param h height of first rectangle
- * @param rect a Rectangle object of the second rectangle
- *
- * @throws NullPointerException if rect is null
- *
- * @return a rectangle corresponding to the intersection of the
- * two rectangles. An empty rectangle is returned if the rectangles
- * do not overlap
- */
- private static Rectangle computeIntersection(int x, int y, int w, int h,
- Rectangle rect)
- {
- int x2 = rect.x;
- int y2 = rect.y;
- int w2 = rect.width;
- int h2 = rect.height;
-
- int dx = (x > x2) ? x : x2;
- int dy = (y > y2) ? y : y2;
- int dw = (x + w < x2 + w2) ? (x + w - dx) : (x2 + w2 - dx);
- int dh = (y + h < y2 + h2) ? (y + h - dy) : (y2 + h2 - dy);
-
- if (dw >= 0 && dh >= 0)
- rect.setBounds(dx, dy, dw, dh);
- else
- rect.setBounds(0, 0, 0, 0);
-
- return rect;
- }
-
- /**
- * Helper method to transform the clip. This is called by the various
- * transformation-manipulation methods to update the clip (which is in
- * userspace) accordingly.
- *
- * The transform usually is the inverse transform that was applied to the
- * graphics object.
- *
- * @param t the transform to apply to the clip
- */
- private void updateClip(AffineTransform t)
- {
- if (! (clip instanceof GeneralPath))
- clip = new GeneralPath(clip);
-
- GeneralPath p = (GeneralPath) clip;
- p.transform(t);
- }
-
- /**
- * Returns a free scanline converter from the pool.
- *
- * @return a scanline converter
- */
- private ScanlineConverter getScanlineConverter()
- {
- synchronized (scanlineConverters)
- {
- ScanlineConverter sc;
- if (scanlineConverters.size() > 0)
- {
- sc = scanlineConverters.removeFirst();
- }
- else
- {
- sc = new ScanlineConverter();
- }
- return sc;
- }
- }
-
- /**
- * Puts a scanline converter back in the pool.
- *
- * @param sc
- */
- private void freeScanlineConverter(ScanlineConverter sc)
- {
- synchronized (scanlineConverters)
- {
- scanlineConverters.addLast(sc);
- }
- }
-
- private PaintContext getPaintContext()
- {
- if (this.paintContext == null)
- {
- this.paintContext =
- this.foreground.createContext(getColorModel(),
- getDeviceBounds(),
- getClipBounds(),
- getTransform(),
- getRenderingHints());
- }
-
- return this.paintContext;
- }
-
- /**
- * Scales an image to the specified width and height. This should also
- * be used to implement
- * {@link Toolkit#prepareImage(Image, int, int, ImageObserver)}.
- * This uses {@link Toolkit#createImage(ImageProducer)} to create the actual
- * image.
- *
- * @param image the image to prepare
- * @param w the width
- * @param h the height
- *
- * @return the scaled image
- */
- public static Image prepareImage(Image image, int w, int h)
- {
- // Try to find cached scaled image.
- HashMap<Dimension,Image> scaledTable = imageCache.get(image);
- Dimension size = new Dimension(w, h);
- Image scaled = null;
- if (scaledTable != null)
- {
- scaled = scaledTable.get(size);
- }
- if (scaled == null)
- {
- // No cached scaled image. Start scaling image now.
- ImageProducer source = image.getSource();
- ReplicateScaleFilter scaler = new ReplicateScaleFilter(w, h);
- FilteredImageSource filteredSource =
- new FilteredImageSource(source, scaler);
- // Ideally, this should asynchronously scale the image.
- Image scaledImage =
- Toolkit.getDefaultToolkit().createImage(filteredSource);
- scaled = scaledImage;
- // Put scaled image in cache.
- if (scaledTable == null)
- {
- scaledTable = new HashMap<Dimension,Image>();
- imageCache.put(image, scaledTable);
- }
- scaledTable.put(size, scaledImage);
- }
- return scaled;
- }
-
-}
diff --git a/libjava/classpath/gnu/java/awt/java2d/ActiveEdges.java b/libjava/classpath/gnu/java/awt/java2d/ActiveEdges.java
deleted file mode 100644
index efe1966e378..00000000000
--- a/libjava/classpath/gnu/java/awt/java2d/ActiveEdges.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/* ActiveEdges.java -- A collection of active edges for scanline conversion
- Copyright (C) 2006 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., 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 gnu.java.awt.java2d;
-
-import gnu.java.lang.CPStringBuilder;
-
-/**
- * A collection of active edges for scanline conversion.
- */
-final class ActiveEdges
-{
-
- /**
- * The active edges. This can contain null values at arbirary locations.
- * The method #sort() packs this together.
- */
- private PolyEdge[] activeEdges;
-
- /**
- * The actual number of active edges. The array can be bigger than this
- * number.
- */
- private int numActiveEdges;
-
- /**
- * Creates a new ActiveEdges object.
- */
- ActiveEdges()
- {
- activeEdges = new PolyEdge[8];
- numActiveEdges = 0;
- }
-
- /**
- * Clears out all active edges. This is cheap as it simply resets the
- * counter to 0. It does not release all references to PolyEdge instances.
- */
- void clear()
- {
- numActiveEdges = 0;
- }
-
- /**
- * Adds the specified edge to the list of active edges. This does not yet
- * sort the edges and therefore does destroy any order of the list.
- *
- * @param edge the edge to add
- */
- void add(PolyEdge edge)
- {
- // Grow array when necessary.
- int oldSize = activeEdges.length;
- if (numActiveEdges >= oldSize)
- {
- int newSize = oldSize + oldSize / 4 + 1;
- PolyEdge[] newEdges = new PolyEdge[newSize];
- System.arraycopy(activeEdges, 0, newEdges, 0, oldSize);
- activeEdges = newEdges;
- }
- activeEdges[numActiveEdges] = edge;
- numActiveEdges++;
- }
-
- /**
- * Intersects all active edges, sorts them according to their intersection
- * points and packs the array to remove unneeded edges. This does also
- * remove any edges that do not intersect the scanline (i.e. they end above
- * of the scanline).
- *
- * @param y the scanline height
- */
- void intersectSortAndPack(int n, int y)
- {
- // Intersect and pack in one go.
- int last = 0;
- PolyEdge tmp;
- for (int i = 0; i < numActiveEdges; i++)
- {
- PolyEdge edge = activeEdges[i];
- // Clear out edge that ends above the scanline.
- if (edge != null && edge.y1 >= y)
- {
- assert edge.y1 >= y && edge.y0 <= y : "edge must cross scanline";
- edge.intersect(n, y);
- activeEdges[last] = edge;
- last++;
-
- // Bubble up the added edge.
- for (int j = last - 1; j > 0; j--)
- {
- if (activeEdges[j].xIntersection
- < activeEdges[j - 1].xIntersection)
- {
- tmp = activeEdges[j];
- activeEdges[j] = activeEdges[j - 1];
- activeEdges[j - 1] = tmp;
- }
- else
- {
- // The beginning of the list is already sorted.
- break;
- }
- }
- }
- }
- numActiveEdges = last;
-
- }
-
- /**
- * Returns the number of active edges. This is only reliable after a
- * call to {@link #intersectSortAndPack(int, int)}.
- *
- * @return the number of active edges
- */
- int getNumActiveEdges()
- {
- return numActiveEdges;
- }
-
- /**
- * Returns the active edge at the position <code>i</code>.
- *
- * @param i the index
- *
- * @return the active edge at the specified index
- */
- PolyEdge getActiveEdge(int i)
- {
- return activeEdges[i];
- }
-
- /**
- * Removes all edges that end above the specified height.
- *
- * @param y the cut-off height
- */
- void remove(int y)
- {
- for (int i = 0; i < numActiveEdges; i++)
- {
- PolyEdge edge = activeEdges[i];
- if (edge != null && edge.y1 < y)
- {
- activeEdges[i] = null;
- }
- }
- }
-
- public String toString()
- {
- CPStringBuilder s = new CPStringBuilder();
- s.append("[ActiveEdges] ");
- for (int i = 0; i < numActiveEdges; i++)
- {
- s.append(activeEdges[i]);
- s.append(',');
- }
- return s.toString();
- }
-}
diff --git a/libjava/classpath/gnu/java/awt/java2d/AlphaCompositeContext.java b/libjava/classpath/gnu/java/awt/java2d/AlphaCompositeContext.java
deleted file mode 100644
index f1f082abe06..00000000000
--- a/libjava/classpath/gnu/java/awt/java2d/AlphaCompositeContext.java
+++ /dev/null
@@ -1,316 +0,0 @@
-/* AlphaCompositeContext.java -- CompositeContext impl for AlphaComposite
- Copyright (C) 2006 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., 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 gnu.java.awt.java2d;
-
-import java.awt.AWTError;
-import java.awt.AlphaComposite;
-import java.awt.CompositeContext;
-import java.awt.image.ColorModel;
-import java.awt.image.Raster;
-import java.awt.image.WritableRaster;
-
-/**
- * A CompositeContext implementation for {@link AlphaComposite}.
- *
- * @author Roman Kennke (kennke@aicas.com)
- */
-public class AlphaCompositeContext
- implements CompositeContext
-{
-
- /**
- * The Composite object for which we perform compositing.
- */
- private AlphaComposite composite;
-
- /**
- * The source color model.
- */
- private ColorModel srcColorModel;
-
- /**
- * The destination color model.
- */
- private ColorModel dstColorModel;
-
- /**
- * The blending factor for the source.
- */
- private float fs;
-
- /**
- * The blending factor for the destination.
- */
- private float fd;
-
- /**
- * Creates a new AlphaCompositeContext.
- *
- * @param aComp the AlphaComposite object
- * @param srcCM the source color model
- * @param dstCM the destination color model
- */
- public AlphaCompositeContext(AlphaComposite aComp, ColorModel srcCM,
- ColorModel dstCM)
- {
- composite = aComp;
- srcColorModel = srcCM;
- dstColorModel = dstCM;
-
-
- // Determine the blending factors according to the rule in the
- // AlphaComposite. For some rules the factors must be determined
- // dynamically because they depend on the actual pixel value.
- switch (composite.getRule())
- {
- case AlphaComposite.CLEAR:
- fs = 0.F;
- fd= 0.F;
- break;
- case AlphaComposite.DST:
- fs = 0.F;
- fd= 1.F;
- break;
- case AlphaComposite.DST_ATOP:
- fs = 1.F; // Determined later as 1 - alpha_dst;
- fd = 1.F; // Determined later as alpha_src;
- break;
- case AlphaComposite.DST_IN:
- fs = 0.F;
- fd = 0.F; // Determined later as alpha_src;
- break;
- case AlphaComposite.DST_OUT:
- fs = 0.F;
- fd = 0.F; // Determined later as 1 - alpha_src;
- break;
- case AlphaComposite.DST_OVER:
- fs = 1.F; // Determined later as 1 - alpha_dst.
- fd= 1.F;
- break;
- case AlphaComposite.SRC:
- fs = 1.F;
- fd= 0.F;
- break;
- case AlphaComposite.SRC_ATOP:
- fs = 1.F; // Determined later as alpha_dst;
- fd = 1.F; // Determined later as 1 - alpha_src;
- break;
- case AlphaComposite.SRC_IN:
- fs = 0.F; // Determined later as alpha_dst;
- fd = 0.F;
- break;
- case AlphaComposite.SRC_OUT:
- fs = 0.F; // Determined later as 1 - alpha_dst;
- fd = 0.F;
- break;
- case AlphaComposite.SRC_OVER:
- fs = 1.F;
- fd= 1.F; // Determined later as 1 - alpha_src.
- break;
- case AlphaComposite.XOR:
- fs = 1.F; // Determined later as 1 - alpha_dst.
- fd= 1.F; // Determined later as 1 - alpha_src.
- break;
- default:
- throw new AWTError("Illegal AlphaComposite rule");
- }
-
- }
-
- /**
- * Releases all resources held by this composite object.
- */
- public void dispose()
- {
- // Nothing to do here yet.
- }
-
- /**
- * Performs compositing according to the rules specified in the
- * AlphaComposite from the constructor.
- */
- public void compose(Raster src, Raster dstIn, WritableRaster dstOut)
- {
-
- // TODO: This implementation is very general and highly inefficient. There
- // are two possible ways to optimize this:
- // 1. Special cased implementations for common ColorModels and transfer
- // types.
- // 2. Native implementation.
-
- int x0 = src.getMinX();
- int y0 = src.getMinY();
- int width = src.getWidth();
- int height = src.getHeight();
- int x1 = x0 + width;
- int y1 = y0 + height;
-
- Object srcPixel = null;
- Object dstPixel = null;
-
- // Prepare the array that holds the color and alpha components of the
- // source pixels.
- float[] srcComponents;
- int srcComponentsLength = srcColorModel.getNumComponents();
- if (! srcColorModel.hasAlpha())
- srcComponentsLength += 1;
- srcComponents = new float[srcComponentsLength];
-
- // Prepare the array that holds the color and alpha components of the
- // destination pixels.
- float[] dstComponents;
- int dstComponentsLength = dstColorModel.getNumComponents();
- if (! dstColorModel.hasAlpha())
- dstComponentsLength += 1;
- dstComponents = new float[dstComponentsLength];
-
- if (srcComponentsLength != dstComponentsLength)
- throw new AWTError("The color models of the source and destination have"
- + "incompatible number of color components");
-
- int srcTransferType = srcColorModel.getTransferType();
- int dstTransferType = dstColorModel.getTransferType();
-
- for (int y = y0; y < y1; y++)
- {
- for (int x = x0; x < x1; x++)
- {
- // Fetch source pixel.
- srcPixel = src.getDataElements(x, y, (int[]) srcPixel);
- // Fetch destination pixel.
- dstPixel = dstIn.getDataElements(x, y, dstPixel);
- // Get normalized components. This is the only type that is
- // guaranteed to be supported by all ColorModels.
- srcComponents =
- srcColorModel.getNormalizedComponents(srcPixel, srcComponents, 0);
- if (! srcColorModel.hasAlpha())
- srcComponents[srcComponentsLength - 1] = 1.0F;
- dstComponents =
- dstColorModel.getNormalizedComponents(dstPixel, dstComponents, 0);
- if (! dstColorModel.hasAlpha())
- dstComponents[dstComponentsLength - 1] = 1.0F;
-
- // Prepare the input.
- float compositeAlpha = composite.getAlpha();
- srcComponents[srcComponentsLength - 1] *= compositeAlpha;
- if (srcColorModel.isAlphaPremultiplied())
- {
- for (int i = srcComponentsLength - 2; i >= 0; i--)
- srcComponents[i] *= compositeAlpha;
- }
- else
- {
- for (int i = srcComponentsLength - 2; i >= 0; i--)
- srcComponents[i] *= srcComponents[srcComponentsLength - 1];
- }
- if (! dstColorModel.isAlphaPremultiplied())
- {
- for (int i = dstComponentsLength - 2; i >= 0; i--)
- dstComponents[i] *= dstComponents[dstComponents.length - 1];
- }
-
- // Determine the blending factors according to the rule in the
- // AlphaComposite. For some rules the factors must be determined
- // dynamically because they depend on the actual pixel value.
- float srcAlpha = srcComponents[srcComponentsLength - 1];
- float dstAlpha = dstComponents[dstComponentsLength - 1];
- switch (composite.getRule())
- {
- case AlphaComposite.DST_ATOP:
- fs = 1.F - dstAlpha;
- fd = srcAlpha;
- break;
- case AlphaComposite.DST_IN:
- fd = srcAlpha;
- break;
- case AlphaComposite.DST_OUT:
- fd = 1.F - srcAlpha;
- break;
- case AlphaComposite.DST_OVER:
- fs = 1.F - dstAlpha;
- break;
- case AlphaComposite.SRC_ATOP:
- fs = srcAlpha;
- fd = 1.F - srcAlpha;
- break;
- case AlphaComposite.SRC_IN:
- fs = dstAlpha;
- break;
- case AlphaComposite.SRC_OUT:
- fs = 1.F - dstAlpha;
- break;
- case AlphaComposite.SRC_OVER:
- fd= 1.F - srcAlpha;
- break;
- case AlphaComposite.XOR:
- fs = 1.F - dstAlpha;
- fd= 1.F - srcAlpha;
- break;
- default:
- // For the other cases the factors have already been determined
- // in the constructor.
- }
-
- // Apply the blending equation to the pixels.
- for (int i = 0; i < srcComponentsLength; i++)
- {
- dstComponents[i] = srcComponents[i] * fs
- + dstComponents[i] * fd;
- }
-
- // Convert the result back when the destination is not
- // alpha-premultiplied.
- dstAlpha = dstComponents[dstComponentsLength - 1];
- if (!dstColorModel.isAlphaPremultiplied() && dstAlpha != 0.F)
- {
- for (int i = 0; i < dstComponentsLength - 1; i++)
- {
- dstComponents[i] = dstComponents[i] / dstAlpha;
- }
- }
-
- // Store the result in the destination raster.
- dstPixel = dstColorModel.getDataElements(dstComponents, 0,
- dstPixel);
- dstOut.setDataElements(x, y, dstPixel);
- } // End X loop.
- } // End Y loop.
- }
-
-}
diff --git a/libjava/classpath/gnu/java/awt/java2d/CubicSegment.java b/libjava/classpath/gnu/java/awt/java2d/CubicSegment.java
deleted file mode 100644
index 8197c94c5c6..00000000000
--- a/libjava/classpath/gnu/java/awt/java2d/CubicSegment.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/* CubicSegment.java -- Cubic segment used for BasicStroke
- Copyright (C) 2006 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., 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 gnu.java.awt.java2d;
-
-
-import java.awt.geom.CubicCurve2D;
-import java.awt.geom.Point2D;
-
-/**
- * Cubic Bezier curve segment
- */
-public class CubicSegment extends Segment
-{
- public Point2D cp1; // control points
- public Point2D cp2; // control points
-
- /**
- * Constructor - takes coordinates of the starting point,
- * first control point, second control point and end point,
- * respecively.
- */
- public CubicSegment(double x1, double y1, double c1x, double c1y,
- double c2x, double c2y, double x2, double y2)
- {
- super();
- P1 = new Point2D.Double(x1, y1);
- P2 = new Point2D.Double(x2, y2);
- cp1 = new Point2D.Double(c1x, c1y);
- cp2 = new Point2D.Double(c2x, c2y);
- }
-
- public CubicSegment(Point2D p1, Point2D cp1, Point2D cp2, Point2D p2)
- {
- super();
- P1 = p1;
- P2 = p2;
- this.cp1 = cp1;
- this.cp2 = cp2;
- }
-
- /**
- * Clones this segment
- */
- public Object clone()
- {
- CubicSegment segment = null;
-
- try
- {
- segment = (CubicSegment) super.clone();
-
- segment.P1 = (Point2D) P1.clone();
- segment.P2 = (Point2D) P2.clone();
- segment.cp1 = (Point2D) cp1.clone();
- segment.cp2 = (Point2D) cp2.clone();
- }
- catch (CloneNotSupportedException cnse)
- {
- InternalError ie = new InternalError();
- ie.initCause(cnse);
- throw ie;
- }
-
- return segment;
- }
-
- /**
- * Get the "top" and "bottom" segments of this segment. First array element is
- * p0 + normal, second is p0 - normal.
- */
- public Segment[] getDisplacedSegments(double radius)
- {
- // It is, apparently, impossible to derive a curve parallel to a bezier
- // curve (unless it's a straight line), so we have no choice but to
- // approximate the displaced segments. Similar to FlattenPathIterator.
-
- Segment segmentTop = null;
- Segment segmentBottom = null;
- this.radius = radius;
-
- CubicCurve2D[] curves = new CubicCurve2D[10];
- curves[0] = new CubicCurve2D.Double(P1.getX(), P1.getY(), cp1.getX(),
- cp1.getY(), cp2.getX(), cp2.getY(),
- P2.getX(), P2.getY());
- int numCurves = 1;
-
- // Hard-coded a recursion limit of 10 and flatness of 1... should we make
- // this an option somewhere?
- while (numCurves > 0)
- {
- // The curve is flat enough, or we've reached our recursion limit,
- // so take the current start/end points and add it as a line segment
- // to our final approximated curves
- if (curves[numCurves - 1].getFlatnessSq() <= (radius / 3) || numCurves == 10)
- {
- Segment[] displaced = new LineSegment(
- curves[numCurves - 1].getP1(),
- curves[numCurves - 1].getP2()).getDisplacedSegments(radius);
- if (segmentTop == null)
- {
- segmentTop = displaced[0];
- segmentBottom = displaced[1];
- }
- else
- {
- segmentTop.add(displaced[0]);
- segmentBottom.add(displaced[1]);
- }
- numCurves--;
- }
-
- // Otherwise, subdivide again and continue
- else
- {
- CubicCurve2D left = new CubicCurve2D.Double();
- CubicCurve2D right = new CubicCurve2D.Double();
- curves[numCurves - 1].subdivide(left, right);
- curves[numCurves - 1] = right;
- curves[numCurves] = left;
- curves[numCurves - 1] = right;
- curves[numCurves] = left;
- numCurves++;
- }
- }
-
- return new Segment[] { segmentTop, segmentBottom };
- }
-
- public void reverse()
- {
- Point2D temp = P1;
- P1 = P2;
- P2 = temp;
- temp = cp1;
- cp1 = cp2;
- cp2 = temp;
- }
-
- public double[] cp1()
- {
- return new double[]{cp1.getX(), cp1.getY()};
- }
-
- public double[] cp2()
- {
- return new double[]{cp2.getX(), cp2.getY()};
- }
-} // class CubicSegment
diff --git a/libjava/classpath/gnu/java/awt/java2d/ImagePaint.java b/libjava/classpath/gnu/java/awt/java2d/ImagePaint.java
deleted file mode 100644
index 7e5fb56388e..00000000000
--- a/libjava/classpath/gnu/java/awt/java2d/ImagePaint.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/* ImagePaint.java -- Supplies the pixels for image rendering
- Copyright (C) 2006 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., 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 gnu.java.awt.java2d;
-
-import java.awt.Paint;
-import java.awt.PaintContext;
-import java.awt.Rectangle;
-import java.awt.RenderingHints;
-import java.awt.Transparency;
-import java.awt.geom.AffineTransform;
-import java.awt.geom.Rectangle2D;
-import java.awt.image.ColorModel;
-import java.awt.image.Raster;
-import java.awt.image.RenderedImage;
-import java.awt.image.WritableRaster;
-
-/**
- * This class is used as a temporary Paint object to supply the pixel values
- * for image rendering using the normal scanline conversion implementation.
- *
- * @author Roman Kennke (kennke@aicas.com)
- */
-public class ImagePaint
- implements Paint
-{
-
- /**
- * The PaintContext implementation for the ImagePaint.
- */
- private class ImagePaintContext
- implements PaintContext
- {
-
- /**
- * The target raster.
- */
- private WritableRaster target;
-
- /**
- * Nothing to do here.
- */
- public void dispose()
- {
- // Nothing to do here.
- }
-
- /**
- * Returns the color model.
- *
- * @return the color model
- */
- public ColorModel getColorModel()
- {
- return image.getColorModel();
- }
-
- /**
- * Supplies the pixel to be rendered.
- *
- * @see PaintContext#getRaster(int, int, int, int)
- */
- public Raster getRaster(int x1, int y1, int w, int h)
- {
- ensureRasterSize(w, h);
- int x2 = x1 + w;
- int y2 = y1 + h;
- float[] src = new float[2];
- float[] dest = new float[2];
- Raster source = image.getData();
- int minX = source.getMinX();
- int maxX = source.getWidth() + minX;
- int minY = source.getMinY();
- int maxY = source.getHeight() + minY;
- Object pixel = null;
- for (int y = y1; y < y2; y++)
- {
- for (int x = x1; x < x2; x++)
- {
- src[0] = x;
- src[1] = y;
- transform.transform(src, 0, dest, 0, 1);
- int dx = (int) dest[0];
- int dy = (int) dest[1];
- // Pixels outside the source image are not of interest, skip
- // them.
- if (dx >= minX && dx < maxX && dy >= minY && dy < maxY)
- {
- pixel = source.getDataElements(dx, dy, pixel);
- target.setDataElements(x - x1, y - y1, pixel);
- }
- }
- }
- return target;
- }
-
- /**
- * Ensures that the target raster exists and has at least the specified
- * size.
- *
- * @param w the requested target width
- * @param h the requested target height
- */
- private void ensureRasterSize(int w, int h)
- {
- if (target == null || target.getWidth() < w || target.getHeight() < h)
- {
- Raster s = image.getData();
- target = s.createCompatibleWritableRaster(w, h);
- }
- }
- }
-
- /**
- * The image to render.
- */
- RenderedImage image;
-
- /**
- * The transform from image space to device space. This is the inversed
- * transform of the concatenated
- * transform image space -> user space -> device space transform.
- */
- AffineTransform transform;
-
- /**
- * Creates a new ImagePaint for rendering the specified image using the
- * specified device space -> image space transform. This transform
- * is the inversed transform of the usual image space -> user space -> device
- * space transform.
- *
- * The ImagePaint will only render the image in the specified area of
- * interest (which is specified in image space).
- *
- * @param i the image to render
- * @param t the device space to user space transform
- */
- ImagePaint(RenderedImage i, AffineTransform t)
- {
- image = i;
- transform = t;
- }
-
- public PaintContext createContext(ColorModel cm, Rectangle deviceBounds,
- Rectangle2D userBounds,
- AffineTransform xform,
- RenderingHints hints)
- {
- return new ImagePaintContext();
- }
-
- public int getTransparency()
- {
- return Transparency.OPAQUE;
- }
-
-}
diff --git a/libjava/classpath/gnu/java/awt/java2d/LineSegment.java b/libjava/classpath/gnu/java/awt/java2d/LineSegment.java
deleted file mode 100644
index 904037989c0..00000000000
--- a/libjava/classpath/gnu/java/awt/java2d/LineSegment.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/* LineSegment.java -- Line segment used for BasicStroke
- Copyright (C) 2006 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., 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 gnu.java.awt.java2d;
-
-
-import java.awt.geom.Point2D;
-
-public class LineSegment extends Segment
-{
- public LineSegment(double x1, double y1, double x2, double y2)
- {
- super();
- P1 = new Point2D.Double(x1, y1);
- P2 = new Point2D.Double(x2, y2);
- }
-
- public LineSegment(Point2D p1, Point2D p2)
- {
- super();
- P1 = (Point2D) p1.clone();
- P2 = (Point2D) p2.clone();
- }
-
- /**
- * Clones this segment
- */
- public Object clone()
- {
- LineSegment segment = null;
-
- try
- {
- segment = (LineSegment) super.clone();
- segment.P1 = (Point2D) P1.clone();
- segment.P2 = (Point2D) P2.clone();
- }
- catch (CloneNotSupportedException cnse)
- {
- InternalError ie = new InternalError();
- ie.initCause(cnse);
- throw ie;
- }
-
- return segment;
- }
-
- /**
- * Get the "top" and "bottom" segments of this segment.
- * First array element is p0 + normal, second is p0 - normal.
- */
- public Segment[] getDisplacedSegments(double radius)
- {
- this.radius = radius;
- double x0 = P1.getX();
- double y0 = P1.getY();
- double x1 = P2.getX();
- double y1 = P2.getY();
- double[] p = normal(x0, y0, x1, y1);
- Segment s1 = (new LineSegment(x0 + p[0], y0 + p[1],
- x1 + p[0], y1 + p[1] ));
- Segment s2 = (new LineSegment(x0 - p[0], y0 - p[1],
- x1 - p[0], y1 - p[1] ));
- return new Segment[]{s1, s2};
- }
-
- public void reverse()
- {
- Point2D p = P1;
- P1 = P2;
- P2 = p;
- }
-
- public double[] cp1()
- {
- return new double[]{P2.getX(), P2.getY()};
- }
-
- public double[] cp2()
- {
- return new double[]{P1.getX(), P1.getY()};
- }
-} // class LineSegment
diff --git a/libjava/classpath/gnu/java/awt/java2d/PixelCoverage.java b/libjava/classpath/gnu/java/awt/java2d/PixelCoverage.java
deleted file mode 100644
index 356021b3d16..00000000000
--- a/libjava/classpath/gnu/java/awt/java2d/PixelCoverage.java
+++ /dev/null
@@ -1,132 +0,0 @@
-package gnu.java.awt.java2d;
-
-/**
- * Stores and handles the pixel converage for a scanline. The pixel coverage
- * is stored as sorted list of buckets, each of which holds information about
- * the coverage for the X and Y axis. This is utilized to compute the actual
- * coverage for each pixel on the scanline and finding chunks of pixels with
- * equal coverage.
- */
-final class PixelCoverage
-{
-
- /**
- * One bucket in the list.
- */
- private static final class Bucket
- {
- /**
- * The X coordinate on the scanline to which this bucket belongs.
- */
- int xPos;
-
- /**
- * The X coverage.
- */
- int xCov;
-
- /**
- * The Y coverage.
- */
- int yCov;
-
- /**
- * Implements a linked list. This points to the next element of the list.
- */
- Bucket next;
-
- /**
- * Implements a linked list. This points to the previous element of the
- * list.
- */
- Bucket prev;
- }
-
- /**
- * The head of the sorted list of buckets.
- */
- private Bucket head;
-
- /**
- * The current bucket. We make use of the fact that the scanline converter
- * always scans the scanline (and thus this list) from left to right to
- * quickly find buckets or insertion points.
- */
- private Bucket current;
-
- /**
- * The bucket after the last valid bucket. Unused buckets are not thrown
- * away and garbage collected. Instead, we keep them at the tail of the list
- * and reuse them when necessary.
- */
- private Bucket last;
-
- /**
- * Indicates the the next scan of the scanline begins and that the next
- * request will be at the beginning of this list. This makes searching and
- * sorting of this list very quick.
- */
- void rewind()
- {
- current = head;
- }
-
- /**
- * Clears the list. This does not throw away the old buckets but only
- * resets the end-pointer of the list to the first element. All buckets are
- * then unused and are reused when the list is filled again.
- */
- void clear()
- {
- last = head;
- }
-
- /**
- * This adds the specified x and y coverage to the pixel at the specified
- * X position.
- *
- * @param x the X position
- * @param xc the x coverage
- * @param yc the y coverage
- */
- void add(int x, int xc, int yc)
- {
- Bucket bucket = findOrInsert(x);
- bucket.xCov += xc;
- bucket.yCov += yc;
- }
-
- /**
- * Finds the bucket in the list with the specified X coordinate.
- * If no such bucket is found, then a new one is fetched (either a cached
- * bucket from the end of the list or a newly allocated one) inserted at the
- * correct position and returned.
- *
- * @param x the X coordinate
- *
- * @return a bucket to hold the coverage data
- */
- private Bucket findOrInsert(int x)
- {
- // First search for a matching bucket.
- if (head == null)
- {
- // Special case: the list is still empty.
- head = new Bucket();
- current = head;
- return head;
- }
-
- // This performs a linear search, starting from the current bucket.
- // This is reasonably efficient because access to this list is always done
- // in a linear fashion and we are not more then 1 or 2 buckets away from
- // the one we're looking for.
- Bucket match = current;
- while (match != null && match.xPos != x)
- {
-
- }
-
- return match;
- }
-}
diff --git a/libjava/classpath/gnu/java/awt/java2d/Pixelizer.java b/libjava/classpath/gnu/java/awt/java2d/Pixelizer.java
deleted file mode 100644
index 43e53bf63d9..00000000000
--- a/libjava/classpath/gnu/java/awt/java2d/Pixelizer.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/* Pixelizer.java -- Interface for the target of the rasterizer
- Copyright (C) 2007 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., 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 gnu.java.awt.java2d;
-
-/**
- * A pixelizer is responsible for actually manipulating the pixel of a drawing
- * surface after the scanline conversion process. It receives coverage
- * information for a scanline and adjusts the surface pixels accordingly.
- */
-public interface Pixelizer
-{
-
- /**
- * Renders the pixel for one scanline at the Y location <code>y</code>
- * and using the coverage information in <code>sc</code>.
- *
- * @param y the scanline Y coordinate
- * @param sc the coverage information
- */
- void renderScanline(int y, ScanlineCoverage sc);
-}
diff --git a/libjava/classpath/gnu/java/awt/java2d/PolyEdge.java b/libjava/classpath/gnu/java/awt/java2d/PolyEdge.java
deleted file mode 100644
index eb0cc7f8f3e..00000000000
--- a/libjava/classpath/gnu/java/awt/java2d/PolyEdge.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/* PolyEdge.java -- An edge in a polygon, used for polygon filling
- Copyright (C) 2006 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., 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 gnu.java.awt.java2d;
-
-import gnu.java.math.Fixed;
-
-/**
- * An edge in a polygon.
- *
- * @author Roman Kennke (kennke@aicas.com)
- */
-final class PolyEdge
- implements Comparable
-{
-
- /**
- * The start and end coordinates of the edge. y0 is always smaller or equal
- * than y1.
- *
- * These values are stored as fixed-point decimals.
- */
- public int x0, y0, x1, y1;
-
- /**
- * The slope of the edge. This is dx / dy.
- *
- * This is a fixed point decimal.
- */
- private int slope;
-
- /**
- * The intersection of this edge with the current scanline.
- *
- * This is a fixed point decimal.
- */
- int xIntersection;
-
- /**
- * Indicates whether this edge is from the clip or from the target shape.
- */
- boolean isClip;
-
- /**
- * Implements a linked list for the edge pool.
- */
- PolyEdge poolNext;
-
- /**
- * Implements a linked list for the scanline edge lists.
- */
- PolyEdge scanlineNext;
-
- /**
- * Create an uninitialized edge.
- */
- PolyEdge()
- {
- // Nothing to do here.
- }
-
- /**
- * Creates a new PolyEdge with the specified coordinates.
- *
- * @param x0 the starting point, x coordinate
- * @param y0 the starting point, y coordinate
- * @param x1 the end point, x coordinate
- * @param y1 the end point, y coordinate
- */
- PolyEdge(int n, int x0, int y0, int x1, int y1, boolean clip)
- {
- init(n, x0, y0, x1, y1, clip);
- }
-
- /**
- * (Re-) Initializes this edge.
- *
- * @param x0
- * @param y0
- * @param x1
- * @param y1
- */
- void init(int n, int x0, int y0, int x1, int y1, boolean clip)
- {
- isClip = clip;
- if (y0 < y1)
- {
- this.x0 = x0;
- this.y0 = y0;
- this.x1 = x1;
- this.y1 = y1;
- }
- else
- {
- this.x0 = x1;
- this.y0 = y1;
- this.x1 = x0;
- this.y1 = y0;
- }
- slope = Fixed.div(n, this.x1 - this.x0, this.y1 - this.y0);
- }
-
- /**
- * Sorts PolyEdges by the x coordinate from the minimum x value.
- */
- public int compareTo(Object o)
- {
- PolyEdge other = (PolyEdge) o;
- int comp = 0;
- if (x0 < other.x0)
- comp = -1;
- else if (x0 > other.x0)
- comp = 1;
- return comp;
- }
-
- /**
- * Intersects this edge with the scanline at height y. The result is
- * stored in {@link #xIntersection}.
- *
- * @param y the scanline
- */
- void intersect(int n, int y)
- {
- int dy = y - y0;
- int dx = Fixed.mul(n, slope, dy);
- xIntersection = x0 + dx;
- }
-
- public String toString()
- {
- return "Edge: " + x0 + ", " + y0 + ", " + x1 + ", " + y1 + ", slope: "
- + slope + ", xIntersection: " + xIntersection
- + ", isClip: " + isClip;
- }
-}
diff --git a/libjava/classpath/gnu/java/awt/java2d/PolyEdgeComparator.java b/libjava/classpath/gnu/java/awt/java2d/PolyEdgeComparator.java
deleted file mode 100644
index 6706f229490..00000000000
--- a/libjava/classpath/gnu/java/awt/java2d/PolyEdgeComparator.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/* PolyEdgeComparator.java -- Sorts PolyEdges by their current intersection
- points
- Copyright (C) 2006 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., 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 gnu.java.awt.java2d;
-
-import java.util.Comparator;
-
-/**
- * Sorts {@link PolyEdge}s by their current intersection points.
- *
- * @author Roman Kennke (kennke@aicas.com)
- */
-public class PolyEdgeComparator
- implements Comparator
-{
-
- /**
- * The current scanline.
- */
- int y;
-
- public int compare(Object o1, Object o2)
- {
- PolyEdge edge1 = (PolyEdge) o1;
- PolyEdge edge2 = (PolyEdge) o2;
- int comp = 0;
- if (edge1.xIntersection < edge2.xIntersection)
- comp = -1;
- else if (edge1.xIntersection > edge2.xIntersection)
- comp = 1;
- return comp;
- }
-
-}
diff --git a/libjava/classpath/gnu/java/awt/java2d/QuadSegment.java b/libjava/classpath/gnu/java/awt/java2d/QuadSegment.java
deleted file mode 100644
index b8d0ff52e3a..00000000000
--- a/libjava/classpath/gnu/java/awt/java2d/QuadSegment.java
+++ /dev/null
@@ -1,260 +0,0 @@
-/* QuadSegment.java -- QuadCurve segment used for BasicStroke
- Copyright (C) 2006 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., 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 gnu.java.awt.java2d;
-
-
-import java.awt.geom.Point2D;
-import java.awt.geom.QuadCurve2D;
-
-/**
- * Quadratic Bezier curve segment
- *
- * Note: Most peers don't support quadratics directly, so it might make
- * sense to represent them as cubics internally and just be done with it.
- * I think we should be peer-agnostic, however, and stay faithful to the
- * input geometry types as far as possible.
- */
-public class QuadSegment extends Segment
-{
- public Point2D cp; // control point
-
- /**
- * Constructor, takes the coordinates of the start, control,
- * and end point, respectively.
- */
- public QuadSegment(double x1, double y1, double cx, double cy, double x2,
- double y2)
- {
- super();
- P1 = new Point2D.Double(x1, y1);
- P2 = new Point2D.Double(x2, y2);
- cp = new Point2D.Double(cx, cy);
- }
-
- public QuadSegment(Point2D p1, Point2D cp, Point2D p2)
- {
- super();
- P1 = p1;
- P2 = p2;
- this.cp = cp;
- }
-
- public QuadSegment(QuadCurve2D curve)
- {
- super();
- P1 = curve.getP1();
- P2 = curve.getP2();
- this.cp = curve.getCtrlPt();
- }
-
- /**
- * Clones this segment
- */
- public Object clone()
- {
- QuadSegment segment = null;
-
- try
- {
- segment = (QuadSegment) super.clone();
-
- segment.P1 = (Point2D) P1.clone();
- segment.P2 = (Point2D) P2.clone();
- segment.cp = (Point2D) cp.clone();
- }
- catch (CloneNotSupportedException cnse)
- {
- InternalError ie = new InternalError();
- ie.initCause(cnse);
- throw ie;
- }
-
- return segment;
- }
-
- /**
- * Get the "top" and "bottom" segments of a given segment.
- * First array element is p0 + normal, second is p0 - normal.
- */
- public Segment[] getDisplacedSegments(double radius)
- {
- this.radius = radius;
- double x0 = P1.getX();
- double y0 = P1.getY();
- double x1 = cp.getX();
- double y1 = cp.getY();
- double x2 = P2.getX();
- double y2 = P2.getY();
-
- QuadCurve2D left = new QuadCurve2D.Double();
- QuadCurve2D right = new QuadCurve2D.Double();
- QuadCurve2D orig = new QuadCurve2D.Double(x0, y0, x1, y1, x2, y2);
- orig.subdivide(left, right);
-
- QuadSegment s1 = offsetSubdivided(left, true);
- QuadSegment s2 = offsetSubdivided(left, false);
-
- s1.add( offsetSubdivided(right, true) );
- s2.add( offsetSubdivided(right, false) );
-
- return new Segment[]{s1, s2};
- }
-
- private QuadSegment offsetSubdivided(QuadCurve2D curve, boolean plus)
- {
- double[] n1 = normal(curve.getX1(), curve.getY1(),
- curve.getCtrlX(), curve.getCtrlY());
- double[] n2 = normal(curve.getCtrlX(), curve.getCtrlY(),
- curve.getX2(), curve.getY2());
-
- Point2D cp;
- QuadSegment s;
- if(!plus)
- {
- n1[0] = -n1[0];
- n1[1] = -n1[1];
- n2[0] = -n2[0];
- n2[1] = -n2[1];
- }
-
- // Handle special cases where the control point is equal to an end point
- // or end points are equal (ie, straight lines)
- if (curve.getP1().equals(curve.getCtrlPt()))
- {
- cp = curve.getCtrlPt();
- cp.setLocation(cp.getX() + n2[0], cp.getY() + n2[1]);
- n1[0] = n2[0];
- n1[1] = n2[1];
- }
- else if (curve.getP2().equals(curve.getCtrlPt()))
- {
- cp = curve.getCtrlPt();
- cp.setLocation(cp.getX() + n1[0], cp.getY() + n1[1]);
- n2[0] = n1[0];
- n2[1] = n1[1];
- }
- else if (curve.getP1().equals(curve.getP2()))
- {
- cp = curve.getCtrlPt();
-
- double deltaX = curve.getX1() - curve.getCtrlX();
- double deltaY = curve.getY1() - curve.getCtrlY();
- double length = Math.sqrt((deltaX * deltaX) + (deltaY * deltaY));
- double ratio = radius / length;
- deltaX *= ratio;
- deltaY *= ratio;
-
- if (plus)
- cp.setLocation(cp.getX() + deltaX, cp.getY() + deltaY);
- else
- cp.setLocation(cp.getX() - deltaX, cp.getY() - deltaY);
- }
- else if (n1[0] == n2[0] && n1[1] == n2[1])
- {
- cp = curve.getCtrlPt();
- cp.setLocation(cp.getX() + n1[0], cp.getY() + n1[1]);
- }
- else
- {
- cp = lineIntersection(curve.getX1() + n1[0],
- curve.getY1() + n1[1],
- curve.getCtrlX() + n1[0],
- curve.getCtrlY() + n1[1],
- curve.getCtrlX() + n2[0],
- curve.getCtrlY() + n2[1],
- curve.getX2() + n2[0],
- curve.getY2() + n2[1], true);
- }
-
- s = new QuadSegment(curve.getX1() + n1[0], curve.getY1() + n1[1],
- cp.getX(), cp.getY(),
- curve.getX2() + n2[0], curve.getY2() + n2[1]);
-
- return s;
- }
-
- private Point2D lineIntersection(double X1, double Y1,
- double X2, double Y2,
- double X3, double Y3,
- double X4, double Y4,
- boolean infinite)
- {
- double x1 = X1;
- double y1 = Y1;
- double rx = X2 - x1;
- double ry = Y2 - y1;
-
- double x2 = X3;
- double y2 = Y3;
- double sx = X4 - x2;
- double sy = Y4 - y2;
-
- double determinant = sx * ry - sy * rx;
- double nom = (sx * (y2 - y1) + sy * (x1 - x2));
-
- // lines can be considered parallel.
- if (Math.abs(determinant) < 1E-6)
- return null;
-
- nom = nom / determinant;
-
- // check if lines are within the bounds
- if(!infinite && (nom > 1.0 || nom < 0.0))
- return null;
-
- return new Point2D.Double(x1 + nom * rx, y1 + nom * ry);
- }
-
- public void reverse()
- {
- Point2D p = P1;
- P1 = P2;
- P2 = p;
- }
-
- public double[] cp1()
- {
- return new double[]{cp.getX(), cp.getY()};
- }
-
- public double[] cp2()
- {
- return new double[]{cp.getX(), cp.getY()};
- }
-}
diff --git a/libjava/classpath/gnu/java/awt/java2d/RasterGraphics.java b/libjava/classpath/gnu/java/awt/java2d/RasterGraphics.java
deleted file mode 100644
index 193ea4c7c28..00000000000
--- a/libjava/classpath/gnu/java/awt/java2d/RasterGraphics.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/* RasterGraphics.java -- A Graphics2D impl for Rasters
- Copyright (C) 2006 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., 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 gnu.java.awt.java2d;
-
-import java.awt.GraphicsConfiguration;
-import java.awt.Rectangle;
-import java.awt.image.ColorModel;
-import java.awt.image.WritableRaster;
-
-/**
- * A Graphics2D implementation that operates on Raster objects. This is
- * primarily used for BufferedImages, but can theoretically be used on
- * arbitrary WritableRasters.
- *
- * @author Roman Kennke (kennke@aicas.com)
- */
-public class RasterGraphics
- extends AbstractGraphics2D
-{
-
- /**
- * The raster on which we operate.
- */
- private WritableRaster raster;
-
- /**
- * The color model of this Graphics instance.
- */
- private ColorModel colorModel;
-
- public RasterGraphics(WritableRaster r, ColorModel cm)
- {
- super();
- raster = r;
- colorModel = cm;
- init();
- }
-
- @Override
- public void renderScanline(int y, ScanlineCoverage c)
- {
- if (y >= getDeviceBounds().width)
- return;
-
- super.renderScanline(y, c);
- }
-
- /**
- * Returns the color model of this Graphics object.
- *
- * @return the color model of this Graphics object
- */
- protected ColorModel getColorModel()
- {
- return colorModel;
- }
-
- /**
- * Returns a WritableRaster that is used by this class to perform the
- * rendering in. It is not necessary that the target surface immediately
- * reflects changes in the raster. Updates to the raster are notified via
- * {@link AbstractGraphics2D#updateRaster}.
- *
- * @return the destination raster
- */
- protected WritableRaster getDestinationRaster()
- {
- return raster;
- }
-
- public GraphicsConfiguration getDeviceConfiguration()
- {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- protected Rectangle getDeviceBounds()
- {
- return this.raster.getBounds();
- }
-}
diff --git a/libjava/classpath/gnu/java/awt/java2d/Scanline.java b/libjava/classpath/gnu/java/awt/java2d/Scanline.java
deleted file mode 100644
index 24c3d34d5c3..00000000000
--- a/libjava/classpath/gnu/java/awt/java2d/Scanline.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/* Scanline.java -- A scanline for the scanline converter
- Copyright (C) 2006 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., 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 gnu.java.awt.java2d;
-
-/**
- * Represents a scanline in the {@link ScanlineConverter}. This is basically
- * a sorted list of {@link PolyEdge}s that is made for maximum reuse.
- */
-class Scanline
-{
-
- /**
- * The actual edges array. The fields can be null.
- */
- private PolyEdge edges;
-
- /**
- * Clears this scanline. This only resets the number of edges to 0. The
- * actual PolyEdge objects are preserved for possible later reuse.
- */
- void clear()
- {
- edges = null;
- }
-
- /**
- * Create a new Scanline.
- */
- Scanline()
- {
- // Nothing to do.
- }
-
- /**
- * Inserts an edge into this scanline. This is performed in a sorted fashion,
- * and so that it reuses as much existing resources as possible.
- */
- void addEdge(PolyEdge edge)
- {
-
- // Allocate PolyEdge when necessary or reuse an old one.
- edge.scanlineNext = edges;
- edges = edge;
- }
-
- /**
- * Returns the edges queue.
- *
- * @return the edges queue
- */
- PolyEdge getEdges()
- {
- return edges;
- }
-}
diff --git a/libjava/classpath/gnu/java/awt/java2d/ScanlineConverter.java b/libjava/classpath/gnu/java/awt/java2d/ScanlineConverter.java
deleted file mode 100644
index 2c3481b6c10..00000000000
--- a/libjava/classpath/gnu/java/awt/java2d/ScanlineConverter.java
+++ /dev/null
@@ -1,451 +0,0 @@
-/* ScanlineConverter.java -- Rasterizes Shapes
- Copyright (C) 2006, 2007 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., 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 gnu.java.awt.java2d;
-
-import gnu.java.math.Fixed;
-
-import java.awt.RenderingHints;
-import java.awt.Shape;
-import java.awt.geom.AffineTransform;
-import java.awt.geom.PathIterator;
-
-/**
- * Rasterizes {@link Shape} objects on an AbstractGraphics2D.
- */
-public final class ScanlineConverter
-{
-
- /**
- * The number of digits to use for fixed point arithmetics.
- */
- private static int FIXED_DIGITS = 6;
-
- /**
- * The fixed point constant for the number one.
- */
- private static int ONE = Fixed.fixedValue(FIXED_DIGITS, 1);
-
- /**
- * The actual number of scanlines.
- */
- private int numScanlines;
-
- /**
- * The number of scanlines. This can contain more elements than we have
- * scanlines. The real number of scanlines is stored in
- * {@link #numScanlines}. This can also contain null values for empty
- * scanlines.
- */
- private Scanline[] scanlines;
-
- /**
- * The upper bounds which correspond to the index 0 in the scanline array.
- *
- * This is a fixed point value.
- */
- private int upperBounds;
-
- /**
- * The resolution of the scanline converter.
- *
- * This is a fixed point value.
- */
- private int resolution;
-
- /**
- * The number of significant bits for the 'Y' resolution.
- */
- private int yResolution;
-
- /**
- * One half step according to the resolution. This is stored to avoid
- * unnecessary operations during rendering.
- */
- private int halfStep;
-
- /**
- * This is used in {@link #addShape(PathIterator, boolean)} to
- * receive the coordinates of the path.
- */
- private float[] coords;
-
- /**
- * The active edges.
- */
- private ActiveEdges activeEdges;
-
- private PolyEdge edgePool;
- private PolyEdge edgePoolLast;
-
- private int minY;
- private int maxY;
- private int minX;
- private int maxX;
-
- /**
- * Holds and manages information about the pixel coverage.
- */
- private ScanlineCoverage scanlineCoverage;
-
- /**
- * Create a new ScanlineConverter.
- */
- ScanlineConverter()
- {
- scanlines = new Scanline[10];
- coords = new float[6];
- activeEdges = new ActiveEdges();
- edgePool = new PolyEdge();
- edgePoolLast = edgePool;
- scanlineCoverage = new ScanlineCoverage();
- }
-
- /**
- * Renders the specified shape using the specified clip and transform.
- *
- * @param p the pixelizer that receives the coverage information
- * @param shape the shape to render
- * @param clip the clip
- * @param trans the transform
- */
- public void renderShape(Pixelizer p, Shape shape, Shape clip,
- AffineTransform trans, int res, int yRes,
- RenderingHints hints)
- {
- // TODO: Do something useful with the rendering hints. Like, adjusting
- // the resolution.
-
- // Prepare resolution and upper bounds.
- clear();
- setResolution(res, yRes);
-
- boolean haveClip = clip != null;
-
- // Add shapes.
- float flatness = Fixed.floatValue(FIXED_DIGITS, resolution / 2);
- PathIterator path = shape.getPathIterator(trans, flatness);
- addShape(path, false);
- if (haveClip)
- {
- path= clip.getPathIterator(trans, flatness);
- addShape(path, true);
- }
-
- setUpperBounds(minY);
-
- PolyEdge edge = edgePool;
- while (edge != edgePoolLast)
- {
- addEdge(edge);
- edge = edge.poolNext;
- }
-
- int y = upperBounds;
- int index;
- activeEdges.clear();
- // The render loop...
- Scanline scanline = null;
- int lastRealY = Fixed.intValue(FIXED_DIGITS, y);
- while (y <= maxY)
- {
- // First we put together our list of active edges.
- index = scanlineIndex(y);
- // If we go outside the scanline array we still need to render the
- // remaining edges until they end.
- scanline = index < scanlines.length ? scanlines[index] : null;
- if (scanline != null)
- {
- edge = scanline.getEdges();
- while (edge != null)
- {
- activeEdges.add(edge);
- edge = edge.scanlineNext;
- }
- }
-
- // Then we intersect all active edges with the current scanline
- // and sort them according to their intersection points.
- activeEdges.intersectSortAndPack(FIXED_DIGITS, y + halfStep);
-
- // Ok, now we can perform the actual scanlining.
- int realY = Fixed.intValue(FIXED_DIGITS, y + resolution);
- boolean push = lastRealY != realY;
-
- doScanline(p, y, push, haveClip);
-
- // Remove obsolete active edges.
- //activeEdges.remove(y + halfStep);
- // Go on with the next line...
- y += resolution;
- lastRealY = realY;
-
- }
- }
-
- /**
- * Clears all scanlines.
- */
- private void clear()
- {
- // Reset edge pool.
- edgePoolLast = edgePool;
-
- // Reset scanlines.
- for (int i = scanlines.length - 1; i >= 0 ; i--)
- {
- Scanline sl = scanlines[i];
- if (sl != null)
- sl.clear();
- }
-
- // Reset scanline coverage.
- scanlineCoverage.clear();
-
- // Reset bounds.
- minY = Integer.MAX_VALUE;
- maxY = Integer.MIN_VALUE;
- minX = Integer.MAX_VALUE;
- maxX = Integer.MIN_VALUE;
- }
-
- /**
- * Performs the scanlining on the current set of active edges.
- *
- * @param p the pixelizer to receive the pixel coverage data
- * @param y the Y coordinate
- * @param push true when the scanline is ready to be pushed to the
- * pixelizer
- * @param haveClip true when there's a clip, false otherwise
- */
- private void doScanline(Pixelizer p, int y, boolean push,
- boolean haveClip)
- {
- // First, rewind the scanline coverage.
- scanlineCoverage.rewind();
-
- // We begin outside the clip and outside the shape. We only draw when
- // we are inside the clip AND inside the shape.
- boolean inClip = ! haveClip;
- boolean inShape = false;
- PolyEdge lastEdge = null;
- int numEdges = activeEdges.getNumActiveEdges();
- for (int i = 0; i < numEdges; i++)
- {
- PolyEdge edge = activeEdges.getActiveEdge(i);
- if (inClip && inShape)
- {
- assert lastEdge != null;
- int x0 = lastEdge.xIntersection;
- int x1 = edge.xIntersection;
- assert x0 <= x1;
-
- int pix0 = Fixed.intValue(FIXED_DIGITS, x0);
- int pix1 = Fixed.intValue(FIXED_DIGITS, x1);
- int frac0 = ONE - Fixed.trunc(FIXED_DIGITS, x0);
- int frac1 = ONE - Fixed.trunc(FIXED_DIGITS, x1);
- // Only keep the first 4 digits after the point.
- frac0 = frac0 >> (FIXED_DIGITS - yResolution);
- frac1 = frac1 >> (FIXED_DIGITS - yResolution);
- scanlineCoverage.add(pix0, 1 * (1 << yResolution), frac0);
- scanlineCoverage.add(pix1, -1 * (1 << yResolution), -frac1);
- }
- if (edge.isClip)
- inClip = ! inClip;
- else
- inShape = ! inShape;
-
- lastEdge = edge;
- }
-
- // Push out the whole scanline to the pixelizer.
- if (push && ! scanlineCoverage.isEmpty())
- {
- p.renderScanline(Fixed.intValue(FIXED_DIGITS, y), scanlineCoverage);
- scanlineCoverage.clear();
- }
- }
-
-
- /**
- * Sets the resolution. A value of 0 rasterizes the shape normally without
- * anti-aliasing. Greater values renders with a resolution of 2 ^ res.
- *
- * @param res the resolution
- */
- private void setResolution(int res, int yRes)
- {
- int scanlinesPerPixel = 1 << res;
- int one = Fixed.fixedValue(FIXED_DIGITS, 1);
- resolution = one / (scanlinesPerPixel);
- halfStep = resolution / 2;
-
- scanlineCoverage.setMaxCoverage(scanlinesPerPixel << yResolution);
-
- yResolution = yRes;
- }
-
- /**
- * Sets the vertical bounds of that shape that is beeing rendered.
- *
- * @param y0 the upper bounds
- */
- private void setUpperBounds(int y0)
- {
- upperBounds = fit(y0);
- }
-
- /**
- * Add a shape to the scanline converter.
- *
- * @param path
- * @param clip
- */
- private void addShape(PathIterator path, boolean clip)
- {
- int startX = 0;
- int startY = 0;
- int lastX = 0;
- int lastY = 0;
- while (! path.isDone())
- {
- int type = path.currentSegment(coords);
- switch (type)
- {
- case PathIterator.SEG_MOVETO:
- startX = lastX = Fixed.fixedValue(FIXED_DIGITS, coords[0]);
- startY = lastY = Fixed.fixedValue(FIXED_DIGITS, coords[1]);
- minY = Math.min(startY, minY);
- maxY = Math.max(startY, maxY);
- minX = Math.min(startX, minX);
- maxX = Math.max(startX, maxX);
- break;
- case PathIterator.SEG_LINETO:
- int x = Fixed.fixedValue(FIXED_DIGITS, coords[0]);
- int y = Fixed.fixedValue(FIXED_DIGITS, coords[1]);
- edgePoolAdd(lastX, lastY, x, y, clip);
- lastX = x;
- lastY = y;
- minY = Math.min(lastY, minY);
- maxY = Math.max(lastY, maxY);
- minX = Math.min(lastX, minX);
- maxX = Math.max(lastX, maxX);
- break;
- case PathIterator.SEG_CLOSE:
- edgePoolAdd(lastX, lastY, startX, startY, clip);
- lastX = startX;
- lastY = startY;
- break;
- case PathIterator.SEG_CUBICTO:
- case PathIterator.SEG_QUADTO:
- default:
- assert false;
- }
- path.next();
- }
- }
-
- /**
- * Adds an edge into the scanline array.
- */
- private void addEdge(PolyEdge edge)
- {
- // Determine index.
- int upper = Math.min(edge.y0, edge.y1);
- // Fit to raster.
- int index = scanlineIndex(upper);
- // Grow array when necessary.
- if (index >= scanlines.length)
- {
- int oldSize = scanlines.length;
- int newSize = Math.max(oldSize + oldSize / 2 + 1, index + 10);
- Scanline[] newScanlines = new Scanline[newSize];
- System.arraycopy(scanlines, 0, newScanlines, 0, oldSize);
- scanlines = newScanlines;
- }
-
- // Add edge.
- if (scanlines[index] == null)
- {
- scanlines[index] = new Scanline();
- }
- scanlines[index].addEdge(edge);
- }
-
- /**
- * Fits an Y coordinate to the grid.
- *
- * @param y the Y coordinate to fit
- *
- * @return the fitted Y coordinate
- */
- private int fit(int y)
- {
- int val1 = Fixed.div(FIXED_DIGITS, y, resolution);
- int rounded = Fixed.round(FIXED_DIGITS, val1);
- return Fixed.mul(FIXED_DIGITS, rounded, resolution);
- }
-
- /**
- * Calculates the scanline index for the specified y coordinate.
- *
- * @param y the y coordinate as fixed point value
- *
- * @return the scanline index
- */
- private int scanlineIndex(int y)
- {
- int fitted = fit(y);
- // Cleverly skip the fixed point conversions here.
- return (fitted - upperBounds)/ resolution;
- }
-
- private void edgePoolAdd(int x0, int y0, int x1, int y1, boolean clip)
- {
- // Don't need no horizontal edges.
- if (y0 != y1)
- {
- edgePoolLast.init(FIXED_DIGITS, x0, y0, x1, y1, clip);
- if (edgePoolLast.poolNext == null)
- {
- edgePoolLast.poolNext = new PolyEdge();
- }
- edgePoolLast = edgePoolLast.poolNext;
- }
- }
-}
diff --git a/libjava/classpath/gnu/java/awt/java2d/ScanlineCoverage.java b/libjava/classpath/gnu/java/awt/java2d/ScanlineCoverage.java
deleted file mode 100644
index 9ffb63e1ddf..00000000000
--- a/libjava/classpath/gnu/java/awt/java2d/ScanlineCoverage.java
+++ /dev/null
@@ -1,630 +0,0 @@
-/* ScanlineCoverage.java -- Manages coverage information for a scanline
- Copyright (C) 2007 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., 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 gnu.java.awt.java2d;
-
-/**
- * Stores and handles the pixel converage for a scanline. The pixel coverage
- * is stored as sorted list of {@linke Covergage} entries, each of which holds
- * information about the coverage for the X and Y axis. This is utilized to
- * compute the actual coverage for each pixel on the scanline and finding
- * chunks of pixels with equal coverage quickly.
- */
-public final class ScanlineCoverage
-{
-
- /**
- * Iterates over the coverage list and calculates the actual coverage
- * ranges on a scanline.
- */
- public final class Iterator
- {
- /**
- * This instance is reused in the iteration.
- */
- private Range range;
-
- /**
- * The pointer to the current item in the iteration.
- */
- private Coverage currentItem;
-
- /**
- * The current coverage value.
- */
- private int currentCoverage;
-
- /**
- * True when the current pixel coverage has already been handled, false
- * otherwise.
- */
- private boolean handledPixelCoverage;
-
- /**
- * Creates a new CoverageIterator.
- */
- Iterator()
- {
- range = new Range();
- }
-
- /**
- * Returns the next coverage range on the scanline. The returned object
- * will always be the same object, but with different values. Keep that
- * in mind when dealing with this object.
- *
- * @return the next coverage range on the scanline
- */
- public Range next()
- {
- // TODO: Lump together the single-pixel coverage and the
- // between-pixel coverage when the pixel coverage delta is 0.
- if (handledPixelCoverage == false)
- {
- // Handle single pixel coverage.
- range.setXPos(currentItem.xPos);
- range.setLength(1);
- range.setCoverage(currentCoverage + currentItem.pixelCoverage);
- handledPixelCoverage = true;
- }
- else
- {
- // Handle pixel span coverage.
- currentCoverage += currentItem.covDelta;
- range.setCoverage(currentCoverage);
- range.setXPos(currentItem.xPos + 1);
- currentItem = currentItem.next;
- range.setLength(currentItem.xPos - range.xPos);
- handledPixelCoverage = false;
- }
- return range;
- }
-
- /**
- * Returns {@ true} when there are more coverage ranges to iterate,
- * {@ false} otherwise.
- *
- * @return {@ true} when there are more coverage ranges to iterate,
- * {@ false} otherwise
- */
- public boolean hasNext()
- {
- boolean hasNext;
- if (currentItem != null && handledPixelCoverage == false)
- {
- // We have at least one more coverage item when there's a pixel
- // coverage piece left.
- hasNext = true;
- }
- else if (currentItem == null || currentItem.next == null
- || currentItem.next == last)
- {
- hasNext = false;
- }
- else
- {
- hasNext = true;
- }
- return hasNext;
- }
-
- /**
- * Resets this iterator to the start of the list.
- */
- void reset()
- {
- currentItem = head;
- currentCoverage = 0;
- handledPixelCoverage = false;
- }
- }
-
- /**
- * A data object that carries information about pixel coverage on a scanline.
- * The data consists of a starting X position on the scanline, the
- * length of the range in pixels and the actual coverage value.
- **/
- public static final class Range
- {
- /**
- * The X position on the scanline, in pixels.
- */
- private int xPos;
-
- /**
- * The length of the range, in pixels.
- */
- private int length;
-
- /**
- * The actual coverage. The relation depends on
- * {@link ScanlineCoverage#maxCoverage}.
- */
- private int coverage;
-
- /**
- * Creates a new CoverageRange object.
- */
- Range()
- {
- // Nothing to do. The values get initialized in the corresponding
- // setters.
- }
-
- /**
- * Sets the X start position (left) on the scanline. This value is
- * considered to be in pixels and device space.
- *
- * @param x the x position
- */
- void setXPos(int x)
- {
- xPos = x;
- }
-
- /**
- * Returns the X start position (left) on the scanline. This value
- * is considered to be in pixels and device space.
- *
- * @return the X position on the scanline
- */
- public int getXPos()
- {
- return xPos;
- }
-
- /**
- * Sets the length of the pixel range. This is in pixel units.
- *
- * @param l the length of the range
- */
- void setLength(int l)
- {
- length = l;
- }
-
- /**
- * Returns the length of the range in pixel units.
- *
- * @return the length of the range in pixel units
- */
- public int getLength()
- {
- return length;
- }
-
- /**
- * Returns the first X position after the range.
- *
- * @return the first X position after the range
- */
- public int getXPosEnd()
- {
- return xPos + length;
- }
-
- /**
- * Sets the coverage of the pixel range. The relation of that value
- * depends on {@link ScanlineCoverage#maxCoverage}.
- *
- * @param cov the coverage value for the pixel range
- */
- void setCoverage(int cov)
- {
- coverage = cov;
- }
-
- /**
- * Returns the coverage of the pixel range. The relation of this value
- * depends on {@link ScanlineCoverage#getMaxCoverage()}.
- *
- * @return the coverage of the pixel range
- */
- public int getCoverage()
- {
- return coverage;
- }
-
- /**
- * Returns a string representation.
- */
- public String toString()
- {
- return "Coverage range: xPos=" + xPos + ", length=" + length
- + ", coverage: " + coverage;
- }
- }
-
- /**
- * One bucket in the list.
- */
- private static final class Coverage
- {
- /**
- * The X coordinate on the scanline to which this bucket belongs.
- */
- int xPos;
-
- /**
- * The coverage delta from the pixel at xPos to xPos + 1.
- */
- int covDelta;
-
- /**
- * The delta for the pixel at xPos. This is added to the pixel at xPos,
- * but not to the following pixel.
- */
- int pixelCoverage;
-
- /**
- * Implements a linked list. This points to the next element of the list.
- */
- Coverage next;
-
- /**
- * Returns the X coordinate for this entry.
- *
- * @return the X coordinate for this entry
- */
- public int getXPos()
- {
- return xPos;
- }
-
- /**
- * Returns the coverage delta for this entry.
- *
- * @return the coverage delta for this entry
- */
- public int getCoverageDelta()
- {
- return covDelta;
- }
-
- /**
- * Returns a string representation.
- *
- * @return a string representation
- */
- public String toString()
- {
- return "Coverage: xPos: " + xPos + ", covDelta: " + covDelta;
- }
-
- /**
- * Returns a string representation of this entry and all the following
- * in the linked list.
- *
- * @return a string representation of this entry and all the following
- * in the linked list
- */
- public String list()
- {
- String str = toString();
- if (next != null)
- str = str + " --> " + next.list();
- return str;
- }
- }
-
- /**
- * The head of the sorted list of buckets.
- */
- private Coverage head;
-
- /**
- * The current bucket. We make use of the fact that the scanline converter
- * always scans the scanline (and thus this list) from left to right to
- * quickly find buckets or insertion points.
- */
- private Coverage current;
-
- /**
- * The item that is before current in the list.
- */
- private Coverage currentPrev;
-
- /**
- * The bucket after the last valid bucket. Unused buckets are not thrown
- * away and garbage collected. Instead, we keep them at the tail of the list
- * and reuse them when necessary.
- */
- private Coverage last;
-
- /**
- * The last valid entry.
- */
- private Coverage lastPrev;
-
- /**
- * The minimum X coordinate of this scanline.
- */
- private int minX;
-
- /**
- * The maximum X coordinate of this scanline.
- */
- private int maxX;
-
- /**
- * The maximum coverage value.
- */
- private int maxCoverage;
-
- /**
- * The iterator over the ranges of this scanline.
- */
- private Iterator iterator;
-
- /**
- * Creates a new ScanlineCoverage instance.
- */
- public ScanlineCoverage()
- {
- iterator = new Iterator();
- }
-
- /**
- * Indicates the the next scan of the scanline begins and that the next
- * request will be at the beginning of this list. This makes searching and
- * sorting of this list very quick.
- */
- public void rewind()
- {
- current = head;
- currentPrev = null;
- }
-
- /**
- * Clears the list. This does not throw away the old buckets but only
- * resets the end-pointer of the list to the first element. All buckets are
- * then unused and are reused when the list is filled again.
- */
- public void clear()
- {
- last = head;
- lastPrev = null;
- current = head;
- currentPrev = null;
- minX = Integer.MAX_VALUE;
- maxX = Integer.MIN_VALUE;
- }
-
- /**
- * This adds the specified coverage to the pixel at the specified
- * X position.
- *
- * @param x the X position
- * @param xc the x coverage
- * @param yc the y coverage
- */
- public void add(int x, int xc, int yc)
- {
- Coverage bucket = findOrInsert(x);
- bucket.covDelta += xc;
- bucket.pixelCoverage += yc;
- minX = Math.min(minX, x);
- maxX = Math.max(maxX, x);
- }
-
- /**
- * Returns the maximum coverage value for the scanline.
- *
- * @return the maximum coverage value for the scanline
- */
- public int getMaxCoverage()
- {
- return maxCoverage;
- }
-
- /**
- * Sets the maximum coverage value for the scanline.
- *
- * @param maxCov the maximum coverage value for the scanline
- */
- void setMaxCoverage(int maxCov)
- {
- maxCoverage = maxCov;
- }
-
- /**
- * Returns the maximum X coordinate of the current scanline.
- *
- * @return the maximum X coordinate of the current scanline
- */
- public int getMaxX()
- {
- return maxX;
- }
-
- /**
- * Returns the minimum X coordinate of the current scanline.
- *
- * @return the minimum X coordinate of the current scanline
- */
- public int getMinX()
- {
- return minX;
- }
-
- /**
- * Finds the bucket in the list with the specified X coordinate.
- * If no such bucket is found, then a new one is fetched (either a cached
- * bucket from the end of the list or a newly allocated one) inserted at the
- * correct position and returned.
- *
- * @param x the X coordinate
- *
- * @return a bucket to hold the coverage data
- */
- private Coverage findOrInsert(int x)
- {
- // First search for a matching bucket.
- if (head == null)
- {
- // Special case: the list is still empty.
- // Testpoint 1.
- head = new Coverage();
- head.xPos = x;
- current = head;
- currentPrev = null;
- return head;
- }
-
- // This performs a linear search, starting from the current bucket.
- // This is reasonably efficient because access to this list is always done
- // in a linear fashion and we are usually not more then 1 or 2 buckets away
- // from the one we're looking for.
- Coverage match = current;
- Coverage prev = currentPrev;
- while (match != last && match.xPos < x)
- {
- prev = match;
- match = match.next;
- }
-
- // At this point we have either found an entry with xPos >= x, or reached
- // the end of the list (match == last || match == null).
- if (match == null)
- {
- // End of the list. No cached items to reuse.
- // Testpoint 2.
- match = new Coverage();
- match.xPos = x;
- if (prev != null)
- prev.next = match;
- current = match;
- currentPrev = prev;
- return match;
- }
- else if (match == last)
- {
- // End of the list. Reuse this item. Expand list.
- // Testpoint 3.
- last = match.next;
- lastPrev = match;
- match.xPos = x;
- match.covDelta = 0;
- match.pixelCoverage = 0;
- // Keep link to last element or null, indicating the end of the list.
- current = match;
- currentPrev = prev;
- return match;
- }
-
- if (x == match.xPos)
- {
- // Special case: We have another coverage entry at the same location
- // as an already existing entry. Return this.
- // Testpoint 4.
- current = match;
- currentPrev = prev;
- return match;
- }
- else // x <= match.xPos
- {
- assert (x <= match.xPos);
- assert (prev == null ||x > prev.xPos);
-
- // Create new entry, or reuse existing one.
- Coverage cov;
- if (last != null)
- {
- // Testpoint 5.
- cov = last;
- last = cov.next;
- lastPrev.next = last;
- }
- else
- {
- // Testpoint 6.
- cov = new Coverage();
- }
-
- cov.xPos = x;
- cov.covDelta = 0;
- cov.pixelCoverage = 0;
-
- // Insert this item in the list.
- if (prev != null)
- {
- // Testpoint 5 & 6.
- prev.next = cov;
- cov.next = match;
- current = cov;
- currentPrev = prev;
- }
- else
- {
- // Testpoint 7.
- assert (match == head);
- // Insert at head.
- head = cov;
- head.next = match;
- current = head;
- currentPrev = null;
- }
- return cov;
- }
- }
-
- /**
- * (Re-)Starts iterating the coverage values for the scanline.
- * Use the returned iterator to get the consecutive coverage ranges.
- *
- * @return the iterator
- */
- public Iterator iterate()
- {
- iterator.reset();
- return iterator;
- }
-
- /**
- * Returns {@ true} if this object has no entries for the current scanline,
- * {@ false} otherwise.
- *
- * @return {@ true} if this object has no entries for the current scanline,
- * {@ false} otherwise
- */
- public boolean isEmpty()
- {
- return head == null || head == last
- || head.next == null || head.next == last;
- }
-
-}
diff --git a/libjava/classpath/gnu/java/awt/java2d/Segment.java b/libjava/classpath/gnu/java/awt/java2d/Segment.java
deleted file mode 100644
index 1d9a5700125..00000000000
--- a/libjava/classpath/gnu/java/awt/java2d/Segment.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/* Segment.java -- Abstract segment used for BasicStroke
- Copyright (C) 2006 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., 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 gnu.java.awt.java2d;
-
-import java.awt.geom.Point2D;
-
-public abstract class Segment implements Cloneable
-{
- // Start and end points of THIS segment
- public Point2D P1;
- public Point2D P2;
-
- // Segments can be linked together internally as a linked list
- public Segment first;
- public Segment next;
- public Segment last;
-
- // Half the stroke width
- protected double radius;
-
- /**
- * Create a new, empty segment
- */
- public Segment()
- {
- P1 = P2 = null;
- first = this;
- next = null;
- last = this;
- }
-
- /**
- * Add a segment to the polygon
- * @param newsegment segment to add
- */
- public void add(Segment newsegment)
- {
- newsegment.first = first;
- last.next = newsegment;
- last = last.next.last;
- }
-
- /**
- * Reverses the orientation of the whole polygon
- */
- public void reverseAll()
- {
- reverse();
- first = last;
- Segment v = next;
- Segment former = this;
- next = null;
-
- while (v != null)
- {
- v.reverse();
- v.last = this;
- Segment oldnext = v.next;
- v.next = former;
-
- former = v;
- v = oldnext; // move to the next in list
- }
- }
-
- public String toString()
- {
- return "Segment:"+P1+", "+P2;
- }
-
- /**
- * Get the normal vector to the slope of the line.
- * @return vector of length radius, normal to the (x0,y0)-(x1,y1) vector)
- */
- protected double[] normal(double x0, double y0, double x1, double y1)
- {
- double dx = (x1 - x0);
- double dy = (y1 - y0);
- if( dy == 0 )
- {
- dy = radius * ((dx > 0)?1:-1);
- dx = 0;
- }
- else if( dx == 0 )
- {
- dx = radius * ((dy > 0)?-1:1);
- dy = 0;
- }
- else
- {
- double N = Math.sqrt(dx * dx + dy * dy);
- double odx = dx;
- dx = -radius * dy / N;
- dy = radius * odx / N;
- }
- return new double[]{ dx, dy };
- }
-
- /**
- * Reverse the current segment
- */
- public abstract void reverse();
-
- /**
- * Get the "top" and "bottom" segments of a segment.
- * First array element is p0 + normal, second is p0 - normal.
- */
- public abstract Segment[] getDisplacedSegments(double radius);
-
- /**
- * Returns the coordinates of the first control point, or the start point
- * for a line segment.
- */
- public abstract double[] cp1();
-
- /**
- * Returns the coordinates of the second control point, or the end point
- * for a line segment.
- */
- public abstract double[] cp2();
-
-}
diff --git a/libjava/classpath/gnu/java/awt/java2d/ShapeCache.java b/libjava/classpath/gnu/java/awt/java2d/ShapeCache.java
deleted file mode 100644
index 89a9ac4ab84..00000000000
--- a/libjava/classpath/gnu/java/awt/java2d/ShapeCache.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/* ShapeCache.java -- Caches certain Shapes for reuse in AbstractGraphics2D
- Copyright (C) 2006 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., 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 gnu.java.awt.java2d;
-
-import java.awt.Polygon;
-import java.awt.Rectangle;
-import java.awt.geom.Arc2D;
-import java.awt.geom.Ellipse2D;
-import java.awt.geom.GeneralPath;
-import java.awt.geom.Line2D;
-import java.awt.geom.RoundRectangle2D;
-
-/**
- * Caches certain Shape objects for reuse in AbstractGraphics2D. This avoids
- * massive creation of such objects.
- */
-public class ShapeCache
-{
-
- /**
- * A cached Line2D.
- */
- public Line2D line;
-
- /**
- * A cached Rectangle.
- */
- public Rectangle rect;
-
- /**
- * A cached RoundRectangle2D.
- */
- public RoundRectangle2D roundRect;
-
- /**
- * A cached Ellipse2D.
- */
- public Ellipse2D ellipse;
-
- /**
- * A cached Arc2D.
- */
- public Arc2D arc;
-
- /**
- * A cached Polygon.
- */
- public Polygon polygon;
-
- /**
- * A cached polyline.
- */
- public GeneralPath polyline;
-}
diff --git a/libjava/classpath/gnu/java/awt/java2d/ShapeWrapper.java b/libjava/classpath/gnu/java/awt/java2d/ShapeWrapper.java
deleted file mode 100644
index f4e77f450d0..00000000000
--- a/libjava/classpath/gnu/java/awt/java2d/ShapeWrapper.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/* ShapeWrapper.java -- Protects shapes by wrapping them
- Copyright (C) 2007 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., 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 gnu.java.awt.java2d;
-
-import java.awt.Rectangle;
-import java.awt.Shape;
-import java.awt.geom.AffineTransform;
-import java.awt.geom.PathIterator;
-import java.awt.geom.Point2D;
-import java.awt.geom.Rectangle2D;
-
-/**
- * Protects any other shape from beeing modified by wrapping it.
- */
-public class ShapeWrapper
- implements Shape
-{
-
- /**
- * The shape to be protected.
- */
- private Shape shape;
-
- /**
- * Creates a new ShapeWrapper.
- *
- * @param other the shape to be protected
- */
- public ShapeWrapper(Shape other)
- {
- shape = other;
- }
-
- public boolean contains(double x, double y)
- {
- return shape.contains(x, y);
- }
-
- public boolean contains(Point2D p)
- {
- return shape.contains(p);
- }
-
- public boolean contains(double x, double y, double w, double h)
- {
- return shape.contains(x, y, w, h);
- }
-
- public boolean contains(Rectangle2D r)
- {
- return shape.contains(r);
- }
-
- public Rectangle getBounds()
- {
- return shape.getBounds();
- }
-
- public Rectangle2D getBounds2D()
- {
- return shape.getBounds2D();
- }
-
- public PathIterator getPathIterator(AffineTransform transform)
- {
- return shape.getPathIterator(transform);
- }
-
- public PathIterator getPathIterator(AffineTransform transform, double flatness)
- {
- return shape.getPathIterator(transform, flatness);
- }
-
- public boolean intersects(double x, double y, double w, double h)
- {
- return shape.intersects(x, y, w, h);
- }
-
- public boolean intersects(Rectangle2D r)
- {
- return shape.intersects(r);
- }
-
-}
diff --git a/libjava/classpath/gnu/java/awt/java2d/TextCacheKey.java b/libjava/classpath/gnu/java/awt/java2d/TextCacheKey.java
deleted file mode 100644
index 0a60c622676..00000000000
--- a/libjava/classpath/gnu/java/awt/java2d/TextCacheKey.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/* TextCacheKey.java -- Key to use for caching texts with their rendered layout
- Copyright (C) 2007 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., 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 gnu.java.awt.java2d;
-
-import java.awt.Font;
-import java.awt.font.FontRenderContext;
-
-/**
- * A key object to be used when caching pre-rendered text.
- */
-public class TextCacheKey
-{
-
- /**
- * The actual string.
- */
- private String string;
-
- /**
- * The font render context.
- */
- private FontRenderContext fontRenderContext;
-
- /**
- * The font.
- */
- private Font font;
-
- /**
- * Creates a new TextCacheKey.
- *
- * This is intended to be used as search key. It is important to initialize
- * the values using the setter methods before using this key, otherwise
- * it will throw NPEs.
- */
- public TextCacheKey()
- {
- // No-arg constructor.
- }
-
- /**
- * Creates a new TextCacheKey with initial values.
- *
- * @param s the string
- * @param f the font
- * @param frc the font render context
- */
- public TextCacheKey(String s, Font f, FontRenderContext frc)
- {
- string = s;
- font = f;
- fontRenderContext = frc;
- }
-
- /**
- * Re-sets the string. This is intented to be used in search keys only.
- *
- * @param s the string to set
- */
- public void setString(String s)
- {
- string = s;
- }
-
- /**
- * Sets the font render context.
- * This is intented to be used in search keys only.
- *
- * @param frc the new font render context
- */
- public void setFontRenderContext(FontRenderContext frc)
- {
- fontRenderContext = frc;
- }
-
- /**
- * Sets the font.
- * This is intented to be used in search keys only.
- *
- * @param f the font to set
- */
- public void setFont(Font f)
- {
- font = f;
- }
-
- /**
- * Determines if two objects are equal.
- *
- * @see Object#equals(Object)
- */
- public boolean equals(Object o)
- {
- boolean eq;
- if (o instanceof TextCacheKey)
- {
- TextCacheKey other = (TextCacheKey) o;
- eq = other.string.equals(string)
- && other.font.equals(font)
- && other.fontRenderContext.equals(fontRenderContext);
- }
- else
- {
- eq = false;
- }
- return eq;
- }
-
- /**
- * Computes a hashcode for this key.
- *
- * @see Object#hashCode()
- */
- public int hashCode()
- {
- return string.hashCode() ^ font.hashCode() ^ fontRenderContext.hashCode();
- }
-}
diff --git a/libjava/classpath/gnu/java/awt/java2d/TexturePaintContext.java b/libjava/classpath/gnu/java/awt/java2d/TexturePaintContext.java
deleted file mode 100644
index 2523d23110d..00000000000
--- a/libjava/classpath/gnu/java/awt/java2d/TexturePaintContext.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/* TexturePaintContext.java -- PaintContext impl for TexturePaint
- Copyright (C) 2006 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., 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 gnu.java.awt.java2d;
-
-import java.awt.AWTError;
-import java.awt.PaintContext;
-import java.awt.Rectangle;
-import java.awt.TexturePaint;
-import java.awt.geom.AffineTransform;
-import java.awt.geom.NoninvertibleTransformException;
-import java.awt.geom.Rectangle2D;
-import java.awt.image.BufferedImage;
-import java.awt.image.ColorModel;
-import java.awt.image.Raster;
-import java.awt.image.WritableRaster;
-
-/**
- * A {@link PaintContext} implementation for {@link TexturePaint}, done in
- * pure Java.
- *
- * @author Roman Kennke (kennke@aicas.com)
- */
-public class TexturePaintContext
- implements PaintContext
-{
-
- /**
- * The TexturePaint object.
- */
- private BufferedImage image;
-
- /**
- * The Raster that holds the texture.
- */
- private WritableRaster paintRaster;
-
- /**
- * The transform from userspace into device space.
- */
- private AffineTransform transform;
-
- /**
- * Creates a new TexturePaintContext for the specified TexturePaint object.
- * This initializes the Raster which is returned by
- * {@link #getRaster(int, int, int, int)}.
- *
- * @param t the texture paint object
- * @param db the bounds of the target raster in device space
- * @param ub the bounds of the target raster in user space
- * @param xform the transformation from user space to device space
- */
- public TexturePaintContext(TexturePaint t, Rectangle db,
- Rectangle2D ub, AffineTransform xform)
- {
- image = t.getImage();
-
- try
- {
- // Prepare transform for mapping from device space into image space.
- // In order to achieve this we take the transform for userspace->
- // devicespace, append the correct scale and translation according
- // to the anchor (which gives us the image->userspace->devicespace
- // transform), and invert that (which gives use the device->user->image
- // transform).
- Rectangle2D anchor = t.getAnchorRect();
- BufferedImage image = t.getImage();
- double scaleX = anchor.getWidth() / image.getWidth();
- double scaleY = anchor.getHeight() / image.getHeight();
- transform = (AffineTransform) xform.clone();
- transform.scale(scaleX, scaleY);
- transform.translate(-anchor.getMinX(), -anchor.getMinY());
- transform = transform.createInverse();
- }
- catch (NoninvertibleTransformException ex)
- {
- AWTError err =
- new AWTError("Unexpected NoninvertibleTransformException");
- err.initCause(ex);
- throw err;
- }
- }
-
- /**
- * Disposes the PaintContext. Nothing is to do here, since we don't use
- * any native resources in that implementation.
- */
- public void dispose()
- {
- // Nothing to do here.
- }
-
- /**
- * Returns the color model of this PaintContext. This implementation returnes
- * the color model used by the BufferedImage in the TexturePaint object,
- * this avoids costly color model transformations (at least at this point).
- *
- * @return the color model of this PaintContext
- */
- public ColorModel getColorModel()
- {
- return image.getColorModel();
- }
-
- /**
- * Returns the Raster that is used for painting.
- *
- * @param x1 the x location of the raster inside the user bounds of this paint
- * context
- * @param y1 the y location of the raster inside the user bounds of this paint
- * context
- * @param w the width
- * @param h the height
- *
- * @return the Raster that is used for painting
- *
- */
- public Raster getRaster(int x1, int y1, int w, int h)
- {
- ensureRasterSize(w, h);
- int x2 = x1 + w;
- int y2 = y1 + h;
- float[] src = new float[2];
- float[] dest = new float[2];
- Raster source = image.getData();
- int minX = source.getMinX();
- int width = source.getWidth();
- int minY = source.getMinY();
- int height = source.getHeight();
- Object pixel = null;
- for (int y = y1; y < y2; y++)
- {
- for (int x = x1; x < x2; x++)
- {
- // Transform the coordinates from device space into image space.
- src[0] = x;
- src[1] = y;
- transform.transform(src, 0, dest, 0, 1);
- int dx = (int) dest[0];
- int dy = (int) dest[1];
-
- // The modulo operation gives us the replication effect.
- dx = ((dx - minX) % width) + minX;
- dy = ((dy - minY) % height) + minY;
-
- // Handle possible negative values (replicating above the top-left)
- if (dx < 0)
- dx += width;
- if (dy < 0)
- dy += height;
-
- // Copy the pixel.
- pixel = source.getDataElements(dx, dy, pixel);
- paintRaster.setDataElements(x - x1, y - y1, pixel);
- }
- }
- return paintRaster;
- }
-
- /**
- * Ensures that the target raster exists and has at least the specified
- * size.
- *
- * @param w the requested target width
- * @param h the requested target height
- */
- private void ensureRasterSize(int w, int h)
- {
- if (paintRaster == null || paintRaster.getWidth() < w
- || paintRaster.getHeight() < h)
- {
- Raster s = image.getData();
- paintRaster = s.createCompatibleWritableRaster(w, h);
- }
- }
-}