mirror of
https://github.com/unidoc/unipdf.git
synced 2025-05-02 22:17:06 +08:00
12 lines
27 KiB
Go
12 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 (_ba "errors";_c "fmt";_gfe "github.com/golang/freetype/raster";_de "github.com/unidoc/unipdf/v3/common";_gf "github.com/unidoc/unipdf/v3/internal/transform";_ce "github.com/unidoc/unipdf/v3/render/internal/context";_ea "golang.org/x/image/draw";_af "golang.org/x/image/font";_gc "golang.org/x/image/math/f64";_ab "golang.org/x/image/math/fixed";_da "image";_a "image/color";_b "image/draw";_g "math";_dg "sort";_d "strings";);func _agfa (_aec _gfe .Path )[][]_gf .Point {var _decg [][]_gf .Point ;var _fcfg []_gf .Point ;var _gfcd ,_bccd float64 ;for _ggbd :=0;_ggbd < len (_aec );{switch _aec [_ggbd ]{case 0:if len (_fcfg )> 0{_decg =append (_decg ,_fcfg );_fcfg =nil ;};_efgb :=_fgg (_aec [_ggbd +1]);_acea :=_fgg (_aec [_ggbd +2]);_fcfg =append (_fcfg ,_gf .NewPoint (_efgb ,_acea ));_gfcd ,_bccd =_efgb ,_acea ;_ggbd +=4;case 1:_dcf :=_fgg (_aec [_ggbd +1]);_cafe :=_fgg (_aec [_ggbd +2]);_fcfg =append (_fcfg ,_gf .NewPoint (_dcf ,_cafe ));_gfcd ,_bccd =_dcf ,_cafe ;_ggbd +=4;case 2:_bga :=_fgg (_aec [_ggbd +1]);_egge :=_fgg (_aec [_ggbd +2]);_agfd :=_fgg (_aec [_ggbd +3]);_ggee :=_fgg (_aec [_ggbd +4]);_cgec :=_cg (_gfcd ,_bccd ,_bga ,_egge ,_agfd ,_ggee );_fcfg =append (_fcfg ,_cgec ...);_gfcd ,_bccd =_agfd ,_ggee ;_ggbd +=6;case 3:_dcc :=_fgg (_aec [_ggbd +1]);_cggc :=_fgg (_aec [_ggbd +2]);_acc :=_fgg (_aec [_ggbd +3]);_dcda :=_fgg (_aec [_ggbd +4]);_defdc :=_fgg (_aec [_ggbd +5]);_fdde :=_fgg (_aec [_ggbd +6]);_bfba :=_ddc (_gfcd ,_bccd ,_dcc ,_cggc ,_acc ,_dcda ,_defdc ,_fdde );_fcfg =append (_fcfg ,_bfba ...);_gfcd ,_bccd =_defdc ,_fdde ;_ggbd +=8;default:_de .Log .Debug ("\u0057\u0041\u0052\u004e: \u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0070\u0061\u0074\u0068\u003a\u0020%\u0076",_aec );return _decg ;};};if len (_fcfg )> 0{_decg =append (_decg ,_fcfg );};return _decg ;};func (_caaf *Context )SetStrokeRGBA (r ,g ,b ,a float64 ){_gef :=_a .NRGBA {uint8 (r *255),uint8 (g *255),uint8 (b *255),uint8 (a *255)};_caaf ._gdc =_gadb (_gef );};func (_ced *Context )SetRGBA (r ,g ,b ,a float64 ){_ced ._beb =_a .NRGBA {uint8 (r *255),uint8 (g *255),uint8 (b *255),uint8 (a *255)};_ced .setFillAndStrokeColor (_ced ._beb );};func (_bc *Context )Height ()int {return _bc ._cfa };func (_cgba *Context )AsMask ()*_da .Alpha {_eab :=_da .NewAlpha (_cgba ._gda .Bounds ());_ea .Draw (_eab ,_cgba ._gda .Bounds (),_cgba ._gda ,_da .ZP ,_ea .Src );return _eab ;};func (_bcc *Context )SetLineJoin (lineJoin _ce .LineJoin ){_bcc ._ecef =lineJoin };func _dab (_cb ,_dgg ,_cf ,_dd ,_f ,_fe ,_abc float64 )(_gfg ,_eg float64 ){_ef :=1-_abc ;_gd :=_ef *_ef ;_bb :=2*_ef *_abc ;_ae :=_abc *_abc ;_gfg =_gd *_cb +_bb *_cf +_ae *_f ;_eg =_gd *_dgg +_bb *_dd +_ae *_fe ;return ;};func _fgcg (_bgeec _da .Image ,_cfgb repeatOp )_ce .Pattern {return &surfacePattern {_dfg :_bgeec ,_cgdb :_cfgb };};type linearGradient struct{_dbcf ,_dge ,_aed ,_ace float64 ;_ebd stops ;};func _cbgdcb (_babc *_da .RGBA ,_edg *_da .Alpha ,_defdb _ce .Pattern )*patternPainter {return &patternPainter {_babc ,_edg ,_defdb };};func (_abe stops )Len ()int {return len (_abe )};func (_gaaf *Context )DrawRectangle (x ,y ,w ,h float64 ){_gaaf .NewSubPath ();_gaaf .MoveTo (x ,y );_gaaf .LineTo (x +w ,y );_gaaf .LineTo (x +w ,y +h );_gaaf .LineTo (x ,y +h );_gaaf .ClosePath ();};func (_eedc *Context )Clip (){_eedc .ClipPreserve ();_eedc .ClearPath ()};func (_beg *Context )Rotate (angle float64 ){_beg ._ca .Rotate (angle )};func (_bcb *Context )stroke (_ffg _gfe .Painter ){_ecc :=_bcb ._aea ;if len (_bcb ._ge )> 0{_ecc =_bege (_ecc ,_bcb ._ge ,_bcb ._abfa );}else {_ecc =_aeea (_agfa (_ecc ));};_dbf :=_bcb ._ed ;_dbf .UseNonZeroWinding =true ;_dbf .Clear ();_dbf .AddStroke (_ecc ,_cfea (_bcb ._df ),_bcb .capper (),_bcb .joiner ());_dbf .Rasterize (_ffg );};func (_bab *Context )SetColor (c _a .Color ){_bab .setFillAndStrokeColor (c )};type circle struct{_bega ,_fadg ,_bcge float64 };func _fde (_gcad string )(_gbgb ,_egdb ,_agg ,_cebg int ){_gcad =_d .TrimPrefix (_gcad ,"\u0023");_cebg =255;if len (_gcad )==3{_dgbd :="\u00251\u0078\u0025\u0031\u0078\u0025\u0031x";_c .Sscanf (_gcad ,_dgbd ,&_gbgb ,&_egdb ,&_agg );_gbgb |=_gbgb <<4;_egdb |=_egdb <<4;_agg |=_agg <<4;};if len (_gcad )==6{_ffe :="\u0025\u0030\u0032x\u0025\u0030\u0032\u0078\u0025\u0030\u0032\u0078";_c .Sscanf (_gcad ,_ffe ,&_gbgb ,&_egdb ,&_agg );};if len (_gcad )==8{_gdfa :="\u0025\u00302\u0078\u0025\u00302\u0078\u0025\u0030\u0032\u0078\u0025\u0030\u0032\u0078";_c .Sscanf (_gcad ,_gdfa ,&_gbgb ,&_egdb ,&_agg ,&_cebg );};return ;};func (_bfb *Context )StrokePreserve (){var _cad _gfe .Painter ;if _bfb ._dcb ==nil {if _bgg ,_cbb :=_bfb ._gdc .(*solidPattern );_cbb {_egb :=_gfe .NewRGBAPainter (_bfb ._gda );_egb .SetColor (_bgg ._dfabe );_cad =_egb ;};};if _cad ==nil {_cad =_cbgdcb (_bfb ._gda ,_bfb ._dcb ,_bfb ._gdc );};_bfb .stroke (_cad );};func (_aca *linearGradient )ColorAt (x ,y int )_a .Color {if len (_aca ._ebd )==0{return _a .Transparent ;};_fbb ,_aab :=float64 (x ),float64 (y );_fcc ,_bdg ,_faa ,_adf :=_aca ._dbcf ,_aca ._dge ,_aca ._aed ,_aca ._ace ;_bba ,_gfb :=_faa -_fcc ,_adf -_bdg ;if _gfb ==0&&_bba !=0{return _gdfe ((_fbb -_fcc )/_bba ,_aca ._ebd );};if _bba ==0&&_gfb !=0{return _gdfe ((_aab -_bdg )/_gfb ,_aca ._ebd );};_geb :=_bba *(_fbb -_fcc )+_gfb *(_aab -_bdg );if _geb < 0{return _aca ._ebd [0]._ccf ;};_cged :=_g .Hypot (_bba ,_gfb );_eaae :=((_fbb -_fcc )*-_gfb +(_aab -_bdg )*_bba )/(_cged *_cged );_cab ,_dgfg :=_fcc +_eaae *-_gfb ,_bdg +_eaae *_bba ;_dda :=_g .Hypot (_fbb -_cab ,_aab -_dgfg )/_cged ;return _gdfe (_dda ,_aca ._ebd );};func (_bed *Context )CubicTo (x1 ,y1 ,x2 ,y2 ,x3 ,y3 float64 ){if !_bed ._fff {_bed .MoveTo (x1 ,y1 );};_dfd ,_cgg :=_bed ._fef .X ,_bed ._fef .Y ;x1 ,y1 =_bed .Transform (x1 ,y1 );x2 ,y2 =_bed .Transform (x2 ,y2 );x3 ,y3 =_bed .Transform (x3 ,y3 );_eba :=_ddc (_dfd ,_cgg ,x1 ,y1 ,x2 ,y2 ,x3 ,y3 );_cgc :=_gbab (_bed ._fef );for _ ,_fc :=range _eba [1:]{_eeb :=_gbab (_fc );if _eeb ==_cgc {continue ;};_cgc =_eeb ;_bed ._aea .Add1 (_eeb );_bed ._ebce .Add1 (_eeb );_bed ._fef =_fc ;};};func (_fea *Context )drawString (_bgcg *_da .RGBA ,_caf string ,_fgc ,_eec float64 ){_gge :=&_af .Drawer {Dst :_bgcg ,Src :_da .NewUniform (_fea ._beb ),Face :_fea ._gde .Tf .Face ,Dot :_gbab (_gf .NewPoint (_fgc ,_eec ))};_eedg :=rune (-1);for _ ,_eaaa :=range _caf {if _eedg >=0{_gge .Dot .X +=_gge .Face .Kern (_eedg ,_eaaa );};_fcf ,_cga ,_cdc ,_bbc ,_feg :=_gge .Face .Glyph (_gge .Dot ,_eaaa );if !_feg {continue ;};_dfe :=_fcf .Sub (_fcf .Min );_bdeg :=_ea .BiLinear ;_gged :=_fea ._ca .Clone ();_gged .Translate (float64 (_fcf .Min .X ),float64 (_fcf .Min .Y ));_ebca :=_gc .Aff3 {_gged [0],_gged [3],_gged [6],_gged [1],_gged [4],_gged [7]};_bdeg .Transform (_gge .Dst ,_ebca ,_gge .Src ,_dfe ,_ea .Over ,&_ea .Options {SrcMask :_cga ,SrcMaskP :_cdc });_gge .Dot .X +=_bbc ;_eedg =_eaaa ;};};type radialGradient struct{_aegb ,_cegf ,_gbg circle ;_gbbf ,_acff float64 ;_cbcg float64 ;_gcag stops ;};func (_bad *Context )DrawRoundedRectangle (x ,y ,w ,h ,r float64 ){_dfaa ,_ggd ,_fga ,_ecea :=x ,x +r ,x +w -r ,x +w ;_daa ,_acdf ,_fabc ,_acf :=y ,y +r ,y +h -r ,y +h ;_bad .NewSubPath ();_bad .MoveTo (_ggd ,_daa );_bad .LineTo (_fga ,_daa );_bad .DrawArc (_fga ,_acdf ,r ,_ecbc (270),_ecbc (360));_bad .LineTo (_ecea ,_fabc );_bad .DrawArc (_fga ,_fabc ,r ,_ecbc (0),_ecbc (90));_bad .LineTo (_ggd ,_acf );_bad .DrawArc (_ggd ,_fabc ,r ,_ecbc (90),_ecbc (180));_bad .LineTo (_dfaa ,_acdf );_bad .DrawArc (_ggd ,_acdf ,r ,_ecbc (180),_ecbc (270));_bad .ClosePath ();};func (_ecb *Context )Width ()int {return _ecb ._bbg };func _ebf (_cbag ,_cfg uint32 ,_gfbd float64 )uint8 {return uint8 (int32 (float64 (_cbag )*(1.0-_gfbd )+float64 (_cfg )*_gfbd )>>8);};func (_ceg *Context )DrawString (s string ,x ,y float64 ){_ceg .DrawStringAnchored (s ,x ,y ,0,0)};func (_eegf *Context )Transform (x ,y float64 )(_bacb ,_beaf float64 ){return _eegf ._ca .Transform (x ,y );};func (_gbf *Context )Clear (){_cbbd :=_da .NewUniform (_gbf ._beb );_ea .Draw (_gbf ._gda ,_gbf ._gda .Bounds (),_cbbd ,_da .ZP ,_ea .Src );};type surfacePattern struct{_dfg _da .Image ;_cgdb repeatOp ;};func (_bee *solidPattern )ColorAt (x ,y int )_a .Color {return _bee ._dfabe };func (_abac *Context )QuadraticTo (x1 ,y1 ,x2 ,y2 float64 ){if !_abac ._fff {_abac .MoveTo (x1 ,y1 );};x1 ,y1 =_abac .Transform (x1 ,y1 );x2 ,y2 =_abac .Transform (x2 ,y2 );_aaf :=_gf .NewPoint (x1 ,y1 );_ebbd :=_gf .NewPoint (x2 ,y2 );_bde :=_gbab (_aaf );_gbb :=_gbab (_ebbd );_abac ._aea .Add2 (_bde ,_gbb );_abac ._ebce .Add2 (_bde ,_gbb );_abac ._fef =_ebbd ;};func (_cac *Context )DrawLine (x1 ,y1 ,x2 ,y2 float64 ){_cac .MoveTo (x1 ,y1 );_cac .LineTo (x2 ,y2 )};func (_gfa *Context )ClosePath (){if _gfa ._fff {_faf :=_gbab (_gfa ._fddg );_gfa ._aea .Add1 (_faf );_gfa ._ebce .Add1 (_faf );_gfa ._fef =_gfa ._fddg ;};};func (_caa *Context )SetLineCap (lineCap _ce .LineCap ){_caa ._bea =lineCap };func _ecbc (_aged float64 )float64 {return _aged *_g .Pi /180};func (_edeb *Context )Scale (x ,y float64 ){_edeb ._ca .Scale (x ,y )};func (_ddd stops )Swap (i ,j int ){_ddd [i ],_ddd [j ]=_ddd [j ],_ddd [i ]};func (_abae *radialGradient )ColorAt (x ,y int )_a .Color {if len (_abae ._gcag )==0{return _a .Transparent ;};_fbf ,_fccc :=float64 (x )+0.5-_abae ._aegb ._bega ,float64 (y )+0.5-_abae ._aegb ._fadg ;_eabf :=_cedb (_fbf ,_fccc ,_abae ._aegb ._bcge ,_abae ._gbg ._bega ,_abae ._gbg ._fadg ,_abae ._gbg ._bcge );_defd :=_cedb (_fbf ,_fccc ,-_abae ._aegb ._bcge ,_fbf ,_fccc ,_abae ._aegb ._bcge );if _abae ._gbbf ==0{if _eabf ==0{return _a .Transparent ;};_deaa :=0.5*_defd /_eabf ;if _deaa *_abae ._gbg ._bcge >=_abae ._cbcg {return _gdfe (_deaa ,_abae ._gcag );};return _a .Transparent ;};_cdd :=_cedb (_eabf ,_abae ._gbbf ,0,_eabf ,-_defd ,0);if _cdd >=0{_eeea :=_g .Sqrt (_cdd );_gbee :=(_eabf +_eeea )*_abae ._acff ;_afed :=(_eabf -_eeea )*_abae ._acff ;if _gbee *_abae ._gbg ._bcge >=_abae ._cbcg {return _gdfe (_gbee ,_abae ._gcag );}else if _afed *_abae ._gbg ._bcge >=_abae ._cbcg {return _gdfe (_afed ,_abae ._gcag );};};return _a .Transparent ;};func (_cd *Context )MoveTo (x ,y float64 ){if _cd ._fff {_cd ._ebce .Add1 (_gbab (_cd ._fddg ));};x ,y =_cd .Transform (x ,y );_bgea :=_gf .NewPoint (x ,y );_dea :=_gbab (_bgea );_cd ._aea .Start (_dea );_cd ._ebce .Start (_dea );_cd ._fddg =_bgea ;_cd ._fef =_bgea ;_cd ._fff =true ;};type patternPainter struct{_cacf *_da .RGBA ;_agdc *_da .Alpha ;_abef _ce .Pattern ;};func (_dgd *Context )SetRGB255 (r ,g ,b int ){_dgd .SetRGBA255 (r ,g ,b ,255)};func _cedb (_dde ,_dggb ,_afg ,_afbc ,_gdea ,_def float64 )float64 {return _dde *_afbc +_dggb *_gdea +_afg *_def ;};func (_afc *Context )setFillAndStrokeColor (_fac _a .Color ){_afc ._beb =_fac ;_afc ._bge =_gadb (_fac );_afc ._gdc =_gadb (_fac );};func _gbab (_ceef _gf .Point )_ab .Point26_6 {return _ab .Point26_6 {X :_cfea (_ceef .X ),Y :_cfea (_ceef .Y )}};func _ccfg (_aacb [][]_gf .Point ,_ddb []float64 ,_dae float64 )[][]_gf .Point {var _begc [][]_gf .Point ;if len (_ddb )==0{return _aacb ;};if len (_ddb )==1{_ddb =append (_ddb ,_ddb [0]);};for _ ,_ceac :=range _aacb {if len (_ceac )< 2{continue ;};_cda :=_ceac [0];_afbd :=1;_ecegc :=0;_dgdb :=0.0;if _dae !=0{var _agba float64 ;for _ ,_cae :=range _ddb {_agba +=_cae ;};_dae =_g .Mod (_dae ,_agba );if _dae < 0{_dae +=_agba ;};for _egde ,_bfbf :=range _ddb {_dae -=_bfbf ;if _dae < 0{_ecegc =_egde ;_dgdb =_bfbf +_dae ;break ;};};};var _bae []_gf .Point ;_bae =append (_bae ,_cda );for _afbd < len (_ceac ){_eag :=_ddb [_ecegc ];_ebba :=_ceac [_afbd ];_fdg :=_cda .Distance (_ebba );_gfcc :=_eag -_dgdb ;if _fdg > _gfcc {_dac :=_gfcc /_fdg ;_bca :=_cda .Interpolate (_ebba ,_dac );_bae =append (_bae ,_bca );if _ecegc %2==0&&len (_bae )> 1{_begc =append (_begc ,_bae );};_bae =nil ;_bae =append (_bae ,_bca );_dgdb =0;_cda =_bca ;_ecegc =(_ecegc +1)%len (_ddb );}else {_bae =append (_bae ,_ebba );_cda =_ebba ;_dgdb +=_fdg ;_afbd ++;};};if _ecegc %2==0&&len (_bae )> 1{_begc =append (_begc ,_bae );};};return _begc ;};func (_bgc *Context )DrawArc (x ,y ,r ,angle1 ,angle2 float64 ){_bgc .DrawEllipticalArc (x ,y ,r ,r ,angle1 ,angle2 );};func (_ccc *Context )SetRGBA255 (r ,g ,b ,a int ){_ccc ._beb =_a .NRGBA {uint8 (r ),uint8 (g ),uint8 (b ),uint8 (a )};_ccc .setFillAndStrokeColor (_ccc ._beb );};func (_eff *Context )joiner ()_gfe .Joiner {switch _eff ._ecef {case _ce .LineJoinBevel :return _gfe .BevelJoiner ;case _ce .LineJoinRound :return _gfe .RoundJoiner ;};return nil ;};func (_aee *Context )SetFillRule (fillRule _ce .FillRule ){_aee ._ebb =fillRule };func (_aaa *Context )SetLineWidth (lineWidth float64 ){_aaa ._df =lineWidth };func (_fab *Context )SetRGB (r ,g ,b float64 ){_fab .SetRGBA (r ,g ,b ,1)};type stop struct{_dbba float64 ;_ccf _a .Color ;};type Context struct{_bbg int ;_cfa int ;_ed *_gfe .Rasterizer ;_gda *_da .RGBA ;_dcb *_da .Alpha ;_beb _a .Color ;_bge _ce .Pattern ;_gdc _ce .Pattern ;_aea _gfe .Path ;_ebce _gfe .Path ;_fddg _gf .Point ;_fef _gf .Point ;_fff bool ;_ge []float64 ;_abfa float64 ;_df float64 ;_bea _ce .LineCap ;_ecef _ce .LineJoin ;_ebb _ce .FillRule ;_ca _gf .Matrix ;_gde *_ce .TextState ;_bf []*Context ;};func _fgg (_dedc _ab .Int26_6 )float64 {const _fcff ,_dbcg =6,1<<6-1;if _dedc >=0{return float64 (_dedc >>_fcff )+float64 (_dedc &_dbcg )/64;};_dedc =-_dedc ;if _dedc >=0{return -(float64 (_dedc >>_fcff )+float64 (_dedc &_dbcg )/64);};return 0;};func (_aga *radialGradient )AddColorStop (offset float64 ,color _a .Color ){_aga ._gcag =append (_aga ._gcag ,stop {_dbba :offset ,_ccf :color });_dg .Sort (_aga ._gcag );};func _gefa (_eggf ,_aff ,_adab ,_fba float64 )_ce .Gradient {_efc :=&linearGradient {_dbcf :_eggf ,_dge :_aff ,_aed :_adab ,_ace :_fba };return _efc ;};func (_fffg *Context )capper ()_gfe .Capper {switch _fffg ._bea {case _ce .LineCapButt :return _gfe .ButtCapper ;case _ce .LineCapRound :return _gfe .RoundCapper ;case _ce .LineCapSquare :return _gfe .SquareCapper ;};return nil ;};func _gadb (_dfdg _a .Color )_ce .Pattern {return &solidPattern {_dfabe :_dfdg }};func _gdfe (_cbf float64 ,_bfa stops )_a .Color {if _cbf <=0.0||len (_bfa )==1{return _bfa [0]._ccf ;};_efb :=_bfa [len (_bfa )-1];if _cbf >=_efb ._dbba {return _efb ._ccf ;};for _fadf ,_cbgd :=range _bfa [1:]{if _cbf < _cbgd ._dbba {_cbf =(_cbf -_bfa [_fadf ]._dbba )/(_cbgd ._dbba -_bfa [_fadf ]._dbba );return _badd (_bfa [_fadf ]._ccf ,_cbgd ._ccf ,_cbf );};};return _efb ._ccf ;};func _badd (_feae ,_afcc _a .Color ,_agb float64 )_a .Color {_efe ,_bfda ,_fbab ,_abd :=_feae .RGBA ();_aac ,_gfga ,_eeed ,_dfab :=_afcc .RGBA ();return _a .RGBA {_ebf (_efe ,_aac ,_agb ),_ebf (_bfda ,_gfga ,_agb ),_ebf (_fbab ,_eeed ,_agb ),_ebf (_abd ,_dfab ,_agb )};};func (_efd *Context )DrawEllipticalArc (x ,y ,rx ,ry ,angle1 ,angle2 float64 ){const _dga =16;for _dcbb :=0;_dcbb < _dga ;_dcbb ++{_adc :=float64 (_dcbb +0)/_dga ;_gad :=float64 (_dcbb +1)/_dga ;_abca :=angle1 +(angle2 -angle1 )*_adc ;_dfdd :=angle1 +(angle2 -angle1 )*_gad ;_babd :=x +rx *_g .Cos (_abca );_fgb :=y +ry *_g .Sin (_abca );_fag :=x +rx *_g .Cos ((_abca +_dfdd )/2);_dfaf :=y +ry *_g .Sin ((_abca +_dfdd )/2);_gca :=x +rx *_g .Cos (_dfdd );_bbfb :=y +ry *_g .Sin (_dfdd );_bac :=2*_fag -_babd /2-_gca /2;_bada :=2*_dfaf -_fgb /2-_bbfb /2;if _dcbb ==0{if _efd ._fff {_efd .LineTo (_babd ,_fgb );}else {_efd .MoveTo (_babd ,_fgb );};};_efd .QuadraticTo (_bac ,_bada ,_gca ,_bbfb );};};var (_fg =_gadb (_a .White );_cbe =_gadb (_a .Black ););func (_gbe *Context )SetStrokeStyle (pattern _ce .Pattern ){_gbe ._gdc =pattern };func (_dfda stops )Less (i ,j int )bool {return _dfda [i ]._dbba < _dfda [j ]._dbba };func (_gdf *Context )ShearAbout (sx ,sy ,x ,y float64 ){_gdf .Translate (x ,y );_gdf .Shear (sx ,sy );_gdf .Translate (-x ,-y );};type solidPattern struct{_dfabe _a .Color };type stops []stop ;func (_gcg *Context )SetDashOffset (offset float64 ){_gcg ._abfa =offset };func (_bbaf *surfacePattern )ColorAt (x ,y int )_a .Color {_geae :=_bbaf ._dfg .Bounds ();switch _bbaf ._cgdb {case _ceeb :if y >=_geae .Dy (){return _a .Transparent ;};case _ddfg :if x >=_geae .Dx (){return _a .Transparent ;};case _cbbf :if x >=_geae .Dx ()||y >=_geae .Dy (){return _a .Transparent ;};};x =x %_geae .Dx ()+_geae .Min .X ;y =y %_geae .Dy ()+_geae .Min .Y ;return _bbaf ._dfg .At (x ,y );};func _ddc (_bbb ,_ead ,_cee ,_aae ,_ece ,_bg ,_eceg ,_ebc float64 )[]_gf .Point {_fa :=(_g .Hypot (_cee -_bbb ,_aae -_ead )+_g .Hypot (_ece -_cee ,_bg -_aae )+_g .Hypot (_eceg -_ece ,_ebc -_bg ));_ebg :=int (_fa +0.5);if _ebg < 4{_ebg =4;};_gbc :=float64 (_ebg )-1;_afd :=make ([]_gf .Point ,_ebg );for _dca :=0;_dca < _ebg ;_dca ++{_ecd :=float64 (_dca )/_gbc ;_ggb ,_fdd :=_deb (_bbb ,_ead ,_cee ,_aae ,_ece ,_bg ,_eceg ,_ebc ,_ecd );_afd [_dca ]=_gf .NewPoint (_ggb ,_fdd );};return _afd ;};func (_gfc *Context )DrawCircle (x ,y ,r float64 ){_gfc .NewSubPath ();_gfc .DrawEllipticalArc (x ,y ,r ,r ,0,2*_g .Pi );_gfc .ClosePath ();};func (_afe *Context )InvertMask (){if _afe ._dcb ==nil {_afe ._dcb =_da .NewAlpha (_afe ._gda .Bounds ());}else {for _dfa ,_dcge :=range _afe ._dcb .Pix {_afe ._dcb .Pix [_dfa ]=255-_dcge ;};};};func _aeab (_edc _da .Image )*_da .RGBA {_bdbf :=_edc .Bounds ();_ffd :=_da .NewRGBA (_bdbf );_b .Draw (_ffd ,_bdbf ,_edc ,_bdbf .Min ,_b .Src );return _ffd ;};func (_cgf *Context )DrawEllipse (x ,y ,rx ,ry float64 ){_cgf .NewSubPath ();_cgf .DrawEllipticalArc (x ,y ,rx ,ry ,0,2*_g .Pi );_cgf .ClosePath ();};func (_dba *Context )Matrix ()_gf .Matrix {return _dba ._ca };func (_db *Context )SetFillRGBA (r ,g ,b ,a float64 ){_dbc :=_a .NRGBA {uint8 (r *255),uint8 (g *255),uint8 (b *255),uint8 (a *255)};_db ._beb =_dbc ;_db ._bge =_gadb (_dbc );};func (_fad *Context )TextState ()*_ce .TextState {return _fad ._gde };func (_ga *Context )SetHexColor (x string ){_fda ,_agf ,_egg ,_caad :=_fde (x );_ga .SetRGBA255 (_fda ,_agf ,_egg ,_caad );};const (_fgca repeatOp =iota ;_ceeb ;_ddfg ;_cbbf ;);func (_bcf *Context )fill (_bbf _gfe .Painter ){_geg :=_bcf ._ebce ;if _bcf ._fff {_geg =make (_gfe .Path ,len (_bcf ._ebce ));copy (_geg ,_bcf ._ebce );_geg .Add1 (_gbab (_bcf ._fddg ));};_gdcd :=_bcf ._ed ;_gdcd .UseNonZeroWinding =_bcf ._ebb ==_ce .FillRuleWinding ;_gdcd .Clear ();_gdcd .AddPath (_geg );_gdcd .Rasterize (_bbf );};func (_cgcf *Context )Push (){_aefc :=*_cgcf ;_cgcf ._bf =append (_cgcf ._bf ,&_aefc )};func (_ffb *Context )Shear (x ,y float64 ){_ffb ._ca .Shear (x ,y )};func (_fed *linearGradient )AddColorStop (offset float64 ,color _a .Color ){_fed ._ebd =append (_fed ._ebd ,stop {_dbba :offset ,_ccf :color });_dg .Sort (_fed ._ebd );};func (_dbb *Context )ScaleAbout (sx ,sy ,x ,y float64 ){_dbb .Translate (x ,y );_dbb .Scale (sx ,sy );_dbb .Translate (-x ,-y );};type repeatOp int ;func (_egeg *Context )LineWidth ()float64 {return _egeg ._df };func (_bdd *Context )Fill (){_bdd .FillPreserve ();_bdd .ClearPath ()};func (_eed *Context )ClearPath (){_eed ._aea .Clear ();_eed ._ebce .Clear ();_eed ._fff =false };func (_ded *Context )ClipPreserve (){_dcgg :=_da .NewAlpha (_da .Rect (0,0,_ded ._bbg ,_ded ._cfa ));_baa :=_gfe .NewAlphaOverPainter (_dcgg );_ded .fill (_baa );if _ded ._dcb ==nil {_ded ._dcb =_dcgg ;}else {_cgb :=_da .NewAlpha (_da .Rect (0,0,_ded ._bbg ,_ded ._cfa ));_ea .DrawMask (_cgb ,_cgb .Bounds (),_dcgg ,_da .ZP ,_ded ._dcb ,_da .ZP ,_ea .Over );_ded ._dcb =_cgb ;};};func _gcea (_fedg ,_bbd ,_ebbb ,_cba ,_ddf ,_ffca float64 )_ce .Gradient {_cea :=circle {_fedg ,_bbd ,_ebbb };_gdce :=circle {_cba ,_ddf ,_ffca };_feb :=circle {_cba -_fedg ,_ddf -_bbd ,_ffca -_ebbb };_acab :=_cedb (_feb ._bega ,_feb ._fadg ,-_feb ._bcge ,_feb ._bega ,_feb ._fadg ,_feb ._bcge );var _bcfb float64 ;if _acab !=0{_bcfb =1.0/_acab ;};_fadb :=-_cea ._bcge ;_dce :=&radialGradient {_aegb :_cea ,_cegf :_gdce ,_gbg :_feb ,_gbbf :_acab ,_acff :_bcfb ,_cbcg :_fadb };return _dce ;};func _cfea (_ffdc float64 )_ab .Int26_6 {return _ab .Int26_6 (_ffdc *64)};func (_gdac *patternPainter )Paint (ss []_gfe .Span ,done bool ){_dedb :=_gdac ._cacf .Bounds ();for _ ,_fdf :=range ss {if _fdf .Y < _dedb .Min .Y {continue ;};if _fdf .Y >=_dedb .Max .Y {return ;};if _fdf .X0 < _dedb .Min .X {_fdf .X0 =_dedb .Min .X ;};if _fdf .X1 > _dedb .Max .X {_fdf .X1 =_dedb .Max .X ;};if _fdf .X0 >=_fdf .X1 {continue ;};const _gbcf =1<<16-1;_eac :=_fdf .Y -_gdac ._cacf .Rect .Min .Y ;_cgbf :=_fdf .X0 -_gdac ._cacf .Rect .Min .X ;_cff :=(_fdf .Y -_gdac ._cacf .Rect .Min .Y )*_gdac ._cacf .Stride +(_fdf .X0 -_gdac ._cacf .Rect .Min .X )*4;_egcg :=_cff +(_fdf .X1 -_fdf .X0 )*4;for _caafd ,_dbg :=_cff ,_cgbf ;_caafd < _egcg ;_caafd ,_dbg =_caafd +4,_dbg +1{_dcfa :=_fdf .Alpha ;if _gdac ._agdc !=nil {_dcfa =_dcfa *uint32 (_gdac ._agdc .AlphaAt (_dbg ,_eac ).A )/255;if _dcfa ==0{continue ;};};_cbgdc :=_gdac ._abef .ColorAt (_dbg ,_eac );_cdg ,_bbce ,_gfeg ,_gagg :=_cbgdc .RGBA ();_abba :=uint32 (_gdac ._cacf .Pix [_caafd +0]);_dcgf :=uint32 (_gdac ._cacf .Pix [_caafd +1]);_fgbf :=uint32 (_gdac ._cacf .Pix [_caafd +2]);_fecd :=uint32 (_gdac ._cacf .Pix [_caafd +3]);_cadc :=(_gbcf -(_gagg *_dcfa /_gbcf ))*0x101;_gdac ._cacf .Pix [_caafd +0]=uint8 ((_abba *_cadc +_cdg *_dcfa )/_gbcf >>8);_gdac ._cacf .Pix [_caafd +1]=uint8 ((_dcgf *_cadc +_bbce *_dcfa )/_gbcf >>8);_gdac ._cacf .Pix [_caafd +2]=uint8 ((_fgbf *_cadc +_gfeg *_dcfa )/_gbcf >>8);_gdac ._cacf .Pix [_caafd +3]=uint8 ((_fecd *_cadc +_gagg *_dcfa )/_gbcf >>8);};};};func (_gdd *Context )ResetClip (){_gdd ._dcb =nil };func _bege (_ggf _gfe .Path ,_gbfa []float64 ,_bbgd float64 )_gfe .Path {return _aeea (_ccfg (_agfa (_ggf ),_gbfa ,_bbgd ));};func (_fec *Context )MeasureString (s string )(_fgaa ,_egf float64 ){_efdc :=&_af .Drawer {Face :_fec ._gde .Tf .Face };_eedd :=_efdc .MeasureString (s );return float64 (_eedd >>6),_fec ._gde .Tf .Size ;};func _deb (_aba ,_aad ,_gb ,_ec ,_dcd ,_ff ,_aeg ,_gcc ,_gg float64 )(_daf ,_abf float64 ){_ac :=1-_gg ;_dec :=_ac *_ac *_ac ;_eb :=3*_ac *_ac *_gg ;_ffc :=3*_ac *_gg *_gg ;_ag :=_gg *_gg *_gg ;_daf =_dec *_aba +_eb *_gb +_ffc *_dcd +_ag *_aeg ;_abf =_dec *_aad +_eb *_ec +_ffc *_ff +_ag *_gcc ;return ;};func (_bdde *Context )Translate (x ,y float64 ){_bdde ._ca .Translate (x ,y )};func (_eeg *Context )Image ()_da .Image {return _eeg ._gda };func (_aef *Context )SetMatrix (m _gf .Matrix ){_aef ._ca =m };func (_agd *Context )SetMask (mask *_da .Alpha )error {if mask .Bounds ().Size ()!=_agd ._gda .Bounds ().Size (){return _ba .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");};_agd ._dcb =mask ;return nil ;};func (_eegb *Context )DrawPoint (x ,y ,r float64 ){_eegb .Push ();_dcaa ,_bfd :=_eegb .Transform (x ,y );_eegb .Identity ();_eegb .DrawCircle (_dcaa ,_bfd ,r );_eegb .Pop ();};func (_bebf *Context )SetFillStyle (pattern _ce .Pattern ){if _caae ,_ada :=pattern .(*solidPattern );_ada {_bebf ._beb =_caae ._dfabe ;};_bebf ._bge =pattern ;};func NewContextForImage (im _da .Image )*Context {return NewContextForRGBA (_aeab (im ))};func (_cag *Context )Stroke (){_cag .StrokePreserve ();_cag .ClearPath ()};func NewContextForRGBA (im *_da .RGBA )*Context {_cfb :=im .Bounds ().Size ().X ;_ceb :=im .Bounds ().Size ().Y ;return &Context {_bbg :_cfb ,_cfa :_ceb ,_ed :_gfe .NewRasterizer (_cfb ,_ceb ),_gda :im ,_beb :_a .Transparent ,_bge :_fg ,_gdc :_cbe ,_df :1,_ebb :_ce .FillRuleWinding ,_ca :_gf .IdentityMatrix (),_gde :_ce .NewTextState ()};};func (_cebf *Context )SetPixel (x ,y int ){_cebf ._gda .Set (x ,y ,_cebf ._beb )};func (_acd *Context )NewSubPath (){if _acd ._fff {_acd ._ebce .Add1 (_gbab (_acd ._fddg ));};_acd ._fff =false ;};func _cg (_ee ,_cc ,_dgb ,_bd ,_egd ,_aa float64 )[]_gf .Point {_be :=(_g .Hypot (_dgb -_ee ,_bd -_cc )+_g .Hypot (_egd -_dgb ,_aa -_bd ));_ad :=int (_be +0.5);if _ad < 4{_ad =4;};_abb :=float64 (_ad )-1;_ege :=make ([]_gf .Point ,_ad );for _egdd :=0;_egdd < _ad ;_egdd ++{_egc :=float64 (_egdd )/_abb ;_fd ,_dc :=_dab (_ee ,_cc ,_dgb ,_bd ,_egd ,_aa ,_egc );_ege [_egdd ]=_gf .NewPoint (_fd ,_dc );};return _ege ;};func (_age *Context )DrawImageAnchored (im _da .Image ,x ,y int ,ax ,ay float64 ){_cbea :=im .Bounds ().Size ();x -=int (ax *float64 (_cbea .X ));y -=int (ay *float64 (_cbea .Y ));_efg :=_ea .BiLinear ;_bce :=_age ._ca .Clone ();_bce .Translate (float64 (x ),float64 (y ));_eee :=_gc .Aff3 {_bce [0],_bce [3],_bce [6],_bce [1],_bce [4],_bce [7]};if _age ._dcb ==nil {_efg .Transform (_age ._gda ,_eee ,im ,im .Bounds (),_ea .Over ,nil );}else {_efg .Transform (_age ._gda ,_eee ,im ,im .Bounds (),_ea .Over ,&_ea .Options {DstMask :_age ._dcb ,DstMaskP :_da .ZP });};};func (_eaa *Context )FillPreserve (){var _gaa _gfe .Painter ;if _eaa ._dcb ==nil {if _fb ,_bcg :=_eaa ._bge .(*solidPattern );_bcg {_bag :=_gfe .NewRGBAPainter (_eaa ._gda );_bag .SetColor (_fb ._dfabe );_gaa =_bag ;};};if _gaa ==nil {_gaa =_cbgdcb (_eaa ._gda ,_eaa ._dcb ,_eaa ._bge );};_eaa .fill (_gaa );};func (_fgd *Context )Identity (){_fgd ._ca =_gf .IdentityMatrix ()};func (_dcg *Context )SetDash (dashes ...float64 ){_dcg ._ge =dashes };func (_eggc *Context )Pop (){_bec :=*_eggc ;_ddg :=_eggc ._bf ;_dgf ,_ddg :=_ddg [len (_ddg )-1],_ddg [:len (_ddg )-1];*_eggc =*_dgf ;_eggc ._aea =_bec ._aea ;_eggc ._ebce =_bec ._ebce ;_eggc ._fddg =_bec ._fddg ;_eggc ._fef =_bec ._fef ;_eggc ._fff =_bec ._fff ;_eggc ._gde =_bec ._gde ;};func (_edf *Context )RotateAbout (angle ,x ,y float64 ){_edf .Translate (x ,y );_edf .Rotate (angle );_edf .Translate (-x ,-y );};func (_gce *Context )LineTo (x ,y float64 ){if !_gce ._fff {_gce .MoveTo (x ,y );}else {x ,y =_gce .Transform (x ,y );_dcaf :=_gf .NewPoint (x ,y );_gccf :=_gbab (_dcaf );_gce ._aea .Add1 (_gccf );_gce ._ebce .Add1 (_gccf );_gce ._fef =_dcaf ;};};func _aeea (_fddd [][]_gf .Point )_gfe .Path {var _bcbe _gfe .Path ;for _ ,_afdg :=range _fddd {var _bgee _ab .Point26_6 ;for _bdb ,_ddbd :=range _afdg {_bede :=_gbab (_ddbd );if _bdb ==0{_bcbe .Start (_bede );}else {_gdeb :=_bede .X -_bgee .X ;_cgd :=_bede .Y -_bgee .Y ;if _gdeb < 0{_gdeb =-_gdeb ;};if _cgd < 0{_cgd =-_cgd ;};if _gdeb +_cgd > 8{_bcbe .Add1 (_bede );};};_bgee =_bede ;};};return _bcbe ;};func NewContext (width ,height int )*Context {return NewContextForRGBA (_da .NewRGBA (_da .Rect (0,0,width ,height )));};func (_gdb *Context )DrawStringAnchored (s string ,x ,y ,ax ,ay float64 ){_afb ,_cge :=_gdb .MeasureString (s );x -=ax *_afb ;y +=ay *_cge ;if _gdb ._dcb ==nil {_gdb .drawString (_gdb ._gda ,s ,x ,y );}else {_cfe :=_da .NewRGBA (_da .Rect (0,0,_gdb ._bbg ,_gdb ._cfa ));_gdb .drawString (_cfe ,s ,x ,y );_ea .DrawMask (_gdb ._gda ,_gdb ._gda .Bounds (),_cfe ,_da .ZP ,_gdb ._dcb ,_da .ZP ,_ea .Over );};};func (_gea *Context )drawRegularPolygon (_ede int ,_cdb ,_afcd ,_gcb ,_bgcc float64 ){_gba :=2*_g .Pi /float64 (_ede );_bgcc -=_g .Pi /2;if _ede %2==0{_bgcc +=_gba /2;};_gea .NewSubPath ();for _gceb :=0;_gceb < _ede ;_gceb ++{_aeed :=_bgcc +_gba *float64 (_gceb );_gea .LineTo (_cdb +_gcb *_g .Cos (_aeed ),_afcd +_gcb *_g .Sin (_aeed ));};_gea .ClosePath ();};func (_cada *Context )DrawImage (im _da .Image ,x ,y int ){_cada .DrawImageAnchored (im ,x ,y ,0,0)}; |