diff options
author | kitfox | 2010-08-07 11:59:11 +0200 |
---|---|---|
committer | kitfox | 2010-08-07 11:59:11 +0200 |
commit | 2d39fa7f95efb645d2ae704524d91db7899274ef (patch) | |
tree | 1a5f269e68c4ac6b76dcbaa516753e905ff6c303 /src/main | |
parent | Added versioning info for compiled jars. (diff) | |
download | svg-salamander-core-2d39fa7f95efb645d2ae704524d91db7899274ef.tar.gz svg-salamander-core-2d39fa7f95efb645d2ae704524d91db7899274ef.tar.xz svg-salamander-core-2d39fa7f95efb645d2ae704524d91db7899274ef.zip |
Added support for inline images.
git-svn-id: https://svn.java.net/svn/svgsalamander~svn/trunk/svg-core@79 7dc7fa77-23fb-e6ad-8e2e-c86bd48ed22b
Diffstat (limited to 'src/main')
-rw-r--r-- | src/main/java/com/kitfox/svg/ImageSVG.java | 19 | ||||
-rw-r--r-- | src/main/java/com/kitfox/svg/SVGUniverse.java | 57 | ||||
-rw-r--r-- | src/main/java/com/kitfox/svg/app/data/Handler.java | 76 | ||||
-rw-r--r-- | src/main/java/com/kitfox/svg/app/data/HandlerFactory.java | 27 |
4 files changed, 171 insertions, 8 deletions
diff --git a/src/main/java/com/kitfox/svg/ImageSVG.java b/src/main/java/com/kitfox/svg/ImageSVG.java index f8d3a54..e2fb168 100644 --- a/src/main/java/com/kitfox/svg/ImageSVG.java +++ b/src/main/java/com/kitfox/svg/ImageSVG.java @@ -27,6 +27,7 @@ package com.kitfox.svg;
+import com.kitfox.svg.app.data.Handler;
import com.kitfox.svg.xml.*;
import java.awt.*;
@@ -79,13 +80,20 @@ public class ImageSVG extends RenderableElement if (getPres(sty.setName("xlink:href")))
{
URI src = sty.getURIValue(getXMLBase());
- try {
- imageSrc = src.toURL();
+ if ("data".equals(src.getScheme()))
+ {
+ imageSrc = new URL(null, src.toASCIIString(), new Handler());
}
- catch (Exception e)
+ else
{
- e.printStackTrace();
- imageSrc = null;
+ try {
+ imageSrc = src.toURL();
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ imageSrc = null;
+ }
}
}
}
@@ -94,7 +102,6 @@ public class ImageSVG extends RenderableElement throw new SVGException(e);
}
-
diagram.getUniverse().registerImage(imageSrc);
//Set widths if not set
diff --git a/src/main/java/com/kitfox/svg/SVGUniverse.java b/src/main/java/com/kitfox/svg/SVGUniverse.java index 8fdf19d..f99279b 100644 --- a/src/main/java/com/kitfox/svg/SVGUniverse.java +++ b/src/main/java/com/kitfox/svg/SVGUniverse.java @@ -35,6 +35,7 @@ import java.beans.PropertyChangeSupport; import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
+import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
@@ -51,7 +52,6 @@ import java.util.HashMap; import java.util.Iterator;
import java.util.zip.GZIPInputStream;
import javax.imageio.ImageIO;
-import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
@@ -173,7 +173,60 @@ public class SVGUniverse implements Serializable {
return (Font)loadedFonts.get(fontName);
}
-
+
+ URL registerImage(URI imageURI)
+ {
+ String scheme = imageURI.getScheme();
+ if (scheme.equals("data"))
+ {
+ String path = imageURI.getRawSchemeSpecificPart();
+ int idx = path.indexOf(';');
+ String mime = path.substring(0, idx);
+ String content = path.substring(idx + 1);
+
+ if (content.startsWith("base64"))
+ {
+ content = content.substring(6);
+ try {
+ byte[] buf = new sun.misc.BASE64Decoder().decodeBuffer(content);
+ ByteArrayInputStream bais = new ByteArrayInputStream(buf);
+ BufferedImage img = ImageIO.read(bais);
+
+ URL url;
+ int urlIdx = 0;
+ while (true)
+ {
+ url = new URL("inlineImage", "localhost", "img" + urlIdx);
+ if (!loadedImages.containsKey(url))
+ {
+ break;
+ }
+ urlIdx++;
+ }
+
+ SoftReference ref = new SoftReference(img);
+ loadedImages.put(url, ref);
+
+ return url;
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ }
+ return null;
+ }
+ else
+ {
+ try {
+ URL url = imageURI.toURL();
+ registerImage(url);
+ return url;
+ } catch (MalformedURLException ex) {
+ ex.printStackTrace();
+ }
+ return null;
+ }
+ }
+
void registerImage(URL imageURL)
{
if (loadedImages.containsKey(imageURL)) return;
diff --git a/src/main/java/com/kitfox/svg/app/data/Handler.java b/src/main/java/com/kitfox/svg/app/data/Handler.java new file mode 100644 index 0000000..9cd3525 --- /dev/null +++ b/src/main/java/com/kitfox/svg/app/data/Handler.java @@ -0,0 +1,76 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package com.kitfox.svg.app.data; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.net.URLStreamHandler; + +/** + * + * @author kitfox + */ +public class Handler extends URLStreamHandler +{ + class Connection extends URLConnection + { + String mime; + byte[] buf; + + public Connection(URL url) + { + super(url); + + String path = url.getPath(); + int idx = path.indexOf(';'); + mime = path.substring(0, idx); + String content = path.substring(idx + 1); + + if (content.startsWith("base64,")) + { + content = content.substring(7); + try { + buf = new sun.misc.BASE64Decoder().decodeBuffer(content); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + } + + public void connect() throws IOException + { + } + + public String getHeaderField(String name) + { + if ("content-type".equals(name)) + { + return mime; + } + + return super.getHeaderField(name); + } + + public InputStream getInputStream() throws IOException + { + return new ByteArrayInputStream(buf); + } + +// public Object getContent() throws IOException +// { +// BufferedImage img = ImageIO.read(getInputStream()); +// } + } + + protected URLConnection openConnection(URL u) throws IOException + { + return new Connection(u); + } + +} diff --git a/src/main/java/com/kitfox/svg/app/data/HandlerFactory.java b/src/main/java/com/kitfox/svg/app/data/HandlerFactory.java new file mode 100644 index 0000000..e1ed1b5 --- /dev/null +++ b/src/main/java/com/kitfox/svg/app/data/HandlerFactory.java @@ -0,0 +1,27 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package com.kitfox.svg.app.data; + +import java.net.URLStreamHandler; +import java.net.URLStreamHandlerFactory; + +/** + * + * @author kitfox + */ +public class HandlerFactory implements URLStreamHandlerFactory +{ + static Handler handler = new Handler(); + + public URLStreamHandler createURLStreamHandler(String protocol) + { + if ("data".equals(protocol)) + { + return handler; + } + return null; + } +} |