Modified: commons/proper/sanselan/trunk/src/test/java/org/apache/sanselan/formats/icns/IcnsRoundTripTest.java URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/test/java/org/apache/sanselan/formats/icns/IcnsRoundTripTest.java?rev=1212719&r1=1212718&r2=1212719&view=diff ============================================================================== --- commons/proper/sanselan/trunk/src/test/java/org/apache/sanselan/formats/icns/IcnsRoundTripTest.java (original) +++ commons/proper/sanselan/trunk/src/test/java/org/apache/sanselan/formats/icns/IcnsRoundTripTest.java Sat Dec 10 02:09:43 2011 @@ -50,389 +50,389 @@ public class IcnsRoundTripTest extends I {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} }; - public void test1BPPIconMaskVersus8BPPMask() throws ImageReadException, ImageWriteException, IOException - { - final int foreground = 0xff000000; - final int background = 0xff000000; - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - BinaryOutputStream bos = new BinaryOutputStream(baos, - BinaryOutputStream.BYTE_ORDER_BIG_ENDIAN); - bos.write4Bytes(IcnsImageParser.ICNS_MAGIC); - bos.write4Bytes(4 + 4 + 4 + 4 + 2*16*16/8 + 4 + 4 + 16*16); - bos.write4Bytes(IcnsType.ICNS_16x16_1BIT_IMAGE_AND_MASK.getType()); - bos.write4Bytes(4 + 4 + 2*16*16/8); - // 1 BPP image - all black - for (int y = 0; y < 16; y++) - { - bos.write(0xff); - bos.write(0xff); - } - // 1 BPP mask - all opaque - for (int y = 0; y < 16; y++) - { - bos.write(0xff); - bos.write(0xff); - } - // 8 BPP alpha mask - partially transparent - bos.write4Bytes(IcnsType.ICNS_16x16_8BIT_MASK.getType()); - bos.write4Bytes(4 + 4 + 16*16); - for (int y = 0; y < 16; y++) - { - for (int x = 0; x < 16; x++) - { - if (image[y][x] != 0) - bos.write(0xff); - else - bos.write(0x00); - } - } - bos.flush(); - writeAndReadImageData("1bpp-image-mask-versus-8bpp-mask", - baos.toByteArray(), foreground, background); - } - - public void test8BPPIcon8BPPMask() throws ImageReadException, ImageWriteException, IOException - { - final int foreground = 0xff000000; - final int background = 0x00cccccc; - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - BinaryOutputStream bos = new BinaryOutputStream(baos, - BinaryOutputStream.BYTE_ORDER_BIG_ENDIAN); - bos.write4Bytes(IcnsImageParser.ICNS_MAGIC); - bos.write4Bytes(4 + 4 + 4 + 4 + 16*16 + 4 + 4 + 16*16); - bos.write4Bytes(IcnsType.ICNS_16x16_8BIT_IMAGE.getType()); - bos.write4Bytes(4 + 4 + 16*16); - // 8 BPP image - for (int y = 0; y < 16; y++) - { - for (int x = 0; x < 16; x++) - { - if (image[y][x] != 0) - bos.write(0xff); - else - bos.write(43); - } - } - // 8 BPP alpha mask - bos.write4Bytes(IcnsType.ICNS_16x16_8BIT_MASK.getType()); - bos.write4Bytes(4 + 4 + 16*16); - for (int y = 0; y < 16; y++) - { - for (int x = 0; x < 16; x++) - { - if (image[y][x] != 0) - bos.write(0xff); - else - bos.write(0x00); - } - } - bos.flush(); - writeAndReadImageData("8bpp-image-8bpp-mask", baos.toByteArray(), foreground, background); - } - - public void test8BPPIcon8BPPMaskVersus1BPPMask() - throws ImageReadException, ImageWriteException, IOException - { - final int foreground = 0xff000000; - final int background = 0x00cccccc; - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - BinaryOutputStream bos = new BinaryOutputStream(baos, - BinaryOutputStream.BYTE_ORDER_BIG_ENDIAN); - bos.write4Bytes(IcnsImageParser.ICNS_MAGIC); - bos.write4Bytes(4 + 4 + 4 + 4 + 16*16 + 4 + 4 + 16*16 + 4 + 4 + 2*16*16/8); - bos.write4Bytes(IcnsType.ICNS_16x16_8BIT_IMAGE.getType()); - bos.write4Bytes(4 + 4 + 16*16); - // 8 BPP image - for (int y = 0; y < 16; y++) - { - for (int x = 0; x < 16; x++) - { - if (image[y][x] != 0) - bos.write(0xff); - else - bos.write(43); - } - } - // 8 BPP alpha mask, some transparent - bos.write4Bytes(IcnsType.ICNS_16x16_8BIT_MASK.getType()); - bos.write4Bytes(4 + 4 + 16*16); - for (int y = 0; y < 16; y++) - { - for (int x = 0; x < 16; x++) - { - if (image[y][x] != 0) - bos.write(0xff); - else - bos.write(0x00); - } - } - // 1 BPP mask - bos.write4Bytes(IcnsType.ICNS_16x16_1BIT_IMAGE_AND_MASK.getType()); - bos.write4Bytes(4 + 4 + 2*16*16/8); - // 1 bit image - for (int y = 0; y < 16; y++) - { - for (int x = 0; x < 16; x += 8) - { - int eightBits = 0; - for (int pos = 0; pos < 8; pos++) - { - if (image[y][x+pos] != 0) - eightBits |= (1 << (7 - pos)); - } - bos.write(eightBits); - } - } - // 1 bit mask, all opaque - for (int y = 0; y < 16; y++) - { - bos.write(0xff); - bos.write(0xff); - } - bos.flush(); - writeAndReadImageData("8bpp-image-8bpp-mask-vs-1bpp-mask", - baos.toByteArray(), foreground, background); - } - - public void test8BPPIcon1BPPMaskVersus8BPPMask() - throws ImageReadException, ImageWriteException, IOException - { - final int foreground = 0xff000000; - final int background = 0x00cccccc; - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - BinaryOutputStream bos = new BinaryOutputStream(baos, - BinaryOutputStream.BYTE_ORDER_BIG_ENDIAN); - bos.write4Bytes(IcnsImageParser.ICNS_MAGIC); - bos.write4Bytes(4 + 4 + 4 + 4 + 16*16 + 4 + 4 + 16*16 + 4 + 4 + 2*16*16/8); - bos.write4Bytes(IcnsType.ICNS_16x16_8BIT_IMAGE.getType()); - bos.write4Bytes(4 + 4 + 16*16); - // 8 BPP image - for (int y = 0; y < 16; y++) - { - for (int x = 0; x < 16; x++) - { - if (image[y][x] != 0) - bos.write(0xff); - else - bos.write(43); - } - } - // 1 BPP mask - bos.write4Bytes(IcnsType.ICNS_16x16_1BIT_IMAGE_AND_MASK.getType()); - bos.write4Bytes(4 + 4 + 2*16*16/8); - // 1 bit image - for (int y = 0; y < 16; y++) - { - for (int x = 0; x < 16; x += 8) - { - int eightBits = 0; - for (int pos = 0; pos < 8; pos++) - { - if (image[y][x+pos] != 0) - eightBits |= (1 << (7 - pos)); - } - bos.write(eightBits); - } - } - // 1 bit mask, all opaque - for (int y = 0; y < 16; y++) - { - bos.write(0xff); - bos.write(0xff); - } - // 8 BPP alpha mask, some transparent - bos.write4Bytes(IcnsType.ICNS_16x16_8BIT_MASK.getType()); - bos.write4Bytes(4 + 4 + 16*16); - for (int y = 0; y < 16; y++) - { - for (int x = 0; x < 16; x++) - { - if (image[y][x] != 0) - bos.write(0xff); - else - bos.write(0x00); - } - } - bos.flush(); - writeAndReadImageData("8bpp-image-1bpp-mask-vs-8bpp-mask", - baos.toByteArray(), foreground, background); - } - - public void test8BPPIconNoMask() throws ImageReadException, ImageWriteException, IOException - { - final int foreground = 0xff000000; - final int background = 0xffcccccc; - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - BinaryOutputStream bos = new BinaryOutputStream(baos, - BinaryOutputStream.BYTE_ORDER_BIG_ENDIAN); - bos.write4Bytes(IcnsImageParser.ICNS_MAGIC); - bos.write4Bytes(4 + 4 + 4 + 4 + 16*16); - bos.write4Bytes(IcnsType.ICNS_16x16_8BIT_IMAGE.getType()); - bos.write4Bytes(4 + 4 + 16*16); - // 8 BPP image - for (int y = 0; y < 16; y++) - { - for (int x = 0; x < 16; x++) - { - if (image[y][x] != 0) - bos.write(0xff); - else - bos.write(43); - } - } - bos.flush(); - writeAndReadImageData("8bpp-image-no-mask", baos.toByteArray(), foreground, background); - } - - public void test32BPPMaskedIcon() throws ImageReadException, ImageWriteException, IOException - { - final int foreground = 0xff000000; - final int background = 0x000000ff; - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - BinaryOutputStream bos = new BinaryOutputStream(baos, - BinaryOutputStream.BYTE_ORDER_BIG_ENDIAN); - bos.write4Bytes(IcnsImageParser.ICNS_MAGIC); - bos.write4Bytes(4 + 4 + 4 + 4 + 4*16*16 + 4 + 4 + 2*16*16/8); - bos.write4Bytes(IcnsType.ICNS_16x16_32BIT_IMAGE.getType()); - bos.write4Bytes(4 + 4 + 4*16*16); - for (int y = 0; y < 16; y++) - { - for (int x = 0; x < 16; x++) - { - // argb, a ignored - bos.write(0); - final int pixel; - if (image[y][x] != 0) - pixel = foreground; - else - pixel = background; - bos.write(0xff & (pixel >> 16)); - bos.write(0xff & (pixel >> 8)); - bos.write(0xff & pixel); - } - } - bos.write4Bytes(IcnsType.ICNS_16x16_1BIT_IMAGE_AND_MASK.getType()); - bos.write4Bytes(4 + 4 + 2*16*16/8); - // 1 bit image - for (int y = 0; y < 16; y++) - { - for (int x = 0; x < 16; x += 8) - { - int eightBits = 0; - for (int pos = 0; pos < 8; pos++) - { - if (image[y][x+pos] != 0) - eightBits |= (1 << (7 - pos)); - } - bos.write(eightBits); - } - } - // 1 bit mask - for (int y = 0; y < 16; y++) - { - for (int x = 0; x < 16; x += 8) - { - int eightBits = 0; - for (int pos = 0; pos < 8; pos++) - { - if (image[y][x+pos] != 0) - eightBits |= (1 << (7 - pos)); - } - bos.write(eightBits); - } - } - bos.flush(); - writeAndReadImageData("32bpp-image-1bpp-mask", baos.toByteArray(), foreground, background); - } - - public void test32BPPHalfMaskedIcon() throws ImageWriteException, IOException - { - final int foreground = 0xff000000; - final int background = 0xff0000ff; - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - BinaryOutputStream bos = new BinaryOutputStream(baos, - BinaryOutputStream.BYTE_ORDER_BIG_ENDIAN); - bos.write4Bytes(IcnsImageParser.ICNS_MAGIC); - bos.write4Bytes(4 + 4 + 4 + 4 + 4*16*16 + 4 + 4 + 16*16/8); - bos.write4Bytes(IcnsType.ICNS_16x16_32BIT_IMAGE.getType()); - bos.write4Bytes(4 + 4 + 4*16*16); - for (int y = 0; y < 16; y++) - { - for (int x = 0; x < 16; x++) - { - // argb, a ignored - bos.write(0); - final int pixel; - if (image[y][x] != 0) - pixel = foreground; - else - pixel = background; - bos.write(0xff & (pixel >> 16)); - bos.write(0xff & (pixel >> 8)); - bos.write(0xff & pixel); - } - } - bos.write4Bytes(IcnsType.ICNS_16x16_1BIT_IMAGE_AND_MASK.getType()); - bos.write4Bytes(4 + 4 + 16*16/8); - // 1 bit image - for (int y = 0; y < 16; y++) - { - for (int x = 0; x < 16; x += 8) - { - int eightBits = 0; - for (int pos = 0; pos < 8; pos++) - { - if (image[y][x+pos] != 0) - eightBits |= (1 << (7 - pos)); - } - bos.write(eightBits); - } - } - // Missing 1 bit mask!!! - bos.flush(); - - boolean threw = false; - try - { - writeAndReadImageData("32bpp-half-masked-CORRUPT", baos.toByteArray(), foreground, background); - } - catch (ImageReadException imageReadException) - { - threw = true; - } - assertTrue("ICNS file with corrupt mask didn't fail to parse", threw); - } - - public void test32BPPMaskMissingIcon() throws ImageReadException, ImageWriteException, IOException - { - final int foreground = 0xff000000; - final int background = 0xff0000ff; - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - BinaryOutputStream bos = new BinaryOutputStream(baos, - BinaryOutputStream.BYTE_ORDER_BIG_ENDIAN); - bos.write4Bytes(IcnsImageParser.ICNS_MAGIC); - bos.write4Bytes(4 + 4 + 4 + 4 + 4*16*16); - bos.write4Bytes(IcnsType.ICNS_16x16_32BIT_IMAGE.getType()); - bos.write4Bytes(4 + 4 + 4*16*16); - for (int y = 0; y < 16; y++) - { - for (int x = 0; x < 16; x++) - { - // argb, a ignored - bos.write(0); - final int pixel; - if (image[y][x] != 0) - pixel = foreground; - else - pixel = background; - bos.write(0xff & (pixel >> 16)); - bos.write(0xff & (pixel >> 8)); - bos.write(0xff & pixel); - } - } - bos.flush(); - writeAndReadImageData("32bpp-mask-missing", baos.toByteArray(), foreground, background); - } + public void test1BPPIconMaskVersus8BPPMask() throws ImageReadException, ImageWriteException, IOException + { + final int foreground = 0xff000000; + final int background = 0xff000000; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + BinaryOutputStream bos = new BinaryOutputStream(baos, + BinaryOutputStream.BYTE_ORDER_BIG_ENDIAN); + bos.write4Bytes(IcnsImageParser.ICNS_MAGIC); + bos.write4Bytes(4 + 4 + 4 + 4 + 2*16*16/8 + 4 + 4 + 16*16); + bos.write4Bytes(IcnsType.ICNS_16x16_1BIT_IMAGE_AND_MASK.getType()); + bos.write4Bytes(4 + 4 + 2*16*16/8); + // 1 BPP image - all black + for (int y = 0; y < 16; y++) + { + bos.write(0xff); + bos.write(0xff); + } + // 1 BPP mask - all opaque + for (int y = 0; y < 16; y++) + { + bos.write(0xff); + bos.write(0xff); + } + // 8 BPP alpha mask - partially transparent + bos.write4Bytes(IcnsType.ICNS_16x16_8BIT_MASK.getType()); + bos.write4Bytes(4 + 4 + 16*16); + for (int y = 0; y < 16; y++) + { + for (int x = 0; x < 16; x++) + { + if (image[y][x] != 0) + bos.write(0xff); + else + bos.write(0x00); + } + } + bos.flush(); + writeAndReadImageData("1bpp-image-mask-versus-8bpp-mask", + baos.toByteArray(), foreground, background); + } + + public void test8BPPIcon8BPPMask() throws ImageReadException, ImageWriteException, IOException + { + final int foreground = 0xff000000; + final int background = 0x00cccccc; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + BinaryOutputStream bos = new BinaryOutputStream(baos, + BinaryOutputStream.BYTE_ORDER_BIG_ENDIAN); + bos.write4Bytes(IcnsImageParser.ICNS_MAGIC); + bos.write4Bytes(4 + 4 + 4 + 4 + 16*16 + 4 + 4 + 16*16); + bos.write4Bytes(IcnsType.ICNS_16x16_8BIT_IMAGE.getType()); + bos.write4Bytes(4 + 4 + 16*16); + // 8 BPP image + for (int y = 0; y < 16; y++) + { + for (int x = 0; x < 16; x++) + { + if (image[y][x] != 0) + bos.write(0xff); + else + bos.write(43); + } + } + // 8 BPP alpha mask + bos.write4Bytes(IcnsType.ICNS_16x16_8BIT_MASK.getType()); + bos.write4Bytes(4 + 4 + 16*16); + for (int y = 0; y < 16; y++) + { + for (int x = 0; x < 16; x++) + { + if (image[y][x] != 0) + bos.write(0xff); + else + bos.write(0x00); + } + } + bos.flush(); + writeAndReadImageData("8bpp-image-8bpp-mask", baos.toByteArray(), foreground, background); + } + + public void test8BPPIcon8BPPMaskVersus1BPPMask() + throws ImageReadException, ImageWriteException, IOException + { + final int foreground = 0xff000000; + final int background = 0x00cccccc; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + BinaryOutputStream bos = new BinaryOutputStream(baos, + BinaryOutputStream.BYTE_ORDER_BIG_ENDIAN); + bos.write4Bytes(IcnsImageParser.ICNS_MAGIC); + bos.write4Bytes(4 + 4 + 4 + 4 + 16*16 + 4 + 4 + 16*16 + 4 + 4 + 2*16*16/8); + bos.write4Bytes(IcnsType.ICNS_16x16_8BIT_IMAGE.getType()); + bos.write4Bytes(4 + 4 + 16*16); + // 8 BPP image + for (int y = 0; y < 16; y++) + { + for (int x = 0; x < 16; x++) + { + if (image[y][x] != 0) + bos.write(0xff); + else + bos.write(43); + } + } + // 8 BPP alpha mask, some transparent + bos.write4Bytes(IcnsType.ICNS_16x16_8BIT_MASK.getType()); + bos.write4Bytes(4 + 4 + 16*16); + for (int y = 0; y < 16; y++) + { + for (int x = 0; x < 16; x++) + { + if (image[y][x] != 0) + bos.write(0xff); + else + bos.write(0x00); + } + } + // 1 BPP mask + bos.write4Bytes(IcnsType.ICNS_16x16_1BIT_IMAGE_AND_MASK.getType()); + bos.write4Bytes(4 + 4 + 2*16*16/8); + // 1 bit image + for (int y = 0; y < 16; y++) + { + for (int x = 0; x < 16; x += 8) + { + int eightBits = 0; + for (int pos = 0; pos < 8; pos++) + { + if (image[y][x+pos] != 0) + eightBits |= (1 << (7 - pos)); + } + bos.write(eightBits); + } + } + // 1 bit mask, all opaque + for (int y = 0; y < 16; y++) + { + bos.write(0xff); + bos.write(0xff); + } + bos.flush(); + writeAndReadImageData("8bpp-image-8bpp-mask-vs-1bpp-mask", + baos.toByteArray(), foreground, background); + } + + public void test8BPPIcon1BPPMaskVersus8BPPMask() + throws ImageReadException, ImageWriteException, IOException + { + final int foreground = 0xff000000; + final int background = 0x00cccccc; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + BinaryOutputStream bos = new BinaryOutputStream(baos, + BinaryOutputStream.BYTE_ORDER_BIG_ENDIAN); + bos.write4Bytes(IcnsImageParser.ICNS_MAGIC); + bos.write4Bytes(4 + 4 + 4 + 4 + 16*16 + 4 + 4 + 16*16 + 4 + 4 + 2*16*16/8); + bos.write4Bytes(IcnsType.ICNS_16x16_8BIT_IMAGE.getType()); + bos.write4Bytes(4 + 4 + 16*16); + // 8 BPP image + for (int y = 0; y < 16; y++) + { + for (int x = 0; x < 16; x++) + { + if (image[y][x] != 0) + bos.write(0xff); + else + bos.write(43); + } + } + // 1 BPP mask + bos.write4Bytes(IcnsType.ICNS_16x16_1BIT_IMAGE_AND_MASK.getType()); + bos.write4Bytes(4 + 4 + 2*16*16/8); + // 1 bit image + for (int y = 0; y < 16; y++) + { + for (int x = 0; x < 16; x += 8) + { + int eightBits = 0; + for (int pos = 0; pos < 8; pos++) + { + if (image[y][x+pos] != 0) + eightBits |= (1 << (7 - pos)); + } + bos.write(eightBits); + } + } + // 1 bit mask, all opaque + for (int y = 0; y < 16; y++) + { + bos.write(0xff); + bos.write(0xff); + } + // 8 BPP alpha mask, some transparent + bos.write4Bytes(IcnsType.ICNS_16x16_8BIT_MASK.getType()); + bos.write4Bytes(4 + 4 + 16*16); + for (int y = 0; y < 16; y++) + { + for (int x = 0; x < 16; x++) + { + if (image[y][x] != 0) + bos.write(0xff); + else + bos.write(0x00); + } + } + bos.flush(); + writeAndReadImageData("8bpp-image-1bpp-mask-vs-8bpp-mask", + baos.toByteArray(), foreground, background); + } + + public void test8BPPIconNoMask() throws ImageReadException, ImageWriteException, IOException + { + final int foreground = 0xff000000; + final int background = 0xffcccccc; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + BinaryOutputStream bos = new BinaryOutputStream(baos, + BinaryOutputStream.BYTE_ORDER_BIG_ENDIAN); + bos.write4Bytes(IcnsImageParser.ICNS_MAGIC); + bos.write4Bytes(4 + 4 + 4 + 4 + 16*16); + bos.write4Bytes(IcnsType.ICNS_16x16_8BIT_IMAGE.getType()); + bos.write4Bytes(4 + 4 + 16*16); + // 8 BPP image + for (int y = 0; y < 16; y++) + { + for (int x = 0; x < 16; x++) + { + if (image[y][x] != 0) + bos.write(0xff); + else + bos.write(43); + } + } + bos.flush(); + writeAndReadImageData("8bpp-image-no-mask", baos.toByteArray(), foreground, background); + } + + public void test32BPPMaskedIcon() throws ImageReadException, ImageWriteException, IOException + { + final int foreground = 0xff000000; + final int background = 0x000000ff; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + BinaryOutputStream bos = new BinaryOutputStream(baos, + BinaryOutputStream.BYTE_ORDER_BIG_ENDIAN); + bos.write4Bytes(IcnsImageParser.ICNS_MAGIC); + bos.write4Bytes(4 + 4 + 4 + 4 + 4*16*16 + 4 + 4 + 2*16*16/8); + bos.write4Bytes(IcnsType.ICNS_16x16_32BIT_IMAGE.getType()); + bos.write4Bytes(4 + 4 + 4*16*16); + for (int y = 0; y < 16; y++) + { + for (int x = 0; x < 16; x++) + { + // argb, a ignored + bos.write(0); + final int pixel; + if (image[y][x] != 0) + pixel = foreground; + else + pixel = background; + bos.write(0xff & (pixel >> 16)); + bos.write(0xff & (pixel >> 8)); + bos.write(0xff & pixel); + } + } + bos.write4Bytes(IcnsType.ICNS_16x16_1BIT_IMAGE_AND_MASK.getType()); + bos.write4Bytes(4 + 4 + 2*16*16/8); + // 1 bit image + for (int y = 0; y < 16; y++) + { + for (int x = 0; x < 16; x += 8) + { + int eightBits = 0; + for (int pos = 0; pos < 8; pos++) + { + if (image[y][x+pos] != 0) + eightBits |= (1 << (7 - pos)); + } + bos.write(eightBits); + } + } + // 1 bit mask + for (int y = 0; y < 16; y++) + { + for (int x = 0; x < 16; x += 8) + { + int eightBits = 0; + for (int pos = 0; pos < 8; pos++) + { + if (image[y][x+pos] != 0) + eightBits |= (1 << (7 - pos)); + } + bos.write(eightBits); + } + } + bos.flush(); + writeAndReadImageData("32bpp-image-1bpp-mask", baos.toByteArray(), foreground, background); + } + + public void test32BPPHalfMaskedIcon() throws ImageWriteException, IOException + { + final int foreground = 0xff000000; + final int background = 0xff0000ff; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + BinaryOutputStream bos = new BinaryOutputStream(baos, + BinaryOutputStream.BYTE_ORDER_BIG_ENDIAN); + bos.write4Bytes(IcnsImageParser.ICNS_MAGIC); + bos.write4Bytes(4 + 4 + 4 + 4 + 4*16*16 + 4 + 4 + 16*16/8); + bos.write4Bytes(IcnsType.ICNS_16x16_32BIT_IMAGE.getType()); + bos.write4Bytes(4 + 4 + 4*16*16); + for (int y = 0; y < 16; y++) + { + for (int x = 0; x < 16; x++) + { + // argb, a ignored + bos.write(0); + final int pixel; + if (image[y][x] != 0) + pixel = foreground; + else + pixel = background; + bos.write(0xff & (pixel >> 16)); + bos.write(0xff & (pixel >> 8)); + bos.write(0xff & pixel); + } + } + bos.write4Bytes(IcnsType.ICNS_16x16_1BIT_IMAGE_AND_MASK.getType()); + bos.write4Bytes(4 + 4 + 16*16/8); + // 1 bit image + for (int y = 0; y < 16; y++) + { + for (int x = 0; x < 16; x += 8) + { + int eightBits = 0; + for (int pos = 0; pos < 8; pos++) + { + if (image[y][x+pos] != 0) + eightBits |= (1 << (7 - pos)); + } + bos.write(eightBits); + } + } + // Missing 1 bit mask!!! + bos.flush(); + + boolean threw = false; + try + { + writeAndReadImageData("32bpp-half-masked-CORRUPT", baos.toByteArray(), foreground, background); + } + catch (ImageReadException imageReadException) + { + threw = true; + } + assertTrue("ICNS file with corrupt mask didn't fail to parse", threw); + } + + public void test32BPPMaskMissingIcon() throws ImageReadException, ImageWriteException, IOException + { + final int foreground = 0xff000000; + final int background = 0xff0000ff; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + BinaryOutputStream bos = new BinaryOutputStream(baos, + BinaryOutputStream.BYTE_ORDER_BIG_ENDIAN); + bos.write4Bytes(IcnsImageParser.ICNS_MAGIC); + bos.write4Bytes(4 + 4 + 4 + 4 + 4*16*16); + bos.write4Bytes(IcnsType.ICNS_16x16_32BIT_IMAGE.getType()); + bos.write4Bytes(4 + 4 + 4*16*16); + for (int y = 0; y < 16; y++) + { + for (int x = 0; x < 16; x++) + { + // argb, a ignored + bos.write(0); + final int pixel; + if (image[y][x] != 0) + pixel = foreground; + else + pixel = background; + bos.write(0xff & (pixel >> 16)); + bos.write(0xff & (pixel >> 8)); + bos.write(0xff & pixel); + } + } + bos.flush(); + writeAndReadImageData("32bpp-mask-missing", baos.toByteArray(), foreground, background); + } private void writeAndReadImageData(String description, byte[] rawData, int foreground, int background) throws IOException,