Revision: 5933 Author: rj...@google.com Date: Mon Aug 10 14:57:35 2009 Log: Cherry pick c5932 from trunk for ImageBundleBuilder fix svn merge -c5932 https://google-web-toolkit.googlecode.com/svn/trunk .
http://code.google.com/p/google-web-toolkit/source/detail?r=5933 Modified: /branches/snapshot-2009.08.04-r5888/branch-info.txt /branches/snapshot-2009.08.04-r5888/user/src/com/google/gwt/resources/rg/ImageBundleBuilder.java ======================================= --- /branches/snapshot-2009.08.04-r5888/branch-info.txt Thu Aug 6 15:39:10 2009 +++ /branches/snapshot-2009.08.04-r5888/branch-info.txt Mon Aug 10 14:57:35 2009 @@ -9,3 +9,7 @@ /trunk c5896 was merged into this branch UiBinder svn merge -c5896 https://google-web-toolkit.googlecode.com/svn/trunk . + +/trunk c5932 was merged into this branch + Switch ImageBundleBuilder to use ImageIO.getImageReaders()... + svn merge -c5932 https://google-web-toolkit.googlecode.com/svn/trunk . ======================================= --- /branches/snapshot-2009.08.04-r5888/user/src/com/google/gwt/resources/rg/ImageBundleBuilder.java Thu Jul 30 11:19:40 2009 +++ /branches/snapshot-2009.08.04-r5888/user/src/com/google/gwt/resources/rg/ImageBundleBuilder.java Mon Aug 10 14:57:35 2009 @@ -18,13 +18,18 @@ import com.google.gwt.core.ext.TreeLogger; import com.google.gwt.core.ext.UnableToCompleteException; import com.google.gwt.dev.util.Util; +import com.google.gwt.dev.util.log.PrintWriterTreeLogger; import com.google.gwt.resources.ext.ResourceContext; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.PrintWriter; +import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Collection; @@ -453,6 +458,61 @@ private static final int IMAGE_MAX_SIZE = Integer.getInteger( "gwt.imageResource.maxBundleSize", 256); + public static void main(String[] args) { + final TreeLogger logger = new PrintWriterTreeLogger(new PrintWriter( + System.out)); + if (args.length < 2) { + logger.log(TreeLogger.ERROR, ImageBundleBuilder.class.getSimpleName() + + " <output file> <input file> ..."); + System.exit(-1); + } + + ImageBundleBuilder builder = new ImageBundleBuilder(); + boolean fail = false; + for (int i = 1, j = args.length; i < j; i++) { + TreeLogger loopLogger = logger.branch(TreeLogger.DEBUG, + "Processing argument " + args[i]); + File file = new File(args[i]); + + Exception ex = null; + try { + builder.assimilate(loopLogger, args[i], file.toURL()); + } catch (MalformedURLException e) { + ex = e; + } catch (UnableToCompleteException e) { + ex = e; + } catch (UnsuitableForStripException e) { + ex = e; + } + if (ex != null) { + loopLogger.log(TreeLogger.ERROR, "Unable to assimilate image", ex); + fail = true; + } + } + + if (fail) { + System.exit(-1); + } + + final String outFile = args[0]; + try { + BufferedImage bundledImage = builder.drawBundledImage(new BestFitArranger()); + byte[] bytes = createImageBytes(logger, bundledImage); + + FileOutputStream out = new FileOutputStream(outFile); + out.write(bytes); + out.close(); + } catch (IOException e) { + logger.log(TreeLogger.ERROR, "Unable to write output file", e); + System.exit(-2); + } catch (UnableToCompleteException e) { + logger.log(TreeLogger.ERROR, "Unable to draw output image", e); + System.exit(-2); + } + + System.exit(0); + } + public static byte[] toPng(TreeLogger logger, HasRect rect) throws UnableToCompleteException { // Create the bundled image. @@ -463,6 +523,16 @@ g2d.drawImage(rect.getImage(), rect.transform(), null); g2d.dispose(); + byte[] imageBytes = createImageBytes(logger, bundledImage); + return imageBytes; + } + + /** + * Write the bundled image into a byte array, so that we can compute its + * strong name. + */ + private static byte[] createImageBytes(TreeLogger logger, + BufferedImage bundledImage) throws UnableToCompleteException { byte[] imageBytes; try { @@ -596,19 +666,7 @@ // Create the bundled image from all of the constituent images. BufferedImage bundledImage = drawBundledImage(arranger); - // Write the bundled image into a byte array, so that we can compute - // its strong name. - byte[] imageBytes; - - try { - ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream(); - ImageIO.write(bundledImage, BUNDLE_FILE_TYPE, byteOutputStream); - imageBytes = byteOutputStream.toByteArray(); - } catch (IOException e) { - logger.log(TreeLogger.ERROR, - "Unable to generate file name for image bundle file", null); - throw new UnableToCompleteException(); - } + byte[] imageBytes = createImageBytes(logger, bundledImage); String bundleFileName = context.deploy( context.getClientBundleType().getQualifiedSourceName() + ".cache." @@ -626,31 +684,40 @@ BufferedImage image = null; // Load the image try { - String path = imageUrl.getPath(); - String suffix = path.substring(path.lastIndexOf('.') + 1); - /* * ImageIO uses an SPI pattern API. We don't care about the particulars of * the implementation, so just choose the first ImageReader. */ - Iterator<ImageReader> it = ImageIO.getImageReadersBySuffix(suffix); - if (it.hasNext()) { + MemoryCacheImageInputStream input = new MemoryCacheImageInputStream( + imageUrl.openStream()); + Iterator<ImageReader> it = ImageIO.getImageReaders(input); + readers : while (it.hasNext()) { ImageReader reader = it.next(); - - reader.setInput(new MemoryCacheImageInputStream(imageUrl.openStream())); + reader.setInput(input); int numImages = reader.getNumImages(true); if (numImages == 0) { // Fall through } else if (numImages == 1) { - image = reader.read(0); + try { + image = reader.read(0); + } catch (Exception e) { + // Hope we have another reader that can handle the image + continue readers; + } } else { // Read all contained images BufferedImage[] images = new BufferedImage[numImages]; - for (int i = 0; i < numImages; i++) { - images[i] = reader.read(i); + + try { + for (int i = 0; i < numImages; i++) { + images[i] = reader.read(i); + } + } catch (Exception e) { + // Hope we have another reader that can handle the image + continue readers; } ImageRect rect = new ImageRect(imageName, images); --~--~---------~--~----~------------~-------~--~----~ http://groups.google.com/group/Google-Web-Toolkit-Contributors -~----------~----~----~----~------~----~------~--~---