/*
* 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.*;
import java.io.*;
import java.awt.*;
import java.awt.geom.*;
import com.lowagie.text.pdf.PdfGraphics2D;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfName;
import com.lowagie.text.*;
import com.lowagie.text.pdf.RandomAccessFileOrArray;
public class PAContext {
public PAPencil pencil;
public Stack dictionaries;
public Stack operands;
public PAEngine engine;
PAParser poorscript = null;
protected Random randomNumberGenerator;
InputStream is=null;
protected Object lastUnknownIdentifier;
public static boolean IgnoreUnknownCommands = false;
public static boolean DebugExecution = false;
public PAContext(Component component) {
this(new PAPencil(component));
}
public PAContext(Graphics2D g, Dimension size) {
this(new PAPencil(g, size));
}
public PAContext(PAPencil pencil) {
super();
this.pencil = pencil;
this.dictionaries = new Stack();
this.operands = new Stack();
this.engine = new PAEngine(this);
HashMap systemDict = this.constructSystemDict();
this.dictionaries.push(systemDict);
HashMap globalDict = this.constructGlobalDict();
this.dictionaries.push(globalDict);
HashMap userDict = this.constructUserDict();
systemDict.put("userdict", userDict);
this.dictionaries.push(userDict);
this.randomNumberGenerator = new Random();
this.lastUnknownIdentifier = null;
}
/**
* draw
*
* @param inputStream InputStream
* @throws PainterException
*/
public void draw(InputStream inputStream) throws PainterException {
try {
String filename="init.ps";
// poorscript = new PAParser(new NamedInputStream(PAContext.class.getResourceAsStream(filename),filename));
InputStream inpstr=PAContext.class.getResourceAsStream(filename);
poorscript = new PAParser(inpstr);
poorscript.parse(this);
try {
inpstr.close();
}
catch (IOException ex) {
ex.printStackTrace();
}
// poorscript.enable_tracing();
// poorscript.token_source.setDebugStream(System.err);
// byte[] b=null;
// try {
// b = RandomAccessFileOrArray.InputStreamToArray(inputStream);
// }
// catch (IOException ex) {
// ex.printStackTrace();
// }
// ByteArrayInputStream bar=new ByteArrayInputStream(b);
// is = bar;
poorscript.ReInit(inputStream);
poorscript.parse(this);
// pencil.graphics.dispose();
}
catch (ParseException e) {
e.printStackTrace();
throw new PainterException(e.toString());
}
}
public Object getLastUnknownIdentifier() {
return this.lastUnknownIdentifier;
}
public double[] popNumberOperands(int n) throws PainterException {
double[] result = new double[n];
Object objectValue;
double doubleValue;
for (int i = n - 1; i >= 0; i--) {
try {
objectValue = this.operands.pop();
}
catch (EmptyStackException e) {
throw new PainterException("Operand stack is empty poping " + n +
" number operands");
}
if (objectValue instanceof Number) {
doubleValue = ( (Number) objectValue).doubleValue();
}
else {
throw new PainterException("Number expected on operand stack poping " +
n + " number operands, found " +
objectValue.getClass().getName());
}
result[i] = doubleValue;
}
return result;
}
public Object[] popOperands(int n) throws PainterException {
Object[] result = new Object[n];
Object objectValue;
for (int i = n - 1; i >= 0; i--) {
try {
objectValue = this.operands.pop();
}
catch (EmptyStackException e) {
throw new PainterException("Operand stack is empty poping " + n +
" operands");
}
result[i] = objectValue;
}
return result;
}
public Object peekOperand() throws PainterException {
Object objectValue;
try {
objectValue = this.operands.peek();
}
catch (EmptyStackException e) {
throw new PainterException("Operand stack is empty peeking operand");
}
return objectValue;
}
public Object findIdentifier(Object identifier) {
Object result = null;
int i, n;
n = this.dictionaries.size();
i = n - 1;
while (i >= 0 && result == null) {
HashMap dictionary = (HashMap)this.dictionaries.elementAt(i);
result = dictionary.get(identifier);
i--;
}
if (result == null) {
this.lastUnknownIdentifier = identifier;
}
return result;
}
public Object findDictionary(Object identifier) {
Object result = null;
HashMap dictionary = null;
int i, n;
n = this.dictionaries.size();
i = n - 1;
while (i >= 0 && result == null) {
dictionary = (HashMap)this.dictionaries.elementAt(i);
result = dictionary.get(identifier);
i--;
}
if (result == null) {
return result;
}
else {
return dictionary;
}
}
public void collectArray() throws PainterException {
ArrayList result;
Object objectValue;
int i, n;
boolean found = false;
n = this.operands.size();
for (i = n - 1; i >= 0; i--) {
objectValue = this.operands.elementAt(i);
if (objectValue instanceof PAToken &&
( (PAToken) objectValue).type == PAToken.START_ARRAY) {
found = true;
break;
}
}
if (!found) {
throw new PainterException("No array was started");
}
result = new ArrayList(n - i - 1);
for (int j = 0; j < n - i - 1; j++) {
result.add(null);
}
for (int j = n - 1; j > i; j--) {
try {
objectValue = this.operands.pop();
}
catch (EmptyStackException e) {
throw new PainterException(
"Operand stack is empty collecting array elements");
}
result.set(j - i - 1, objectValue);
}
try {
this.operands.pop(); // the start array mark itself
}
catch (EmptyStackException e) {
throw new PainterException(
"Operand stack is empty removing begin array mark");
}
this.operands.push(result);
}
public void collectDict() throws PainterException {
HashMap result; // = new HashMap();
Object objectValue;
int i, n;
boolean found = false;
n = this.operands.size();
for (i = n - 1; i >= 0; i--) {
objectValue = this.operands.elementAt(i);
if (objectValue instanceof PAToken &&
( (PAToken) objectValue).type == PAToken.START_DICT) {
found = true;
break;
}
}
if (!found) {
throw new PainterException("No dict was started");
}
// result = new ArrayList(n - i - 1);
result = new HashMap();
// for (int j = 0; j < n - i - 1; j++) {
// result.add(null);
// }
for (int j = n - 1; j > i; j -= 2) {
Object targetValue;
try {
targetValue = this.operands.pop();
objectValue = this.operands.pop();
}
catch (EmptyStackException e) {
throw new PainterException(
"Operand stack is empty collecting hashmap elements");
}
result.put(objectValue, targetValue);
}
try {
this.operands.pop(); // the start array mark itself
}
catch (EmptyStackException e) {
throw new PainterException(
"Operand stack is empty removing begin array mark");
}
this.operands.push(result);
}
protected HashMap constructGlobalDict() {
HashMap globalDict = new HashMap();
return globalDict;
}
protected HashMap constructUserDict() {
HashMap userDict = new HashMap();
return userDict;
}
public static void main(String[] args) {
javax.swing.JFrame jf = new javax.swing.JFrame();
jf.setVisible(true);
jf.setDefaultCloseOperation(jf.DISPOSE_ON_CLOSE);
PAContext pac = new PAContext(new PAPencil(jf));
HashMap hm = (HashMap) pac.findDictionary("systemdict");
Iterator it = new TreeSet(hm.keySet()).iterator();
while (it.hasNext()) {
String obname = it.next().toString();
Object ob = hm.get(obname);
String typname = ob.getClass().getName();
System.out.println(obname + ":" + typname);
}
System.exit(0);
}
protected HashMap constructSystemDict() {
HashMap systemDict = new HashMap();
// newpath
systemDict.put("newpath", new PACommand() {
public void execute(PAContext context) throws PainterException {
context.pencil.newpath();
}
});
// moveto
systemDict.put("moveto", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
data = context.popNumberOperands(2);
context.pencil.moveto(data[0], data[1]);
}
});
// rmoveto
systemDict.put("rmoveto", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
data = context.popNumberOperands(2);
context.pencil.rmoveto(data[0], data[1]);
}
});
// lineto
systemDict.put("lineto", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
data = context.popNumberOperands(2);
context.pencil.lineto(data[0], data[1]);
}
});
// rlineto
systemDict.put("rlineto", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
data = context.popNumberOperands(2);
context.pencil.rlineto(data[0], data[1]);
}
});
// arc
systemDict.put("arc", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
data = context.popNumberOperands(5);
context.pencil.arc(data[0], data[1], data[2], data[3], data[4]);
}
});
// arcn
systemDict.put("arcn", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
data = context.popNumberOperands(5);
context.pencil.arcn(data[0], data[1], data[2], data[3], data[4]);
}
});
// curveto
systemDict.put("curveto", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
data = context.popNumberOperands(6);
context.pencil.curveto(data[0], data[1], data[2], data[3], data[4],
data[5]);
}
});
// rcurveto
systemDict.put("rcurveto", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
data = context.popNumberOperands(6);
context.pencil.rcurveto(data[0], data[1], data[2], data[3], data[4],
data[5]);
}
});
// closepath
systemDict.put("closepath", new PACommand() {
public void execute(PAContext context) throws PainterException {
context.pencil.closepath();
}
});
// gsave
systemDict.put("gsave", new PACommand() {
public void execute(PAContext context) throws PainterException {
context.pencil.gsave();
}
});
// grestore
systemDict.put("grestore", new PACommand() {
public void execute(PAContext context) throws PainterException {
context.pencil.grestore();
}
});
// translate
systemDict.put("translate", new PACommand() {
public void execute(PAContext context) throws PainterException {
if (context.peekOperand() instanceof Number) {
double data[];
AffineTransform at = new AffineTransform();
AffineTransform ctm = context.pencil.graphics.getTransform();
data = context.popNumberOperands(2);
at.translate(data[0], data[1]);
ctm.concatenate(at);
context.pencil.graphics.setTransform(ctm);
}
else {
Object data[];
data = context.popOperands(3);
if (! (data[0] instanceof Number)) {
throw new PainterException("translate: wrong arguments");
}
if (! (data[1] instanceof Number)) {
throw new PainterException("translate: wrong arguments");
}
if (! (data[2] instanceof ArrayList)) {
throw new PainterException("translate: wrong arguments");
}
ArrayList array = (ArrayList) data[2];
if (! (array.size() == 6)) {
throw new PainterException("translate: wrong arguments");
}
AffineTransform at = new AffineTransform();
at.translate( ( (Number) data[0]).doubleValue(),
( (Number) data[1]).doubleValue());
double[] entries = new double[6];
at.getMatrix(entries);
for (int i = 0; i < 6; i++) {
array.set(i, new Double(entries[i]));
}
context.operands.push(array);
}
}
});
// rotate
systemDict.put("rotate", new PACommand() {
public void execute(PAContext context) throws PainterException {
if (context.peekOperand() instanceof Number) {
double data[];
AffineTransform at = new AffineTransform();
AffineTransform ctm = context.pencil.graphics.getTransform();
data = context.popNumberOperands(1);
at.rotate(data[0] * Math.PI / 180.0d);
ctm.concatenate(at);
context.pencil.graphics.setTransform(ctm);
}
else {
Object data[];
AffineTransform at = new AffineTransform();
data = context.popOperands(2);
if (! (data[0] instanceof Number)) {
throw new PainterException("rotate: wrong arguments");
}
if (! (data[1] instanceof ArrayList)) {
throw new PainterException("rotate: wrong arguments");
}
ArrayList array = (ArrayList) data[1];
if (! (array.size() == 6)) {
throw new PainterException("rotate: wrong arguments");
}
at.rotate( ( (Number) data[0]).doubleValue());
double[] entries = new double[6];
at.getMatrix(entries);
for (int i = 0; i < 6; i++) {
array.set(i, new Double(entries[i]));
}
context.operands.push(array);
}
}
});
// scale
systemDict.put("scale", new PACommand() {
public void execute(PAContext context) throws PainterException {
if (context.peekOperand() instanceof Number) {
double data[];
AffineTransform at = new AffineTransform();
AffineTransform ctm = context.pencil.graphics.getTransform();
data = context.popNumberOperands(2);
at.scale(data[0], data[1]);
ctm.concatenate(at);
context.pencil.graphics.setTransform(ctm);
}
else {
Object data[];
data = context.popOperands(3);
if (! (data[0] instanceof Number)) {
throw new PainterException("scale: wrong arguments");
}
if (! (data[1] instanceof Number)) {
throw new PainterException("scale: wrong arguments");
}
if (! (data[2] instanceof ArrayList)) {
throw new PainterException("scale: wrong arguments");
}
ArrayList array = (ArrayList) data[2];
double[] entries = new double[6];
if (! (array.size() == 6)) {
throw new PainterException("scale: wrong arguments");
}
entries[0] = ( (Number) data[0]).doubleValue();
entries[1] = 0.0d;
entries[2] = 0.0d;
entries[3] = ( (Number) data[1]).doubleValue();
entries[4] = 0.0d;
entries[5] = 0.0d;
for (int i = 0; i < 6; i++) {
array.set(i, new Double(entries[i]));
}
context.operands.push(array);
}
}
});
// currentmatrix
systemDict.put("currentmatrix", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
data = context.popOperands(1);
if (! (data[0] instanceof ArrayList)) {
throw new PainterException("currentmatrix: wrong argument");
}
ArrayList array = (ArrayList) data[0];
double[] entries = new double[6];
if (! (array.size() == 6)) {
throw new PainterException("currentmatrix: wrong arguments");
}
AffineTransform ctm = context.pencil.graphics.getTransform();
ctm.getMatrix(entries);
for (int i = 0; i < 6; i++) {
array.set(i, new Double(entries[i]));
}
context.operands.push(array);
}
});
// setmatrix
systemDict.put("setmatrix", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
data = context.popOperands(1);
if (! (data[0] instanceof ArrayList)) {
throw new PainterException("setmatrix: wrong argument");
}
ArrayList array = (ArrayList) data[0];
double[] entries = new double[6];
if (! (array.size() == 6)) {
throw new PainterException("setmatrix: wrong arguments");
}
entries[0] = ((Number)array.get(0)).doubleValue();
entries[1] = ((Number)array.get(1)).doubleValue();
entries[2] = ((Number)array.get(2)).doubleValue();
entries[3] = ((Number)array.get(3)).doubleValue();
entries[4] = ((Number)array.get(4)).doubleValue();
entries[5] = ((Number)array.get(5)).doubleValue();
AffineTransform at = new AffineTransform(entries);
context.pencil.graphics.setTransform(at);
}
});
// stroke
systemDict.put("stroke", new PACommand() {
public void execute(PAContext context) throws PainterException {
context.pencil.stroke();
}
});
// fill
systemDict.put("fill", new PACommand() {
public void execute(PAContext context) throws PainterException {
context.pencil.fill();
}
});
// eofill
systemDict.put("eofill", new PACommand() {
public void execute(PAContext context) throws PainterException {
context.pencil.eofill();
}
});
// show
systemDict.put("show", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
data = context.popOperands(1);
if (! (data[0] instanceof String)) {
throw new PainterException("show: wrong arguments");
}
context.pencil.show( (String) data[0]);
}
});
// stringwidth
systemDict.put("stringwidth", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
float[] result;
java.awt.Font font;
data = context.popOperands(1);
if (! (data[0] instanceof String)) {
throw new PainterException("stringwidth: wrong arguments");
}
font = context.pencil.graphics.getFont();
Rectangle2D rect = font.getStringBounds( (String) data[0],
context.pencil.graphics.
getFontRenderContext());
context.operands.push(new Float(rect.getWidth()));
context.operands.push(new Float(rect.getHeight()));
}
});
// showpage
systemDict.put("showpage", new PACommand() {
public void execute(PAContext context) throws PainterException {
context.pencil.showpage();
}
});
// findfont
systemDict.put("findfont", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
PAToken patoken;
data = context.popOperands(1);
if (! (data[0] instanceof PAToken)) {
throw new PainterException("findfont: wrong arguments");
}
patoken = (PAToken) data[0];
if (! (patoken.type == PAToken.KEY)) {
throw new PainterException("findfont: wrong arguments");
}
context.operands.push(context.pencil.findFont( (String) patoken.value));
}
});
// makefont
systemDict.put("makefont", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
data = context.popOperands(2);
if (! (data[0] instanceof java.awt.Font)) {
throw new PainterException("makefont: wrong arguments");
}
if (! (data[1] instanceof ArrayList)) {
throw new PainterException("makefont: wrong arguments");
}
// @TODO implement!!!
context.operands.push(data[0]);
}
});
// scalefont
systemDict.put("scalefont", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
data = context.popOperands(2);
if (! (data[0] instanceof java.awt.Font)) {
throw new PainterException("scalefont: wrong arguments");
}
if (! (data[1] instanceof Number)) {
throw new PainterException("scalefont: wrong arguments");
}
java.awt.Font fn=( (java.awt.Font) data[0]).deriveFont( ( (Number)
data[1]).
floatValue());
System.out.println("Fonthoehe:"+fn.getSize2D());
context.operands.push(fn );
}
});
// setfont
systemDict.put("setfont", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
data = context.popOperands(1);
if (! (data[0] instanceof java.awt.Font)) {
throw new PainterException("setfont: wrong arguments");
}
java.awt.Font fn=(java.awt.Font)data[0];
System.out.println("Fonthoehe:"+fn.getSize2D());
/**
* @todo two times the same?
*/
context.pencil.graphics.setFont( fn);
context.pencil.state.font=fn;
}
});
// def
systemDict.put("def", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
PAToken patoken;
data = context.popOperands(2);
if (! (data[0] instanceof PAToken)) {
throw new PainterException("def: wrong arguments");
}
patoken = (PAToken) data[0];
if (! (patoken.type == PAToken.KEY)) {
throw new PainterException("def: wrong arguments");
}
try {
( (HashMap) context.dictionaries.peek()).put(patoken.value, data[1]);
}
catch (EmptyStackException e) {
throw new PainterException(e.toString());
}
}
});
// bind
systemDict.put("bind", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
PAToken patoken;
data = context.popOperands(1);
if (! (data[0] instanceof PAToken)) {
throw new PainterException("bind: wrong arguments, not PAToken");
}
patoken = (PAToken) data[0];
if (! (patoken.type == PAToken.PROCEDURE)) {
throw new PainterException("bind: wrong arguments, not Procedure " +
patoken.value);
}
context.engine.bindProcedure(patoken);
context.operands.push(patoken);
}
});
// mul
systemDict.put("mul", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
data = context.popNumberOperands(2);
context.operands.push(new Double(data[0] * data[1]));
}
});
// div
systemDict.put("div", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
data = context.popNumberOperands(2);
context.operands.push(new Double(data[0] / data[1]));
}
});
// mod
systemDict.put("mod", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
data = context.popNumberOperands(2);
int a, b, m;
a = (int) data[0];
b = (int) data[1];
m = a % b;
context.operands.push(new Integer(m));
}
});
// add
systemDict.put("add", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
data = context.popNumberOperands(2);
context.operands.push(new Double(data[0] + data[1]));
}
});
// neg
systemDict.put("neg", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
data = context.popNumberOperands(1);
context.operands.push(new Double( -data[0]));
}
});
// ceiling
systemDict.put("ceiling", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
data = context.popNumberOperands(1);
context.operands.push(new Double(Math.ceil(data[0])));
}
});
// sub
systemDict.put("sub", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
data = context.popNumberOperands(2);
context.operands.push(new Double(data[0] - data[1]));
}
});
// atan
systemDict.put("atan", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
data = context.popNumberOperands(2);
context.operands.push(new Double(Math.atan2(data[0], data[1])));
}
});
// sin
systemDict.put("sin", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
data = context.popNumberOperands(1);
context.operands.push(new Double(Math.sin(data[0] * Math.PI / 180.0)));
}
});
// cos
systemDict.put("cos", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
data = context.popNumberOperands(1);
context.operands.push(new Double(Math.cos(data[0] * Math.PI / 180.0)));
}
});
// sqrt
systemDict.put("sqrt", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
data = context.popNumberOperands(1);
context.operands.push(new Double(Math.sqrt(data[0])));
}
});
// ln
systemDict.put("log", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
data = context.popNumberOperands(1);
context.operands.push(new Double(Math.log(data[0])));
}
});
// exp
systemDict.put("exp", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
data = context.popNumberOperands(2);
context.operands.push(new Double(Math.pow(data[0], data[1])));
}
});
// exch
systemDict.put("exch", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
data = context.popOperands(2);
context.operands.push(data[1]);
context.operands.push(data[0]);
}
});
// dup
systemDict.put("dup", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
data = context.popOperands(1);
context.operands.push(data[0]);
context.operands.push(data[0]);
}
});
// roll
systemDict.put("roll", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
Object rollData[];
data = context.popOperands(2);
if (! (data[0] instanceof Number)) {
throw new PainterException("roll: wrong arguments");
}
if (! (data[1] instanceof Number)) {
throw new PainterException("roll: wrong arguments");
}
int numberOfElements, numberOfPositions, i;
numberOfElements = ( (Number) data[0]).intValue();
numberOfPositions = ( (Number) data[1]).intValue();
if (numberOfPositions == 0 || numberOfElements <= 0) {
return;
}
rollData = context.popOperands(numberOfElements);
if (numberOfPositions < 0) {
numberOfPositions = -numberOfPositions;
numberOfPositions = numberOfPositions % numberOfElements;
// downward roll
for (i = numberOfPositions; i < numberOfElements; i++) {
context.operands.push(rollData[i]);
}
for (i = 0; i < numberOfPositions; i++) {
context.operands.push(rollData[i]);
}
}
else {
numberOfPositions = numberOfPositions % numberOfElements;
// upward roll
for (i = numberOfElements - numberOfPositions; i < numberOfElements;
i++) {
context.operands.push(rollData[i]);
}
for (i = 0; i < numberOfElements - numberOfPositions; i++) {
context.operands.push(rollData[i]);
}
}
}
});
// pop
systemDict.put("pop", new PACommand() {
public void execute(PAContext context) throws PainterException {
context.popOperands(1);
}
});
// index
systemDict.put("index", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
data = context.popOperands(1);
if (! (data[0] instanceof Number)) {
throw new PainterException("index: wrong arguments");
}
int index = ( (Number) data[0]).intValue();
try {
context.operands.push(context.operands.elementAt(index));
}
catch (ArrayIndexOutOfBoundsException e) {
throw new PainterException(e.toString());
}
}
});
// mark
systemDict.put("mark", new PACommand() {
public void execute(PAContext context) throws PainterException {
context.operands.push(new PAToken(null, PAToken.MARK));
}
});
// cvx
systemDict.put("cvx", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data;
data = context.operands.pop();
ArrayList ar = (ArrayList) data;
Stack stack = new Stack();
for (int i = ar.size() - 1; i >= 0; i--) {
stack.add(ar.get(i));
}
PAToken patoken = new PAToken(stack, PAToken.PROCEDURE);
// patoken.type=PAToken.PROCEDURE;
context.operands.push(patoken);
}
});
// cleartomark
systemDict.put("cleartomark", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data;
boolean finished = false;
while (!finished) {
try {
data = context.operands.pop();
if (data instanceof PAToken) {
if ( ( (PAToken) data).type == PAToken.MARK) {
finished = true;
}
}
}
catch (EmptyStackException e) {
throw new PainterException(e.toString());
}
}
}
});
// copy
systemDict.put("copy", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
data = context.popOperands(2);
// decide if it's a simple copy or a composite object copy
if ( (data[0] instanceof PAToken) && (data[1] instanceof PAToken)) {
// composite object copy
if ( ( (PAToken) data[0]).type == ( (PAToken) data[1]).type) {
// our tokens are immutable so a copy is easy
context.operands.push(data[0]);
context.operands.push(data[0]);
}
else {
throw new PainterException(
"copy operation failed because composite objects on stack are not of same type");
}
}
else {
// restore first arg, we're not interested in it in this simple case
context.operands.push(data[0]);
if (data[1] instanceof Number) {
int index = ( (Number) data[1]).intValue();
int i, n;
n = context.operands.size();
Object[] copyData = new Object[index];
for (i = n - index; i < n; i++) {
try {
copyData[i - n + index] = context.operands.elementAt(i);
}
catch (ArrayIndexOutOfBoundsException e) {
throw new PainterException(e.toString());
}
}
for (i = 0; i < index; i++) {
context.operands.push(copyData[i]);
}
}
else {
throw new PainterException("I expect a number on stack, dude");
}
}
}
});
// setgray
systemDict.put("setgray", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
data = context.popNumberOperands(1);
context.pencil.graphics.setPaint(new Color( (float) data[0],
(float) data[0], (float) data[0]));
}
});
// setrgbcolor
systemDict.put("setrgbcolor", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
data = context.popNumberOperands(3);
float[] fv = new float[3];
fv[0] = (float) Math.max(Math.min(data[0], 1.0d), 0.0d);
fv[1] = (float) Math.max(Math.min(data[1], 1.0d), 0.0d);
fv[2] = (float) Math.max(Math.min(data[2], 1.0d), 0.0d);
context.pencil.graphics.setPaint(new Color(fv[0], fv[1], fv[2]));
}
});
// currentrgbcolor
systemDict.put("currentrgbcolor", new PACommand() {
public void execute(PAContext context) throws PainterException {
Color cl=context.pencil.graphics.getColor();
float[] fv = cl.getRGBComponents(null);
context.operands.push(new Float(fv[0]));
context.operands.push(new Float(fv[1]));
context.operands.push(new Float(fv[2]));
}
});
// PENDING(uweh): color stuff still shaky
// sethsbcolor
systemDict.put("sethsbcolor", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
data = context.popNumberOperands(3);
float[] fv = new float[3];
fv[0] = (float) Math.max(Math.min(data[0], 1.0d), 0.0d);
fv[1] = (float) Math.max(Math.min(data[1], 1.0d), 0.0d);
fv[2] = (float) Math.max(Math.min(data[2], 1.0d), 0.0d);
context.pencil.graphics.setPaint(new Color(fv[0], fv[1], fv[2]));
}
});
// PENDING(uweh): I have to convert these puppies myself to rgb ?
// setcmykcolor
systemDict.put("setcmykcolor", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
int rd, gr, bl;
data = context.popNumberOperands(4);
float[] fv = new float[4];
fv[0] = (float) data[0];
fv[1] = (float) data[1];
fv[2] = (float) data[2];
fv[3] = (float) data[3];
rd = (int) (255 * Math.max(0, 1 - fv[0] - fv[3]));
gr = (int) (255 * Math.max(0, 1 - fv[1] - fv[3]));
bl = (int) (255 * Math.max(0, 1 - fv[2] - fv[3]));
context.pencil.graphics.setPaint(new Color(rd, gr, bl));
}
});
// setlinewidth
systemDict.put("setlinewidth", new PACommand() {
private double minLineWidth(double w, AffineTransform at) {
double matrix[] = new double[4];
at.getMatrix(matrix);
double scale = matrix[0] * matrix[3] - matrix[1] * matrix[2];
double minlw = .25 / Math.sqrt(Math.abs(scale));
if (w < minlw) {
w = minlw;
}
return w;
}
public void execute(PAContext context) throws PainterException {
double data[];
BasicStroke newStroke;
Stroke oldStroke = context.pencil.graphics.getStroke();
data = context.popNumberOperands(1);
data[0] = this.minLineWidth(data[0],
context.pencil.graphics.getTransform());
if (oldStroke instanceof BasicStroke) {
newStroke = new BasicStroke( (float) data[0],
( (BasicStroke) oldStroke).getEndCap(),
( (BasicStroke) oldStroke).getLineJoin(),
( (BasicStroke) oldStroke).getMiterLimit(),
( (BasicStroke) oldStroke).getDashArray(),
( (BasicStroke) oldStroke).getDashPhase());
}
else {
newStroke = new BasicStroke( (float) data[0], BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND);
}
/**
* @todo two times the same?
*/
context.pencil.graphics.setStroke(newStroke);
// context.pencil.state.stroke=newStroke;
}
});
// setlinecap
systemDict.put("setlinecap", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
BasicStroke newStroke;
Stroke oldStroke = context.pencil.graphics.getStroke();
data = context.popNumberOperands(1);
if (oldStroke instanceof BasicStroke) {
newStroke = new BasicStroke( ( (BasicStroke) oldStroke).getLineWidth(),
(int) data[0],
( (BasicStroke) oldStroke).getLineJoin(),
( (BasicStroke) oldStroke).getMiterLimit(),
( (BasicStroke) oldStroke).getDashArray(),
( (BasicStroke) oldStroke).getDashPhase());
}
else {
newStroke = new BasicStroke(1.0f, (int) data[0],
BasicStroke.JOIN_ROUND);
}
context.pencil.graphics.setStroke(newStroke);
}
});
// setmiterlimit
systemDict.put("setmiterlimit", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
BasicStroke newStroke;
Stroke oldStroke = context.pencil.graphics.getStroke();
data = context.popNumberOperands(1);
if (oldStroke instanceof BasicStroke) {
newStroke = new BasicStroke( ( (BasicStroke) oldStroke).getLineWidth(),
( (BasicStroke) oldStroke).getEndCap(),
( (BasicStroke) oldStroke).getLineJoin(),
(float) data[0],
( (BasicStroke) oldStroke).getDashArray(),
( (BasicStroke) oldStroke).getDashPhase());
}
else {
newStroke = new BasicStroke(1.0f, BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND, (float) data[0]);
}
context.pencil.graphics.setStroke(newStroke);
}
});
// setdash
systemDict.put("setdash", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
BasicStroke newStroke;
Stroke oldStroke = context.pencil.graphics.getStroke();
data = context.popOperands(2);
if (! (data[0] instanceof ArrayList)) {
throw new PainterException("setdash: wrong arguments");
}
if (! (data[1] instanceof Number)) {
throw new PainterException("setdash: wrong arguments");
}
ArrayList list = (ArrayList) data[0];
if (list.size() == 0) {
return;
}
float[] dashpattern = new float[list.size()];
for (int i = 0; i < dashpattern.length; i++) {
dashpattern[i] = ( (Number) list.get(i)).floatValue();
}
float dashoffset = ( (Number) data[1]).floatValue();
if (oldStroke instanceof BasicStroke) {
newStroke = new BasicStroke( ( (BasicStroke) oldStroke).getLineWidth(),
( (BasicStroke) oldStroke).getEndCap(),
( (BasicStroke) oldStroke).getLineJoin(),
( (BasicStroke) oldStroke).getMiterLimit(),
dashpattern,
dashoffset);
}
else {
newStroke = new BasicStroke(1.0f, BasicStroke.CAP_ROUND,
BasicStroke.JOIN_ROUND, 1.0f, dashpattern,
dashoffset);
}
context.pencil.graphics.setStroke(newStroke);
}
});
// setlinejoin
systemDict.put("setlinejoin", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
BasicStroke newStroke;
Stroke oldStroke = context.pencil.graphics.getStroke();
data = context.popNumberOperands(1);
if (oldStroke instanceof BasicStroke) {
newStroke = new BasicStroke( ( (BasicStroke) oldStroke).getLineWidth(),
( (BasicStroke) oldStroke).getEndCap(),
(int) data[0],
( (BasicStroke) oldStroke).getMiterLimit(),
( (BasicStroke) oldStroke).getDashArray(),
( (BasicStroke) oldStroke).getDashPhase());
}
else {
newStroke = new BasicStroke(1.0f, BasicStroke.CAP_ROUND, (int) data[0]);
}
context.pencil.graphics.setStroke(newStroke);
}
});
// dumpstack
systemDict.put("dumpstack", new PACommand() {
public void execute(PAContext context) throws PainterException {
Enumeration enumx = context.operands.elements();
System.out.println("-------------Stack--------------");
while (enumx.hasMoreElements()) {
System.out.println(enumx.nextElement());
}
System.out.println("--------------------------------");
}
});
// for
systemDict.put("for", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
PAToken patoken;
data = context.popOperands(4);
if (! (data[3] instanceof PAToken)) {
throw new PainterException("for: wrong arguments");
}
if (! (data[0] instanceof Number)) {
throw new PainterException("for: wrong arguments");
}
if (! (data[1] instanceof Number)) {
throw new PainterException("for: wrong arguments");
}
if (! (data[2] instanceof Number)) {
throw new PainterException("for: wrong arguments");
}
patoken = (PAToken) data[3];
if (! (patoken.type == PAToken.PROCEDURE)) {
throw new PainterException("for: wrong arguments");
}
int i0, i1, i2;
i0 = ( (Number) data[0]).intValue();
i1 = ( (Number) data[1]).intValue();
i2 = ( (Number) data[2]).intValue();
if (i1 > 0) {
for (int i = i0; i <= i2; i += i1) {
context.operands.push(new Integer(i));
context.engine.process(patoken);
}
}
else {
for (int i = i0; i >= i2; i -= i1) {
context.operands.push(new Integer(i));
context.engine.process(patoken);
}
}
}
});
// repeat
systemDict.put("repeat", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
PAToken patoken;
data = context.popOperands(2);
if (! (data[1] instanceof PAToken)) {
throw new PainterException("repeat: wrong arguments");
}
if (! (data[0] instanceof Number)) {
throw new PainterException("repeat: wrong arguments");
}
patoken = (PAToken) data[1];
if (! (patoken.type == PAToken.PROCEDURE)) {
throw new PainterException("repeat: wrong arguments");
}
int n = ( (Number) data[0]).intValue();
for (int i = 0; i < n; i++) {
context.engine.process(patoken);
}
}
});
// true
systemDict.put("true", new PACommand() {
public void execute(PAContext context) throws PainterException {
context.operands.push(new Boolean(true));
}
});
// false
systemDict.put("false", new PACommand() {
public void execute(PAContext context) throws PainterException {
context.operands.push(new Boolean(false));
}
});
// lt
systemDict.put("lt", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
data = context.popOperands(2);
if (! (data[0] instanceof Number) && ! (data[0] instanceof String)) {
throw new PainterException("lt: wrong arguments");
}
if (data[0] instanceof Number) {
if (! (data[1] instanceof Number)) {
throw new PainterException("lt: wrong arguments");
}
double d0, d1;
d0 = ( (Number) data[0]).doubleValue();
d1 = ( (Number) data[1]).doubleValue();
if (d0 < d1) {
context.operands.push(new Boolean(true));
}
else {
context.operands.push(new Boolean(false));
}
}
else {
if (! (data[1] instanceof String)) {
throw new PainterException("lt: wrong arguments");
}
String s0, s1;
s0 = (String) data[0];
s1 = (String) data[1];
if (s0.compareTo(s1) < 0) {
context.operands.push(new Boolean(true));
}
else {
context.operands.push(new Boolean(false));
}
}
}
});
// gt
systemDict.put("gt", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
data = context.popOperands(2);
if (! (data[0] instanceof Number) && ! (data[0] instanceof String)) {
throw new PainterException("gt: wrong arguments");
}
if (data[0] instanceof Number) {
if (! (data[1] instanceof Number)) {
throw new PainterException("gt: wrong arguments");
}
double d0, d1;
d0 = ( (Number) data[0]).doubleValue();
d1 = ( (Number) data[1]).doubleValue();
if (d0 > d1) {
context.operands.push(new Boolean(true));
}
else {
context.operands.push(new Boolean(false));
}
}
else {
if (! (data[1] instanceof String)) {
throw new PainterException("gt: wrong arguments");
}
String s0, s1;
s0 = (String) data[0];
s1 = (String) data[1];
if (s0.compareTo(s1) > 0) {
context.operands.push(new Boolean(true));
}
else {
context.operands.push(new Boolean(false));
}
}
}
});
// ge
systemDict.put("ge", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
data = context.popOperands(2);
if (! (data[0] instanceof Number) && ! (data[0] instanceof String)) {
throw new PainterException("ge: wrong arguments");
}
if (data[0] instanceof Number) {
if (! (data[1] instanceof Number)) {
throw new PainterException("ge: wrong arguments");
}
double d0, d1;
d0 = ( (Number) data[0]).doubleValue();
d1 = ( (Number) data[1]).doubleValue();
if (d0 >= d1) {
context.operands.push(new Boolean(true));
}
else {
context.operands.push(new Boolean(false));
}
}
else {
if (! (data[1] instanceof String)) {
throw new PainterException("ge: wrong arguments");
}
String s0, s1;
s0 = (String) data[0];
s1 = (String) data[1];
if (s0.compareTo(s1) >= 0) {
context.operands.push(new Boolean(true));
}
else {
context.operands.push(new Boolean(false));
}
}
}
});
// ne
systemDict.put("ne", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
data = context.popOperands(2);
if (! (data[0] instanceof Number) && ! (data[0] instanceof String)) {
throw new PainterException("ne: wrong arguments");
}
if (data[0] instanceof Number) {
if (! (data[1] instanceof Number)) {
throw new PainterException("ne: wrong arguments");
}
double d0, d1;
d0 = ( (Number) data[0]).doubleValue();
d1 = ( (Number) data[1]).doubleValue();
if (d0 != d1) {
context.operands.push(new Boolean(true));
}
else {
context.operands.push(new Boolean(false));
}
}
else {
if (! (data[1] instanceof String)) {
throw new PainterException("ne: wrong arguments");
}
String s0, s1;
s0 = (String) data[0];
s1 = (String) data[1];
if (s0.equals(s1)) {
context.operands.push(new Boolean(false));
}
else {
context.operands.push(new Boolean(true));
}
}
}
});
// eq
systemDict.put("eq", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
data = context.popOperands(2);
if (! (data[0] instanceof Number) && ! (data[0] instanceof String)) {
throw new PainterException("eq: wrong arguments");
}
if (data[0] instanceof Number) {
if (! (data[1] instanceof Number)) {
throw new PainterException("eq: wrong arguments");
}
double d0, d1;
d0 = ( (Number) data[0]).doubleValue();
d1 = ( (Number) data[1]).doubleValue();
if (d0 == d1) {
context.operands.push(new Boolean(true));
}
else {
context.operands.push(new Boolean(false));
}
}
else {
if (! (data[1] instanceof String)) {
throw new PainterException("eq: wrong arguments");
}
String s0, s1;
s0 = (String) data[0];
s1 = (String) data[1];
if (s0.compareTo(s1) == 0) {
context.operands.push(new Boolean(true));
}
else {
context.operands.push(new Boolean(false));
}
}
}
});
// if
systemDict.put("if", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
PAToken patoken;
data = context.popOperands(2);
if (! (data[0] instanceof Boolean)) {
throw new PainterException("if: wrong arguments");
}
if (! (data[1] instanceof PAToken)) {
throw new PainterException("if: wrong arguments");
}
patoken = (PAToken) data[1];
if (! (patoken.type == PAToken.PROCEDURE)) {
throw new PainterException("if: wrong arguments");
}
if ( ( (Boolean) data[0]).booleanValue()) {
context.engine.process(patoken);
}
}
});
// ifelse
systemDict.put("ifelse", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
PAToken patoken1, patoken2;
data = context.popOperands(3);
if (! (data[0] instanceof Boolean)) {
throw new PainterException("ifelse: wrong arguments");
}
if (! (data[1] instanceof PAToken)) {
throw new PainterException("ifelse: wrong arguments");
}
if (! (data[2] instanceof PAToken)) {
throw new PainterException("ifelse: wrong arguments");
}
patoken1 = (PAToken) data[1];
patoken2 = (PAToken) data[2];
if (! (patoken1.type == PAToken.PROCEDURE)) {
throw new PainterException("ifelse: wrong arguments");
}
if (! (patoken2.type == PAToken.PROCEDURE)) {
throw new PainterException("ifelse: wrong arguments");
}
if ( ( (Boolean) data[0]).booleanValue()) {
context.engine.process(patoken1);
}
else {
context.engine.process(patoken2);
}
}
});
// dict
systemDict.put("dict", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
data = context.popNumberOperands(1);
context.operands.push(new HashMap( (int) data[0]));
}
});
// put
systemDict.put("put", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
PAToken patoken;
data = context.popOperands(3);
if ( (data[0] instanceof HashMap) && (data[1] instanceof PAToken)) {
patoken = (PAToken) data[1];
if (! (patoken.type == PAToken.KEY)) {
throw new PainterException("put: wrong arguments");
}
( (HashMap) data[0]).put(patoken.value, data[2]);
}
else
if ( (data[0] instanceof ArrayList) && (data[1] instanceof Number)) {
ArrayList ar = (ArrayList) data[0];
Number nr = (Number) data[1];
ar.set(nr.intValue(), data[2]);
}
else
if ( (data[0] instanceof StringBuffer) && (data[1] instanceof Number) &&
(data[2] instanceof Number)) {
StringBuffer text = (StringBuffer) data[0];
Number nr = (Number) data[1];
Number ch = (Number) data[2];
text.setCharAt(nr.intValue(), (char) (ch.intValue()));
}
else {
throw new PainterException("put: wrong arguments");
}
}
});
// get
systemDict.put("get", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
PAToken patoken;
data = context.popOperands(2);
if (! (data[0] instanceof HashMap) && ! (data[0] instanceof ArrayList)) {
throw new PainterException("get: wrong arguments");
}
if (data[0] instanceof HashMap) {
if (! (data[1] instanceof PAToken)) {
throw new PainterException("get: wrong arguments");
}
patoken = (PAToken) data[1];
if (! (patoken.type == PAToken.KEY)) {
throw new PainterException("get: wrong arguments");
}
context.operands.push( ( (HashMap) data[0]).get(patoken.value));
}
else if (data[0] instanceof ArrayList) {
if (! (data[1] instanceof Number)) {
throw new PainterException("get: wrong arguments");
}
context.operands.push( ( (ArrayList) data[0]).get( ( (Number) data[1]).
intValue()));
}
}
});
// getinterval
systemDict.put("getinterval", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
PAToken patoken;
data = context.popOperands(3);
if (! (data[0] instanceof HashMap) && ! (data[0] instanceof ArrayList)) {
throw new PainterException("getinterval: wrong arguments");
}
if (data[0] instanceof HashMap) {
if (! (data[1] instanceof PAToken)) {
throw new PainterException("getinterval: wrong arguments");
}
patoken = (PAToken) data[1];
if (! (patoken.type == PAToken.KEY)) {
throw new PainterException("getinterval: wrong arguments");
}
if (! (data[2] instanceof Number)) {
throw new PainterException("getinterval: wrong arguments");
}
HashMap target = new HashMap();
context.operands.push( ( (HashMap) data[0]).get(patoken.value));
}
else if (data[0] instanceof ArrayList) {
if (! (data[1] instanceof Number)) {
throw new PainterException("getinterval: wrong arguments");
}
if (! (data[2] instanceof Number)) {
throw new PainterException("getinterval: wrong arguments");
}
ArrayList source = ( (ArrayList) data[0]);
int from = ( (Number) data[1]).intValue();
int to = from + ( (Number) data[2]).intValue();
ArrayList target = new ArrayList(source.subList(from, to));
context.operands.push(target);
}
}
});
// load
systemDict.put("load", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
PAToken patoken;
data = context.popOperands(1);
if (! (data[0] instanceof PAToken)) {
throw new PainterException("load: wrong arguments");
}
patoken = (PAToken) data[0];
if (! (patoken.type == PAToken.KEY)) {
throw new PainterException("load: wrong arguments");
}
context.operands.push(context.findIdentifier(patoken.value));
}
});
// length
systemDict.put("length", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
PAToken patoken;
int size = 0;
data = context.popOperands(1);
if (data[0] instanceof PAToken) {
patoken = (PAToken) data[0];
if (! (patoken.type == PAToken.KEY)) {
throw new PainterException("length: wrong arguments");
}
size = ( (String) patoken.value).length();
}
else if (data[0] instanceof HashMap) {
size = ( (HashMap) data[0]).size();
}
else if (data[0] instanceof ArrayList) {
size = ( (ArrayList) data[0]).size();
}
else if (data[0] instanceof String) {
size = ( (String) data[0]).length();
}
else {
throw new PainterException("length: wrong arguments");
}
context.operands.push(new Integer(size));
}
});
// begin
systemDict.put("begin", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
data = context.popOperands(1);
if (! (data[0] instanceof HashMap)) {
throw new PainterException("begin: wrong arguments");
}
context.dictionaries.push(data[0]);
}
});
// end
systemDict.put("end", new PACommand() {
public void execute(PAContext context) throws PainterException {
try {
context.dictionaries.pop();
}
catch (EmptyStackException e) {
throw new PainterException("Dictionary stack is empty");
}
}
});
// undef
systemDict.put("undef", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
PAToken patoken;
data = context.popOperands(2);
if (! (data[0] instanceof HashMap)) {
throw new PainterException("undef: wrong arguments");
}
if (! (data[1] instanceof PAToken)) {
throw new PainterException("undef: wrong arguments");
}
patoken = (PAToken) data[1];
if (! (patoken.type == PAToken.KEY)) {
throw new PainterException("undef: wrong arguments");
}
// we don't do an actual undef because we don't care
}
});
// known
systemDict.put("known", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[], foundObject;
PAToken patoken;
data = context.popOperands(1);
if (! (data[0] instanceof PAToken)) {
throw new PainterException("known: wrong arguments");
}
patoken = (PAToken) data[0];
if (! (patoken.type == PAToken.KEY)) {
throw new PainterException("known: wrong arguments");
}
foundObject = context.findIdentifier(patoken.value);
if (foundObject != null) {
context.operands.push(new Boolean(true));
}
else {
context.operands.push(new Boolean(false));
}
}
});
// where
systemDict.put("where", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[], foundObject;
PAToken patoken;
data = context.popOperands(1);
if (! (data[0] instanceof PAToken)) {
throw new PainterException("where: wrong arguments");
}
patoken = (PAToken) data[0];
if (! (patoken.type == PAToken.KEY)) {
throw new PainterException("where: wrong arguments");
}
foundObject = context.findDictionary(patoken.value);
if (foundObject != null) {
context.operands.push(foundObject);
context.operands.push(new Boolean(true));
}
else {
context.operands.push(new Boolean(false));
}
}
});
// aload
systemDict.put("aload", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object[] data;
java.util.AbstractList list;
data = context.popOperands(1);
if (data[0] instanceof PAToken) {
data[0] = ( (PAToken) data[0]).value;
}
if (! (data[0] instanceof java.util.AbstractList)) {
throw new PainterException("aload: wrong arguments");
}
list = (java.util.AbstractList) data[0];
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
context.operands.push(iterator.next());
}
context.operands.push(data[0]);
}
});
// forall
systemDict.put("forall", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
ArrayList list;
PAToken patoken;
data = context.popOperands(2);
if (! (data[0] instanceof ArrayList)) {
throw new PainterException("forall: wrong arguments");
}
if (! (data[1] instanceof PAToken)) {
throw new PainterException("forall: wrong arguments");
}
patoken = (PAToken) data[1];
if (! (patoken.type == PAToken.PROCEDURE)) {
throw new PainterException("forall: wrong arguments");
}
list = (ArrayList) data[0];
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
context.operands.push(iterator.next());
context.engine.process(patoken);
}
}
});
// currentflat PENDING(uweh):placeholder for now
systemDict.put("currentflat", new PACommand() {
public void execute(PAContext context) throws PainterException {
PdfGraphics2D pdfg2d = (PdfGraphics2D) context.pencil.graphics;
PdfContentByte cb = pdfg2d.getContent();
context.operands.push(new Double(1.0f));
}
});
// setflat PENDING(uweh):placeholder for now
systemDict.put("setflat", new PACommand() {
public void execute(PAContext context) throws PainterException {
double[] data;
data = context.popNumberOperands(1);
PdfGraphics2D pdfg2d = (PdfGraphics2D) context.pencil.graphics;
PdfContentByte cb = pdfg2d.getContent();
cb.setFlatness( ( (float) data[0]));
}
});
// round
systemDict.put("round", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
data = context.popNumberOperands(1);
context.operands.push(new Long(Math.round(data[0])));
}
});
// abs
systemDict.put("abs", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
data = context.popNumberOperands(1);
context.operands.push(new Double(Math.abs(data[0])));
}
});
// transform
systemDict.put("transform", new PACommand() {
public void execute(PAContext context) throws PainterException {
if (context.peekOperand() instanceof Number) {
double data[];
double[] transformedData = new double[2];
data = context.popNumberOperands(2);
AffineTransform at = context.pencil.graphics.getTransform();
at.transform(data, 0, transformedData, 0, 1);
context.operands.push(new Double(transformedData[0]));
context.operands.push(new Double(transformedData[1]));
}
else {
Object data[];
data = context.popOperands(3);
if (! (data[0] instanceof Number)) {
throw new PainterException("transform: wrong arguments");
}
if (! (data[1] instanceof Number)) {
throw new PainterException("transform: wrong arguments");
}
if (! (data[2] instanceof ArrayList)) {
throw new PainterException("transform: wrong arguments");
}
ArrayList array = (ArrayList) data[2];
double[] entries = new double[6];
if (! (array.size() == 6)) {
throw new PainterException("transform: wrong arguments");
}
for (int i = 0; i < 6; i++) {
entries[i] = ( (Number) array.get(i)).doubleValue();
}
AffineTransform at = new AffineTransform(entries);
double numberdata[] = new double[2];
numberdata[0] = ( (Number) data[0]).doubleValue();
numberdata[1] = ( (Number) data[1]).doubleValue();
double[] transformedData = new double[2];
at.transform(numberdata, 0, transformedData, 0, 1);
context.operands.push(new Double(transformedData[0]));
context.operands.push(new Double(transformedData[1]));
}
}
});
// itransform
systemDict.put("itransform", new PACommand() {
public void execute(PAContext context) throws PainterException {
if (context.peekOperand() instanceof Number) {
double data[];
double[] transformedData = new double[2];
data = context.popNumberOperands(2);
AffineTransform at = context.pencil.graphics.getTransform();
try {
at.inverseTransform(data, 0, transformedData, 0, 1);
}
catch (NoninvertibleTransformException e) {
throw new PainterException(e.toString());
}
context.operands.push(new Double(transformedData[0]));
context.operands.push(new Double(transformedData[1]));
}
else {
Object data[];
data = context.popOperands(3);
if (! (data[0] instanceof Number)) {
throw new PainterException("itransform: wrong arguments");
}
if (! (data[1] instanceof Number)) {
throw new PainterException("itransform: wrong arguments");
}
if (! (data[2] instanceof ArrayList)) {
throw new PainterException("itransform: wrong arguments");
}
ArrayList array = (ArrayList) data[2];
double[] entries = new double[6];
if (! (array.size() == 6)) {
throw new PainterException("itransform: wrong arguments");
}
for (int i = 0; i < 6; i++) {
entries[i] = ( (Number) array.get(i)).doubleValue();
}
AffineTransform at = new AffineTransform(entries);
double numberdata[] = new double[2];
numberdata[0] = ( (Number) data[0]).doubleValue();
numberdata[1] = ( (Number) data[0]).doubleValue();
double[] transformedData = new double[2];
try {
at.inverseTransform(numberdata, 0, transformedData, 0, 1);
}
catch (NoninvertibleTransformException e) {
throw new PainterException(e.toString());
}
context.operands.push(new Double(transformedData[0]));
context.operands.push(new Double(transformedData[1]));
}
}
});
// currentpoint
// PENDING(uweh): what about CTM, same thing when you construct path
// this is different than ps, might not work in a few instances
systemDict.put("currentpoint", new PACommand() {
public void execute(PAContext context) throws PainterException {
Point2D currentPoint = context.pencil.state.path.getCurrentPoint();
context.operands.push(new Double(currentPoint.getX()));
context.operands.push(new Double(currentPoint.getY()));
}
});
// clippath
systemDict.put("clippath", new PACommand() {
public void execute(PAContext context) throws PainterException {
context.pencil.clippath();
}
});
// matrix
systemDict.put("matrix", new PACommand() {
public void execute(PAContext context) throws PainterException {
ArrayList identityMatrix = new ArrayList(6);
identityMatrix.add(new Double(1.0d));
identityMatrix.add(new Double(0.0d));
identityMatrix.add(new Double(0.0d));
identityMatrix.add(new Double(1.0d));
identityMatrix.add(new Double(0.0d));
identityMatrix.add(new Double(0.0d));
context.operands.push(identityMatrix);
}
});
// concatmatrix
systemDict.put("concatmatrix", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
data = context.popOperands(3);
if (! (data[0] instanceof ArrayList)) {
throw new PainterException("concatmatrix: wrong arguments");
}
if (! (data[1] instanceof ArrayList)) {
throw new PainterException("concatmatrix: wrong arguments");
}
if (! (data[2] instanceof ArrayList)) {
throw new PainterException("concatmatrix: wrong arguments");
}
ArrayList arrayOne, arrayTwo, arrayThree;
AffineTransform atOne, atTwo;
arrayOne = (ArrayList) data[0];
arrayTwo = (ArrayList) data[1];
arrayThree = (ArrayList) data[2];
double[] entries = new double[6];
if (! (arrayOne.size() == 6)) {
throw new PainterException("concatmatrix: wrong arguments");
}
if (! (arrayTwo.size() == 6)) {
throw new PainterException("concatmatrix: wrong arguments");
}
if (! (arrayThree.size() == 6)) {
throw new PainterException("concatmatrix: wrong arguments");
}
for (int i = 0; i < 6; i++) {
entries[i] = ( (Number) arrayOne.get(i)).doubleValue();
}
atOne = new AffineTransform(entries);
for (int i = 0; i < 6; i++) {
entries[i] = ( (Number) arrayTwo.get(i)).doubleValue();
}
atTwo = new AffineTransform(entries);
atOne.concatenate(atTwo);
atOne.getMatrix(entries);
for (int i = 0; i < 6; i++) {
arrayThree.set(i, new Double(entries[i]));
}
context.operands.push(arrayThree);
}
});
// pathbbox
systemDict.put("pathbbox", new PACommand() {
public void execute(PAContext context) throws PainterException {
Rectangle2D pathBounds = context.pencil.state.path.getBounds2D();
context.operands.push(new Double(pathBounds.getMinX()));
context.operands.push(new Double(pathBounds.getMinY()));
context.operands.push(new Double(pathBounds.getMaxX()));
context.operands.push(new Double(pathBounds.getMaxY()));
}
});
// initmatrix
systemDict.put("initmatrix", new PACommand() {
public void execute(PAContext context) throws PainterException {
PdfGraphics2D pdfg2d = (PdfGraphics2D) context.pencil.graphics;
PdfContentByte cb = pdfg2d.getContent();
// cb.transform(Affine);
}
});
// initclip
systemDict.put("initclip", new PACommand() {
public void execute(PAContext context) throws PainterException {
PdfGraphics2D pdfg2d = (PdfGraphics2D) context.pencil.graphics;
PdfContentByte cb = pdfg2d.getContent();
context.pencil.clippath();
// pdfg2d.setClip(context.);
// if(!PAContext.IgnoreUnknownCommands)
// throw new UnsupportedOperationException("initclip");
}
});
// truncate
systemDict.put("truncate", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
double truncated;
data = context.popNumberOperands(1);
if (data[0] < 0) {
truncated = Math.ceil(data[0]);
}
else {
truncated = Math.floor(data[0]);
}
context.operands.push(new Double(truncated));
}
});
// rand
systemDict.put("rand", new PACommand() {
public void execute(PAContext context) throws PainterException {
context.operands.push(new Integer(Math.abs(randomNumberGenerator.
nextInt( (1 << 31) - 1))));
}
});
// srand
systemDict.put("srand", new PACommand() {
public void execute(PAContext context) throws PainterException {
double data[];
data = context.popNumberOperands(1);
randomNumberGenerator = new Random(Math.round(data[0]));
}
});
// version
systemDict.put("version", new PACommand() {
public void execute(PAContext context) throws PainterException {
context.operands.push("2016");
}
});
// cvi
systemDict.put("cvi", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
data = context.popOperands(1);
if (! (data[0] instanceof Number) && ! (data[0] instanceof String)) {
throw new PainterException("cvi: wrong arguments");
}
if (data[0] instanceof Number) {
int d;
d = ( (Number) data[0]).intValue();
context.operands.push(new Integer(d));
}
else {
String s;
s = (String) data[0];
context.operands.push(new Integer(s));
}
}
});
// cvr
systemDict.put("cvr", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
data = context.popOperands(1);
if (! (data[0] instanceof Number) && ! (data[0] instanceof String)) {
throw new PainterException("cvr: wrong arguments");
}
if (data[0] instanceof Number) {
int d;
d = ( (Number) data[0]).intValue();
context.operands.push(new Double(d));
}
else {
String s;
s = (String) data[0];
context.operands.push(new Double(s));
}
}
});
// usertime
systemDict.put("usertime", new PACommand() {
public void execute(PAContext context) throws PainterException {
context.operands.push(new Long(System.currentTimeMillis()));
}
});
// save
systemDict.put("save", new PACommand() {
public void execute(PAContext context) throws PainterException {
PdfGraphics2D pdfg2d = (PdfGraphics2D) context.pencil.graphics;
PdfContentByte cb = pdfg2d.getContent();
cb.saveState();
context.operands.push(new Long(0));
}
});
// restore
systemDict.put("restore", new PACommand() {
public void execute(PAContext context) throws PainterException {
PdfGraphics2D pdfg2d = (PdfGraphics2D) context.pencil.graphics;
PdfContentByte cb = pdfg2d.getContent();
cb.restoreState();
Object data[];
data = context.popOperands(1);
}
});
// clear
systemDict.put("clear", new PACommand() {
public void execute(PAContext context) throws PainterException {
context.operands.clear();
}
});
// readonly
systemDict.put("readonly", new PACommand() {
public void execute(PAContext context) throws PainterException {
}
});
// currentfile
systemDict.put("currentfile", new PACommand() {
public void execute(PAContext context) throws PainterException {
final JavaCharStream jcs=context.poorscript.jj_input_stream;
InputStream ins=new InputStream(){
/**
* Reads the next byte of data from the input stream.
*
* @return the next byte of data, or -1
if the end of the stream is reached.
* @throws IOException if an I/O error occurs.
* @todo Implement this java.io.InputStream method
*/
public int read() throws IOException {
return jcs.readChar();
}
};
context.operands.push(ins);
}
});
// flushfile
systemDict.put("flushfile", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
data = context.popOperands(1);
if (! (data[0] instanceof InputStream)) {
throw new PainterException("flushfile: wrong arguments");
}
InputStream is = (InputStream) data[0];
try {
while (is.read() != -1) {
}
}
catch (IOException ex) {
}
}
});
// closefile
systemDict.put("closefile", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
data = context.popOperands(1);
if (! (data[0] instanceof InputStream)) {
throw new PainterException("closefile: wrong arguments");
}
InputStream is = (InputStream) data[0];
try {
is.close();
}
catch (IOException ex) {
}
}
});
// string
systemDict.put("string", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
data = context.popOperands(1);
if (! (data[0] instanceof Number)) {
throw new PainterException("string: wrong arguments");
}
int d;
d = ( (Number) data[0]).intValue();
StringBuffer sb = new StringBuffer(d);
sb.setLength(d);
context.operands.push(sb);
}
});
// null
systemDict.put("null", new PACommand() {
public void execute(PAContext context) throws PainterException {
context.operands.push(null);
}
});
// currentscreen
systemDict.put("currentscreen", new PACommand() {
public void execute(PAContext context) throws PainterException {
if (!PAContext.IgnoreUnknownCommands) {
throw new UnsupportedOperationException("currentscreen");
}
else {
context.operands.push(new Double(60));
context.operands.push(new Double(0));
context.operands.push(new Double(0));
}
}
});
// setscreen
systemDict.put("setscreen", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
data = context.popOperands(3);
// if (!PAContext.IgnoreUnknownCommands)
// throw new UnsupportedOperationException("setscreen");
// else {
//
// }
}
});
// flattenpath
systemDict.put("flattenpath", new PACommand() {
public void execute(PAContext context) throws PainterException {
}
});
// filter
systemDict.put("filter", new PACommand() {
public void execute(PAContext context) throws PainterException {
String filtername;
filtername = (String) ( (PAToken) context.popOperands(1)[0]).value;
Object obj;
while (! ( (obj = context.peekOperand()) instanceof InputStream)) {
Object param = context.popOperands(1);
}
InputStream datasrc;
datasrc = (InputStream) (context.popOperands(1)[0]);
InputStream dis;
if (filtername.equals("ASCIIHexDecode")) {
// dis = new ASCIIHexInputStream(datasrc);
final InputStream is=datasrc;
dis=new InputStream(){
/**
* Reads the next byte of data from the input stream.
*
* @return the next byte of data, or -1
if the end of the stream is reached.
* @throws IOException if an I/O error occurs.
* @todo Implement this java.io.InputStream method
*/
public int read() throws IOException {
int firstchar,secondchar;
for(;;){
firstchar=is.read();
if(firstchar==-1)return -1;
if(firstchar=='>')return -1;
if(firstchar=='\n')continue;
if(firstchar=='\r')continue;
break;
}
for(;;){
secondchar=is.read();
if(secondchar=='>')return -1;
if(secondchar==-1)return -1;
if(secondchar=='\n')continue;
if(secondchar=='\r')continue;
break;
}
int highbyte=0;
if(firstchar>=48&&firstchar<=57)highbyte=firstchar-48;
if(firstchar>=65&&firstchar<=70)highbyte=firstchar-55;
int lowbyte=0;
if(secondchar>=48&&secondchar<=57)lowbyte=secondchar-48;
if(secondchar>=65&&secondchar<=70)lowbyte=secondchar-55;
return(highbyte*16+lowbyte);
}
};
}
// else
// if (filtername.equals("DCTDecode")) {
// dis = new DCTInputStream(datasrc);
// }
else {
dis = datasrc;
}
context.operands.push(dis);
}
});
// clip
systemDict.put("clip", new PACommand() {
public void execute(PAContext context) throws PainterException {
context.pencil.clip();
}
});
// setcolorspace
systemDict.put("setcolorspace", new PACommand() {
public void execute(PAContext context) throws PainterException {
PdfGraphics2D pdfg2d = (PdfGraphics2D) context.pencil.graphics;
PdfContentByte cb = pdfg2d.getContent();
Object data[];
data = context.popOperands(1);
if (data[0] instanceof PAToken) {
String colorspace = ( (String) ( (PAToken) data[0]).value);
cb.setDefaultColorspace(PdfName.COLORSPACE, PdfName.DEVICERGB);
}
}
});
// image
systemDict.put("image", new PACommand() {
public void execute(PAContext context) throws PainterException {
PdfGraphics2D pdfg2d = (PdfGraphics2D) context.pencil.graphics;
PdfContentByte cb = pdfg2d.getContent();
Object data[];
data = context.popOperands(1);
if (data[0] instanceof Number) {
/**
* Level1 image
*/
int width = ( (Number) data[0]).intValue();
data = context.popOperands(4);
int height = ( (Number) data[0]).intValue();
int bits = ( (Number) data[1]).intValue();
}else if (data[0] instanceof PAToken) {
PAToken proc = (PAToken) data[0];
data = context.popOperands(4);
int width = ( (Number) data[0]).intValue();
int height = ( (Number) data[1]).intValue();
int bitspercomponent = ( (Number) data[2]).intValue();
ArrayList ar = (ArrayList) data[3];
System.out.println("I " + width + "*" + height + " " +
bitspercomponent + " " + ar);
// context.engine.process(proc);
}
else if (data[0] instanceof HashMap){
HashMap hsm = (HashMap) data[0];
Iterator it = hsm.keySet().iterator();
int width = 0, height = 0, bitspercomponent = 0;
int imagetype = 0;
InputStream datasrc = null;
Object decode = null;
Object imagematrix = null;
while (it.hasNext()) {
PAToken token = (PAToken) it.next();
if (token.value.toString().equals("ImageType")) {
imagetype = ( (Number) hsm.get(token)).intValue();
}
if (token.value.toString().equals("DataSource")) {
datasrc = (InputStream) hsm.get(token);
}
if (token.value.toString().equals("BitsPerComponent")) {
bitspercomponent = ( (Number) hsm.get(token)).intValue();
}
if (token.value.toString().equals("Width")) {
width = ( (Number) hsm.get(token)).intValue();
}
if (token.value.toString().equals("Height")) {
height = ( (Number) hsm.get(token)).intValue();
}
if (token.value.toString().equals("Decode")) {
decode = ( (Object) hsm.get(token));
}
if (token.value.toString().equals("ImageMatrix")) {
imagematrix = ( (Object) hsm.get(token));
}
}
try {
byte[] barr = {};
ByteArrayOutputStream bout = new ByteArrayOutputStream();
int aByte;
while ( (aByte = datasrc.read()) >= 0) {
bout.write(aByte);
// System.out.print((char)aByte);
}
System.out.println("I " + width + "*" + height + " " +
bitspercomponent + " " + imagetype + " " +
decode + " " + imagematrix + " " + datasrc);
barr = bout.toByteArray();
// com.lowagie.text.Image img = new ImgRaw(width, height, 1,
// bitspercomponent, barr);
com.lowagie.text.Image img = new Jpeg(barr);
try {
cb.addImage(img,width,0,0,height,0,0);
}
catch (DocumentException ex1) {
ex1.printStackTrace();
}
}
catch (IOException ex) {
ex.printStackTrace();
}
catch (BadElementException ex) {
ex.printStackTrace();
}
}
}
});
// imagemask
systemDict.put("imagemask", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
data = context.popOperands(5);
// if (data[0] instanceof PAToken) {
// PAToken token = (PAToken) data[0];
// context.engine.process(token);
// }
}
});
// exec
systemDict.put("exec", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
data = context.popOperands(1);
if (data[0] instanceof PAToken) {
PAToken token = (PAToken) data[0];
context.engine.process(token);
}
}
});
// currentdict
systemDict.put("currentdict", new PACommand() {
public void execute(PAContext context) throws PainterException {
context.operands.push(context.dictionaries.peek());
}
});
// cleardictstack
systemDict.put("cleardictstack", new PACommand() {
public void execute(PAContext context) throws PainterException {
context.dictionaries.clear();
HashMap systemDict = context.constructSystemDict();
context.dictionaries.push(systemDict);
HashMap globalDict = context.constructGlobalDict();
context.dictionaries.push(globalDict);
HashMap userDict = context.constructUserDict();
systemDict.put("userdict", userDict);
systemDict.put("globaldict", globalDict);
context.dictionaries.push(userDict);
}
});
// charpath
systemDict.put("charpath", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
data = context.popOperands(2);
if (! (data[0] instanceof String)) {
throw new PainterException("charpath: wrong arguments");
}
if (! (data[1] instanceof Boolean)) {
throw new PainterException("charpath: wrong arguments");
}
context.pencil.charpath( (String) data[0],
( (Boolean) data[1]).booleanValue());
}
});
// PENDING(uweh): we only support procedure right now and always push false on the stack
// stopped
systemDict.put("stopped", new PACommand() {
public void execute(PAContext context) throws PainterException {
Object data[];
PAToken patoken;
data = context.popOperands(1);
if (! (data[0] instanceof PAToken)) {
throw new PainterException("stopped: wrong arguments");
}
patoken = (PAToken) data[0];
if (! (patoken.type == PAToken.PROCEDURE)) {
throw new PainterException("stopped: wrong arguments");
}
context.engine.process(patoken);
context.operands.push(new Boolean(false));
}
});
systemDict.put("systemdict", systemDict);
return systemDict;
}
/**
*
Title:
* *Description:
* *Copyright: Copyright (c) 2006
* *Company:
* @author not attributable * @version 1.0 */ private class NamedInputStream extends InputStream{ public String filename; InputStream in; NamedInputStream(InputStream in,String filename) { super(); this.filename=filename; this.in=in; } public int read() throws IOException { return in.read(); } } }