2020-10-19 10:58:10 +00:00
|
|
|
package imagerender ;import (_fa "errors";_ae "fmt";_da "github.com/golang/freetype/raster";_fac "github.com/unidoc/unipdf/v3/common";_db "github.com/unidoc/unipdf/v3/internal/transform";_e "github.com/unidoc/unipdf/v3/render/internal/context";_ag "golang.org/x/image/draw";_dd "golang.org/x/image/font";_dg "golang.org/x/image/math/f64";_b "golang.org/x/image/math/fixed";_cb "image";_gf "image/color";_c "image/draw";_g "math";_d "sort";_f "strings";);func (_ga *Context )capper ()_da .Capper {switch _ga ._bbg {case _e .LineCapButt :return _da .ButtCapper ;case _e .LineCapRound :return _da .RoundCapper ;case _e .LineCapSquare :return _da .SquareCapper ;};return nil ;};func (_afce *Context )stroke (_ec _da .Painter ){_deba :=_afce ._cac ;if len (_afce ._afc )> 0{_deba =_gfgfg (_deba ,_afce ._afc ,_afce ._dabf );}else {_deba =_faac (_dgff (_deba ));};_dge :=_afce ._de ;_dge .UseNonZeroWinding =true ;_dge .Clear ();_dge .AddStroke (_deba ,_fga (_afce ._bba ),_afce .capper (),_afce .joiner ());_dge .Rasterize (_ec );};func (_edfe stops )Swap (i ,j int ){_edfe [i ],_edfe [j ]=_edfe [j ],_edfe [i ]};func (_gbd *Context )SetStrokeStyle (pattern _e .Pattern ){_gbd ._abf =pattern };func (_gb *Context )Height ()int {return _gb ._gfgd };func (_ad *Context )Width ()int {return _ad ._eg };func (_gbe *Context )ClosePath (){if _gbe ._bfeb {_cacc :=_dbb (_gbe ._ced );_gbe ._cac .Add1 (_cacc );_gbe ._gg .Add1 (_cacc );_gbe ._egg =_gbe ._ced ;};};func (_fce *Context )DrawPoint (x ,y ,r float64 ){_fce .Push ();_ega ,_ccf :=_fce .Transform (x ,y );_fce .Identity ();_fce .DrawCircle (_ega ,_ccf ,r );_fce .Pop ();};func (_fca *Context )StrokePreserve (){var _efg _da .Painter ;if _fca ._beb ==nil {if _cd ,_fcab :=_fca ._abf .(*solidPattern );_fcab {_ebf :=_da .NewRGBAPainter (_fca ._dcd );_ebf .SetColor (_cd ._gef );_efg =_ebf ;};};if _efg ==nil {_efg =_fcf (_fca ._dcd ,_fca ._beb ,_fca ._abf );};_fca .stroke (_efg );};func (_fg *Context )SetFillRGBA (r ,g ,b ,a float64 ){_cca :=_gf .NRGBA {uint8 (r *255),uint8 (g *255),uint8 (b *255),uint8 (a *255)};_fg ._ac =_cca ;_fg ._ab =_ddf (_cca );};func (_gffc *linearGradient )ColorAt (x ,y int )_gf .Color {if len (_gffc ._edbc )==0{return _gf .Transparent ;};_bgd ,_ffff :=float64 (x ),float64 (y );_dfb ,_edfb ,_cfc ,_dea :=_gffc ._dcbg ,_gffc ._gcad ,_gffc ._ffb ,_gffc ._ddcd ;_ageb ,_eff :=_cfc -_dfb ,_dea -_edfb ;if _eff ==0&&_ageb !=0{return _dfae ((_bgd -_dfb )/_ageb ,_gffc ._edbc );};if _ageb ==0&&_eff !=0{return _dfae ((_ffff -_edfb )/_eff ,_gffc ._edbc );};_dee :=_ageb *(_bgd -_dfb )+_eff *(_ffff -_edfb );if _dee < 0{return _gffc ._edbc [0]._ebab ;};_ecf :=_g .Hypot (_ageb ,_eff );_eeb :=((_bgd -_dfb )*-_eff +(_ffff -_edfb )*_ageb )/(_ecf *_ecf );_ffffd ,_abc :=_dfb +_eeb *-_eff ,_edfb +_eeb *_ageb ;_ddd :=_g .Hypot (_bgd -_ffffd ,_ffff -_abc )/_ecf ;return _dfae (_ddd ,_gffc ._edbc );};type patternPainter struct{_cad *_cb .RGBA ;_cdc *_cb .Alpha ;_feg _e .Pattern ;};func (_ffc *Context )Clip (){_ffc .ClipPreserve ();_ffc .ClearPath ()};func (_cbd *Context )ResetClip (){_cbd ._beb =nil };func (_aae *Context )Transform (x ,y float64 )(_cbgg ,_aga float64 ){return _aae ._abb .Transform (x ,y )};func (_cae *Context )SetRGBA255 (r ,g ,b ,a int ){_cae ._ac =_gf .NRGBA {uint8 (r ),uint8 (g ),uint8 (b ),uint8 (a )};_cae .setFillAndStrokeColor (_cae ._ac );};func (_aaa *Context )DrawRoundedRectangle (x ,y ,w ,h ,r float64 ){_agc ,_gbdb ,_cde ,_cfb :=x ,x +r ,x +w -r ,x +w ;_ddc ,_fdg ,_egef ,_ccc :=y ,y +r ,y +h -r ,y +h ;_aaa .NewSubPath ();_aaa .MoveTo (_gbdb ,_ddc );_aaa .LineTo (_cde ,_ddc );_aaa .DrawArc (_cde ,_fdg ,r ,_bcdf (270),_bcdf (360));_aaa .LineTo (_cfb ,_egef );_aaa .DrawArc (_cde ,_egef ,r ,_bcdf (0),_bcdf (90));_aaa .LineTo (_gbdb ,_ccc );_aaa .DrawArc (_gbdb ,_egef ,r ,_bcdf (90),_bcdf (180));_aaa .LineTo (_agc ,_fdg );_aaa .DrawArc (_gbdb ,_fdg ,r ,_bcdf (180),_bcdf (270));_aaa .ClosePath ();};func _faac (_bfee [][]_db .Point )_da .Path {var _ceda _da .Path ;for _ ,_ebfa :=range _bfee {var _eed _b .Point26_6 ;for _dabe ,_cgdf :=range _ebfa {_cgb :=_dbb (_cgdf );if _dabe ==0{_ceda .St
|