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/11/29 16:05:26 UTC

cvs commit: xml-batik/sources/org/apache/batik/transcoder/print PrintTranscoder.java

deweese     01/11/29 07:05:26

  Modified:    sources/org/apache/batik/ext/awt RenderingHintsKeyExt.java
               sources/org/apache/batik/ext/awt/image GraphicsUtil.java
                        SVGComposite.java
               sources/org/apache/batik/ext/awt/image/renderable
                        CompositeRable8Bit.java
               sources/org/apache/batik/ext/awt/image/rendered
                        Any2sRGBRed.java
               sources/org/apache/batik/transcoder/print
                        PrintTranscoder.java
  Added:       sources/org/apache/batik/ext/awt TranscodingHintKey.java
  Log:
  1) Printing bugs seem to be fixed (was pretty easy once I was willing
     to put in printing specific hacks).
  PR: 4831
  
  Revision  Changes    Path
  1.4       +10 -1     xml-batik/sources/org/apache/batik/ext/awt/RenderingHintsKeyExt.java
  
  Index: RenderingHintsKeyExt.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/ext/awt/RenderingHintsKeyExt.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- RenderingHintsKeyExt.java	2001/07/05 16:54:37	1.3
  +++ RenderingHintsKeyExt.java	2001/11/29 15:05:26	1.4
  @@ -15,9 +15,18 @@
    * KEY_AREA_OF_INTEREST
    *
    * @author <a href="mailto:vincent.hardy@eng.sun.com">Vincent Hardy</a>
  - * @version $Id: RenderingHintsKeyExt.java,v 1.3 2001/07/05 16:54:37 deweese Exp $
  + * @version $Id: RenderingHintsKeyExt.java,v 1.4 2001/11/29 15:05:26 deweese Exp $
    */
   public final class RenderingHintsKeyExt {
  +    /**
  +     * Hint as to the transcoding destination.
  +     */
  +    public static final RenderingHints.Key KEY_TRANSCODING =
  +        new TranscodingHintKey();
  +
  +    public static final String VALUE_TRANSCODING_PRINTING = 
  +        new String("Printing");
  +    
       /**
        * Key for the AOI hint. This hint is used to propagate the AOI to Paint
        * and PaintContext instances.
  
  
  
  1.1                  xml-batik/sources/org/apache/batik/ext/awt/TranscodingHintKey.java
  
  Index: TranscodingHintKey.java
  ===================================================================
  /*****************************************************************************
   * Copyright (C) The Apache Software Foundation. All rights reserved.        *
   * ------------------------------------------------------------------------- *
   * This software is published under the terms of the Apache Software License *
   * version 1.1, a copy of which has been included with this distribution in  *
   * the LICENSE file.                                                         *
   *****************************************************************************/
  
  package org.apache.batik.ext.awt;
  
  import java.awt.RenderingHints;
  import java.awt.Shape;
  
  /**
   * TranscodingHint as to what the destination of the drawing is.
   *
   * @author <a href="mailto:deweese@apache.org">Thomas DeWeese</a>
   * @version $Id: TranscodingHintKey.java,v 1.1 2001/11/29 15:05:26 deweese Exp $
   */
  final class TranscodingHintKey extends RenderingHints.Key {
  
      TranscodingHintKey() {
          super(10100);
      }
  
      public boolean isCompatibleValue(Object val) {
          boolean isCompatible = true;
          if ((val != null) && !(val instanceof String)) {
              isCompatible = false;
          }
          return isCompatible;
      }
  }
  
  
  
  
  1.20      +111 -13   xml-batik/sources/org/apache/batik/ext/awt/image/GraphicsUtil.java
  
  Index: GraphicsUtil.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/ext/awt/image/GraphicsUtil.java,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- GraphicsUtil.java	2001/09/17 20:45:18	1.19
  +++ GraphicsUtil.java	2001/11/29 15:05:26	1.20
  @@ -14,6 +14,7 @@
   import java.awt.color.ColorSpace;
   
   import java.awt.Color;
  +import java.awt.Composite;
   import java.awt.Graphics2D;
   import java.awt.GraphicsConfiguration;
   import java.awt.GraphicsDevice;
  @@ -65,7 +66,7 @@
    * implementations.
    *
    * @author <a href="mailto:Thomas.DeWeeese@Kodak.com">Thomas DeWeese</a>
  - * @version $Id: GraphicsUtil.java,v 1.19 2001/09/17 20:45:18 deweese Exp $
  + * @version $Id: GraphicsUtil.java,v 1.20 2001/11/29 15:05:26 deweese Exp $
    */
   public class GraphicsUtil {
   
  @@ -130,6 +131,8 @@
           else
               at.preConcatenate(g2dAt);
   
  +        Composite g2dComposite = g2d.getComposite();
  +
           if (false) {
               System.out.println("CR: " + cr);
               System.out.println("CRR: " + cr.getBounds());
  @@ -171,14 +174,13 @@
           ColorModel drawCM = g2dCM;
           if (g2dCM == null) {
               // If we can't find out about our device assume
  -            // it's not premultiplied (Just because this
  -            // seems to work for us!).
  -            drawCM = coerceColorModel(srcCM, false);
  +            // it's SRGB unpremultiplied (Just because this
  +            // seems to work for us).
  +            drawCM = sRGB_Unpre;
           } else if (drawCM.hasAlpha() && g2dCM.hasAlpha() &&
                      (drawCM.isAlphaPremultiplied() !=
                       g2dCM .isAlphaPremultiplied())) {
  -            drawCM = coerceColorModel(drawCM,
  -                                      g2dCM.isAlphaPremultiplied());
  +            drawCM = coerceColorModel(drawCM, g2dCM.isAlphaPremultiplied());
           }
   
           cr = FormatRed.construct(cr, drawCM);
  @@ -190,6 +192,16 @@
           // Now CR is in device space, so clear the g2d transform.
           g2d.setTransform(IDENTITY);
   
  +        // Ugly Hack alert.  This Makes it use our SrcOver implementation
  +        // Which doesn't seem to have as many bugs as the JDK one when
  +        // going between different src's and destinations (of course it's
  +        // also a lot slower).
  +        if (g2d.getRenderingHint(RenderingHintsKeyExt.KEY_TRANSCODING) ==
  +            RenderingHintsKeyExt.VALUE_TRANSCODING_PRINTING) {
  +            if (SVGComposite.OVER.equals(g2dComposite)) {
  +                g2d.setComposite(SVGComposite.OVER);
  +            }
  +        }
           Rectangle crR  = cr.getBounds();
           Shape     clip = g2d.getClip();
   
  @@ -272,6 +284,7 @@
               long startTime = System.currentTimeMillis();
   
               if (false) {
  +                // org.ImageDisplay.showImage("foo: ", cr);
                   // This can be significantly faster but can also
                   // require much more memory.
                   g2d.drawRenderedImage(cr, IDENTITY);
  @@ -350,16 +363,19 @@
                           // System.out.println("Generating tile: " + twr);
                           cr.copyData(twr);
   
  -                        // Make sure we only draw the region that was written...
  +                        // Make sure we only draw the region that was written.
                           BufferedImage subBI;
                           subBI = bi.getSubimage(0, 0, iR.width,  iR.height);
  +
                           if (false) {
                               System.out.println("Drawing: " + tR);
                               System.out.println("IR: "      + iR);
                           }
   
                           AffineTransform trans;
  -                        trans = AffineTransform.getTranslateInstance(iR.x, iR.y);
  +                        trans = AffineTransform.getTranslateInstance(iR.x, 
  +                                                                     iR.y);
  +
                           g2d.drawImage(subBI, trans, null);
                           // big2d.fillRect(0, 0, tw, th);
                       }
  @@ -369,9 +385,13 @@
               }
               long endTime = System.currentTimeMillis();
               // System.out.println("Time: " + (endTime-startTime));
  +
  +
           } finally {
               g2d.setTransform(g2dAt);
  +            g2d.setComposite(g2dComposite);
           }
  +
           // System.out.println("Finished Draw");
       }
   
  @@ -492,7 +512,9 @@
           GraphicsConfiguration gc = g2d.getDeviceConfiguration();
           GraphicsDevice gd = gc.getDevice();
           if (WARN_DESTINATION &&
  -            (gd.getType() == GraphicsDevice.TYPE_IMAGE_BUFFER))
  +            (gd.getType() == GraphicsDevice.TYPE_IMAGE_BUFFER) &&
  +            (g2d.getRenderingHint(RenderingHintsKeyExt.KEY_TRANSCODING) !=
  +                RenderingHintsKeyExt.VALUE_TRANSCODING_PRINTING))
               // throw new IllegalArgumentException
               System.out.println
                   ("Graphics2D from BufferedImage lacks BUFFERED_IMAGE hint");
  @@ -509,18 +531,24 @@
   
           // We are going to a BufferedImage but no hint was provided
           // so we can't determine the destination Color Model.
  -        if (gc.getDevice().getType() == GraphicsDevice.TYPE_IMAGE_BUFFER)
  +        if (gc.getDevice().getType() == GraphicsDevice.TYPE_IMAGE_BUFFER) {
  +            if (g2d.getRenderingHint(RenderingHintsKeyExt.KEY_TRANSCODING) ==
  +                RenderingHintsKeyExt.VALUE_TRANSCODING_PRINTING) 
  +                return sRGB_Unpre;
  +
  +            // System.out.println("CM: " + gc.getColorModel());
  +            // System.out.println("CS: " + gc.getColorModel().getColorSpace());
               return null;
  +        }
   
           return gc.getColorModel();
       }
   
       public static ColorSpace getDestinationColorSpace(Graphics2D g2d) {
           ColorModel cm = getDestinationColorModel(g2d);
  -        if (cm == null)
  -            return null;
  +        if (cm != null) return cm.getColorSpace();
   
  -        return cm.getColorSpace();
  +        return null;
       }
   
       public static Rectangle getDestinationBounds(Graphics2D g2d) {
  @@ -998,6 +1026,8 @@
               // nothing to do alpha state matches...
               return cm;
   
  +        // System.out.println("CoerceData: " + wr.getSampleModel());
  +
           int [] pixel = null;
           int    bands = wr.getNumBands();
           float  norm;
  @@ -1501,4 +1531,72 @@
               }
           }
       }
  +
  +/*
  +  This is skanky debugging code that might be useful in the future:
  +
  +            if (count == 33) {
  +                String label = "sub [" + x + ", " + y + "]: ";
  +                org.ImageDisplay.showImage
  +                    (label, subBI);
  +                org.ImageDisplay.printImage
  +                    (label, subBI,
  +                     new Rectangle(75-iR.x, 90-iR.y, 32, 32));
  +                
  +            }
  +
  +
  +            // if ((count++ % 50) == 10)
  +            //     org.ImageDisplay.showImage("foo: ", subBI);
  +
  +
  +            Graphics2D realG2D = g2d;
  +            while (realG2D instanceof sun.java2d.ProxyGraphics2D) {
  +                realG2D = ((sun.java2d.ProxyGraphics2D)realG2D).getDelegate();
  +            }
  +            if (realG2D instanceof sun.awt.image.BufferedImageGraphics2D) {
  +                count++;
  +                if (count == 34) {
  +                    RenderedImage ri;
  +                    ri = ((sun.awt.image.BufferedImageGraphics2D)realG2D).bufImg;
  +                    // g2d.setComposite(SVGComposite.OVER);
  +                    // org.ImageDisplay.showImage("Bar: " + count, cr);
  +                    org.ImageDisplay.printImage("Bar: " + count, cr,
  +                                                new Rectangle(75, 90, 32, 32));
  +
  +                    org.ImageDisplay.showImage ("Foo: " + count, ri);
  +                    org.ImageDisplay.printImage("Foo: " + count, ri,
  +                                                new Rectangle(75, 90, 32, 32));
  +
  +                    System.out.println("BI: "   + ri);
  +                    System.out.println("BISM: " + ri.getSampleModel());
  +                    System.out.println("BICM: " + ri.getColorModel());
  +                    System.out.println("BICM class: " + ri.getColorModel().getClass());
  +                    System.out.println("BICS: " + ri.getColorModel().getColorSpace());
  +                    System.out.println
  +                        ("sRGB CS: " + 
  +                         ColorSpace.getInstance(ColorSpace.CS_sRGB));
  +                    System.out.println("G2D info");
  +                    System.out.println("\tComposite: " + g2d.getComposite());
  +                    System.out.println("\tTransform" + g2d.getTransform());
  +                    java.awt.RenderingHints rh = g2d.getRenderingHints();
  +                    java.util.Set keys = rh.keySet();
  +                    java.util.Iterator iter = keys.iterator();
  +                    while (iter.hasNext()) {
  +                        Object o = iter.next();
  +
  +                        System.out.println("\t" + o.toString() + " -> " +
  +                                           rh.get(o).toString());
  +                    }
  +
  +                    ri = cr;
  +                    System.out.println("RI: "   + ri);
  +                    System.out.println("RISM: " + ri.getSampleModel());
  +                    System.out.println("RICM: " + ri.getColorModel());
  +                    System.out.println("RICM class: " + ri.getColorModel().getClass());
  +                    System.out.println("RICS: " + ri.getColorModel().getColorSpace());
  +                }
  +            }
  +*/
  +
   }
  
  
  
  1.2       +2 -2      xml-batik/sources/org/apache/batik/ext/awt/image/SVGComposite.java
  
  Index: SVGComposite.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/ext/awt/image/SVGComposite.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- SVGComposite.java	2001/03/26 21:36:07	1.1
  +++ SVGComposite.java	2001/11/29 15:05:26	1.2
  @@ -29,7 +29,7 @@
    * This provides an implementation of all the composite rules in SVG.
    *
    * @author <a href="mailto:Thomas.DeWeeese@Kodak.com">Thomas DeWeese</a>
  - * @version $Id: SVGComposite.java,v 1.1 2001/03/26 21:36:07 deweese Exp $
  + * @version $Id: SVGComposite.java,v 1.2 2001/11/29 15:05:26 deweese Exp $
    */
   public class SVGComposite
       implements Composite {
  @@ -379,7 +379,7 @@
               final int pt5  = (1<<23);
   
               int srcP, dstInP, dstM;
  -
  +            
               for (int y = 0; y<height; y++) {
                   final int end = dstOutSp+width;
                   while (dstOutSp<end) {
  
  
  
  1.11      +3 -2      xml-batik/sources/org/apache/batik/ext/awt/image/renderable/CompositeRable8Bit.java
  
  Index: CompositeRable8Bit.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/ext/awt/image/renderable/CompositeRable8Bit.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- CompositeRable8Bit.java	2001/05/02 15:41:11	1.10
  +++ CompositeRable8Bit.java	2001/11/29 15:05:26	1.11
  @@ -39,7 +39,7 @@
    * the image are applied in the order they are in the List given.
    *
    * @author <a href="mailto:Thomas.DeWeeese@Kodak.com">Thomas DeWeese</a>
  - * @version $Id: CompositeRable8Bit.java,v 1.10 2001/05/02 15:41:11 tkormann Exp $
  + * @version $Id: CompositeRable8Bit.java,v 1.11 2001/11/29 15:05:26 deweese Exp $
    */
   public class CompositeRable8Bit
       extends    AbstractColorInterpolationRable
  @@ -105,8 +105,9 @@
   
           ColorSpace crCS = getOperationColorSpace();
           ColorSpace g2dCS = GraphicsUtil.getDestinationColorSpace(g2d);
  -        if ((g2dCS == null) || (g2dCS != crCS))
  +        if ((g2dCS == null) || (g2dCS != crCS)) {
               return false;
  +        }
   
           // System.out.println("drawImage : " + g2dCS +
           //                    crCS);
  
  
  
  1.4       +6 -5      xml-batik/sources/org/apache/batik/ext/awt/image/rendered/Any2sRGBRed.java
  
  Index: Any2sRGBRed.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/ext/awt/image/rendered/Any2sRGBRed.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- Any2sRGBRed.java	2001/07/26 18:03:07	1.3
  +++ Any2sRGBRed.java	2001/11/29 15:05:26	1.4
  @@ -34,7 +34,7 @@
    * new image.
    *
    * @author <a href="mailto:Thomas.DeWeeese@Kodak.com">Thomas DeWeese</a>
  - * @version $Id: Any2sRGBRed.java,v 1.3 2001/07/26 18:03:07 deweese Exp $ */
  + * @version $Id: Any2sRGBRed.java,v 1.4 2001/11/29 15:05:26 deweese Exp $ */
   public class Any2sRGBRed extends AbstractRed {
   
       boolean srcIsLsRGB = false;
  @@ -124,16 +124,17 @@
           final int height     = wr.getHeight();
           final int scanStride = sm.getScanlineStride();
   
  -        int count=0;
  +        int end, pix;
  +
           // For alpha premult we need to multiply all comps.
           for (int y=0; y<height; y++) {
               int sp  = srcBase + y*scanStride;
  -            final int end = sp + width;
  +            end = sp + width;
   
               while (sp<end) {
  -                final int pix = pixels[sp];
  +                pix = pixels[sp];
                   pixels[sp] = 
  -                    ((pix&0xFF000000)           |
  +                    ((     pix      &0xFF000000)|
                        (lut[(pix>>>16)&0xFF]<<16) |
                        (lut[(pix>>> 8)&0xFF]<< 8) |
                        (lut[(pix     )&0xFF]    ));
  
  
  
  1.18      +8 -4      xml-batik/sources/org/apache/batik/transcoder/print/PrintTranscoder.java
  
  Index: PrintTranscoder.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/transcoder/print/PrintTranscoder.java,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- PrintTranscoder.java	2001/10/24 14:52:37	1.17
  +++ PrintTranscoder.java	2001/11/29 15:05:26	1.18
  @@ -48,7 +48,10 @@
   import org.apache.batik.dom.svg.SVGOMDocument;
   import org.apache.batik.dom.util.DocumentFactory;
   
  +import org.apache.batik.ext.awt.RenderingHintsKeyExt;
  +
   import org.apache.batik.gvt.GraphicsNode;
  +import org.apache.batik.gvt.event.EventDispatcher;
   
   import org.apache.batik.bridge.BridgeContext;
   import org.apache.batik.bridge.BridgeException;
  @@ -57,8 +60,6 @@
   import org.apache.batik.bridge.UserAgent;
   import org.apache.batik.bridge.ViewBox;
   
  -import org.apache.batik.gvt.event.EventDispatcher;
  -
   import org.apache.batik.transcoder.Transcoder;
   import org.apache.batik.transcoder.TranscoderException;
   import org.apache.batik.transcoder.TranscoderInput;
  @@ -109,7 +110,7 @@
    * </ul>
    *
    * @author <a href="mailto:vincent.hardy@eng.sun.com">Vincent Hardy</a>
  - * @version $Id: PrintTranscoder.java,v 1.17 2001/10/24 14:52:37 tkormann Exp $
  + * @version $Id: PrintTranscoder.java,v 1.18 2001/11/29 15:05:26 deweese Exp $
    */
   public class PrintTranscoder extends XMLAbstractTranscoder
       implements Printable {
  @@ -238,7 +239,8 @@
                             pageHeight.floatValue());
           }
   
  -        float x=0, y=0, width=(float)paper.getWidth(), height=(float)paper.getHeight();
  +        float x=0, y=0;
  +        float width=(float)paper.getWidth(), height=(float)paper.getHeight();
   
           Float leftMargin = (Float)hints.get(KEY_MARGIN_LEFT);
           Float topMargin = (Float)hints.get(KEY_MARGIN_TOP);
  @@ -353,6 +355,8 @@
                              RenderingHints.VALUE_ANTIALIAS_ON);
           g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                              RenderingHints.VALUE_INTERPOLATION_BILINEAR);
  +        g.setRenderingHint(RenderingHintsKeyExt.KEY_TRANSCODING,
  +                           RenderingHintsKeyExt.VALUE_TRANSCODING_PRINTING);
   
           //
           // Compute transform so that the SVG document fits on one page
  
  
  

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