package com.jogamp.opengl.test.junit.jogl.util.texture; import java.io.File; import java.io.IOException; import java.net.URISyntaxException; import java.net.URL; import java.net.URLConnection; import java.nio.ByteBuffer; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import com.jogamp.common.util.IOUtil; import com.jogamp.opengl.util.texture.spi.DDSImage; import com.jogamp.opengl.util.texture.spi.DDSImage.ImageInfo; /** * This test uses the DDSImage class to read a dds image from file, extract the data, * and use the class to create a new DDSImage from the extracted data * <br></br> * Bug Reference: https://jogamp.org/bugzilla/show_bug.cgi?id=362 * <br></br> * The bug pertains to incorrect size calculation for checking validity of data. Compressed DXT1 has min of 8 bytes, DXT5 has min of 16 bytes. * It exists in {@link DDSImage#createFromData(int, int, int, ByteBuffer[])} * where an {@link IllegalArgumentException} is thrown for Mipmap level size mismatch. * <br></br> * <ul>The following cases are tested: * <li>Uncompressed 64x32 RGB DDS Image with all mipmap levels (64x32 --> 1x1)</li> * <li>DXT1 compressed 64x32 RGB DDS Image with all mipmap levels (64x32 --> 1x1)</li> * <li>DXT5 compressed 64x32 RGB DDS Image with all mipmap levels (64x32 --> 1x1)</li> * </ul> * * @author Michael Esemplare * */ public class TestBug362DDSImageCreateFromData { File testDDSImage01Uncompressed; File testDDSImage02DXT1; File testDDSImage03DXT5; @Before public void setup() throws Throwable { testDDSImage01Uncompressed = initFile("test-64x32_uncompressed.dds"); testDDSImage02DXT1 = initFile("test-64x32_DXT1.dds"); testDDSImage03DXT5 = initFile("test-64x32_DXT5.dds"); } @After public void teardown() { testDDSImage01Uncompressed = null; testDDSImage02DXT1 = null; testDDSImage03DXT5 = null; } private File initFile(final String filename) throws URISyntaxException { final URLConnection connection = IOUtil.getResource(filename, getClass().getClassLoader(), getClass()); Assert.assertNotNull(connection); final URL url = connection.getURL(); final File file = new File(url.toURI()); Assert.assertTrue(file.exists()); return file; } private void testImpl(final File file) throws IOException { final DDSImage ddsImage = DDSImage.read(file); Assert.assertNotNull(ddsImage); final int numMipMaps = ddsImage.getNumMipMaps(); final ByteBuffer[] mipMapArray = new ByteBuffer[numMipMaps]; for (int i=0;i<numMipMaps;i++){ final ImageInfo info = ddsImage.getMipMap(i); mipMapArray[i] = info.getData(); } final DDSImage newImage = DDSImage.createFromData(ddsImage.getPixelFormat(), ddsImage.getWidth(), ddsImage.getHeight(), mipMapArray); Assert.assertNotNull(newImage); } @Test public void test00_DDSImage_CreateFromData_Uncompressed_RGB () throws IOException { testImpl(testDDSImage01Uncompressed); } @Test public void test01_DDSImage_CreateFromData_DXT1_RGB () throws IOException { testImpl(testDDSImage02DXT1); } @Test public void test02_DDSImage_CreateFromData_DXT5_RGB () throws IOException { testImpl(testDDSImage03DXT5); } public static void main(final String[] args) { org.junit.runner.JUnitCore.main(TestBug362DDSImageCreateFromData.class.getName()); } }