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