2024-10-17 17:05:28 +00:00

66 lines
18 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 testutils ;import (_cd "crypto/md5";_eb "encoding/hex";_gb "encoding/json";_ebc "errors";_ab "fmt";_beg "github.com/stretchr/testify/require";_gd "golang.org/x/image/font";_bd "golang.org/x/image/font/opentype";_dg "golang.org/x/image/math/fixed";
_b "image";_e "image/color";_af "image/draw";_dbd "image/png";_cf "io";_fd "io/ioutil";_db "log";_f "math";_ff "os";_c "os/exec";_gc "path/filepath";_d "strings";_cfc "sync";_a "testing";_be "time";);func (_gaf *ReferenceMap )Read (key string )(ReferenceEntry ,bool ){_gaf .Lock ();
defer _gaf .Unlock ();if _gaf ._bcd ==nil {return ReferenceEntry {},false ;};_bcc ,_cde :=_gaf ._bcd [key ];return _bcc ,_cde ;};func ReadFile (dirPath ,testName string ,createEmpty bool )(*ReferenceFile ,error ){if dirPath ==""&&createEmpty {return &ReferenceFile {Map :&ReferenceMap {}},nil ;
};if dirPath ==""{return nil ,_ff .ErrNotExist ;};_eeg :=_gc .Join (dirPath ,testName +"\u005fr\u0065f\u0065\u0072\u0065\u006e\u0063\u0065\u002e\u006a\u0073\u006f\u006e");_fa :=&ReferenceFile {_fb :_eeg };_bcf ,_fe :=_ff .Open (_eeg );if _ebc .Is (_fe ,_ff .ErrNotExist )&&createEmpty {_fa .Timestamp =_be .Now ().UTC ();
_fa .Map =&ReferenceMap {};return _fa ,nil ;};if _fe !=nil {return nil ,_fe ;};defer _bcf .Close ();if _eba :=_gb .NewDecoder (_bcf ).Decode (_fa );_eba !=nil {if _eba .Error ()=="i\u006c\u006c\u0065\u0067\u0061\u006c \u0062\u0061\u0073\u0065\u0036\u0034 \u0064\u0061\u0074\u0061\u0020\u0061\u0074 \u0069\u006e\u0070\u0075\u0074\u0020\u0062\u0079\u0074\u0065 \u0030"&&createEmpty {return _fa ,nil ;
};return nil ,_eba ;};return _fa ,nil ;};func CompareImages (img1 ,img2 _b .Image )(bool ,error ){_ca :=img1 .Bounds ();_bb :=0;for _bbc :=0;_bbc < _ca .Size ().X ;_bbc ++{for _fg :=0;_fg < _ca .Size ().Y ;_fg ++{_bfc ,_cc ,_agb ,_ :=img1 .At (_bbc ,_fg ).RGBA ();
_gbg ,_gda ,_dac ,_ :=img2 .At (_bbc ,_fg ).RGBA ();if _bfc !=_gbg ||_cc !=_gda ||_agb !=_dac {_bb ++;};};};_cee :=float64 (_bb )/float64 (_ca .Dx ()*_ca .Dy ());if _cee > 0.0001{_ab .Printf ("\u0064\u0069\u0066f \u0066\u0072\u0061\u0063\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0076\u0020\u0028\u0025\u0064\u0029\u000a",_cee ,_bb );
return false ,nil ;};return true ,nil ;};func _bcef (_fbd ,_efg _e .Color )bool {_bg ,_cac ,_dbab ,_gdda :=_fbd .RGBA ();_bca ,_gcgc ,_acg ,_gdc :=_efg .RGBA ();return _bg ==_bca &&_cac ==_gcgc &&_dbab ==_acg &&_gdda ==_gdc ;};type ReferenceFile struct{Timestamp _be .Time `json:"timestamp"`;
Map *ReferenceMap `json:"map,omitempty"`;_fb string ;};func (_gg *ReferenceFile )Update (currentMap *ReferenceMap )error {if _gg ._fb ==""{return nil ;};_bc :=_gg .updateMap (currentMap );if _bc ==0{return nil ;};_dd ,_ec :=_ff .OpenFile (_gg ._fb ,_ff .O_CREATE |_ff .O_TRUNC |_ff .O_WRONLY ,0664);
if _ec !=nil {return _ec ;};defer _dd .Close ();_gg .Timestamp =_be .Now ().UTC ();_da :=_gb .NewEncoder (_dd );_da .SetIndent ("","\u0009");return _da .Encode (_gg );};type ReferenceMap struct{_cfc .Mutex ;_bcd map[string ]ReferenceEntry ;};func (_gdf *ReferenceMap )Keys ()(_cfe []string ){_cfe =make ([]string ,len (_gdf ._bcd ));
var _bf int ;for _efa :=range _gdf ._bcd {_cfe [_bf ]=_efa ;_bf ++;};return _cfe ;};type ReferenceEntry struct{Timestamp int64 `json:"timestamp"`;Value string `json:"value"`;ResultSize int64 `json:"resultSize,omitempty"`;DiffPercent float64 `json:"diffPercent,omitempty"`;
DiffTotal float64 `json:"diffValue,omitempty"`;Invalid bool `json:"markedInvalid,omitempty"`;};func _gddb (_eaf ,_cebd _b .Rectangle )bool {return _eaf .Min .X ==_cebd .Min .X &&_eaf .Min .Y ==_cebd .Min .Y &&_eaf .Max .X ==_cebd .Max .X &&_eaf .Max .Y ==_cebd .Max .Y ;
};func ComparePNGFiles (file1 ,file2 string )(bool ,error ){_ccg ,_ac :=HashFile (file1 );if _ac !=nil {return false ,_ac ;};_de ,_ac :=HashFile (file2 );if _ac !=nil {return false ,_ac ;};if _ccg ==_de {return true ,nil ;};_fdg ,_ac :=ReadPNG (file1 );
if _ac !=nil {return false ,_ac ;};_edg ,_ac :=ReadPNG (file2 );if _ac !=nil {return false ,_ac ;};if _fdg .Bounds ()!=_edg .Bounds (){return false ,nil ;};return CompareImages (_fdg ,_edg );};func ReadPNG (file string )(_b .Image ,error ){_ggg ,_ega :=_ff .Open (file );
if _ega !=nil {return nil ,_ega ;};defer _ggg .Close ();return _dbd .Decode (_ggg );};func RunRenderOfficeTest (t *_a .T ,pdfPath ,outputDir ,baselineRenderPath string ,saveBaseline bool ,currentHashMap *ReferenceMap ,refFile *ReferenceFile ,postfix string ){_fcc :=_d .TrimSuffix (_gc .Base (pdfPath ),_gc .Ext (pdfPath ));
t .Run ("\u0072\u0065\u006e\u0064\u0065\u0072",func (_bdg *_a .T ){_fcgg :=_gc .Join (outputDir ,_fcc );_ede :=_fcgg +"\u002d%\u0064\u002e\u0070\u006e\u0067";if _babb :=RenderPDFToPNGs (pdfPath ,0,_ede );_babb !=nil {_bdg .Skip (_babb );};_fcgd :=_fcc +postfix ;
_eaa :=_gc .Join (outputDir ,_fcgd );_fba :=_eaa +"\u002d%\u0064\u002e\u0070\u006e\u0067";_bae :=false ;if saveBaseline {_fea :=_gc .Dir (pdfPath );_bdeg :=_gc .Join (_fea ,_fcgd +"\u002e\u0070\u0064\u0066");if _ ,_fcd :=_ff .Stat (_bdeg );_fcd ==nil {_bdg .Logf ("\u0052e\u006e\u0064\u0065\u0072\u0020\u004d\u0053\u0020\u004f\u0066\u0066i\u0063\u0065\u0020\u0050\u0044\u0046\u003a\u0020\u0025\u0076",_bdeg );
if _fdcg :=RenderPDFToPNGs (_bdeg ,0,_fba );_fdcg !=nil {_bdg .Skip (_fdcg );};_bae =true ;};};for _ged :=1;true ;_ged ++{_gdg :=_ab .Sprintf ("\u0025s\u002d\u0025\u0064\u002e\u0070\u006eg",_fcgg ,_ged );_bgb :=_gc .Join (baselineRenderPath ,_ab .Sprintf ("\u0025\u0073\u002d\u0025\u0064\u005f\u0065\u0078\u0070\u002e\u0070\u006e\u0067",_fcc ,_ged ));
if _ ,_ffe :=_ff .Stat (_gdg );_ffe !=nil {break ;};_bdg .Logf ("\u0025\u0073",_bgb );if saveBaseline {_bdg .Logf ("\u0043\u006fp\u0079\u0069\u006eg\u0020\u0025\u0073\u0020\u002d\u003e\u0020\u0025\u0073",_gdg ,_bgb );_ggc :=CopyFile (_gdg ,_bgb );if _ggc !=nil {_bdg .Fatalf ("\u0045\u0052\u0052OR\u0020\u0063\u006f\u0070\u0079\u0069\u006e\u0067\u0020\u0074\u006f\u0020\u0025\u0073\u003a\u0020\u0025\u0076",_bgb ,_ggc );
};if _bae {_ccae :=_ab .Sprintf ("\u0025s\u002d\u0025\u0064\u002e\u0070\u006eg",_eaa ,_ged );_gcb :=_gc .Join (baselineRenderPath ,_ab .Sprintf ("\u0025\u0073\u002d\u0025\u0064\u005f\u0065\u0078\u0070\u002e\u0070\u006e\u0067",_fcgd ,_ged ));_bdg .Logf ("\u0043\u006f\u0070\u0079\u0069\u006e\u0067\u0020\u004d\u0053\u0020\u0057\u006f\u0072\u0064 \u0072e\u0073\u0075\u006c\u0074\u0073\u0020\u0025\u0073\u0020\u002d\u003e\u0020\u0025\u0073",_ccae ,_gcb );
_gea :=CopyFile (_ccae ,_gcb );if _gea !=nil {_bdg .Logf ("\u0045\u0052\u0052\u004f\u0052\u0020\u0063\u006f\u0070\u0079\u0069\u006eg\u0020\u0074\u006f \u0025\u0073\u003a\u0020\u0025\u0076\u002c\u0020\u0068\u0061\u0076i\u006e\u0067\u0020d\u0069\u0066\u0066\u0065r\u0065\u006e\u0074\u0020\u0070\u0061\u0067\u0065\u0020\u0073\u0069\u007a\u0065\u0020\u0072\u0065\u0073\u0075\u006c\u0074\u0073\u002c\u0020\u0072\u0065\u0070\u006c\u0061\u0063\u0069\u006eg\u0020\u0069\u0074\u0020\u0077\u0069\u0074\u0068\u0020\u0062\u006ca\u006e\u006b\u0020\u0069\u006d\u0061\u0067\u0065\u0020\u0069\u006e\u0073\u0074\u0065\u0061\u0064",_gcb ,_gea );
if _fge :=_fbc (_bgb ,_gcb );_fge !=nil {_bdg .Fatalf ("\u0045\u0052\u0052\u004f\u0052\u0020c\u0072\u0065\u0061\u0074\u0069\u006e\u0067\u0020\u0065\u006d\u0070\u0074\u0079 \u0069\u006d\u0061\u0067\u0065\u0020\u0025s\u003a\u0020\u0025\u0076",_gcb ,_fge );
};};_bdg .Logf ("\u0043\u006fm\u0062\u0069\u006e\u0069\u006eg\u0020\u0055\u006e\u0069\u004ff\u0066\u0069\u0063\u0065\u0020\u0072\u0065\u0073\u0075\u006c\u0074\u0073\u0020\u0077\u0069\u0074\u0068\u0020\u004d\u0053\u0020\u004f\u0066\u0066\u0069\u0063\u0065\u0020\u0025\u0073\u0020\u0061\u006e\u0064\u0020\u0025\u0073",_bgb ,_gcb );
_cgg ,_gea :=CombinePNGFiles (_bgb ,_gcb );if _ff .IsNotExist (_gea ){_bdg .Fatal ("\u0069m\u0061g\u0065\u0020\u0066\u0069\u006ce\u0020\u006di\u0073\u0073\u0069\u006e\u0067");}else if !_cgg {_bdg .Fatal ("\u0055n\u0061\u0062\u006c\u0065\u0020\u0074\u006f\u0020\u0063\u006f\u006db\u0069\u006e\u0065\u0020\u0069\u006d\u0061\u0067\u0065\u0073");
};_bdg .Logf ("\u0043\u0072\u0065\u0061\u0074\u0069\u006e\u0067\u0020\u0069\u006d\u0061\u0067\u0065\u0020\u0064\u0069\u0066f \u0055n\u0069\u004f\u0066\u0066\u0069\u0063\u0065\u0020\u0072\u0065\u0073\u0075l\u0074\u0073\u0020\u0077\u0069\u0074\u0068\u0020\u004d\u0053\u0020\u004f\u0066\u0066\u0069\u0063\u0065 \u0025\u0073\u0020\u0061\u006e\u0064\u0020\u0025\u0073",_bgb ,_gcb );
_cgg ,_ffc ,_aae ,_eegf ,_gea :=CreatePNGDiff (_bgb ,_gcb );if _gea !=nil &&_ebc .Is (_gea ,ErrImageSizeNotMatch ){_bdg .Fatalf ("\u0045\u0072\u0072\u006fr\u0020\u006f\u006e\u0020\u0063\u0072\u0065\u0061\u0074\u0065 \u0050N\u0047\u0020\u0044\u0069\u0066\u0066\u003a \u0025\u0076",_gea );
};if _cgg {_bdg .Logf ("\u0049\u006d\u0061\u0067\u0065\u003a\u0020\u0025\u0073\u000a",_ffc );_bdg .Logf ("D\u0069\u0066\u0066\u0020Pe\u0072c\u0065\u006e\u0074\u003a\u0020%\u0032\u002e\u0066\u0025\u0025\u000a",_aae );_bdg .Logf ("\u0044i\u0066f\u0020\u0054\u006f\u0074\u0061\u006c\u003a\u0020\u0025\u0066\u000a",_eegf );
_edgg :=_gc .Base (_ffc );_egd ,_edec :=currentHashMap .Read (_edgg );if _edec &&(_egd .DiffPercent < _aae ||_egd .DiffTotal < _eegf ){_bdg .Logf ("\u004e\u0065\u0077\u0020\u0072\u0065\u0073\u0075\u006c\u0074\u0073\u0020\u0068\u0061\u0076\u0069\u006e\u0067 h\u0069g\u0068\u0065\u0072\u0020\u0064\u0069\u0066\u0066\u0065\u0072\u0065\u006ec\u0065\u0020\u0070\u0065\u0072\u0063\u0065\u006e\u0074\u003a\u0020\u0025\u0066\u0020\u0061\u006e\u0064 \u0074\u006f\u0074\u0061\u006c\u0020\u0025\u0066\u000a",_aae ,_eegf );
};_aag ,_ebdf :=HashFile (_ffc );_beg .NoError (_bdg ,_ebdf );_bee :=_bef (_bdg ,_ffc );if !_edec ||_egd .Value !=_aag ||_egd .ResultSize !=_bee ||_egd .DiffPercent !=_aae ||_egd .DiffTotal !=_eegf {_egde :=ReferenceEntry {Timestamp :_be .Now ().UTC ().Unix (),Value :_aag ,ResultSize :_bee ,DiffPercent :_aae ,DiffTotal :_eegf };
currentHashMap .Write (_edgg ,_egde );if _ebdf =refFile .Update (currentHashMap );_ebdf !=nil {_bdg .Logf ("\u0055\u0070\u0064\u0061\u0074\u0065\u0020\u0072\u0065\u0066\u0065\u0072\u0065\u006e\u0063e\u0020f\u0069\u006c\u0065\u0020\u0066\u0061\u0069\u006c\u0065\u0064\u003a\u0020\u0025\u0076",_ebdf );
};};};};continue ;};_bdg .Run (_ab .Sprintf ("\u0070\u0061\u0067\u0065\u0025\u0064",_ged ),func (_gbba *_a .T ){_gbba .Logf ("\u0043o\u006dp\u0061\u0072\u0069\u006e\u0067 \u0025\u0073 \u0076\u0073\u0020\u0025\u0073",_gdg ,_bgb );_bcb ,_cfa :=ComparePNGFiles (_gdg ,_bgb );
if _ff .IsNotExist (_cfa ){_gbba .Fatal ("\u0069m\u0061g\u0065\u0020\u0066\u0069\u006ce\u0020\u006di\u0073\u0073\u0069\u006e\u0067");}else if !_bcb {_gbba .Fatal ("\u0077\u0072\u006f\u006eg \u0070\u0061\u0067\u0065\u0020\u0072\u0065\u006e\u0064\u0065\u0072\u0065\u0064");
};});};});};func _bef (_aaeb *_a .T ,_edf string )int64 {_adc ,_ege :=_ff .Stat (_edf );_beg .NoError (_aaeb ,_ege );return _adc .Size ();};func RunRenderTest (t *_a .T ,pdfPath ,outputDir ,baselineRenderPath string ,saveBaseline bool ,currentHashMap *ReferenceMap ,refFile *ReferenceFile ){RunRenderOfficeTest (t ,pdfPath ,outputDir ,baselineRenderPath ,saveBaseline ,currentHashMap ,refFile ,"\u002em\u0073\u0077\u006f\u0072\u0064");
};func (_aa *ReferenceFile )updateMap (_ee *ReferenceMap )int {var _bce int ;if _aa .Map ._bcd ==nil {_aa .Map ._bcd =map[string ]ReferenceEntry {};};for _bde ,_ce :=range _ee ._bcd {_fdc ,_dba :=_aa .Map ._bcd [_bde ];if !_dba {_aa .Map ._bcd [_bde ]=_ce ;
_bce ++;continue ;};if string (_fdc .Value )!=string (_ce .Value ){_aa .Map ._bcd [_bde ]=_ce ;_bce ++;};};for _eg :=range _aa .Map ._bcd {if _ ,_ef :=_ee ._bcd [_eg ];!_ef {delete (_aa .Map ._bcd ,_eg );_bce ++;};};return _bce ;};func CreatePNGDiff (src ,dst string )(bool ,string ,float64 ,float64 ,error ){_bfg ,_eegd :=ReadPNG (src );
if _eegd !=nil {return false ,"",0,0,_eegd ;};_cg ,_eegd :=ReadPNG (dst );if _eegd !=nil {return false ,"",0,0,_eegd ;};_gdd :=_bfg .Bounds ();_gae :=_cg .Bounds ();if !_gddb (_gdd ,_gae ){if _f .Abs (float64 (_gdd .Max .X )-float64 (_gae .Max .X ))> 1{_db .Printf ("S\u006f\u0075\u0072\u0063\u0065\u0020b\u006f\u0075\u006e\u0064\u0073\u003a \u0025\u0076\u003b\u0020\u0044\u0065\u0073t\u0020\u0062\u006f\u0075\u006e\u0064\u0073\u003a\u0020\u0025v\u000a",_gdd ,_gae );
return false ,"",0,0,ErrImageSizeNotMatch ;};};_deg :=_b .NewRGBA (_b .Rect (0,0,_gdd .Max .X ,_gdd .Max .Y ));var (_aac float64 ;_bbf float64 ;);for _fee :=_gdd .Min .Y ;_fee < _gdd .Max .Y ;_fee ++{for _eega :=_gdd .Min .X ;_eega < _gdd .Max .X ;_eega ++{_dbdg ,_dc ,_bbd ,_cfg :=_bfg .At (_eega ,_fee ).RGBA ();
_cbc ,_gec ,_geg ,_cfcd :=_cg .At (_eega ,_fee ).RGBA ();_deg .Set (_eega ,_fee ,_e .RGBA {uint8 (_cbc ),uint8 (_gec ),uint8 (_geg ),64});_feb :=_cfg ==0x00&&_dbdg ==0x00&&_dc ==0x00&&_bbd ==0x00&&_cbc ==0xFFFF&&_gec ==0xFFFF&&_geg ==0xFFFF;if !_feb &&!_bcef (_bfg .At (_eega ,_fee ),_cg .At (_eega ,_fee )){_deg .Set (_eega ,_fee ,_e .RGBA {uint8 (_dbdg ),uint8 (_dc ),uint8 (_bbd ),uint8 (_cfg )});
_gca :=float64 (_dbdg )+float64 (_dc )+float64 (_bbd )+float64 (_cfg )-float64 (_cbc )+float64 (_gec )+float64 (_geg )+float64 (_cfcd );_gee :=_f .Sqrt (_f .Pow (_gca /float64 (_gdd .Dx ()*_gdd .Dy ()),2));_bbf +=_gee ;_aac ++;};};};_ea :=_aac /float64 (_gdd .Dx ()*_gdd .Dy ())*100;
_fede :=_gc .Dir (src );_dce :=_d .TrimSuffix (_gc .Base (src ),_gc .Ext (src ));_bab ,_eegd :=_ff .Create (_fede +"\u002f"+_dce +"\u002dd\u0069\u0066\u0066\u002e\u0070\u006eg");if _eegd !=nil {return false ,"",0,0,_eegd ;};defer _bab .Close ();_cag :=_d .Replace (_fede ,"\u0072\u0065\u006e\u0064\u0065\u0072","\u0066\u006f\u006et\u0073",1)+"\u002f\u0043\u0061l\u0069\u0062\u0072\u0069\u002e\u0074\u0074\u0066";
_dda :=_ab .Sprintf ("\u0044\u0069f\u0066\u0065\u0072e\u006e\u0063\u0065\u003a\u0020\u0025\u0066\u0025\u0025",_ea );_eegd =_gbd (_deg ,_cag ,_dda ,15,22);if _eegd !=nil {return false ,"",0,0,_eegd ;};_dda =_ab .Sprintf ("T\u006ft\u0061\u006c\u0020\u0044\u0069\u0066\u0066\u0065r\u0065\u006e\u0063\u0065: \u0025\u0066",_bbf );
_eegd =_gbd (_deg ,_cag ,_dda ,15,44);if _eegd !=nil {return false ,"",0,0,_eegd ;};if _ceb :=_dbd .Encode (_bab ,_deg );_ceb !=nil {return false ,"",0,0,_ceb ;};return true ,_bab .Name (),_ea ,_bbf ,nil ;};func (_gf *ReferenceMap )UnmarshalJSON (data []byte )error {return _gb .Unmarshal (data ,&_gf ._bcd )};
func CombinePNGFiles (file1 ,file2 string )(bool ,error ){_gcg ,_gcge :=ReadPNG (file1 );if _gcge !=nil {return false ,_gcge ;};_fed ,_gcge :=ReadPNG (file2 );if _gcge !=nil {return false ,_gcge ;};_afb :=_b .Point {_gcg .Bounds ().Dx (),0};_gbb :=_b .Rectangle {_afb ,_afb .Add (_fed .Bounds ().Size ())};
_cfef :=_b .Rectangle {_b .Point {0,0},_gbb .Max };_cdg :=_b .NewRGBA (_cfef );_af .Draw (_cdg ,_gcg .Bounds (),_gcg ,_b .Point {0,0},_af .Src );_af .Draw (_cdg ,_gbb ,_fed ,_b .Point {0,0},_af .Src );_cca :=_gc .Dir (file1 );_cbb :=_d .TrimSuffix (_gc .Base (file1 ),_gc .Ext (file1 ));
_fgc ,_gcge :=_ff .Create (_cca +"\u002f"+_cbb +"\u002d\u0063\u006f\u006d\u0062\u0069\u006e\u0065\u0064\u002e\u0070\u006e\u0067");if _gcge !=nil {return false ,_gcge ;};defer _fgc .Close ();if _ced :=_dbd .Encode (_fgc ,_cdg );_ced !=nil {return false ,_ced ;
};return true ,nil ;};func (_dae *ReferenceMap )Write (key string ,entry ReferenceEntry ){_dae .Lock ();defer _dae .Unlock ();if _dae ._bcd ==nil {_dae ._bcd =map[string ]ReferenceEntry {};};_dae ._bcd [key ]=entry ;};var (ErrRenderNotSupported =_ebc .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");
ErrImageSizeNotMatch =_ebc .New ("\u0069\u006d\u0061ge\u0020\u0073\u0069\u007a\u0065\u0073\u0020\u0064\u006f\u006e\u0027\u0074\u0020\u006d\u0061\u0074\u0063\u0068"););func _fbc (_dbg ,_fcg string )error {_ebce ,_gcc :=_ff .Open (_dbg );if _gcc !=nil {return _gcc ;
};defer _ebce .Close ();_eed ,_ ,_gcc :=_b .DecodeConfig (_ebce );if _gcc !=nil {panic (_gcc );};_dbb :=_b .NewRGBA (_b .Rect (0,0,_eed .Width ,_eed .Height ));_edc ,_gcc :=_ff .Create (_fcg );if _gcc !=nil {return _gcc ;};defer _edc .Close ();_gcc =_dbd .Encode (_edc ,_dbb );
if _gcc !=nil {return _gcc ;};return nil ;};func (_bff *ReferenceMap )Len ()int {return len (_bff ._bcd )};func _gbd (_begd *_b .RGBA ,_ad string ,_fedc string ,_bfgf ,_bfff int )error {_fdd ,_gaff :=_fd .ReadFile (_ad );if _gaff !=nil {return _gaff ;};
_fbdd ,_gaff :=_bd .Parse (_fdd );if _gaff !=nil {return _gaff ;};_ebca ,_gaff :=_bd .NewFace (_fbdd ,&_bd .FaceOptions {Size :18,DPI :72,Hinting :_gd .HintingNone });if _gaff !=nil {return _gaff ;};_bgg :=&_gd .Drawer {Dst :_begd ,Src :_b .NewUniform (_e .RGBA {200,100,0,255}),Face :_ebca ,Dot :_dg .P (_bfgf ,_bfff )};
_bgg .DrawString (_fedc );return nil ;};func CopyFile (src ,dst string )error {_cb ,_ebe :=_ff .Open (src );if _ebe !=nil {return _ebe ;};defer _cb .Close ();_cec ,_ebe :=_ff .Create (dst );if _ebe !=nil {return _ebe ;};defer _cec .Close ();_ ,_ebe =_cf .Copy (_cec ,_cb );
return _ebe ;};func (_ba *ReferenceMap )MarshalJSON ()([]byte ,error ){return _gb .Marshal (_ba ._bcd )};func HashFile (file string )(string ,error ){_ae ,_fde :=_ff .Open (file );if _fde !=nil {return "",_fde ;};defer _ae .Close ();_dbe :=_cd .New ();
if _ ,_fde =_cf .Copy (_dbe ,_ae );_fde !=nil {return "",_fde ;};return _eb .EncodeToString (_dbe .Sum (nil )),nil ;};func RenderPDFToPNGs (pdfPath string ,dpi int ,outpathTpl string )error {if dpi <=0{dpi =100;};if _ ,_cfed :=_c .LookPath ("\u0067\u0073");
_cfed !=nil {return ErrRenderNotSupported ;};return _c .Command ("\u0067\u0073","\u002d\u0073\u0044\u0045\u0056\u0049\u0043\u0045\u003d\u0070\u006e\u0067a\u006c\u0070\u0068\u0061","\u002d\u006f",outpathTpl ,_ab .Sprintf ("\u002d\u0072\u0025\u0064",dpi ),pdfPath ).Run ();
};func (_ed *ReferenceMap )Copy ()*ReferenceMap {_bffd :=ReferenceMap {_bcd :make (map[string ]ReferenceEntry ,len (_ed ._bcd ))};for _ag ,_cfcb :=range _ed ._bcd {_bffd ._bcd [_ag ]=_cfcb ;};return &_bffd ;};