diff options
Diffstat (limited to 'libjava/java/awt')
-rw-r--r-- | libjava/java/awt/Color.java | 13 | ||||
-rw-r--r-- | libjava/java/awt/ColorPaintContext.java | 114 | ||||
-rw-r--r-- | libjava/java/awt/SystemColor.java | 6 | ||||
-rw-r--r-- | libjava/java/awt/image/ColorModel.java | 8 | ||||
-rw-r--r-- | libjava/java/awt/image/ComponentSampleModel.java | 2 |
5 files changed, 122 insertions, 21 deletions
diff --git a/libjava/java/awt/Color.java b/libjava/java/awt/Color.java index e6eb03e8f0a..c41117a6e33 100644 --- a/libjava/java/awt/Color.java +++ b/libjava/java/awt/Color.java @@ -319,7 +319,12 @@ public class Color implements Paint, Serializable { if ((red & 255) != red || (green & 255) != green || (blue & 255) != blue || (alpha & 255) != alpha) - throw new IllegalArgumentException("Bad RGB values"); + throw new IllegalArgumentException("Bad RGB values" + +" red=0x"+Integer.toHexString(red) + +" green=0x"+Integer.toHexString(green) + +" blue=0x"+Integer.toHexString(blue) + +" alpha=0x"+Integer.toHexString(alpha) ); + value = (alpha << 24) | (red << 16) | (green << 8) | blue; falpha = 1; cs = null; @@ -950,7 +955,7 @@ public class Color implements Paint, Serializable * object, regardless of the parameters. Subclasses, however, may have a * mutable result. * - * @param cm the requested color model, ignored + * @param cm the requested color model * @param deviceBounds the bounding box in device coordinates, ignored * @param userBounds the bounding box in user coordinates, ignored * @param xform the bounds transformation, ignored @@ -962,8 +967,8 @@ public class Color implements Paint, Serializable AffineTransform xform, RenderingHints hints) { - if (context == null) - context = new ColorPaintContext(value); + if (context == null || !context.getColorModel().equals(cm)) + context = new ColorPaintContext(cm,value); return context; } diff --git a/libjava/java/awt/ColorPaintContext.java b/libjava/java/awt/ColorPaintContext.java index a365812a866..9fdfe61962d 100644 --- a/libjava/java/awt/ColorPaintContext.java +++ b/libjava/java/awt/ColorPaintContext.java @@ -1,5 +1,5 @@ /* ColorPaintContext.java -- context for painting solid colors - Copyright (C) 2002 Free Software Foundation, Inc. + Copyright (C) 2002, 2004 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -55,15 +55,31 @@ class ColorPaintContext implements PaintContext * SystemColor. */ final int color; + final ColorModel colorModel; + private ColorRaster cachedRaster; + + /** * Create the context for a given color. * - * @param c the solid color to use + * @param c The solid color to use. */ - ColorPaintContext(int c) + ColorPaintContext(int colorRGB) { - color = c; + this(ColorModel.getRGBdefault(), colorRGB); + } + + /** + * Create the context for a given color. + * + * @param cm The color model of this context. + * @param c The solid color to use. + */ + ColorPaintContext(ColorModel cm,int colorRGB) + { + color = colorRGB; + colorModel = cm; } /** @@ -75,14 +91,13 @@ class ColorPaintContext implements PaintContext } /** - * Return the color model of this context. This ignores the model passed - * in the request, since colors are always in sRGB. + * Return the color model of this context. * * @return the context color model */ public ColorModel getColorModel() { - return ColorModel.getRGBdefault(); + return colorModel; } /** @@ -94,10 +109,87 @@ class ColorPaintContext implements PaintContext * @param h the height, in device space * @return a raster for the given area and color */ - public Raster getRaster(int x, int y, int w, int h) + public Raster getRaster(int x, int y, int width, int height) + { + if( cachedRaster == null + || cachedRaster.getWidth() < width + || cachedRaster.getHeight() < height) + { + cachedRaster = new ColorRaster(colorModel, 0, 0, width, height, color); + } + return cachedRaster.createChild(0 ,0 ,width ,height ,x ,y , null); + } + + /** + * A ColorRaster is a raster that is completely filled with one color. The + * data layout is taken from the color model given to the constructor. + */ + private class ColorRaster extends Raster { - // XXX Implement. Sun uses undocumented implementation class - // sun.awt.image.IntegerInterleavedRaster. - throw new Error("not implemented"); + + /** + * Create a raster that is compaltible with the given color model and + * filled with the given color. + * @param cm The color model for this raster. + * @param x The smallest horizontal corrdinate in the raster. + * @param y The smallest vertical coordinate in the raster. + * @param width The width of the raster. + * @param height The height of the raster. + * @param rgbPixel The RGB value of the color for this raster. + */ + ColorRaster(ColorModel cm,int x, int y, int width, int height, int rgbPixel) + { + super(cm.createCompatibleSampleModel(width,height),new Point(x,y)); + Object pixel = cm.getDataElements(rgbPixel,null); + getSampleModel().setDataElements(0, 0, + width, height, + multiplyData(pixel,null,width*height), + dataBuffer); + } + + + + private Object multiplyData(Object src, Object dest, int factor) + { + Object from; + int srcLength = 0; + if (src instanceof byte[]) + { + srcLength = ((byte[])src).length; + + if (dest == null) dest = new byte[factor * srcLength]; + } + else if (src instanceof short[]) + { + srcLength = ((short[])src).length; + if (dest == null) dest = new short[factor * srcLength]; + } + else if (src instanceof int[]) + { + srcLength = ((int[]) src).length; + if (dest == null) dest = new int[factor * srcLength]; + } + else + { + throw new ClassCastException("Unknown data buffer type"); + } + + System.arraycopy(src,0,dest,0,srcLength); + + int count = 1; + while(count*2 < factor) + { + System.arraycopy(dest, 0, dest, count * srcLength, count*srcLength); + count *= 2; + } + + if(factor > count) + System.arraycopy(dest,0, dest, count * srcLength, + (factor - count) * srcLength ); + + return dest; + } + } + } // class ColorPaintContext diff --git a/libjava/java/awt/SystemColor.java b/libjava/java/awt/SystemColor.java index c6bffe2101a..5217677b722 100644 --- a/libjava/java/awt/SystemColor.java +++ b/libjava/java/awt/SystemColor.java @@ -427,7 +427,7 @@ public final class SystemColor extends Color implements Serializable * as the system color is solid, the context does not need any of the * passed parameters to do its job. * - * @param cm the requested color model, ignored + * @param cm the requested color model * @param deviceBounds the bounding box in device coordinates, ignored * @param userBounds the bounding box in user coordinates, ignored * @param xform the bounds transformation, ignored @@ -441,8 +441,8 @@ public final class SystemColor extends Color implements Serializable { Toolkit.getDefaultToolkit().loadSystemColors(colors); int color = colors[value] | ALPHA_MASK; - if (context == null || color != context.color) - context = new ColorPaintContext(color); + if (context == null || color != context.color || !context.getColorModel().equals(cm)) + context = new ColorPaintContext(cm,color); return context; } diff --git a/libjava/java/awt/image/ColorModel.java b/libjava/java/awt/image/ColorModel.java index 767b83f7dd0..c73f4fd4e58 100644 --- a/libjava/java/awt/image/ColorModel.java +++ b/libjava/java/awt/image/ColorModel.java @@ -166,7 +166,7 @@ public abstract class ColorModel implements Transparency */ public static ColorModel getRGBdefault() { - return new DirectColorModel(8, 0xff0000, 0xff00, 0xff, 0xff000000); + return new DirectColorModel(32, 0xff0000, 0xff00, 0xff, 0xff000000); } public final boolean hasAlpha() @@ -597,7 +597,11 @@ public abstract class ColorModel implements Transparency return null; } - // Typically overridden + /** + * Checks if the given raster has a compatible data-layout (SampleModel). + * @param raster The Raster to test. + * @return true if raster is compatible. + */ public boolean isCompatibleRaster(Raster raster) { SampleModel sampleModel = raster.getSampleModel(); diff --git a/libjava/java/awt/image/ComponentSampleModel.java b/libjava/java/awt/image/ComponentSampleModel.java index 0a40161adeb..c7b08b919e5 100644 --- a/libjava/java/awt/image/ComponentSampleModel.java +++ b/libjava/java/awt/image/ComponentSampleModel.java @@ -349,7 +349,7 @@ public class ComponentSampleModel extends SampleModel if (scanlineStride == rowSize) { // Collapse scan lines: - scanlineStride = rowSize *= h; + rowSize *= h; h = 1; } |