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:[EMAIL PROTECTED]">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:[EMAIL PROTECTED]">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:[EMAIL PROTECTED]">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:[EMAIL PROTECTED]">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="[EMAIL PROTECTED]">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: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]