2024-07-28 07:48:26 +00:00

67 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 (_ge "crypto/md5";_bd "encoding/hex";_c "encoding/json";_ae "errors";_dfa "fmt";_gec "github.com/stretchr/testify/require";_bb "golang.org/x/image/font";_ad "golang.org/x/image/font/opentype";_bdb "golang.org/x/image/math/fixed";
_gg "image";_ee "image/color";_af "image/draw";_df "image/png";_d "io";_bc "io/ioutil";_a "log";_e "math";_cc "os";_gc "os/exec";_gd "path/filepath";_f "strings";_be "sync";_b "testing";_fd "time";);func ReadFile (dirPath ,testName string ,createEmpty bool )(*ReferenceFile ,error ){if dirPath ==""&&createEmpty {return &ReferenceFile {Map :&ReferenceMap {}},nil ;
};if dirPath ==""{return nil ,_cc .ErrNotExist ;};_ggd :=_gd .Join (dirPath ,testName +"\u005fr\u0065f\u0065\u0072\u0065\u006e\u0063\u0065\u002e\u006a\u0073\u006f\u006e");_bgb :=&ReferenceFile {_ff :_ggd };_ede ,_bce :=_cc .Open (_ggd );if _ae .Is (_bce ,_cc .ErrNotExist )&&createEmpty {_bgb .Timestamp =_fd .Now ().UTC ();
_bgb .Map =&ReferenceMap {};return _bgb ,nil ;};if _bce !=nil {return nil ,_bce ;};defer _ede .Close ();if _fea :=_c .NewDecoder (_ede ).Decode (_bgb );_fea !=nil {if _fea .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 _bgb ,nil ;
};return nil ,_fea ;};return _bgb ,nil ;};func ComparePNGFiles (file1 ,file2 string )(bool ,error ){_bad ,_fdf :=HashFile (file1 );if _fdf !=nil {return false ,_fdf ;};_acc ,_fdf :=HashFile (file2 );if _fdf !=nil {return false ,_fdf ;};if _bad ==_acc {return true ,nil ;
};_ccfa ,_fdf :=ReadPNG (file1 );if _fdf !=nil {return false ,_fdf ;};_cga ,_fdf :=ReadPNG (file2 );if _fdf !=nil {return false ,_fdf ;};if _ccfa .Bounds ()!=_cga .Bounds (){return false ,nil ;};return CompareImages (_ccfa ,_cga );};var (ErrRenderNotSupported =_ae .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 =_ae .New ("\u0069\u006d\u0061ge\u0020\u0073\u0069\u007a\u0065\u0073\u0020\u0064\u006f\u006e\u0027\u0074\u0020\u006d\u0061\u0074\u0063\u0068"););func _afe (_fbg ,_eac _ee .Color )bool {_dd ,_fc ,_dae ,_egfb :=_fbg .RGBA ();_dgf ,_eaf ,_ebg ,_cag :=_eac .RGBA ();
return _dd ==_dgf &&_fc ==_eaf &&_dae ==_ebg &&_egfb ==_cag ;};func (_add *ReferenceMap )Write (key string ,entry ReferenceEntry ){_add .Lock ();defer _add .Unlock ();if _add ._afb ==nil {_add ._afb =map[string ]ReferenceEntry {};};_add ._afb [key ]=entry ;
};func (_bf *ReferenceMap )UnmarshalJSON (data []byte )error {return _c .Unmarshal (data ,&_bf ._afb )};func CreatePNGDiff (src ,dst string )(bool ,string ,float64 ,float64 ,error ){_dgd ,_gdb :=ReadPNG (src );if _gdb !=nil {return false ,"",0,0,_gdb ;
};_agb ,_gdb :=ReadPNG (dst );if _gdb !=nil {return false ,"",0,0,_gdb ;};_bga :=_dgd .Bounds ();_fbc :=_agb .Bounds ();if !_feb (_bga ,_fbc ){if _e .Abs (float64 (_bga .Max .X )-float64 (_fbc .Max .X ))> 1{_a .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",_bga ,_fbc );
return false ,"",0,0,ErrImageSizeNotMatch ;};};_cfd :=_gg .NewRGBA (_gg .Rect (0,0,_bga .Max .X ,_bga .Max .Y ));var (_fa float64 ;_eb float64 ;);for _fga :=_bga .Min .Y ;_fga < _bga .Max .Y ;_fga ++{for _dc :=_bga .Min .X ;_dc < _bga .Max .X ;_dc ++{_cgae ,_dbe ,_ffc ,_ffb :=_dgd .At (_dc ,_fga ).RGBA ();
_dbc ,_agbb ,_bbe ,_ccff :=_agb .At (_dc ,_fga ).RGBA ();_cfd .Set (_dc ,_fga ,_ee .RGBA {uint8 (_dbc ),uint8 (_agbb ),uint8 (_bbe ),64});_ea :=_ffb ==0x00&&_cgae ==0x00&&_dbe ==0x00&&_ffc ==0x00&&_dbc ==0xFFFF&&_agbb ==0xFFFF&&_bbe ==0xFFFF;if !_ea &&!_afe (_dgd .At (_dc ,_fga ),_agb .At (_dc ,_fga )){_cfd .Set (_dc ,_fga ,_ee .RGBA {uint8 (_cgae ),uint8 (_dbe ),uint8 (_ffc ),uint8 (_ffb )});
_dfc :=float64 (_cgae )+float64 (_dbe )+float64 (_ffc )+float64 (_ffb )-float64 (_dbc )+float64 (_agbb )+float64 (_bbe )+float64 (_ccff );_fab :=_e .Sqrt (_e .Pow (_dfc /float64 (_bga .Dx ()*_bga .Dy ()),2));_eb +=_fab ;_fa ++;};};};_bca :=_fa /float64 (_bga .Dx ()*_bga .Dy ())*100;
_ega :=_gd .Dir (src );_bde :=_f .TrimSuffix (_gd .Base (src ),_gd .Ext (src ));_gbd ,_gdb :=_cc .Create (_ega +"\u002f"+_bde +"\u002dd\u0069\u0066\u0066\u002e\u0070\u006eg");if _gdb !=nil {return false ,"",0,0,_gdb ;};defer _gbd .Close ();_bgg :=_f .Replace (_ega ,"\u0072\u0065\u006e\u0064\u0065\u0072","\u0066\u006f\u006et\u0073",1)+"\u002f\u0043\u0061l\u0069\u0062\u0072\u0069\u002e\u0074\u0074\u0066";
_fee :=_dfa .Sprintf ("\u0044\u0069f\u0066\u0065\u0072e\u006e\u0063\u0065\u003a\u0020\u0025\u0066\u0025\u0025",_bca );_gdb =_ccd (_cfd ,_bgg ,_fee ,15,22);if _gdb !=nil {return false ,"",0,0,_gdb ;};_fee =_dfa .Sprintf ("T\u006ft\u0061\u006c\u0020\u0044\u0069\u0066\u0066\u0065r\u0065\u006e\u0063\u0065: \u0025\u0066",_eb );
_gdb =_ccd (_cfd ,_bgg ,_fee ,15,44);if _gdb !=nil {return false ,"",0,0,_gdb ;};if _cgaee :=_df .Encode (_gbd ,_cfd );_cgaee !=nil {return false ,"",0,0,_cgaee ;};return true ,_gbd .Name (),_bca ,_eb ,nil ;};func (_gde *ReferenceFile )Update (currentMap *ReferenceMap )error {if _gde ._ff ==""{return nil ;
};_bba :=_gde .updateMap (currentMap );if _bba ==0{return nil ;};_da ,_ag :=_cc .OpenFile (_gde ._ff ,_cc .O_CREATE |_cc .O_TRUNC |_cc .O_WRONLY ,0664);if _ag !=nil {return _ag ;};defer _da .Close ();_gde .Timestamp =_fd .Now ().UTC ();_cg :=_c .NewEncoder (_da );
_cg .SetIndent ("","\u0009");return _cg .Encode (_gde );};func (_cfe *ReferenceMap )MarshalJSON ()([]byte ,error ){return _c .Marshal (_cfe ._afb )};func (_dge *ReferenceMap )Len ()int {return len (_dge ._afb )};func HashFile (file string )(string ,error ){_aa ,_fb :=_cc .Open (file );
if _fb !=nil {return "",_fb ;};defer _aa .Close ();_cfg :=_ge .New ();if _ ,_fb =_d .Copy (_cfg ,_aa );_fb !=nil {return "",_fb ;};return _bd .EncodeToString (_cfg .Sum (nil )),nil ;};func ReadPNG (file string )(_gg .Image ,error ){_bbd ,_egf :=_cc .Open (file );
if _egf !=nil {return nil ,_egf ;};defer _bbd .Close ();return _df .Decode (_bbd );};func _ccd (_cbf *_gg .RGBA ,_ef string ,_fgg string ,_dcc ,_ffad int )error {_dgef ,_gbe :=_bc .ReadFile (_ef );if _gbe !=nil {return _gbe ;};_fbb ,_gbe :=_ad .Parse (_dgef );
if _gbe !=nil {return _gbe ;};_fgdg ,_gbe :=_ad .NewFace (_fbb ,&_ad .FaceOptions {Size :18,DPI :72,Hinting :_bb .HintingNone });if _gbe !=nil {return _gbe ;};_dee :=&_bb .Drawer {Dst :_cbf ,Src :_gg .NewUniform (_ee .RGBA {200,100,0,255}),Face :_fgdg ,Dot :_bdb .P (_dcc ,_ffad )};
_dee .DrawString (_fgg );return nil ;};func (_dg *ReferenceMap )Keys ()(_dgg []string ){_dgg =make ([]string ,len (_dg ._afb ));var _cd int ;for _gge :=range _dg ._afb {_dgg [_cd ]=_gge ;_cd ++;};return _dgg ;};func RenderPDFToPNGs (pdfPath string ,dpi int ,outpathTpl string )error {if dpi <=0{dpi =100;
};if _ ,_gba :=_gc .LookPath ("\u0067\u0073");_gba !=nil {return ErrRenderNotSupported ;};return _gc .Command ("\u0067\u0073","\u002d\u0073\u0044\u0045\u0056\u0049\u0043\u0045\u003d\u0070\u006e\u0067a\u006c\u0070\u0068\u0061","\u002d\u006f",outpathTpl ,_dfa .Sprintf ("\u002d\u0072\u0025\u0064",dpi ),pdfPath ).Run ();
};func (_gf *ReferenceFile )updateMap (_cb *ReferenceMap )int {var _fg int ;if _gf .Map ._afb ==nil {_gf .Map ._afb =map[string ]ReferenceEntry {};};for _db ,_fe :=range _cb ._afb {_cf ,_fgd :=_gf .Map ._afb [_db ];if !_fgd {_gf .Map ._afb [_db ]=_fe ;
_fg ++;continue ;};if string (_cf .Value )!=string (_fe .Value ){_gf .Map ._afb [_db ]=_fe ;_fg ++;};};for _gff :=range _gf .Map ._afb {if _ ,_ec :=_cb ._afb [_gff ];!_ec {delete (_gf .Map ._afb ,_gff );_fg ++;};};return _fg ;};func RunRenderOfficeTest (t *_b .T ,pdfPath ,outputDir ,baselineRenderPath string ,saveBaseline bool ,currentHashMap *ReferenceMap ,refFile *ReferenceFile ,postfix string ){_ffae :=_f .TrimSuffix (_gd .Base (pdfPath ),_gd .Ext (pdfPath ));
t .Run ("\u0072\u0065\u006e\u0064\u0065\u0072",func (_abb *_b .T ){_gac :=_gd .Join (outputDir ,_ffae );_cff :=_gac +"\u002d%\u0064\u002e\u0070\u006e\u0067";if _acd :=RenderPDFToPNGs (pdfPath ,0,_cff );_acd !=nil {_abb .Skip (_acd );};_cdb :=_ffae +postfix ;
_ce :=_gd .Join (outputDir ,_cdb );_fbfg :=_ce +"\u002d%\u0064\u002e\u0070\u006e\u0067";_egc :=false ;if saveBaseline {_edac :=_gd .Dir (pdfPath );_ccdb :=_gd .Join (_edac ,_cdb +"\u002e\u0070\u0064\u0066");if _ ,_gad :=_cc .Stat (_ccdb );_gad ==nil {_abb .Logf ("\u0052e\u006e\u0064\u0065\u0072\u0020\u004d\u0053\u0020\u004f\u0066\u0066i\u0063\u0065\u0020\u0050\u0044\u0046\u003a\u0020\u0025\u0076",_ccdb );
if _caa :=RenderPDFToPNGs (_ccdb ,0,_fbfg );_caa !=nil {_abb .Skip (_caa );};_egc =true ;};};for _fcf :=1;true ;_fcf ++{_fcg :=_dfa .Sprintf ("\u0025s\u002d\u0025\u0064\u002e\u0070\u006eg",_gac ,_fcf );_dffa :=_gd .Join (baselineRenderPath ,_dfa .Sprintf ("\u0025\u0073\u002d\u0025\u0064\u005f\u0065\u0078\u0070\u002e\u0070\u006e\u0067",_ffae ,_fcf ));
if _ ,_ebgd :=_cc .Stat (_fcg );_ebgd !=nil {break ;};_abb .Logf ("\u0025\u0073",_dffa );if saveBaseline {_abb .Logf ("\u0043\u006fp\u0079\u0069\u006eg\u0020\u0025\u0073\u0020\u002d\u003e\u0020\u0025\u0073",_fcg ,_dffa );_ffade :=CopyFile (_fcg ,_dffa );
if _ffade !=nil {_abb .Fatalf ("\u0045\u0052\u0052OR\u0020\u0063\u006f\u0070\u0079\u0069\u006e\u0067\u0020\u0074\u006f\u0020\u0025\u0073\u003a\u0020\u0025\u0076",_dffa ,_ffade );};if _egc {_eeab :=_dfa .Sprintf ("\u0025s\u002d\u0025\u0064\u002e\u0070\u006eg",_ce ,_fcf );
_gdf :=_gd .Join (baselineRenderPath ,_dfa .Sprintf ("\u0025\u0073\u002d\u0025\u0064\u005f\u0065\u0078\u0070\u002e\u0070\u006e\u0067",_cdb ,_fcf ));_abb .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",_eeab ,_gdf );
_cge :=CopyFile (_eeab ,_gdf );if _cge !=nil {_abb .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",_gdf ,_cge );
if _fbd :=_gcgf (_dffa ,_gdf );_fbd !=nil {_abb .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",_gdf ,_fbd );
};};_abb .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",_dffa ,_gdf );
_acg ,_cge :=CombinePNGFiles (_dffa ,_gdf );if _cc .IsNotExist (_cge ){_abb .Fatal ("\u0069m\u0061g\u0065\u0020\u0066\u0069\u006ce\u0020\u006di\u0073\u0073\u0069\u006e\u0067");}else if !_acg {_abb .Fatal ("\u0055n\u0061\u0062\u006c\u0065\u0020\u0074\u006f\u0020\u0063\u006f\u006db\u0069\u006e\u0065\u0020\u0069\u006d\u0061\u0067\u0065\u0073");
};_abb .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",_dffa ,_gdf );
_acg ,_gef ,_dccb ,_cba ,_cge :=CreatePNGDiff (_dffa ,_gdf );if _cge !=nil &&_ae .Is (_cge ,ErrImageSizeNotMatch ){_abb .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",_cge );
};if _acg {_abb .Logf ("\u0049\u006d\u0061\u0067\u0065\u003a\u0020\u0025\u0073\u000a",_gef );_abb .Logf ("D\u0069\u0066\u0066\u0020Pe\u0072c\u0065\u006e\u0074\u003a\u0020%\u0032\u002e\u0066\u0025\u0025\u000a",_dccb );_abb .Logf ("\u0044i\u0066f\u0020\u0054\u006f\u0074\u0061\u006c\u003a\u0020\u0025\u0066\u000a",_cba );
_fde :=_gd .Base (_gef );_dffb ,_ecgg :=currentHashMap .Read (_fde );if _ecgg &&(_dffb .DiffPercent < _dccb ||_dffb .DiffTotal < _cba ){_abb .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",_dccb ,_cba );
};_gcb ,_fbbb :=HashFile (_gef );_gec .NoError (_abb ,_fbbb );_fff :=_ecgb (_abb ,_gef );if !_ecgg ||_dffb .Value !=_gcb ||_dffb .ResultSize !=_fff ||_dffb .DiffPercent !=_dccb ||_dffb .DiffTotal !=_cba {_cef :=ReferenceEntry {Timestamp :_fd .Now ().UTC ().Unix (),Value :_gcb ,ResultSize :_fff ,DiffPercent :_dccb ,DiffTotal :_cba };
currentHashMap .Write (_fde ,_cef );if _fbbb =refFile .Update (currentHashMap );_fbbb !=nil {_abb .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",_fbbb );
};};};};continue ;};_abb .Run (_dfa .Sprintf ("\u0070\u0061\u0067\u0065\u0025\u0064",_fcf ),func (_eafb *_b .T ){_eafb .Logf ("\u0043o\u006dp\u0061\u0072\u0069\u006e\u0067 \u0025\u0073 \u0076\u0073\u0020\u0025\u0073",_fcg ,_dffa );_gadf ,_edf :=ComparePNGFiles (_fcg ,_dffa );
if _cc .IsNotExist (_edf ){_eafb .Fatal ("\u0069m\u0061g\u0065\u0020\u0066\u0069\u006ce\u0020\u006di\u0073\u0073\u0069\u006e\u0067");}else if !_gadf {_eafb .Fatal ("\u0077\u0072\u006f\u006eg \u0070\u0061\u0067\u0065\u0020\u0072\u0065\u006e\u0064\u0065\u0072\u0065\u0064");
};});};});};func CopyFile (src ,dst string )error {_bcg ,_eg :=_cc .Open (src );if _eg !=nil {return _eg ;};defer _bcg .Close ();_fdb ,_eg :=_cc .Create (dst );if _eg !=nil {return _eg ;};defer _fdb .Close ();_ ,_eg =_d .Copy (_fdb ,_bcg );return _eg ;
};func (_ac *ReferenceMap )Copy ()*ReferenceMap {_ab :=ReferenceMap {_afb :make (map[string ]ReferenceEntry ,len (_ac ._afb ))};for _ed ,_bee :=range _ac ._afb {_ab ._afb [_ed ]=_bee ;};return &_ab ;};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 _ecgb (_dbd *_b .T ,_fed string )int64 {_fcb ,_eaef :=_cc .Stat (_fed );
_gec .NoError (_dbd ,_eaef );return _fcb .Size ();};func RunRenderTest (t *_b .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 CompareImages (img1 ,img2 _gg .Image )(bool ,error ){_ca :=img1 .Bounds ();_beg :=0;for _egd :=0;_egd < _ca .Size ().X ;_egd ++{for _ccf :=0;_ccf < _ca .Size ().Y ;_ccf ++{_cbb ,_gb ,_de ,_ :=img1 .At (_egd ,_ccf ).RGBA ();_ffa ,_ga ,_bfg ,_ :=img2 .At (_egd ,_ccf ).RGBA ();
if _cbb !=_ffa ||_gb !=_ga ||_de !=_bfg {_beg ++;};};};_ba :=float64 (_beg )/float64 (_ca .Dx ()*_ca .Dy ());if _ba > 0.0001{_dfa .Printf ("\u0064\u0069\u0066f \u0066\u0072\u0061\u0063\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0076\u0020\u0028\u0025\u0064\u0029\u000a",_ba ,_beg );
return false ,nil ;};return true ,nil ;};func _gcgf (_eae ,_dfaf string )error {_dag ,_gecg :=_cc .Open (_eae );if _gecg !=nil {return _gecg ;};defer _dag .Close ();_agc ,_ ,_gecg :=_gg .DecodeConfig (_dag );if _gecg !=nil {panic (_gecg );};_ecg :=_gg .NewRGBA (_gg .Rect (0,0,_agc .Width ,_agc .Height ));
_fbbd ,_gecg :=_cc .Create (_dfaf );if _gecg !=nil {return _gecg ;};defer _fbbd .Close ();_gecg =_df .Encode (_fbbd ,_ecg );if _gecg !=nil {return _gecg ;};return nil ;};func (_fge *ReferenceMap )Read (key string )(ReferenceEntry ,bool ){_fge .Lock ();
defer _fge .Unlock ();if _fge ._afb ==nil {return ReferenceEntry {},false ;};_bg ,_gcg :=_fge ._afb [key ];return _bg ,_gcg ;};func CombinePNGFiles (file1 ,file2 string )(bool ,error ){_fdd ,_ege :=ReadPNG (file1 );if _ege !=nil {return false ,_ege ;};
_dff ,_ege :=ReadPNG (file2 );if _ege !=nil {return false ,_ege ;};_eda :=_gg .Point {_fdd .Bounds ().Dx (),0};_dbg :=_gg .Rectangle {_eda ,_eda .Add (_dff .Bounds ().Size ())};_gcc :=_gg .Rectangle {_gg .Point {0,0},_dbg .Max };_edc :=_gg .NewRGBA (_gcc );
_af .Draw (_edc ,_fdd .Bounds (),_fdd ,_gg .Point {0,0},_af .Src );_af .Draw (_edc ,_dbg ,_dff ,_gg .Point {0,0},_af .Src );_fba :=_gd .Dir (file1 );_geg :=_f .TrimSuffix (_gd .Base (file1 ),_gd .Ext (file1 ));_fbf ,_ege :=_cc .Create (_fba +"\u002f"+_geg +"\u002d\u0063\u006f\u006d\u0062\u0069\u006e\u0065\u0064\u002e\u0070\u006e\u0067");
if _ege !=nil {return false ,_ege ;};defer _fbf .Close ();if _ccg :=_df .Encode (_fbf ,_edc );_ccg !=nil {return false ,_ccg ;};return true ,nil ;};func _feb (_bgc ,_eea _gg .Rectangle )bool {return _bgc .Min .X ==_eea .Min .X &&_bgc .Min .Y ==_eea .Min .Y &&_bgc .Max .X ==_eea .Max .X &&_bgc .Max .Y ==_eea .Max .Y ;
};type ReferenceMap struct{_be .Mutex ;_afb map[string ]ReferenceEntry ;};type ReferenceFile struct{Timestamp _fd .Time `json:"timestamp"`;Map *ReferenceMap `json:"map,omitempty"`;_ff string ;};