You are viewing a plain text version of this content. The canonical link for it is here.
Posted to batik-dev@xmlgraphics.apache.org by de...@apache.org on 2001/05/31 23:10:26 UTC

cvs commit: xml-batik/sources/org/apache/batik/transcoder/image PNGTranscoder.java

deweese     01/05/31 14:10:26

  Modified:    .        build.sh
               sources/org/apache/batik/bridge UserAgentAdapter.java
               sources/org/apache/batik/ext/awt/image/renderable
                        FilterResRable8Bit.java
               sources/org/apache/batik/ext/awt/image/spi
                        PNGRegistryEntry.java
               sources/org/apache/batik/gvt/renderer StaticRenderer.java
               sources/org/apache/batik/transcoder/image PNGTranscoder.java
  Log:
  1) Fixed a tiling bug involving the 'filterRes' attribute.
  2) Fixed a gamma goof for PNG images.
  3) Fixed a rounding but in StaticRenderer
  4) Fixed a publicity bug in UserAgentAdapter.
  
  Revision  Changes    Path
  1.9       +3 -1      xml-batik/build.sh
  
  Index: build.sh
  ===================================================================
  RCS file: /home/cvs/xml-batik/build.sh,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- build.sh	2001/04/27 19:53:38	1.8
  +++ build.sh	2001/05/31 21:10:23	1.9
  @@ -23,7 +23,9 @@
   # ----- Execute The Requested Build -------------------------------------------
   
   TARGET=$1;
  -shift 1
  +if [ $# != 0 ] ; then
  +  shift 1
  +fi
   
   $JAVA_HOME/bin/java $ANT_OPTS -classpath $CP org.apache.tools.ant.Main -Dant.home=$ANT_HOME $TARGET -Dargs="$*"
   
  
  
  
  1.2       +1 -1      xml-batik/sources/org/apache/batik/bridge/UserAgentAdapter.java
  
  Index: UserAgentAdapter.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/UserAgentAdapter.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- UserAgentAdapter.java	2001/05/15 13:55:03	1.1
  +++ UserAgentAdapter.java	2001/05/31 21:10:24	1.2
  @@ -31,7 +31,7 @@
   public class UserAgentAdapter implements UserAgent {
       protected Set FEATURES = new HashSet();
   
  -    UserAgentAdapter() {
  +    public UserAgentAdapter() {
       };
   
       public void addStdFeatures() {
  
  
  
  1.6       +105 -104  xml-batik/sources/org/apache/batik/ext/awt/image/renderable/FilterResRable8Bit.java
  
  Index: FilterResRable8Bit.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/ext/awt/image/renderable/FilterResRable8Bit.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- FilterResRable8Bit.java	2001/05/17 23:06:38	1.5
  +++ FilterResRable8Bit.java	2001/05/31 21:10:25	1.6
  @@ -8,7 +8,11 @@
   
   package org.apache.batik.ext.awt.image.renderable;
   
  +import java.lang.ref.Reference;
  +import java.lang.ref.SoftReference;
  +
   import java.awt.Rectangle;
  +import java.awt.RenderingHints;
   import java.awt.Shape;
   import java.awt.geom.AffineTransform;
   import java.awt.geom.Rectangle2D;
  @@ -16,15 +20,15 @@
   import java.awt.image.renderable.RenderableImage;
   import java.awt.image.renderable.RenderContext;
   
  -
   import org.apache.batik.ext.awt.image.rendered.AffineRed;
  +import org.apache.batik.ext.awt.image.rendered.TileCacheRed;
   import org.apache.batik.ext.awt.image.GraphicsUtil;
   
   /**
    * Interface for implementing filter resolution.
    *
    * @author <a href="mailto:vincent.hardy@eng.sun.com">Vincent Hardy</a>
  - * @version $Id: FilterResRable8Bit.java,v 1.5 2001/05/17 23:06:38 deweese Exp $
  + * @version $Id: FilterResRable8Bit.java,v 1.6 2001/05/31 21:10:25 deweese Exp $
    */
   public class FilterResRable8Bit extends AbstractRable 
       implements FilterResRable{
  @@ -39,6 +43,11 @@
        */
       private int filterResolutionY = -1;
   
  +    public FilterResRable8Bit() {
  +        // System.out.println("Using FilterResRable8bit...");
  +    }
  +        
  +
       /**
        * Returns the source to be cropped.
        */
  @@ -91,15 +100,70 @@
           this.filterResolutionY = filterResolutionY;
       }
       
  +
  +    /**
  +     * Cached Rendered image at filterRes.
  +     */
  +    Reference resRed = null;
  +    float     resScale = 0;
  +
  +    private float getResScale() {
  +        return resScale;
  +    }
  +
  +    private RenderedImage getResRed(RenderingHints hints) {
  +        Rectangle2D imageRect = getBounds2D();
  +        double resScaleX = getFilterResolutionX()/imageRect.getWidth();
  +        double resScaleY = getFilterResolutionY()/imageRect.getHeight();
  +
  +        
  +        // System.out.println("filterRes X " + filterResolutionX + 
  +        //                    " Y : " + filterResolutionY);
  +
  +        float resScale = (float)Math.min(resScaleX, resScaleY);
  +
  +        RenderedImage ret;
  +        if (resScale == this.resScale) {
  +            // System.out.println("Matched");
  +            ret = (RenderedImage)resRed.get();
  +            if (ret != null)
  +                return ret;
  +        }
  +
  +        AffineTransform resUsr2Dev;
  +        resUsr2Dev = AffineTransform.getScaleInstance(resScale, resScale);
  +        
  +        //
  +        // Create a new RenderingContext
  +        //
  +        RenderContext newRC = new RenderContext(resUsr2Dev, null, hints);
  +
  +        ret = getSource().createRendering(newRC);
  +
  +        // This is probably justified since the whole reason to use
  +        // The filterRes attribute is because the filter chain is
  +        // expensive, otherwise you should let it evaluate at
  +        // screen resolution always - right?
  +        ret = new TileCacheRed(GraphicsUtil.wrap(ret));
  +        this.resScale = resScale;
  +        this.resRed   = new SoftReference(ret);
  +
  +        return ret;
  +    }
  +
  +    
  +
       /**
        * 
        */
  -    public RenderedImage createRendering(RenderContext renderContext){
  +    public RenderedImage createRendering(RenderContext renderContext) {
           // Get user space to device space transform
           AffineTransform usr2dev = renderContext.getTransform();
           if(usr2dev == null){
               usr2dev = new AffineTransform();
           }
  +
  +        RenderingHints hints = renderContext.getRenderingHints();
           
           // As per specification, a value of zero for the 
           // x-axis or y-axis causes the filter to produce
  @@ -113,117 +177,54 @@
           // + if the y or x scale is less than one, insert 
           //   an AffineRable.
           //   Else, return the source as is.
  -        float filterResolutionX = this.filterResolutionX;
  -        float filterResolutionY = this.filterResolutionY;
  +        int filterResolutionX = getFilterResolutionX();
  +        int filterResolutionY = getFilterResolutionY();
           // System.out.println("FilterResRable: " + filterResolutionX + "x" +
           //                    filterResolutionY);
   
  +        if ((filterResolutionX <= 0) || (filterResolutionY == 0))
  +            return null;
  +        
           // Find out the renderable area
           Rectangle2D imageRect = getBounds2D();
           Rectangle   devRect;
           devRect = usr2dev.createTransformedShape(imageRect).getBounds();
  -
  -        if(filterResolutionX > 1) {
  -            // Now, compare the devRect with the filter
  -            // resolution hints
  -            float scaleX = 1;
  -            float scaleY = 1;
  -            if(filterResolutionX < devRect.width){
  -                scaleX = filterResolutionX / (float)devRect.width;
  -            }
  -
  -            if(filterResolutionY != 0){
  -                if(filterResolutionY < 0){
  -                    filterResolutionY = scaleX*(float)devRect.height;
  -                }
  -
  -                if(filterResolutionY < devRect.height) {
  -                    scaleY = filterResolutionY / (float)devRect.height;
  -                }
  -                
  -                // Only resample if either scaleX or scaleY is
  -                // smaller than 1
  -                RenderableImage localSource = getSource();
  -                RenderContext localRenderContext = renderContext;
  -                
  -                if((scaleX < 1) || (scaleY < 1)){
  -                    // System.out.println("filterRes X " + filterResolutionX + 
  -                    //                    " Y : " + filterResolutionY);
  -
  -                    scaleX = scaleX < scaleY ? scaleX : scaleY;
  -                    scaleY = scaleX;
  -
  -                    //
  -                    // Create a rendering that will be less than
  -                    // or equal to filterResolutionX by filterResolutionY.
  -                    //
  -                    AffineTransform newUsr2Dev 
  -                        = AffineTransform.getScaleInstance(scaleX, scaleY);
  -                    
  -                    newUsr2Dev.concatenate(usr2dev);
  -                    
  -                    // This splits out the scale so we know how much to pad
  -                    // in user space so we have a pixel surround in device
  -                    // space for the affine.
  -                    double sx = newUsr2Dev.getScaleX();
  -                    double sy = newUsr2Dev.getScaleY();
  -
  -                    double shx = newUsr2Dev.getShearX();
  -                    double shy = newUsr2Dev.getShearY();
  -
  -                    // The Scale is roughly the "hypotonose" of the
  -                    // matrix vectors.
  -                    double devSX = Math.sqrt(sx*sx + shy*shy);
  -                    double devSY = Math.sqrt(sy*sy + shx*shx);
  -
  -                    //
  -                    // Create a new RenderingContext
  -                    //
  -                    RenderContext newRenderContext 
  -                        = (RenderContext)renderContext.clone();
  -                    newRenderContext.setTransform(newUsr2Dev);
  -
  -                    Shape aoi = renderContext.getAreaOfInterest();
  -                    if (aoi == null)
  -                        aoi = getBounds2D();
  -                    
  -                    // 
  -                    // We need to grow the area of interest by a few
  -                    // pixels in device space so the AffineRed can
  -                    // interpolate at the edges..
  -                    //
  -                    Rectangle2D newAOI = aoi.getBounds2D();
  -                    newAOI = new Rectangle2D.Double
  -                        (newAOI.getX()-1/devSX,
  -                         newAOI.getY()-1/devSY,
  -                         newAOI.getWidth()+2/devSX,
  -                         newAOI.getHeight()+2/devSY);
  -
  -                    newRenderContext.setAreaOfInterest(newAOI);
  -
  -                    //
  -                    // Now, use an AffineRable that will apply the
  -                    // resampling
  -                    //
  -                    AffineTransform resampleTxf 
  -                        = AffineTransform.getScaleInstance(1/scaleX, 1/scaleY);
  -                    
  -                    RenderedImage result = null;
  -                    result = localSource.createRendering(newRenderContext);
  -                    // org.ImageDisplay.showImage("AT: " + newUsr2Dev, result);
  -                    if (result != null)
  -                        result = new AffineRed
  -                            (GraphicsUtil.wrap(result),
  -                             resampleTxf, renderContext.getRenderingHints());
   
  -                    return result;
  -                }
  +        // Now, compare the devRect with the filter
  +        // resolution hints
  +        float scaleX = 1;
  +        if(filterResolutionX < devRect.width)
  +            scaleX = filterResolutionX / (float)devRect.width;
  +
  +        float scaleY = 1;
  +        if(filterResolutionY < 0)
  +            scaleY = scaleX;
  +        else if(filterResolutionY < devRect.height)
  +            scaleY = filterResolutionY / (float)devRect.height;
  +
  +        // Only resample if either scaleX or scaleY is
  +        // smaller than 1
  +        if ((scaleX >= 1) && (scaleY >= 1))
  +            return getSource().createRendering(renderContext);
  +
  +        // System.out.println("Using Fixed Resolution...");
  +
  +        // Using fixed resolution image since we need an image larger
  +        // than this.
  +        RenderedImage resRed   = getResRed(hints);
  +        float         resScale = getResScale();
  +
  +        AffineTransform residualAT;
  +        residualAT = new AffineTransform(usr2dev.getScaleX()/resScale,
  +                                         usr2dev.getShearY()/resScale,
  +                                         usr2dev.getShearX()/resScale,
  +                                         usr2dev.getScaleY()/resScale,
  +                                         usr2dev.getTranslateX(),
  +                                         usr2dev.getTranslateY());
   
  -                return localSource.createRendering(localRenderContext);
  -            }
  -        }
  +        // org.ImageDisplay.showImage("AT: " + newUsr2Dev, result);
   
  -        return null;
  +        return new AffineRed(GraphicsUtil.wrap(resRed), residualAT, hints);
       }
   }
   
  
  
  
  1.5       +1 -1      xml-batik/sources/org/apache/batik/ext/awt/image/spi/PNGRegistryEntry.java
  
  Index: PNGRegistryEntry.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/ext/awt/image/spi/PNGRegistryEntry.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- PNGRegistryEntry.java	2001/05/16 12:33:55	1.4
  +++ PNGRegistryEntry.java	2001/05/31 21:10:25	1.5
  @@ -72,7 +72,7 @@
                               param.setPerformGammaCorrection(false);
                           else {
                               param.setPerformGammaCorrection(true);
  -                            param.setDisplayExponent(2.4f); // sRGB gamma
  +                            param.setDisplayExponent(2.2f); // sRGB gamma
                           }
                           CachableRed cr = new PNGRed(is, param);
                           cr = new Any2sRGBRed(cr);
  
  
  
  1.14      +3 -4      xml-batik/sources/org/apache/batik/gvt/renderer/StaticRenderer.java
  
  Index: StaticRenderer.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/renderer/StaticRenderer.java,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- StaticRenderer.java	2001/05/17 23:06:39	1.13
  +++ StaticRenderer.java	2001/05/31 21:10:25	1.14
  @@ -51,7 +51,7 @@
    * rendering in an offscreen buffer image.
    *
    * @author <a href="mailto:vincent.hardy@eng.sun.com>Vincent Hardy</a>
  - * @version $Id: StaticRenderer.java,v 1.13 2001/05/17 23:06:39 deweese Exp $
  + * @version $Id: StaticRenderer.java,v 1.14 2001/05/31 21:10:25 deweese Exp $
    */
   public class StaticRenderer implements ImageRenderer {
       /**
  @@ -419,12 +419,11 @@
                   return;
   
               rootCR = GraphicsUtil.wrap(ri);
  -            int dx = Math.round((float)at.getTranslateX()+0.5f);
  -            int dy = Math.round((float)at.getTranslateY()+0.5f);
  +            int dx = Math.round((float)at.getTranslateX());
  +            int dy = Math.round((float)at.getTranslateY());
               rootCR = new TranslateRed(rootCR, rootCR.getMinX()+dx, 
                                         rootCR.getMinY()+dy);
               rootCR = GraphicsUtil.convertTosRGB(rootCR);
  -
           }
   
           SampleModel sm = rootCR.getSampleModel();
  
  
  
  1.5       +3 -3      xml-batik/sources/org/apache/batik/transcoder/image/PNGTranscoder.java
  
  Index: PNGTranscoder.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/transcoder/image/PNGTranscoder.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- PNGTranscoder.java	2001/05/16 12:34:14	1.4
  +++ PNGTranscoder.java	2001/05/31 21:10:26	1.5
  @@ -24,7 +24,7 @@
    * This class is an <tt>ImageTranscoder</tt> that produces a PNG image.
    *
    * @author <a href="mailto:Thierry.Kormann@sophia.inria.fr">Thierry Kormann</a>
  - * @version $Id: PNGTranscoder.java,v 1.4 2001/05/16 12:34:14 deweese Exp $
  + * @version $Id: PNGTranscoder.java,v 1.5 2001/05/31 21:10:26 deweese Exp $
    */
   public class PNGTranscoder extends ImageTranscoder {
   
  @@ -59,8 +59,8 @@
           PNGEncodeParam.RGB params =
               (PNGEncodeParam.RGB)PNGEncodeParam.getDefaultEncodeParam(img);
           params.setBackgroundRGB(new int [] { 255, 255, 255 });
  -        // We are using sRGB (gamma 2.4).
  -        params.setGamma(2.4f);
  +        // We are using sRGB (gamma 2.2).
  +        params.setSRGBIntent(PNGEncodeParam.INTENT_PERCEPTUAL);
   
           //
           // This is a trick so that viewers which do not support
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: batik-dev-unsubscribe@xml.apache.org
For additional commands, e-mail: batik-dev-help@xml.apache.org