/* JAI-Ext - OpenSource Java Advanced Image Extensions Library
* http://www.geo-solutions.it/
* Copyright 2014 GeoSolutions
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package it.geosolutions.jaiext.affine;
import static org.junit.Assert.*;
import it.geosolutions.jaiext.affine.AffineDescriptor;
import it.geosolutions.jaiext.affine.AffinePropertyGenerator;
import it.geosolutions.jaiext.interpolators.InterpolationNearest;
import it.geosolutions.jaiext.range.Range;
import java.awt.Rectangle;
import java.awt.geom.AffineTransform;
import java.awt.image.DataBuffer;
import java.awt.image.RenderedImage;
import javax.media.jai.PlanarImage;
import javax.media.jai.ROI;
import javax.media.jai.ROIShape;
import javax.media.jai.RenderedOp;
import javax.media.jai.operator.NullDescriptor;
import org.junit.Test;
/**
* This test-class extends the TestAffine class and is used for extending the code-coverage of the project. In this test-class
* are checked the getProperty() method of the AffineDescriptor class and the capability of the AffineCRIF.create()
* method to call the TranslateIntOpImage class or the CopyOpImage class when the requested operation is simply a translation
* or a copy of the source image without ROI object.
*/
public class CoverageClassTest extends TestAffine {
// this test-case is used for testing the getProperty() method of the AffineDescriptor class
@Test
public void testROIProperty() {
AffineDescriptor descriptor = new AffineDescriptor();
AffinePropertyGenerator propertyGenerator = (AffinePropertyGenerator) descriptor
.getPropertyGenerators()[0];
boolean useROIAccessor = false;
boolean setDestinationNoData = false;
int dataType = DataBuffer.TYPE_BYTE;
Range noDataRange = null;
// Interpolator initialization
// Nearest-Neighbor
InterpolationNearest interpNear = new InterpolationNearest(noDataRange,
useROIAccessor, destinationNoData, dataType);
// ROI creation
ROI roi = roiCreation();
byte imageValue = 127;
// Test image creation
RenderedImage testImg = createTestImage(dataType, DEFAULT_WIDTH,
DEFAULT_HEIGHT, imageValue, false);
RenderedOp testIMG = NullDescriptor.create(testImg, null);
// Transformation
// Rotation
AffineTransform transform = AffineTransform.getQuadrantRotateInstance(numquadrants, anchorX, anchorY);
// + Scale (X and Y doubled)
transform.concatenate(AffineTransform.getScaleInstance(scaleX, scaleY));
// + Translation (translation towards the center of the image)
transform.concatenate(AffineTransform.getTranslateInstance(transX, transY));
// Affine transformated images
RenderedOp affineImgNear = AffineDescriptor.create(testIMG, transform, interpNear, null, roi, useROIAccessor, setDestinationNoData, null, null);
affineImgNear.getTile(0, 0);
// Affine operation on ROI
ROI roiNear = (ROI) propertyGenerator.getProperty("roi", affineImgNear);
//roiNear Bounds
Rectangle roiNearBounds = roiNear.getBounds();
double actualWidth = roiNearBounds.getWidth();
double actualHeight = roiNearBounds.getHeight();
double actualminX = roiNearBounds.getMinX();
double actualminY = roiNearBounds.getMinY();
Rectangle srcBounds = new Rectangle(testIMG.getMinX() + interpNear.getLeftPadding(),
testIMG.getMinY() + interpNear.getTopPadding(),
testIMG.getWidth() - interpNear.getWidth() + 1,
testIMG.getHeight() - interpNear.getHeight() + 1);
// If necessary, clip the ROI to the effective source bounds.
if (!srcBounds.contains(roi.getBounds())) {
roi = roi.intersect(new ROIShape(srcBounds));
}
// Create the transformed ROI.
ROI dstROI = roi.transform(transform);
// Retrieve the destination bounds.
Rectangle dstBounds = affineImgNear.getBounds();
// If necessary, clip the transformed ROI to the
// destination bounds.
if (!dstBounds.contains(dstROI.getBounds())) {
dstROI = dstROI.intersect(new ROIShape(dstBounds));
}
//dstROI Bounds
Rectangle dstROIBounds = dstROI.getBounds();
double expectedWidth = dstROIBounds.getWidth();
double expectedHeight = dstROIBounds.getHeight();
double expectedminX = dstROIBounds.getMinX();
double expectedminY = dstROIBounds.getMinY();
//Comparison
double tolerance = 0.1f;
assertEquals(expectedWidth,actualWidth,tolerance);
assertEquals(expectedHeight,actualHeight,tolerance);
assertEquals(expectedminX,actualminX,tolerance);
assertEquals(expectedminY,actualminY,tolerance);
//Final Image disposal
if(affineImgNear instanceof RenderedOp){
((RenderedOp)affineImgNear).dispose();
}
}
@Test
public void testTranslation() {
boolean useROIAccessor = false;
boolean setDestinationNoData = false;
Range noDataRange = null;
int dataType = DataBuffer.TYPE_BYTE;
byte imageValue = 127;
// Nearest-Neighbor
InterpolationNearest interpNear = new InterpolationNearest(noDataRange,
useROIAccessor, destinationNoData, dataType);
RenderedImage testIMG = createTestImage(dataType, DEFAULT_WIDTH, DEFAULT_HEIGHT, imageValue,
false);
// Transformation
// Translation (translation towards the center of the image)
AffineTransform transform = AffineTransform.getTranslateInstance(transX, transY);
// Affine transformated images
PlanarImage affineImgNear = AffineDescriptor.create(testIMG, transform, interpNear, null, null, useROIAccessor, setDestinationNoData, null, null);
affineImgNear.getTiles();
double actualX=affineImgNear.getMinX();
double actualY=affineImgNear.getMinY();
double expectedX=testIMG.getMinX()+ transX;
double expectedY=testIMG.getMinY()+ transY;
double tolerance = 0.1f;
assertEquals(expectedX, actualX,tolerance);
assertEquals(expectedY, actualY,tolerance);
double actualWidth=affineImgNear.getWidth();
double actualHeight=affineImgNear.getHeight();
double expectedWidth=testIMG.getWidth();
double expectedHeigh=testIMG.getHeight();
assertEquals(expectedWidth, actualWidth,tolerance);
assertEquals(expectedHeigh, actualHeight,tolerance);
//Final Image disposal
if(affineImgNear instanceof RenderedOp){
((RenderedOp)affineImgNear).dispose();
}
}
@Test
public void testCopy() {
boolean useROIAccessor = false;
boolean setDestinationNoData = false;
Range noDataRange = null;
int dataType = DataBuffer.TYPE_BYTE;
byte imageValue = 127;
// Nearest-Neighbor
InterpolationNearest interpNear = new InterpolationNearest(noDataRange,
useROIAccessor, destinationNoData, dataType);
RenderedImage testIMG = createTestImage(dataType, DEFAULT_WIDTH, DEFAULT_HEIGHT, imageValue,
false);
// Transformation
// Translation (translation towards the center of the image)
AffineTransform transform = new AffineTransform();
// Affine transformated images
PlanarImage affineImgNear = AffineDescriptor.create(testIMG, transform, interpNear, null, null, useROIAccessor, setDestinationNoData, null, null);
affineImgNear.getTiles();
double actualX=affineImgNear.getMinX();
double actualY=affineImgNear.getMinY();
double expectedX=testIMG.getMinX();
double expectedY=testIMG.getMinY();
double tolerance = 0.1f;
assertEquals(expectedX, actualX,tolerance);
assertEquals(expectedY, actualY,tolerance);
double actualWidth=affineImgNear.getWidth();
double actualHeight=affineImgNear.getHeight();
double expectedWidth=testIMG.getWidth();
double expectedHeigh=testIMG.getHeight();
assertEquals(expectedWidth, actualWidth,tolerance);
assertEquals(expectedHeigh, actualHeight,tolerance);
//Final Image disposal
if(affineImgNear instanceof RenderedOp){
((RenderedOp)affineImgNear).dispose();
}
}
}