Skip to content

Commit

Permalink
Merge pull request #5 from JoopAue/imageraster-cyclic
Browse files Browse the repository at this point in the history
Imageraster cyclic
  • Loading branch information
JoopAue committed Apr 3, 2016
2 parents 0dfeaa5 + c17a08a commit bab8705
Show file tree
Hide file tree
Showing 10 changed files with 135 additions and 71 deletions.
3 changes: 2 additions & 1 deletion common.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,9 @@ configurations {
dependencies {
// Adding dependencies here will add the dependencies to each subproject.
testCompile group: 'junit', name: 'junit', version: '4.12'
testCompile group: 'org.mockito', name: 'mockito-core', version: '2.0.28-beta'
testCompile group: 'org.easytesting', name: 'fest-assert-core', version: '2.0M10'
testCompile group: 'org.mockito', name: 'mockito-core', version: '2.0.28-beta'
compile 'org.apache.commons:commons-lang3:3.0'
deployerJars "org.apache.maven.wagon:wagon-ssh:2.9"
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,9 @@

public class DefaultImageRaster extends ImageRaster {


protected final int[] components = new int[4];
private ByteBuffer buffer;

protected final Image image;

protected final ImageCodec codec;
private final int width;
private final int height;
Expand All @@ -61,7 +58,39 @@ protected void rangeCheck(int x, int y) {
+ x + ", " + y + " in:" + width + ", " + height);
}
}


/**
* Create new image reader / writer.
*
* @param image The image to read / write to.
* @param slice Which slice to use. Only applies to 3D images, 2D image
* arrays or cubemaps.
* @param mipMapLevel The mipmap level to read / write to. To access levels
* other than 0, the image must have
* {@link Image#setMipMapSizes(int[]) mipmap sizes} set.
* @param convertToLinear If true, the application expects read or written
* colors to be in linear color space (<code>ImageRaster</code> will
* automatically perform a conversion as needed). If false, the application expects
* colors to be in the image's native {@link Image#getColorSpace() color space}.
* @return An ImageRaster to read / write to the image.
*/
public static DefaultImageRaster create(Image image, int slice, int mipMapLevel, boolean convertToLinear) {
return new DefaultImageRaster(image, slice, mipMapLevel, convertToLinear);
}

/**
* Create new image reader / writer for 2D images.
*
* @param image The image to read / write to.
* @return An ImageRaster to read / write to the image.
*/
public static DefaultImageRaster create(Image image) {
if (image.getData().size() > 1) {
throw new IllegalStateException("Use constructor that takes slices argument to read from multislice image");
}
return new DefaultImageRaster(image, 0, 0, false);
}

public DefaultImageRaster(Image image, int slice, int mipMapLevel, boolean convertToLinear) {
int[] mipMapSizes = image.getMipMapSizes();
int availableMips = mipMapSizes != null ? mipMapSizes.length : 1;
Expand Down Expand Up @@ -170,7 +199,6 @@ public ColorRGBA getPixel(int x, int y, ColorRGBA store) {
return store;
}


protected void setSRGB(ColorRGBA store) {
if (convertToLinear) {
// Input image is sRGB, need to convert to linear.
Expand Down
45 changes: 0 additions & 45 deletions jme3-core/src/main/java/com/jme3/texture/image/ImageRaster.java
Original file line number Diff line number Diff line change
Expand Up @@ -66,51 +66,6 @@
*/
public abstract class ImageRaster {



/**
* Create new image reader / writer.
*
* @param image The image to read / write to.
* @param slice Which slice to use. Only applies to 3D images, 2D image
* arrays or cubemaps.
* @param mipMapLevel The mipmap level to read / write to. To access levels
* other than 0, the image must have
* {@link Image#setMipMapSizes(int[]) mipmap sizes} set.
* @param convertToLinear If true, the application expects read or written
* colors to be in linear color space (<code>ImageRaster</code> will
* automatically perform a conversion as needed). If false, the application expects
* colors to be in the image's native {@link Image#getColorSpace() color space}.
* @return An ImageRaster to read / write to the image.
*/
public static ImageRaster create(Image image, int slice, int mipMapLevel, boolean convertToLinear) {
return new DefaultImageRaster(image, slice, mipMapLevel, convertToLinear);
}

/**
* Create new image reader / writer.
*
* @param image The image to read / write to.
* @param slice Which slice to use. Only applies to 3D images, 2D image
* arrays or cubemaps.
* @return An ImageRaster to read / write to the image.
*/
public static ImageRaster create(Image image, int slice) {
return create(image, slice, 0, false);
}

/**
* Create new image reader / writer for 2D images.
*
* @param image The image to read / write to.
* @return An ImageRaster to read / write to the image.
*/
public static ImageRaster create(Image image) {
if (image.getData().size() > 1) {
throw new IllegalStateException("Use constructor that takes slices argument to read from multislice image");
}
return create(image, 0, 0, false);
}

public ImageRaster() {
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,9 @@

public class MipMapImageRaster extends ImageRaster {


protected final int[] components = new int[4];
private ByteBuffer buffer;

protected final Image image;

protected final ImageCodec codec;
private int width[];
private int height[];
Expand All @@ -53,7 +50,6 @@ public class MipMapImageRaster extends ImageRaster {
private int mipLevel;
private int[] offsets;


protected void rangeCheck(int x, int y) {
if (x < 0 || y < 0 || x >= width[mipLevel] || y >= height[mipLevel]) {
throw new IllegalArgumentException("x and y must be inside the image dimensions");
Expand Down Expand Up @@ -110,12 +106,10 @@ public void setPixel(int x, int y, ColorRGBA color) {
setImageUpdateNeeded(image);
}


protected void writeComponents(int x, int y) {
codec.writeComponents(getBuffer(), x, y, width[mipLevel], offsets[mipLevel], components, temp);
}


protected void readComponents(int x, int y) {
codec.readComponents(getBuffer(), x, y, width[mipLevel], offsets[mipLevel], components, temp);
}
Expand Down
7 changes: 4 additions & 3 deletions jme3-core/src/main/java/com/jme3/util/MipMapGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import com.jme3.math.FastMath;
import com.jme3.texture.Image;
import com.jme3.texture.Image.Format;
import com.jme3.texture.image.DefaultImageRaster;
import com.jme3.texture.image.ImageRaster;
import java.nio.ByteBuffer;
import java.util.ArrayList;
Expand All @@ -52,9 +53,9 @@ public static Image scaleImage(Image inputImage, int outputWidth, int outputHeig
outputHeight,
buffer,
inputImage.getColorSpace());
ImageRaster input = ImageRaster.create(inputImage, 0, 0, false);
ImageRaster output = ImageRaster.create(outputImage, 0, 0, false);

ImageRaster input = DefaultImageRaster.create(inputImage, 0, 0, false);
ImageRaster output = DefaultImageRaster.create(outputImage, 0, 0, false);

float xRatio = ((float)(input.getWidth() - 1)) / output.getWidth();
float yRatio = ((float)(input.getHeight() - 1)) / output.getHeight();
Expand Down
12 changes: 6 additions & 6 deletions jme3-core/src/main/resources/com/jme3/system/version.properties
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
# THIS IS AN AUTO-GENERATED FILE..
# DO NOT MODIFY!
build.date=2016-04-03
git.revision=5496
git.branch=application-input-DIP
git.hash=85ccf353a95329daff30dc60304532fcc63a5f4b
git.hash.short=85ccf35
git.revision=5501
git.branch=imageraster-cyclic
git.hash=1118cdf84383374836192ced709d4c95ea3136ea
git.hash.short=1118cdf
git.tag=null
name.full=jMonkeyEngine 3.1-application-input-DIP-5496
version.full=3.1-application-input-DIP-5496
name.full=jMonkeyEngine 3.1-imageraster-cyclic-5501
version.full=3.1-imageraster-cyclic-5501
version.number=3.1.0
version.tag=SNAPSHOT
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,21 @@

import com.jme3.math.ColorRGBA;
import com.jme3.texture.Image;
import com.jme3.util.BufferUtils;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;

import org.junit.runner.RunWith;
import org.mockito.Matchers;
import org.mockito.Mockito;
import org.mockito.internal.matchers.apachecommons.ReflectionEquals;

import static org.mockito.Mockito.*;

/**
Expand Down Expand Up @@ -64,4 +76,36 @@ public void testGetPixel() {
verify(ir).setStoreRGBA(color, ir.codec);
verify(ir).setSRGB(color);
}

/**
* Tests that the create methods creates an actual instance with the correct arguments
* @throws Exception
*/
@Test
public void testCreate() throws Exception {
DefaultImageRaster expectedRaster1 = DefaultImageRaster.create(image);
DefaultImageRaster expectedRaster2 = DefaultImageRaster.create(image, 0, 0, true);
DefaultImageRaster actualRaster = new DefaultImageRaster(image, 0, 0, true);
DefaultImageRaster wrongRaster = new DefaultImageRaster(image, 1, 0, true);

Assert.assertTrue(EqualsBuilder.reflectionEquals(expectedRaster1, actualRaster));
Assert.assertFalse(EqualsBuilder.reflectionEquals(expectedRaster1, wrongRaster));

Assert.assertTrue(EqualsBuilder.reflectionEquals(expectedRaster2, actualRaster));
Assert.assertFalse(EqualsBuilder.reflectionEquals(expectedRaster2, wrongRaster));
}

/**
* Test that the create method throws an error when a slice should be specified
*/
@Test(expected = IllegalStateException.class)
public void testInvalidCreate() {
ArrayList<ByteBuffer> byteBuffers = new ArrayList<ByteBuffer>(2);
byteBuffers.add(BufferUtils.createByteBuffer(1));
byteBuffers.add(BufferUtils.createByteBuffer(1));
image.setData(byteBuffers);

assert(image.getData().size() == 2);
DefaultImageRaster actualRaster = DefaultImageRaster.create(image);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import com.jme3.texture.Texture.MinFilter;
import com.jme3.texture.TextureDefault2D;
import com.jme3.texture.image.ColorSpace;
import com.jme3.texture.image.DefaultImageRaster;
import com.jme3.texture.image.ImageRaster;
import com.jme3.util.BufferUtils;
import java.nio.ByteBuffer;
Expand All @@ -30,8 +31,8 @@ private Image convertImage(Image image, Format newFormat) {
ByteBuffer data = BufferUtils.createByteBuffer( (int)Math.ceil(newFormat.getBitsPerPixel() / 8.0) * width * height);
Image convertedImage = new Image(newFormat, width, height, data,null, image.getColorSpace());

ImageRaster sourceReader = ImageRaster.create(image);
ImageRaster targetWriter = ImageRaster.create(convertedImage);
ImageRaster sourceReader = DefaultImageRaster.create(image);
ImageRaster targetWriter = DefaultImageRaster.create(convertedImage);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
ColorRGBA color = sourceReader.getPixel(x, y);
Expand Down Expand Up @@ -69,7 +70,7 @@ private void convertAndPutImage(Image image, float posX, float posY) {
private Image createTestImage() {
Image testImage = new Image(Format.BGR8, 4, 3, BufferUtils.createByteBuffer(4 * 4 * 3), null, ColorSpace.Linear);

ImageRaster io = ImageRaster.create(testImage);
ImageRaster io = DefaultImageRaster.create(testImage);
io.setPixel(0, 0, ColorRGBA.Black);
io.setPixel(1, 0, ColorRGBA.Gray);
io.setPixel(2, 0, ColorRGBA.White);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@

import com.jme3.math.ColorRGBA;
import com.jme3.texture.Image;
import com.jme3.texture.image.DefaultImageRaster;
import com.jme3.texture.image.ImageRaster;

/**
Expand Down Expand Up @@ -94,9 +95,9 @@ protected float calculateHeight(ColorRGBA color) {
}

protected ImageRaster getImageRaster() {
return ImageRaster.create(colorImage);
return DefaultImageRaster.create(colorImage);
}

public boolean load(boolean flipX, boolean flipY) {

int imageWidth = colorImage.getWidth();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.jme3.terrain.heightmap;

import com.jme3.texture.Image;
import com.jme3.texture.image.DefaultImageRaster;
import com.jme3.texture.image.ImageRaster;
import org.junit.Before;
import org.junit.Test;

import static org.hamcrest.CoreMatchers.instanceOf;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;

public class ImageBasedHeightMapTest {

private ImageBasedHeightMap heightMap;
private Image image;

@Before
public void setUp() {
image = createImage();
heightMap = new ImageBasedHeightMap(image);

}

public Image createImage() {
Image image = spy(new Image());
when(image.getFormat()).thenReturn(Image.Format.BGR8);
return image;
}

@Test
public void testGetImageRaster() {
ImageRaster imageRaster = heightMap.getImageRaster();

assertThat(imageRaster, instanceOf(DefaultImageRaster.class));
}
}

0 comments on commit bab8705

Please sign in to comment.