mirror of
https://github.com/unidoc/unipdf.git
synced 2025-04-26 13:48:55 +08:00
119 lines
32 KiB
Go
119 lines
32 KiB
Go
//
|
|
// Copyright 2020 FoxyUtils ehf. All rights reserved.
|
|
//
|
|
// This is a commercial product and requires a license to operate.
|
|
// A trial license can be obtained at https://unidoc.io
|
|
//
|
|
// DO NOT EDIT: generated by unitwist Go source code obfuscator.
|
|
//
|
|
// Use of this source code is governed by the UniDoc End User License Agreement
|
|
// terms that can be accessed at https://unidoc.io/eula/
|
|
|
|
// Package ps implements various functionalities needed for handling Postscript for PDF uses, in particular
|
|
// for PDF function type 4.
|
|
//
|
|
// Package ps implements various functionalities needed for handling Postscript for PDF uses, in particular
|
|
// for PDF function type 4.
|
|
package ps ;import (_gc "bufio";_b "bytes";_e "errors";_ff "fmt";_ee "github.com/unidoc/unipdf/v3/common";_c "github.com/unidoc/unipdf/v3/core";_f "io";_gg "math";);
|
|
|
|
// NewPSProgram returns an empty, initialized PSProgram.
|
|
func NewPSProgram ()*PSProgram {return &PSProgram {}};
|
|
|
|
// PSReal represents a real number.
|
|
type PSReal struct{Val float64 ;};func (_fa *PSReal )Duplicate ()PSObject {_bd :=PSReal {};_bd .Val =_fa .Val ;return &_bd };
|
|
|
|
// Execute executes the program for an input parameters `objects` and returns a slice of output objects.
|
|
func (_fg *PSExecutor )Execute (objects []PSObject )([]PSObject ,error ){for _ ,_ed :=range objects {_ac :=_fg .Stack .Push (_ed );if _ac !=nil {return nil ,_ac ;};};_acb :=_fg ._ge .Exec (_fg .Stack );if _acb !=nil {_ee .Log .Debug ("\u0045x\u0065c\u0020\u0066\u0061\u0069\u006c\u0065\u0064\u003a\u0020\u0025\u0076",_acb );return nil ,_acb ;};_fcf :=[]PSObject (*_fg .Stack );_fg .Stack .Empty ();return _fcf ,nil ;};
|
|
|
|
// PSParser is a basic Postscript parser.
|
|
type PSParser struct{_cacf *_gc .Reader };func (_fde *PSParser )parseOperand ()(*PSOperand ,error ){var _abdg []byte ;for {_abc ,_eccb :=_fde ._cacf .Peek (1);if _eccb !=nil {if _eccb ==_f .EOF {break ;};return nil ,_eccb ;};if _c .IsDelimiter (_abc [0]){break ;};if _c .IsWhiteSpace (_abc [0]){break ;};_eabf ,_ :=_fde ._cacf .ReadByte ();_abdg =append (_abdg ,_eabf );};if len (_abdg )==0{return nil ,_e .New ("\u0069\u006e\u0076al\u0069\u0064\u0020\u006f\u0070\u0065\u0072\u0061\u006e\u0064\u0020\u0028\u0065\u006d\u0070\u0074\u0079\u0029");};return MakeOperand (string (_abdg )),nil ;};func (_ab *PSOperand )add (_fbf *PSStack )error {_dfc ,_fed :=_fbf .Pop ();if _fed !=nil {return _fed ;};_ffa ,_fed :=_fbf .Pop ();if _fed !=nil {return _fed ;};_ffc ,_fcg :=_dfc .(*PSReal );_edgb ,_efd :=_dfc .(*PSInteger );if !_fcg &&!_efd {return ErrTypeCheck ;};_bf ,_dg :=_ffa .(*PSReal );_affg ,_eae :=_ffa .(*PSInteger );if !_dg &&!_eae {return ErrTypeCheck ;};if _efd &&_eae {_dd :=_edgb .Val +_affg .Val ;_cfgd :=_fbf .Push (MakeInteger (_dd ));return _cfgd ;};var _dfg float64 =0;if _fcg {_dfg =_ffc .Val ;}else {_dfg =float64 (_edgb .Val );};if _dg {_dfg +=_bf .Val ;}else {_dfg +=float64 (_affg .Val );};_fed =_fbf .Push (MakeReal (_dfg ));return _fed ;};func (_cfe *PSParser )parseBool ()(*PSBoolean ,error ){_edac ,_cebe :=_cfe ._cacf .Peek (4);if _cebe !=nil {return MakeBool (false ),_cebe ;};if (len (_edac )>=4)&&(string (_edac [:4])=="\u0074\u0072\u0075\u0065"){_cfe ._cacf .Discard (4);return MakeBool (true ),nil ;};_edac ,_cebe =_cfe ._cacf .Peek (5);if _cebe !=nil {return MakeBool (false ),_cebe ;};if (len (_edac )>=5)&&(string (_edac [:5])=="\u0066\u0061\u006cs\u0065"){_cfe ._cacf .Discard (5);return MakeBool (false ),nil ;};return MakeBool (false ),_e .New ("\u0075n\u0065\u0078\u0070\u0065c\u0074\u0065\u0064\u0020\u0062o\u006fl\u0065a\u006e\u0020\u0073\u0074\u0072\u0069\u006eg");};
|
|
|
|
// PSObjectArrayToFloat64Array converts []PSObject into a []float64 array. Each PSObject must represent a number,
|
|
// otherwise a ErrTypeCheck error occurs.
|
|
func PSObjectArrayToFloat64Array (objects []PSObject )([]float64 ,error ){var _d []float64 ;for _ ,_ag :=range objects {if _cf ,_fe :=_ag .(*PSInteger );_fe {_d =append (_d ,float64 (_cf .Val ));}else if _da ,_gd :=_ag .(*PSReal );_gd {_d =append (_d ,_da .Val );}else {return nil ,ErrTypeCheck ;};};return _d ,nil ;};var ErrUndefinedResult =_e .New ("\u0075\u006e\u0064\u0065fi\u006e\u0065\u0064\u0020\u0072\u0065\u0073\u0075\u006c\u0074\u0020\u0065\u0072\u0072o\u0072");func (_egg *PSOperand )exch (_gea *PSStack )error {_dfgc ,_bggg :=_gea .Pop ();if _bggg !=nil {return _bggg ;};_dcdd ,_bggg :=_gea .Pop ();if _bggg !=nil {return _bggg ;};_bggg =_gea .Push (_dfgc );if _bggg !=nil {return _bggg ;};_bggg =_gea .Push (_dcdd );return _bggg ;};
|
|
|
|
// Empty empties the stack.
|
|
func (_gfab *PSStack )Empty (){*_gfab =[]PSObject {}};var ErrTypeCheck =_e .New ("\u0074\u0079p\u0065\u0020\u0063h\u0065\u0063\u006b\u0020\u0065\u0072\u0072\u006f\u0072");func (_ad *PSReal )String ()string {return _ff .Sprintf ("\u0025\u002e\u0035\u0066",_ad .Val )};
|
|
|
|
// PSExecutor has its own execution stack and is used to executre a PS routine (program).
|
|
type PSExecutor struct{Stack *PSStack ;_ge *PSProgram ;};func (_gcfc *PSOperand )pop (_eab *PSStack )error {_ ,_aeg :=_eab .Pop ();if _aeg !=nil {return _aeg ;};return nil ;};func (_dga *PSOperand )le (_egfe *PSStack )error {_cgf ,_bec :=_egfe .PopNumberAsFloat64 ();if _bec !=nil {return _bec ;};_fgdb ,_bec :=_egfe .PopNumberAsFloat64 ();if _bec !=nil {return _bec ;};if _gg .Abs (_fgdb -_cgf )< _a {_eea :=_egfe .Push (MakeBool (true ));return _eea ;}else if _fgdb < _cgf {_fbag :=_egfe .Push (MakeBool (true ));return _fbag ;}else {_fcd :=_egfe .Push (MakeBool (false ));return _fcd ;};};func (_bgd *PSOperand )gt (_agg *PSStack )error {_faed ,_gffc :=_agg .PopNumberAsFloat64 ();if _gffc !=nil {return _gffc ;};_ebf ,_gffc :=_agg .PopNumberAsFloat64 ();if _gffc !=nil {return _gffc ;};if _gg .Abs (_ebf -_faed )< _a {_fcagf :=_agg .Push (MakeBool (false ));return _fcagf ;}else if _ebf > _faed {_eed :=_agg .Push (MakeBool (true ));return _eed ;}else {_eaae :=_agg .Push (MakeBool (false ));return _eaae ;};};
|
|
|
|
// NewPSStack returns an initialized PSStack.
|
|
func NewPSStack ()*PSStack {return &PSStack {}};func (_bgf *PSOperand )cvi (_dfa *PSStack )error {_fdg ,_ebc :=_dfa .Pop ();if _ebc !=nil {return _ebc ;};if _dcf ,_cac :=_fdg .(*PSReal );_cac {_ddf :=int (_dcf .Val );_ebc =_dfa .Push (MakeInteger (_ddf ));}else if _fec ,_gfa :=_fdg .(*PSInteger );_gfa {_cd :=_fec .Val ;_ebc =_dfa .Push (MakeInteger (_cd ));}else {return ErrTypeCheck ;};return _ebc ;};func (_fae *PSOperand )copy (_abd *PSStack )error {_fdf ,_cgee :=_abd .PopInteger ();if _cgee !=nil {return _cgee ;};if _fdf < 0{return ErrRangeCheck ;};if _fdf > len (*_abd ){return ErrRangeCheck ;};*_abd =append (*_abd ,(*_abd )[len (*_abd )-_fdf :]...);return nil ;};
|
|
|
|
// PSObject represents a postscript object.
|
|
type PSObject interface{
|
|
|
|
// Duplicate makes a fresh copy of the PSObject.
|
|
Duplicate ()PSObject ;
|
|
|
|
// DebugString returns a descriptive representation of the PSObject with more information than String()
|
|
// for debugging purposes.
|
|
DebugString ()string ;
|
|
|
|
// String returns a string representation of the PSObject.
|
|
String ()string ;};func (_ebd *PSOperand )not (_fea *PSStack )error {_gfbe ,_abea :=_fea .Pop ();if _abea !=nil {return _abea ;};if _aaa ,_ccaa :=_gfbe .(*PSBoolean );_ccaa {_abea =_fea .Push (MakeBool (!_aaa .Val ));return _abea ;}else if _fedf ,_bfga :=_gfbe .(*PSInteger );_bfga {_abea =_fea .Push (MakeInteger (^_fedf .Val ));return _abea ;}else {return ErrTypeCheck ;};};func (_gge *PSProgram )Duplicate ()PSObject {_ebg :=&PSProgram {};for _ ,_geb :=range *_gge {_ebg .Append (_geb .Duplicate ());};return _ebg ;};func (_cgd *PSOperand )log (_fdce *PSStack )error {_dcee ,_ccb :=_fdce .PopNumberAsFloat64 ();if _ccb !=nil {return _ccb ;};_dbe :=_gg .Log10 (_dcee );_ccb =_fdce .Push (MakeReal (_dbe ));return _ccb ;};func (_fag *PSBoolean )String ()string {return _ff .Sprintf ("\u0025\u0076",_fag .Val )};func (_bdd *PSBoolean )Duplicate ()PSObject {_ea :=PSBoolean {};_ea .Val =_bdd .Val ;return &_ea };func (_bfa *PSOperand )cos (_fcag *PSStack )error {_gdf ,_ccg :=_fcag .PopNumberAsFloat64 ();if _ccg !=nil {return _ccg ;};_ebgc :=_gg .Cos (_gdf *_gg .Pi /180.0);_ccg =_fcag .Push (MakeReal (_ebgc ));return _ccg ;};func (_cdfg *PSParser )skipSpaces ()(int ,error ){_bgab :=0;for {_fcgb ,_adbe :=_cdfg ._cacf .Peek (1);if _adbe !=nil {return 0,_adbe ;};if _c .IsWhiteSpace (_fcgb [0]){_cdfg ._cacf .ReadByte ();_bgab ++;}else {break ;};};return _bgab ,nil ;};func (_bag *PSOperand )sin (_cdg *PSStack )error {_fcgff ,_bea :=_cdg .PopNumberAsFloat64 ();if _bea !=nil {return _bea ;};_gadg :=_gg .Sin (_fcgff *_gg .Pi /180.0);_bea =_cdg .Push (MakeReal (_gadg ));return _bea ;};func (_gef *PSOperand )cvr (_bce *PSStack )error {_bfg ,_gff :=_bce .Pop ();if _gff !=nil {return _gff ;};if _baad ,_cfd :=_bfg .(*PSReal );_cfd {_gff =_bce .Push (MakeReal (_baad .Val ));}else if _bga ,_aae :=_bfg .(*PSInteger );_aae {_gff =_bce .Push (MakeReal (float64 (_bga .Val )));}else {return ErrTypeCheck ;};return _gff ;};func (_edgbc *PSParser )parseFunction ()(*PSProgram ,error ){_gec ,_ :=_edgbc ._cacf .ReadByte ();if _gec !='{'{return nil ,_e .New ("\u0069\u006ev\u0061\u006c\u0069d\u0020\u0066\u0075\u006e\u0063\u0074\u0069\u006f\u006e");};_bdgc :=NewPSProgram ();for {_edgbc .skipSpaces ();_gceg ,_dbd :=_edgbc ._cacf .Peek (2);if _dbd !=nil {if _dbd ==_f .EOF {break ;};return nil ,_dbd ;};_ee .Log .Trace ("\u0050e\u0065k\u0020\u0073\u0074\u0072\u0069\u006e\u0067\u003a\u0020\u0025\u0073",string (_gceg ));if _gceg [0]=='}'{_ee .Log .Trace ("\u0045\u004f\u0046 \u0066\u0075\u006e\u0063\u0074\u0069\u006f\u006e");_edgbc ._cacf .ReadByte ();break ;}else if _gceg [0]=='{'{_ee .Log .Trace ("\u0046u\u006e\u0063\u0074\u0069\u006f\u006e!");_eeg ,_efe :=_edgbc .parseFunction ();if _efe !=nil {return nil ,_efe ;};_bdgc .Append (_eeg );}else if _c .IsDecimalDigit (_gceg [0])||(_gceg [0]=='-'&&_c .IsDecimalDigit (_gceg [1])){_ee .Log .Trace ("\u002d>\u004e\u0075\u006d\u0062\u0065\u0072!");_accg ,_decb :=_edgbc .parseNumber ();if _decb !=nil {return nil ,_decb ;};_bdgc .Append (_accg );}else {_ee .Log .Trace ("\u002d>\u004fp\u0065\u0072\u0061\u006e\u0064 \u006f\u0072 \u0062\u006f\u006f\u006c\u003f");_gceg ,_ =_edgbc ._cacf .Peek (5);_edbc :=string (_gceg );_ee .Log .Trace ("\u0050\u0065\u0065k\u0020\u0073\u0074\u0072\u003a\u0020\u0025\u0073",_edbc );if (len (_edbc )> 4)&&(_edbc [:5]=="\u0066\u0061\u006cs\u0065"){_dde ,_adbd :=_edgbc .parseBool ();if _adbd !=nil {return nil ,_adbd ;};_bdgc .Append (_dde );}else if (len (_edbc )> 3)&&(_edbc [:4]=="\u0074\u0072\u0075\u0065"){_edge ,_bgcd :=_edgbc .parseBool ();if _bgcd !=nil {return nil ,_bgcd ;};_bdgc .Append (_edge );}else {_adgf ,_eaec :=_edgbc .parseOperand ();if _eaec !=nil {return nil ,_eaec ;};_bdgc .Append (_adgf );};};};return _bdgc ,nil ;};func (_eec *PSParser )parseNumber ()(PSObject ,error ){_bage ,_gbc :=_c .ParseNumber (_eec ._cacf );if _gbc !=nil {return nil ,_gbc ;};switch _fcfe :=_bage .(type ){case *_c .PdfObjectFloat :return MakeReal (float64 (*_fcfe )),nil ;case *_c .PdfObjectInteger :return MakeInteger (int (*_fcfe )),nil ;};return nil ,_ff .Errorf ("\u0075n\u0068\u0061\u006e\u0064\u006c\u0065\u0064\u0020\u006e\u0075\u006db\u0065\u0072\u0020\u0074\u0079\u0070\u0065\u0020\u0025\u0054",_bage );};func (_fdfc *PSOperand )index (_eeba *PSStack )error {_gee ,_edc :=_eeba .Pop ();if _edc !=nil {return _edc ;};_cad ,_gbb :=_gee .(*PSInteger );if !_gbb {return ErrTypeCheck ;};if _cad .Val < 0{return ErrRangeCheck ;};if _cad .Val > len (*_eeba )-1{return ErrStackUnderflow ;};_gce :=(*_eeba )[len (*_eeba )-1-_cad .Val ];_edc =_eeba .Push (_gce .Duplicate ());return _edc ;};func (_be *PSOperand )idiv (_gfb *PSStack )error {_de ,_egc :=_gfb .Pop ();if _egc !=nil {return _egc ;};_ddc ,_egc :=_gfb .Pop ();if _egc !=nil {return _egc ;};_eeda ,_eff :=_de .(*PSInteger );if !_eff {return ErrTypeCheck ;};if _eeda .Val ==0{return ErrUndefinedResult ;};_cca ,_eff :=_ddc .(*PSInteger );if !_eff {return ErrTypeCheck ;};_dac :=_cca .Val /_eeda .Val ;_egc =_gfb .Push (MakeInteger (_dac ));return _egc ;};func (_afd *PSOperand )DebugString ()string {return _ff .Sprintf ("\u006fp\u003a\u0027\u0025\u0073\u0027",*_afd );};func (_cc *PSProgram )String ()string {_bg :="\u007b\u0020";for _ ,_db :=range *_cc {_bg +=_db .String ();_bg +="\u0020";};_bg +="\u007d";return _bg ;};func (_gf *PSProgram )DebugString ()string {_eag :="\u007b\u0020";for _ ,_dae :=range *_gf {_eag +=_dae .DebugString ();_eag +="\u0020";};_eag +="\u007d";return _eag ;};
|
|
|
|
// PSInteger represents an integer.
|
|
type PSInteger struct{Val int ;};func (_abe *PSOperand )bitshift (_gcb *PSStack )error {_eaa ,_fga :=_gcb .PopInteger ();if _fga !=nil {return _fga ;};_eg ,_fga :=_gcb .PopInteger ();if _fga !=nil {return _fga ;};var _dbc int ;if _eaa >=0{_dbc =_eg <<uint (_eaa );}else {_dbc =_eg >>uint (-_eaa );};_fga =_gcb .Push (MakeInteger (_dbc ));return _fga ;};
|
|
|
|
// PopInteger specificially pops an integer from the top of the stack, returning the value as an int.
|
|
func (_feaa *PSStack )PopInteger ()(int ,error ){_cgff ,_bgad :=_feaa .Pop ();if _bgad !=nil {return 0,_bgad ;};if _eef ,_cdb :=_cgff .(*PSInteger );_cdb {return _eef .Val ,nil ;};return 0,ErrTypeCheck ;};
|
|
|
|
// Parse parses the postscript and store as a program that can be executed.
|
|
func (_geef *PSParser )Parse ()(*PSProgram ,error ){_geef .skipSpaces ();_dec ,_ebdd :=_geef ._cacf .Peek (2);if _ebdd !=nil {return nil ,_ebdd ;};if _dec [0]!='{'{return nil ,_e .New ("\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0050\u0053\u0020\u0050\u0072\u006f\u0067\u0072\u0061\u006d\u0020\u006e\u006f\u0074\u0020\u0073t\u0061\u0072\u0074\u0069\u006eg\u0020\u0077i\u0074\u0068\u0020\u007b");};_dgc ,_ebdd :=_geef .parseFunction ();if _ebdd !=nil &&_ebdd !=_f .EOF {return nil ,_ebdd ;};return _dgc ,_ebdd ;};func (_bad *PSOperand )ifCondition (_ecb *PSStack )error {_cbe ,_bddd :=_ecb .Pop ();if _bddd !=nil {return _bddd ;};_fad ,_bddd :=_ecb .Pop ();if _bddd !=nil {return _bddd ;};_bbg ,_egge :=_cbe .(*PSProgram );if !_egge {return ErrTypeCheck ;};_dcfg ,_egge :=_fad .(*PSBoolean );if !_egge {return ErrTypeCheck ;};if _dcfg .Val {_adf :=_bbg .Exec (_ecb );return _adf ;};return nil ;};func (_ddfb *PSOperand )exp (_bbb *PSStack )error {_bca ,_bcaf :=_bbb .PopNumberAsFloat64 ();if _bcaf !=nil {return _bcaf ;};_cga ,_bcaf :=_bbb .PopNumberAsFloat64 ();if _bcaf !=nil {return _bcaf ;};if _gg .Abs (_bca )< 1&&_cga < 0{return ErrUndefinedResult ;};_aadc :=_gg .Pow (_cga ,_bca );_bcaf =_bbb .Push (MakeReal (_aadc ));return _bcaf ;};
|
|
|
|
// Append appends an object to the PSProgram.
|
|
func (_df *PSProgram )Append (obj PSObject ){*_df =append (*_df ,obj )};
|
|
|
|
// MakeBool returns a new PSBoolean object initialized with `val`.
|
|
func MakeBool (val bool )*PSBoolean {_gcgd :=PSBoolean {};_gcgd .Val =val ;return &_gcgd };func (_gga *PSOperand )ifelse (_adfc *PSStack )error {_fdcc ,_acc :=_adfc .Pop ();if _acc !=nil {return _acc ;};_bada ,_acc :=_adfc .Pop ();if _acc !=nil {return _acc ;};_gcd ,_acc :=_adfc .Pop ();if _acc !=nil {return _acc ;};_eda ,_ced :=_fdcc .(*PSProgram );if !_ced {return ErrTypeCheck ;};_cgg ,_ced :=_bada .(*PSProgram );if !_ced {return ErrTypeCheck ;};_ggdc ,_ced :=_gcd .(*PSBoolean );if !_ced {return ErrTypeCheck ;};if _ggdc .Val {_edda :=_cgg .Exec (_adfc );return _edda ;};_acc =_eda .Exec (_adfc );return _acc ;};func (_ef *PSBoolean )DebugString ()string {return _ff .Sprintf ("\u0062o\u006f\u006c\u003a\u0025\u0076",_ef .Val );};func (_cbg *PSOperand )and (_gfd *PSStack )error {_cg ,_gba :=_gfd .Pop ();if _gba !=nil {return _gba ;};_efce ,_gba :=_gfd .Pop ();if _gba !=nil {return _gba ;};if _ddb ,_ddba :=_cg .(*PSBoolean );_ddba {_ged ,_gca :=_efce .(*PSBoolean );if !_gca {return ErrTypeCheck ;};_gba =_gfd .Push (MakeBool (_ddb .Val &&_ged .Val ));return _gba ;};if _fede ,_ggg :=_cg .(*PSInteger );_ggg {_aa ,_gdd :=_efce .(*PSInteger );if !_gdd {return ErrTypeCheck ;};_gba =_gfd .Push (MakeInteger (_fede .Val &_aa .Val ));return _gba ;};return ErrTypeCheck ;};func (_eac *PSOperand )div (_gffd *PSStack )error {_ae ,_bggf :=_gffd .Pop ();if _bggf !=nil {return _bggf ;};_egfb ,_bggf :=_gffd .Pop ();if _bggf !=nil {return _bggf ;};_ebce ,_dgb :=_ae .(*PSReal );_affe ,_egb :=_ae .(*PSInteger );if !_dgb &&!_egb {return ErrTypeCheck ;};if _dgb &&_ebce .Val ==0{return ErrUndefinedResult ;};if _egb &&_affe .Val ==0{return ErrUndefinedResult ;};_gcc ,_cgb :=_egfb .(*PSReal );_fba ,_bfed :=_egfb .(*PSInteger );if !_cgb &&!_bfed {return ErrTypeCheck ;};var _fcgf float64 =0;if _cgb {_fcgf =_gcc .Val ;}else {_fcgf =float64 (_fba .Val );};if _dgb {_fcgf /=_ebce .Val ;}else {_fcgf /=float64 (_affe .Val );};_bggf =_gffd .Push (MakeReal (_fcgf ));return _bggf ;};
|
|
|
|
// String returns a string representation of the stack.
|
|
func (_ddbe *PSStack )String ()string {_gfba :="\u005b\u0020";for _ ,_bdbf :=range *_ddbe {_gfba +=_bdbf .String ();_gfba +="\u0020";};_gfba +="\u005d";return _gfba ;};
|
|
|
|
// Pop pops an object from the top of the stack.
|
|
func (_agag *PSStack )Pop ()(PSObject ,error ){if len (*_agag )< 1{return nil ,ErrStackUnderflow ;};_gcdd :=(*_agag )[len (*_agag )-1];*_agag =(*_agag )[0:len (*_agag )-1];return _gcdd ,nil ;};func _bbf (_ded int )int {if _ded < 0{return -_ded ;};return _ded ;};func (_efad *PSOperand )lt (_ddbb *PSStack )error {_ceb ,_bed :=_ddbb .PopNumberAsFloat64 ();if _bed !=nil {return _bed ;};_ecc ,_bed :=_ddbb .PopNumberAsFloat64 ();if _bed !=nil {return _bed ;};if _gg .Abs (_ecc -_ceb )< _a {_dcfa :=_ddbb .Push (MakeBool (false ));return _dcfa ;}else if _ecc < _ceb {_aba :=_ddbb .Push (MakeBool (true ));return _aba ;}else {_fce :=_ddbb .Push (MakeBool (false ));return _fce ;};};func (_efc *PSOperand )abs (_dff *PSStack )error {_afg ,_fca :=_dff .Pop ();if _fca !=nil {return _fca ;};if _eagg ,_edg :=_afg .(*PSReal );_edg {_bb :=_eagg .Val ;if _bb < 0{_fca =_dff .Push (MakeReal (-_bb ));}else {_fca =_dff .Push (MakeReal (_bb ));};}else if _baf ,_caf :=_afg .(*PSInteger );_caf {_cee :=_baf .Val ;if _cee < 0{_fca =_dff .Push (MakeInteger (-_cee ));}else {_fca =_dff .Push (MakeInteger (_cee ));};}else {return ErrTypeCheck ;};return _fca ;};
|
|
|
|
// DebugString returns a descriptive string representation of the stack - intended for debugging.
|
|
func (_bcb *PSStack )DebugString ()string {_gdea :="\u005b\u0020";for _ ,_fgaf :=range *_bcb {_gdea +=_fgaf .DebugString ();_gdea +="\u0020";};_gdea +="\u005d";return _gdea ;};var ErrStackOverflow =_e .New ("\u0073\u0074\u0061\u0063\u006b\u0020\u006f\u0076\u0065r\u0066\u006c\u006f\u0077");func (_aafe *PSOperand )or (_aec *PSStack )error {_afa ,_dba :=_aec .Pop ();if _dba !=nil {return _dba ;};_gcdf ,_dba :=_aec .Pop ();if _dba !=nil {return _dba ;};if _ggc ,_gedc :=_afa .(*PSBoolean );_gedc {_bfb ,_bade :=_gcdf .(*PSBoolean );if !_bade {return ErrTypeCheck ;};_dba =_aec .Push (MakeBool (_ggc .Val ||_bfb .Val ));return _dba ;};if _fefd ,_bdg :=_afa .(*PSInteger );_bdg {_gefc ,_caa :=_gcdf .(*PSInteger );if !_caa {return ErrTypeCheck ;};_dba =_aec .Push (MakeInteger (_fefd .Val |_gefc .Val ));return _dba ;};return ErrTypeCheck ;};
|
|
|
|
// NewPSExecutor returns an initialized PSExecutor for an input `program`.
|
|
func NewPSExecutor (program *PSProgram )*PSExecutor {_fc :=&PSExecutor {};_fc .Stack =NewPSStack ();_fc ._ge =program ;return _fc ;};var ErrRangeCheck =_e .New ("\u0072\u0061\u006e\u0067\u0065\u0020\u0063\u0068\u0065\u0063\u006b\u0020e\u0072\u0072\u006f\u0072");
|
|
|
|
// PopNumberAsFloat64 pops and return the numeric value of the top of the stack as a float64.
|
|
// Real or integer only.
|
|
func (_geca *PSStack )PopNumberAsFloat64 ()(float64 ,error ){_dcfgc ,_ebfe :=_geca .Pop ();if _ebfe !=nil {return 0,_ebfe ;};if _cec ,_abee :=_dcfgc .(*PSReal );_abee {return _cec .Val ,nil ;}else if _ggaf ,_eccg :=_dcfgc .(*PSInteger );_eccg {return float64 (_ggaf .Val ),nil ;}else {return 0,ErrTypeCheck ;};};func (_aag *PSOperand )ge (_ccgc *PSStack )error {_bbbe ,_faab :=_ccgc .PopNumberAsFloat64 ();if _faab !=nil {return _faab ;};_bcfe ,_faab :=_ccgc .PopNumberAsFloat64 ();if _faab !=nil {return _faab ;};if _gg .Abs (_bcfe -_bbbe )< _a {_bfc :=_ccgc .Push (MakeBool (true ));return _bfc ;}else if _bcfe > _bbbe {_aeac :=_ccgc .Push (MakeBool (true ));return _aeac ;}else {_abb :=_ccgc .Push (MakeBool (false ));return _abb ;};};func (_dfbg *PSOperand )Duplicate ()PSObject {_cb :=*_dfbg ;return &_cb };func (_cdd *PSOperand )mod (_aef *PSStack )error {_fecf ,_gbf :=_aef .Pop ();if _gbf !=nil {return _gbf ;};_dcc ,_gbf :=_aef .Pop ();if _gbf !=nil {return _gbf ;};_agc ,_gdc :=_fecf .(*PSInteger );if !_gdc {return ErrTypeCheck ;};if _agc .Val ==0{return ErrUndefinedResult ;};_aaed ,_gdc :=_dcc .(*PSInteger );if !_gdc {return ErrTypeCheck ;};_bba :=_aaed .Val %_agc .Val ;_gbf =_aef .Push (MakeInteger (_bba ));return _gbf ;};func (_cag *PSOperand )String ()string {return _ff .Sprintf ("\u0025\u0073",*_cag )};var ErrUnsupportedOperand =_e .New ("\u0075\u006e\u0073\u0075pp\u006f\u0072\u0074\u0065\u0064\u0020\u006f\u0070\u0065\u0072\u0061\u006e\u0064");func (_gde *PSOperand )ln (_bae *PSStack )error {_cadg ,_eba :=_bae .PopNumberAsFloat64 ();if _eba !=nil {return _eba ;};_aca :=_gg .Log (_cadg );_eba =_bae .Push (MakeReal (_aca ));return _eba ;};func (_ebb *PSOperand )eq (_bff *PSStack )error {_dcd ,_bfge :=_bff .Pop ();if _bfge !=nil {return _bfge ;};_aed ,_bfge :=_bff .Pop ();if _bfge !=nil {return _bfge ;};_dfff ,_aad :=_dcd .(*PSBoolean );_dfe ,_fef :=_aed .(*PSBoolean );if _aad ||_fef {var _gfe error ;if _aad &&_fef {_gfe =_bff .Push (MakeBool (_dfff .Val ==_dfe .Val ));}else {_gfe =_bff .Push (MakeBool (false ));};return _gfe ;};var _aea float64 ;var _fbg float64 ;if _fgd ,_fdc :=_dcd .(*PSInteger );_fdc {_aea =float64 (_fgd .Val );}else if _aab ,_fda :=_dcd .(*PSReal );_fda {_aea =_aab .Val ;}else {return ErrTypeCheck ;};if _dcfb ,_ec :=_aed .(*PSInteger );_ec {_fbg =float64 (_dcfb .Val );}else if _gcad ,_fcca :=_aed .(*PSReal );_fcca {_fbg =_gcad .Val ;}else {return ErrTypeCheck ;};if _gg .Abs (_fbg -_aea )< _a {_bfge =_bff .Push (MakeBool (true ));}else {_bfge =_bff .Push (MakeBool (false ));};return _bfge ;};func (_geag *PSOperand )round (_fadd *PSStack )error {_dcff ,_fbfa :=_fadd .Pop ();if _fbfa !=nil {return _fbfa ;};if _baaa ,_ebge :=_dcff .(*PSReal );_ebge {_fbfa =_fadd .Push (MakeReal (_gg .Floor (_baaa .Val +0.5)));}else if _fdd ,_adb :=_dcff .(*PSInteger );_adb {_fbfa =_fadd .Push (MakeInteger (_fdd .Val ));}else {return ErrTypeCheck ;};return _fbfa ;};func (_edd *PSInteger )DebugString ()string {return _ff .Sprintf ("\u0069\u006e\u0074\u003a\u0025\u0064",_edd .Val );};func (_ade *PSOperand )roll (_gdg *PSStack )error {_ddd ,_bffg :=_gdg .Pop ();if _bffg !=nil {return _bffg ;};_bfgf ,_bffg :=_gdg .Pop ();if _bffg !=nil {return _bffg ;};_ece ,_dbeb :=_ddd .(*PSInteger );if !_dbeb {return ErrTypeCheck ;};_ace ,_dbeb :=_bfgf .(*PSInteger );if !_dbeb {return ErrTypeCheck ;};if _ace .Val < 0{return ErrRangeCheck ;};if _ace .Val ==0||_ace .Val ==1{return nil ;};if _ace .Val > len (*_gdg ){return ErrStackUnderflow ;};for _cfa :=0;_cfa < _bbf (_ece .Val );_cfa ++{var _ggb []PSObject ;_ggb =(*_gdg )[len (*_gdg )-(_ace .Val ):len (*_gdg )];if _ece .Val > 0{_aga :=_ggb [len (_ggb )-1];_ggb =append ([]PSObject {_aga },_ggb [0:len (_ggb )-1]...);}else {_egbb :=_ggb [len (_ggb )-_ace .Val ];_ggb =append (_ggb [1:],_egbb );};_cce :=append ((*_gdg )[0:len (*_gdg )-_ace .Val ],_ggb ...);_gdg =&_cce ;};return nil ;};
|
|
|
|
// Push pushes an object on top of the stack.
|
|
func (_aggc *PSStack )Push (obj PSObject )error {if len (*_aggc )> 100{return ErrStackOverflow ;};*_aggc =append (*_aggc ,obj );return nil ;};
|
|
|
|
// MakeOperand returns a new PSOperand object based on string `val`.
|
|
func MakeOperand (val string )*PSOperand {_bbd :=PSOperand (val );return &_bbd };func (_dcfe *PSOperand )xor (_eebc *PSStack )error {_fdga ,_cgbg :=_eebc .Pop ();if _cgbg !=nil {return _cgbg ;};_bffa ,_cgbg :=_eebc .Pop ();if _cgbg !=nil {return _cgbg ;};if _abeae ,_gbd :=_fdga .(*PSBoolean );_gbd {_eaef ,_bcab :=_bffa .(*PSBoolean );if !_bcab {return ErrTypeCheck ;};_cgbg =_eebc .Push (MakeBool (_abeae .Val !=_eaef .Val ));return _cgbg ;};if _aaga ,_cceb :=_fdga .(*PSInteger );_cceb {_dbbe ,_cada :=_bffa .(*PSInteger );if !_cada {return ErrTypeCheck ;};_cgbg =_eebc .Push (MakeInteger (_aaga .Val ^_dbbe .Val ));return _cgbg ;};return ErrTypeCheck ;};func (_ffaf *PSOperand )ceiling (_bcf *PSStack )error {_ebe ,_dce :=_bcf .Pop ();if _dce !=nil {return _dce ;};if _egf ,_cgc :=_ebe .(*PSReal );_cgc {_dce =_bcf .Push (MakeReal (_gg .Ceil (_egf .Val )));}else if _cge ,_faf :=_ebe .(*PSInteger );_faf {_dce =_bcf .Push (MakeInteger (_cge .Val ));}else {_dce =ErrTypeCheck ;};return _dce ;};
|
|
|
|
// PSStack defines a stack of PSObjects. PSObjects can be pushed on or pull from the stack.
|
|
type PSStack []PSObject ;
|
|
|
|
// Exec executes the operand `op` in the state specified by `stack`.
|
|
func (_fb *PSOperand )Exec (stack *PSStack )error {_bgge :=ErrUnsupportedOperand ;switch *_fb {case "\u0061\u0062\u0073":_bgge =_fb .abs (stack );case "\u0061\u0064\u0064":_bgge =_fb .add (stack );case "\u0061\u006e\u0064":_bgge =_fb .and (stack );case "\u0061\u0074\u0061\u006e":_bgge =_fb .atan (stack );case "\u0062\u0069\u0074\u0073\u0068\u0069\u0066\u0074":_bgge =_fb .bitshift (stack );case "\u0063e\u0069\u006c\u0069\u006e\u0067":_bgge =_fb .ceiling (stack );case "\u0063\u006f\u0070\u0079":_bgge =_fb .copy (stack );case "\u0063\u006f\u0073":_bgge =_fb .cos (stack );case "\u0063\u0076\u0069":_bgge =_fb .cvi (stack );case "\u0063\u0076\u0072":_bgge =_fb .cvr (stack );case "\u0064\u0069\u0076":_bgge =_fb .div (stack );case "\u0064\u0075\u0070":_bgge =_fb .dup (stack );case "\u0065\u0071":_bgge =_fb .eq (stack );case "\u0065\u0078\u0063\u0068":_bgge =_fb .exch (stack );case "\u0065\u0078\u0070":_bgge =_fb .exp (stack );case "\u0066\u006c\u006fo\u0072":_bgge =_fb .floor (stack );case "\u0067\u0065":_bgge =_fb .ge (stack );case "\u0067\u0074":_bgge =_fb .gt (stack );case "\u0069\u0064\u0069\u0076":_bgge =_fb .idiv (stack );case "\u0069\u0066":_bgge =_fb .ifCondition (stack );case "\u0069\u0066\u0065\u006c\u0073\u0065":_bgge =_fb .ifelse (stack );case "\u0069\u006e\u0064e\u0078":_bgge =_fb .index (stack );case "\u006c\u0065":_bgge =_fb .le (stack );case "\u006c\u006f\u0067":_bgge =_fb .log (stack );case "\u006c\u006e":_bgge =_fb .ln (stack );case "\u006c\u0074":_bgge =_fb .lt (stack );case "\u006d\u006f\u0064":_bgge =_fb .mod (stack );case "\u006d\u0075\u006c":_bgge =_fb .mul (stack );case "\u006e\u0065":_bgge =_fb .ne (stack );case "\u006e\u0065\u0067":_bgge =_fb .neg (stack );case "\u006e\u006f\u0074":_bgge =_fb .not (stack );case "\u006f\u0072":_bgge =_fb .or (stack );case "\u0070\u006f\u0070":_bgge =_fb .pop (stack );case "\u0072\u006f\u0075n\u0064":_bgge =_fb .round (stack );case "\u0072\u006f\u006c\u006c":_bgge =_fb .roll (stack );case "\u0073\u0069\u006e":_bgge =_fb .sin (stack );case "\u0073\u0071\u0072\u0074":_bgge =_fb .sqrt (stack );case "\u0073\u0075\u0062":_bgge =_fb .sub (stack );case "\u0074\u0072\u0075\u006e\u0063\u0061\u0074\u0065":_bgge =_fb .truncate (stack );case "\u0078\u006f\u0072":_bgge =_fb .xor (stack );};return _bgge ;};func (_dfdb *PSOperand )sqrt (_geg *PSStack )error {_feg ,_bddc :=_geg .PopNumberAsFloat64 ();if _bddc !=nil {return _bddc ;};if _feg < 0{return ErrRangeCheck ;};_afc :=_gg .Sqrt (_feg );_bddc =_geg .Push (MakeReal (_afc ));return _bddc ;};
|
|
|
|
// PSOperand represents a Postscript operand (text string).
|
|
type PSOperand string ;func (_ce *PSInteger )Duplicate ()PSObject {_edb :=PSInteger {};_edb .Val =_ce .Val ;return &_edb };func (_dbb *PSOperand )ne (_cfc *PSStack )error {_fgag :=_dbb .eq (_cfc );if _fgag !=nil {return _fgag ;};_fgag =_dbb .not (_cfc );return _fgag ;};func (_dee *PSOperand )mul (_fgcg *PSStack )error {_gbfb ,_dfd :=_fgcg .Pop ();if _dfd !=nil {return _dfd ;};_gda ,_dfd :=_fgcg .Pop ();if _dfd !=nil {return _dfd ;};_egfg ,_dab :=_gbfb .(*PSReal );_gad ,_cdf :=_gbfb .(*PSInteger );if !_dab &&!_cdf {return ErrTypeCheck ;};_bgae ,_cbb :=_gda .(*PSReal );_feb ,_aggg :=_gda .(*PSInteger );if !_cbb &&!_aggg {return ErrTypeCheck ;};if _cdf &&_aggg {_cgad :=_gad .Val *_feb .Val ;_acf :=_fgcg .Push (MakeInteger (_cgad ));return _acf ;};var _bdb float64 =0;if _dab {_bdb =_egfg .Val ;}else {_bdb =float64 (_gad .Val );};if _cbb {_bdb *=_bgae .Val ;}else {_bdb *=float64 (_feb .Val );};_dfd =_fgcg .Push (MakeReal (_bdb ));return _dfd ;};
|
|
|
|
// Exec executes the program, typically leaving output values on the stack.
|
|
func (_dfb *PSProgram )Exec (stack *PSStack )error {for _ ,_fd :=range *_dfb {var _cfg error ;switch _af :=_fd .(type ){case *PSInteger :_dc :=_af ;_cfg =stack .Push (_dc );case *PSReal :_ga :=_af ;_cfg =stack .Push (_ga );case *PSBoolean :_ca :=_af ;_cfg =stack .Push (_ca );case *PSProgram :_aff :=_af ;_cfg =stack .Push (_aff );case *PSOperand :_efa :=_af ;_cfg =_efa .Exec (stack );default:return ErrTypeCheck ;};if _cfg !=nil {return _cfg ;};};return nil ;};func (_faa *PSOperand )atan (_gcf *PSStack )error {_fgc ,_dgg :=_gcf .PopNumberAsFloat64 ();if _dgg !=nil {return _dgg ;};_baa ,_dgg :=_gcf .PopNumberAsFloat64 ();if _dgg !=nil {return _dgg ;};if _fgc ==0{var _gcg error ;if _baa < 0{_gcg =_gcf .Push (MakeReal (270));}else {_gcg =_gcf .Push (MakeReal (90));};return _gcg ;};_cae :=_baa /_fgc ;_bfe :=_gg .Atan (_cae )*180/_gg .Pi ;_dgg =_gcf .Push (MakeReal (_bfe ));return _dgg ;};func (_age *PSInteger )String ()string {return _ff .Sprintf ("\u0025\u0064",_age .Val )};
|
|
|
|
// PSProgram defines a Postscript program which is a series of PS objects (arguments, commands, programs etc).
|
|
type PSProgram []PSObject ;
|
|
|
|
// PSBoolean represents a boolean value.
|
|
type PSBoolean struct{Val bool ;};
|
|
|
|
// MakeInteger returns a new PSInteger object initialized with `val`.
|
|
func MakeInteger (val int )*PSInteger {_effe :=PSInteger {};_effe .Val =val ;return &_effe };func (_daf *PSOperand )truncate (_fdgb *PSStack )error {_dfge ,_cdfa :=_fdgb .Pop ();if _cdfa !=nil {return _cdfa ;};if _cbdg ,_bdfd :=_dfge .(*PSReal );_bdfd {_cdga :=int (_cbdg .Val );_cdfa =_fdgb .Push (MakeReal (float64 (_cdga )));}else if _abbe ,_cff :=_dfge .(*PSInteger );_cff {_cdfa =_fdgb .Push (MakeInteger (_abbe .Val ));}else {return ErrTypeCheck ;};return _cdfa ;};func (_aaf *PSOperand )dup (_fedeb *PSStack )error {_gac ,_ebgg :=_fedeb .Pop ();if _ebgg !=nil {return _ebgg ;};_ebgg =_fedeb .Push (_gac );if _ebgg !=nil {return _ebgg ;};_ebgg =_fedeb .Push (_gac .Duplicate ());return _ebgg ;};func (_ba *PSReal )DebugString ()string {return _ff .Sprintf ("\u0072e\u0061\u006c\u003a\u0025\u002e\u0035f",_ba .Val );};func (_ega *PSOperand )floor (_ggd *PSStack )error {_eeb ,_cbd :=_ggd .Pop ();if _cbd !=nil {return _cbd ;};if _cgbf ,_gcfg :=_eeb .(*PSReal );_gcfg {_cbd =_ggd .Push (MakeReal (_gg .Floor (_cgbf .Val )));}else if _fgca ,_fgg :=_eeb .(*PSInteger );_fgg {_cbd =_ggd .Push (MakeInteger (_fgca .Val ));}else {return ErrTypeCheck ;};return _cbd ;};
|
|
|
|
// MakeReal returns a new PSReal object initialized with `val`.
|
|
func MakeReal (val float64 )*PSReal {_aafg :=PSReal {};_aafg .Val =val ;return &_aafg };var ErrStackUnderflow =_e .New ("\u0073t\u0061c\u006b\u0020\u0075\u006e\u0064\u0065\u0072\u0066\u006c\u006f\u0077");func (_faae *PSOperand )neg (_ggag *PSStack )error {_egfge ,_cgfa :=_ggag .Pop ();if _cgfa !=nil {return _cgfa ;};if _fcgg ,_egd :=_egfge .(*PSReal );_egd {_cgfa =_ggag .Push (MakeReal (-_fcgg .Val ));return _cgfa ;}else if _fcfd ,_cfb :=_egfge .(*PSInteger );_cfb {_cgfa =_ggag .Push (MakeInteger (-_fcfd .Val ));return _cgfa ;}else {return ErrTypeCheck ;};};const _a =0.000001;func (_cgdg *PSOperand )sub (_adg *PSStack )error {_faef ,_gddc :=_adg .Pop ();if _gddc !=nil {return _gddc ;};_aeag ,_gddc :=_adg .Pop ();if _gddc !=nil {return _gddc ;};_gffb ,_fff :=_faef .(*PSReal );_adfa ,_ffca :=_faef .(*PSInteger );if !_fff &&!_ffca {return ErrTypeCheck ;};_bdf ,_bgc :=_aeag .(*PSReal );_deeb ,_cadgb :=_aeag .(*PSInteger );if !_bgc &&!_cadgb {return ErrTypeCheck ;};if _ffca &&_cadgb {_efg :=_deeb .Val -_adfa .Val ;_fbgd :=_adg .Push (MakeInteger (_efg ));return _fbgd ;};var _dbf float64 =0;if _bgc {_dbf =_bdf .Val ;}else {_dbf =float64 (_deeb .Val );};if _fff {_dbf -=_gffb .Val ;}else {_dbf -=float64 (_adfa .Val );};_gddc =_adg .Push (MakeReal (_dbf ));return _gddc ;};
|
|
|
|
// NewPSParser returns a new instance of the PDF Postscript parser from input data.
|
|
func NewPSParser (content []byte )*PSParser {_ecbb :=PSParser {};_egbbg :=_b .NewBuffer (content );_ecbb ._cacf =_gc .NewReader (_egbbg );return &_ecbb ;}; |