// // 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 testutils ;import (_b "crypto/md5";_bb "encoding/hex";_bc "errors";_eb "fmt";_a "github.com/unidoc/unipdf/v4/common";_ba "github.com/unidoc/unipdf/v4/core";_gd "image";_ec "image/png";_fd "io";_bd "os";_g "os/exec";_e "path/filepath";_c "strings"; _fc "testing";);func CompareImages (img1 ,img2 _gd .Image )(bool ,error ){_ae :=img1 .Bounds ();_cc :=0;for _db :=0;_db < _ae .Size ().X ;_db ++{for _gcg :=0;_gcg < _ae .Size ().Y ;_gcg ++{_eaa ,_ce ,_ddc ,_ :=img1 .At (_db ,_gcg ).RGBA ();_cea ,_ddce ,_eg ,_ :=img2 .At (_db ,_gcg ).RGBA (); if _eaa !=_cea ||_ce !=_ddce ||_ddc !=_eg {_cc ++;};};};_ef :=float64 (_cc )/float64 (_ae .Dx ()*_ae .Dy ());if _ef > 0.0001{_eb .Printf ("\u0064\u0069\u0066f \u0066\u0072\u0061\u0063\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0076\u0020\u0028\u0025\u0064\u0029\u000a",_ef ,_cc ); return false ,nil ;};return true ,nil ;};func RenderPDFToPNGs (pdfPath string ,dpi int ,outpathTpl string )error {if dpi <=0{dpi =100;};if _ ,_bec :=_g .LookPath ("\u0067\u0073");_bec !=nil {return ErrRenderNotSupported ;};return _g .Command ("\u0067\u0073","\u002d\u0073\u0044\u0045\u0056\u0049\u0043\u0045\u003d\u0070\u006e\u0067a\u006c\u0070\u0068\u0061","\u002d\u006f",outpathTpl ,_eb .Sprintf ("\u002d\u0072\u0025\u0064",dpi ),pdfPath ).Run (); };func ComparePNGFiles (file1 ,file2 string )(bool ,error ){_ceg ,_bf :=HashFile (file1 );if _bf !=nil {return false ,_bf ;};_edd ,_bf :=HashFile (file2 );if _bf !=nil {return false ,_bf ;};if _ceg ==_edd {return true ,nil ;};_ff ,_bf :=ReadPNG (file1 ); if _bf !=nil {return false ,_bf ;};_de ,_bf :=ReadPNG (file2 );if _bf !=nil {return false ,_bf ;};if _ff .Bounds ()!=_de .Bounds (){return false ,nil ;};return CompareImages (_ff ,_de );};func RunRenderTest (t *_fc .T ,pdfPath ,outputDir ,baselineRenderPath string ,saveBaseline bool ){_dg :=_c .TrimSuffix (_e .Base (pdfPath ),_e .Ext (pdfPath )); t .Run ("\u0072\u0065\u006e\u0064\u0065\u0072",func (_ebe *_fc .T ){_gf :=_e .Join (outputDir ,_dg );_eag :=_gf +"\u002d%\u0064\u002e\u0070\u006e\u0067";if _ad :=RenderPDFToPNGs (pdfPath ,0,_eag );_ad !=nil {_ebe .Skip (_ad );};for _bea :=1;true ;_bea ++{_dec :=_eb .Sprintf ("\u0025s\u002d\u0025\u0064\u002e\u0070\u006eg",_gf ,_bea ); _dbb :=_e .Join (baselineRenderPath ,_eb .Sprintf ("\u0025\u0073\u002d\u0025\u0064\u005f\u0065\u0078\u0070\u002e\u0070\u006e\u0067",_dg ,_bea ));if _ ,_bda :=_bd .Stat (_dec );_bda !=nil {break ;};_ebe .Logf ("\u0025\u0073",_dbb );if saveBaseline {_ebe .Logf ("\u0043\u006fp\u0079\u0069\u006eg\u0020\u0025\u0073\u0020\u002d\u003e\u0020\u0025\u0073",_dec ,_dbb ); _bcg :=CopyFile (_dec ,_dbb );if _bcg !=nil {_ebe .Fatalf ("\u0045\u0052\u0052OR\u0020\u0063\u006f\u0070\u0079\u0069\u006e\u0067\u0020\u0074\u006f\u0020\u0025\u0073\u003a\u0020\u0025\u0076",_dbb ,_bcg );};continue ;};_ebe .Run (_eb .Sprintf ("\u0070\u0061\u0067\u0065\u0025\u0064",_bea ),func (_add *_fc .T ){_add .Logf ("\u0043o\u006dp\u0061\u0072\u0069\u006e\u0067 \u0025\u0073 \u0076\u0073\u0020\u0025\u0073",_dec ,_dbb ); _eab ,_dbf :=ComparePNGFiles (_dec ,_dbb );if _bd .IsNotExist (_dbf ){_add .Fatal ("\u0069m\u0061g\u0065\u0020\u0066\u0069\u006ce\u0020\u006di\u0073\u0073\u0069\u006e\u0067");}else if !_eab {_add .Fatal ("\u0077\u0072\u006f\u006eg \u0070\u0061\u0067\u0065\u0020\u0072\u0065\u006e\u0064\u0065\u0072\u0065\u0064"); };});};});};func ParseIndirectObjects (rawpdf string )(map[int64 ]_ba .PdfObject ,error ){_ac :=_ba .NewParserFromString (rawpdf );_bbe :=map[int64 ]_ba .PdfObject {};for {_cf ,_gcgg :=_ac .ParseIndirectObject ();if _gcgg !=nil {if _gcgg ==_fd .EOF {break ; };return nil ,_gcgg ;};switch _bfgd :=_cf .(type ){case *_ba .PdfIndirectObject :_bbe [_bfgd .ObjectNumber ]=_cf ;case *_ba .PdfObjectStream :_bbe [_bfgd .ObjectNumber ]=_cf ;};};for _ ,_fb :=range _bbe {_da (_fb ,_bbe );};return _bbe ,nil ;};func ReadPNG (file string )(_gd .Image ,error ){_fe ,_ed :=_bd .Open (file ); if _ed !=nil {return nil ,_ed ;};defer _fe .Close ();return _ec .Decode (_fe );};func CopyFile (src ,dst string )error {_ea ,_gc :=_bd .Open (src );if _gc !=nil {return _gc ;};defer _ea .Close ();_ge ,_gc :=_bd .Create (dst );if _gc !=nil {return _gc ; };defer _ge .Close ();_ ,_gc =_fd .Copy (_ge ,_ea );return _gc ;};var (ErrRenderNotSupported =_bc .New ("\u0072\u0065\u006e\u0064\u0065r\u0069\u006e\u0067\u0020\u0050\u0044\u0046\u0020\u0066\u0069\u006c\u0065\u0073 \u0069\u0073\u0020\u006e\u006f\u0074\u0020\u0073\u0075\u0070\u0070\u006f\u0072\u0074\u0065\u0064\u0020\u006f\u006e\u0020\u0074\u0068\u0069\u0073\u0020\u0073\u0079\u0073\u0074\u0065m"); );func _da (_aa _ba .PdfObject ,_gb map[int64 ]_ba .PdfObject )error {switch _ffa :=_aa .(type ){case *_ba .PdfIndirectObject :_dab :=_ffa ;_da (_dab .PdfObject ,_gb );case *_ba .PdfObjectDictionary :_fbc :=_ffa ;for _ ,_efa :=range _fbc .Keys (){_gg :=_fbc .Get (_efa ); if _bcc ,_daa :=_gg .(*_ba .PdfObjectReference );_daa {_aaa ,_bcge :=_gb [_bcc .ObjectNumber ];if !_bcge {return _bc .New ("r\u0065\u0066\u0065\u0072\u0065\u006ec\u0065\u0020\u0074\u006f\u0020\u006f\u0075\u0074\u0073i\u0064\u0065\u0020o\u0062j\u0065\u0063\u0074"); };_fbc .Set (_efa ,_aaa );}else {_da (_gg ,_gb );};};case *_ba .PdfObjectArray :_ccf :=_ffa ;for _bff ,_baa :=range _ccf .Elements (){if _decg ,_gdd :=_baa .(*_ba .PdfObjectReference );_gdd {_gee ,_cege :=_gb [_decg .ObjectNumber ];if !_cege {return _bc .New ("r\u0065\u0066\u0065\u0072\u0065\u006ec\u0065\u0020\u0074\u006f\u0020\u006f\u0075\u0074\u0073i\u0064\u0065\u0020o\u0062j\u0065\u0063\u0074"); };_ccf .Set (_bff ,_gee );}else {_da (_baa ,_gb );};};};return nil ;};func CompareDictionariesDeep (d1 ,d2 *_ba .PdfObjectDictionary )bool {if len (d1 .Keys ())!=len (d2 .Keys ()){_a .Log .Debug ("\u0044\u0069\u0063\u0074\u0020\u0065\u006e\u0074\u0072\u0069\u0065\u0073\u0020\u006d\u0069s\u006da\u0074\u0063\u0068\u0020\u0028\u0025\u0064\u0020\u0021\u003d\u0020\u0025\u0064\u0029",len (d1 .Keys ()),len (d2 .Keys ())); _a .Log .Debug ("\u0057\u0061s\u0020\u0027\u0025s\u0027\u0020\u0076\u0073\u0020\u0027\u0025\u0073\u0027",d1 .Write (),d2 .Write ());return false ;};for _ ,_ggg :=range d1 .Keys (){if _ggg =="\u0050\u0061\u0072\u0065\u006e\u0074"{continue ;};_edg :=_ba .TraceToDirectObject (d1 .Get (_ggg )); _dce :=_ba .TraceToDirectObject (d2 .Get (_ggg ));if _edg ==nil {_a .Log .Debug ("\u00761\u0020\u0069\u0073\u0020\u006e\u0069l");return false ;};if _dce ==nil {_a .Log .Debug ("\u00762\u0020\u0069\u0073\u0020\u006e\u0069l");return false ;};switch _bef :=_edg .(type ){case *_ba .PdfObjectDictionary :_dgb ,_cg :=_dce .(*_ba .PdfObjectDictionary ); if !_cg {_a .Log .Debug ("\u0054\u0079\u0070\u0065 m\u0069\u0073\u006d\u0061\u0074\u0063\u0068\u0020\u0025\u0054\u0020\u0076\u0073\u0020%\u0054",_edg ,_dce );return false ;};if !CompareDictionariesDeep (_bef ,_dgb ){return false ;};continue ;case *_ba .PdfObjectArray :_aaf ,_egb :=_dce .(*_ba .PdfObjectArray ); if !_egb {_a .Log .Debug ("\u00762\u0020n\u006f\u0074\u0020\u0061\u006e\u0020\u0061\u0072\u0072\u0061\u0079");return false ;};if _bef .Len ()!=_aaf .Len (){_a .Log .Debug ("\u0061\u0072\u0072\u0061\u0079\u0020\u006c\u0065\u006e\u0067\u0074\u0068\u0020\u006d\u0069s\u006da\u0074\u0063\u0068\u0020\u0028\u0025\u0064\u0020\u0021\u003d\u0020\u0025\u0064\u0029",_bef .Len (),_aaf .Len ()); return false ;};for _efb :=0;_efb < _bef .Len ();_efb ++{_ee :=_ba .TraceToDirectObject (_bef .Get (_efb ));_fed :=_ba .TraceToDirectObject (_aaf .Get (_efb ));if _aee ,_egd :=_ee .(*_ba .PdfObjectDictionary );_egd {_fa ,_cbd :=_fed .(*_ba .PdfObjectDictionary ); if !_cbd {return false ;};if !CompareDictionariesDeep (_aee ,_fa ){return false ;};}else {_ecg :=_ee .Write ();_aeb :=_fed .Write ();if string (_ecg )!=string (_aeb ){_a .Log .Debug ("M\u0069\u0073\u006d\u0061tc\u0068 \u0027\u0025\u0073\u0027\u0020!\u003d\u0020\u0027\u0025\u0073\u0027",_ecg ,_aeb ); return false ;};};};continue ;};if _edg .String ()!=_dce .String (){_a .Log .Debug ("\u006b\u0065y\u003d\u0025\u0073\u0020\u004d\u0069\u0073\u006d\u0061\u0074\u0063\u0068\u0021\u0020\u0027\u0025\u0073\u0027\u0020\u0021\u003d\u0020'%\u0073\u0027",_ggg ,_edg .String (),_dce .String ()); _a .Log .Debug ("\u0046o\u0072 \u0027\u0025\u0054\u0027\u0020\u002d\u0020\u0027\u0025\u0054\u0027",_edg ,_dce );_a .Log .Debug ("\u0046\u006f\u0072\u0020\u0027\u0025\u002b\u0076\u0027\u0020\u002d\u0020'\u0025\u002b\u0076\u0027",_edg ,_dce );return false ; };};return true ;};func HashFile (file string )(string ,error ){_cb ,_d :=_bd .Open (file );if _d !=nil {return "",_d ;};defer _cb .Close ();_fdb :=_b .New ();if _ ,_d =_fd .Copy (_fdb ,_cb );_d !=nil {return "",_d ;};return _bb .EncodeToString (_fdb .Sum (nil )),nil ; };