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/09/17 22:45:18 UTC

cvs commit: xml-batik/sources/org/apache/batik/gvt PatternPaintContext.java

deweese     01/09/17 13:45:18

  Modified:    .        build.xml
               sources/org/apache/batik/ext/awt/image GraphicsUtil.java
               sources/org/apache/batik/ext/awt/image/rendered
                        AffineRed.java TileCacheRed.java TileRed.java
               sources/org/apache/batik/gvt PatternPaintContext.java
  Added:       sources  batik-slideshow.mf
               sources/org/apache/batik/apps/slideshow Main.java
  Log:
  1) commited SVG Slideshow app from JavaONE.  This is a good demonstration
     of using the StaticRenderer directly (bypassing JSVGCanvas).
  2) Some tweaks to the PatternPaint stuff.
  
  Revision  Changes    Path
  1.82      +15 -1     xml-batik/build.xml
  
  Index: build.xml
  ===================================================================
  RCS file: /home/cvs/xml-batik/build.xml,v
  retrieving revision 1.81
  retrieving revision 1.82
  diff -u -r1.81 -r1.82
  --- build.xml	2001/09/10 11:57:05	1.81
  +++ build.xml	2001/09/17 20:45:18	1.82
  @@ -44,7 +44,7 @@
     [win32] .\build.bat help
   
    
  - $Id: build.xml,v 1.81 2001/09/10 11:57:05 vhardy Exp $
  + $Id: build.xml,v 1.82 2001/09/17 20:45:18 deweese Exp $
   
   -->
   
  @@ -275,6 +275,7 @@
                                  xml-jar,
                                  root-jar,
                                  svg-pp-jar,
  +                               svg-slideshow-jar,
                                  svggen-jar,
                                  svg-browser-jar,
                                  rasterizer-jar,
  @@ -582,6 +583,19 @@
         </fileset>
         <fileset dir="${resources}" excludes="${resources}/**/CVS">
           <include name="${package-prefix}/apps/svgpp/**/resources/**"/>
  +      </fileset>
  +    </jar>
  +  </target>
  +
  +  <!-- SVG Slide-show (dependencies: ???) -->
  +  <target name="svg-slideshow-jar" depends="compile, prepare-build">
  +    <jar manifest="${src}/${project}-slideshow.mf"
  +         jarfile="${build}/${project}-slideshow.jar">
  +      <fileset dir="${dest}">
  +        <include name="${package-prefix}/apps/slideshow/**/*.class"/>
  +      </fileset>
  +      <fileset dir="${resources}" excludes="${resources}/**/CVS">
  +        <include name="${package-prefix}/apps/slideshow/**/resources/**"/>
         </fileset>
       </jar>
     </target>
  
  
  
  1.1                  xml-batik/sources/batik-slideshow.mf
  
  Index: batik-slideshow.mf
  ===================================================================
  Manifest-Version: $Id: batik-slideshow.mf,v 1.1 2001/09/17 20:45:18 deweese Exp $
  Class-Path: lib/batik-ext.jar \
              lib/batik-dom.jar \
              lib/batik-css.jar \
              lib/batik-svg-dom.jar \
              lib/batik-gvt.jar \
              lib/batik-parser.jar \
              lib/batik-script.jar \
              lib/batik-bridge.jar \
              lib/batik-transcoder.jar \
              lib/batik-awt-util.jar \
              lib/batik-util.jar \
              lib/batik-xml.jar \
              lib/crimson-parser.jar \
              lib/js.jar
  Main-Class: org.apache.batik.apps.slideshow.Main
  
  
  
  1.1                  xml-batik/sources/org/apache/batik/apps/slideshow/Main.java
  
  Index: Main.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.apps.slideshow;
  
  import org.apache.batik.gvt.renderer.StaticRenderer;
  import org.apache.batik.gvt.GraphicsNodeRenderContext;
  import org.apache.batik.gvt.GraphicsNode;
  
  import org.apache.batik.bridge.UserAgentAdapter;
  import org.apache.batik.bridge.UserAgent;
  import org.apache.batik.bridge.DocumentLoader;
  import org.apache.batik.bridge.BridgeContext;
  import org.apache.batik.bridge.GVTBuilder;
  import org.apache.batik.bridge.ViewBox;
  
  import javax.swing.JComponent;
  import javax.swing.JFrame;
  import javax.swing.JWindow;
  import java.awt.image.BufferedImage;
  import java.awt.Cursor;
  import java.awt.Graphics;
  import java.awt.Graphics2D;
  import java.awt.geom.AffineTransform;
  import java.awt.Rectangle;
  import java.awt.Dimension;
  import java.awt.Color;
  import java.awt.Point;
  import java.awt.Insets;
  import java.awt.Toolkit;
  
  import java.awt.event.MouseEvent;
  import java.awt.event.MouseAdapter;
  
  import java.io.File;
  import java.io.BufferedReader;
  import java.io.FileReader;
  import java.io.FileNotFoundException;
  import java.io.IOException;
  
  import java.util.Vector;
  import java.net.URL;
  import java.net.MalformedURLException;
  
  import org.w3c.dom.Document;
  import org.w3c.dom.Element;
  import org.w3c.dom.svg.SVGDocument;
  
  public class Main extends JComponent {
  
      StaticRenderer renderer;
      GraphicsNodeRenderContext  rc;
      UserAgent      userAgent;
      DocumentLoader loader;
      BridgeContext  ctx;
  
      BufferedImage image;
      BufferedImage display;
      File [] files;
  
      static int duration = 3000;
      static int frameDelay = duration+7000;
  
      boolean done = false;
  
      public Main(File []files, Dimension size) { 
          setBackground(Color.black);
          this.files = files;
          renderer = new StaticRenderer();
          rc        = renderer.getRenderContext();
          userAgent = new UserAgentAdapter();
          loader    = new DocumentLoader(userAgent);
          ctx       = new BridgeContext(userAgent, rc, loader);
  
          Thread t = new RenderThread();
          t.start();
  
          boolean frameless = false;
          if (size == null) {
              size = Toolkit.getDefaultToolkit().getScreenSize();
              frameless = true;
          }
  
          setPreferredSize(size);
          setDoubleBuffered(false);
          addMouseListener(new MouseAdapter() {
                  public void mouseClicked(MouseEvent me) {
                      if (done)
                          System.exit(0);
                      else
                          togglePause();
                  }
              });
  
          size.width += 2;
          size.height += 2;
          display = new BufferedImage(size.width, size.height, 
                                      BufferedImage.TYPE_INT_BGR);
  
          JWindow w = new JWindow();
          w.setBackground(Color.black);
          w.getContentPane().setBackground(Color.black);
          w.getContentPane().add(this);
          w.pack();
          w.setLocation(new Point(-1, -1));
          w.setVisible(true);
      }
  
      class RenderThread extends Thread {
          public void run() {
              renderer.setDoubleBuffered(true);
              for (int i=0; i<files.length; i++) {
                  GraphicsNode   gvtRoot = null;
                  GVTBuilder builder = new GVTBuilder();
  
                  try {
                      System.out.println("Reading: " + files[i]);
                      Document svgDoc = loader.loadDocument
                          (files[i].toURL().toString());
                      System.out.println("Building: " + files[i]);
                      gvtRoot = builder.build(ctx, svgDoc);
                      System.out.println("Rendering: " + files[i]);
                      renderer.setTree(gvtRoot);
  
                      Element elt = ((SVGDocument)svgDoc).getRootElement();
                      renderer.setTransform
                          (ViewBox.getViewTransform
                           (null, elt, display.getWidth(), display.getHeight()));
  
                      renderer.updateOffScreen(display.getWidth(), 
                                               display.getHeight());
  
                      Rectangle r = new Rectangle(0, 0,
                                                  display.getWidth(), 
                                                  display.getHeight());
                      renderer.repaint(r);
                      System.out.println("Painting: " + files[i]);
                      image = renderer.getOffScreen();
                      setTransition(image);
                  } catch (Throwable t) {
                      t.printStackTrace();
                  }
              
              }
              if (transitionThread != null) {
                  try {
                      transitionThread.join();
                  } catch (InterruptedException ie) { }
                  done = true;
                  setCursor(new Cursor(Cursor.WAIT_CURSOR));
              }
          }
      }
  
      Thread transitionThread = null;
  
      public void setTransition(BufferedImage newImg) {
          synchronized (this) {
              while (transitionThread != null) {
                  try {
                      wait();
                  } catch (InterruptedException ie) { }
              }
              transitionThread = new TransitionThread(newImg);
              transitionThread.start();
          }
      }
  
  
      long   startLastTransition=0;
  
      boolean paused = false;
  
      public void togglePause() {
          synchronized(this) {
              paused = !paused;
              Cursor c;
              if (paused) {
                  c = new Cursor(Cursor.WAIT_CURSOR);
              } else {
                  c = new Cursor(Cursor.DEFAULT_CURSOR);
                  if (transitionThread != null) {
                      synchronized (transitionThread) {
                          transitionThread.notify();
                      }
                  }
              }
              setCursor(c);
          }
      }
  
      class TransitionThread extends Thread {
          BufferedImage src;
          int blockw = 75;
          int blockh = 75;
  
          public TransitionThread(BufferedImage bi) {
              src = bi;
          }
  
          public void run() {
              int xblocks = (display.getWidth()+blockw-1)/blockw;
              int yblocks = (display.getHeight()+blockh-1)/blockh;
              int nblocks = xblocks*yblocks;
  
              int tblock = duration/nblocks;
              
              Point [] rects = new Point[nblocks];
              for (int y=0; y<yblocks; y++)
                  for (int x=0; x<xblocks; x++)
                      rects[y*xblocks+x] = new Point(x, y);
  
              Graphics2D g2d = display.createGraphics();
              g2d.setColor(new Color(0,0,0));
  
              long currTrans = System.currentTimeMillis();
              while ((currTrans-startLastTransition) < frameDelay) {
                  try {
                      long stime = frameDelay-(currTrans-startLastTransition);
                      if (stime > 500) {
                          System.gc();
                          currTrans = System.currentTimeMillis();
                          stime = frameDelay-(currTrans-startLastTransition);
                      }
                      if (stime > 0) sleep(stime);
                  } catch (InterruptedException ie) { }
                  currTrans = System.currentTimeMillis();
              }
  
              synchronized(this) {
                  while (paused) {
                      try {
                          wait();
                      } catch (InterruptedException ie) { }
                  }
              }
  
              long last = startLastTransition = System.currentTimeMillis();
              
              for (int i=0; i<rects.length; i++) {
                  int idx = (int)(Math.random()*(rects.length-i));
                  Point pt = rects[idx];
                  for (int j=idx+1; j<rects.length-i;j++)
                      rects[j-1] = rects[j];
                  int x=pt.x*blockw, y=pt.y*blockh;
                  int w=blockw, h = blockh;
                  if (x+w > src.getWidth())  w = src.getWidth()-x;
                  if (y+h > src.getHeight()) h = src.getHeight()-y;
  
                  synchronized (display) {
                      g2d.fillRect(x, y, w, h);
                      BufferedImage sub;
  
                      sub = src.getSubimage(x, y, w, h);
                      g2d.drawImage(sub, null, x, y);
                  }
  
                  repaint(x, y, w, h);
                  long current = System.currentTimeMillis();
                  try {
                      long dt = current-last;
                      if (dt < tblock)
                          sleep(tblock-dt);
                  } catch (InterruptedException ie) { }
                  last = current;
              }
  
              synchronized (Main.this) {
                  transitionThread = null;
                  Main.this.notify();
              }
          }
      }
  
      public void paint(Graphics g) {
          Graphics2D g2d = (Graphics2D)g;
          if (display == null) return;
          // System.out.println("Drawing Image: " + display);
          g2d.drawImage(display, null, 0, 0);
      }
  
      public static void readFileList(String file, Vector fileVec) {
          BufferedReader br;
          try {
              br = new BufferedReader(new FileReader(file));
          } catch(FileNotFoundException fnfe) {
              System.err.println("Unable to open file-list: " + file);
              return;
          }
          try {
              URL flURL = new File(file).toURL();
              String line;
              while ((line = br.readLine()) != null) {
                  String str = line;
                  int idx = str.indexOf('#');
                  if (idx != -1)
                      str = str.substring(0, idx);
                  str.trim();
                  if (str.length() == 0)
                      continue;
                  try {
                      URL imgURL = new URL(flURL, str);
                      fileVec.add(imgURL.getFile());
                  } catch (MalformedURLException mue) {
                      System.err.println("Can't make sense of line:\n  " + line);
                  }
              }
          } catch (IOException ioe) {
              System.err.println("Error while reading file-list: " + file);
          }
      }
  
      public static void main(String []args) {
  
          Vector fileVec = new Vector();
  
          Dimension d = null;
          
          if (args.length == 0) {
              showUsage();
              return;
          }
  
          for (int i=0; i<args.length; i++) {
              if ((args[i].equals("-h")) ||
                  (args[i].equals("-help")) ||
                  (args[i].equals("--help"))){
                  showUsage();
                  return;
              } else if (args[i].equals("--")) {
                  i++;
                  while(i < args.length) {
                      fileVec.add(args[i++]);
                  }
                  break;
              } else if ((args[i].equals("-fl"))||
                       (args[i].equals("--file-list"))) {
                  if (i+1 == args.length) {
                      System.err.println
                          ("Must provide name of file list file after " + 
                           args[i]);
                      break;
                  }
                  readFileList(args[i+1], fileVec);
                  i++;
              } else if ((args[i].equals("-ft"))||
                         (args[i].equals("--frame-time"))) {
                  if (i+1 == args.length) {
                      System.err.println
                          ("Must provide time in millis after " + args[i]);
                      break;
                  }
                  try {
                      frameDelay = Integer.decode(args[i+1]).intValue();
                      i++;
                  } catch (NumberFormatException nfe) {
                      System.err.println
                          ("Can't parse frame time: " + args[i+1]);
                  }
              } else if ((args[i].equals("-tt"))||
                         (args[i].equals("--transition-time"))) {
                  if (i+1 == args.length) {
                      System.err.println
                          ("Must provide time in millis after " + args[i]);
                      break;
                  }
                  try {
                      duration = Integer.decode(args[i+1]).intValue();
                      i++;
                  } catch (NumberFormatException nfe) {
                      System.err.println
                          ("Can't parse transition time: " + args[i+1]);
                  }                
              } else if ((args[i].equals("-ws"))||
                         (args[i].equals("--window-size"))) {
                  
                  if (i+1 == args.length) {
                      System.err.println
                          ("Must provide window size [w,h] after " + args[i]);
                      break;
                  }
                  try {
                      int idx = args[i+1].indexOf(',');
                      int w, h;
                      if (idx == -1)
                          w = h = Integer.decode(args[i+1]).intValue();
                      else {
                          String wStr = args[i+1].substring(0,idx);
                          String hStr = args[i+1].substring(idx+1);
                          w = Integer.decode(wStr).intValue();
                          h = Integer.decode(hStr).intValue();
                      }
                      d = new Dimension(w, h);
                      i++;
                  } catch (NumberFormatException nfe) {
                      System.err.println
                          ("Can't parse window size: " + args[i+1]);
                  }
              } else
                  fileVec.add(args[i]);
          }
              
          File [] files = new File[fileVec.size()];
  
  
          for (int i=0; i<fileVec.size(); i++) {
              try {
                  files[i] = new File((String)fileVec.get(i));
              } catch (Throwable t) {
                  t.printStackTrace();
              }
          }
  
          new Main(files, d);
      }
  
      public static void showUsage() {
          System.out.println
  ("Options:\n" +
   "                                 -- : Remaining args are file names\n" +
   "                         -fl <file>\n" +
   "                 --file-list <file> : file contains list of images to\n" +
   "                                      show one per line\n" +
   "             -ws <width>[,<height>]\n" +
   "    -window-size <width>[,<height>] : Set the size of slideshow window\n" +
   "                                      defaults to full screen\n" +
   "                          -ft <int>\n" +
   "                 --frame-time <int> : Amount of time in millisecs to\n" +
   "                                      show each frame.\n" +
   "                                      Includes transition time.\n" +
   "                          -tt <int>\n" +
   "            --transition-time <int> : Amount of time in millisecs to\n" +
   "                                      transition between frames.\n" +
   "                             <file> : SVG file to display");
      }
  
  }
  
  
  
  1.19      +93 -86    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.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- GraphicsUtil.java	2001/05/15 13:55:22	1.18
  +++ GraphicsUtil.java	2001/09/17 20:45:18	1.19
  @@ -65,7 +65,7 @@
    * implementations.
    *
    * @author <a href="mailto:Thomas.DeWeeese@Kodak.com">Thomas DeWeese</a>
  - * @version $Id: GraphicsUtil.java,v 1.18 2001/05/15 13:55:22 deweese Exp $
  + * @version $Id: GraphicsUtil.java,v 1.19 2001/09/17 20:45:18 deweese Exp $
    */
   public class GraphicsUtil {
   
  @@ -268,98 +268,105 @@
                   }
               }
   
  -            srcCM = cr.getColorModel();
  -            SampleModel srcSM = cr.getSampleModel();
  -            WritableRaster wr;
  -            wr = Raster.createWritableRaster(srcSM, new Point(0,0));
  -            BufferedImage bi = new BufferedImage
  -                (srcCM, wr, srcCM.isAlphaPremultiplied(), null);
  -
  -            int xt0 = cr.getMinTileX();
  -            int xt1 = xt0+cr.getNumXTiles();
  -            int yt0 = cr.getMinTileY();
  -            int yt1 = yt0+cr.getNumYTiles();
  -            int tw  = srcSM.getWidth();
  -            int th  = srcSM.getHeight();
  -
  -            Rectangle tR  = new Rectangle(0,0,tw,th);
  -            Rectangle iR  = new Rectangle(0,0,0,0);
  +            // System.out.println("Starting Draw: " + cr);
  +            long startTime = System.currentTimeMillis();
   
               if (false) {
  -                System.out.println("CR: " + cr);
  -                System.out.println("CRR: " + crR + " TG: [" +
  -                                   xt0 +"," +
  -                                   yt0 +"," +
  -                                   xt1 +"," +
  -                                   yt1 +"] Off: " +
  -                                   cr.getTileGridXOffset() +"," +
  -                                   cr.getTileGridYOffset());
  -            }
  -
  -            DataBuffer db = wr.getDataBuffer();
  -            int yloc = yt0*th+cr.getTileGridYOffset();
  -            int skip = (clipR.y-yloc)/th;
  -            if (skip <0) skip = 0;
  -            yt0+=skip;
  -
  -            int xloc = xt0*tw+cr.getTileGridXOffset();
  -            skip = (clipR.x-xloc)/tw;
  -            if (skip <0) skip = 0;
  -            xt0+=skip;
  -
  -            int endX = clipR.x+clipR.width-1;
  -            int endY = clipR.y+clipR.height-1;
  +                // This can be significantly faster but can also
  +                // require much more memory.
  +                g2d.drawRenderedImage(cr, IDENTITY);
  +            } else {
  +                // Use tiles to draw image...
  +                srcCM = cr.getColorModel();
  +                SampleModel srcSM = cr.getSampleModel();
  +                WritableRaster wr;
  +                wr = Raster.createWritableRaster(srcSM, new Point(0,0));
  +                BufferedImage bi = new BufferedImage
  +                    (srcCM, wr, srcCM.isAlphaPremultiplied(), null);
  +
  +                int xt0 = cr.getMinTileX();
  +                int xt1 = xt0+cr.getNumXTiles();
  +                int yt0 = cr.getMinTileY();
  +                int yt1 = yt0+cr.getNumYTiles();
  +                int tw  = srcSM.getWidth();
  +                int th  = srcSM.getHeight();
  +
  +                Rectangle tR  = new Rectangle(0,0,tw,th);
  +                Rectangle iR  = new Rectangle(0,0,0,0);
  +
  +                if (false) {
  +                    System.out.println("CR: " + cr);
  +                    System.out.println("CRR: " + crR + " TG: [" +
  +                                       xt0 +"," +
  +                                       yt0 +"," +
  +                                       xt1 +"," +
  +                                       yt1 +"] Off: " +
  +                                       cr.getTileGridXOffset() +"," +
  +                                       cr.getTileGridYOffset());
  +                }
   
  -            if (false) {
  -                System.out.println("clipR: " + clipR + " TG: [" +
  -                                   xt0 +"," +
  -                                   yt0 +"," +
  -                                   xt1 +"," +
  -                                   yt1 +"] Off: " +
  -                                   cr.getTileGridXOffset() +"," +
  -                                   cr.getTileGridYOffset());
  -            }
  +                DataBuffer db = wr.getDataBuffer();
  +                int yloc = yt0*th+cr.getTileGridYOffset();
  +                int skip = (clipR.y-yloc)/th;
  +                if (skip <0) skip = 0;
  +                yt0+=skip;
  +
  +                int xloc = xt0*tw+cr.getTileGridXOffset();
  +                skip = (clipR.x-xloc)/tw;
  +                if (skip <0) skip = 0;
  +                xt0+=skip;
  +
  +                int endX = clipR.x+clipR.width-1;
  +                int endY = clipR.y+clipR.height-1;
  +
  +                if (false) {
  +                    System.out.println("clipR: " + clipR + " TG: [" +
  +                                       xt0 +"," +
  +                                       yt0 +"," +
  +                                       xt1 +"," +
  +                                       yt1 +"] Off: " +
  +                                       cr.getTileGridXOffset() +"," +
  +                                       cr.getTileGridYOffset());
  +                }
   
  -            // System.out.println("Starting Draw: " + cr);
  -            long startTime = System.currentTimeMillis();
   
  -            yloc = yt0*th+cr.getTileGridYOffset();
  -            int minX = xt0*tw+cr.getTileGridXOffset();
  -            int xStep = tw;
  -            xloc = minX;
  -            for (int y=yt0; y<yt1; y++, yloc += th) {
  -                if (yloc > endY) break;
  -                for (int x=xt0; x<xt1; x++, xloc+=xStep) {
  -                    if ((xloc<minX) || (xloc > endX)) break;
  -                    tR.x = xloc;
  -                    tR.y = yloc;
  -                    Rectangle2D.intersect(crR, tR, iR);
  -
  -                    WritableRaster twr;
  -                    twr = wr.createWritableChild(0, 0,
  -                                                 iR.width, iR.height,
  -                                                 iR.x, iR.y, null);
  -
  -                    // System.out.println("Generating tile: " + twr);
  -                    cr.copyData(twr);
  -
  -                    // 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);
  +                yloc = yt0*th+cr.getTileGridYOffset();
  +                int minX = xt0*tw+cr.getTileGridXOffset();
  +                int xStep = tw;
  +                xloc = minX;
  +                for (int y=yt0; y<yt1; y++, yloc += th) {
  +                    if (yloc > endY) break;
  +                    for (int x=xt0; x<xt1; x++, xloc+=xStep) {
  +                        if ((xloc<minX) || (xloc > endX)) break;
  +                        tR.x = xloc;
  +                        tR.y = yloc;
  +                        Rectangle2D.intersect(crR, tR, iR);
  +
  +                        WritableRaster twr;
  +                        twr = wr.createWritableChild(0, 0,
  +                                                     iR.width, iR.height,
  +                                                     iR.x, iR.y, null);
  +
  +                        // System.out.println("Generating tile: " + twr);
  +                        cr.copyData(twr);
  +
  +                        // 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);
  +                        g2d.drawImage(subBI, trans, null);
  +                        // big2d.fillRect(0, 0, tw, th);
                       }
  -
  -                    AffineTransform trans;
  -                    trans = AffineTransform.getTranslateInstance(iR.x, iR.y);
  -                    g2d.drawImage(subBI, trans, null);
  -                    // big2d.fillRect(0, 0, tw, th);
  +                    xStep = -xStep; // Reverse directions.
  +                    xloc += xStep;   // Get back in bounds.
                   }
  -                xStep = -xStep; // Reverse directions.
  -                xloc += xStep;   // Get back in bounds.
               }
  -
               long endTime = System.currentTimeMillis();
               // System.out.println("Time: " + (endTime-startTime));
           } finally {
  @@ -737,7 +744,7 @@
   
               System.arraycopy(srcPixels, srcBase, dstPixels, dstBase,
                                width*height);
  -        } else if (width > 20) {
  +        } else if (width > 128) {
               int srcSP = srcBase;
               int dstSP = dstBase;
               for (int y=0; y<height; y++) {
  
  
  
  1.9       +5 -1      xml-batik/sources/org/apache/batik/ext/awt/image/rendered/AffineRed.java
  
  Index: AffineRed.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/ext/awt/image/rendered/AffineRed.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- AffineRed.java	2001/04/24 21:34:48	1.8
  +++ AffineRed.java	2001/09/17 20:45:18	1.9
  @@ -41,7 +41,7 @@
    * to do the work.  Eventually this may move to be more tiled in nature.
    *
    * @author <a href="mailto:Thomas.DeWeeese@Kodak.com">Thomas DeWeese</a>
  - * @version $Id: AffineRed.java,v 1.8 2001/04/24 21:34:48 deweese Exp $ */
  + * @version $Id: AffineRed.java,v 1.9 2001/09/17 20:45:18 deweese Exp $ */
   public class AffineRed extends AbstractRed {
   
       RenderingHints  hints;
  @@ -175,6 +175,10 @@
           ColorModel myCM = getColorModel();
   
           WritableRaster srcWR = (WritableRaster)srcRas;
  +        // If the output buffer is not premultiplied in certain cases
  +        // it fails to properly divide out the Alpha (it always does
  +        // the affine on premultiplied data). We help it out by
  +        // premultiplying for it.
           srcCM = GraphicsUtil.coerceData(srcWR, srcCM, true);
           srcBI = new BufferedImage(srcCM,
                                     srcWR.createWritableTranslatedChild(0,0),
  
  
  
  1.3       +17 -1     xml-batik/sources/org/apache/batik/ext/awt/image/rendered/TileCacheRed.java
  
  Index: TileCacheRed.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/ext/awt/image/rendered/TileCacheRed.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- TileCacheRed.java	2001/07/18 22:04:53	1.2
  +++ TileCacheRed.java	2001/09/17 20:45:18	1.3
  @@ -10,13 +10,15 @@
   
   import java.awt.Rectangle;
   import java.awt.image.WritableRaster;
  +import java.awt.image.ColorModel;
  +import java.awt.image.SampleModel;
   
   /**
    * This implementation of RenderedImage only serves to put the tiles
    * generated by it's input into the TileCache.
    *
    * @author <a href="mailto:thomas.deweese@kodak.com">Thomas DeWeese</a>
  - * @version $Id: TileCacheRed.java,v 1.2 2001/07/18 22:04:53 deweese Exp $ 
  + * @version $Id: TileCacheRed.java,v 1.3 2001/09/17 20:45:18 deweese Exp $ 
    */
   public class TileCacheRed extends AbstractTiledRed {
   
  @@ -26,6 +28,20 @@
        */
       public TileCacheRed(CachableRed cr) {
           super(cr, null);
  +    }
  +
  +    /**
  +     * Place the results of computations of cr into the global tile cache.
  +     * @param cr The operation to cache results from.
  +     */
  +    public TileCacheRed(CachableRed cr, int tileWidth, int tileHeight) {
  +        super();
  +        ColorModel  cm = cr.getColorModel();
  +        Rectangle bounds = cr.getBounds();
  +        if (tileWidth  > bounds.width)  tileWidth  = bounds.width;
  +        if (tileHeight > bounds.height) tileHeight = bounds.height;
  +        SampleModel sm = cm.createCompatibleSampleModel(tileWidth, tileHeight);
  +        init(cr, cr.getBounds(), cm, sm, 0, 0, null);
       }
   
       public void genRect(WritableRaster wr) {
  
  
  
  1.9       +25 -14    xml-batik/sources/org/apache/batik/ext/awt/image/rendered/TileRed.java
  
  Index: TileRed.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/ext/awt/image/rendered/TileRed.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- TileRed.java	2001/07/26 18:03:07	1.8
  +++ TileRed.java	2001/09/17 20:45:18	1.9
  @@ -37,7 +37,7 @@
    * left corner of the tiled region.
    * 
    * @author <a href="mailto:vincent.hardy@eng.sun.com">Vincent Hardy</a>
  - * @version $Id: TileRed.java,v 1.8 2001/07/26 18:03:07 deweese Exp $
  + * @version $Id: TileRed.java,v 1.9 2001/09/17 20:45:18 deweese Exp $
    */
   public class TileRed extends AbstractRed implements TileGenerator {
       static final AffineTransform IDENTITY = new AffineTransform();
  @@ -55,6 +55,7 @@
       private RenderingHints  hints;
   
       final boolean is_INT_PACK;
  +    final boolean alphaPremult;
   
       /**
        * Tile
  @@ -93,18 +94,21 @@
           }
   
           // org.apache.batik.test.gvt.ImageDisplay.showImage("Tile: ", tile);
  -        this.tiledRegion = tiledRegion;
  -        this.xStep       = xStep;
  -        this.yStep       = yStep;
  -        this.hints       = hints;
  +        this.tiledRegion  = tiledRegion;
  +        this.xStep        = xStep;
  +        this.yStep        = yStep;
  +        this.hints        = hints;
  +        this.alphaPremult = false;
   
  -        SampleModel sm = fixSampleModel(tile, tiledRegion);
  -        ColorModel cm = tile.getColorModel();
  +        SampleModel sm = fixSampleModel(tile, xStep, yStep);
  +        ColorModel cm  = fixColorModel(tile, alphaPremult);
   
  -        double smSz   = sm.getWidth()*sm.getHeight();
  +        double smSz   = AbstractTiledRed.getDefaultTileSize();
  +        smSz = smSz*smSz;
  +
           double stepSz = (xStep*(double)yStep);
           // be prepaired to grow the default tile size quite a bit if
  -        // it means the image to tile will fit in it...
  +        // it means the image tile will fit in it...
           if (16.1*smSz > stepSz) {
               int xSz = xStep;
               int ySz = yStep;
  @@ -116,13 +120,14 @@
                   xSz *= mult;
                   ySz *= mult;
               }
  -
  +            // System.out.println("Using Raster for pattern");
               sm = sm.createCompatibleSampleModel(xSz, ySz);
               raster = Raster.createWritableRaster
                   (sm, new Point(tile.getMinX(), tile.getMinY()));
           }
           
           is_INT_PACK = GraphicsUtil.is_INT_PACK_Data(sm, false);
  +        // System.out.println("Is INT PACK: " + is_INT_PACK);
   
           // Initialize our base class We set our bounds be we will
           // respond with data for any area we cover.  This is needed
  @@ -321,9 +326,15 @@
           count %= colors.length;
   
           g.fillRect(0, 0, maxX, maxY);*/
  -
  +        GraphicsUtil.coerceData(wr, src.getColorModel(), alphaPremult);
           return wr;
       }
  +
  +    protected static ColorModel fixColorModel(RenderedImage src,
  +                                              boolean alphaPremult) {
  +        return GraphicsUtil.coerceColorModel(src.getColorModel(), 
  +                                             alphaPremult);
  +    }
       
       /**
        * This function 'fixes' the source's sample model.
  @@ -331,15 +342,15 @@
        * much larger than my width.
        */
       protected static SampleModel fixSampleModel(RenderedImage src,
  -                                                Rectangle   bounds) {
  +                                                int stepX, int stepY) {
           int defSz = AbstractTiledRed.getDefaultTileSize();
           SampleModel sm = src.getSampleModel();
           int w = sm.getWidth();
           if (w < defSz) w = defSz;
  -        if (w > bounds.width)  w = bounds.width;
  +        if (w > stepX)  w = stepX;
           int h = sm.getHeight();
           if (h < defSz) h = defSz;
  -        if (h > bounds.height) h = bounds.height;
  +        if (h > stepY) h = stepY;
           return sm.createCompatibleSampleModel(w, h);
       }
   }
  
  
  
  1.7       +11 -5     xml-batik/sources/org/apache/batik/gvt/PatternPaintContext.java
  
  Index: PatternPaintContext.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/PatternPaintContext.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- PatternPaintContext.java	2001/07/23 19:36:30	1.6
  +++ PatternPaintContext.java	2001/09/17 20:45:18	1.7
  @@ -32,13 +32,14 @@
   import org.apache.batik.ext.awt.image.renderable.TileRable;
   import org.apache.batik.ext.awt.image.renderable.TileRable8Bit;
   import org.apache.batik.ext.awt.image.rendered.TileCacheRed;
  +import org.apache.batik.ext.awt.image.rendered.CachableRed;
   
   /**
    * <tt>PaintContext</tt> for the <tt>ConcretePatterPaint</tt>
    * paint implementation.
    *
    * @author <a href="vincent.hardy@eng.sun.com">Vincent Hardy</a>
  - * @version $Id: PatternPaintContext.java,v 1.6 2001/07/23 19:36:30 deweese Exp $
  + * @version $Id: PatternPaintContext.java,v 1.7 2001/09/17 20:45:18 deweese Exp $
    */
   public class PatternPaintContext implements PaintContext {
   
  @@ -98,7 +99,6 @@
                                                   EVERYTHING,
                                                   patternRegion,
                                                   overflow);
  -
           ColorSpace destCS = destCM.getColorSpace();
           if (destCS == ColorSpace.getInstance(ColorSpace.CS_sRGB))
               tileRable.setColorSpaceLinear(false);
  @@ -107,17 +107,23 @@
   
           RenderContext rc = new RenderContext(usr2dev,  EVERYTHING, hints);
           tiled = tileRable.createRendering(rc);
  -
           // System.out.println("tileRed: " + tiled);
           // org.apache.batik.test.gvt.ImageDisplay.showImage("Tiled: ", tiled);
   
           //System.out.println("Created rendering");
  -        if(tiled == null) {
  +        if(tiled != null) {
  +            Rectangle2D devRgn = usr2dev.createTransformedShape
  +                (patternRegion).getBounds();
  +            if ((devRgn.getWidth() > 128) ||
  +                (devRgn.getHeight() > 128))
  +                tiled = new TileCacheRed(GraphicsUtil.wrap(tiled), 256, 64);
  +        } else {
               //System.out.println("Tile was null");
               rasterCM = ColorModel.getRGBdefault();
               WritableRaster wr;
               wr = rasterCM.createCompatibleWritableRaster(32, 32);
  -            tiled = new BufferedImage(rasterCM, wr, false, null);
  +            tiled = GraphicsUtil.wrap
  +                (new BufferedImage(rasterCM, wr, false, null));
               return;
           }
   
  
  
  

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