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

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;
  26. import com.sun.lwuit.animations.Animation;
  27. import java.io.IOException;
  28. import java.io.InputStream;
  29. import javax.microedition.m2g.ScalableGraphics;
  30. import org.w3c.dom.Document;
  31. import org.w3c.dom.svg.SVGPoint;
  32. import org.w3c.dom.svg.SVGSVGElement;
  33. /**
  34.  * Represents a JSR 226 image using the standard Image API, just like other images
  35.  * in LWUIT this image can be animated. All features of JSR 226 may be accessed 
  36.  * in this image using the standard DOM API.
  37.  *
  38.  * @deprecated Use the SVGImplementationFactory with standard LWUIT Image.createSVG
  39.  * @author Chen Fishbein
  40.  */
  41. public class SVGImage extends Image implements Animation {
  42.     private javax.microedition.m2g.SVGImage im;
  43.     private static final String SVG_NAMESPACE = "http://www.w3.org/2000/svg";
  44.     private boolean animated;
  45.     private long startTime = -1;
  46.     private int id = 0;
  47.     private static int idCounter = 0;
  48.     private static final boolean IS_SUPPORTED;
  49.     static {
  50.         boolean supported = false;
  51.         try {
  52.             Class.forName("javax.microedition.m2g.SVGImage");
  53.             supported = true;
  54.         } catch (Throwable t) {
  55.         }
  56.         IS_SUPPORTED = supported;
  57.     }
  58.     
  59.     SVGImage(javax.microedition.m2g.SVGImage im, boolean animated) {
  60.         super(null);
  61.         this.im = im;
  62.         this.animated = animated;
  63.     }
  64.     /**
  65.      * Create an SVG image
  66.      * 
  67.      * @param stream source stream
  68.      * @param animated whether SVG animations should be supported
  69.      * @return an SVG image
  70.      * @throws java.io.IOException when the stream throws an exception
  71.      */
  72.     public static Image createSVGImage(InputStream stream, boolean animated) throws IOException {
  73.         SVGImage instance = new SVGImage((javax.microedition.m2g.SVGImage) javax.microedition.m2g.SVGImage.createImage(stream, null), animated);
  74.         return instance;
  75.     }
  76.     /**
  77.      * Create an SVG image
  78.      * 
  79.      * @param url source url
  80.      * @param animated whether SVG animations should be supported
  81.      * @return an SVG image
  82.      * @throws java.io.IOException when the stream throws an exception
  83.      */
  84.     public static Image createSVGImage(java.lang.String url, boolean animated) throws IOException {
  85.         return createSVGImage(Display.getInstance().getResourceAsStream(SVGImage.class, url), animated);
  86.     }
  87.     /**
  88.      * @inheritDoc
  89.      */
  90.     public int getWidth() {
  91.         return im.getViewportWidth();
  92.     }
  93.     /**
  94.      * @inheritDoc
  95.      */
  96.     public int getHeight() {
  97.         return im.getViewportHeight();
  98.     }
  99.     /**
  100.      * @inheritDoc
  101.      */
  102.     protected void drawImage(Graphics g, Object nativeGraphics, int x, int y) {
  103.         ScalableGraphics svgGraphics = ScalableGraphics.createInstance();
  104.         javax.microedition.lcdui.Graphics gr = (javax.microedition.lcdui.Graphics)nativeGraphics;
  105.         gr.setClip(g.getTranslateX() + g.getClipX(), g.getTranslateY() + g.getClipY(), g.getClipWidth(), g.getClipHeight());
  106.         svgGraphics.bindTarget(gr);
  107.         svgGraphics.render(x + g.getTranslateX(), y + g.getTranslateY(), im);
  108.         svgGraphics.releaseTarget();
  109.     }
  110.     /**
  111.      * @inheritDoc
  112.      */
  113.     public Image scaled(int width, int height) {
  114.         im.setViewportWidth(width);
  115.         im.setViewportHeight(height);
  116.         return this;
  117.     }
  118.     /**
  119.      * @inheritDoc
  120.      */
  121.     public Image rotate(int degrees) {
  122.         SVGSVGElement e = getSVGElement();
  123.         SVGPoint p = e.getCurrentTranslate();
  124.         p.setX(-getWidth()/2);
  125.         p.setY(-getHeight()/2);
  126.         e.setCurrentRotate(degrees);
  127.         p.setX(0);
  128.         p.setY(0);        
  129.         return this;
  130.     }
  131.     
  132.     /**
  133.      * Get the SVG document object for DOM manipulation
  134.      * 
  135.      * @return the SVG document
  136.      */
  137.     public Document getDocument(){
  138.         return im.getDocument();
  139.     }
  140.     
  141.     private SVGSVGElement getSVGElement(){
  142.         SVGSVGElement retVal = null;
  143.         Document dom = im.getDocument();
  144.         retVal = (SVGSVGElement)dom.getElementById(this.getClass().getName() + id);
  145.         if(retVal == null){
  146.             retVal = (SVGSVGElement) dom.createElementNS(SVG_NAMESPACE, "svg");
  147.             id = idCounter++;
  148.             retVal.setId(this.getClass().getName() + id);
  149.         }
  150.         return retVal;
  151.     }
  152.     /**
  153.      * @inheritDoc
  154.      */
  155.     public boolean animate() {
  156.         long currentTime = System.currentTimeMillis();
  157.         //if this is the first time init the start time.
  158.         if (startTime == -1) {
  159.             startTime = currentTime;
  160.         }
  161.         im.incrementTime((currentTime - startTime) / 1000.0f);
  162.         startTime = currentTime;
  163.         return animated;
  164.     }
  165.     /**
  166.      * @inheritDoc
  167.      */
  168.     public void paint(Graphics g) {
  169.     }
  170.     /**
  171.      * @inheritDoc
  172.      */
  173.     public boolean isAnimation() {
  174.         return true;
  175.     }
  176.     
  177.     /**
  178.      * Returns true if the platform supports SVG
  179.      * 
  180.      * @return true if this platform supports SVG, false otherwise
  181.      */
  182.     public static boolean isSupported() {
  183.         return IS_SUPPORTED;
  184.     }
  185. }