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