You are viewing a plain text version of this content. The canonical link for it is here.
Posted to batik-dev@xmlgraphics.apache.org by hi...@apache.org on 2001/03/26 10:53:31 UTC

cvs commit: xml-batik/sources/org/apache/batik/parser DefaultFragmentIdentifierHandler.java FragmentIdentifierHandler.java FragmentIdentifierParser.java

hillion     01/03/26 00:53:30

  Modified:    sources/org/apache/batik/parser
                        DefaultFragmentIdentifierHandler.java
                        FragmentIdentifierHandler.java
                        FragmentIdentifierParser.java
  Log:
  Completed fragment identifier parser.
  
  Revision  Changes    Path
  1.2       +93 -3     xml-batik/sources/org/apache/batik/parser/DefaultFragmentIdentifierHandler.java
  
  Index: DefaultFragmentIdentifierHandler.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/parser/DefaultFragmentIdentifierHandler.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- DefaultFragmentIdentifierHandler.java	2001/02/02 08:04:47	1.1
  +++ DefaultFragmentIdentifierHandler.java	2001/03/26 08:53:29	1.2
  @@ -12,7 +12,7 @@
    * This class provides an adapter for FragmentIdentifierHandler.
    *
    * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
  - * @version $Id: DefaultFragmentIdentifierHandler.java,v 1.1 2001/02/02 08:04:47 hillion Exp $
  + * @version $Id: DefaultFragmentIdentifierHandler.java,v 1.2 2001/03/26 08:53:29 hillion Exp $
    */
   public class DefaultFragmentIdentifierHandler
       extends DefaultPreserveAspectRatioHandler
  @@ -43,7 +43,6 @@
        *                           fragment identifier
        */
       public void idReference(String s) throws ParseException {
  -
       }
   
       /**
  @@ -54,17 +53,108 @@
        */
       public void viewBox(float x, float y, float width, float height)
           throws ParseException {
  +    }
   
  +    /**
  +     * Invoked when a view target specification starts.
  +     * @exception ParseException if an error occured while processing the
  +     *                           fragment identifier
  +     */
  +    public void startViewTarget() throws ParseException {
       }
   
       /**
  -     * Invoked when 'viewTarget(name)' has been parsed.
  +     * Invoked when a view target component has been parsed.
        * @param name the target name.
        * @exception ParseException if an error occured while processing the
        *                           fragment identifier
        */
       public void viewTarget(String name) throws ParseException {
  +    }
  +
  +    /**
  +     * Invoked when a view target specification ends.
  +     * @exception ParseException if an error occured while processing the
  +     *                           fragment identifier
  +     */
  +    public void endViewTarget() throws ParseException {
  +    }
   
  +    /**
  +     * Implements {@link TransformListHandler#startTransformList()}.
  +     */
  +    public void startTransformList() throws ParseException {
  +    }
  +
  +    /**
  +     * Implements {@link
  +     * TransformListHandler#matrix(float,float,float,float,float,float)}.
  +     */
  +    public void matrix(float a, float b, float c, float d, float e, float f)
  +	throws ParseException {
  +    }
  +
  +    /**
  +     * Implements {@link TransformListHandler#rotate(float)}.
  +     */
  +    public void rotate(float theta) throws ParseException {
  +    }
  +
  +    /**
  +     * Implements {@link TransformListHandler#rotate(float,float,float)}.
  +     */
  +    public void rotate(float theta, float cx, float cy) throws ParseException {
  +    }
  +
  +    /**
  +     * Implements {@link TransformListHandler#translate(float)}.
  +     */
  +    public void translate(float tx) throws ParseException {
  +    }
  +
  +    /**
  +     * Implements {@link TransformListHandler#translate(float,float)}.
  +     */
  +    public void translate(float tx, float ty) throws ParseException {
  +    }
  +
  +    /**
  +     * Implements {@link TransformListHandler#scale(float)}.
  +     */
  +    public void scale(float sx) throws ParseException {
  +    }
  +
  +    /**
  +     * Implements {@link TransformListHandler#scale(float,float)}.
  +     */
  +    public void scale(float sx, float sy) throws ParseException {
  +    }
  +
  +    /**
  +     * Implements {@link TransformListHandler#skewX(float)}.
  +     */
  +    public void skewX(float skx) throws ParseException {
  +    }
  +
  +    /**
  +     * Implements {@link TransformListHandler#skewY(float)}.
  +     */
  +    public void skewY(float sky) throws ParseException {
  +    }
  +
  +    /**
  +     * Implements {@link TransformListHandler#endTransformList()}.
  +     */
  +    public void endTransformList() throws ParseException {
  +    }
  +
  +    /**
  +     * Invoked when a 'zoomAndPan' specification has been parsed.
  +     * @param magnify true if 'magnify' has been parsed.
  +     * @exception ParseException if an error occured while processing the
  +     *                           fragment identifier
  +     */
  +    public void zoomAndPan(boolean magnify) {
       }
   
       /**
  
  
  
  1.3       +29 -3     xml-batik/sources/org/apache/batik/parser/FragmentIdentifierHandler.java
  
  Index: FragmentIdentifierHandler.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/parser/FragmentIdentifierHandler.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- FragmentIdentifierHandler.java	2001/02/02 08:04:47	1.2
  +++ FragmentIdentifierHandler.java	2001/03/26 08:53:29	1.3
  @@ -14,9 +14,12 @@
    * in order to be notified of parsing events.
    *
    * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
  - * @version $Id: FragmentIdentifierHandler.java,v 1.2 2001/02/02 08:04:47 hillion Exp $
  + * @version $Id: FragmentIdentifierHandler.java,v 1.3 2001/03/26 08:53:29 hillion Exp $
    */
  -public interface FragmentIdentifierHandler extends PreserveAspectRatioHandler {
  +public interface FragmentIdentifierHandler
  +    extends PreserveAspectRatioHandler,
  +            TransformListHandler {
  +
       /**
        * Invoked when the fragment identifier starts.
        * @exception ParseException if an error occured while processing the
  @@ -41,13 +44,36 @@
       void viewBox(float x, float y, float width, float height)
           throws ParseException;
   
  +    /**
  +     * Invoked when a view target specification starts.
  +     * @exception ParseException if an error occured while processing the
  +     *                           fragment identifier
  +     */
  +    void startViewTarget() throws ParseException;
  +
       /**
  -     * Invoked when 'viewTarget(name)' has been parsed.
  +     * Invoked when a identifier has been parsed within a view target
  +     * specification.
        * @param name the target name.
        * @exception ParseException if an error occured while processing the
        *                           fragment identifier
        */
       void viewTarget(String name) throws ParseException;
  +
  +    /**
  +     * Invoked when a view target specification ends.
  +     * @exception ParseException if an error occured while processing the
  +     *                           fragment identifier
  +     */
  +    void endViewTarget() throws ParseException;
  +
  +    /**
  +     * Invoked when a 'zoomAndPan' specification has been parsed.
  +     * @param magnify true if 'magnify' has been parsed.
  +     * @exception ParseException if an error occured while processing the
  +     *                           fragment identifier
  +     */
  +    void zoomAndPan(boolean magnify);
   
       /**
        * Invoked when the fragment identifier ends.
  
  
  
  1.3       +1399 -53  xml-batik/sources/org/apache/batik/parser/FragmentIdentifierParser.java
  
  Index: FragmentIdentifierParser.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/parser/FragmentIdentifierParser.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- FragmentIdentifierParser.java	2001/02/02 08:04:47	1.2
  +++ FragmentIdentifierParser.java	2001/03/26 08:53:29	1.3
  @@ -17,9 +17,9 @@
    * fragment identifiers.
    *
    * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
  - * @version $Id: FragmentIdentifierParser.java,v 1.2 2001/02/02 08:04:47 hillion Exp $
  + * @version $Id: FragmentIdentifierParser.java,v 1.3 2001/03/26 08:53:29 hillion Exp $
    */
  -public class FragmentIdentifierParser extends PreserveAspectRatioParser {
  +public class FragmentIdentifierParser extends AbstractParser {
       
       /**
        * The buffer used for numbers.
  @@ -32,10 +32,15 @@
       protected int bufferSize;
   
       /**
  +     * The FragmentIdentifierHandler.
  +     */
  +    protected FragmentIdentifierHandler fragmentIdentifierHandler;
  +
  +    /**
        * Creates a new FragmentIdentifier parser.
        */
       public FragmentIdentifierParser() {
  -        preserveAspectRatioHandler =
  +        fragmentIdentifierHandler =
               DefaultFragmentIdentifierHandler.INSTANCE;
       }
   
  @@ -51,21 +56,14 @@
        * @param handler The transform list handler.
        */
       public void setFragmentIdentifierHandler(FragmentIdentifierHandler handler) {
  -        preserveAspectRatioHandler = handler;
  +        fragmentIdentifierHandler = handler;
       }
   
       /**
        * Returns the points handler in use.
  -     */
  -    public FragmentIdentifierHandler getFragmentIdentfierHandler() {
  -        return (FragmentIdentifierHandler)preserveAspectRatioHandler;
  -    }
  -
  -    /**
  -     * Returns the current handler.
        */
  -    protected FragmentIdentifierHandler getFragmentIdentifierHandler() {
  -        return (FragmentIdentifierHandler)preserveAspectRatioHandler;
  +    public FragmentIdentifierHandler getFragmentIdentifierHandler() {
  +        return fragmentIdentifierHandler;
       }
   
       /**
  @@ -73,18 +71,17 @@
        */
       public void parse(Reader r) throws ParseException {
   	initialize(r);
  -
  +        inputBuffer.setMark();
  +                
   	read();
   
  -        getFragmentIdentfierHandler().startFragmentIdentifier();
  +        fragmentIdentifierHandler.startFragmentIdentifier();
   
           ident: {
               String id = null;
   
               switch (current) {
               case 'x':
  -                inputBuffer.setMark();
  -
                   read();
                   if (current != 'p') {
                       parseIdentifier();
  @@ -106,11 +103,6 @@
                       break;
                   }
                   read();
  -                if (current != 'o') {
  -                    parseIdentifier();
  -                    break;
  -                }
  -                read();
                   if (current != 't') {
                       parseIdentifier();
                       break;
  @@ -151,14 +143,15 @@
                                                  new Integer(current) });
                       break ident;
                   }
  -                read();
                   inputBuffer.resetMark();
  +                read();
                   parseIdentifier();
   
                   char[] c = new char[inputBuffer.contentSize()];
                   inputBuffer.readContent(c);
   
  -                id = new String(c);
  +                id = new String(c, 0, c.length - 2);
  +                fragmentIdentifierHandler.idReference(id);
   
                   if (current != ')') {
                       reportError("character.expected",
  @@ -171,11 +164,10 @@
                       reportError("character.expected",
                                   new Object[] { new Character(')'),
                                                  new Integer(current) });
  -                    break ident;
                   }
  -                break;
  +                break ident;
  +
               case 's':
  -                inputBuffer.setMark();
   
                   read();
                   if (current != 'v') {
  @@ -221,7 +213,7 @@
   
                   if (current != ')') {
                       reportError("character.expected",
  -                                new Object[] { new Character('('),
  +                                new Object[] { new Character(')'),
                                                  new Integer(current) });
                   }
                   break ident;
  @@ -230,31 +222,45 @@
                       !XMLUtilities.isXMLNameFirstCharacter((char)current)) {
                       break ident;
                   }
  -                inputBuffer.setMark();
                   read();
                   parseIdentifier();
  -                c = new char[inputBuffer.contentSize()];
  -                inputBuffer.readContent(c);
  -
  -                id = new String(c);
               }
  -            getFragmentIdentfierHandler().idReference(id);
  +            char[] c = new char[inputBuffer.contentSize()];
  +            inputBuffer.readContent(c);
  +
  +            id = new String(c);
  +            fragmentIdentifierHandler.idReference(id);
           }
   
  -        getFragmentIdentfierHandler().endFragmentIdentifier();
  +        fragmentIdentifierHandler.endFragmentIdentifier();
       }
   
       /**
        * Parses the svgView attributes.
        */
       protected void parseViewAttributes() throws ParseException {
  +        boolean first = true;
           loop: for (;;) {
               switch (current) {
               case -1:
               case ')':
  +                if (first) {
  +                    reportError("character.unexpected",
  +                                new Object[] { new Integer(current) });
  +                    break loop;
  +                }
               default:
                   break loop;
  +            case ';':
  +                if (first) {
  +                    reportError("character.unexpected",
  +                                new Object[] { new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                break;
               case 'v':
  +                first = false;
                   read();
                   if (current != 'i') {
                       reportError("character.expected",
  @@ -277,59 +283,594 @@
                       break loop;
                   }
                   read();
  -                if (current != 'B') {
  +
  +                switch (current) {
  +                case 'B':
  +                    read();
  +                    if (current != 'o') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character('o'),
  +                                                   new Integer(current) });
  +                        break loop;
  +                    }
  +                    read();
  +                    if (current != 'x') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character('x'),
  +                                                   new Integer(current) });
  +                        break loop;
  +                    }
  +                    read();
  +                    if (current != '(') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character('('),
  +                                                   new Integer(current) });
  +                        break loop;
  +                    }
  +                    read();
  +
  +                    float x = parseFloat();
  +                    if (current != ',') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character(','),
  +                                                   new Integer(current) });
  +                        break loop;
  +                    }
  +                    read();
  +                    
  +                    float y = parseFloat();
  +                    if (current != ',') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character(','),
  +                                                   new Integer(current) });
  +                        break loop;
  +                    }
  +                    read();
  +                    
  +                    float w = parseFloat();
  +                    if (current != ',') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character(','),
  +                                                   new Integer(current) });
  +                        break loop;
  +                    }
  +                    read();
  +                    
  +                    float h = parseFloat();
  +                    if (current != ')') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character(')'),
  +                                                   new Integer(current) });
  +                        break loop;
  +                    }
  +                    read();
  +                    fragmentIdentifierHandler.viewBox(x, y, w, h);
  +                    if (current != ')' && current != ';') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character(')'),
  +                                                   new Integer(current) });
  +                        break loop;
  +                    }
  +                    break;
  +
  +                case 'T':
  +                    read();
  +                    if (current != 'a') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character('a'),
  +                                                   new Integer(current) });
  +                        break loop;
  +                    }
  +                    read();
  +                    if (current != 'r') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character('r'),
  +                                                   new Integer(current) });
  +                        break loop;
  +                    }
  +                    read();
  +                    if (current != 'g') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character('g'),
  +                                                   new Integer(current) });
  +                        break loop;
  +                    }
  +                    read();
  +                    if (current != 'e') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character('e'),
  +                                                   new Integer(current) });
  +                        break loop;
  +                    }
  +                    read();
  +                    if (current != 't') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character('t'),
  +                                                   new Integer(current) });
  +                        break loop;
  +                    }
  +                    read();
  +                    if (current != '(') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character('('),
  +                                                   new Integer(current) });
  +                        break loop;
  +                    }
  +                    inputBuffer.setMark();
  +                    read();
  +
  +                    fragmentIdentifierHandler.startViewTarget();
  +
  +                    id: for (;;) {
  +                        if (current == -1 ||
  +                            !XMLUtilities.isXMLNameFirstCharacter((char)current)) {
  +                            reportError("character.unexpected",
  +                                        new Object[] { new Integer(current) });
  +                            break loop;
  +                        }
  +                        read();
  +                        parseIdentifier();
  +                        char[] c = new char[inputBuffer.contentSize()];
  +                        inputBuffer.readContent(c);
  +                        String s = new String(c, 0, c.length - 2);
  +
  +                        fragmentIdentifierHandler.viewTarget(s);
  +
  +                        inputBuffer.resetMark();
  +                        switch (current) {
  +                        case ')':
  +                            read();
  +                            break id;
  +                        case ',':
  +                        case ';':
  +                            read();
  +                            break;
  +                        default:
  +                            reportError("character.unexpected",
  +                                        new Object[] { new Integer(current) });
  +                            break loop;
  +                        }
  +                    }
  +                    inputBuffer.unsetMark();
  +
  +                    fragmentIdentifierHandler.endViewTarget();
  +                    break;
  +
  +                default:
  +                    reportError("character.unexpected",
  +                                new Object[] { new Integer(current) });
  +                    break loop;
  +                }
  +                break;
  +            case 'p':
  +                first = false;
  +                read();
  +                if (current != 'r') {
                       reportError("character.expected",
  -                                new Object[] { new Character('B'),
  +                                new Object[] { new Character('r'),
                                                  new Integer(current) });
                       break loop;
                   }
                   read();
  -                if (current != 'o') {
  +                if (current != 'e') {
                       reportError("character.expected",
  -                                new Object[] { new Character('o'),
  +                                new Object[] { new Character('e'),
                                                  new Integer(current) });
                       break loop;
                   }
                   read();
  -                if (current != 'x') {
  +                if (current != 's') {
                       reportError("character.expected",
  -                                new Object[] { new Character('x'),
  +                                new Object[] { new Character('s'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 'e') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('e'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 'r') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('r'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 'v') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('v'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 'e') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('e'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 'A') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('A'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 's') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('s'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 'p') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('p'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 'e') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('e'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 'c') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('c'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 't') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('t'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 'R') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('R'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 'a') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('a'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 't') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('t'),
                                                  new Integer(current) });
                       break loop;
                   }
                   read();
  +                if (current != 'i') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('i'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 'o') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('o'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
                   if (current != '(') {
                       reportError("character.expected",
                                   new Object[] { new Character('('),
                                                  new Integer(current) });
                       break loop;
                   }
  +                read();
  +
  +                parsePreserveAspectRatio();
   
  -                float x = parseFloat();
  -                if (current != ',') {
  +                if (current != ')') {
                       reportError("character.expected",
  -                                new Object[] { new Character(','),
  +                                new Object[] { new Character(')'),
                                                  new Integer(current) });
                       break loop;
                   }
  +                read();
  +                break;
   
  -                float y = parseFloat();
  -                if (current != ',') {
  +            case 't':
  +                first = false;
  +                read();
  +                if (current != 'r') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('r'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 'a') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('a'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 'n') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('n'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 's') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('s'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 'f') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('f'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 'o') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('o'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 'r') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('r'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 'm') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('m'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != '(') {
                       reportError("character.expected",
  -                                new Object[] { new Character(','),
  +                                new Object[] { new Character('('),
                                                  new Integer(current) });
                       break loop;
                   }
  +
  +                fragmentIdentifierHandler.startTransformList();
  +
  +                tloop: for (;;) {
  +                    read();
  +                    switch (current) {
  +                    case ';':
  +                    case ',':
  +                        break;
  +                    case 'm':
  +                        parseMatrix();
  +                        break;
  +                    case 'r':
  +                        parseRotate();
  +                        break;
  +                    case 't':
  +                        parseTranslate();
  +                        break;
  +                    case 's':
  +                        read();
  +                        switch (current) {
  +                        case 'c':
  +                            parseScale();
  +                            break;
  +                        case 'k':
  +                            parseSkew();
  +                            break;
  +                        default:
  +                            reportError("character.unexpected",
  +                                        new Object[] { new Integer(current) });
  +                            skipTransform();
  +                        }
  +                        break;
  +                    default:
  +                        break tloop;
  +                    }
  +                }
  +
  +                fragmentIdentifierHandler.endTransformList();
  +                break;
   
  -                float w = parseFloat();
  -                if (current != ',') {
  +            case 'z':
  +                first = false;
  +                read();
  +                if (current != 'o') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('o'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 'o') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('o'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 'm') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('m'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 'A') {
                       reportError("character.expected",
  -                                new Object[] { new Character(','),
  +                                new Object[] { new Character('A'),
                                                  new Integer(current) });
                       break loop;
                   }
  +                read();
  +                if (current != 'n') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('n'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 'd') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('d'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 'P') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('P'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 'a') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('a'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 'n') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('n'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != '(') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('('),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +
  +                switch (current) {
  +                case 'm':
  +                    read();
  +                    if (current != 'a') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character('a'),
  +                                                   new Integer(current) });
  +                        break loop;
  +                    }
  +                    read();
  +                    if (current != 'g') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character('g'),
  +                                                   new Integer(current) });
  +                        break loop;
  +                    }
  +                    read();
  +                    if (current != 'n') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character('n'),
  +                                                   new Integer(current) });
  +                        break loop;
  +                    }
  +                    read();
  +                    if (current != 'i') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character('i'),
  +                                                   new Integer(current) });
  +                        break loop;
  +                    }
  +                    read();
  +                    if (current != 'f') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character('f'),
  +                                                   new Integer(current) });
  +                        break loop;
  +                    }
  +                    read();
  +                    if (current != 'y') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character('y'),
  +                                                   new Integer(current) });
  +                        break loop;
  +                    }
  +                    read();
  +                    fragmentIdentifierHandler.zoomAndPan(true);
  +                    break;
   
  -                float h = parseFloat();
  +                case 'd':
  +                    read();
  +                    if (current != 'i') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character('i'),
  +                                                   new Integer(current) });
  +                        break loop;
  +                    }
  +                    read();
  +                    if (current != 's') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character('s'),
  +                                                   new Integer(current) });
  +                        break loop;
  +                    }
  +                    read();
  +                    if (current != 'a') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character('a'),
  +                                                   new Integer(current) });
  +                        break loop;
  +                    }
  +                    read();
  +                    if (current != 'b') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character('b'),
  +                                                   new Integer(current) });
  +                        break loop;
  +                    }
  +                    read();
  +                    if (current != 'l') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character('l'),
  +                                                   new Integer(current) });
  +                        break loop;
  +                    }
  +                    read();
  +                    if (current != 'e') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character('e'),
  +                                                   new Integer(current) });
  +                        break loop;
  +                    }
  +                    read();
  +                    fragmentIdentifierHandler.zoomAndPan(false);
  +                    break;
  +
  +                default:
  +                    reportError("character.unexpected",
  +                                new Object[] { new Integer(current) });
  +                    break loop;
  +                }
  +
                   if (current != ')') {
                       reportError("character.expected",
                                   new Object[] { new Character(')'),
  @@ -337,7 +878,6 @@
                       break loop;
                   }
                   read();
  -                getFragmentIdentfierHandler().viewBox(x, y, w, h);
               }
           }
       }
  @@ -391,7 +931,6 @@
       protected void readNumber() throws ParseException {
   	bufferSize = 0;
           for (;;) {
  -	    read();
   	    switch (current) {
   	    case ',':
   	    case ')':
  @@ -401,6 +940,813 @@
   		    return;
   		}
   		bufferize();
  +	    }
  +	    read();
  +	}
  +    }
  +
  +    /**
  +     * Skips the whitespaces in the current reader.
  +     */
  +    protected void skipSpaces() {
  +	if (current == ',') {
  +            read();
  +	}
  +    }
  +
  +    /**
  +     * Skips the whitespaces and an optional comma.
  +     */
  +    protected void skipCommaSpaces() {
  +	if (current == ',') {
  +            read();
  +	}
  +    }
  +
  +    /**
  +     * Parses a matrix transform. 'm' is assumed to be the current character.
  +     */
  +    protected void parseMatrix() throws ParseException {
  +	read();
  +
  +	// Parse 'atrix wsp? ( wsp?'
  +	if (current != 'a') {
  +	    reportError("character.expected",
  +			new Object[] { new Character('a'),
  +				       new Integer(current) });
  +	    skipTransform();
  +	    return;
  +	}
  +	read();
  +	if (current != 't') {
  +	    reportError("character.expected",
  +			new Object[] { new Character('t'),
  +				       new Integer(current) });
  +	    skipTransform();
  +	    return;
  +	}
  +	read();
  +	if (current != 'r') {
  +	    reportError("character.expected",
  +			new Object[] { new Character('r'),
  +				       new Integer(current) });
  +	    skipTransform();
  +	    return;
  +	}
  +	read();
  +	if (current != 'i') {
  +	    reportError("character.expected",
  +			new Object[] { new Character('i'),
  +				       new Integer(current) });
  +	    skipTransform();
  +	    return;
  +	}
  +	read();
  +	if (current != 'x') {
  +	    reportError("character.expected",
  +			new Object[] { new Character('x'),
  +				       new Integer(current) });
  +	    skipTransform();
  +	    return;
  +	}
  +	read();
  +	skipSpaces();
  +	if (current != '(') {
  +	    reportError("character.expected",
  +			new Object[] { new Character('('),
  +				       new Integer(current) });
  +	    skipTransform();
  +	    return;
  +	}
  +	read();
  +	skipSpaces();
  +
  +	try {
  +	    float a = parseFloat();
  +	    skipCommaSpaces();
  +	    float b = parseFloat();
  +	    skipCommaSpaces();
  +	    float c = parseFloat();
  +	    skipCommaSpaces();
  +	    float d = parseFloat();
  +	    skipCommaSpaces();
  +	    float e = parseFloat();
  +	    skipCommaSpaces();
  +	    float f = parseFloat();
  +	
  +	    // Parse 'wsp? )'
  +	    skipSpaces();
  +	    if (current != ')') {
  +		reportError("character.expected",
  +			    new Object[] { new Character(')'),
  +					   new Integer(current) });
  +		skipTransform();
  +		return;
  +	    }
  +
  +	    fragmentIdentifierHandler.matrix(a, b, c, d, e, f);
  +	} catch (NumberFormatException ex) {
  +	    reportError("float.format", new Object[] { getBufferContent() });
  +	    skipTransform();
  +	}
  +    }
  +
  +    /**
  +     * Parses a rotate transform. 'r' is assumed to be the current character.
  +     * @return the current character.
  +     */
  +    protected void parseRotate() throws ParseException {
  +	read();
  +
  +	// Parse 'otate wsp? ( wsp?'
  +	if (current != 'o') {
  +	    reportError("character.expected",
  +			new Object[] { new Character('o'),
  +				       new Integer(current) });
  +	    skipTransform();
  +	    return;
  +	}
  +	read();
  +	if (current != 't') {
  +	    reportError("character.expected",
  +			new Object[] { new Character('t'),
  +				       new Integer(current) });
  +	    skipTransform();
  +	    return;
  +	}
  +	read();
  +	if (current != 'a') {
  +	    reportError("character.expected",
  +			new Object[] { new Character('a'),
  +				       new Integer(current) });
  +	    skipTransform();
  +	    return;
  +	}
  +	read();
  +	if (current != 't') {
  +	    reportError("character.expected",
  +			new Object[] { new Character('t'),
  +				       new Integer(current) });
  +	    skipTransform();
  +	    return;
  +	}
  +	read();
  +	if (current != 'e') {
  +	    reportError("character.expected",
  +			new Object[] { new Character('e'),
  +				       new Integer(current) });
  +	    skipTransform();
  +	    return;
  +	}
  +	read();
  +	skipSpaces();
  +
  +	if (current != '(') {
  +	    reportError("character.expected",
  +			new Object[] { new Character('('),
  +				       new Integer(current) });
  +	    skipTransform();
  +	    return;
  +	}
  +	read();
  +	skipSpaces();
  +
  +	try {
  +	    float theta = parseFloat();
  +	    skipSpaces();
  +
  +	    switch (current) {
  +	    case ')':
  +		fragmentIdentifierHandler.rotate(theta);
  +		return;
  +	    case ',':
  +		read();
  +		skipSpaces();
  +	    }
  +
  +	    float cx = parseFloat();
  +	    skipCommaSpaces();
  +	    float cy = parseFloat();
  +
  +	    // Parse 'wsp? )'
  +	    skipSpaces();
  +	    if (current != ')') {
  +		reportError("character.expected",
  +			    new Object[] { new Character(')'),
  +					   new Integer(current) });
  +		skipTransform();
  +		return;
  +	    }
  +
  +	    fragmentIdentifierHandler.rotate(theta, cx, cy);
  +	} catch (NumberFormatException e) {
  +	    reportError("float.format", new Object[] { getBufferContent() });
  +	    skipTransform();
  +	}
  +    }
  +
  +    /**
  +     * Parses a translate transform. 't' is assumed to be
  +     * the current character.
  +     * @return the current character.
  +     */
  +    protected void parseTranslate() throws ParseException {
  +	read();
  +
  +	// Parse 'ranslate wsp? ( wsp?'
  +	if (current != 'r') {
  +	    reportError("character.expected",
  +			new Object[] { new Character('r'),
  +				       new Integer(current) });
  +	    skipTransform();
  +	    return;
  +	}
  +	read();
  +	if (current != 'a') {
  +	    reportError("character.expected",
  +			new Object[] { new Character('a'),
  +				       new Integer(current) });
  +	    skipTransform();
  +	    return;
  +	}
  +	read();
  +	if (current != 'n') {
  +	    reportError("character.expected",
  +			new Object[] { new Character('n'),
  +				       new Integer(current) });
  +	    skipTransform();
  +	    return;
  +	}
  +	read();
  +	if (current != 's') {
  +	    reportError("character.expected",
  +			new Object[] { new Character('s'),
  +				       new Integer(current) });
  +	    skipTransform();
  +	    return;
  +	}
  +	read();
  +	if (current != 'l') {
  +	    reportError("character.expected",
  +			new Object[] { new Character('l'),
  +				       new Integer(current) });
  +	    skipTransform();
  +	    return;
  +	}
  +	read();
  +	if (current != 'a') {
  +	    reportError("character.expected",
  +			new Object[] { new Character('a'),
  +				       new Integer(current) });
  +	    skipTransform();
  +	    return;
  +	}
  +	read();
  +	if (current != 't') {
  +	    reportError("character.expected",
  +			new Object[] { new Character('t'),
  +				       new Integer(current) });
  +	    skipTransform();
  +	    return;
  +	}
  +	read();
  +	if (current != 'e') {
  +	    reportError("character.expected",
  +			new Object[] { new Character('e'),
  +				       new Integer(current) });
  +	    skipTransform();
  +	    return;
  +	}
  +	read();
  +	skipSpaces();
  +	if (current != '(') {
  +	    reportError("character.expected",
  +			new Object[] { new Character('('),
  +				       new Integer(current) });
  +	    skipTransform();
  +	    return;
  +	}
  +	read();
  +	skipSpaces();
  +
  +	try {
  +	    float tx = parseFloat();
  +	    skipSpaces();
  +
  +	    switch (current) {
  +	    case ')':
  +		fragmentIdentifierHandler.translate(tx);
  +		return;
  +	    case ',':
  +		read();
  +		skipSpaces();
  +	    }
  +
  +	    float ty = parseFloat();
  +
  +	    // Parse 'wsp? )'
  +	    skipSpaces();
  +	    if (current != ')') {
  +		reportError("character.expected",
  +			    new Object[] { new Character(')'),
  +					   new Integer(current) });
  +		skipTransform();
  +		return;
  +	    }
  +
  +	    fragmentIdentifierHandler.translate(tx, ty);
  +	} catch (NumberFormatException e) {
  +	    reportError("float.format", new Object[] { getBufferContent() });
  +	    skipTransform();
  +	}
  +    }
  +
  +    /**
  +     * Parses a scale transform. 'c' is assumed to be the current character.
  +     * @return the current character.
  +     */
  +    protected void parseScale() throws ParseException {
  +	read();
  +
  +	// Parse 'ale wsp? ( wsp?'
  +	if (current != 'a') {
  +	    reportError("character.expected",
  +			new Object[] { new Character('a'),
  +				       new Integer(current) });
  +	    skipTransform();
  +	    return;
  +	}
  +	read();
  +	if (current != 'l') {
  +	    reportError("character.expected",
  +			new Object[] { new Character('l'),
  +				       new Integer(current) });
  +	    skipTransform();
  +	    return;
  +	}
  +	read();
  +	if (current != 'e') {
  +	    reportError("character.expected",
  +			new Object[] { new Character('e'),
  +				       new Integer(current) });
  +	    skipTransform();
  +	    return;
  +	}
  +	read();
  +	skipSpaces();
  +	if (current != '(') {
  +	    reportError("character.expected",
  +			new Object[] { new Character('('),
  +				       new Integer(current) });
  +	    skipTransform();
  +	    return;
  +	}
  +	read();
  +	skipSpaces();
  +
  +	try {
  +	    float sx = parseFloat();
  +	    skipSpaces();
  +
  +	    switch (current) {
  +	    case ')':
  +		fragmentIdentifierHandler.scale(sx);
  +		return;
  +	    case ',':
  +		read();
  +		skipSpaces();
  +	    }
  +
  +	    float sy = parseFloat();
  +
  +	    // Parse 'wsp? )'
  +	    skipSpaces();
  +	    if (current != ')') {
  +		reportError("character.expected",
  +			    new Object[] { new Character(')'),
  +					   new Integer(current) });
  +		skipTransform();
  +		return;
  +	    }
  +
  +	    fragmentIdentifierHandler.scale(sx, sy);
  +	} catch (NumberFormatException e) {
  +	    reportError("float.format", new Object[] { getBufferContent() });
  +	    skipTransform();
  +	}
  +    }
  +
  +    /**
  +     * Parses a skew transform. 'e' is assumed to be the current character.
  +     * @return the current character.
  +     */
  +    protected void parseSkew() throws ParseException {
  +	read();
  +
  +	// Parse 'ew[XY] wsp? ( wsp?'
  +	if (current != 'e') {
  +	    reportError("character.expected",
  +			new Object[] { new Character('e'),
  +				       new Integer(current) });
  +	    skipTransform();
  +	    return;
  +	}
  +	read();
  +	if (current != 'w') {
  +	    reportError("character.expected",
  +			new Object[] { new Character('w'),
  +				       new Integer(current) });
  +	    skipTransform();
  +	    return;
  +	}
  +	read();
  +
  +	boolean skewX = false;
  +	switch (current) {
  +	case 'X':
  +	    skewX = true;
  +	case 'Y':
  +	    break;
  +	default:
  +	    reportError("character.expected",
  +			new Object[] { new Character('X'),
  +				       new Integer(current) });
  +	    skipTransform();
  +	    return;
  +	}
  +	read();
  +	skipSpaces();
  +	if (current != '(') {
  +	    reportError("character.expected",
  +			new Object[] { new Character('('),
  +				       new Integer(current) });
  +	    skipTransform();
  +	    return;
  +	}
  +	read();
  +	skipSpaces();
  +
  +	try {
  +	    float sk = parseFloat();
  +
  +	    // Parse 'wsp? )'
  +	    skipSpaces();
  +	    if (current != ')') {
  +		reportError("character.expected",
  +			    new Object[] { new Character(')'),
  +					   new Integer(current) });
  +		skipTransform();
  +		return;
  +	    }
  +
  +	    if (skewX) {
  +		fragmentIdentifierHandler.skewX(sk);
  +	    } else {
  +		fragmentIdentifierHandler.skewY(sk);
  +	    }
  +	} catch (NumberFormatException e) {
  +	    reportError("float.format", new Object[] { getBufferContent() });
  +	    skipTransform();
  +	}
  +    }
  +
  +    /**
  +     * Skips characters in the given reader until a ')' is encountered.
  +     * @return the first character after the ')'.
  +     */
  +    protected void skipTransform() {
  +	loop: for (;;) {
  +	    read();
  +	    switch (current) {
  +	    case ')':
  +		break loop;
  +	    default:
  +		if (current == -1) {
  +		    break loop;
  +		}
  +	    }
  +	}
  +    }
  +
  +    /**
  +     * Parses a PreserveAspectRatio attribute.
  +     */
  +    protected void parsePreserveAspectRatio() throws ParseException {
  +	fragmentIdentifierHandler.startPreserveAspectRatio();
  +
  +        align: switch (current) {
  +        case 'n':
  +	    read();
  +	    if (current != 'o') {
  +		reportError("character.expected",
  +			    new Object[] { new Character('o'),
  +                                           new Integer(current) });
  +		skipIdentifier();
  +		break align;
  +	    }
  +	    read();
  +	    if (current != 'n') {
  +		reportError("character.expected",
  +			    new Object[] { new Character('n'),
  +					   new Integer(current) });
  +		skipIdentifier();
  +		break align;
  +	    }
  +	    read();
  +	    if (current != 'e') {
  +		reportError("character.expected",
  +			    new Object[] { new Character('e'),
  +					   new Integer(current) });
  +		skipIdentifier();
  +		break align;
  +	    }
  +	    read();
  +	    skipSpaces();
  +	    fragmentIdentifierHandler.none();
  +            break;
  +                
  +        case 'x':
  +            read();
  +            if (current != 'M') {
  +                reportError("character.expected",
  +                            new Object[] { new Character('M'),
  +					   new Integer(current) });
  +                skipIdentifier();
  +                break;
  +            }
  +            read();
  +            switch (current) {
  +            case 'a':
  +                read();
  +                if (current != 'x') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('x'),
  +			          	       new Integer(current) });
  +                    skipIdentifier();
  +                    break align;
  +                }
  +                read();
  +                if (current != 'Y') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('Y'),
  +					       new Integer(current) });
  +                    skipIdentifier();
  +                    break align;
  +                }
  +                read();
  +                if (current != 'M') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('M'),
  +					       new Integer(current) });
  +                    skipIdentifier();
  +                    break align;
  +                }
  +                read();
  +                switch (current) {
  +                case 'a':
  +                    read();
  +                    if (current != 'x') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character('x'),
  +						   new Integer(current) });
  +                        skipIdentifier();
  +                        break align;
  +                    }
  +                    fragmentIdentifierHandler.xMaxYMax();
  +                    read();
  +                    break;
  +                case 'i':
  +                    read();
  +                    switch (current) {
  +                    case 'd':
  +                        fragmentIdentifierHandler.xMaxYMid();
  +                        read();
  +                        break;
  +                    case 'n':
  +                        fragmentIdentifierHandler.xMaxYMin();
  +                        read();
  +                        break;
  +                    default:
  +                        reportError("character.unexpected",
  +                                    new Object[] { new Integer(current) });
  +                        skipIdentifier();
  +                        break align;
  +                    }
  +                }
  +                break;
  +            case 'i':
  +                read();
  +                switch (current) {
  +                case 'd':
  +                    read();
  +                    if (current != 'Y') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character('Y'),
  +						   new Integer(current) });
  +                        skipIdentifier();
  +                        break align;
  +                    }
  +                    read();
  +                    if (current != 'M') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character('M'),
  +						   new Integer(current) });
  +                        skipIdentifier();
  +                        break align;
  +                    }
  +                    read();
  +                    switch (current) {
  +                    case 'a':
  +                        read();
  +                        if (current != 'x') {
  +                            reportError
  +                                ("character.expected",
  +                                 new Object[] { new Character('x'),
  +                                                    new Integer(current) });
  +			    skipIdentifier();
  +			    break align;
  +                        }
  +                        fragmentIdentifierHandler.xMidYMax();
  +                        read();
  +                        break;
  +                    case 'i':
  +                        read();
  +                        switch (current) {
  +                        case 'd':
  +			    fragmentIdentifierHandler.xMidYMid();
  +			    read();
  +			    break;
  +                        case 'n':
  +                            fragmentIdentifierHandler.xMidYMin();
  +                            read();
  +                            break;
  +			default:
  +			    reportError("character.unexpected",
  +					new Object[] { new Integer(current) });
  +			    skipIdentifier();
  +			    break align;
  +                        }
  +                    }
  +                    break;
  +                case 'n':
  +                    read();
  +                    if (current != 'Y') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character('Y'),
  +					           new Integer(current) });
  +                        skipIdentifier();
  +                        break align;
  +                    }
  +                    read();
  +                    if (current != 'M') {
  +                        reportError("character.expected",
  +                                    new Object[] { new Character('M'),
  +						   new Integer(current) });
  +                        skipIdentifier();
  +                        break align;
  +                    }
  +                    read();
  +                    switch (current) {
  +                    case 'a':
  +                        read();
  +                        if (current != 'x') {
  +                            reportError
  +                                ("character.expected",
  +                                 new Object[] { new Character('x'),
  +                                                new Integer(current) });
  +                            skipIdentifier();
  +                            break align;
  +                        }
  +                        fragmentIdentifierHandler.xMinYMax();
  +                        read();
  +                        break;
  +                    case 'i':
  +                        read();
  +                        switch (current) {
  +                        case 'd':
  +                            fragmentIdentifierHandler.xMinYMid();
  +                            read();
  +                            break;
  +                        case 'n':
  +                            fragmentIdentifierHandler.xMinYMin();
  +                            read();
  +                            break;
  +                        default:
  +                            reportError
  +                                ("character.unexpected",
  +                                 new Object[] { new Integer(current) });
  +                            skipIdentifier();
  +                            break align;
  +                        }
  +                    }
  +                    break;
  +                default:
  +                    reportError("character.unexpected",
  +                                new Object[] { new Integer(current) });
  +                    skipIdentifier();
  +                    break align;
  +                }
  +                break;
  +            default:
  +                reportError("character.unexpected",
  +                            new Object[] { new Integer(current) });
  +                skipIdentifier();
  +            }
  +            break;
  +        default:
  +            if (current != -1) {
  +                reportError("character.unexpected",
  +                            new Object[] { new Integer(current) });
  +                skipIdentifier();
  +            }
  +        }
  +
  +        skipCommaSpaces();
  +
  +        switch (current) {
  +        case 'm':
  +            read();
  +            if (current != 'e') {
  +                reportError("character.expected",
  +                            new Object[] { new Character('e'),
  +				           new Integer(current) });
  +                skipIdentifier();
  +                break;
  +            }
  +            read();
  +            if (current != 'e') {
  +                reportError("character.expected",
  +                            new Object[] { new Character('e'),
  +			         	   new Integer(current) });
  +                skipIdentifier();
  +                break;
  +            }
  +            read();
  +            if (current != 't') {
  +                reportError("character.expected",
  +                            new Object[] { new Character('t'),
  +	        			   new Integer(current) });
  +                skipIdentifier();
  +                break;
  +            }
  +            fragmentIdentifierHandler.meet();
  +            read();
  +            break;
  +        case 's':
  +            read();
  +            if (current != 'l') {
  +                reportError("character.expected",
  +                            new Object[] { new Character('l'),
  +				           new Integer(current) });
  +                skipIdentifier();
  +                break;
  +            }
  +            read();
  +            if (current != 'i') {
  +                reportError("character.expected",
  +                            new Object[] { new Character('i'),
  +					   new Integer(current) });
  +                skipIdentifier();
  +                break;
  +            }
  +            read();
  +            if (current != 'c') {
  +                reportError("character.expected",
  +                            new Object[] { new Character('c'),
  +			        	   new Integer(current) });
  +                skipIdentifier();
  +                break;
  +            }
  +            read();
  +            if (current != 'e') {
  +                reportError("character.expected",
  +                            new Object[] { new Character('e'),
  +					   new Integer(current) });
  +                skipIdentifier();
  +                break;
  +            }
  +            fragmentIdentifierHandler.slice();
  +            read();
  +        }
  +
  +	fragmentIdentifierHandler.endPreserveAspectRatio();
  +    }
  +
  +    /**
  +     * Skips characters in the given reader until a white space is encountered.
  +     * @return the first character after the space.
  +     */
  +    protected void skipIdentifier() {
  +	loop: for (;;) {
  +	    read();
  +	    switch(current) {
  +	    case 0xD: case 0xA: case 0x20: case 0x9:
  +		read();
  +		break loop;
  +	    default:
  +		if (current == -1) {
  +		    break loop;
  +		}
   	    }
   	}
       }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: batik-dev-unsubscribe@xml.apache.org
For additional commands, e-mail: batik-dev-help@xml.apache.org