ColorModel.java (getRGBdefault): Default ColorModel has 32 bit pixels not 8 bit pixels.
authorIngo Proetel <proetel@aicas.com>
Tue, 4 May 2004 19:27:11 +0000 (19:27 +0000)
committerMichael Koch <mkoch@gcc.gnu.org>
Tue, 4 May 2004 19:27:11 +0000 (19:27 +0000)
2004-05-04  Ingo Proetel  <proetel@aicas.com>

* 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  <proetel@aicas.com>

* java/awt/image/ComponentSampleModel.java (setDataSamples):Do not reset
scanline stride.

2004-05-04  Ingo Proetel  <proetel@aicas.com>

* java/awt/ColorPaintContext.java (<init>): 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 (<init>): Make exception more verbose.
(createContext): Use ColorModel when creating a PaintContext.

From-SVN: r81486

libjava/ChangeLog
libjava/java/awt/Color.java
libjava/java/awt/ColorPaintContext.java
libjava/java/awt/SystemColor.java
libjava/java/awt/image/ColorModel.java
libjava/java/awt/image/ComponentSampleModel.java

index a8d853ec4d6992882066b745d7c1a93dc23f67c0..76fe4f0e07da17c822df75d46f5ca804cc0fb6a9 100644 (file)
@@ -1,3 +1,25 @@
+2004-05-04  Ingo Proetel  <proetel@aicas.com>
+
+       * 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  <proetel@aicas.com>
+
+       * java/awt/image/ComponentSampleModel.java (setDataSamples):Do not reset
+       scanline stride.
+
+2004-05-04  Ingo Proetel  <proetel@aicas.com>
+
+       * java/awt/ColorPaintContext.java (<init>): 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 (<init>): Make exception more verbose.
+       (createContext): Use ColorModel when creating a PaintContext.
+
 2004-05-04  Michael Koch  <konqueror@gmx.de>
 
        * gnu/java/text/CharacterBreakIterator.java
index e6eb03e8f0a58f35740f37ee244c728613c85a3c..c41117a6e33dbca1868f3f4a9dc46e475b590a3a 100644 (file)
@@ -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;
   }
 
index a365812a866912e5289d52993c2dbb76561970bc..9fdfe61962d9820902769a79a822158338083804 100644 (file)
@@ -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
index c6bffe2101a057e8f9f55c9869455325dc28f567..5217677b7221cc9d8d522c981aa105b0d72e3101 100644 (file)
@@ -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;
   }    
 
index 767b83f7dd03c2ed5eabd838d559698f61eae48e..c73f4fd4e58b5346b7fa9b6576093ba7e9dc4048 100644 (file)
@@ -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();
index 0a40161adeb78b0a09cd415994ef15eec13559a3..c7b08b919e5d3384bdd91a7165f5dfbe72d33b03 100644 (file)
@@ -349,7 +349,7 @@ public class ComponentSampleModel extends SampleModel
     if (scanlineStride == rowSize)
       {
        // Collapse scan lines:
-       scanlineStride = rowSize *= h;
+       rowSize *= h;
        h = 1;
       }