<?xml version="1.0" encoding="UTF-8"?>

<!--

   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

-->

<!-- ========================================================================= -->
<!-- author cam@mcc.id.au                                                      -->
<!-- version $Id$ -->
<!-- ========================================================================= -->

<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" "http://forrest.apache.org/dtd/document-v20.dtd">
<document>
  <header>
    <title>SVG 1.2 support</title>
  </header>

  <body>
    <p>
      This page details information atbout Batik’s implementation of
      features from SVG 1.2, <a href="site:svg12t">Tiny</a> and
      <a href="site:svg12">Full</a>.  Note that the information on
      this page is based on the code in the Subversion repository
      trunk.
    </p>

    <section id="dom3">
      <title>DOM Level 3</title>
      <p>
        DOM Level 3 <a href="site:dom3core">Core</a>,
        <a href="site:dom3ev">Events</a> and <a href="site:dom3xpath">XPath</a>
        are all supported.  These features are available regardless of whether
        the document has <code>version="1.1"</code> or
        <code>version="1.2"</code> set on the root <code>svg</code> element.
      </p>
      <p>
        There are a few issues with the DOM Level 3 Core implementation:
      </p>
      <ol>
        <li>
          The <code>Document.compareDocumentPosition</code> method does not give
          the correct result when used on DTD notation or entity nodes in the
          document.
        </li>
        <li>
          <code>Node.renameNode</code> always creates a new node and replaces
          the old node with it.  This is technically allowed, but sub-optimal.
        </li>
        <li>
          XML Schema information is never used.  Batik does not implement XML
          Schema, so any methods or attributes that would utilise or expose
          schema information (such as the <code>schemaTypeInfo</code> attribute
          on the <code>Attr</code> and <code>Element</code> interfaces) do not
          do so.
        </li>
        <li>
          <code>Document.normalizeDocument</code> ignores the
          <code>"entities"</code> parameter in the document’s
          <code>DOMConfiguration</code>.
        </li>
      </ol>

      <section id="dom3java">
        <title>Using DOM Level 3 functionality from Java</title>
        <p>
          JREs before 1.5 include the DOM Level 2 interfaces and this can cause
          problems when trying to use the DOM Level 3 versions of these same interface
          files (<code>org.w3c.dom.*</code>).  Though the concrete Batik DOM
          classes implement the DOM Level 3 functionality, you won’t be able to access
          those methods through the <code>org.w3c.dom</code> interfaces on these
          earlier JREs.
        </p>
        <p>
          There are two ways to overcome this problem. The first
          is to install the DOM Level 3 interfaces using the
          <a href="http://java.sun.com/j2se/1.4.2/docs/guide/standards/">Endorsed
            Standards Override Mechanism</a>. Copy the file
          <code>lib/xml-apis-ext.jar</code> into the endorsed standards override
          directory and the DOM Level 3 interfaces will be visible. You can then write
          code against them (for example, call <code>Document.renameNode</code>
          directly).  However, this will mean that other people cannot run or
          compile your code unless they have JRE 1.5 or later, or they have also
          installed the <code>xml-apis-ext.jar</code> in the same way.
        </p>
        <p>
          The second method, which requires less messing about with the JRE, is
          to cast your DOM objects to the concrete Batik DOM objects and call
          your DOM Level 3 methods directly on them. The Batik DOM classes are in the
          <code>org.apache.batik.dom</code> package. The classes named
          <code>Abstract*</code> implement the DOM interfaces, and also contain
          the DOM Level 3 methods. The advantage of this method is that for your code
          to compile and run in others’ environments, they need not install any
          jars with the endorsed standards overrides.
        </p>
        <p>
          Here is an example of using the second method to get access to DOM
          Level 3 specific methods:
        </p>
        <source>import org.apache.batik.dom.AbstractDocument;
import org.apache.batik.dom.svg.SVGDOMImplementation;

import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class C {
    public void f() {
        // Create a new SVG document
        DOMImplementation impl = SVGDOMImplementation.getDOMImplementation();
        Document doc = impl.createDocument("http://www.w3.org/2000/svg", "svg", null);

        // Create a 'g' element and append it to the root 'svg' element
        Element e = doc.createElementNS("http://www.w3.org/2000/svg", "g");
        doc.getDocumentElement().appendChild(e);

        // Cast the document object to org.apache.batik.dom.AbstractDocument,
        // so that DOM 3 methods will be guaranteed to be visible
        <strong>AbstractDocument document = (AbstractDocument) doc;</strong>

        // Now a DOM 3 method can be used
        <strong>document.renameNode(e, "http://www.w3.org/2000/svg", "text");</strong>
    }
}</source>

        <p>
          For cases where the DOM Level 3 versions of these interfaces contain
          constants that you wish to use, the constants have been copied into
          the Batik DOM classes. For example:
        </p>

        <source>import org.apache.batik.dom.AbstractNode;
import org.apache.batik.dom.svg.SVGDOMImplementation;

import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class C {
    public void f() {
        // Create a new SVG document
        DOMImplementation impl = SVGDOMImplementation.getDOMImplementation();
        Document doc = impl.createDocument("http://www.w3.org/2000/svg", "svg", null);

        // Create a 'g' element and append it to the root 'svg' element
        Element svg = doc.getDocumentElement();
        Element e = doc.createElementNS("http://www.w3.org/2000/svg", "g");
        svg.appendChild(e);

        AbstractNode n1 = (AbstractNode) svg;
        AbstractNode n2 = (AbstractNode) e;
        int position = n1.compareDocumentPosition(n2);
        if (position == <strong>AbstractNode.DOCUMENT_POSITION_PRECEDING</strong>
                      | <strong>AbstractNode.DOCUMENT_POSITION_CONTAINS</strong>) {
            System.out.println("The svg element contains the g element.");
        } else {
            System.out.println("Something is wrong!");
        }
    }
}</source>

        <p>
          Note that using these org.apache.batik.dom interfaces is only needed
          for the DOM Level 3 Core and Events interfaces. There were no earlier
          versions of the DOM XPath interfaces to conflict with, so these can be
          used directly (<code>org.w3c.dom.xpath</code>).
        </p>
        <p>
          Of course, none of this matters if you are just using the DOM 3
          functionality in ECMAScript, as the matter of interfaces is hidden
          from the scripting environment.
        </p>
      </section>
    </section>

    <section id="sxbl">
      <title>XML Binding Language for SVG (sXBL)</title>
      <p>
        sXBL is supported in documents with <code>version="1.2"</code>.  However,
        the following issues exist:
      </p>
      <ol>
        <li>
          sXBL cannot be used for
          <a href="http://www.w3.org/TR/2004/WD-SVG12-20041027/binding.html#sXBL-bindings-for-svg">SVG
            resources</a> or
          <a href="http://www.w3.org/TR/2004/WD-SVG12-20041027/binding.html#sXBL-bindings-for-visual-effects">visual
            effects</a>.
        </li>
        <li>
          The <code>traitDef</code> element is not implemented.
        </li>
        <li>
          The <a href="http://www.w3.org/TR/sXBL/#shadow0">handling of CSS</a>
          is probably not quite correct.
        </li>
      </ol>
      <p>
        Two content selector languages are supported: XPath 1.0 Patterns and the
        drastically reduced XPath subset. XPath Patterns is the default
        language. To change the language used to the XPath subset, put an
        attribute <code>batik:selectorLanguage="XPathSubset"</code> on the
        <code>xbl:content</code> element or on the <code>svg</code> document
        element. (The <code>batik</code> extension namespace prefix should be
        declared with
        <code>xmlns:batik="http://xml.apache.org/batik/ext"</code>.)
      </p>
      <p>
        Note that sXBL is likely to be dropped in favor of
        <a href="http://www.w3.org/TR/xbl2">XBL 2.0</a> in
        <a href="site:svg12">SVG 1.2 Full</a>.
      </p>
    </section>

    <section id="flowtext">
      <title>Flowing text and graphics</title>
      <p>
        The <code>flowRoot</code>, <code>flowRegion</code>,
        <code>flowDiv</code>, <code>flowPara</code>, <code>flowSpan</code>,
        <code>flowRegionBreak</code> and <code>flowLine</code> elements
        from <a href="site:svg12">SVG 1.2 Full</a>’s
        <a href="http://www.w3.org/TR/2004/WD-SVG12-20041027/flow.html">Flowing
          Text and Graphics</a> chapter are supported in documents with
        <code>version="1.2"</code>.
      </p>
      <p>
        The more recent <a href="site:svg12t">SVG 1.2 Tiny</a> draft specifies
        a different syntax for (a more restricted version of) flowing text,
        and the full flowing text syntax is therefore likely to change.
      </p>
    </section>

    <section id="other">
      <title>Other SVG 1.2 features</title>
      <p>
        The following other features from SVG 1.2 are supported:
      </p>
      <ul>
        <li>
          the <a href="http://www.w3.org/TR/SVGMobile12/painting.html#SolidColorElement"><code>solidColor</code>
            paint server element,</a>
        </li>
        <li>
          the <code>multiImage</code>, <code>subImageRef</code> and
          <code>subImage</code> elements for
          <a href="http://www.w3.org/TR/2004/WD-SVG12-20041027/media.html#multires">Alternate
            content based on display resolutions</a>,
        </li>
        <li>
          the XML Events
          <a href="http://www.w3.org/TR/SVGMobile12/script.html#HandlerElement"><code>handler</code>
            element</a>,
        </li>
        <li>
          self-contained
          <a href="http://www.w3.org/TR/2004/WD-SVG12-20041027/nonvisual.html#external-references">resource
            documents</a>,
        </li>
        <li>
          the mouse
          <a href="http://www.w3.org/TR/2004/WD-SVG12-20041027/dom.html#wheelevent">wheel
            event</a> (which is likely to be superseded by a similar event
          developed by the W3C WebAPI WG),
        </li>
        <li>
          the
          <a href="http://www.w3.org/TR/2004/WD-SVG12-20041027/dom.html#shapemod">ShapeChange
            and RenderedBBoxChange events</a> (though the
          <code>boundingBox</code> attribute of the RenderedBBoxChange event is not
          used), and
        </li>
        <li>
          the <code>startMouseCapture</code> and <code>stopMouseCapture</code>
          methods on the
          <a href="http://www.w3.org/TR/2004/WD-SVG12-20041027/api.html#GlobalObject">global
            object</a>.
        </li>
      </ul>
    </section>
  </body>
</document>
