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