Imported GNU Classpath 0.92
2006-08-14 Mark Wielaard <mark@klomp.org> Imported GNU Classpath 0.92 * HACKING: Add more importing hints. Update automake version requirement. * configure.ac (gconf-peer): New enable AC argument. Add --disable-gconf-peer and --enable-default-preferences-peer to classpath configure when gconf is disabled. * scripts/makemake.tcl: Set gnu/java/util/prefs/gconf and gnu/java/awt/dnd/peer/gtk to bc. Classify gnu/java/security/Configuration.java as generated source file. * gnu/java/lang/management/VMGarbageCollectorMXBeanImpl.java, gnu/java/lang/management/VMMemoryPoolMXBeanImpl.java, gnu/java/lang/management/VMClassLoadingMXBeanImpl.java, gnu/java/lang/management/VMRuntimeMXBeanImpl.java, gnu/java/lang/management/VMMemoryManagerMXBeanImpl.java, gnu/java/lang/management/VMThreadMXBeanImpl.java, gnu/java/lang/management/VMMemoryMXBeanImpl.java, gnu/java/lang/management/VMCompilationMXBeanImpl.java: New VM stub classes. * java/lang/management/VMManagementFactory.java: Likewise. * java/net/VMURLConnection.java: Likewise. * gnu/java/nio/VMChannel.java: Likewise. * java/lang/Thread.java (getState): Add stub implementation. * java/lang/Class.java (isEnum): Likewise. * java/lang/Class.h (isEnum): Likewise. * gnu/awt/xlib/XToolkit.java (getClasspathTextLayoutPeer): Removed. * javax/naming/spi/NamingManager.java: New override for StackWalker functionality. * configure, sources.am, Makefile.in, gcj/Makefile.in, include/Makefile.in, testsuite/Makefile.in: Regenerated. From-SVN: r116139
This commit is contained in:
parent
abab460491
commit
ac1ed908de
1294 changed files with 99479 additions and 35933 deletions
|
@ -1,5 +1,5 @@
|
|||
/* ConvolveOp.java --
|
||||
Copyright (C) 2004, 2005 Free Software Foundation -- ConvolveOp
|
||||
Copyright (C) 2004, 2005, 2006, Free Software Foundation -- ConvolveOp
|
||||
|
||||
This file is part of GNU Classpath.
|
||||
|
||||
|
@ -42,7 +42,6 @@ import java.awt.Graphics2D;
|
|||
import java.awt.RenderingHints;
|
||||
import java.awt.geom.Point2D;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* Convolution filter.
|
||||
|
@ -190,112 +189,101 @@ public class ConvolveOp implements BufferedImageOp, RasterOp
|
|||
* @see java.awt.image.RasterOp#filter(java.awt.image.Raster,
|
||||
* java.awt.image.WritableRaster)
|
||||
*/
|
||||
public final WritableRaster filter(Raster src, WritableRaster dest) {
|
||||
public final WritableRaster filter(Raster src, WritableRaster dest)
|
||||
{
|
||||
if (src == dest)
|
||||
throw new IllegalArgumentException();
|
||||
if (src.getWidth() < kernel.getWidth() ||
|
||||
src.getHeight() < kernel.getHeight())
|
||||
throw new ImagingOpException(null);
|
||||
|
||||
throw new IllegalArgumentException("src == dest is not allowed.");
|
||||
if (kernel.getWidth() > src.getWidth()
|
||||
|| kernel.getHeight() > src.getHeight())
|
||||
throw new ImagingOpException("The kernel is too large.");
|
||||
if (dest == null)
|
||||
dest = createCompatibleDestRaster(src);
|
||||
else if (src.numBands != dest.numBands)
|
||||
throw new ImagingOpException(null);
|
||||
else if (src.getNumBands() != dest.getNumBands())
|
||||
throw new ImagingOpException("src and dest have different band counts.");
|
||||
|
||||
// Deal with bottom edge
|
||||
if (edge == EDGE_ZERO_FILL)
|
||||
{
|
||||
float[] zeros = new float[src.getNumBands() * src.getWidth()
|
||||
* (kernel.getYOrigin() - 1)];
|
||||
Arrays.fill(zeros, 0);
|
||||
dest.setPixels(src.getMinX(), src.getMinY(), src.getWidth(),
|
||||
kernel.getYOrigin() - 1, zeros);
|
||||
}
|
||||
else
|
||||
{
|
||||
float[] vals = new float[src.getNumBands() * src.getWidth()
|
||||
* (kernel.getYOrigin() - 1)];
|
||||
src.getPixels(src.getMinX(), src.getMinY(), src.getWidth(),
|
||||
kernel.getYOrigin() - 1, vals);
|
||||
dest.setPixels(src.getMinX(), src.getMinY(), src.getWidth(),
|
||||
kernel.getYOrigin() - 1, vals);
|
||||
}
|
||||
// calculate the borders that the op can't reach...
|
||||
int kWidth = kernel.getWidth();
|
||||
int kHeight = kernel.getHeight();
|
||||
int left = kernel.getXOrigin();
|
||||
int right = Math.max(kWidth - left - 1, 0);
|
||||
int top = kernel.getYOrigin();
|
||||
int bottom = Math.max(kHeight - top - 1, 0);
|
||||
|
||||
// Handle main section
|
||||
// process the region that is reachable...
|
||||
int regionW = src.width - left - right;
|
||||
int regionH = src.height - top - bottom;
|
||||
float[] kvals = kernel.getKernelData(null);
|
||||
float[] tmp = new float[kWidth * kHeight];
|
||||
|
||||
float[] tmp = new float[kernel.getWidth() * kernel.getHeight()];
|
||||
for (int y = src.getMinY() + kernel.getYOrigin();
|
||||
y < src.getMinY() + src.getHeight() - kernel.getYOrigin() / 2; y++)
|
||||
{
|
||||
// Handle unfiltered edge pixels at start of line
|
||||
float[] t1 = new float[(kernel.getXOrigin() - 1) * src.getNumBands()];
|
||||
if (edge == EDGE_ZERO_FILL)
|
||||
Arrays.fill(t1, 0);
|
||||
else
|
||||
src.getPixels(src.getMinX(), y, kernel.getXOrigin() - 1, 1, t1);
|
||||
dest.setPixels(src.getMinX(), y, kernel.getXOrigin() - 1, 1, t1);
|
||||
|
||||
for (int x = src.getMinX(); x < src.getWidth() + src.getMinX(); x++)
|
||||
for (int x = 0; x < regionW; x++)
|
||||
{
|
||||
// FIXME: This needs a much more efficient implementation
|
||||
for (int b = 0; b < src.getNumBands(); b++)
|
||||
{
|
||||
float v = 0;
|
||||
src.getSamples(x, y, kernel.getWidth(), kernel.getHeight(), b, tmp);
|
||||
for (int i=0; i < tmp.length; i++)
|
||||
v += tmp[i] * kvals[i];
|
||||
dest.setSample(x, y, b, v);
|
||||
}
|
||||
for (int y = 0; y < regionH; y++)
|
||||
{
|
||||
// FIXME: This needs a much more efficient implementation
|
||||
for (int b = 0; b < src.getNumBands(); b++)
|
||||
{
|
||||
float v = 0;
|
||||
src.getSamples(x, y, kWidth, kHeight, b, tmp);
|
||||
for (int i = 0; i < tmp.length; i++)
|
||||
v += tmp[tmp.length - i - 1] * kvals[i];
|
||||
// FIXME: in the above line, I've had to reverse the order of
|
||||
// the samples array to make the tests pass. I haven't worked
|
||||
// out why this is necessary.
|
||||
dest.setSample(x + kernel.getXOrigin(), y + kernel.getYOrigin(),
|
||||
b, v);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Handle unfiltered edge pixels at end of line
|
||||
float[] t2 = new float[(kernel.getWidth() / 2) * src.getNumBands()];
|
||||
if (edge == EDGE_ZERO_FILL)
|
||||
Arrays.fill(t2, 0);
|
||||
else
|
||||
src.getPixels(src.getMinX() + src.getWidth()
|
||||
- (kernel.getWidth() / 2),
|
||||
y, kernel.getWidth() / 2, 1, t2);
|
||||
dest.setPixels(src.getMinX() + src.getWidth() - (kernel.getWidth() / 2),
|
||||
y, kernel.getWidth() / 2, 1, t2);
|
||||
}
|
||||
for (int y = src.getMinY(); y < src.getHeight() + src.getMinY(); y++)
|
||||
for (int x = src.getMinX(); x< src.getWidth() + src.getMinX(); x++)
|
||||
{
|
||||
|
||||
}
|
||||
for (int y = src.getMinY(); y < src.getHeight() + src.getMinY(); y++)
|
||||
for (int x = src.getMinX(); x< src.getWidth() + src.getMinX(); x++)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
// Handle top edge
|
||||
if (edge == EDGE_ZERO_FILL)
|
||||
{
|
||||
float[] zeros = new float[src.getNumBands() * src.getWidth() *
|
||||
(kernel.getHeight() / 2)];
|
||||
Arrays.fill(zeros, 0);
|
||||
dest.setPixels(src.getMinX(),
|
||||
src.getHeight() + src.getMinY() - (kernel.getHeight() / 2),
|
||||
src.getWidth(), kernel.getHeight() / 2, zeros);
|
||||
}
|
||||
else
|
||||
{
|
||||
float[] vals = new float[src.getNumBands() * src.getWidth() *
|
||||
(kernel.getHeight() / 2)];
|
||||
src.getPixels(src.getMinX(),
|
||||
src.getHeight() + src.getMinY()
|
||||
- (kernel.getHeight() / 2),
|
||||
src.getWidth(), kernel.getHeight() / 2, vals);
|
||||
dest.setPixels(src.getMinX(),
|
||||
src.getHeight() + src.getMinY()
|
||||
- (kernel.getHeight() / 2),
|
||||
src.getWidth(), kernel.getHeight() / 2, vals);
|
||||
}
|
||||
|
||||
return dest;
|
||||
// fill in the top border
|
||||
fillEdge(src, dest, 0, 0, src.width, top, edge);
|
||||
|
||||
// fill in the bottom border
|
||||
fillEdge(src, dest, 0, src.height - bottom, src.width, bottom, edge);
|
||||
|
||||
// fill in the left border
|
||||
fillEdge(src, dest, 0, top, left, regionH, edge);
|
||||
|
||||
// fill in the right border
|
||||
fillEdge(src, dest, src.width - right, top, right, regionH, edge);
|
||||
|
||||
return dest;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fills a range of pixels (typically at the edge of a raster) with either
|
||||
* zero values (if <code>edgeOp</code> is <code>EDGE_ZERO_FILL</code>) or the
|
||||
* corresponding pixel values from the source raster (if <code>edgeOp</code>
|
||||
* is <code>EDGE_NO_OP</code>). This utility method is called by the
|
||||
* {@link #fillEdge(Raster, WritableRaster, int, int, int, int, int)} method.
|
||||
*
|
||||
* @param src the source raster.
|
||||
* @param dest the destination raster.
|
||||
* @param x the x-coordinate of the top left pixel in the range.
|
||||
* @param y the y-coordinate of the top left pixel in the range.
|
||||
* @param w the width of the pixel range.
|
||||
* @param h the height of the pixel range.
|
||||
* @param edgeOp indicates how to determine the values for the range
|
||||
* (either {@link #EDGE_ZERO_FILL} or {@link #EDGE_NO_OP}).
|
||||
*/
|
||||
private void fillEdge(Raster src, WritableRaster dest, int x, int y, int w,
|
||||
int h, int edgeOp)
|
||||
{
|
||||
if (w <= 0)
|
||||
return;
|
||||
if (h <= 0)
|
||||
return;
|
||||
if (edgeOp == EDGE_ZERO_FILL) // fill region with zeroes
|
||||
{
|
||||
float[] zeros = new float[src.getNumBands() * w * h];
|
||||
dest.setPixels(x, y, w, h, zeros);
|
||||
}
|
||||
else // copy pixels from source
|
||||
{
|
||||
float[] pixels = new float[src.getNumBands() * w * h];
|
||||
src.getPixels(x, y, w, h, pixels);
|
||||
dest.setPixels(x, y, w, h, pixels);
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue