classpath
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Patch to implement ColorGraphicsContext


From: Thomas Fitzsimmons
Subject: Re: Patch to implement ColorGraphicsContext
Date: Tue, 06 Apr 2004 19:49:56 -0400

On Mon, 2004-04-05 at 08:59, Ingo Prötel wrote:
> I suggest the following patch
> 2004-04-05  Ingo Proetel  <address@hidden>
> 
>       * 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.
>       
> 
> ingo


> Index: java/awt/ColorPaintContext.java
> ===================================================================
> RCS file:
> /cvsroot/classpath/classpath/java/awt/ColorPaintContext.java,v
> retrieving revision 1.1
> diff -u -r1.1 ColorPaintContext.java
> --- java/awt/ColorPaintContext.java     8 May 2002 03:07:24
> -0000       1.1
> +++ java/awt/ColorPaintContext.java     5 Apr 2004 12:43:00 -0000
> @@ -39,7 +39,13 @@
>  package java.awt;
>  
>  import java.awt.image.ColorModel;
> +import java.awt.image.DataBuffer;
> +import java.awt.image.DataBufferByte;
> +import java.awt.image.DataBufferInt;
> +import java.awt.image.DataBufferUShort;
>  import java.awt.image.Raster;
> +import java.awt.image.SampleModel;
> +import java.util.Arrays;
>  
>  /**
>   * This class provides a paint context which will fill a rectanglar
> region of
> @@ -55,15 +61,19 @@
>     * SystemColor.
>     */
>    final int color;
> +  final ColorModel colorModel;
>  
> +  private ColorRaster mCachedRaster;
> + 

We don't use the 'm' prefix on fields.

>    /**
>     * Create the context for a given color.
>     *
>     * @param c the solid color to use
>     */
> -  ColorPaintContext(int c)
> +  ColorPaintContext(ColorModel cm,int c)

You should probably create a new constructor (that uses the previous
default colour model), rather than changing the old one.  Color.java,
for example, calls ColorPaintContext(int c).

>    {
>      color = c;
> +    colorModel = cm;
>    }
>  
>    /**
> @@ -75,14 +85,13 @@
>    }
>  
>    /**
> -   * 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;
>    }
>  
>    /**
> @@ -96,8 +105,71 @@
>     */
>    public Raster getRaster(int x, int y, int w, int h)
>    {
> -    // XXX Implement. Sun uses undocumented implementation class
> -    // sun.awt.image.IntegerInterleavedRaster.
> -    throw new Error("not implemented");
> +   if(  mCachedRaster == null 
> +       || mCachedRaster.getWidth() < w
> +       || mCachedRaster.getHeight() < h)
> +    {
> +     mCachedRaster = new ColorRaster(colorModel, 0, 0, w, h, color);
> +    }
> +   return mCachedRaster.createChild(0,0,w,h,x,y,null);

                                       ^^^^^^^^^^^^^^^^

Arguments should be separated by spaces.

>    }
> +  
> +  private class ColorRaster extends Raster{
> +      
> +        /**
> +         * 
> +         * @param cm
> +         * @param rgbPixel
> +         */
> +        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);


Lines should be no more than 80 characters long, so lines like this need
to be wrapped.


> +        }
> +               
> +        
> +        
> +        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;
> +        }

The indentation is a little wonky in this section (e.g. some open/close
braces don't line up).

> +        
> +  }
> +  
>  } // class ColorPaintContext

Sorry to nit-pick about formatting.  Don't worry too much about stuff
that's already committed.  One day, hopefully soon, Jalopy will be ready
to reformat Classpath, and we can do this stuff automatically from then
on.

Thanks,
Tom






reply via email to

[Prev in Thread] Current Thread [Next in Thread]