2021-01-26 01:31:56 +00:00
|
|
|
package imagerender ;import (_fg "errors";_f "fmt";_ad "github.com/golang/freetype/raster";_ea "github.com/unidoc/unipdf/v3/common";_ag "github.com/unidoc/unipdf/v3/internal/transform";_ee "github.com/unidoc/unipdf/v3/render/internal/context";_ae "golang.org/x/image/draw";_eab "golang.org/x/image/font";_b "golang.org/x/image/math/f64";_ef "golang.org/x/image/math/fixed";_g "image";_cd "image/color";_a "image/draw";_cf "math";_e "sort";_cb "strings";);func _gdd (_caed float64 ,_geac stops )_cd .Color {if _caed <=0.0||len (_geac )==1{return _geac [0]._cde ;};_egbg :=_geac [len (_geac )-1];if _caed >=_egbg ._faa {return _egbg ._cde ;};for _eefc ,_cefb :=range _geac [1:]{if _caed < _cefb ._faa {_caed =(_caed -_geac [_eefc ]._faa )/(_cefb ._faa -_geac [_eefc ]._faa );return _fba (_geac [_eefc ]._cde ,_cefb ._cde ,_caed );};};return _egbg ._cde ;};func (_gfae *Context )fill (_cge _ad .Painter ){_geea :=_gfae ._gfe ;if _gfae ._bee {_geea =make (_ad .Path ,len (_gfae ._gfe ));copy (_geea ,_gfae ._gfe );_geea .Add1 (_fdff (_gfae ._ggg ));};_cbdb :=_gfae ._ada ;_cbdb .UseNonZeroWinding =_gfae ._ged ==_ee .FillRuleWinding ;_cbdb .Clear ();_cbdb .AddPath (_geea );_cbdb .Rasterize (_cge );};func (_agb *Context )InvertMask (){if _agb ._eg ==nil {_agb ._eg =_g .NewAlpha (_agb ._ba .Bounds ());}else {for _cdbb ,_geed :=range _agb ._eg .Pix {_agb ._eg .Pix [_cdbb ]=255-_geed ;};};};func _be (_ca ,_bec ,_aea ,_cbg ,_efe ,_fb ,_ac float64 )(_fbf ,_fe float64 ){_eaf :=1-_ac ;_gf :=_eaf *_eaf ;_cbd :=2*_eaf *_ac ;_acb :=_ac *_ac ;_fbf =_gf *_ca +_cbd *_aea +_acb *_efe ;_fe =_gf *_bec +_cbd *_cbg +_acb *_fb ;return ;};func _bgcg (_fegf ,_fdf ,_beg ,_cfd float64 )_ee .Gradient {_begc :=&linearGradient {_egeea :_fegf ,_dea :_fdf ,_fbg :_beg ,_cddg :_cfd };return _begc ;};func _gbbbd (_dfa _g .Image )*_g .RGBA {_bcf :=_dfa .Bounds ();_cab :=_g .NewRGBA (_bcf );_a .Draw (_cab ,_bcf ,_dfa ,_bcf .Min ,_a .Src );return _cab ;};func (_adc *Context )DrawLine (x1 ,y1 ,x2 ,y2 float64 ){_adc .MoveTo (x1 ,y1 );_adc .LineTo (x2 ,y2 )};func (_afa *Context )CubicTo (x1 ,y1 ,x2 ,y2 ,x3 ,y3 float64 ){if !_afa ._bee {_afa .MoveTo (x1 ,y1 );};_dff ,_cda :=_afa ._daa .X ,_afa ._daa .Y ;x1 ,y1 =_afa .Transform (x1 ,y1 );x2 ,y2 =_afa .Transform (x2 ,y2 );x3 ,y3 =_afa .Transform (x3 ,y3 );_dceg :=_abd (_dff ,_cda ,x1 ,y1 ,x2 ,y2 ,x3 ,y3 );_fgd :=_fdff (_afa ._daa );for _ ,_ffb :=range _dceg [1:]{_egf :=_fdff (_ffb );if _egf ==_fgd {continue ;};_fgd =_egf ;_afa ._dg .Add1 (_egf );_afa ._gfe .Add1 (_egf );_afa ._daa =_ffb ;};};func (_gggf *Context )DrawRoundedRectangle (x ,y ,w ,h ,r float64 ){_eae ,_ggdf ,_eaad ,_fgb :=x ,x +r ,x +w -r ,x +w ;_adg ,_dcb ,_ece ,_abb :=y ,y +r ,y +h -r ,y +h ;_gggf .NewSubPath ();_gggf .MoveTo (_ggdf ,_adg );_gggf .LineTo (_eaad ,_adg );_gggf .DrawArc (_eaad ,_dcb ,r ,_ccg (270),_ccg (360));_gggf .LineTo (_fgb ,_ece );_gggf .DrawArc (_eaad ,_ece ,r ,_ccg (0),_ccg (90));_gggf .LineTo (_ggdf ,_abb );_gggf .DrawArc (_ggdf ,_ece ,r ,_ccg (90),_ccg (180));_gggf .LineTo (_eae ,_dcb );_gggf .DrawArc (_ggdf ,_dcb ,r ,_ccg (180),_ccg (270));_gggf .ClosePath ();};func _bdcf (_adbd *_g .RGBA ,_efcc *_g .Alpha ,_febb _ee .Pattern )*patternPainter {return &patternPainter {_adbd ,_efcc ,_febb };};func _fba (_gcbe ,_cbbc _cd .Color ,_cacb float64 )_cd .Color {_geb ,_ebb ,_ccbc ,_ggaeb :=_gcbe .RGBA ();_dgc ,_fefe ,_gfc ,_ecca :=_cbbc .RGBA ();return _cd .RGBA {_geaf (_geb ,_dgc ,_cacb ),_geaf (_ebb ,_fefe ,_cacb ),_geaf (_ccbc ,_gfc ,_cacb ),_geaf (_ggaeb ,_ecca ,_cacb )};};func (_fee *Context )FillPreserve (){var _ced _ad .Painter ;if _fee ._eg ==nil {if _geg ,_affa :=_fee ._cea .(*solidPattern );_affa {_db :=_ad .NewRGBAPainter (_fee ._ba );_db .SetColor (_geg ._cafa );_ced =_db ;};};if _ced ==nil {_ced =_bdcf (_fee ._ba ,_fee ._eg ,_fee ._cea );};_fee .fill (_ced );};func (_bgf *Context )LineTo (x ,y float64 ){if !_bgf ._bee {_bgf .MoveTo (x ,y );}else {x ,y =_bgf .Transform (x ,y );_egb :=_ag .NewPoint (x ,y );_bdd :=_fdff (_egb );_bgf ._dg .Add1 (_bdd );_bgf ._gfe .Add1 (_bdd );_bgf ._daa =_egb ;};};func (_ggd *Context )SetLineCap (lineCap _ee
|