Integer imageChoice = new Integer(0);
final ImageReadParam readP = new ImageReadParam();
try {
imageChoice = setReadParams(overviewPolicy, readP,requestedEnvelope, dim);
} catch (TransformException e) {
new DataSourceException(e);
}
//
// IMAGE READ OPERATION
//
Hints newHints = null;
if(suggestedTileSize!=null){
newHints= (Hints) hints.clone();
final ImageLayout layout = new ImageLayout();
layout.setTileGridXOffset(0);
layout.setTileGridYOffset(0);
layout.setTileHeight(suggestedTileSize[1]);
layout.setTileWidth(suggestedTileSize[0]);
newHints.add(new RenderingHints(JAI.KEY_IMAGE_LAYOUT, layout));
}
final ParameterBlock pbjRead = new ParameterBlock();
if (extOvrImgChoice >= 0 && imageChoice >= extOvrImgChoice) {
pbjRead.add(ovrInStreamSPI.createInputStreamInstance(ovrSource, ImageIO.getUseCache(),ImageIO.getCacheDirectory()));
pbjRead.add(imageChoice - extOvrImgChoice);
} else {
pbjRead.add(inStreamSPI != null ? inStreamSPI.createInputStreamInstance(source, ImageIO.getUseCache(), ImageIO.getCacheDirectory()) : ImageIO.createImageInputStream(source));
pbjRead.add(imageChoice);
}
pbjRead.add(Boolean.FALSE);
pbjRead.add(Boolean.FALSE);
pbjRead.add(Boolean.FALSE);
pbjRead.add(null);
pbjRead.add(null);
pbjRead.add(readP);
pbjRead.add(READER_SPI.createReaderInstance());
RenderedOp coverageRaster=JAI.create("ImageRead", pbjRead,newHints!=null?(RenderingHints) newHints:null);
//
// MASKING INPUT COLOR as indicated
//
if(inputTransparentColor!=null){
coverageRaster= new ImageWorker(coverageRaster).setRenderingHints(newHints).makeColorTransparent(inputTransparentColor).getRenderedOperation();
}
//
// BUILDING COVERAGE
//
// I need to calculate a new transformation (raster2Model)
// between the cropped image and the required
// adjustedRequestEnvelope
final int ssWidth = coverageRaster.getWidth();
final int ssHeight = coverageRaster.getHeight();
if (LOGGER.isLoggable(Level.FINE)) {
LOGGER.log(Level.FINE, "Coverage read: width = " + ssWidth+ " height = " + ssHeight);
}
// //
//
// setting new coefficients to define a new affineTransformation
// to be applied to the grid to world transformation
// -----------------------------------------------------------------------------------
//
// With respect to the original envelope, the obtained planarImage
// needs to be rescaled. The scaling factors are computed as the
// ratio between the cropped source region sizes and the read
// image sizes.
//
// //
final double scaleX = originalGridRange.getSpan(0) / (1.0 * ssWidth);
final double scaleY = originalGridRange.getSpan(1) / (1.0 * ssHeight);
final AffineTransform tempRaster2Model = new AffineTransform((AffineTransform) raster2Model);
tempRaster2Model.concatenate(new AffineTransform(scaleX, 0, 0, scaleY, 0, 0));
try{
return createCoverage(coverageRaster, ProjectiveTransform.create((AffineTransform) tempRaster2Model));
}catch(Exception e){
// dispose and close file
ImageUtilities.disposePlanarImageChain(coverageRaster);
// rethrow
if(e instanceof DataSourceException){
throw (DataSourceException)e;
}
throw new DataSourceException(e);
}
}