2023-11-11 11:29:03 +00:00

106 lines
27 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 imagerender ;import (_g "errors";_b "fmt";_cee "github.com/unidoc/freetype/raster";_gb "github.com/unidoc/unipdf/v3/common";_cc "github.com/unidoc/unipdf/v3/internal/transform";_ae "github.com/unidoc/unipdf/v3/render/internal/context";_f "golang.org/x/image/draw";
_af "golang.org/x/image/font";_ab "golang.org/x/image/math/f64";_fd "golang.org/x/image/math/fixed";_da "image";_e "image/color";_ba "image/draw";_ce "math";_a "sort";_d "strings";);func (_fgf *Context )DrawStringAnchored (s string ,face _af .Face ,x ,y ,ax ,ay float64 ){_caaa ,_dga :=_fgf .MeasureString (s ,face );
_fgf .drawString (s ,face ,x -ax *_caaa ,y +ay *_dga );};func (_fdc *Context )DrawRectangle (x ,y ,w ,h float64 ){_fdc .NewSubPath ();_fdc .MoveTo (x ,y );_fdc .LineTo (x +w ,y );_fdc .LineTo (x +w ,y +h );_fdc .LineTo (x ,y +h );_fdc .ClosePath ();};func (_gfge *Context )DrawEllipse (x ,y ,rx ,ry float64 ){_gfge .NewSubPath ();
_gfge .DrawEllipticalArc (x ,y ,rx ,ry ,0,2*_ce .Pi );_gfge .ClosePath ();};type solidPattern struct{_afb _e .Color };func _aafd (_ceefe float64 ,_dcfc stops )_e .Color {if _ceefe <=0.0||len (_dcfc )==1{return _dcfc [0]._dec ;};_dfa :=_dcfc [len (_dcfc )-1];
if _ceefe >=_dfa ._edga {return _dfa ._dec ;};for _dcdb ,_eacf :=range _dcfc [1:]{if _ceefe < _eacf ._edga {_ceefe =(_ceefe -_dcfc [_dcdb ]._edga )/(_eacf ._edga -_dcfc [_dcdb ]._edga );return _geab (_dcfc [_dcdb ]._dec ,_eacf ._dec ,_ceefe );};};return _dfa ._dec ;
};func (_bdeb *Context )SetColor (c _e .Color ){_bdeb .setFillAndStrokeColor (c )};func (_ade *Context )DrawImage (im _da .Image ,x ,y int ){_ade .DrawImageAnchored (im ,x ,y ,0,0)};func (_cae *Context )SetPixel (x ,y int ){_cae ._dfb .Set (x ,y ,_cae ._bbb )};
func (_dbc *Context )Scale (x ,y float64 ){_dbc ._gfcd =_dbc ._gfcd .Scale (x ,y )};type radialGradient struct{_ccdb ,_dab ,_cad circle ;_afeg ,_bgb float64 ;_aac float64 ;_fge stops ;};func _fe (_bc ,_ag ,_ec ,_bb ,_cec ,_ceg ,_ad float64 )(_bd ,_bde float64 ){_cb :=1-_ad ;
_gf :=_cb *_cb ;_be :=2*_cb *_ad ;_dc :=_ad *_ad ;_bd =_gf *_bc +_be *_ec +_dc *_cec ;_bde =_gf *_ag +_be *_bb +_dc *_ceg ;return ;};type patternPainter struct{_cbc *_da .RGBA ;_cgcg *_da .Alpha ;_agc _ae .Pattern ;};func (_dcf *Context )NewSubPath (){if _dcf ._gc {_dcf ._fda .Add1 (_agdd (_dcf ._fff ));
};_dcf ._gc =false ;};func (_gee *linearGradient )ColorAt (x ,y int )_e .Color {if len (_gee ._dfffa )==0{return _e .Transparent ;};_fcc ,_agd :=float64 (x ),float64 (y );_fab ,_bfd ,_ddgc ,_bdc :=_gee ._bec ,_gee ._fgdb ,_gee ._cgc ,_gee ._aag ;_acd ,_fbg :=_ddgc -_fab ,_bdc -_bfd ;
if _fbg ==0&&_acd !=0{return _aafd ((_fcc -_fab )/_acd ,_gee ._dfffa );};if _acd ==0&&_fbg !=0{return _aafd ((_agd -_bfd )/_fbg ,_gee ._dfffa );};_beag :=_acd *(_fcc -_fab )+_fbg *(_agd -_bfd );if _beag < 0{return _gee ._dfffa [0]._dec ;};_cecb :=_ce .Hypot (_acd ,_fbg );
_bga :=((_fcc -_fab )*-_fbg +(_agd -_bfd )*_acd )/(_cecb *_cecb );_cabf ,_fccc :=_fab +_bga *-_fbg ,_bfd +_bga *_acd ;_aefd :=_ce .Hypot (_fcc -_cabf ,_agd -_fccc )/_cecb ;return _aafd (_aefd ,_gee ._dfffa );};func (_ebf *Context )AsMask ()*_da .Alpha {_bdg :=_da .NewAlpha (_ebf ._dfb .Bounds ());
_f .Draw (_bdg ,_ebf ._dfb .Bounds (),_ebf ._dfb ,_da .Point {},_f .Src );return _bdg ;};func (_dff *Context )SetLineJoin (lineJoin _ae .LineJoin ){_dff ._aba =lineJoin };func (_bbf *Context )InvertMask (){if _bbf ._acb ==nil {_bbf ._acb =_da .NewAlpha (_bbf ._dfb .Bounds ());
}else {for _gea ,_ffe :=range _bbf ._acb .Pix {_bbf ._acb .Pix [_gea ]=255-_ffe ;};};};func (_eca *Context )SetRGBA255 (r ,g ,b ,a int ){_eca ._bbb =_e .NRGBA {uint8 (r ),uint8 (g ),uint8 (b ),uint8 (a )};_eca .setFillAndStrokeColor (_eca ._bbb );};func (_dcfg *Context )DrawRoundedRectangle (x ,y ,w ,h ,r float64 ){_egf ,_cdd ,_fg ,_caf :=x ,x +r ,x +w -r ,x +w ;
_cfcc ,_fbb ,_egfg ,_fedg :=y ,y +r ,y +h -r ,y +h ;_dcfg .NewSubPath ();_dcfg .MoveTo (_cdd ,_cfcc );_dcfg .LineTo (_fg ,_cfcc );_dcfg .DrawArc (_fg ,_fbb ,r ,_dfgg (270),_dfgg (360));_dcfg .LineTo (_caf ,_egfg );_dcfg .DrawArc (_fg ,_egfg ,r ,_dfgg (0),_dfgg (90));
_dcfg .LineTo (_cdd ,_fedg );_dcfg .DrawArc (_cdd ,_egfg ,r ,_dfgg (90),_dfgg (180));_dcfg .LineTo (_egf ,_fbb );_dcfg .DrawArc (_cdd ,_fbb ,r ,_dfgg (180),_dfgg (270));_dcfg .ClosePath ();};func _acfg (_fbd *_da .RGBA ,_fffb *_da .Alpha ,_agdac _ae .Pattern )*patternPainter {return &patternPainter {_fbd ,_fffb ,_agdac };
};func (_bada *Context )SetDashOffset (offset float64 ){_bada ._bddb =offset };func (_ccg *Context )Clip (){_ccg .ClipPreserve ();_ccg .ClearPath ()};func (_gec *Context )Stroke (){_gec .StrokePreserve ();_gec .ClearPath ()};func (_ecb *Context )SetFillRule (fillRule _ae .FillRule ){_ecb ._cfg =fillRule };
func (_bf *Context )SetRGB255 (r ,g ,b int ){_bf .SetRGBA255 (r ,g ,b ,255)};type surfacePattern struct{_affg _da .Image ;_cacg repeatOp ;};func (_aed *Context )Height ()int {return _aed ._ge };func (_aaf stops )Swap (i ,j int ){_aaf [i ],_aaf [j ]=_aaf [j ],_aaf [i ]};
func (_dfff *Context )SetRGBA (r ,g ,b ,a float64 ){_dfff ._bbb =_e .NRGBA {uint8 (r *255),uint8 (g *255),uint8 (b *255),uint8 (a *255)};_dfff .setFillAndStrokeColor (_dfff ._bbb );};func (_fbab *Context )ShearAbout (sx ,sy ,x ,y float64 ){_fbab .Translate (x ,y );
_fbab .Shear (sx ,sy );_fbab .Translate (-x ,-y );};func (_gbd *Context )SetRGB (r ,g ,b float64 ){_gbd .SetRGBA (r ,g ,b ,1)};type linearGradient struct{_bec ,_fgdb ,_cgc ,_aag float64 ;_dfffa stops ;};func (_abce *Context )ClosePath (){if _abce ._gc {_eec :=_agdd (_abce ._fff );
_abce ._ecc .Add1 (_eec );_abce ._fda .Add1 (_eec );_abce ._bdd =_abce ._fff ;};};func (_dda *Context )ClearPath (){_dda ._ecc .Clear ();_dda ._fda .Clear ();_dda ._gc =false };func NewContextForRGBA (im *_da .RGBA )*Context {_ada :=im .Bounds ().Size ().X ;
_bbba :=im .Bounds ().Size ().Y ;return &Context {_gfbg :_ada ,_ge :_bbba ,_gd :_cee .NewRasterizer (_ada ,_bbba ),_dfb :im ,_bbb :_e .Transparent ,_ffc :_gff ,_ed :_dfc ,_afg :1,_cfg :_ae .FillRuleWinding ,_gfcd :_cc .IdentityMatrix (),_bbbc :_ae .NewTextState ()};
};func NewContextForImage (im _da .Image )*Context {return NewContextForRGBA (_eecg (im ))};func (_adf stops )Len ()int {return len (_adf )};func (_bad *Context )SetDash (dashes ...float64 ){_bad ._cdf =dashes };func (_dfgb *Context )SetLineWidth (lineWidth float64 ){_dfgb ._afg =lineWidth };
func (_fcg *Context )LineWidth ()float64 {return _fcg ._afg };type stops []stop ;func (_dbd *Context )DrawPoint (x ,y ,r float64 ){_dbd .Push ();_eegb ,_gg :=_dbd .Transform (x ,y );_dbd .Identity ();_dbd .DrawCircle (_eegb ,_gg ,r );_dbd .Pop ();};func _bdgb (_dafd _da .Image ,_geb repeatOp )_ae .Pattern {return &surfacePattern {_affg :_dafd ,_cacg :_geb };
};type circle struct{_efee ,_dcg ,_eba float64 };func (_baec *Context )ScaleAbout (sx ,sy ,x ,y float64 ){_baec .Translate (x ,y );_baec .Scale (sx ,sy );_baec .Translate (-x ,-y );};func (_ceca *Context )DrawArc (x ,y ,r ,angle1 ,angle2 float64 ){_ceca .DrawEllipticalArc (x ,y ,r ,r ,angle1 ,angle2 );
};func _caef (_fea _cee .Path )[][]_cc .Point {var _agg [][]_cc .Point ;var _bdcd []_cc .Point ;var _ddga ,_fga float64 ;for _efc :=0;_efc < len (_fea );{switch _fea [_efc ]{case 0:if len (_bdcd )> 0{_agg =append (_agg ,_bdcd );_bdcd =nil ;};_abac :=_aafe (_fea [_efc +1]);
_caad :=_aafe (_fea [_efc +2]);_bdcd =append (_bdcd ,_cc .NewPoint (_abac ,_caad ));_ddga ,_fga =_abac ,_caad ;_efc +=4;case 1:_bebf :=_aafe (_fea [_efc +1]);_bbdb :=_aafe (_fea [_efc +2]);_bdcd =append (_bdcd ,_cc .NewPoint (_bebf ,_bbdb ));_ddga ,_fga =_bebf ,_bbdb ;
_efc +=4;case 2:_cadd :=_aafe (_fea [_efc +1]);_gdg :=_aafe (_fea [_efc +2]);_ffee :=_aafe (_fea [_efc +3]);_cecae :=_aafe (_fea [_efc +4]);_dbf :=_cd (_ddga ,_fga ,_cadd ,_gdg ,_ffee ,_cecae );_bdcd =append (_bdcd ,_dbf ...);_ddga ,_fga =_ffee ,_cecae ;
_efc +=6;case 3:_cggb :=_aafe (_fea [_efc +1]);_dcc :=_aafe (_fea [_efc +2]);_ecbf :=_aafe (_fea [_efc +3]);_ace :=_aafe (_fea [_efc +4]);_agda :=_aafe (_fea [_efc +5]);_bcee :=_aafe (_fea [_efc +6]);_bebd :=_eaf (_ddga ,_fga ,_cggb ,_dcc ,_ecbf ,_ace ,_agda ,_bcee );
_bdcd =append (_bdcd ,_bebd ...);_ddga ,_fga =_agda ,_bcee ;_efc +=8;default:_gb .Log .Debug ("\u0057\u0041\u0052\u004e: \u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0070\u0061\u0074\u0068\u003a\u0020%\u0076",_fea );return _agg ;};};if len (_bdcd )> 0{_agg =append (_agg ,_bdcd );
};return _agg ;};func (_fad *Context )FillPattern ()_ae .Pattern {return _fad ._ffc };func (_bea *Context )DrawCircle (x ,y ,r float64 ){_bea .NewSubPath ();_bea .DrawEllipticalArc (x ,y ,r ,r ,0,2*_ce .Pi );_bea .ClosePath ();};func (_cbd *Context )QuadraticTo (x1 ,y1 ,x2 ,y2 float64 ){if !_cbd ._gc {_cbd .MoveTo (x1 ,y1 );
};x1 ,y1 =_cbd .Transform (x1 ,y1 );x2 ,y2 =_cbd .Transform (x2 ,y2 );_egea :=_cc .NewPoint (x1 ,y1 );_fef :=_cc .NewPoint (x2 ,y2 );_gda :=_agdd (_egea );_abc :=_agdd (_fef );_cbd ._ecc .Add2 (_gda ,_abc );_cbd ._fda .Add2 (_gda ,_abc );_cbd ._bdd =_fef ;
};func (_ee *Context )SetStrokeRGBA (r ,g ,b ,a float64 ){_faae :=_e .NRGBA {uint8 (r *255),uint8 (g *255),uint8 (b *255),uint8 (a *255)};_ee ._ed =_dcffa (_faae );};func _cadg (_affa [][]_cc .Point ,_dgg []float64 ,_bgc float64 )[][]_cc .Point {var _ded [][]_cc .Point ;
if len (_dgg )==0{return _affa ;};if len (_dgg )==1{_dgg =append (_dgg ,_dgg [0]);};for _ ,_add :=range _affa {if len (_add )< 2{continue ;};_dbce :=_add [0];_faaa :=1;_dbfb :=0;_dag :=0.0;if _bgc !=0{var _dbcg float64 ;for _ ,_abbd :=range _dgg {_dbcg +=_abbd ;
};_bgc =_ce .Mod (_bgc ,_dbcg );if _bgc < 0{_bgc +=_dbcg ;};for _gccdc ,_aaag :=range _dgg {_bgc -=_aaag ;if _bgc < 0{_dbfb =_gccdc ;_dag =_aaag +_bgc ;break ;};};};var _bdad []_cc .Point ;_bdad =append (_bdad ,_dbce );for _faaa < len (_add ){_bfcg :=_dgg [_dbfb ];
_ffb :=_add [_faaa ];_gcea :=_dbce .Distance (_ffb );_bdbe :=_bfcg -_dag ;if _gcea > _bdbe {_fggd :=_bdbe /_gcea ;_ecba :=_dbce .Interpolate (_ffb ,_fggd );_bdad =append (_bdad ,_ecba );if _dbfb %2==0&&len (_bdad )> 1{_ded =append (_ded ,_bdad );};_bdad =nil ;
_bdad =append (_bdad ,_ecba );_dag =0;_dbce =_ecba ;_dbfb =(_dbfb +1)%len (_dgg );}else {_bdad =append (_bdad ,_ffb );_dbce =_ffb ;_dag +=_gcea ;_faaa ++;};};if _dbfb %2==0&&len (_bdad )> 1{_ded =append (_ded ,_bdad );};};return _ded ;};func (_bdgc *Context )drawString (_eged string ,_fbcc _af .Face ,_dgd ,_egb float64 ){_efg :=&_af .Drawer {Src :_da .NewUniform (_bdgc ._bbb ),Face :_fbcc ,Dot :_agdd (_cc .NewPoint (_dgd ,_egb ))};
_gccf :=rune (-1);for _ ,_aca :=range _eged {if _gccf >=0{_efg .Dot .X +=_efg .Face .Kern (_gccf ,_aca );};_eefd ,_bade ,_fffd ,_dfgba ,_afd :=_efg .Face .Glyph (_efg .Dot ,_aca );if !_afd {continue ;};_cca :=_eefd .Sub (_eefd .Min );_cdde :=_da .NewRGBA (_cca );
_f .DrawMask (_cdde ,_cca ,_efg .Src ,_da .Point {},_bade ,_fffd ,_f .Over );var _bfg *_f .Options ;if _bdgc ._acb !=nil {_bfg =&_f .Options {DstMask :_bdgc ._acb ,DstMaskP :_da .Point {}};};_ddab :=_bdgc ._gfcd .Clone ().Translate (float64 (_eefd .Min .X ),float64 (_eefd .Min .Y ));
_ceef :=_ab .Aff3 {_ddab [0],_ddab [3],_ddab [6],_ddab [1],_ddab [4],_ddab [7]};_f .BiLinear .Transform (_bdgc ._dfb ,_ceef ,_cdde ,_cca ,_f .Over ,_bfg );_efg .Dot .X +=_dfgba ;_gccf =_aca ;};};func (_cab *Context )DrawLine (x1 ,y1 ,x2 ,y2 float64 ){_cab .MoveTo (x1 ,y1 );
_cab .LineTo (x2 ,y2 )};func _geab (_ddf ,_ccgb _e .Color ,_dce float64 )_e .Color {_fccf ,_cafc ,_dfdb ,_edcd :=_ddf .RGBA ();_ebge ,_eee ,_eddf ,_fdee :=_ccgb .RGBA ();return _e .RGBA {_fabe (_fccf ,_ebge ,_dce ),_fabe (_cafc ,_eee ,_dce ),_fabe (_dfdb ,_eddf ,_dce ),_fabe (_edcd ,_fdee ,_dce )};
};type Context struct{_gfbg int ;_ge int ;_gd *_cee .Rasterizer ;_dfb *_da .RGBA ;_acb *_da .Alpha ;_bbb _e .Color ;_ffc _ae .Pattern ;_ed _ae .Pattern ;_ecc _cee .Path ;_fda _cee .Path ;_fff _cc .Point ;_bdd _cc .Point ;_gc bool ;_cdf []float64 ;_bddb float64 ;
_afg float64 ;_dfg _ae .LineCap ;_aba _ae .LineJoin ;_cfg _ae .FillRule ;_gfcd _cc .Matrix ;_bbbc _ae .TextState ;_ffa []*Context ;};func (_egeg *linearGradient )AddColorStop (offset float64 ,color _e .Color ){_egeg ._dfffa =append (_egeg ._dfffa ,stop {_edga :offset ,_dec :color });
_a .Sort (_egeg ._dfffa );};func (_cfga *Context )SetMatrix (m _cc .Matrix ){_cfga ._gfcd =m };func (_cgb *Context )DrawString (s string ,face _af .Face ,x ,y float64 ){_cgb .DrawStringAnchored (s ,face ,x ,y ,0,0);};func (_beg *Context )StrokePreserve (){var _aedc _cee .Painter ;
if _beg ._acb ==nil {if _abb ,_gbg :=_beg ._ed .(*solidPattern );_gbg {_edb :=_cee .NewRGBAPainter (_beg ._dfb );_edb .SetColor (_abb ._afb );_aedc =_edb ;};};if _aedc ==nil {_aedc =_acfg (_beg ._dfb ,_beg ._acb ,_beg ._ed );};_beg .stroke (_aedc );};type repeatOp int ;
func (_eeg *Context )joiner ()_cee .Joiner {switch _eeg ._aba {case _ae .LineJoinBevel :return _cee .BevelJoiner ;case _ae .LineJoinRound :return _cee .RoundJoiner ;};return nil ;};func (_eb *Context )ClipPreserve (){_edd :=_da .NewAlpha (_da .Rect (0,0,_eb ._gfbg ,_eb ._ge ));
_cea :=_cee .NewAlphaOverPainter (_edd );_eb .fill (_cea );if _eb ._acb ==nil {_eb ._acb =_edd ;}else {_eae :=_da .NewAlpha (_da .Rect (0,0,_eb ._gfbg ,_eb ._ge ));_f .DrawMask (_eae ,_eae .Bounds (),_edd ,_da .Point {},_eb ._acb ,_da .Point {},_f .Over );
_eb ._acb =_eae ;};};func (_fdab *Context )SetLineCap (lineCap _ae .LineCap ){_fdab ._dfg =lineCap };func (_gae *Context )SetFillRGBA (r ,g ,b ,a float64 ){_dcb :=_e .NRGBA {uint8 (r *255),uint8 (g *255),uint8 (b *255),uint8 (a *255)};_gae ._bbb =_dcb ;
_gae ._ffc =_dcffa (_dcb );};func (_bgg *Context )Transform (x ,y float64 )(_ddd ,_bbcf float64 ){return _bgg ._gfcd .Transform (x ,y )};func (_ecae *Context )stroke (_bce _cee .Painter ){_cega :=_ecae ._ecc ;if len (_ecae ._cdf )> 0{_cega =_ggc (_cega ,_ecae ._cdf ,_ecae ._bddb );
}else {_cega =_cbf (_caef (_cega ));};_fdb :=_ecae ._gd ;_fdb .UseNonZeroWinding =true ;_fdb .Clear ();_edeg :=(_ecae ._gfcd .ScalingFactorX ()+_ecae ._gfcd .ScalingFactorY ())/2;_fdb .AddStroke (_cega ,_efd (_ecae ._afg *_edeg ),_ecae .capper (),_ecae .joiner ());
_fdb .Rasterize (_bce );};func _bfb (_bbd ,_ggd ,_acfa ,_cffc ,_dfcg ,_acce float64 )float64 {return _bbd *_cffc +_ggd *_dfcg +_acfa *_acce ;};func (_dfe *Context )CubicTo (x1 ,y1 ,x2 ,y2 ,x3 ,y3 float64 ){if !_dfe ._gc {_dfe .MoveTo (x1 ,y1 );};_dfd ,_acg :=_dfe ._bdd .X ,_dfe ._bdd .Y ;
x1 ,y1 =_dfe .Transform (x1 ,y1 );x2 ,y2 =_dfe .Transform (x2 ,y2 );x3 ,y3 =_dfe .Transform (x3 ,y3 );_bcc :=_eaf (_dfd ,_acg ,x1 ,y1 ,x2 ,y2 ,x3 ,y3 );_gad :=_agdd (_dfe ._bdd );for _ ,_cag :=range _bcc [1:]{_dcbb :=_agdd (_cag );if _dcbb ==_gad {continue ;
};_gad =_dcbb ;_dfe ._ecc .Add1 (_dcbb );_dfe ._fda .Add1 (_dcbb );_dfe ._bdd =_cag ;};};func (_cg *Context )Width ()int {return _cg ._gfbg };func (_cba *Context )capper ()_cee .Capper {switch _cba ._dfg {case _ae .LineCapButt :return _cee .ButtCapper ;
case _ae .LineCapRound :return _cee .RoundCapper ;case _ae .LineCapSquare :return _cee .SquareCapper ;};return nil ;};func (_eaad *radialGradient )ColorAt (x ,y int )_e .Color {if len (_eaad ._fge )==0{return _e .Transparent ;};_bgaf ,_dgf :=float64 (x )+0.5-_eaad ._ccdb ._efee ,float64 (y )+0.5-_eaad ._ccdb ._dcg ;
_bbdc :=_bfb (_bgaf ,_dgf ,_eaad ._ccdb ._eba ,_eaad ._cad ._efee ,_eaad ._cad ._dcg ,_eaad ._cad ._eba );_efb :=_bfb (_bgaf ,_dgf ,-_eaad ._ccdb ._eba ,_bgaf ,_dgf ,_eaad ._ccdb ._eba );if _eaad ._afeg ==0{if _bbdc ==0{return _e .Transparent ;};_afcb :=0.5*_efb /_bbdc ;
if _afcb *_eaad ._cad ._eba >=_eaad ._aac {return _aafd (_afcb ,_eaad ._fge );};return _e .Transparent ;};_bdb :=_bfb (_bbdc ,_eaad ._afeg ,0,_bbdc ,-_efb ,0);if _bdb >=0{_aab :=_ce .Sqrt (_bdb );_fcccc :=(_bbdc +_aab )*_eaad ._bgb ;_feb :=(_bbdc -_aab )*_eaad ._bgb ;
if _fcccc *_eaad ._cad ._eba >=_eaad ._aac {return _aafd (_fcccc ,_eaad ._fge );}else if _feb *_eaad ._cad ._eba >=_eaad ._aac {return _aafd (_feb ,_eaad ._fge );};};return _e .Transparent ;};func (_cgf *Context )drawRegularPolygon (_fgd int ,_gabd ,_acgf ,_dded ,_gccd float64 ){_eafa :=2*_ce .Pi /float64 (_fgd );
_gccd -=_ce .Pi /2;if _fgd %2==0{_gccd +=_eafa /2;};_cgf .NewSubPath ();for _afc :=0;_afc < _fgd ;_afc ++{_efe :=_gccd +_eafa *float64 (_afc );_cgf .LineTo (_gabd +_dded *_ce .Cos (_efe ),_acgf +_dded *_ce .Sin (_efe ));};_cgf .ClosePath ();};func (_ede *Context )Image ()_da .Image {return _ede ._dfb };
func _gfg (_ac ,_fdd ,_aaa ,_de ,_daf ,_fb ,_aec ,_abd ,_egeb float64 )(_ccd ,_acc float64 ){_cef :=1-_egeb ;_fba :=_cef *_cef *_cef ;_ga :=3*_cef *_cef *_egeb ;_eaa :=3*_cef *_egeb *_egeb ;_aeace :=_egeb *_egeb *_egeb ;_ccd =_fba *_ac +_ga *_aaa +_eaa *_daf +_aeace *_aec ;
_acc =_fba *_fdd +_ga *_de +_eaa *_fb +_aeace *_abd ;return ;};func _eecg (_ecf _da .Image )*_da .RGBA {_dcfe :=_ecf .Bounds ();_fae :=_da .NewRGBA (_dcfe );_ba .Draw (_fae ,_dcfe ,_ecf ,_dcfe .Min ,_ba .Src );return _fae ;};func (_gcc *Context )setFillAndStrokeColor (_cce _e .Color ){_gcc ._bbb =_cce ;
_gcc ._ffc =_dcffa (_cce );_gcc ._ed =_dcffa (_cce );};func (_gbge *Context )Clear (){_gfgc :=_da .NewUniform (_gbge ._bbb );_f .Draw (_gbge ._dfb ,_gbge ._dfb .Bounds (),_gfgc ,_da .Point {},_f .Src );};func (_dffd *Context )Translate (x ,y float64 ){_dffd ._gfcd =_dffd ._gfcd .Translate (x ,y )};
func (_ggb *Context )DrawEllipticalArc (x ,y ,rx ,ry ,angle1 ,angle2 float64 ){const _eef =16;for _ega :=0;_ega < _eef ;_ega ++{_gbc :=float64 (_ega +0)/_eef ;_dafc :=float64 (_ega +1)/_eef ;_bega :=angle1 +(angle2 -angle1 )*_gbc ;_dffg :=angle1 +(angle2 -angle1 )*_dafc ;
_adb :=x +rx *_ce .Cos (_bega );_eeca :=y +ry *_ce .Sin (_bega );_cebg :=x +rx *_ce .Cos ((_bega +_dffg )/2);_bda :=y +ry *_ce .Sin ((_bega +_dffg )/2);_afe :=x +rx *_ce .Cos (_dffg );_geae :=y +ry *_ce .Sin (_dffg );_cffb :=2*_cebg -_adb /2-_afe /2;_gaf :=2*_bda -_eeca /2-_geae /2;
if _ega ==0{if _ggb ._gc {_ggb .LineTo (_adb ,_eeca );}else {_ggb .MoveTo (_adb ,_eeca );};};_ggb .QuadraticTo (_cffb ,_gaf ,_afe ,_geae );};};func (_fag *Context )LineTo (x ,y float64 ){if !_fag ._gc {_fag .MoveTo (x ,y );}else {x ,y =_fag .Transform (x ,y );
_bfc :=_cc .NewPoint (x ,y );_dbg :=_agdd (_bfc );_fag ._ecc .Add1 (_dbg );_fag ._fda .Add1 (_dbg );_fag ._bdd =_bfc ;};};func (_aef *Context )Identity (){_aef ._gfcd =_cc .IdentityMatrix ()};func (_ccbc *Context )Shear (x ,y float64 ){_ccbc ._gfcd .Shear (x ,y )};
const (_gade repeatOp =iota ;_eddb ;_dgb ;_eacb ;);func NewLinearGradient (x0 ,y0 ,x1 ,y1 float64 )_ae .Gradient {_fcf :=&linearGradient {_bec :x0 ,_fgdb :y0 ,_cgc :x1 ,_aag :y1 };return _fcf ;};func _fabe (_gbdb ,_cafa uint32 ,_egac float64 )uint8 {return uint8 (int32 (float64 (_gbdb )*(1.0-_egac )+float64 (_cafa )*_egac )>>8);
};func (_beb *Context )TextState ()*_ae .TextState {return &_beb ._bbbc };func (_gece *radialGradient )AddColorStop (offset float64 ,color _e .Color ){_gece ._fge =append (_gece ._fge ,stop {_edga :offset ,_dec :color });_a .Sort (_gece ._fge );};func _ggc (_dee _cee .Path ,_bee []float64 ,_dcff float64 )_cee .Path {return _cbf (_cadg (_caef (_dee ),_bee ,_dcff ));
};func (_bae *Context )FillPreserve (){var _edg _cee .Painter ;if _bae ._acb ==nil {if _eac ,_deb :=_bae ._ffc .(*solidPattern );_deb {_bbc :=_cee .NewRGBAPainter (_bae ._dfb );_bbc .SetColor (_eac ._afb );_edg =_bbc ;};};if _edg ==nil {_edg =_acfg (_bae ._dfb ,_bae ._acb ,_bae ._ffc );
};_bae .fill (_edg );};func (_gffb *Context )MeasureString (s string ,face _af .Face )(_aeb ,_ffeb float64 ){_gcca :=&_af .Drawer {Face :face };_acbb :=_gcca .MeasureString (s );return float64 (_acbb >>6),_gffb ._bbbc .Tf .Size ;};var (_gff =_dcffa (_e .White );
_dfc =_dcffa (_e .Black ););func (_bca *Context )SetFillStyle (pattern _ae .Pattern ){if _cda ,_aff :=pattern .(*solidPattern );_aff {_bca ._bbb =_cda ._afb ;};_bca ._ffc =pattern ;};func (_bcd *Context )SetMask (mask *_da .Alpha )error {if mask .Bounds ().Size ()!=_bcd ._dfb .Bounds ().Size (){return _g .New ("\u006d\u0061\u0073\u006b\u0020\u0073i\u007a\u0065\u0020\u006d\u0075\u0073\u0074\u0020\u006d\u0061\u0074\u0063\u0068 \u0063\u006f\u006e\u0074\u0065\u0078\u0074 \u0073\u0069\u007a\u0065");
};_bcd ._acb =mask ;return nil ;};func NewRadialGradient (x0 ,y0 ,r0 ,x1 ,y1 ,r1 float64 )_ae .Gradient {_fdca :=circle {x0 ,y0 ,r0 };_bcce :=circle {x1 ,y1 ,r1 };_cfa :=circle {x1 -x0 ,y1 -y0 ,r1 -r0 };_fca :=_bfb (_cfa ._efee ,_cfa ._dcg ,-_cfa ._eba ,_cfa ._efee ,_cfa ._dcg ,_cfa ._eba );
var _bcdf float64 ;if _fca !=0{_bcdf =1.0/_fca ;};_aega :=-_fdca ._eba ;_acba :=&radialGradient {_ccdb :_fdca ,_dab :_bcce ,_cad :_cfa ,_afeg :_fca ,_bgb :_bcdf ,_aac :_aega };return _acba ;};func _efd (_gaa float64 )_fd .Int26_6 {return _fd .Int26_6 (_gaa *64)};
func (_dg *Context )Fill (){_dg .FillPreserve ();_dg .ClearPath ()};func (_fgg *Context )RotateAbout (angle ,x ,y float64 ){_fgg .Translate (x ,y );_fgg .Rotate (angle );_fgg .Translate (-x ,-y );};func (_gfd *Context )Push (){_bgd :=*_gfd ;_gfd ._ffa =append (_gfd ._ffa ,&_bgd )};
func _cbf (_bdcg [][]_cc .Point )_cee .Path {var _gfbe _cee .Path ;for _ ,_adg :=range _bdcg {var _agbf _fd .Point26_6 ;for _eegg ,_fgc :=range _adg {_cbfb :=_agdd (_fgc );if _eegg ==0{_gfbe .Start (_cbfb );}else {_ffd :=_cbfb .X -_agbf .X ;_ffdd :=_cbfb .Y -_agbf .Y ;
if _ffd < 0{_ffd =-_ffd ;};if _ffdd < 0{_ffdd =-_ffdd ;};if _ffd +_ffdd > 8{_gfbe .Add1 (_cbfb );};};_agbf =_cbfb ;};};return _gfbe ;};func (_ebg *Context )Pop (){_gbf :=*_ebg ;_abef :=_ebg ._ffa ;_edc :=_abef [len (_abef )-1];*_ebg =*_edc ;_ebg ._ecc =_gbf ._ecc ;
_ebg ._fda =_gbf ._fda ;_ebg ._fff =_gbf ._fff ;_ebg ._bdd =_gbf ._bdd ;_ebg ._gc =_gbf ._gc ;};func (_ddgf *patternPainter )Paint (ss []_cee .Span ,done bool ){_gaeb :=_ddgf ._cbc .Bounds ();for _ ,_ebgd :=range ss {if _ebgd .Y < _gaeb .Min .Y {continue ;
};if _ebgd .Y >=_gaeb .Max .Y {return ;};if _ebgd .X0 < _gaeb .Min .X {_ebgd .X0 =_gaeb .Min .X ;};if _ebgd .X1 > _gaeb .Max .X {_ebgd .X1 =_gaeb .Max .X ;};if _ebgd .X0 >=_ebgd .X1 {continue ;};const _fbca =1<<16-1;_edca :=_ebgd .Y -_ddgf ._cbc .Rect .Min .Y ;
_ffdf :=_ebgd .X0 -_ddgf ._cbc .Rect .Min .X ;_gef :=(_ebgd .Y -_ddgf ._cbc .Rect .Min .Y )*_ddgf ._cbc .Stride +(_ebgd .X0 -_ddgf ._cbc .Rect .Min .X )*4;_bfdc :=_gef +(_ebgd .X1 -_ebgd .X0 )*4;for _bfe ,_ggcg :=_gef ,_ffdf ;_bfe < _bfdc ;_bfe ,_ggcg =_bfe +4,_ggcg +1{_gebf :=_ebgd .Alpha ;
if _ddgf ._cgcg !=nil {_gebf =_gebf *uint32 (_ddgf ._cgcg .AlphaAt (_ggcg ,_edca ).A )/255;if _gebf ==0{continue ;};};_bdbg :=_ddgf ._agc .ColorAt (_ggcg ,_edca );_adda ,_gfe ,_fbe ,_gaeg :=_bdbg .RGBA ();_ebdc :=uint32 (_ddgf ._cbc .Pix [_bfe +0]);_acgb :=uint32 (_ddgf ._cbc .Pix [_bfe +1]);
_agf :=uint32 (_ddgf ._cbc .Pix [_bfe +2]);_dbga :=uint32 (_ddgf ._cbc .Pix [_bfe +3]);_agcf :=(_fbca -(_gaeg *_gebf /_fbca ))*0x101;_ddgf ._cbc .Pix [_bfe +0]=uint8 ((_ebdc *_agcf +_adda *_gebf )/_fbca >>8);_ddgf ._cbc .Pix [_bfe +1]=uint8 ((_acgb *_agcf +_gfe *_gebf )/_fbca >>8);
_ddgf ._cbc .Pix [_bfe +2]=uint8 ((_agf *_agcf +_fbe *_gebf )/_fbca >>8);_ddgf ._cbc .Pix [_bfe +3]=uint8 ((_dbga *_agcf +_gaeg *_gebf )/_fbca >>8);};};};func _cd (_bg ,_ff ,_aa ,_fed ,_ea ,_aea float64 )[]_cc .Point {_eg :=(_ce .Hypot (_aa -_bg ,_fed -_ff )+_ce .Hypot (_ea -_aa ,_aea -_fed ));
_df :=int (_eg +0.5);if _df < 4{_df =4;};_aeac :=float64 (_df )-1;_gfb :=make ([]_cc .Point ,_df );for _fa :=0;_fa < _df ;_fa ++{_gfc :=float64 (_fa )/_aeac ;_ca ,_ege :=_fe (_bg ,_ff ,_aa ,_fed ,_ea ,_aea ,_gfc );_gfb [_fa ]=_cc .NewPoint (_ca ,_ege );
};return _gfb ;};func (_abe *Context )DrawImageAnchored (im _da .Image ,x ,y int ,ax ,ay float64 ){_dcbf :=im .Bounds ().Size ();x -=int (ax *float64 (_dcbf .X ));y -=int (ay *float64 (_dcbf .Y ));_fgdf :=_f .BiLinear ;_gdf :=_abe ._gfcd .Clone ().Translate (float64 (x ),float64 (y ));
_cabb :=_ab .Aff3 {_gdf [0],_gdf [3],_gdf [6],_gdf [1],_gdf [4],_gdf [7]};if _abe ._acb ==nil {_fgdf .Transform (_abe ._dfb ,_cabb ,im ,im .Bounds (),_f .Over ,nil );}else {_fgdf .Transform (_abe ._dfb ,_cabb ,im ,im .Bounds (),_f .Over ,&_f .Options {DstMask :_abe ._acb ,DstMaskP :_da .Point {}});
};};func _dcffa (_bfbe _e .Color )_ae .Pattern {return &solidPattern {_afb :_bfbe }};func (_cgg stops )Less (i ,j int )bool {return _cgg [i ]._edga < _cgg [j ]._edga };func _eaf (_acf ,_cac ,_cf ,_cfe ,_caa ,_db ,_dd ,_faa float64 )[]_cc .Point {_fbc :=(_ce .Hypot (_cf -_acf ,_cfe -_cac )+_ce .Hypot (_caa -_cf ,_db -_cfe )+_ce .Hypot (_dd -_caa ,_faa -_db ));
_ef :=int (_fbc +0.5);if _ef < 4{_ef =4;};_cbb :=float64 (_ef )-1;_fc :=make ([]_cc .Point ,_ef );for _aeg :=0;_aeg < _ef ;_aeg ++{_cfc :=float64 (_aeg )/_cbb ;_ceb ,_dde :=_gfg (_acf ,_cac ,_cf ,_cfe ,_caa ,_db ,_dd ,_faa ,_cfc );_fc [_aeg ]=_cc .NewPoint (_ceb ,_dde );
};return _fc ;};func _agdd (_ccc _cc .Point )_fd .Point26_6 {return _fd .Point26_6 {X :_efd (_ccc .X ),Y :_efd (_ccc .Y )}};func (_gab *Context )SetStrokeStyle (pattern _ae .Pattern ){_gab ._ed =pattern };func _aafe (_fgcb _fd .Int26_6 )float64 {const _afa ,_baa =6,1<<6-1;
if _fgcb >=0{return float64 (_fgcb >>_afa )+float64 (_fgcb &_baa )/64;};_fgcb =-_fgcb ;if _fgcb >=0{return -(float64 (_fgcb >>_afa )+float64 (_fgcb &_baa )/64);};return 0;};type stop struct{_edga float64 ;_dec _e .Color ;};func _dfgg (_fee float64 )float64 {return _fee *_ce .Pi /180};
func (_ddg *Context )Matrix ()_cc .Matrix {return _ddg ._gfcd };func (_bef *Context )ResetClip (){_bef ._acb =nil };func (_cacc *Context )StrokePattern ()_ae .Pattern {return _cacc ._ed };func (_agb *Context )MoveTo (x ,y float64 ){if _agb ._gc {_agb ._fda .Add1 (_agdd (_agb ._fff ));
};x ,y =_agb .Transform (x ,y );_fde :=_cc .NewPoint (x ,y );_dad :=_agdd (_fde );_agb ._ecc .Start (_dad );_agb ._fda .Start (_dad );_agb ._fff =_fde ;_agb ._bdd =_fde ;_agb ._gc =true ;};func NewContext (width ,height int )*Context {return NewContextForRGBA (_da .NewRGBA (_da .Rect (0,0,width ,height )));
};func _ebb (_cagb string )(_bgde ,_deea ,_gbb ,_ddabd int ){_cagb =_d .TrimPrefix (_cagb ,"\u0023");_ddabd =255;if len (_cagb )==3{_faga :="\u00251\u0078\u0025\u0031\u0078\u0025\u0031x";_b .Sscanf (_cagb ,_faga ,&_bgde ,&_deea ,&_gbb );_bgde |=_bgde <<4;
_deea |=_deea <<4;_gbb |=_gbb <<4;};if len (_cagb )==6{_bab :="\u0025\u0030\u0032x\u0025\u0030\u0032\u0078\u0025\u0030\u0032\u0078";_b .Sscanf (_cagb ,_bab ,&_bgde ,&_deea ,&_gbb );};if len (_cagb )==8{_dbdb :="\u0025\u00302\u0078\u0025\u00302\u0078\u0025\u0030\u0032\u0078\u0025\u0030\u0032\u0078";
_b .Sscanf (_cagb ,_dbdb ,&_bgde ,&_deea ,&_gbb ,&_ddabd );};return ;};func (_dfge *Context )fill (_dcd _cee .Painter ){_fdaa :=_dfge ._fda ;if _dfge ._gc {_fdaa =make (_cee .Path ,len (_dfge ._fda ));copy (_fdaa ,_dfge ._fda );_fdaa .Add1 (_agdd (_dfge ._fff ));
};_abcg :=_dfge ._gd ;_abcg .UseNonZeroWinding =_dfge ._cfg ==_ae .FillRuleWinding ;_abcg .Clear ();_abcg .AddPath (_fdaa );_abcg .Rasterize (_dcd );};func (_bcef *surfacePattern )ColorAt (x ,y int )_e .Color {_dffgc :=_bcef ._affg .Bounds ();switch _bcef ._cacg {case _eddb :if y >=_dffgc .Dy (){return _e .Transparent ;
};case _dgb :if x >=_dffgc .Dx (){return _e .Transparent ;};case _eacb :if x >=_dffgc .Dx ()||y >=_dffgc .Dy (){return _e .Transparent ;};};x =x %_dffgc .Dx ()+_dffgc .Min .X ;y =y %_dffgc .Dy ()+_dffgc .Min .Y ;return _bcef ._affg .At (x ,y );};func (_fffa *solidPattern )ColorAt (x ,y int )_e .Color {return _fffa ._afb };
func (_abcd *Context )Rotate (angle float64 ){_abcd ._gfcd =_abcd ._gfcd .Rotate (angle )};func (_gce *Context )SetHexColor (x string ){_cff ,_edf ,_dea ,_fbf :=_ebb (x );_gce .SetRGBA255 (_cff ,_edf ,_dea ,_fbf );};