From 27c2c3ec4ac46015d9a616c2aafe30fd1b5582ab Mon Sep 17 00:00:00 2001 From: Ingo Proetel Date: Tue, 4 May 2004 19:27:11 +0000 Subject: [PATCH] ColorModel.java (getRGBdefault): Default ColorModel has 32 bit pixels not 8 bit pixels. 2004-05-04 Ingo Proetel * java/awt/image/ColorModel.java (getRGBdefault): Default ColorModel has 32 bit pixels not 8 bit pixels. (isCompatibleRaster): Added javadoc comment. 2004-05-04 Ingo Proetel * java/awt/image/ComponentSampleModel.java (setDataSamples):Do not reset scanline stride. 2004-05-04 Ingo Proetel * java/awt/ColorPaintContext.java (): Added ColorModel to signature. (getColorModel): Return the actual color model. (getRaster): Implemented. (ColorRaster): New inner class. * java/awt/SystemColor.java (createContext): Use ColorModel when creating a PaintContext. * java/awt/Color.java (): Make exception more verbose. (createContext): Use ColorModel when creating a PaintContext. From-SVN: r81486 --- libjava/ChangeLog | 22 ++++ libjava/java/awt/Color.java | 13 +- libjava/java/awt/ColorPaintContext.java | 114 ++++++++++++++++-- libjava/java/awt/SystemColor.java | 6 +- libjava/java/awt/image/ColorModel.java | 8 +- .../java/awt/image/ComponentSampleModel.java | 2 +- 6 files changed, 144 insertions(+), 21 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index a8d853ec4d6..76fe4f0e07d 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,25 @@ +2004-05-04 Ingo Proetel + + * java/awt/image/ColorModel.java (getRGBdefault): Default ColorModel has + 32 bit pixels not 8 bit pixels. + (isCompatibleRaster): Added javadoc comment. + +2004-05-04 Ingo Proetel + + * java/awt/image/ComponentSampleModel.java (setDataSamples):Do not reset + scanline stride. + +2004-05-04 Ingo Proetel + + * java/awt/ColorPaintContext.java (): Added ColorModel to signature. + (getColorModel): Return the actual color model. + (getRaster): Implemented. + (ColorRaster): New inner class. + * java/awt/SystemColor.java (createContext): Use ColorModel when creating + a PaintContext. + * java/awt/Color.java (): Make exception more verbose. + (createContext): Use ColorModel when creating a PaintContext. + 2004-05-04 Michael Koch * gnu/java/text/CharacterBreakIterator.java 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; } -- 2.30.2