/* * Geotoolkit.org - An Open Source Java GIS Toolkit * http://www.geotoolkit.org * * (C) 2012, Geomatys * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotoolkit.image.iterator; import java.awt.Point; import java.awt.Rectangle; import java.awt.image.*; import javax.media.jai.RasterFactory; import javax.media.jai.TiledImage; import org.junit.Assert; import static org.junit.Assert.assertTrue; import org.junit.Test; /** * Writing-only tests from any PixelIterator. * * @author Rémi Maréchal (Geomatys). */ public abstract class WritableIteratorTest extends IteratorTest{ /** * Fill expect iteration table relative to {@link #renderedImage} attributes. * * @param minx {@link #renderedImage} X coordinate from upper left corner. * @param miny {@link #renderedImage} Y coordinate from upper left corner. * @param width {@link #renderedImage} width. * @param height {@link #renderedImage} height. * @param tilesWidth {@link #renderedImage} tiles width. * @param tilesHeight {@link #renderedImage} tiles height. * @param numBand {@link #renderedImage} band number. * @param subArea {@code Rectangle} which represent {@link #renderedImage} sub area iteration. */ protected abstract void fillGoodTabRef(int minx, int miny, int width, int height, int tilesWidth, int tilesHeight, int numBand, Rectangle areaIterate); /** * Return "writable" {@code PixelIterator} adapted for {@code RenderedImage}. * * @param renderedImage {@code RenderedImage} which is followed by read only iterator. * @param writableRenderedImage {@code RenderedImage} which is followed by write only iterator. * @see #unappropriateRenderedImageTest(). * @return "writable" {@code PixelIterator}. */ protected abstract PixelIterator getWritableRIIterator(RenderedImage renderedImage, WritableRenderedImage writableRenderedImage); /** * Return "writable" {@code PixelIterator} adapted for {@code RenderedImage} and {@code Rectangle}. * * @param renderedImage {@code RenderedImage} which is followed by read only iterator. * @param writableRenderedImage {@code RenderedImage} which is followed by write only iterator. * @param subArea {@code Rectangle} which define iteration area. * @see #unappropriateRenderedImageTest(). * @return "writable" {@code PixelIterator}. */ protected abstract PixelIterator getWritableRIIterator(RenderedImage renderedImage, WritableRenderedImage writableRenderedImage, Rectangle subArea); /** * Affect an appropriate {@code PixelIterator} on {@link #pixIterator} attribute, relative to expected test. * * @param renderedImage {@code RenderedImage} which will be followed by {@link #pixIterator}. * @param subArea {@code Rectangle} which represent {@link #renderedImage} sub area iteration. */ protected abstract void setPixelIterator(final RenderedImage renderedImage, WritableRenderedImage writableRI, final Rectangle subArea); public WritableIteratorTest() { } /** * Test if iterator transverse expected value in define area. * Area is defined on upper left raster corner. */ @Test public void rectUpperLeftWriteTest() { final Rectangle rect = new Rectangle(-10, -20, 40, 30); minx = -2; miny = 4; width = 100; height = 50; tilesWidth = 10; tilesHeight = 5; numBand = 3; setRenderedImgTest(minx, miny, width, height, tilesWidth, tilesHeight, numBand, null); setPixelIterator(renderedImage, rect); while (pixIterator.next()) pixIterator.setSample(-1); fillGoodTabRef(minx, miny, width, height, tilesWidth, tilesHeight, numBand, rect); setPixelIterator(renderedImage); int comp = 0; while (pixIterator.next()) { setTabTestValue(comp++, pixIterator.getSampleDouble()); } assertTrue(compareTab()); } /** * Test if iterator transverse expected value in define area. * Area is defined on upper right raster corner. */ @Test public void rectUpperRightWriteTest() { final Rectangle rect = new Rectangle(80, -20, 30, 50); minx = -7; miny = 2; width = 100; height = 50; tilesWidth = 10; tilesHeight = 5; numBand = 3; setRenderedImgTest(minx, miny, width, height, tilesWidth, tilesHeight, numBand, null); setPixelIterator(renderedImage, rect); while (pixIterator.next()) pixIterator.setSample(-1); fillGoodTabRef(minx, miny, width, height, tilesWidth, tilesHeight, numBand, rect); setPixelIterator(renderedImage); int comp = 0; while (pixIterator.next()) { setTabTestValue(comp++, pixIterator.getSampleDouble()); } assertTrue(compareTab()); } /** * Test if iterator transverse expected value in define area. * Area is defined on lower right raster corner. */ @Test public void rectLowerRightWriteTest() { final Rectangle rect = new Rectangle(80, 30, 50, 50); minx = 3; miny = -7; width = 100; height = 50; tilesWidth = 10; tilesHeight = 5; numBand = 3; setRenderedImgTest(minx, miny, width, height, tilesWidth, tilesHeight, numBand, null); setPixelIterator(renderedImage, rect); while (pixIterator.next()) pixIterator.setSample(-1); fillGoodTabRef(minx, miny, width, height, tilesWidth, tilesHeight, numBand, rect); setPixelIterator(renderedImage); int comp = 0; while (pixIterator.next()) { setTabTestValue(comp++, pixIterator.getSampleDouble()); } assertTrue(compareTab()); } /** * Test if iterator transverse expected value in define area. * Area is defined on lower left raster corner. */ @Test public void rectLowerLeftWriteTest() { final Rectangle rect = new Rectangle(-20, 30, 50, 50); minx = 0; miny = 0; width = 100; height = 50; tilesWidth = 10; tilesHeight = 5; numBand = 3; setRenderedImgTest(minx, miny, width, height, tilesWidth, tilesHeight, numBand, null); setPixelIterator(renderedImage, rect); while (pixIterator.next()) pixIterator.setSample(-1); fillGoodTabRef(minx, miny, width, height, tilesWidth, tilesHeight, numBand, rect); setPixelIterator(renderedImage); int comp = 0; while (pixIterator.next()) { setTabTestValue(comp++, pixIterator.getSampleDouble()); } assertTrue(compareTab()); } /** * Test if iterator transverse expected value in define area. * Area is within image area. */ @Test public void imageContainsRectWriteTest() { final Rectangle rect = new Rectangle(20, 10, 70, 30); minx = -5; miny = 7; width = 100; height = 50; tilesWidth = 10; tilesHeight = 5; numBand = 3; setRenderedImgTest(minx, miny, width, height, tilesWidth, tilesHeight, numBand, null); setPixelIterator(renderedImage, rect); while (pixIterator.next()) pixIterator.setSample(-1); fillGoodTabRef(minx, miny, width, height, tilesWidth, tilesHeight, numBand, rect); setPixelIterator(renderedImage); int comp = 0; while (pixIterator.next()) { setTabTestValue(comp++, pixIterator.getSampleDouble()); } assertTrue(compareTab()); } /** * Test if iterator transverse expected value in define area. * Area contains all image area. */ @Test public void rectContainsImageWriteTest() { final Rectangle rect = new Rectangle(-10, -10, 150, 80); minx = 0; miny = 0; width = 100; height = 50; tilesWidth = 10; tilesHeight = 5; numBand = 3; setRenderedImgTest(minx, miny, width, height, tilesWidth, tilesHeight, numBand, null); setPixelIterator(renderedImage, rect); while (pixIterator.next()) pixIterator.setSample(-1); fillGoodTabRef(minx, miny, width, height, tilesWidth, tilesHeight, numBand, rect); setPixelIterator(renderedImage); int comp = 0; while (pixIterator.next()) { setTabTestValue(comp++, pixIterator.getSampleDouble()); } assertTrue(compareTab()); } /** * Test if iterator transverse expected value in define area. * Area contains all image area. */ @Test public void rectEqualImageWriteWithinReadImageTest() { final Rectangle rect = new Rectangle(10, 10, 5, 2); minx = 0; miny = 0; width = 100; height = 50; tilesWidth = 10; tilesHeight = 5; numBand = 3; setRenderedImgTest(minx, miny, width, height, tilesWidth, tilesHeight, numBand, null); final SampleModel sampleMW = new PixelInterleavedSampleModel(getDataBufferType(), tilesWidth, tilesHeight, numBand, tilesWidth*numBand, new int[]{0, 1, 2}); final WritableRenderedImage rendWriteImage = new TiledImage(rect.x, rect.y, rect.width, rect.height, renderedImage.getTileGridXOffset(), renderedImage.getTileGridYOffset(), sampleMW, null); setPixelIterator(renderedImage, rendWriteImage, rect); while (pixIterator.next()) pixIterator.setSample(1); setPixelIterator(rendWriteImage); while (pixIterator.next()) assertTrue(pixIterator.getSampleDouble() == 1); } /** * Test catching exception if rendered images haven't got same criterion. */ @Test public void unappropriateRenderedImageTest() { final int dataType = getDataBufferType(); final BandedSampleModel sampleMR = new BandedSampleModel(dataType, 100, 50, 3); final RenderedImage rendReadImage = new TiledImage(0, 0, 1000, 500, 0, 0, sampleMR, null); BandedSampleModel sampleMW = new BandedSampleModel(dataType, 100, 50, 3); WritableRenderedImage rendWriteImage = new TiledImage(0, 0, 100, 500, 15, 25, sampleMW, null); //test : different image dimension. try { getWritableRIIterator(rendReadImage, rendWriteImage); Assert.fail("test should had failed"); } catch(IllegalArgumentException e) { //ok } //test : different tiles dimension. sampleMW = new BandedSampleModel(dataType, 10, 5, 3); rendWriteImage = new TiledImage(0, 0, 1000, 500, 0, 0, sampleMW, null); try { getWritableRIIterator(rendReadImage, rendWriteImage); Assert.fail("test should had failed"); } catch(IllegalArgumentException e) { //ok } //test : different datas type. final int dataTypeTest = (dataType == DataBuffer.TYPE_INT) ? DataBuffer.TYPE_BYTE : DataBuffer.TYPE_INT; sampleMW = new BandedSampleModel(dataTypeTest, 100, 50, 3); rendWriteImage = new TiledImage(0, 0, 1000, 500, 0, 0, sampleMW, null); try { getWritableRIIterator(rendReadImage, rendWriteImage); Assert.fail("test should had failed"); } catch(IllegalArgumentException e) { //ok } //out of rectangle final Rectangle subArea = new Rectangle(10, 10, 200, 100); sampleMW = new BandedSampleModel(dataType, 100, 50, 3); rendWriteImage = new TiledImage(0, 0, 200, 100, 0, 0, sampleMW, null); try { getWritableRIIterator(rendReadImage, rendWriteImage, subArea); Assert.fail("test should had failed"); } catch(IllegalArgumentException e) { //ok } //bad tiles size sampleMW = new BandedSampleModel(dataType, 10, 50, 3); rendWriteImage = new TiledImage(10, 10, 200, 100, 0, 0, sampleMW, null); try { getWritableRIIterator(rendReadImage, rendWriteImage, subArea); Assert.fail("test should had failed"); } catch(IllegalArgumentException e) { //ok } //bad tilesgridOffset sampleMW = new BandedSampleModel(dataType, 100, 50, 3); rendWriteImage = new TiledImage(10, 10, 200, 100, 1, 2, sampleMW, null); try { getWritableRIIterator(rendReadImage, rendWriteImage, subArea); Assert.fail("test should had failed"); } catch(IllegalArgumentException e) { //ok } } }