public override void Execute(EpsInterpreter interpreter) { var operandStack = interpreter.OperandStack; var operand2 = operandStack.Pop(); var operand1 = operandStack.Pop(); var integer1 = operand1 as IntegerOperand; var integer2 = operand2 as IntegerOperand; if (integer1 != null && integer2 != null) { var res = new IntegerOperand(); res.Value = integer1.Value / integer2.Value; operandStack.Push(res); } else { var double1 = OperandHelper.GetRealValue(operand1); var double2 = OperandHelper.GetRealValue(operand2); var res = new RealOperand(); res.Value = double1 / double2; operandStack.Push(res); } }
public override void Execute(EpsInterpreter interpreter) { var operandStack = interpreter.OperandStack; var operand = operandStack.Pop(); double ret; switch (operand) { case StringOperand stringOperand: { ret = double.Parse(stringOperand.Value, CultureInfo.InvariantCulture); break; } case IntegerOperand intOperand: { ret = intOperand.Value; break; } case RealOperand realOperand: { ret = realOperand.Value; break; } default: throw new Exception("illegal operator"); } var real = new RealOperand(ret); operandStack.Push(real); }
public override void Execute(EpsInterpreter interpreter) { var operandStack = interpreter.OperandStack; var res = new RealOperand(); res.Value = RandomHelper.Rrand(); operandStack.Push(res); }
public override void Execute(EpsInterpreter interpreter) { var operandStack = interpreter.OperandStack; var real = operandStack.PopRealValue(); var res = new RealOperand(); res.Value = Math.Sqrt(real); operandStack.Push(res); }
public override void Execute(EpsInterpreter interpreter) { var operandStack = interpreter.OperandStack; var intOp = operandStack.PopInteger(); var res = new RealOperand(); RandomHelper.Srand(intOp.Value); operandStack.Push(res); }
public override void Execute(EpsInterpreter interpreter) { var operandStack = interpreter.OperandStack; GraphicsState graphicState = interpreter.GraphicState; var currentPoint = graphicState.CurrentPoint; var realOp = new RealOperand(currentPoint.X); operandStack.Push(realOp); realOp = new RealOperand(currentPoint.Y); operandStack.Push(realOp); }
public override void Execute(EpsInterpreter interpreter) { var operandStack = interpreter.OperandStack; var operand = operandStack.Pop(); if (operand is IntegerOperand integer) { operandStack.Push(operand); } else { var real = (RealOperand)operand; var res = new RealOperand(); res.Value = Math.Round(real.Value); operandStack.Push(res); } }
/// <summary> /// Gets the next operand /// </summary> public Operand GetNextOperand() { var symbol = lexer.ScanNextToken(reader); switch (symbol) { case LexerToken.Eof: { return(null); } case LexerToken.DscComment: { // We handle each comment that starts at the beginning of a // line as a dsc comment. That enables us to handle some // special Illustrator comments. DscCommentOperand dscOp = new DscCommentOperand(); dscOp.LineNumber = reader.LineNumber; dscOp.Name = lexer.StringToken; if (!reader.IsAtEndOfLine) { // The number and types and syntax of the parameters depend // on the dsc comment and vary pretty much. That's why we // cannot scan and parse the parameters here. Just pass the // pure rest of the line to the dsc comment, it needs to do // the rest :-( var restOfLine = reader.ReadLine(); dscOp.Parameters = restOfLine.Trim(); } return(dscOp); } case LexerToken.Integer: { IntegerOperand n = new IntegerOperand(); n.LineNumber = reader.LineNumber; n.Value = lexer.IntegerToken; return(n); } case LexerToken.Real: { RealOperand r = new RealOperand(); r.LineNumber = reader.LineNumber; r.Value = lexer.RealToken; return(r); } case LexerToken.String: { var s = new StringOperand(); s.LineNumber = reader.LineNumber; s.Value = lexer.StringToken; s.Type = StringType.Standard; return(s); } case LexerToken.HexString: { var s = new StringOperand(); s.LineNumber = reader.LineNumber; s.Value = lexer.StringToken; s.Type = StringType.Hex; return(s); } case LexerToken.AsciiBase85String: { var s = new StringOperand(); s.LineNumber = reader.LineNumber; s.Value = lexer.StringToken; s.Type = StringType.AsciiBase85; return(s); } case LexerToken.Name: { NameOperand name = new NameOperand(); name.LineNumber = reader.LineNumber; name.Value = lexer.StringToken; return(name); } case LexerToken.Operator: { var op = new OperatorOperand(); op.LineNumber = reader.LineNumber; op.Name = lexer.StringToken; return(op); } case LexerToken.ImmediateOperator: { var op = new ImmediateOperand(); op.LineNumber = reader.LineNumber; op.Name = lexer.StringToken; return(op); } case LexerToken.BeginDictionary: { var op = new MarkOperand(); op.LineNumber = reader.LineNumber; return(op); } case LexerToken.EndDictionary: { var op = new EndDictionaryOperand(); op.LineNumber = reader.LineNumber; return(op); } case LexerToken.BeginArray: { var op = new MarkOperand(); op.LineNumber = reader.LineNumber; return(op); } case LexerToken.EndArray: { var op = new EndArrayOperand(); op.LineNumber = reader.LineNumber; return(op); } case LexerToken.BeginProcedure: { var op = new BeginProcedureOperand(); op.LineNumber = reader.LineNumber; return(op); } case LexerToken.EndProcedure: { var op = new EndProcedureOperand(); op.LineNumber = reader.LineNumber; return(op); } default: throw new Exception("unhandled token"); } }