SVGImplementation.java
上传用户:haobig99
上传日期:2022-06-15
资源大小:369k
文件大小:8k
源码类别:

J2ME

开发平台:

Java

  1. /*
  2.  * Copyright 2008 Sun Microsystems, Inc.  All Rights Reserved.
  3.  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  4.  *
  5.  * This code is free software; you can redistribute it and/or modify it
  6.  * under the terms of the GNU General Public License version 2 only, as
  7.  * published by the Free Software Foundation.  Sun designates this
  8.  * particular file as subject to the "Classpath" exception as provided
  9.  * by Sun in the LICENSE file that accompanied this code.
  10.  *
  11.  * This code is distributed in the hope that it will be useful, but WITHOUT
  12.  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13.  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14.  * version 2 for more details (a copy is included in the LICENSE file that
  15.  * accompanied this code).
  16.  *
  17.  * You should have received a copy of the GNU General Public License version
  18.  * 2 along with this work; if not, write to the Free Software Foundation,
  19.  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20.  *
  21.  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  22.  * CA 95054 USA or visit www.sun.com if you need additional information or
  23.  * have any questions.
  24.  */
  25. package com.sun.lwuit.impl.midp;
  26. import com.sun.lwuit.Display;
  27. import com.sun.lwuit.Image;
  28. import com.sun.lwuit.util.Resources;
  29. import java.io.ByteArrayInputStream;
  30. import java.io.IOException;
  31. import java.io.InputStream;
  32. import javax.microedition.io.Connector;
  33. import javax.microedition.m2g.ExternalResourceHandler;
  34. import javax.microedition.m2g.SVGImage;
  35. import javax.microedition.m2g.ScalableGraphics;
  36. import javax.microedition.m2g.ScalableImage;
  37. import org.w3c.dom.Document;
  38. import org.w3c.dom.svg.SVGPoint;
  39. import org.w3c.dom.svg.SVGSVGElement;
  40. /**
  41.  * LWUIT Implementation based on game canvas that adds support for drawing
  42.  * SVG Images using JSR 226. To use this implementation class use
  43.  * SVGImplementation.init();
  44.  *
  45.  * @author Shai Almog
  46.  */
  47. public class SVGImplementation extends GameCanvasImplementation {
  48.     private static final String SVG_NAMESPACE = "http://www.w3.org/2000/svg";
  49.     private int id = 0;
  50.     private static int idCounter = 0;
  51.     /**
  52.      * @inheritDoc
  53.      */
  54.     public void getRGB(Object nativeImage, int[] arr, int offset, int x, int y, int width, int height) {
  55.         if(nativeImage instanceof ScalableImage) {
  56.             ScalableImage s = (ScalableImage)nativeImage;
  57.             ScalableGraphics svgGraphics = ScalableGraphics.createInstance();
  58.             int w = getImageWidth(nativeImage);
  59.             int h = getImageHeight(nativeImage);
  60.             javax.microedition.lcdui.Image i = javax.microedition.lcdui.Image.createImage(w, h);
  61.             javax.microedition.lcdui.Graphics gr = (javax.microedition.lcdui.Graphics)i.getGraphics();
  62.             svgGraphics.bindTarget(gr);
  63.             svgGraphics.render(0, 0, s);
  64.             svgGraphics.releaseTarget();
  65.             i.getRGB(arr, offset, width, x, y, width, height);
  66.         } else {
  67.             super.getRGB(nativeImage, arr, offset, x, y, width, height);
  68.         }
  69.     }
  70.     /**
  71.      * @inheritDoc
  72.      */
  73.     public Object scale(Object nativeImage, int width, int height) {
  74.         if(nativeImage instanceof ScalableImage) {
  75.             // this should return a clone but doesn't...
  76.             ScalableImage s = (ScalableImage)nativeImage;
  77.             s.setViewportWidth(width);
  78.             s.setViewportHeight(height);
  79.             return s;
  80.         }
  81.         return super.scale(nativeImage, width, height);
  82.     }
  83.     /**
  84.      * @inheritDoc
  85.      */
  86.     public boolean isOpaque(Image lwuitImage, Object nativeImage) {
  87.         if(nativeImage instanceof ScalableImage) {
  88.             return false;
  89.         }
  90.         return super.isOpaque(lwuitImage, nativeImage);
  91.     }
  92.     /**
  93.      * @inheritDoc
  94.      */
  95.     public int getImageWidth(Object i) {
  96.         if(i instanceof ScalableImage) {
  97.             return ((ScalableImage)i).getViewportWidth();
  98.         }
  99.         return super.getImageWidth(i);
  100.     }
  101.     /**
  102.      * @inheritDoc
  103.      */
  104.     public int getImageHeight(Object i) {
  105.         if(i instanceof ScalableImage) {
  106.             return ((ScalableImage)i).getViewportHeight();
  107.         }
  108.         return super.getImageHeight(i);
  109.     }
  110.     /**
  111.      * @inheritDoc
  112.      */
  113.     public boolean animateImage(Object nativeImage, long lastFrame) {
  114.         if(nativeImage instanceof SVGImage) {
  115.             SVGImage im = (SVGImage)nativeImage;
  116.             long currentTime = System.currentTimeMillis();
  117.             im.incrementTime((currentTime - lastFrame) / 1000.0f);
  118.             return true;
  119.         }
  120.         return false;
  121.     }
  122.     /**
  123.      * @inheritDoc
  124.      */
  125.     public void drawImage(Object graphics, Object img, int x, int y) {
  126.         if(img instanceof SVGImage) {
  127.             ScalableGraphics svgGraphics = ScalableGraphics.createInstance();
  128.             javax.microedition.lcdui.Graphics gr = (javax.microedition.lcdui.Graphics)graphics;
  129.             gr.setClip(x + gr.getClipX(), y + gr.getClipY(), gr.getClipWidth(), gr.getClipHeight());
  130.             svgGraphics.bindTarget(gr);
  131.             svgGraphics.render(x, y, (SVGImage)img);
  132.             svgGraphics.releaseTarget();
  133.         } else {
  134.             super.drawImage(graphics, img, x, y);
  135.         }
  136.     }
  137.     /**
  138.      * @inheritDoc
  139.      */
  140.     public Object getSVGDocument(Object svgImage) {
  141.         return getSVGElement((SVGImage)svgImage);
  142.     }
  143.     private SVGSVGElement getSVGElement(SVGImage im){
  144.         SVGSVGElement retVal = null;
  145.         Document dom = im.getDocument();
  146.         retVal = (SVGSVGElement)dom.getElementById(this.getClass().getName() + id);
  147.         if(retVal == null){
  148.             retVal = (SVGSVGElement) dom.createElementNS(SVG_NAMESPACE, "svg");
  149.             id = idCounter++;
  150.             retVal.setId(this.getClass().getName() + id);
  151.         }
  152.         return retVal;
  153.     }
  154.     /**
  155.      * @inheritDoc
  156.      */
  157.     public Object rotate(Object image, int degrees) {
  158.         if(image instanceof SVGImage) {
  159.             SVGSVGElement e = getSVGElement((SVGImage)image);
  160.             SVGPoint p = e.getCurrentTranslate();
  161.             p.setX(-getImageWidth(image) / 2);
  162.             p.setY(-getImageHeight(image) / 2);
  163.             e.setCurrentRotate(degrees);
  164.             p.setX(0);
  165.             p.setY(0);
  166.             return image;
  167.         }
  168.         return super.rotate(image, degrees);
  169.     }
  170.     /**
  171.      * @inheritDoc
  172.      */
  173.     public boolean isSVGSupported() {
  174.         return true;
  175.     }
  176.     /**
  177.      * Resolve a reference into the resource url
  178.      */
  179.     private InputStream openResURL(String url) throws IOException {
  180.         int pos = url.indexOf("!", 7);
  181.         Resources r = Resources.open(url.substring(6, pos));
  182.         return r.getData(url.substring(pos + 1));
  183.     }
  184.     class Handler implements ExternalResourceHandler {
  185.         private String baseURL;
  186.         public Handler(String baseURL) {
  187.             this.baseURL = baseURL;
  188.         }
  189.         public void requestResource(ScalableImage i, String a) {
  190.             InputStream s = null;
  191.             try {
  192.                 if(a.indexOf(':') > -1) {
  193.                     if(a.startsWith("res:")) {
  194.                         s = openResURL(a);
  195.                     } else {
  196.                         s = Connector.openInputStream(a);
  197.                     }
  198.                     i.requestCompleted(a, s);
  199.                 } else {
  200.                     if(baseURL != null && baseURL.indexOf(':') > -1) {
  201.                         String u = baseURL;
  202.                         if(!baseURL.endsWith("/")) {
  203.                             u += "/";
  204.                         }
  205.                         if(u.startsWith("res:")) {
  206.                             s = openResURL(u + a);
  207.                         } else {
  208.                             s = Connector.openInputStream(u + a);
  209.                         }
  210.                         i.requestCompleted(a, s);
  211.                     } else {
  212.                         s = Display.getInstance().getResourceAsStream(getClass(), a);
  213.                         i.requestCompleted(a, s);
  214.                     }
  215.                 }
  216.             } catch (IOException ex) {
  217.                 ex.printStackTrace();
  218.             } finally {
  219.                 try {
  220.                     s.close();
  221.                 } catch (Throwable ex) {
  222.                     ex.printStackTrace();
  223.                 }
  224.             }
  225.         }
  226.     }
  227.     /**
  228.      * @inheritDoc
  229.      */
  230.     public Object createSVGImage(final String baseURL, byte[] data) throws IOException {
  231.         ScalableImage instance = ScalableImage.createImage(new ByteArrayInputStream(data), new Handler(baseURL));
  232.         return instance;
  233.     }
  234. }