diff --git a/src/java/com/threerings/resource/Handler.java b/src/java/com/threerings/resource/Handler.java index 1607f3bf..db4778ca 100644 --- a/src/java/com/threerings/resource/Handler.java +++ b/src/java/com/threerings/resource/Handler.java @@ -21,6 +21,9 @@ package com.threerings.resource; +import java.util.HashMap; +import java.util.Map; + import java.net.URL; import java.net.URLConnection; import java.net.URLStreamHandler; @@ -35,6 +38,8 @@ import java.awt.image.BufferedImage; import javax.imageio.ImageIO; +import com.google.common.collect.Maps; + import com.samskivert.io.ByteArrayOutInputStream; import com.samskivert.net.AttachableURLFactory; import com.samskivert.util.StringUtil; @@ -48,17 +53,16 @@ import com.threerings.geom.GeomUtil; import static com.threerings.resource.Log.log; /** - * This class is not used directly, except by a registering ResourceManager - * so that we can load data from the resource manager using URLs of the form - * resource://<resourceSet>/<path>. ResourceSet may - * be the empty string to load from the default resource sets. + * This class is not used directly, except by a registering ResourceManager so that we can load + * data from the resource manager using URLs of the form + * resource://<resourceSet>/<path>. ResourceSet may be the empty string + * to load from the default resource sets. */ public class Handler extends URLStreamHandler { /** - * Register this class to handle "resource" urls - * ("resource://resourceSet/path") with the specified - * ResourceManager. + * Register this class to handle "resource" urls ("resource://resourceSet/path") + * with the specified ResourceManager. */ public static void registerHandler (ResourceManager rmgr) { @@ -109,8 +113,8 @@ public class Handler extends URLStreamHandler this.connected = true; } catch (IOException ioe) { - log.warning("Could not find resource [url=" + this.url + - ", error=" + ioe.getMessage() + "]."); + log.warning("Could not find resource", + "url", this.url, "error", ioe.getMessage()); throw ioe; // rethrow } } @@ -139,26 +143,23 @@ public class Handler extends URLStreamHandler } /** - * Does some magic to allow a subset of an image to be extracted, - * reencoded as a PNG and then spat back out to the Java content - * handler system for inclusion in internal documentation. + * Does some magic to allow a subset of an image to be extracted, reencoded as a PNG and then + * spat back out to the Java content handler system for inclusion in internal documentation. */ protected InputStream getStream (String bundle, String path, String query) throws IOException { // we can only do this with PNGs if (!path.endsWith(".png")) { - log.warning("Requested sub-tile of non-PNG resource " + - "[bundle=" + bundle + ", path=" + path + - ", dims=" + query + "]."); + log.warning("Requested sub-tile of non-PNG resource", + "bundle", bundle, "path", path, "dims", query); return _rmgr.getResource(bundle, path); } // parse the query string String[] bits = StringUtil.split(query, "&"); int width = -1, height = -1, tidx = -1; - String zationClass = null; - int zationColorId = -1; + HashMap zations = null; try { for (String bit : bits) { if (bit.startsWith("width=")) { @@ -167,17 +168,20 @@ public class Handler extends URLStreamHandler height = Integer.parseInt(bit.substring(7)); } else if (bit.startsWith("tile=")) { tidx = Integer.parseInt(bit.substring(5)); - } else if (bit.startsWith("zationClass=")) { - zationClass = bit.substring(12); - } else if (bit.startsWith("zationColorId=")) { - zationColorId = Integer.parseInt(bit.substring(14)); + } else if (bit.startsWith("zation=")) { + String[] zation = bit.substring(7).split(":"); + if (zations == null) { + zations = Maps.newHashMap(); + } + + zations.put(zation[0], zation[1]); } } } catch (NumberFormatException nfe) { } if (width <= 0 || height <= 0 || tidx < 0) { - log.warning("Bogus sub-image dimensions [bundle=" + bundle + - ", path=" + path + ", dims=" + query + "]."); + log.warning("Bogus sub-image dimensions", + "bundle", bundle, "path", path, "dims", query); throw new FileNotFoundException(path); } @@ -185,17 +189,32 @@ public class Handler extends URLStreamHandler // return an input stream for that BufferedImage src = StringUtil.isBlank(bundle) ? _rmgr.getImageResource(path) : _rmgr.getImageResource(bundle, path); - Rectangle trect = GeomUtil.getTile( - src.getWidth(), src.getHeight(), width, height, tidx); - BufferedImage tile = src.getSubimage( - trect.x, trect.y, trect.width, trect.height); - if (zationClass != null && zationColorId >= 0) { - try { - ColorPository pository = ColorPository.loadColorPository(_rmgr); - Colorization zation = pository.getColorization(zationClass, zationColorId); - tile = ImageUtil.recolorImage(tile, zation.rootColor, zation.range, zation.offsets); - } catch (Exception e) { - log.warning("Trouble recoloring image in resource handler.", e); + Rectangle trect = GeomUtil.getTile(src.getWidth(), src.getHeight(), width, height, tidx); + BufferedImage tile = src.getSubimage(trect.x, trect.y, trect.width, trect.height); + if (zations != null) { + ColorPository pository = ColorPository.loadColorPository(_rmgr); + for (Map.Entry entry : zations.entrySet()) { + String zClass = entry.getKey(); + String zColor = entry.getValue(); + try { + Colorization zation = null; + + // First try looking if we got a number + try { + zation = pository.getColorization(zClass, Integer.parseInt(zColor)); + } catch (NumberFormatException nfe) { } + + // If that didn't work, try it as a zation name + if (zation == null) { + pository.getColorization(zClass, zColor); + } + + tile = ImageUtil.recolorImage( + tile, zation.rootColor, zation.range, zation.offsets); + } catch (Exception e) { + log.warning("Trouble recoloring image in resource handler", + "zClass", zClass, "zColor", zColor, e); + } } }