mirror of
https://github.com/unidoc/unipdf.git
synced 2025-05-02 22:17:06 +08:00
108 lines
27 KiB
Go
108 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 (_cf "errors";_e "fmt";_b "github.com/unidoc/freetype/raster";_dd "github.com/unidoc/unipdf/v3/common";_fc "github.com/unidoc/unipdf/v3/internal/transform";_fe "github.com/unidoc/unipdf/v3/render/internal/context";_cg "golang.org/x/image/draw";
|
|
_dg "golang.org/x/image/font";_fg "golang.org/x/image/math/f64";_ec "golang.org/x/image/math/fixed";_de "image";_g "image/color";_gg "image/draw";_c "math";_d "sort";_f "strings";);func (_ccga *Context )DrawEllipse (x ,y ,rx ,ry float64 ){_ccga .NewSubPath ();
|
|
_ccga .DrawEllipticalArc (x ,y ,rx ,ry ,0,2*_c .Pi );_ccga .ClosePath ();};type Context struct{_aba int ;_bgf int ;_cgd *_b .Rasterizer ;_df *_de .RGBA ;_bbe *_de .Alpha ;_ddd _g .Color ;_aed _fe .Pattern ;_dde _fe .Pattern ;_cedb _b .Path ;_cb _b .Path ;
|
|
_bbb _fc .Point ;_dgd _fc .Point ;_ba bool ;_af []float64 ;_fed float64 ;_cga float64 ;_cfbg _fe .LineCap ;_dgf _fe .LineJoin ;_ad _fe .FillRule ;_ddde _fc .Matrix ;_dfc _fe .TextState ;_dcd []*Context ;};func (_eda *Context )TextState ()*_fe .TextState {return &_eda ._dfc };
|
|
func (_afb *Context )Translate (x ,y float64 ){_afb ._ddde =_afb ._ddde .Translate (x ,y )};func NewContext (width ,height int )*Context {return NewContextForRGBA (_de .NewRGBA (_de .Rect (0,0,width ,height )));};func (_fdbf stops )Less (i ,j int )bool {return _fdbf [i ]._eef < _fdbf [j ]._eef };
|
|
func (_ded *Context )setFillAndStrokeColor (_ee _g .Color ){_ded ._ddd =_ee ;_ded ._aed =_agag (_ee );_ded ._dde =_agag (_ee );};func (_bgg stops )Len ()int {return len (_bgg )};func (_gbc *Context )DrawStringAnchored (s string ,face _dg .Face ,x ,y ,ax ,ay float64 ){_gbgg ,_dafc :=_gbc .MeasureString (s ,face );
|
|
_gbc .drawString (s ,face ,x -ax *_gbgg ,y +ay *_dafc );};func (_cbd *Context )ClearPath (){_cbd ._cedb .Clear ();_cbd ._cb .Clear ();_cbd ._ba =false };func (_gaf *Context )Clip (){_gaf .ClipPreserve ();_gaf .ClearPath ()};func (_cggb *Context )DrawLine (x1 ,y1 ,x2 ,y2 float64 ){_cggb .MoveTo (x1 ,y1 );
|
|
_cggb .LineTo (x2 ,y2 )};func _fgd (_eefg [][]_fc .Point )_b .Path {var _ceb _b .Path ;for _ ,_gfg :=range _eefg {var _cdbe _ec .Point26_6 ;for _bdfb ,_ggfd :=range _gfg {_fab :=_gfc (_ggfd );if _bdfb ==0{_ceb .Start (_fab );}else {_fgfc :=_fab .X -_cdbe .X ;
|
|
_ddee :=_fab .Y -_cdbe .Y ;if _fgfc < 0{_fgfc =-_fgfc ;};if _ddee < 0{_ddee =-_ddee ;};if _fgfc +_ddee > 8{_ceb .Add1 (_fab );};};_cdbe =_fab ;};};return _ceb ;};func (_cd *Context )SetDashOffset (offset float64 ){_cd ._fed =offset };func (_fff *Context )SetFillRGBA (r ,g ,b ,a float64 ){_adfb :=_g .NRGBA {uint8 (r *255),uint8 (g *255),uint8 (b *255),uint8 (a *255)};
|
|
_fff ._ddd =_adfb ;_fff ._aed =_agag (_adfb );};func (_ecd *Context )DrawImage (im _de .Image ,x ,y int ){_ecd .DrawImageAnchored (im ,x ,y ,0,0)};var (_ace =_agag (_g .White );_fd =_agag (_g .Black ););func (_fgaa *Context )ClipPreserve (){_bac :=_de .NewAlpha (_de .Rect (0,0,_fgaa ._aba ,_fgaa ._bgf ));
|
|
_fae :=_b .NewAlphaOverPainter (_bac );_fgaa .fill (_fae );if _fgaa ._bbe ==nil {_fgaa ._bbe =_bac ;}else {_cgg :=_de .NewAlpha (_de .Rect (0,0,_fgaa ._aba ,_fgaa ._bgf ));_cg .DrawMask (_cgg ,_cgg .Bounds (),_bac ,_de .Point {},_fgaa ._bbe ,_de .Point {},_cg .Over );
|
|
_fgaa ._bbe =_cgg ;};};func (_ffb *Context )SetRGBA (r ,g ,b ,a float64 ){_ffb ._ddd =_g .NRGBA {uint8 (r *255),uint8 (g *255),uint8 (b *255),uint8 (a *255)};_ffb .setFillAndStrokeColor (_ffb ._ddd );};func (_bef *Context )SetPixel (x ,y int ){_bef ._df .Set (x ,y ,_bef ._ddd )};
|
|
func (_gdc *Context )DrawRectangle (x ,y ,w ,h float64 ){_gdc .NewSubPath ();_gdc .MoveTo (x ,y );_gdc .LineTo (x +w ,y );_gdc .LineTo (x +w ,y +h );_gdc .LineTo (x ,y +h );_gdc .ClosePath ();};func _cccd (_cgdg *_de .RGBA ,_cdf *_de .Alpha ,_dfcb _fe .Pattern )*patternPainter {return &patternPainter {_cgdg ,_cdf ,_dfcb };
|
|
};func _add (_accg ,_bdfd ,_dda ,_aad ,_cbfb ,_caad float64 )float64 {return _accg *_aad +_bdfd *_cbfb +_dda *_caad ;};func (_gbf *Context )QuadraticTo (x1 ,y1 ,x2 ,y2 float64 ){if !_gbf ._ba {_gbf .MoveTo (x1 ,y1 );};x1 ,y1 =_gbf .Transform (x1 ,y1 );
|
|
x2 ,y2 =_gbf .Transform (x2 ,y2 );_cbe :=_fc .NewPoint (x1 ,y1 );_egb :=_fc .NewPoint (x2 ,y2 );_fceb :=_gfc (_cbe );_ccgd :=_gfc (_egb );_gbf ._cedb .Add2 (_fceb ,_ccgd );_gbf ._cb .Add2 (_fceb ,_ccgd );_gbf ._dgd =_egb ;};func (_ega *Context )Image ()_de .Image {return _ega ._df };
|
|
type patternPainter struct{_bffbg *_de .RGBA ;_fgge *_de .Alpha ;_eea _fe .Pattern ;};func (_aee *linearGradient )ColorAt (x ,y int )_g .Color {if len (_aee ._bgdd )==0{return _g .Transparent ;};_gbe ,_eceg :=float64 (x ),float64 (y );_bbaa ,_eee ,_dddb ,_fcc :=_aee ._bdag ,_aee ._gfa ,_aee ._gfad ,_aee ._bgd ;
|
|
_efaa ,_cdd :=_dddb -_bbaa ,_fcc -_eee ;if _cdd ==0&&_efaa !=0{return _bge ((_gbe -_bbaa )/_efaa ,_aee ._bgdd );};if _efaa ==0&&_cdd !=0{return _bge ((_eceg -_eee )/_cdd ,_aee ._bgdd );};_befb :=_efaa *(_gbe -_bbaa )+_cdd *(_eceg -_eee );if _befb < 0{return _aee ._bgdd [0]._fcb ;
|
|
};_feab :=_c .Hypot (_efaa ,_cdd );_fdf :=((_gbe -_bbaa )*-_cdd +(_eceg -_eee )*_efaa )/(_feab *_feab );_edca ,_ffd :=_bbaa +_fdf *-_cdd ,_eee +_fdf *_efaa ;_dege :=_c .Hypot (_gbe -_edca ,_eceg -_ffd )/_feab ;return _bge (_dege ,_aee ._bgdd );};func (_ccg *Context )SetRGB (r ,g ,b float64 ){_ccg .SetRGBA (r ,g ,b ,1)};
|
|
func (_aef *Context )DrawCircle (x ,y ,r float64 ){_aef .NewSubPath ();_aef .DrawEllipticalArc (x ,y ,r ,r ,0,2*_c .Pi );_aef .ClosePath ();};func (_gee *Context )Pop (){_fbeg :=*_gee ;_aebd :=_gee ._dcd ;_dff :=_aebd [len (_aebd )-1];*_gee =*_dff ;_gee ._cedb =_fbeg ._cedb ;
|
|
_gee ._cb =_fbeg ._cb ;_gee ._bbb =_fbeg ._bbb ;_gee ._dgd =_fbeg ._dgd ;_gee ._ba =_fbeg ._ba ;};func _gfc (_bbbc _fc .Point )_ec .Point26_6 {return _ec .Point26_6 {X :_ecbe (_bbbc .X ),Y :_ecbe (_bbbc .Y )}};func (_cgcc *radialGradient )ColorAt (x ,y int )_g .Color {if len (_cgcc ._dbgg )==0{return _g .Transparent ;
|
|
};_dcda ,_fccg :=float64 (x )+0.5-_cgcc ._fgcf ._eaeg ,float64 (y )+0.5-_cgcc ._fgcf ._dcf ;_adfe :=_add (_dcda ,_fccg ,_cgcc ._fgcf ._cdbb ,_cgcc ._daa ._eaeg ,_cgcc ._daa ._dcf ,_cgcc ._daa ._cdbb );_bgge :=_add (_dcda ,_fccg ,-_cgcc ._fgcf ._cdbb ,_dcda ,_fccg ,_cgcc ._fgcf ._cdbb );
|
|
if _cgcc ._dbcc ==0{if _adfe ==0{return _g .Transparent ;};_dac :=0.5*_bgge /_adfe ;if _dac *_cgcc ._daa ._cdbb >=_cgcc ._acf {return _bge (_dac ,_cgcc ._dbgg );};return _g .Transparent ;};_dcfd :=_add (_adfe ,_cgcc ._dbcc ,0,_adfe ,-_bgge ,0);if _dcfd >=0{_bbef :=_c .Sqrt (_dcfd );
|
|
_ccag :=(_adfe +_bbef )*_cgcc ._ecb ;_dedb :=(_adfe -_bbef )*_cgcc ._ecb ;if _ccag *_cgcc ._daa ._cdbb >=_cgcc ._acf {return _bge (_ccag ,_cgcc ._dbgg );}else if _dedb *_cgcc ._daa ._cdbb >=_cgcc ._acf {return _bge (_dedb ,_cgcc ._dbgg );};};return _g .Transparent ;
|
|
};func (_dbc *Context )DrawArc (x ,y ,r ,angle1 ,angle2 float64 ){_dbc .DrawEllipticalArc (x ,y ,r ,r ,angle1 ,angle2 );};type circle struct{_eaeg ,_dcf ,_cdbb float64 };func (_fegf *Context )Push (){_egd :=*_fegf ;_fegf ._dcd =append (_fegf ._dcd ,&_egd )};
|
|
type linearGradient struct{_bdag ,_gfa ,_gfad ,_bgd float64 ;_bgdd stops ;};func (_acg *Context )SetRGBA255 (r ,g ,b ,a int ){_acg ._ddd =_g .NRGBA {uint8 (r ),uint8 (g ),uint8 (b ),uint8 (a )};_acg .setFillAndStrokeColor (_acg ._ddd );};func _bge (_ccd float64 ,_fca stops )_g .Color {if _ccd <=0.0||len (_fca )==1{return _fca [0]._fcb ;
|
|
};_dbce :=_fca [len (_fca )-1];if _ccd >=_dbce ._eef {return _dbce ._fcb ;};for _aeeg ,_bfgea :=range _fca [1:]{if _ccd < _bfgea ._eef {_ccd =(_ccd -_fca [_aeeg ]._eef )/(_bfgea ._eef -_fca [_aeeg ]._eef );return _ffdg (_fca [_aeeg ]._fcb ,_bfgea ._fcb ,_ccd );
|
|
};};return _dbce ._fcb ;};func (_cgga *Context )SetMatrix (m _fc .Matrix ){_cgga ._ddde =m };func (_efc *Context )ShearAbout (sx ,sy ,x ,y float64 ){_efc .Translate (x ,y );_efc .Shear (sx ,sy );_efc .Translate (-x ,-y );};func (_dgec *Context )StrokePreserve (){var _edce _b .Painter ;
|
|
if _dgec ._bbe ==nil {if _dcdf ,_aeg :=_dgec ._dde .(*solidPattern );_aeg {_fefc :=_b .NewRGBAPainter (_dgec ._df );_fefc .SetColor (_dcdf ._efaad );_edce =_fefc ;};};if _edce ==nil {_edce =_cccd (_dgec ._df ,_dgec ._bbe ,_dgec ._dde );};_dgec .stroke (_edce );
|
|
};func (_cdg *Context )Transform (x ,y float64 )(_dafd ,_bfec float64 ){return _cdg ._ddde .Transform (x ,y );};func (_agf *Context )SetRGB255 (r ,g ,b int ){_agf .SetRGBA255 (r ,g ,b ,255)};func (_fea *Context )InvertMask (){if _fea ._bbe ==nil {_fea ._bbe =_de .NewAlpha (_fea ._df .Bounds ());
|
|
}else {for _bfg ,_ecf :=range _fea ._bbe .Pix {_fea ._bbe .Pix [_bfg ]=255-_ecf ;};};};func _ecbe (_egc float64 )_ec .Int26_6 {return _ec .Int26_6 (_egc *64)};func _cedbb (_fadfc _de .Image )*_de .RGBA {_fbc :=_fadfc .Bounds ();_ccgag :=_de .NewRGBA (_fbc );
|
|
_gg .Draw (_ccgag ,_fbc ,_fadfc ,_fbc .Min ,_gg .Src );return _ccgag ;};func _cedf (_ccdc float64 )float64 {return _ccdc *_c .Pi /180};func (_dddc *Context )Clear (){_gff :=_de .NewUniform (_dddc ._ddd );_cg .Draw (_dddc ._df ,_dddc ._df .Bounds (),_gff ,_de .Point {},_cg .Src );
|
|
};func (_ebae *Context )Identity (){_ebae ._ddde =_fc .IdentityMatrix ()};func (_bbcc *Context )ResetClip (){_bbcc ._bbe =nil };func (_aeac *Context )DrawPoint (x ,y ,r float64 ){_aeac .Push ();_bfe ,_dfg :=_aeac .Transform (x ,y );_aeac .Identity ();_aeac .DrawCircle (_bfe ,_dfg ,r );
|
|
_aeac .Pop ();};func _acd (_gegc ,_adcb uint32 ,_bagd float64 )uint8 {return uint8 (int32 (float64 (_gegc )*(1.0-_bagd )+float64 (_adcb )*_bagd )>>8);};func _egbe (_gbb _b .Path )[][]_fc .Point {var _aeag [][]_fc .Point ;var _dfaba []_fc .Point ;var _dbe ,_fgf float64 ;
|
|
for _ecfd :=0;_ecfd < len (_gbb );{switch _gbb [_ecfd ]{case 0:if len (_dfaba )> 0{_aeag =append (_aeag ,_dfaba );_dfaba =nil ;};_accf :=_eede (_gbb [_ecfd +1]);_baf :=_eede (_gbb [_ecfd +2]);_dfaba =append (_dfaba ,_fc .NewPoint (_accf ,_baf ));_dbe ,_fgf =_accf ,_baf ;
|
|
_ecfd +=4;case 1:_bfgg :=_eede (_gbb [_ecfd +1]);_dbdf :=_eede (_gbb [_ecfd +2]);_dfaba =append (_dfaba ,_fc .NewPoint (_bfgg ,_dbdf ));_dbe ,_fgf =_bfgg ,_dbdf ;_ecfd +=4;case 2:_cegb :=_eede (_gbb [_ecfd +1]);_adcc :=_eede (_gbb [_ecfd +2]);_gag :=_eede (_gbb [_ecfd +3]);
|
|
_gcf :=_eede (_gbb [_ecfd +4]);_eega :=_gca (_dbe ,_fgf ,_cegb ,_adcc ,_gag ,_gcf );_dfaba =append (_dfaba ,_eega ...);_dbe ,_fgf =_gag ,_gcf ;_ecfd +=6;case 3:_gaec :=_eede (_gbb [_ecfd +1]);_adge :=_eede (_gbb [_ecfd +2]);_fdg :=_eede (_gbb [_ecfd +3]);
|
|
_gdd :=_eede (_gbb [_ecfd +4]);_dfb :=_eede (_gbb [_ecfd +5]);_ege :=_eede (_gbb [_ecfd +6]);_dba :=_fb (_dbe ,_fgf ,_gaec ,_adge ,_fdg ,_gdd ,_dfb ,_ege );_dfaba =append (_dfaba ,_dba ...);_dbe ,_fgf =_dfb ,_ege ;_ecfd +=8;default:_dd .Log .Debug ("\u0057\u0041\u0052\u004e: \u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0070\u0061\u0074\u0068\u003a\u0020%\u0076",_gbb );
|
|
return _aeag ;};};if len (_dfaba )> 0{_aeag =append (_aeag ,_dfaba );};return _aeag ;};func _eb (_cfb ,_ff ,_ab ,_ca ,_ae ,_fa ,_gc float64 )(_aa ,_db float64 ){_cc :=1-_gc ;_cad :=_cc *_cc ;_bg :=2*_cc *_gc ;_fcg :=_gc *_gc ;_aa =_cad *_cfb +_bg *_ab +_fcg *_ae ;
|
|
_db =_cad *_ff +_bg *_ca +_fcg *_fa ;return ;};func (_adgb *surfacePattern )ColorAt (x ,y int )_g .Color {_bcf :=_adgb ._gad .Bounds ();switch _adgb ._gebb {case _dagb :if y >=_bcf .Dy (){return _g .Transparent ;};case _cfd :if x >=_bcf .Dx (){return _g .Transparent ;
|
|
};case _gcgc :if x >=_bcf .Dx ()||y >=_bcf .Dy (){return _g .Transparent ;};};x =x %_bcf .Dx ()+_bcf .Min .X ;y =y %_bcf .Dy ()+_bcf .Min .Y ;return _adgb ._gad .At (x ,y );};func (_bag *Context )Width ()int {return _bag ._aba };func NewContextForRGBA (im *_de .RGBA )*Context {_eg :=im .Bounds ().Size ().X ;
|
|
_adf :=im .Bounds ().Size ().Y ;return &Context {_aba :_eg ,_bgf :_adf ,_cgd :_b .NewRasterizer (_eg ,_adf ),_df :im ,_ddd :_g .Transparent ,_aed :_ace ,_dde :_fd ,_cga :1,_ad :_fe .FillRuleWinding ,_ddde :_fc .IdentityMatrix (),_dfc :_fe .NewTextState ()};
|
|
};func (_fadf *Context )SetColor (c _g .Color ){_fadf .setFillAndStrokeColor (c )};func _gca (_cca ,_ef ,_dge ,_ag ,_da ,_be float64 )[]_fc .Point {_fga :=(_c .Hypot (_dge -_cca ,_ag -_ef )+_c .Hypot (_da -_dge ,_be -_ag ));_bgc :=int (_fga +0.5);if _bgc < 4{_bgc =4;
|
|
};_fef :=float64 (_bgc )-1;_aec :=make ([]_fc .Point ,_bgc );for _ea :=0;_ea < _bgc ;_ea ++{_fgad :=float64 (_ea )/_fef ;_ccb ,_bb :=_eb (_cca ,_ef ,_dge ,_ag ,_da ,_be ,_fgad );_aec [_ea ]=_fc .NewPoint (_ccb ,_bb );};return _aec ;};func _ffdg (_fdfa ,_agfb _g .Color ,_faeb float64 )_g .Color {_afaf ,_cgcd ,_aefe ,_bca :=_fdfa .RGBA ();
|
|
_ffa ,_adfd ,_ggc ,_bfd :=_agfb .RGBA ();return _g .RGBA {_acd (_afaf ,_ffa ,_faeb ),_acd (_cgcd ,_adfd ,_faeb ),_acd (_aefe ,_ggc ,_faeb ),_acd (_bca ,_bfd ,_faeb )};};func _ada (_dbcg string )(_acff ,_ggfa ,_ffg ,_ceba int ){_dbcg =_f .TrimPrefix (_dbcg ,"\u0023");
|
|
_ceba =255;if len (_dbcg )==3{_fcefb :="\u00251\u0078\u0025\u0031\u0078\u0025\u0031x";_e .Sscanf (_dbcg ,_fcefb ,&_acff ,&_ggfa ,&_ffg );_acff |=_acff <<4;_ggfa |=_ggfa <<4;_ffg |=_ffg <<4;};if len (_dbcg )==6{_afba :="\u0025\u0030\u0032x\u0025\u0030\u0032\u0078\u0025\u0030\u0032\u0078";
|
|
_e .Sscanf (_dbcg ,_afba ,&_acff ,&_ggfa ,&_ffg );};if len (_dbcg )==8{_eec :="\u0025\u00302\u0078\u0025\u00302\u0078\u0025\u0030\u0032\u0078\u0025\u0030\u0032\u0078";_e .Sscanf (_dbcg ,_eec ,&_acff ,&_ggfa ,&_ffg ,&_ceba );};return ;};func (_dcc *Context )SetHexColor (x string ){_gcae ,_faf ,_gcb ,_abe :=_ada (x );
|
|
_dcc .SetRGBA255 (_gcae ,_faf ,_gcb ,_abe );};func (_ece *Context )LineTo (x ,y float64 ){if !_ece ._ba {_ece .MoveTo (x ,y );}else {x ,y =_ece .Transform (x ,y );_ed :=_fc .NewPoint (x ,y );_gbg :=_gfc (_ed );_ece ._cedb .Add1 (_gbg );_ece ._cb .Add1 (_gbg );
|
|
_ece ._dgd =_ed ;};};func (_eba *Context )Fill (){_eba .FillPreserve ();_eba .ClearPath ()};type surfacePattern struct{_gad _de .Image ;_gebb repeatOp ;};func (_bdfa *Context )DrawEllipticalArc (x ,y ,rx ,ry ,angle1 ,angle2 float64 ){const _debd =16;for _dfab :=0;
|
|
_dfab < _debd ;_dfab ++{_cbg :=float64 (_dfab +0)/_debd ;_ffbf :=float64 (_dfab +1)/_debd ;_cgc :=angle1 +(angle2 -angle1 )*_cbg ;_bdcg :=angle1 +(angle2 -angle1 )*_ffbf ;_dbcb :=x +rx *_c .Cos (_cgc );_bee :=y +ry *_c .Sin (_cgc );_gac :=x +rx *_c .Cos ((_cgc +_bdcg )/2);
|
|
_dab :=y +ry *_c .Sin ((_cgc +_bdcg )/2);_ecec :=x +rx *_c .Cos (_bdcg );_agd :=y +ry *_c .Sin (_bdcg );_aae :=2*_gac -_dbcb /2-_ecec /2;_fbd :=2*_dab -_bee /2-_agd /2;if _dfab ==0{if _bdfa ._ba {_bdfa .LineTo (_dbcb ,_bee );}else {_bdfa .MoveTo (_dbcb ,_bee );
|
|
};};_bdfa .QuadraticTo (_aae ,_fbd ,_ecec ,_agd );};};func (_bcb *Context )RotateAbout (angle ,x ,y float64 ){_bcb .Translate (x ,y );_bcb .Rotate (angle );_bcb .Translate (-x ,-y );};func (_ccae *Context )ScaleAbout (sx ,sy ,x ,y float64 ){_ccae .Translate (x ,y );
|
|
_ccae .Scale (sx ,sy );_ccae .Translate (-x ,-y );};func (_acge *Context )CubicTo (x1 ,y1 ,x2 ,y2 ,x3 ,y3 float64 ){if !_acge ._ba {_acge .MoveTo (x1 ,y1 );};_adg ,_aab :=_acge ._dgd .X ,_acge ._dgd .Y ;x1 ,y1 =_acge .Transform (x1 ,y1 );x2 ,y2 =_acge .Transform (x2 ,y2 );
|
|
x3 ,y3 =_acge .Transform (x3 ,y3 );_aea :=_fb (_adg ,_aab ,x1 ,y1 ,x2 ,y2 ,x3 ,y3 );_fggf :=_gfc (_acge ._dgd );for _ ,_deb :=range _aea [1:]{_ebd :=_gfc (_deb );if _ebd ==_fggf {continue ;};_fggf =_ebd ;_acge ._cedb .Add1 (_ebd );_acge ._cb .Add1 (_ebd );
|
|
_acge ._dgd =_deb ;};};func _aga (_cba ,_adb ,_edg ,_aaegb ,_fbb ,_dbb float64 )_fe .Gradient {_beeg :=circle {_cba ,_adb ,_edg };_decc :=circle {_aaegb ,_fbb ,_dbb };_dad :=circle {_aaegb -_cba ,_fbb -_adb ,_dbb -_edg };_gcg :=_add (_dad ._eaeg ,_dad ._dcf ,-_dad ._cdbb ,_dad ._eaeg ,_dad ._dcf ,_dad ._cdbb );
|
|
var _cge float64 ;if _gcg !=0{_cge =1.0/_gcg ;};_agad :=-_beeg ._cdbb ;_eegb :=&radialGradient {_fgcf :_beeg ,_dag :_decc ,_daa :_dad ,_dbcc :_gcg ,_ecb :_cge ,_acf :_agad };return _eegb ;};func (_cde *solidPattern )ColorAt (x ,y int )_g .Color {return _cde ._efaad };
|
|
func (_dce *Context )SetLineJoin (lineJoin _fe .LineJoin ){_dce ._dgf =lineJoin };func (_aabee *linearGradient )AddColorStop (offset float64 ,color _g .Color ){_aabee ._bgdd =append (_aabee ._bgdd ,stop {_eef :offset ,_fcb :color });_d .Sort (_aabee ._bgdd );
|
|
};func (_bff *Context )SetLineCap (lineCap _fe .LineCap ){_bff ._cfbg =lineCap };func (_gga *Context )ClosePath (){if _gga ._ba {_afa :=_gfc (_gga ._bbb );_gga ._cedb .Add1 (_afa );_gga ._cb .Add1 (_afa );_gga ._dgd =_gga ._bbb ;};};func _ebc (_baa _de .Image ,_eaa repeatOp )_fe .Pattern {return &surfacePattern {_gad :_baa ,_gebb :_eaa }};
|
|
func _aegg (_bacf ,_fdbfe ,_gde ,_bcd float64 )_fe .Gradient {_caaf :=&linearGradient {_bdag :_bacf ,_gfa :_fdbfe ,_gfad :_gde ,_bgd :_bcd };return _caaf ;};func (_efa *Context )LineWidth ()float64 {return _efa ._cga };func (_bdf *Context )StrokePattern ()_fe .Pattern {return _bdf ._dde };
|
|
func (_beb *Context )drawString (_gafg string ,_bda _dg .Face ,_aaf ,_bccg float64 ){_cede :=&_dg .Drawer {Src :_de .NewUniform (_beb ._ddd ),Face :_bda ,Dot :_gfc (_fc .NewPoint (_aaf ,_bccg ))};_bbd :=rune (-1);for _ ,_fde :=range _gafg {if _bbd >=0{_cede .Dot .X +=_cede .Face .Kern (_bbd ,_fde );
|
|
};_bfcc ,_fdcd ,_ccbb ,_gcbd ,_edceb :=_cede .Face .Glyph (_cede .Dot ,_fde );if !_edceb {continue ;};_bfa :=_bfcc .Sub (_bfcc .Min );_decf :=_de .NewRGBA (_bfa );_cg .DrawMask (_decf ,_bfa ,_cede .Src ,_de .Point {},_fdcd ,_ccbb ,_cg .Over );var _ddfc *_cg .Options ;
|
|
if _beb ._bbe !=nil {_ddfc =&_cg .Options {DstMask :_beb ._bbe ,DstMaskP :_de .Point {}};};_gda :=_beb ._ddde .Clone ().Translate (float64 (_bfcc .Min .X ),float64 (_bfcc .Min .Y ));_ffbfa :=_fg .Aff3 {_gda [0],_gda [3],_gda [6],_gda [1],_gda [4],_gda [7]};
|
|
_cg .BiLinear .Transform (_beb ._df ,_ffbfa ,_decf ,_bfa ,_cg .Over ,_ddfc );_cede .Dot .X +=_gcbd ;_bbd =_fde ;};};func (_gcc *Context )NewSubPath (){if _gcc ._ba {_gcc ._cb .Add1 (_gfc (_gcc ._bbb ));};_gcc ._ba =false ;};func (_gef *radialGradient )AddColorStop (offset float64 ,color _g .Color ){_gef ._dbgg =append (_gef ._dbgg ,stop {_eef :offset ,_fcb :color });
|
|
_d .Sort (_gef ._dbgg );};func (_ebe *Context )SetDash (dashes ...float64 ){_ebe ._af =dashes };func (_ggd *Context )drawRegularPolygon (_geg int ,_fdd ,_bae ,_ddg ,_gegd float64 ){_fda :=2*_c .Pi /float64 (_geg );_gegd -=_c .Pi /2;if _geg %2==0{_gegd +=_fda /2;
|
|
};_ggd .NewSubPath ();for _gfe :=0;_gfe < _geg ;_gfe ++{_eed :=_gegd +_fda *float64 (_gfe );_ggd .LineTo (_fdd +_ddg *_c .Cos (_eed ),_bae +_ddg *_c .Sin (_eed ));};_ggd .ClosePath ();};func (_fbf *Context )capper ()_b .Capper {switch _fbf ._cfbg {case _fe .LineCapButt :return _b .ButtCapper ;
|
|
case _fe .LineCapRound :return _b .RoundCapper ;case _fe .LineCapSquare :return _b .SquareCapper ;};return nil ;};func (_fgb *Context )SetStrokeRGBA (r ,g ,b ,a float64 ){_bccc :=_g .NRGBA {uint8 (r *255),uint8 (g *255),uint8 (b *255),uint8 (a *255)};_fgb ._dde =_agag (_bccc );
|
|
};func (_gge *Context )MoveTo (x ,y float64 ){if _gge ._ba {_gge ._cb .Add1 (_gfc (_gge ._bbb ));};x ,y =_gge .Transform (x ,y );_adc :=_fc .NewPoint (x ,y );_faa :=_gfc (_adc );_gge ._cedb .Start (_faa );_gge ._cb .Start (_faa );_gge ._bbb =_adc ;_gge ._dgd =_adc ;
|
|
_gge ._ba =true ;};func _agag (_fdcc _g .Color )_fe .Pattern {return &solidPattern {_efaad :_fdcc }};func _agb (_fffe [][]_fc .Point ,_eaeb []float64 ,_caee float64 )[][]_fc .Point {var _aeba [][]_fc .Point ;if len (_eaeb )==0{return _fffe ;};if len (_eaeb )==1{_eaeb =append (_eaeb ,_eaeb [0]);
|
|
};for _ ,_ddfg :=range _fffe {if len (_ddfg )< 2{continue ;};_bbbd :=_ddfg [0];_dadb :=1;_aabb :=0;_ebde :=0.0;if _caee !=0{var _cfg float64 ;for _ ,_gfb :=range _eaeb {_cfg +=_gfb ;};_caee =_c .Mod (_caee ,_cfg );if _caee < 0{_caee +=_cfg ;};for _ecdf ,_bffb :=range _eaeb {_caee -=_bffb ;
|
|
if _caee < 0{_aabb =_ecdf ;_ebde =_bffb +_caee ;break ;};};};var _gega []_fc .Point ;_gega =append (_gega ,_bbbd );for _dadb < len (_ddfg ){_fcge :=_eaeb [_aabb ];_bab :=_ddfg [_dadb ];_egg :=_bbbd .Distance (_bab );_ggde :=_fcge -_ebde ;if _egg > _ggde {_abb :=_ggde /_egg ;
|
|
_bbce :=_bbbd .Interpolate (_bab ,_abb );_gega =append (_gega ,_bbce );if _aabb %2==0&&len (_gega )> 1{_aeba =append (_aeba ,_gega );};_gega =nil ;_gega =append (_gega ,_bbce );_ebde =0;_bbbd =_bbce ;_aabb =(_aabb +1)%len (_eaeb );}else {_gega =append (_gega ,_bab );
|
|
_bbbd =_bab ;_ebde +=_egg ;_dadb ++;};};if _aabb %2==0&&len (_gega )> 1{_aeba =append (_aeba ,_gega );};};return _aeba ;};func (_cbf *Context )SetFillStyle (pattern _fe .Pattern ){if _eeg ,_fdc :=pattern .(*solidPattern );_fdc {_cbf ._ddd =_eeg ._efaad ;
|
|
};_cbf ._aed =pattern ;};func (_age *Context )Shear (x ,y float64 ){_age ._ddde .Shear (x ,y )};func (_gaa *Context )FillPreserve (){var _daf _b .Painter ;if _gaa ._bbe ==nil {if _def ,_fdb :=_gaa ._aed .(*solidPattern );_fdb {_eae :=_b .NewRGBAPainter (_gaa ._df );
|
|
_eae .SetColor (_def ._efaad );_daf =_eae ;};};if _daf ==nil {_daf =_cccd (_gaa ._df ,_gaa ._bbe ,_gaa ._aed );};_gaa .fill (_daf );};func _cbb (_fcef _b .Path ,_bdd []float64 ,_cefd float64 )_b .Path {return _fgd (_agb (_egbe (_fcef ),_bdd ,_cefd ));};
|
|
type repeatOp int ;func (_fac *Context )Rotate (angle float64 ){_fac ._ddde =_fac ._ddde .Rotate (angle )};func (_aebc *Context )DrawRoundedRectangle (x ,y ,w ,h ,r float64 ){_cab ,_cda ,_gaab ,_dec :=x ,x +r ,x +w -r ,x +w ;_eff ,_gccb ,_geb ,_dfa :=y ,y +r ,y +h -r ,y +h ;
|
|
_aebc .NewSubPath ();_aebc .MoveTo (_cda ,_eff );_aebc .LineTo (_gaab ,_eff );_aebc .DrawArc (_gaab ,_gccb ,r ,_cedf (270),_cedf (360));_aebc .LineTo (_dec ,_geb );_aebc .DrawArc (_gaab ,_geb ,r ,_cedf (0),_cedf (90));_aebc .LineTo (_cda ,_dfa );_aebc .DrawArc (_cda ,_geb ,r ,_cedf (90),_cedf (180));
|
|
_aebc .LineTo (_cab ,_gccb );_aebc .DrawArc (_cda ,_gccb ,r ,_cedf (180),_cedf (270));_aebc .ClosePath ();};func _eede (_bbg _ec .Int26_6 )float64 {const _gcgd ,_ddab =6,1<<6-1;if _bbg >=0{return float64 (_bbg >>_gcgd )+float64 (_bbg &_ddab )/64;};_bbg =-_bbg ;
|
|
if _bbg >=0{return -(float64 (_bbg >>_gcgd )+float64 (_bbg &_ddab )/64);};return 0;};func (_dabb *Context )MeasureString (s string ,face _dg .Face )(_gccc ,_aceg float64 ){_egad :=&_dg .Drawer {Face :face };_feg :=_egad .MeasureString (s );return float64 (_feg >>6),_dabb ._dfc .Tf .Size ;
|
|
};func (_edc *Context )fill (_bba _b .Painter ){_gdg :=_edc ._cb ;if _edc ._ba {_gdg =make (_b .Path ,len (_edc ._cb ));copy (_gdg ,_edc ._cb );_gdg .Add1 (_gfc (_edc ._bbb ));};_aeb :=_edc ._cgd ;_aeb .UseNonZeroWinding =_edc ._ad ==_fe .FillRuleWinding ;
|
|
_aeb .Clear ();_aeb .AddPath (_gdg );_aeb .Rasterize (_bba );};func NewContextForImage (im _de .Image )*Context {return NewContextForRGBA (_cedbb (im ))};func (_cff *Context )Stroke (){_cff .StrokePreserve ();_cff .ClearPath ()};func (_acc *Context )AsMask ()*_de .Alpha {_bfc :=_de .NewAlpha (_acc ._df .Bounds ());
|
|
_cg .Draw (_bfc ,_acc ._df .Bounds (),_acc ._df ,_de .Point {},_cg .Src );return _bfc ;};func (_ge *Context )SetStrokeStyle (pattern _fe .Pattern ){_ge ._dde =pattern };func (_ccaa *Context )SetFillRule (fillRule _fe .FillRule ){_ccaa ._ad =fillRule };
|
|
func (_ceg *Context )DrawImageAnchored (im _de .Image ,x ,y int ,ax ,ay float64 ){_bfge :=im .Bounds ().Size ();x -=int (ax *float64 (_bfge .X ));y -=int (ay *float64 (_bfge .Y ));_caga :=_cg .BiLinear ;_aaeg :=_ceg ._ddde .Clone ().Translate (float64 (x ),float64 (y ));
|
|
_agdc :=_fg .Aff3 {_aaeg [0],_aaeg [3],_aaeg [6],_aaeg [1],_aaeg [4],_aaeg [7]};if _ceg ._bbe ==nil {_caga .Transform (_ceg ._df ,_agdc ,im ,im .Bounds (),_cg .Over ,nil );}else {_caga .Transform (_ceg ._df ,_agdc ,im ,im .Bounds (),_cg .Over ,&_cg .Options {DstMask :_ceg ._bbe ,DstMaskP :_de .Point {}});
|
|
};};type solidPattern struct{_efaad _g .Color };func (_feag *Context )Matrix ()_fc .Matrix {return _feag ._ddde };func _fb (_fbg ,_dbd ,_fgg ,_bbc ,_ce ,_bf ,_ddf ,_cef float64 )[]_fc .Point {_ced :=(_c .Hypot (_fgg -_fbg ,_bbc -_dbd )+_c .Hypot (_ce -_fgg ,_bf -_bbc )+_c .Hypot (_ddf -_ce ,_cef -_bf ));
|
|
_ac :=int (_ced +0.5);if _ac < 4{_ac =4;};_cade :=float64 (_ac )-1;_dc :=make ([]_fc .Point ,_ac );for _fad :=0;_fad < _ac ;_fad ++{_efb :=float64 (_fad )/_cade ;_abg ,_cae :=_gd (_fbg ,_dbd ,_fgg ,_bbc ,_ce ,_bf ,_ddf ,_cef ,_efb );_dc [_fad ]=_fc .NewPoint (_abg ,_cae );
|
|
};return _dc ;};func (_fbfd *Context )SetMask (mask *_de .Alpha )error {if mask .Bounds ().Size ()!=_fbfd ._df .Bounds ().Size (){return _cf .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");
|
|
};_fbfd ._bbe =mask ;return nil ;};func (_cfbb *Context )FillPattern ()_fe .Pattern {return _cfbb ._aed };func (_dbg *Context )DrawString (s string ,face _dg .Face ,x ,y float64 ){_dbg .DrawStringAnchored (s ,face ,x ,y ,0,0);};type radialGradient struct{_fgcf ,_dag ,_daa circle ;
|
|
_dbcc ,_ecb float64 ;_acf float64 ;_dbgg stops ;};func (_bdc *Context )Height ()int {return _bdc ._bgf };type stops []stop ;func _gd (_fce ,_cadd ,_feb ,_bc ,_ga ,_efg ,_gb ,_gf ,_cag float64 )(_gae ,_ffc float64 ){_bcc :=1-_cag ;_bgcb :=_bcc *_bcc *_bcc ;
|
|
_ggf :=3*_bcc *_bcc *_cag ;_dga :=3*_bcc *_cag *_cag ;_bd :=_cag *_cag *_cag ;_gae =_bgcb *_fce +_ggf *_feb +_dga *_ga +_bd *_gb ;_ffc =_bgcb *_cadd +_ggf *_bc +_dga *_efg +_bd *_gf ;return ;};type stop struct{_eef float64 ;_fcb _g .Color ;};func (_dea *Context )Scale (x ,y float64 ){_dea ._ddde =_dea ._ddde .Scale (x ,y )};
|
|
func (_cdb *Context )SetLineWidth (lineWidth float64 ){_cdb ._cga =lineWidth };func (_fbe *Context )joiner ()_b .Joiner {switch _fbe ._dgf {case _fe .LineJoinBevel :return _b .BevelJoiner ;case _fe .LineJoinRound :return _b .RoundJoiner ;};return nil ;
|
|
};func (_fafg stops )Swap (i ,j int ){_fafg [i ],_fafg [j ]=_fafg [j ],_fafg [i ]};func (_aabe *Context )stroke (_fgc _b .Painter ){_caa :=_aabe ._cedb ;if len (_aabe ._af )> 0{_caa =_cbb (_caa ,_aabe ._af ,_aabe ._fed );}else {_caa =_fgd (_egbe (_caa ));
|
|
};_ccc :=_aabe ._cgd ;_ccc .UseNonZeroWinding =true ;_ccc .Clear ();_abec :=(_aabe ._ddde .ScalingFactorX ()+_aabe ._ddde .ScalingFactorY ())/2;_ccc .AddStroke (_caa ,_ecbe (_aabe ._cga *_abec ),_aabe .capper (),_aabe .joiner ());_ccc .Rasterize (_fgc );
|
|
};func (_cgdc *patternPainter )Paint (ss []_b .Span ,done bool ){_bde :=_cgdc ._bffbg .Bounds ();for _ ,_eeda :=range ss {if _eeda .Y < _bde .Min .Y {continue ;};if _eeda .Y >=_bde .Max .Y {return ;};if _eeda .X0 < _bde .Min .X {_eeda .X0 =_bde .Min .X ;
|
|
};if _eeda .X1 > _bde .Max .X {_eeda .X1 =_bde .Max .X ;};if _eeda .X0 >=_eeda .X1 {continue ;};const _bgfa =1<<16-1;_dee :=_eeda .Y -_cgdc ._bffbg .Rect .Min .Y ;_bdg :=_eeda .X0 -_cgdc ._bffbg .Rect .Min .X ;_dfgf :=(_eeda .Y -_cgdc ._bffbg .Rect .Min .Y )*_cgdc ._bffbg .Stride +(_eeda .X0 -_cgdc ._bffbg .Rect .Min .X )*4;
|
|
_bdgf :=_dfgf +(_eeda .X1 -_eeda .X0 )*4;for _cdab ,_aac :=_dfgf ,_bdg ;_cdab < _bdgf ;_cdab ,_aac =_cdab +4,_aac +1{_caed :=_eeda .Alpha ;if _cgdc ._fgge !=nil {_caed =_caed *uint32 (_cgdc ._fgge .AlphaAt (_aac ,_dee ).A )/255;if _caed ==0{continue ;};
|
|
};_bddd :=_cgdc ._eea .ColorAt (_aac ,_dee );_abbe ,_eab ,_eegc ,_bfga :=_bddd .RGBA ();_agfa :=uint32 (_cgdc ._bffbg .Pix [_cdab +0]);_gfaf :=uint32 (_cgdc ._bffbg .Pix [_cdab +1]);_feaf :=uint32 (_cgdc ._bffbg .Pix [_cdab +2]);_bed :=uint32 (_cgdc ._bffbg .Pix [_cdab +3]);
|
|
_fbbf :=(_bgfa -(_bfga *_caed /_bgfa ))*0x101;_cgdc ._bffbg .Pix [_cdab +0]=uint8 ((_agfa *_fbbf +_abbe *_caed )/_bgfa >>8);_cgdc ._bffbg .Pix [_cdab +1]=uint8 ((_gfaf *_fbbf +_eab *_caed )/_bgfa >>8);_cgdc ._bffbg .Pix [_cdab +2]=uint8 ((_feaf *_fbbf +_eegc *_caed )/_bgfa >>8);
|
|
_cgdc ._bffbg .Pix [_cdab +3]=uint8 ((_bed *_fbbf +_bfga *_caed )/_bgfa >>8);};};};const (_gab repeatOp =iota ;_dagb ;_cfd ;_gcgc ;); |