Author: damjan Date: Sun Feb 26 08:16:40 2012 New Revision: 1293770 URL: http://svn.apache.org/viewvc?rev=1293770&view=rev Log: Use ImageBuilder for ICNS files.
Modified: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/common/ImageBuilder.java commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/icns/IcnsDecoder.java Modified: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/common/ImageBuilder.java URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/common/ImageBuilder.java?rev=1293770&r1=1293769&r2=1293770&view=diff ============================================================================== --- commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/common/ImageBuilder.java (original) +++ commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/common/ImageBuilder.java Sun Feb 26 08:16:40 2012 @@ -20,6 +20,19 @@ public class ImageBuilder { this.hasAlpha = hasAlpha; } + public int getWidth() { + return width; + } + + public int getHeight() { + return height; + } + + public int getRGB(int x, int y) { + final int rowOffset = y * width; + return data[rowOffset + x]; + } + public void setRGB(int x, int y, int argb) { final int rowOffset = y * width; data[rowOffset + x] = argb; Modified: commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/icns/IcnsDecoder.java URL: http://svn.apache.org/viewvc/commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/icns/IcnsDecoder.java?rev=1293770&r1=1293769&r2=1293770&view=diff ============================================================================== --- commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/icns/IcnsDecoder.java (original) +++ commons/proper/sanselan/trunk/src/main/java/org/apache/commons/sanselan/formats/icns/IcnsDecoder.java Sun Feb 26 08:16:40 2012 @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.List; import org.apache.commons.sanselan.ImageReadException; +import org.apache.commons.sanselan.common.ImageBuilder; public class IcnsDecoder { @@ -305,7 +306,7 @@ public class IcnsDecoder }; private static void decode1BPPImage(IcnsType imageType, byte[] imageData, - BufferedImage bufferedImage) + ImageBuilder image) { int position = 0; int bitsLeft = 0; @@ -326,13 +327,13 @@ public class IcnsDecoder argb = 0xffffffff; value <<= 1; bitsLeft--; - bufferedImage.setRGB(x, y, argb); + image.setRGB(x, y, argb); } } } private static void decode4BPPImage(IcnsType imageType, byte[] imageData, - BufferedImage bufferedImage) + ImageBuilder image) { int i = 0; boolean visited = false; @@ -346,26 +347,26 @@ public class IcnsDecoder else index = 0xf & imageData[i++]; visited = !visited; - bufferedImage.setRGB(x, y, palette_4bpp[index]); + image.setRGB(x, y, palette_4bpp[index]); } } } private static void decode8BPPImage(IcnsType imageType, byte[] imageData, - BufferedImage bufferedImage) + ImageBuilder image) { for (int y = 0; y < imageType.getHeight(); y++) { for (int x = 0; x < imageType.getWidth(); x++) { int index = 0xff & imageData[y*imageType.getWidth() + x]; - bufferedImage.setRGB(x, y, palette_8bpp[index]); + image.setRGB(x, y, palette_8bpp[index]); } } } private static void decode32BPPImage(IcnsType imageType, byte[] imageData, - BufferedImage bufferedImage) + ImageBuilder image) { for (int y = 0; y < imageType.getHeight(); y++) { @@ -375,27 +376,27 @@ public class IcnsDecoder ((0xff & imageData[4*(y*imageType.getWidth() + x) + 1]) << 16) | ((0xff & imageData[4*(y*imageType.getWidth() + x) + 2]) << 8) | (0xff & imageData[4*(y*imageType.getWidth() + x) + 3]); - bufferedImage.setRGB(x, y, argb); + image.setRGB(x, y, argb); } } } - private static void apply1BPPMask(byte[] maskData, BufferedImage bufferedImage) throws ImageReadException + private static void apply1BPPMask(byte[] maskData, ImageBuilder image) throws ImageReadException { int position = 0; int bitsLeft = 0; int value = 0; // 1 bit icon types have image data followed by mask data in the same entry - int totalBytes = (bufferedImage.getWidth() * bufferedImage.getHeight() + 7) / 8; + int totalBytes = (image.getWidth() * image.getHeight() + 7) / 8; if (maskData.length >= 2*totalBytes) position = totalBytes; else throw new ImageReadException("1 BPP mask underrun parsing ICNS file"); - for (int y = 0; y < bufferedImage.getHeight(); y++) + for (int y = 0; y < image.getHeight(); y++) { - for (int x = 0; x < bufferedImage.getWidth(); x++) + for (int x = 0; x < image.getWidth(); x++) { if (bitsLeft == 0) { @@ -409,21 +410,21 @@ public class IcnsDecoder alpha = 0x00; value <<= 1; bitsLeft--; - bufferedImage.setRGB(x, y, (alpha << 24) | - (0xffffff & bufferedImage.getRGB(x, y))); + image.setRGB(x, y, (alpha << 24) | + (0xffffff & image.getRGB(x, y))); } } } - private static void apply8BPPMask(byte[] maskData, BufferedImage bufferedImage) + private static void apply8BPPMask(byte[] maskData, ImageBuilder image) { - for (int y = 0; y < bufferedImage.getHeight(); y++) + for (int y = 0; y < image.getHeight(); y++) { - for (int x = 0; x < bufferedImage.getWidth(); x++) + for (int x = 0; x < image.getWidth(); x++) { - int alpha = 0xff & maskData[y*bufferedImage.getWidth() + x]; - bufferedImage.setRGB(x, y, (alpha << 24) | - (0xffffff & bufferedImage.getRGB(x, y))); + int alpha = 0xff & maskData[y*image.getWidth() + x]; + image.setRGB(x, y, (alpha << 24) | + (0xffffff & image.getRGB(x, y))); } } } @@ -499,21 +500,21 @@ public class IcnsDecoder else imageData = imageElement.data; - BufferedImage bufferedImage = new BufferedImage(imageType.getWidth(), - imageType.getHeight(), BufferedImage.TYPE_INT_ARGB); + ImageBuilder imageBuilder = new ImageBuilder(imageType.getWidth(), + imageType.getHeight(), true); switch (imageType.getBitsPerPixel()) { case 1: - decode1BPPImage(imageType, imageData, bufferedImage); + decode1BPPImage(imageType, imageData, imageBuilder); break; case 4: - decode4BPPImage(imageType, imageData, bufferedImage); + decode4BPPImage(imageType, imageData, imageBuilder); break; case 8: - decode8BPPImage(imageType, imageData, bufferedImage); + decode8BPPImage(imageType, imageData, imageBuilder); break; case 32: - decode32BPPImage(imageType, imageData, bufferedImage); + decode32BPPImage(imageType, imageData, imageBuilder); break; default: throw new ImageReadException( @@ -523,15 +524,15 @@ public class IcnsDecoder if (maskElement != null) { if (maskType.getBitsPerPixel() == 1) - apply1BPPMask(maskElement.data, bufferedImage); + apply1BPPMask(maskElement.data, imageBuilder); else if (maskType.getBitsPerPixel() == 8) - apply8BPPMask(maskElement.data, bufferedImage); + apply8BPPMask(maskElement.data, imageBuilder); else throw new ImageReadException("Unsupport mask bit depth " + maskType.getBitsPerPixel()); } - result.add(bufferedImage); + result.add(imageBuilder.getBufferedImage()); } return result; }