2024-06-20 13:33:45 +00:00

70 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 (_ee "crypto/md5";_df "encoding/hex";_bg "encoding/json";_de "errors";_ec "fmt";_fa "github.com/stretchr/testify/require";_ac "golang.org/x/image/font";_cb "golang.org/x/image/font/opentype";_faa "golang.org/x/image/math/fixed";
_dd "image";_ce "image/color";_fc "image/draw";_e "image/png";_g "io";_cf "io/ioutil";_c "log";_ba "math";_eeg "os";_d "os/exec";_be "path/filepath";_a "strings";_aa "sync";_f "testing";_ae "time";);func CompareImages (img1 ,img2 _dd .Image )(bool ,error ){_cgg :=img1 .Bounds ();
_ebaa :=0;for _cfbb :=0;_cfbb < _cgg .Size ().X ;_cfbb ++{for _db :=0;_db < _cgg .Size ().Y ;_db ++{_ebb ,_bb ,_cdd ,_ :=img1 .At (_cfbb ,_db ).RGBA ();_dg ,_dgg ,_eedf ,_ :=img2 .At (_cfbb ,_db ).RGBA ();if _ebb !=_dg ||_bb !=_dgg ||_cdd !=_eedf {_ebaa ++;
};};};_eg :=float64 (_ebaa )/float64 (_cgg .Dx ()*_cgg .Dy ());if _eg > 0.0001{_ec .Printf ("\u0064\u0069\u0066f \u0066\u0072\u0061\u0063\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0076\u0020\u0028\u0025\u0064\u0029\u000a",_eg ,_ebaa );return false ,nil ;
};return true ,nil ;};func ReadFile (dirPath ,testName string ,createEmpty bool )(*ReferenceFile ,error ){if dirPath ==""&&createEmpty {return &ReferenceFile {Map :&ReferenceMap {}},nil ;};if dirPath ==""{return nil ,_eeg .ErrNotExist ;};_fg :=_be .Join (dirPath ,testName +"\u005fr\u0065f\u0065\u0072\u0065\u006e\u0063\u0065\u002e\u006a\u0073\u006f\u006e");
_ed :=&ReferenceFile {_dc :_fg };_fb ,_ecg :=_eeg .Open (_fg );if _de .Is (_ecg ,_eeg .ErrNotExist )&&createEmpty {_ed .Timestamp =_ae .Now ().UTC ();_ed .Map =&ReferenceMap {};return _ed ,nil ;};if _ecg !=nil {return nil ,_ecg ;};defer _fb .Close ();if _gd :=_bg .NewDecoder (_fb ).Decode (_ed );
_gd !=nil {if _gd .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 _ed ,nil ;};return nil ,_gd ;
};return _ed ,nil ;};func CreatePNGDiff (src ,dst string )(bool ,string ,float64 ,float64 ,error ){_dgf ,_gbb :=ReadPNG (src );if _gbb !=nil {return false ,"",0,0,_gbb ;};_ef ,_gbb :=ReadPNG (dst );if _gbb !=nil {return false ,"",0,0,_gbb ;};_eae :=_dgf .Bounds ();
_ceag :=_ef .Bounds ();if !_dbb (_eae ,_ceag ){if _ba .Abs (float64 (_eae .Max .X )-float64 (_ceag .Max .X ))> 1{_c .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",_eae ,_ceag );
return false ,"",0,0,ErrImageSizeNotMatch ;};};_af :=_dd .NewRGBA (_dd .Rect (0,0,_eae .Max .X ,_eae .Max .Y ));var (_ebfd float64 ;_ad float64 ;);for _def :=_eae .Min .Y ;_def < _eae .Max .Y ;_def ++{for _bga :=_eae .Min .X ;_bga < _eae .Max .X ;_bga ++{_afc ,_dad ,_cfd ,_efg :=_dgf .At (_bga ,_def ).RGBA ();
_acd ,_ff ,_gdg ,_bbd :=_ef .At (_bga ,_def ).RGBA ();_af .Set (_bga ,_def ,_ce .RGBA {uint8 (_acd ),uint8 (_ff ),uint8 (_gdg ),64});_bbcb :=_efg ==0x00&&_afc ==0x00&&_dad ==0x00&&_cfd ==0x00&&_acd ==0xFFFF&&_ff ==0xFFFF&&_gdg ==0xFFFF;if !_bbcb &&!_acb (_dgf .At (_bga ,_def ),_ef .At (_bga ,_def )){_af .Set (_bga ,_def ,_ce .RGBA {uint8 (_afc ),uint8 (_dad ),uint8 (_cfd ),uint8 (_efg )});
_ffb :=float64 (_afc )+float64 (_dad )+float64 (_cfd )+float64 (_efg )-float64 (_acd )+float64 (_ff )+float64 (_gdg )+float64 (_bbd );_geg :=_ba .Sqrt (_ba .Pow (_ffb /float64 (_eae .Dx ()*_eae .Dy ()),2));_ad +=_geg ;_ebfd ++;};};};_cfbd :=_ebfd /float64 (_eae .Dx ()*_eae .Dy ())*100;
_baa :=_be .Dir (src );_cfa :=_a .TrimSuffix (_be .Base (src ),_be .Ext (src ));_gegf ,_gbb :=_eeg .Create (_baa +"\u002f"+_cfa +"\u002dd\u0069\u0066\u0066\u002e\u0070\u006eg");if _gbb !=nil {return false ,"",0,0,_gbb ;};defer _gegf .Close ();_fdg :=_a .Replace (_baa ,"\u0072\u0065\u006e\u0064\u0065\u0072","\u0066\u006f\u006et\u0073",1)+"\u002f\u0043\u0061l\u0069\u0062\u0072\u0069\u002e\u0074\u0074\u0066";
_dce :=_ec .Sprintf ("\u0044\u0069f\u0066\u0065\u0072e\u006e\u0063\u0065\u003a\u0020\u0025\u0066\u0025\u0025",_cfbd );_gbb =_ebg (_af ,_fdg ,_dce ,15,22);if _gbb !=nil {return false ,"",0,0,_gbb ;};_dce =_ec .Sprintf ("T\u006ft\u0061\u006c\u0020\u0044\u0069\u0066\u0066\u0065r\u0065\u006e\u0063\u0065: \u0025\u0066",_ad );
_gbb =_ebg (_af ,_fdg ,_dce ,15,44);if _gbb !=nil {return false ,"",0,0,_gbb ;};if _accd :=_e .Encode (_gegf ,_af );_accd !=nil {return false ,"",0,0,_accd ;};return true ,_gegf .Name (),_cfbd ,_ad ,nil ;};func (_bda *ReferenceMap )Copy ()*ReferenceMap {_ddf :=ReferenceMap {_cgd :make (map[string ]ReferenceEntry ,len (_bda ._cgd ))};
for _ebf ,_da :=range _bda ._cgd {_ddf ._cgd [_ebf ]=_da ;};return &_ddf ;};func ComparePNGFiles (file1 ,file2 string )(bool ,error ){_bgf ,_fga :=HashFile (file1 );if _fga !=nil {return false ,_fga ;};_fcf ,_fga :=HashFile (file2 );if _fga !=nil {return false ,_fga ;
};if _bgf ==_fcf {return true ,nil ;};_aac ,_fga :=ReadPNG (file1 );if _fga !=nil {return false ,_fga ;};_gcd ,_fga :=ReadPNG (file2 );if _fga !=nil {return false ,_fga ;};if _aac .Bounds ()!=_gcd .Bounds (){return false ,nil ;};return CompareImages (_aac ,_gcd );
};func (_fe *ReferenceMap )MarshalJSON ()([]byte ,error ){return _bg .Marshal (_fe ._cgd )};func CopyFile (src ,dst string )error {_abf ,_aec :=_eeg .Open (src );if _aec !=nil {return _aec ;};defer _abf .Close ();_ea ,_aec :=_eeg .Create (dst );if _aec !=nil {return _aec ;
};defer _ea .Close ();_ ,_aec =_g .Copy (_ea ,_abf );return _aec ;};func CombinePNGFiles (file1 ,file2 string )(bool ,error ){_abb ,_ge :=ReadPNG (file1 );if _ge !=nil {return false ,_ge ;};_bdc ,_ge :=ReadPNG (file2 );if _ge !=nil {return false ,_ge ;
};_ecf :=_dd .Point {_abb .Bounds ().Dx (),0};_abc :=_dd .Rectangle {_ecf ,_ecf .Add (_bdc .Bounds ().Size ())};_fgg :=_dd .Rectangle {_dd .Point {0,0},_abc .Max };_gcdf :=_dd .NewRGBA (_fgg );_fc .Draw (_gcdf ,_abb .Bounds (),_abb ,_dd .Point {0,0},_fc .Src );
_fc .Draw (_gcdf ,_abc ,_bdc ,_dd .Point {0,0},_fc .Src );_eecd :=_be .Dir (file1 );_bbc :=_a .TrimSuffix (_be .Base (file1 ),_be .Ext (file1 ));_acfa ,_ge :=_eeg .Create (_eecd +"\u002f"+_bbc +"\u002d\u0063\u006f\u006d\u0062\u0069\u006e\u0065\u0064\u002e\u0070\u006e\u0067");
if _ge !=nil {return false ,_ge ;};defer _acfa .Close ();if _gdf :=_e .Encode (_acfa ,_gcdf );_gdf !=nil {return false ,_gdf ;};return true ,nil ;};func (_cdc *ReferenceMap )Len ()int {return len (_cdc ._cgd )};func (_bff *ReferenceMap )UnmarshalJSON (data []byte )error {return _bg .Unmarshal (data ,&_bff ._cgd )};
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"`;
};type ReferenceMap struct{_aa .Mutex ;_cgd map[string ]ReferenceEntry ;};func _dbb (_gbe ,_cfc _dd .Rectangle )bool {return _gbe .Min .X ==_cfc .Min .X &&_gbe .Min .Y ==_cfc .Min .Y &&_gbe .Max .X ==_cfc .Max .X &&_gbe .Max .Y ==_cfc .Max .Y ;};func (_dfe *ReferenceMap )Keys ()(_cd []string ){_cd =make ([]string ,len (_dfe ._cgd ));
var _dec int ;for _eba :=range _dfe ._cgd {_cd [_dec ]=_eba ;_dec ++;};return _cd ;};type ReferenceFile struct{Timestamp _ae .Time `json:"timestamp"`;Map *ReferenceMap `json:"map,omitempty"`;_dc string ;};func _ebg (_dece *_dd .RGBA ,_bca string ,_deb string ,_fbb ,_bcd int )error {_fec ,_bfa :=_cf .ReadFile (_bca );
if _bfa !=nil {return _bfa ;};_bae ,_bfa :=_cb .Parse (_fec );if _bfa !=nil {return _bfa ;};_baeg ,_bfa :=_cb .NewFace (_bae ,&_cb .FaceOptions {Size :18,DPI :72,Hinting :_ac .HintingNone });if _bfa !=nil {return _bfa ;};_gbd :=&_ac .Drawer {Dst :_dece ,Src :_dd .NewUniform (_ce .RGBA {200,100,0,255}),Face :_baeg ,Dot :_faa .P (_fbb ,_bcd )};
_gbd .DrawString (_deb );return nil ;};func RunRenderTest (t *_f .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 RunRenderOfficeTest (t *_f .T ,pdfPath ,outputDir ,baselineRenderPath string ,saveBaseline bool ,currentHashMap *ReferenceMap ,refFile *ReferenceFile ,postfix string ){_egc :=_a .TrimSuffix (_be .Base (pdfPath ),_be .Ext (pdfPath ));t .Run ("\u0072\u0065\u006e\u0064\u0065\u0072",func (_faf *_f .T ){_bdf :=_be .Join (outputDir ,_egc );
_cdg :=_bdf +"\u002d%\u0064\u002e\u0070\u006e\u0067";if _dac :=RenderPDFToPNGs (pdfPath ,0,_cdg );_dac !=nil {_faf .Skip (_dac );};_bba :=_egc +postfix ;_edc :=_be .Join (outputDir ,_bba );_fda :=_edc +"\u002d%\u0064\u002e\u0070\u006e\u0067";_aaa :=false ;
if saveBaseline {_fdga :=_be .Dir (pdfPath );_dgb :=_be .Join (_fdga ,_bba +"\u002e\u0070\u0064\u0066");if _ ,_cfcd :=_eeg .Stat (_dgb );_cfcd ==nil {_faf .Logf ("\u0052e\u006e\u0064\u0065\u0072\u0020\u004d\u0053\u0020\u004f\u0066\u0066i\u0063\u0065\u0020\u0050\u0044\u0046\u003a\u0020\u0025\u0076",_dgb );
if _bbcf :=RenderPDFToPNGs (_dgb ,0,_fda );_bbcf !=nil {_faf .Skip (_bbcf );};_aaa =true ;};};for _gcc :=1;true ;_gcc ++{_dacb :=_ec .Sprintf ("\u0025s\u002d\u0025\u0064\u002e\u0070\u006eg",_bdf ,_gcc );_ace :=_be .Join (baselineRenderPath ,_ec .Sprintf ("\u0025\u0073\u002d\u0025\u0064\u005f\u0065\u0078\u0070\u002e\u0070\u006e\u0067",_egc ,_gcc ));
if _ ,_gec :=_eeg .Stat (_dacb );_gec !=nil {break ;};_faf .Logf ("\u0025\u0073",_ace );if saveBaseline {_faf .Logf ("\u0043\u006fp\u0079\u0069\u006eg\u0020\u0025\u0073\u0020\u002d\u003e\u0020\u0025\u0073",_dacb ,_ace );_cdcd :=CopyFile (_dacb ,_ace );
if _cdcd !=nil {_faf .Fatalf ("\u0045\u0052\u0052OR\u0020\u0063\u006f\u0070\u0079\u0069\u006e\u0067\u0020\u0074\u006f\u0020\u0025\u0073\u003a\u0020\u0025\u0076",_ace ,_cdcd );};if _aaa {_cgge :=_ec .Sprintf ("\u0025s\u002d\u0025\u0064\u002e\u0070\u006eg",_edc ,_gcc );
_aecc :=_be .Join (baselineRenderPath ,_ec .Sprintf ("\u0025\u0073\u002d\u0025\u0064\u005f\u0065\u0078\u0070\u002e\u0070\u006e\u0067",_bba ,_gcc ));_faf .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",_cgge ,_aecc );
_gdgf :=CopyFile (_cgge ,_aecc );if _gdgf !=nil {_faf .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",_aecc ,_gdgf );
if _dfecd :=_fde (_ace ,_aecc );_dfecd !=nil {_faf .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",_aecc ,_dfecd );
};};_faf .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",_ace ,_aecc );
_gba ,_gdgf :=CombinePNGFiles (_ace ,_aecc );if _eeg .IsNotExist (_gdgf ){_faf .Fatal ("\u0069m\u0061g\u0065\u0020\u0066\u0069\u006ce\u0020\u006di\u0073\u0073\u0069\u006e\u0067");}else if !_gba {_faf .Fatal ("\u0055n\u0061\u0062\u006c\u0065\u0020\u0074\u006f\u0020\u0063\u006f\u006db\u0069\u006e\u0065\u0020\u0069\u006d\u0061\u0067\u0065\u0073");
};_faf .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",_ace ,_aecc );
_gba ,_cbb ,_bgab ,_bafb ,_gdgf :=CreatePNGDiff (_ace ,_aecc );if _gdgf !=nil &&_de .Is (_gdgf ,ErrImageSizeNotMatch ){_faf .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",_gdgf );
};if _gba {_faf .Logf ("\u0049\u006d\u0061\u0067\u0065\u003a\u0020\u0025\u0073\u000a",_cbb );_faf .Logf ("D\u0069\u0066\u0066\u0020Pe\u0072c\u0065\u006e\u0074\u003a\u0020%\u0032\u002e\u0066\u0025\u0025\u000a",_bgab );_faf .Logf ("\u0044i\u0066f\u0020\u0054\u006f\u0074\u0061\u006c\u003a\u0020\u0025\u0066\u000a",_bafb );
_ga :=_be .Base (_cbb );_fgc ,_abbg :=currentHashMap .Read (_ga );if _abbg &&(_fgc .DiffPercent < _bgab ||_fgc .DiffTotal < _bafb ){_faf .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",_bgab ,_bafb );
};_cde ,_bdee :=HashFile (_cbb );_fa .NoError (_faf ,_bdee );_fagg :=_fgd (_faf ,_cbb );if !_abbg ||_fgc .Value !=_cde ||_fgc .ResultSize !=_fagg ||_fgc .DiffPercent !=_bgab ||_fgc .DiffTotal !=_bafb {_afd :=ReferenceEntry {Timestamp :_ae .Now ().UTC ().Unix (),Value :_cde ,ResultSize :_fagg ,DiffPercent :_bgab ,DiffTotal :_bafb };
currentHashMap .Write (_ga ,_afd );if _bdee =refFile .Update (currentHashMap );_bdee !=nil {_faf .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",_bdee );
};};};};continue ;};_faf .Run (_ec .Sprintf ("\u0070\u0061\u0067\u0065\u0025\u0064",_gcc ),func (_cda *_f .T ){_cda .Logf ("\u0043o\u006dp\u0061\u0072\u0069\u006e\u0067 \u0025\u0073 \u0076\u0073\u0020\u0025\u0073",_dacb ,_ace );_fgad ,_ede :=ComparePNGFiles (_dacb ,_ace );
if _eeg .IsNotExist (_ede ){_cda .Fatal ("\u0069m\u0061g\u0065\u0020\u0066\u0069\u006ce\u0020\u006di\u0073\u0073\u0069\u006e\u0067");}else if !_fgad {_cda .Fatal ("\u0077\u0072\u006f\u006eg \u0070\u0061\u0067\u0065\u0020\u0072\u0065\u006e\u0064\u0065\u0072\u0065\u0064");
};});};});};func RenderPDFToPNGs (pdfPath string ,dpi int ,outpathTpl string )error {if dpi <=0{dpi =100;};if _ ,_bffa :=_d .LookPath ("\u0067\u0073");_bffa !=nil {return ErrRenderNotSupported ;};return _d .Command ("\u0067\u0073","\u002d\u0073\u0044\u0045\u0056\u0049\u0043\u0045\u003d\u0070\u006e\u0067a\u006c\u0070\u0068\u0061","\u002d\u006f",outpathTpl ,_ec .Sprintf ("\u002d\u0072\u0025\u0064",dpi ),pdfPath ).Run ();
};func _fgd (_eded *_f .T ,_daee string )int64 {_fdde ,_fgcg :=_eeg .Stat (_daee );_fa .NoError (_eded ,_fgcg );return _fdde .Size ();};func _fde (_eee ,_fag string )error {_dag ,_bef :=_eeg .Open (_eee );if _bef !=nil {return _bef ;};defer _dag .Close ();
_fcg ,_ ,_bef :=_dd .DecodeConfig (_dag );if _bef !=nil {panic (_bef );};_eca :=_dd .NewRGBA (_dd .Rect (0,0,_fcg .Width ,_fcg .Height ));_adg ,_bef :=_eeg .Create (_fag );if _bef !=nil {return _bef ;};defer _adg .Close ();_bef =_e .Encode (_adg ,_eca );
if _bef !=nil {return _bef ;};return nil ;};func HashFile (file string )(string ,error ){_cfb ,_dda :=_eeg .Open (file );if _dda !=nil {return "",_dda ;};defer _cfb .Close ();_cba :=_ee .New ();if _ ,_dda =_g .Copy (_cba ,_cfb );_dda !=nil {return "",_dda ;
};return _df .EncodeToString (_cba .Sum (nil )),nil ;};func (_cc *ReferenceMap )Read (key string )(ReferenceEntry ,bool ){_cc .Lock ();defer _cc .Unlock ();if _cc ._cgd ==nil {return ReferenceEntry {},false ;};_ag ,_cea :=_cc ._cgd [key ];return _ag ,_cea ;
};var (ErrRenderNotSupported =_de .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 =_de .New ("\u0069\u006d\u0061ge\u0020\u0073\u0069\u007a\u0065\u0073\u0020\u0064\u006f\u006e\u0027\u0074\u0020\u006d\u0061\u0074\u0063\u0068"););func (_gc *ReferenceFile )Update (currentMap *ReferenceMap )error {if _gc ._dc ==""{return nil ;
};_fd :=_gc .updateMap (currentMap );if _fd ==0{return nil ;};_acf ,_cg :=_eeg .OpenFile (_gc ._dc ,_eeg .O_CREATE |_eeg .O_TRUNC |_eeg .O_WRONLY ,0664);if _cg !=nil {return _cg ;};defer _acf .Close ();_gc .Timestamp =_ae .Now ().UTC ();_gb :=_bg .NewEncoder (_acf );
_gb .SetIndent ("","\u0009");return _gb .Encode (_gc );};func (_cbg *ReferenceFile )updateMap (_bf *ReferenceMap )int {var _ca int ;if _cbg .Map ._cgd ==nil {_cbg .Map ._cgd =map[string ]ReferenceEntry {};};for _acc ,_cfg :=range _bf ._cgd {_eb ,_ab :=_cbg .Map ._cgd [_acc ];
if !_ab {_cbg .Map ._cgd [_acc ]=_cfg ;_ca ++;continue ;};if string (_eb .Value )!=string (_cfg .Value ){_cbg .Map ._cgd [_acc ]=_cfg ;_ca ++;};};for _eed :=range _cbg .Map ._cgd {if _ ,_eec :=_bf ._cgd [_eed ];!_eec {delete (_cbg .Map ._cgd ,_eed );_ca ++;
};};return _ca ;};func _acb (_dfd ,_egd _ce .Color )bool {_gbc ,_eaf ,_ccc ,_fdd :=_dfd .RGBA ();_gf ,_efe ,_cbc ,_dfec :=_egd .RGBA ();return _gbc ==_gf &&_eaf ==_efe &&_ccc ==_cbc &&_fdd ==_dfec ;};func (_bd *ReferenceMap )Write (key string ,entry ReferenceEntry ){_bd .Lock ();
defer _bd .Unlock ();if _bd ._cgd ==nil {_bd ._cgd =map[string ]ReferenceEntry {};};_bd ._cgd [key ]=entry ;};func ReadPNG (file string )(_dd .Image ,error ){_bdd ,_bde :=_eeg .Open (file );if _bde !=nil {return nil ,_bde ;};defer _bdd .Close ();return _e .Decode (_bdd );
};