|
|
|
svn_geotools
|
Author: groldan
Date: 2009-11-03 10:07:00 -0500 (Tue, 03 Nov 2009) New Revision: 34312 Modified: trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/ArcSDEGridCoverage2DReaderJAI.java trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/ArcSDEImageReader.java trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/DefaultTiledRasterReader.java trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/PromotingTileReader.java trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/RasterInputStream.java Log: GEOT-2616, intermediate commit with custom ImageReader implementation Modified: trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/ArcSDEGridCoverage2DReaderJAI.java =================================================================== --- trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/ArcSDEGridCoverage2DReaderJAI.java 2009-11-03 11:26:28 UTC (rev 34311) +++ trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/ArcSDEGridCoverage2DReaderJAI.java 2009-11-03 15:07:00 UTC (rev 34312) @@ -44,10 +44,8 @@ import javax.media.jai.InterpolationNearest; import javax.media.jai.JAI; import javax.media.jai.ParameterBlockJAI; -import javax.media.jai.PlanarImage; import javax.media.jai.operator.FormatDescriptor; import javax.media.jai.operator.MosaicDescriptor; -import javax.media.jai.operator.TranslateDescriptor; import org.geotools.coverage.CoverageFactoryFinder; import org.geotools.coverage.GridSampleDimension; @@ -411,8 +409,6 @@ .getResultDimensionInsideTiledImage()); log.log(image, query.getRasterId(), "02_crop"); - image = PlanarImage.wrapRenderedImage(image); - final Rectangle mosaicLocation = query.getMosaicLocation(); // scale Float scaleX = Float.valueOf((float) (mosaicLocation.getWidth() / image.getWidth())); @@ -432,7 +428,7 @@ if (queries.size() > 0) { try { LOGGER.info("Forcing loading data for mosaic as per GEOT-"); - //image.getData(); + // image.getData(); } catch (RuntimeException e) { throw new DataSourceException("Error fetching arcsde raster", e); } Modified: trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/ArcSDEImageReader.java =================================================================== --- trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/ArcSDEImageReader.java 2009-11-03 11:26:28 UTC (rev 34311) +++ trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/ArcSDEImageReader.java 2009-11-03 15:07:00 UTC (rev 34312) @@ -1,73 +1,189 @@ package org.geotools.arcsde.gce; +import java.awt.Point; import java.awt.image.BufferedImage; +import java.awt.image.ColorModel; +import java.awt.image.DataBuffer; +import java.awt.image.IndexColorModel; +import java.awt.image.Raster; +import java.awt.image.RenderedImage; +import java.awt.image.SampleModel; +import java.awt.image.WritableRaster; import java.io.IOException; +import java.util.Collections; import java.util.Iterator; import javax.imageio.ImageReadParam; +import javax.imageio.ImageReader; import javax.imageio.ImageTypeSpecifier; import javax.imageio.metadata.IIOMetadata; import javax.imageio.spi.ImageReaderSpi; +import javax.media.jai.PlanarImage; -import com.sun.media.imageioimpl.plugins.raw.RawImageReader; +import org.geotools.arcsde.gce.TileReader.TileInfo; -public class ArcSDEImageReader extends RawImageReader { +import com.sun.media.imageioimpl.common.SimpleRenderedImage; - protected ArcSDEImageReader(final ImageReaderSpi originatingProvider) { +public class ArcSDEImageReader extends ImageReader { + + private TileReader tileReader; + + private ImageTypeSpecifier typeSpec; + + protected ArcSDEImageReader(final ImageReaderSpi originatingProvider, + final ImageTypeSpecifier typeSpec) { super(originatingProvider); + this.typeSpec = typeSpec; } @Override + public int getWidth(int imageIndex) throws IOException { + int w = tileReader.getTilesWide() * tileReader.getTileWidth(); + return w; + } + + @Override public int getHeight(int imageIndex) throws IOException { - int height = super.getHeight(imageIndex); - return height; + int h = tileReader.getTilesHigh() * tileReader.getTileHeight(); + return h; } @Override public IIOMetadata getImageMetadata(int imageIndex) throws IOException { - IIOMetadata imageMetadata = super.getImageMetadata(imageIndex); - return imageMetadata; + return null; } @Override public Iterator<ImageTypeSpecifier> getImageTypes(int imageIndex) throws IOException { - Iterator imageTypes = super.getImageTypes(imageIndex); - return imageTypes; + return Collections.singleton(typeSpec).iterator(); } @Override public int getNumImages(boolean allowSearch) throws IOException { - int numImages = super.getNumImages(allowSearch); - return numImages; + return 1; } @Override public IIOMetadata getStreamMetadata() throws IOException { - IIOMetadata streamMetadata = super.getStreamMetadata(); - return streamMetadata; + return null; } @Override - public int getWidth(int imageIndex) throws IOException { - int width = super.getWidth(imageIndex); - return width; + public RenderedImage readAsRenderedImage(int imageIndex, ImageReadParam param) + throws IOException { + // return read(imageIndex, param); + + RenderedImage image = new ArcSDETiledRenderedImage(tileReader, typeSpec); + + // BufferedImage bufferedImage = PlanarImage.wrapRenderedImage(image).getAsBufferedImage(); + // return bufferedImage; + return image; } @Override public BufferedImage read(int imageIndex, ImageReadParam param) throws IOException { - BufferedImage read = super.read(imageIndex, param); - return read; + if (param == null) { + param = getDefaultReadParam(); + } + + RenderedImage rendered = readAsRenderedImage(imageIndex, param); + + BufferedImage bufferedImage = PlanarImage.wrapRenderedImage(rendered).getAsBufferedImage(); + + return bufferedImage; } @Override public void setInput(Object input, boolean seekForwardOnly, boolean ignoreMetadata) { - seekForwardOnly = true; - super.setInput(input, seekForwardOnly, ignoreMetadata); + this.tileReader = (TileReader) input; } - @Override - public boolean isSeekForwardOnly() { - boolean seekForwardOnly = super.isSeekForwardOnly(); - return seekForwardOnly ? seekForwardOnly : true; + @SuppressWarnings("unchecked") + private static class ArcSDETiledRenderedImage extends SimpleRenderedImage { + + private TileReader tileReader; + + public ArcSDETiledRenderedImage(TileReader tileReader, ImageTypeSpecifier typeSpec) { + System.err.println(tileReader); + this.tileReader = tileReader; + super.colorModel = typeSpec.getColorModel(); + super.sampleModel = typeSpec.getSampleModel(); + super.height = tileReader.getTilesHigh() * tileReader.getTileHeight(); + super.width = tileReader.getTilesWide() * tileReader.getTileWidth(); + super.minX = 0; + super.minY = 0; + super.tileGridXOffset = 0; + super.tileGridYOffset = 0; + super.tileHeight = tileReader.getTileHeight(); + super.tileWidth = tileReader.getTileWidth(); + } + + private WritableRaster[][] tileCache = null; + + /** + * @see java.awt.image.RenderedImage#getTile(int, int) + */ + public Raster getTile(final int tileX, final int tileY) { + //System.err.printf("getTile(%d, %d)\n", tileX, tileY); + if (tileCache == null) { + tileCache = new WritableRaster[tileReader.getTilesWide()][tileReader.getTilesHigh()]; + } + + WritableRaster currentTile = tileCache[tileX][tileY]; + if (currentTile == null) { + final int tilesWide = tileReader.getTilesWide(); + final int tilesHigh = tileReader.getTilesHigh(); + + for (int ty = 0; ty < tilesHigh; ty++) { + for (int tx = 0; tx < tilesWide; tx++) { + + currentTile = tileCache[tx][ty]; + + if (currentTile == null) { + int x = tileXToX(tx); + int y = tileYToY(ty); + //System.err.println("fetching tile " + tx + "," + ty); + currentTile = fetchTile(x, y); + tileCache[tx][ty] = currentTile; + } + if (tx == tileX && ty == tileY) { + return currentTile; + } + } + } + } + //currentTile = tileCache[tileX][tileY]; + return currentTile; + } + + private WritableRaster fetchTile(final int xOrigin, final int yOrigin) { + final int numBands = sampleModel.getNumBands(); + + final SampleModel tileSampleModel = super.sampleModel.createCompatibleSampleModel( + tileWidth, tileHeight); + + DataBuffer dataBuffer = sampleModel.createDataBuffer(); + for (int bandN = 0; bandN < numBands; bandN++) { + TileInfo tileInfo; + try { + tileInfo = tileReader.next(); + } catch (IOException e) { + throw new RuntimeException(e); + } + + byte[] rawBandData = tileInfo.getTileData(); + + final int numPixels = tileWidth * tileHeight; + for (int pixelN = 0; pixelN < numPixels; pixelN++) { + int val = rawBandData[2 * pixelN + 1] & 0xFF; + dataBuffer.setElem(bandN, pixelN, val); + } + } + + WritableRaster currentTile; + currentTile = Raster.createWritableRaster(tileSampleModel, dataBuffer, new Point(xOrigin, yOrigin)); + return currentTile; + } + } } Modified: trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/DefaultTiledRasterReader.java =================================================================== --- trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/DefaultTiledRasterReader.java 2009-11-03 11:26:28 UTC (rev 34311) +++ trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/DefaultTiledRasterReader.java 2009-11-03 15:07:00 UTC (rev 34312) @@ -38,8 +38,6 @@ import org.geotools.util.logging.Logging; import com.esri.sde.sdk.client.SeQuery; -import com.sun.media.imageio.stream.RawImageInputStream; -import com.sun.media.imageioimpl.plugins.raw.RawImageReaderSpi; /** * The default implementation for {@link TiledRasterReader}. @@ -163,13 +161,13 @@ final Dimension[] imageDimensions = new Dimension[] { tiledImageSize }; final ImageTypeSpecifier its = new ImageTypeSpecifier(colorModel, sampleModel); +// +// final ImageInputStream tiledImageInputStream; +// tiledImageInputStream = new ArcSDETiledImageInputStream(tileReader); +// raw = new RawImageInputStream(tiledImageInputStream, its, imageOffsets, imageDimensions); +// ImageReaderSpi imageIOSPI = new RawImageReaderSpi(); +// readerInstance = imageIOSPI.createReaderInstance(); - final ImageInputStream tiledImageInputStream; - tiledImageInputStream = new ArcSDETiledImageInputStream(tileReader); - raw = new RawImageInputStream(tiledImageInputStream, its, imageOffsets, imageDimensions); - ImageReaderSpi imageIOSPI = new RawImageReaderSpi(); - readerInstance = imageIOSPI.createReaderInstance(); - // final InputStream is = new RasterInputStream(tileReader); // final ImageInputStream tiledImageInputStream; // tiledImageInputStream = ImageIO.createImageInputStream(is); @@ -178,40 +176,49 @@ // imageDimensions); // ImageReaderSpi imageIOSPI = new RawImageReaderSpi(); // readerInstance = imageIOSPI.createReaderInstance(); + + + ArcSDEImageReader reader = new ArcSDEImageReader((ImageReaderSpi)null, its); + reader.setInput(tileReader, true, true); + + RenderedImage image = reader.readAsRenderedImage(0, null); + //image.getData(); + return image; } // First operator: read the image - final RenderingHints hints = new RenderingHints(JAI.KEY_IMAGE_LAYOUT, imageLayout); - - ParameterBlock pb = new ParameterBlock(); - pb.add(raw);// Input - /* - * image index, always 0 since we're already fetching the required pyramid level - */ - pb.add(Integer.valueOf(0)); // Image index - pb.add(Boolean.FALSE); // Read metadata - pb.add(Boolean.FALSE);// Read thumbnails - pb.add(Boolean.FALSE);// Verify input - pb.add(null);// Listeners - pb.add(null);// Locale - final ImageReadParam rParam = new ImageReadParam(); - pb.add(rParam);// ReadParam - pb.add(readerInstance);// Reader - - RenderedImage image = JAI.create("ImageRead", pb, hints); - - // // translate - // int minX = (matchingTiles.x * tileWidth); - // int minY = (matchingTiles.y * tileHeight); - // pb = new ParameterBlock(); - // pb.addSource(image); - // pb.add(Float.valueOf(minX)); - // pb.add(Float.valueOf(minY)); - // pb.add(null); - // - // image = JAI.create("translate", pb); - - return image; +// final RenderingHints hints = new RenderingHints(JAI.KEY_IMAGE_LAYOUT, imageLayout); +// +// ParameterBlock pb = new ParameterBlock(); +// pb.add(raw);// Input +// /* +// * image index, always 0 since we're already fetching the required pyramid level +// */ +// pb.add(Integer.valueOf(0)); // Image index +// pb.add(Boolean.FALSE); // Read metadata +// pb.add(Boolean.FALSE);// Read thumbnails +// pb.add(Boolean.FALSE);// Verify input +// pb.add(null);// Listeners +// pb.add(null);// Locale +// final ImageReadParam rParam = new ImageReadParam(); +// pb.add(rParam);// ReadParam +// pb.add(readerInstance);// Reader +// +// RenderedImage image = JAI.create("ImageRead", pb, hints); +// // image.getData(); +// // // translate +// // int minX = (matchingTiles.x * tileWidth); +// // int minY = (matchingTiles.y * tileHeight); +// // pb = new ParameterBlock(); +// // pb.addSource(image); +// // pb.add(Float.valueOf(minX)); +// // pb.add(Float.valueOf(minY)); +// // pb.add(null); +// // +// // image = JAI.create("translate", pb); +// +// return image; + } } Modified: trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/PromotingTileReader.java =================================================================== --- trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/PromotingTileReader.java 2009-11-03 11:26:28 UTC (rev 34311) +++ trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/PromotingTileReader.java 2009-11-03 15:07:00 UTC (rev 34312) @@ -29,6 +29,8 @@ import org.geotools.util.logging.Logging; +import com.esri.sde.sdk.client.SeRasterTile; + /** * A {@link TileReader} decorator * Modified: trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/RasterInputStream.java =================================================================== --- trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/RasterInputStream.java 2009-11-03 11:26:28 UTC (rev 34311) +++ trunk/modules/plugin/arcsde/datastore/src/main/java/org/geotools/arcsde/gce/RasterInputStream.java 2009-11-03 15:07:00 UTC (rev 34312) @@ -17,6 +17,8 @@ */ package org.geotools.arcsde.gce; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; @@ -47,7 +49,10 @@ private final int length; private long streamPos; - + + ByteArrayInputStream in; + byte[] buf; + public RasterInputStream(final TileReader tileReader) { super(); this.tileReader = tileReader; @@ -62,35 +67,56 @@ final int numberOfBands = tileReader.getNumberOfBands(); length = bytesPerTile * tilesWide * tilesHigh * numberOfBands; + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + try { + while (tileReader.hasNext()) { + TileInfo next = tileReader.next(); + out.write(next.getTileData()); + } + out.flush(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + buf = out.toByteArray(); + this.in = new ByteArrayInputStream(buf); + + if (length != buf.length) { + throw new IllegalStateException(length + " != " + buf.length); + } } @Override public int read() throws IOException { - final byte[] data = getTileData(); - if (data == null) { - return -1; - } - byte b = data[currTileDataIndex]; - ++currTileDataIndex; - return b; + return in.read(); + // final byte[] data = getTileData(); + // if (data == null) { + // return -1; + // } + // byte b = data[currTileDataIndex]; + // ++currTileDataIndex; + // return b; } @Override public int read(byte[] buff, int off, int len) throws IOException { - //System.err.println("read " + len + ", pos = " + streamPos + ", length = " + length); - final byte[] data = getTileData(); - if (data == null) { - return -1; - } - final int available = data.length - currTileDataIndex; - final int count = Math.min(available, len); - System.arraycopy(data, currTileDataIndex, buff, off, count); - currTileDataIndex += count; - streamPos += count; - if(streamPos == length){ - close(); - } - return count; + return in.read(buff, off, len); + // // System.err.println("read " + len + ", pos = " + streamPos + ", length = " + length); + // final byte[] data = getTileData(); + // if (data == null) { + // return -1; + // } + // final int available = data.length - currTileDataIndex; + // final int count = Math.min(available, len); + // System.arraycopy(data, currTileDataIndex, buff, off, count); + // currTileDataIndex += count; + // streamPos += count; + // if (streamPos == length) { + // close(); + // } + // return count; } /** @@ -125,21 +151,25 @@ @Override public int available() throws IOException { - return tileDataLength - currTileDataIndex; + return in.available(); + // return tileDataLength - currTileDataIndex; } @Override public synchronized void mark(int readlimit) { - System.err.println("mark at " + readlimit); + in.mark(readlimit); + // System.err.println("mark at " + readlimit); } @Override public boolean markSupported() { - return false; + return in.markSupported(); + // return false; } @Override public long skip(long n) throws IOException { - return super.skip(n); + return in.skip(n); + // return super.skip(n); } } \ No newline at end of file ------------------------------------------------------------------------------ Come build with us! The BlackBerry(R) Developer Conference in SF, CA is the only developer event you need to attend this year. Jumpstart your developing skills, take BlackBerry mobile applications to market and stay ahead of the curve. Join us from November 9 - 12, 2009. Register now! http://p.sf.net/sfu/devconference _______________________________________________ GeoTools-commits mailing list [hidden email] https://lists.sourceforge.net/lists/listinfo/geotools-commits |
||||||||||||||||
| Free Embeddable Forum Powered by Nabble | Help |