aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/lowagie/text/pdf/codec/postscript/PAEngine.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/lowagie/text/pdf/codec/postscript/PAEngine.java')
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/postscript/PAEngine.java155
1 files changed, 155 insertions, 0 deletions
diff --git a/src/main/java/com/lowagie/text/pdf/codec/postscript/PAEngine.java b/src/main/java/com/lowagie/text/pdf/codec/postscript/PAEngine.java
new file mode 100644
index 0000000..e905402
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/postscript/PAEngine.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright 1998 by Sun Microsystems, Inc.,
+ * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
+ * All rights reserved.
+ *
+ * This software is the confidential and proprietary information
+ * of Sun Microsystems, Inc. ("Confidential Information"). You
+ * shall not disclose such Confidential Information and shall use
+ * it only in accordance with the terms of the license agreement
+ * you entered into with Sun.
+ */
+
+package com.lowagie.text.pdf.codec.postscript;
+
+import java.util.*;
+
+
+public class PAEngine extends Object {
+
+ static public final int MODE_STACK = 0;
+ static public final int MODE_PROCEDURE = 1;
+ static public final int MODE_ARRAY = 2;
+
+ protected PAContext context;
+ protected int mode;
+ protected Stack procedure;
+ protected int innerProcedures;
+
+ public PAEngine(PAContext context){
+ super();
+ this.context = context;
+ this.mode = PAEngine.MODE_STACK;
+ }
+
+ public void startProcedure() throws PainterException {
+ this.procedure = new Stack();
+ this.mode = PAEngine.MODE_PROCEDURE;
+ this.innerProcedures = 0;
+ }
+
+ public void endProcedure() throws PainterException {
+ this.context.operands.push(new PAToken(this.procedure, PAToken.PROCEDURE));
+ this.mode = PAEngine.MODE_STACK;
+ }
+
+ public void bindProcedure(PAToken patoken){
+ Stack oldStack = (Stack) patoken.value;
+ Stack newStack = new Stack();
+ int i,n;
+ n = oldStack.size();
+ for(i = 0; i < n; i++){
+ Object token = oldStack.elementAt(i);
+ if((token instanceof PAToken) && ((PAToken) token).type == PAToken.IDENTIFIER){
+ Object foundToken = this.context.findIdentifier(((PAToken) token).value);
+ if(foundToken == null){
+ newStack.push(token);
+ } else {
+ newStack.push(foundToken);
+ }
+ } else {
+ newStack.push(token);
+ }
+ }
+ patoken.value = newStack;
+ }
+
+ public void process(Object token) throws PainterException {
+ if(token == null){
+ throw new IllegalStateException("Null token encountered; last unknown identifier was " + this.context.getLastUnknownIdentifier()+" at line "+this.context.poorscript.token.beginLine);
+ }
+ if(PAContext.DebugExecution){
+ System.out.print("==>" + token.toString());
+// System.out.flush();
+ }
+ if(token instanceof PAToken && ((PAToken) token).type == PAToken.IMMEDIATE){
+ Object foundValue = this.context.findIdentifier(((PAToken) token).value);
+ this.process(foundValue);
+ return;
+ }
+ if(this.mode == MODE_STACK){
+ if(token instanceof PACommand){
+ ((PACommand) token).execute(this.context);
+ } else if(token instanceof PAToken){
+ PAToken patoken = (PAToken) token;
+
+ switch(patoken.type){
+ case PAToken.IDENTIFIER:
+ this.process(this.context.findIdentifier(patoken.value));
+ break;
+ case PAToken.KEY:
+ case PAToken.MARK:
+ case PAToken.START_ARRAY:
+ this.context.operands.push(token);
+ break;
+ case PAToken.PROCEDURE:
+ Enumeration enumx = ((Vector) patoken.value).elements();
+ while(enumx.hasMoreElements()){
+ this.process(enumx.nextElement());
+ }
+ break;
+ case PAToken.START_PROCEDURE:
+ this.startProcedure();
+ break;
+ case PAToken.END_ARRAY:
+ this.context.collectArray();
+ break;
+ case PAToken.START_DICT:
+ this.context.operands.push(token);
+ break;
+ case PAToken.END_DICT:
+ this.context.collectDict();
+ break;
+ default:
+ throw new IllegalStateException("Unknown token encountered" + token);
+ }
+ } else {
+ this.context.operands.push(token);
+ }
+ } else if(this.mode == MODE_PROCEDURE){
+ if(token instanceof PAToken){
+ PAToken patoken = (PAToken) token;
+
+ switch(patoken.type){
+ case PAToken.START_PROCEDURE:
+ this.innerProcedures++;
+ this.procedure.push(token);
+ break;
+ case PAToken.END_PROCEDURE:
+ if(this.innerProcedures > 0){
+ this.innerProcedures--;
+ this.procedure.push(token);
+ } else {
+ this.endProcedure();
+ }
+ break;
+ default:
+ this.procedure.push(token);
+ }
+ } else {
+ this.procedure.push(token);
+ }
+ }
+ }
+
+ public String litMode(){
+ switch(this.mode){
+ case MODE_ARRAY: return "Array";
+ case MODE_PROCEDURE: return "Proc"+innerProcedures;
+ case MODE_STACK: return "Stack";
+ default: return "Unknown";
+ }
+ }
+
+}
+