mirror of
https://github.com/unidoc/unipdf.git
synced 2025-04-29 13:48:54 +08:00
105 lines
27 KiB
Go
105 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 (_fd "errors";_fg "fmt";_bed "github.com/golang/freetype/raster";_be "github.com/unidoc/unipdf/v3/common";_fe "github.com/unidoc/unipdf/v3/internal/transform";_c "github.com/unidoc/unipdf/v3/render/internal/context";_cg "golang.org/x/image/draw";
|
|
_gg "golang.org/x/image/font";_fc "golang.org/x/image/math/f64";_a "golang.org/x/image/math/fixed";_d "image";_b "image/color";_ge "image/draw";_ff "math";_g "sort";_fb "strings";);func (_afaf *Context )drawString (_fded string ,_eea _gg .Face ,_dab ,_faa float64 ){_bff :=&_gg .Drawer {Src :_d .NewUniform (_afaf ._eee ),Face :_eea ,Dot :_ddcd (_fe .NewPoint (_dab ,_faa ))};
|
|
_fbfg :=rune (-1);for _ ,_faad :=range _fded {if _fbfg >=0{_bff .Dot .X +=_bff .Face .Kern (_fbfg ,_faad );};_eaa ,_gefge ,_dfe ,_egcc ,_bbf :=_bff .Face .Glyph (_bff .Dot ,_faad );if !_bbf {continue ;};_cac :=_eaa .Sub (_eaa .Min );_dbb :=_d .NewRGBA (_cac );
|
|
_cg .DrawMask (_dbb ,_cac ,_bff .Src ,_d .Point {},_gefge ,_dfe ,_cg .Over );var _ae *_cg .Options ;if _afaf ._ggg !=nil {_ae =&_cg .Options {DstMask :_afaf ._ggg ,DstMaskP :_d .Point {}};};_aaf :=_afaf ._gegd .Clone ().Translate (float64 (_eaa .Min .X ),float64 (_eaa .Min .Y ));
|
|
_cadc :=_fc .Aff3 {_aaf [0],_aaf [3],_aaf [6],_aaf [1],_aaf [4],_aaf [7]};_cg .BiLinear .Transform (_afaf ._dcfb ,_cadc ,_dbb ,_cac ,_cg .Over ,_ae );_bff .Dot .X +=_egcc ;_fbfg =_faad ;};};var (_bbe =_daa (_b .White );_cga =_daa (_b .Black ););func (_edb *Context )SetMask (mask *_d .Alpha )error {if mask .Bounds ().Size ()!=_edb ._dcfb .Bounds ().Size (){return _fd .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");
|
|
};_edb ._ggg =mask ;return nil ;};func (_cfcf *Context )ClearPath (){_cfcf ._ed .Clear ();_cfcf ._aab .Clear ();_cfcf ._ffe =false };func (_dgb *solidPattern )ColorAt (x ,y int )_b .Color {return _dgb ._aceg };func _eafe (_cbbg string )(_dea ,_ead ,_dbec ,_gdeg int ){_cbbg =_fb .TrimPrefix (_cbbg ,"\u0023");
|
|
_gdeg =255;if len (_cbbg )==3{_beeb :="\u00251\u0078\u0025\u0031\u0078\u0025\u0031x";_fg .Sscanf (_cbbg ,_beeb ,&_dea ,&_ead ,&_dbec );_dea |=_dea <<4;_ead |=_ead <<4;_dbec |=_dbec <<4;};if len (_cbbg )==6{_defg :="\u0025\u0030\u0032x\u0025\u0030\u0032\u0078\u0025\u0030\u0032\u0078";
|
|
_fg .Sscanf (_cbbg ,_defg ,&_dea ,&_ead ,&_dbec );};if len (_cbbg )==8{_acgc :="\u0025\u00302\u0078\u0025\u00302\u0078\u0025\u0030\u0032\u0078\u0025\u0030\u0032\u0078";_fg .Sscanf (_cbbg ,_acgc ,&_dea ,&_ead ,&_dbec ,&_gdeg );};return ;};func _gcbd (_eead _bed .Path ,_addc []float64 ,_gae float64 )_bed .Path {return _egdb (_ccae (_cff (_eead ),_addc ,_gae ));
|
|
};func (_gbbb *Context )Fill (){_gbbb .FillPreserve ();_gbbb .ClearPath ()};func (_gba *Context )SetStrokeStyle (pattern _c .Pattern ){_gba ._geg =pattern };func (_effd *Context )SetMatrix (m _fe .Matrix ){_effd ._gegd =m };func (_gdgg *Context )Clear (){_ffeb :=_d .NewUniform (_gdgg ._eee );
|
|
_cg .Draw (_gdgg ._dcfb ,_gdgg ._dcfb .Bounds (),_ffeb ,_d .Point {},_cg .Src );};func _ee (_fea ,_eg ,_gc ,_cfb ,_da ,_bee float64 )[]_fe .Point {_fdg :=(_ff .Hypot (_gc -_fea ,_cfb -_eg )+_ff .Hypot (_da -_gc ,_bee -_cfb ));_cd :=int (_fdg +0.5);if _cd < 4{_cd =4;
|
|
};_fcg :=float64 (_cd )-1;_fcgg :=make ([]_fe .Point ,_cd );for _af :=0;_af < _cd ;_af ++{_df :=float64 (_af )/_fcg ;_ea ,_bce :=_bc (_fea ,_eg ,_gc ,_cfb ,_da ,_bee ,_df );_fcgg [_af ]=_fe .NewPoint (_ea ,_bce );};return _fcgg ;};func (_gaa *Context )DrawArc (x ,y ,r ,angle1 ,angle2 float64 ){_gaa .DrawEllipticalArc (x ,y ,r ,r ,angle1 ,angle2 );
|
|
};func (_aae *Context )capper ()_bed .Capper {switch _aae ._dd {case _c .LineCapButt :return _bed .ButtCapper ;case _c .LineCapRound :return _bed .RoundCapper ;case _c .LineCapSquare :return _bed .SquareCapper ;};return nil ;};func (_ebgb *Context )DrawImage (im _d .Image ,x ,y int ){_ebgb .DrawImageAnchored (im ,x ,y ,0,0)};
|
|
func (_fbfa *Context )RotateAbout (angle ,x ,y float64 ){_fbfa .Translate (x ,y );_fbfa .Rotate (angle );_fbfa .Translate (-x ,-y );};func (_baf *Context )MeasureString (s string ,face _gg .Face )(_ccbe ,_cab float64 ){_bfd :=&_gg .Drawer {Face :face };
|
|
_cae :=_bfd .MeasureString (s );return float64 (_cae >>6),_baf ._eba .Tf .Size ;};func (_cbb *Context )LineWidth ()float64 {return _cbb ._bg };func (_fdfg *Context )Clip (){_fdfg .ClipPreserve ();_fdfg .ClearPath ()};func (_bgcb *Context )ShearAbout (sx ,sy ,x ,y float64 ){_bgcb .Translate (x ,y );
|
|
_bgcb .Shear (sx ,sy );_bgcb .Translate (-x ,-y );};func (_gdc *Context )Scale (x ,y float64 ){_gdc ._gegd =_gdc ._gegd .Scale (x ,y )};func _ccae (_acac [][]_fe .Point ,_geef []float64 ,_cbe float64 )[][]_fe .Point {var _fbd [][]_fe .Point ;if len (_geef )==0{return _acac ;
|
|
};if len (_geef )==1{_geef =append (_geef ,_geef [0]);};for _ ,_cafa :=range _acac {if len (_cafa )< 2{continue ;};_cfa :=_cafa [0];_gdcf :=1;_ccf :=0;_gece :=0.0;if _cbe !=0{var _dacc float64 ;for _ ,_ebgf :=range _geef {_dacc +=_ebgf ;};_cbe =_ff .Mod (_cbe ,_dacc );
|
|
if _cbe < 0{_cbe +=_dacc ;};for _bbd ,_fcad :=range _geef {_cbe -=_fcad ;if _cbe < 0{_ccf =_bbd ;_gece =_fcad +_cbe ;break ;};};};var _fbbc []_fe .Point ;_fbbc =append (_fbbc ,_cfa );for _gdcf < len (_cafa ){_bbed :=_geef [_ccf ];_ace :=_cafa [_gdcf ];
|
|
_dgc :=_cfa .Distance (_ace );_ecfg :=_bbed -_gece ;if _dgc > _ecfg {_eef :=_ecfg /_dgc ;_dga :=_cfa .Interpolate (_ace ,_eef );_fbbc =append (_fbbc ,_dga );if _ccf %2==0&&len (_fbbc )> 1{_fbd =append (_fbd ,_fbbc );};_fbbc =nil ;_fbbc =append (_fbbc ,_dga );
|
|
_gece =0;_cfa =_dga ;_ccf =(_ccf +1)%len (_geef );}else {_fbbc =append (_fbbc ,_ace );_cfa =_ace ;_gece +=_dgc ;_gdcf ++;};};if _ccf %2==0&&len (_fbbc )> 1{_fbd =append (_fbd ,_fbbc );};};return _fbd ;};func NewContext (width ,height int )*Context {return NewContextForRGBA (_d .NewRGBA (_d .Rect (0,0,width ,height )));
|
|
};func (_cea *radialGradient )AddColorStop (offset float64 ,color _b .Color ){_cea ._ffcf =append (_cea ._ffcf ,stop {_cgb :offset ,_eae :color });_g .Sort (_cea ._ffcf );};func (_cce *Context )SetLineWidth (lineWidth float64 ){_cce ._bg =lineWidth };func (_aba *Context )SetPixel (x ,y int ){_aba ._dcfb .Set (x ,y ,_aba ._eee )};
|
|
func (_ddg *linearGradient )ColorAt (x ,y int )_b .Color {if len (_ddg ._cgba )==0{return _b .Transparent ;};_feda ,_gbeg :=float64 (x ),float64 (y );_cef ,_dfc ,_cee ,_feef :=_ddg ._dfa ,_ddg ._dgg ,_ddg ._ecge ,_ddg ._fdca ;_ddd ,_eeca :=_cee -_cef ,_feef -_dfc ;
|
|
if _eeca ==0&&_ddd !=0{return _ebb ((_feda -_cef )/_ddd ,_ddg ._cgba );};if _ddd ==0&&_eeca !=0{return _ebb ((_gbeg -_dfc )/_eeca ,_ddg ._cgba );};_aca :=_ddd *(_feda -_cef )+_eeca *(_gbeg -_dfc );if _aca < 0{return _ddg ._cgba [0]._eae ;};_bcd :=_ff .Hypot (_ddd ,_eeca );
|
|
_fcb :=((_feda -_cef )*-_eeca +(_gbeg -_dfc )*_ddd )/(_bcd *_bcd );_add ,_egf :=_cef +_fcb *-_eeca ,_dfc +_fcb *_ddd ;_bec :=_ff .Hypot (_feda -_add ,_gbeg -_egf )/_bcd ;return _ebb (_bec ,_ddg ._cgba );};type circle struct{_adda ,_ged ,_gega float64 };
|
|
func (_ebd *Context )StrokePreserve (){var _dcg _bed .Painter ;if _ebd ._ggg ==nil {if _dacg ,_fca :=_ebd ._geg .(*solidPattern );_fca {_eec :=_bed .NewRGBAPainter (_ebd ._dcfb );_eec .SetColor (_dacg ._aceg );_dcg =_eec ;};};if _dcg ==nil {_dcg =_eaaf (_ebd ._dcfb ,_ebd ._ggg ,_ebd ._geg );
|
|
};_ebd .stroke (_dcg );};func (_fbeb stops )Swap (i ,j int ){_fbeb [i ],_fbeb [j ]=_fbeb [j ],_fbeb [i ]};func _daa (_dae _b .Color )_c .Pattern {return &solidPattern {_aceg :_dae }};func (_aag *Context )Height ()int {return _aag ._dff };func _fdb (_fgf float64 )_a .Int26_6 {return _a .Int26_6 (_fgf *64)};
|
|
func (_gcb stops )Len ()int {return len (_gcb )};func (_gcc *Context )NewSubPath (){if _gcc ._ffe {_gcc ._aab .Add1 (_ddcd (_gcc ._eff ));};_gcc ._ffe =false ;};type linearGradient struct{_dfa ,_dgg ,_ecge ,_fdca float64 ;_cgba stops ;};func (_gde *Context )DrawRectangle (x ,y ,w ,h float64 ){_gde .NewSubPath ();
|
|
_gde .MoveTo (x ,y );_gde .LineTo (x +w ,y );_gde .LineTo (x +w ,y +h );_gde .LineTo (x ,y +h );_gde .ClosePath ();};func (_eda *Context )SetRGB (r ,g ,b float64 ){_eda .SetRGBA (r ,g ,b ,1)};func (_gdadf *Context )Identity (){_gdadf ._gegd =_fe .IdentityMatrix ()};
|
|
func (_efa *Context )joiner ()_bed .Joiner {switch _efa ._gf {case _c .LineJoinBevel :return _bed .BevelJoiner ;case _c .LineJoinRound :return _bed .RoundJoiner ;};return nil ;};func (_ffed *Context )InvertMask (){if _ffed ._ggg ==nil {_ffed ._ggg =_d .NewAlpha (_ffed ._dcfb .Bounds ());
|
|
}else {for _de ,_adf :=range _ffed ._ggg .Pix {_ffed ._ggg .Pix [_de ]=255-_adf ;};};};type stops []stop ;func (_bfe *Context )SetStrokeRGBA (r ,g ,b ,a float64 ){_bde :=_b .NRGBA {uint8 (r *255),uint8 (g *255),uint8 (b *255),uint8 (a *255)};_bfe ._geg =_daa (_bde );
|
|
};func (_fdcd *Context )Matrix ()_fe .Matrix {return _fdcd ._gegd };func (_fga *Context )DrawImageAnchored (im _d .Image ,x ,y int ,ax ,ay float64 ){_fcef :=im .Bounds ().Size ();x -=int (ax *float64 (_fcef .X ));y -=int (ay *float64 (_fcef .Y ));_dbd :=_cg .BiLinear ;
|
|
_daf :=_fga ._gegd .Clone ().Translate (float64 (x ),float64 (y ));_feaeg :=_fc .Aff3 {_daf [0],_daf [3],_daf [6],_daf [1],_daf [4],_daf [7]};if _fga ._ggg ==nil {_dbd .Transform (_fga ._dcfb ,_feaeg ,im ,im .Bounds (),_cg .Over ,nil );}else {_dbd .Transform (_fga ._dcfb ,_feaeg ,im ,im .Bounds (),_cg .Over ,&_cg .Options {DstMask :_fga ._ggg ,DstMaskP :_d .Point {}});
|
|
};};func (_gccc *patternPainter )Paint (ss []_bed .Span ,done bool ){_acg :=_gccc ._dgaa .Bounds ();for _ ,_aff :=range ss {if _aff .Y < _acg .Min .Y {continue ;};if _aff .Y >=_acg .Max .Y {return ;};if _aff .X0 < _acg .Min .X {_aff .X0 =_acg .Min .X ;
|
|
};if _aff .X1 > _acg .Max .X {_aff .X1 =_acg .Max .X ;};if _aff .X0 >=_aff .X1 {continue ;};const _dbbd =1<<16-1;_deg :=_aff .Y -_gccc ._dgaa .Rect .Min .Y ;_ebcc :=_aff .X0 -_gccc ._dgaa .Rect .Min .X ;_aacd :=(_aff .Y -_gccc ._dgaa .Rect .Min .Y )*_gccc ._dgaa .Stride +(_aff .X0 -_gccc ._dgaa .Rect .Min .X )*4;
|
|
_bffa :=_aacd +(_aff .X1 -_aff .X0 )*4;for _gag ,_afaa :=_aacd ,_ebcc ;_gag < _bffa ;_gag ,_afaa =_gag +4,_afaa +1{_gbfb :=_aff .Alpha ;if _gccc ._ggbg !=nil {_gbfb =_gbfb *uint32 (_gccc ._ggbg .AlphaAt (_afaa ,_deg ).A )/255;if _gbfb ==0{continue ;};};
|
|
_ccef :=_gccc ._beaba .ColorAt (_afaa ,_deg );_dafg ,_eaf ,_adc ,_ece :=_ccef .RGBA ();_cafaf :=uint32 (_gccc ._dgaa .Pix [_gag +0]);_gdca :=uint32 (_gccc ._dgaa .Pix [_gag +1]);_gga :=uint32 (_gccc ._dgaa .Pix [_gag +2]);_egab :=uint32 (_gccc ._dgaa .Pix [_gag +3]);
|
|
_gaed :=(_dbbd -(_ece *_gbfb /_dbbd ))*0x101;_gccc ._dgaa .Pix [_gag +0]=uint8 ((_cafaf *_gaed +_dafg *_gbfb )/_dbbd >>8);_gccc ._dgaa .Pix [_gag +1]=uint8 ((_gdca *_gaed +_eaf *_gbfb )/_dbbd >>8);_gccc ._dgaa .Pix [_gag +2]=uint8 ((_gga *_gaed +_adc *_gbfb )/_dbbd >>8);
|
|
_gccc ._dgaa .Pix [_gag +3]=uint8 ((_egab *_gaed +_ece *_gbfb )/_dbbd >>8);};};};func (_gbae *Context )ClipPreserve (){_ccbff :=_d .NewAlpha (_d .Rect (0,0,_gbae ._ccbf ,_gbae ._dff ));_ccc :=_bed .NewAlphaOverPainter (_ccbff );_gbae .fill (_ccc );if _gbae ._ggg ==nil {_gbae ._ggg =_ccbff ;
|
|
}else {_bdef :=_d .NewAlpha (_d .Rect (0,0,_gbae ._ccbf ,_gbae ._dff ));_cg .DrawMask (_bdef ,_bdef .Bounds (),_ccbff ,_d .Point {},_gbae ._ggg ,_d .Point {},_cg .Over );_gbae ._ggg =_bdef ;};};func (_dcfd *Context )SetRGBA (r ,g ,b ,a float64 ){_dcfd ._eee =_b .NRGBA {uint8 (r *255),uint8 (g *255),uint8 (b *255),uint8 (a *255)};
|
|
_dcfd .setFillAndStrokeColor (_dcfd ._eee );};func (_ceg *Context )SetLineCap (lineCap _c .LineCap ){_ceg ._dd =lineCap };func (_dee *Context )DrawEllipse (x ,y ,rx ,ry float64 ){_dee .NewSubPath ();_dee .DrawEllipticalArc (x ,y ,rx ,ry ,0,2*_ff .Pi );
|
|
_dee .ClosePath ();};func (_dbc *Context )SetColor (c _b .Color ){_dbc .setFillAndStrokeColor (c )};func (_acc stops )Less (i ,j int )bool {return _acc [i ]._cgb < _acc [j ]._cgb };func (_bba *Context )DrawEllipticalArc (x ,y ,rx ,ry ,angle1 ,angle2 float64 ){const _acf =16;
|
|
for _dcc :=0;_dcc < _acf ;_dcc ++{_dbg :=float64 (_dcc +0)/_acf ;_bgc :=float64 (_dcc +1)/_acf ;_def :=angle1 +(angle2 -angle1 )*_dbg ;_dge :=angle1 +(angle2 -angle1 )*_bgc ;_abaa :=x +rx *_ff .Cos (_def );_cfbd :=y +ry *_ff .Sin (_def );_beda :=x +rx *_ff .Cos ((_def +_dge )/2);
|
|
_abg :=y +ry *_ff .Sin ((_def +_dge )/2);_bebb :=x +rx *_ff .Cos (_dge );_gfc :=y +ry *_ff .Sin (_dge );_bag :=2*_beda -_abaa /2-_bebb /2;_ffg :=2*_abg -_cfbd /2-_gfc /2;if _dcc ==0{if _bba ._ffe {_bba .LineTo (_abaa ,_cfbd );}else {_bba .MoveTo (_abaa ,_cfbd );
|
|
};};_bba .QuadraticTo (_bag ,_ffg ,_bebb ,_gfc );};};func _cff (_gbef _bed .Path )[][]_fe .Point {var _agf [][]_fe .Point ;var _afc []_fe .Point ;var _bfce ,_fgeg float64 ;for _cba :=0;_cba < len (_gbef );{switch _gbef [_cba ]{case 0:if len (_afc )> 0{_agf =append (_agf ,_afc );
|
|
_afc =nil ;};_fec :=_gfgc (_gbef [_cba +1]);_cdeg :=_gfgc (_gbef [_cba +2]);_afc =append (_afc ,_fe .NewPoint (_fec ,_cdeg ));_bfce ,_fgeg =_fec ,_cdeg ;_cba +=4;case 1:_gfcc :=_gfgc (_gbef [_cba +1]);_feb :=_gfgc (_gbef [_cba +2]);_afc =append (_afc ,_fe .NewPoint (_gfcc ,_feb ));
|
|
_bfce ,_fgeg =_gfcc ,_feb ;_cba +=4;case 2:_ccaa :=_gfgc (_gbef [_cba +1]);_ffcd :=_gfgc (_gbef [_cba +2]);_deee :=_gfgc (_gbef [_cba +3]);_bdd :=_gfgc (_gbef [_cba +4]);_dfed :=_ee (_bfce ,_fgeg ,_ccaa ,_ffcd ,_deee ,_bdd );_afc =append (_afc ,_dfed ...);
|
|
_bfce ,_fgeg =_deee ,_bdd ;_cba +=6;case 3:_dcfdd :=_gfgc (_gbef [_cba +1]);_dbf :=_gfgc (_gbef [_cba +2]);_dbbe :=_gfgc (_gbef [_cba +3]);_beab :=_gfgc (_gbef [_cba +4]);_bbcg :=_gfgc (_gbef [_cba +5]);_dde :=_gfgc (_gbef [_cba +6]);_bggc :=_gec (_bfce ,_fgeg ,_dcfdd ,_dbf ,_dbbe ,_beab ,_bbcg ,_dde );
|
|
_afc =append (_afc ,_bggc ...);_bfce ,_fgeg =_bbcg ,_dde ;_cba +=8;default:_be .Log .Debug ("\u0057\u0041\u0052\u004e: \u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0070\u0061\u0074\u0068\u003a\u0020%\u0076",_gbef );return _agf ;};};if len (_afc )> 0{_agf =append (_agf ,_afc );
|
|
};return _agf ;};type radialGradient struct{_eeed ,_fdff ,_aee circle ;_bebe ,_bcc float64 ;_bae float64 ;_ffcf stops ;};func _dfb (_ggb ,_bga _b .Color ,_bbeg float64 )_b .Color {_bgad ,_edc ,_fgb ,_aaba :=_ggb .RGBA ();_faab ,_fac ,_dfd ,_gbce :=_bga .RGBA ();
|
|
return _b .RGBA {_bfcc (_bgad ,_faab ,_bbeg ),_bfcc (_edc ,_fac ,_bbeg ),_bfcc (_fgb ,_dfd ,_bbeg ),_bfcc (_aaba ,_gbce ,_bbeg )};};func _gdfb (_eagg _d .Image )*_d .RGBA {_egb :=_eagg .Bounds ();_aec :=_d .NewRGBA (_egb );_ge .Draw (_aec ,_egb ,_eagg ,_egb .Min ,_ge .Src );
|
|
return _aec ;};func (_edbc *Context )Pop (){_eagb :=*_edbc ;_dca :=_edbc ._gce ;_dacd :=_dca [len (_dca )-1];*_edbc =*_dacd ;_edbc ._ed =_eagb ._ed ;_edbc ._aab =_eagb ._aab ;_edbc ._eff =_eagb ._eff ;_edbc ._cfc =_eagb ._cfc ;_edbc ._ffe =_eagb ._ffe ;
|
|
};func (_gge *Context )TextState ()*_c .TextState {return &_gge ._eba };func (_ebc *Context )SetDashOffset (offset float64 ){_ebc ._gecf =offset };func (_agaa *Context )SetDash (dashes ...float64 ){_agaa ._egga =dashes };func (_feg *Context )Rotate (angle float64 ){_feg ._gegd =_feg ._gegd .Rotate (angle )};
|
|
func _bfcc (_ceee ,_eaaa uint32 ,_acb float64 )uint8 {return uint8 (int32 (float64 (_ceee )*(1.0-_acb )+float64 (_eaaa )*_acb )>>8);};func (_bcgf *Context )DrawLine (x1 ,y1 ,x2 ,y2 float64 ){_bcgf .MoveTo (x1 ,y1 );_bcgf .LineTo (x2 ,y2 )};func (_bbg *Context )Image ()_d .Image {return _bbg ._dcfb };
|
|
type Context struct{_ccbf int ;_dff int ;_eca *_bed .Rasterizer ;_dcfb *_d .RGBA ;_ggg *_d .Alpha ;_eee _b .Color ;_cfgc _c .Pattern ;_geg _c .Pattern ;_ed _bed .Path ;_aab _bed .Path ;_eff _fe .Point ;_cfc _fe .Point ;_ffe bool ;_egga []float64 ;_gecf float64 ;
|
|
_bg float64 ;_dd _c .LineCap ;_gf _c .LineJoin ;_efe _c .FillRule ;_gegd _fe .Matrix ;_eba _c .TextState ;_gce []*Context ;};func (_deeg *Context )Translate (x ,y float64 ){_deeg ._gegd =_deeg ._gegd .Translate (x ,y )};func (_gfb *Context )ScaleAbout (sx ,sy ,x ,y float64 ){_gfb .Translate (x ,y );
|
|
_gfb .Scale (sx ,sy );_gfb .Translate (-x ,-y );};func _fdfe (_ecf ,_cbgd ,_bfga ,_fdfd ,_dfgd ,_bedae float64 )_c .Gradient {_geea :=circle {_ecf ,_cbgd ,_bfga };_ebe :=circle {_fdfd ,_dfgd ,_bedae };_ceec :=circle {_fdfd -_ecf ,_dfgd -_cbgd ,_bedae -_bfga };
|
|
_cafg :=_gbff (_ceec ._adda ,_ceec ._ged ,-_ceec ._gega ,_ceec ._adda ,_ceec ._ged ,_ceec ._gega );var _fcaf float64 ;if _cafg !=0{_fcaf =1.0/_cafg ;};_bfae :=-_geea ._gega ;_caee :=&radialGradient {_eeed :_geea ,_fdff :_ebe ,_aee :_ceec ,_bebe :_cafg ,_bcc :_fcaf ,_bae :_bfae };
|
|
return _caee ;};func _ebb (_acfg float64 ,_cfe stops )_b .Color {if _acfg <=0.0||len (_cfe )==1{return _cfe [0]._eae ;};_faf :=_cfe [len (_cfe )-1];if _acfg >=_faf ._cgb {return _faf ._eae ;};for _abc ,_dfgdf :=range _cfe [1:]{if _acfg < _dfgdf ._cgb {_acfg =(_acfg -_cfe [_abc ]._cgb )/(_dfgdf ._cgb -_cfe [_abc ]._cgb );
|
|
return _dfb (_cfe [_abc ]._eae ,_dfgdf ._eae ,_acfg );};};return _faf ._eae ;};func (_fdgc *radialGradient )ColorAt (x ,y int )_b .Color {if len (_fdgc ._ffcf )==0{return _b .Transparent ;};_edf ,_gecff :=float64 (x )+0.5-_fdgc ._eeed ._adda ,float64 (y )+0.5-_fdgc ._eeed ._ged ;
|
|
_acfc :=_gbff (_edf ,_gecff ,_fdgc ._eeed ._gega ,_fdgc ._aee ._adda ,_fdgc ._aee ._ged ,_fdgc ._aee ._gega );_bffb :=_gbff (_edf ,_gecff ,-_fdgc ._eeed ._gega ,_edf ,_gecff ,_fdgc ._eeed ._gega );if _fdgc ._bebe ==0{if _acfc ==0{return _b .Transparent ;
|
|
};_feag :=0.5*_bffb /_acfc ;if _feag *_fdgc ._aee ._gega >=_fdgc ._bae {return _ebb (_feag ,_fdgc ._ffcf );};return _b .Transparent ;};_gcef :=_gbff (_acfc ,_fdgc ._bebe ,0,_acfc ,-_bffb ,0);if _gcef >=0{_fcab :=_ff .Sqrt (_gcef );_gbc :=(_acfc +_fcab )*_fdgc ._bcc ;
|
|
_aacg :=(_acfc -_fcab )*_fdgc ._bcc ;if _gbc *_fdgc ._aee ._gega >=_fdgc ._bae {return _ebb (_gbc ,_fdgc ._ffcf );}else if _aacg *_fdgc ._aee ._gega >=_fdgc ._bae {return _ebb (_aacg ,_fdgc ._ffcf );};};return _b .Transparent ;};func (_bbc *Context )Shear (x ,y float64 ){_bbc ._gegd .Shear (x ,y )};
|
|
func (_fba *Context )DrawCircle (x ,y ,r float64 ){_fba .NewSubPath ();_fba .DrawEllipticalArc (x ,y ,r ,r ,0,2*_ff .Pi );_fba .ClosePath ();};func (_gbe *Context )Transform (x ,y float64 )(_aaae ,_abb float64 ){return _gbe ._gegd .Transform (x ,y )};type stop struct{_cgb float64 ;
|
|
_eae _b .Color ;};func (_eac *Context )SetRGB255 (r ,g ,b int ){_eac .SetRGBA255 (r ,g ,b ,255)};func (_bgbc *Context )DrawString (s string ,face _gg .Face ,x ,y float64 ){_bgbc .DrawStringAnchored (s ,face ,x ,y ,0,0);};func (_gbec *linearGradient )AddColorStop (offset float64 ,color _b .Color ){_gbec ._cgba =append (_gbec ._cgba ,stop {_cgb :offset ,_eae :color });
|
|
_g .Sort (_gbec ._cgba );};func (_afca *surfacePattern )ColorAt (x ,y int )_b .Color {_agb :=_afca ._fgga .Bounds ();switch _afca ._aeea {case _ada :if y >=_agb .Dy (){return _b .Transparent ;};case _gfgg :if x >=_agb .Dx (){return _b .Transparent ;};case _bdf :if x >=_agb .Dx ()||y >=_agb .Dy (){return _b .Transparent ;
|
|
};};x =x %_agb .Dx ()+_agb .Min .X ;y =y %_agb .Dy ()+_agb .Min .Y ;return _afca ._fgga .At (x ,y );};func (_cccg *Context )Push (){_caf :=*_cccg ;_cccg ._gce =append (_cccg ._gce ,&_caf )};func _cbf (_eeg float64 )float64 {return _eeg *_ff .Pi /180};func (_ceb *Context )MoveTo (x ,y float64 ){if _ceb ._ffe {_ceb ._aab .Add1 (_ddcd (_ceb ._eff ));
|
|
};x ,y =_ceb .Transform (x ,y );_ebf :=_fe .NewPoint (x ,y );_dfg :=_ddcd (_ebf );_ceb ._ed .Start (_dfg );_ceb ._aab .Start (_dfg );_ceb ._eff =_ebf ;_ceb ._cfc =_ebf ;_ceb ._ffe =true ;};func (_gfg *Context )SetLineJoin (lineJoin _c .LineJoin ){_gfg ._gf =lineJoin };
|
|
type patternPainter struct{_dgaa *_d .RGBA ;_ggbg *_d .Alpha ;_beaba _c .Pattern ;};type surfacePattern struct{_fgga _d .Image ;_aeea repeatOp ;};func _gd (_gee ,_gac ,_ab ,_bea ,_gda ,_eag ,_gbb ,_eb ,_bd float64 )(_fgd ,_cde float64 ){_ccb :=1-_bd ;_db :=_ccb *_ccb *_ccb ;
|
|
_gca :=3*_ccb *_ccb *_bd ;_gcg :=3*_ccb *_bd *_bd ;_ba :=_bd *_bd *_bd ;_fgd =_db *_gee +_gca *_ab +_gcg *_gda +_ba *_gbb ;_cde =_db *_gac +_gca *_bea +_gcg *_eag +_ba *_eb ;return ;};func (_agd *Context )SetFillRule (fillRule _c .FillRule ){_agd ._efe =fillRule };
|
|
func (_fbfb *Context )drawRegularPolygon (_gbf int ,_bgb ,_ade ,_bgcd ,_efc float64 ){_bdbe :=2*_ff .Pi /float64 (_gbf );_efc -=_ff .Pi /2;if _gbf %2==0{_efc +=_bdbe /2;};_fbfb .NewSubPath ();for _dedg :=0;_dedg < _gbf ;_dedg ++{_ege :=_efc +_bdbe *float64 (_dedg );
|
|
_fbfb .LineTo (_bgb +_bgcd *_ff .Cos (_ege ),_ade +_bgcd *_ff .Sin (_ege ));};_fbfb .ClosePath ();};func (_gcf *Context )stroke (_ebgd _bed .Painter ){_fce :=_gcf ._ed ;if len (_gcf ._egga )> 0{_fce =_gcbd (_fce ,_gcf ._egga ,_gcf ._gecf );}else {_fce =_egdb (_cff (_fce ));
|
|
};_afag :=_gcf ._eca ;_afag .UseNonZeroWinding =true ;_afag .Clear ();_fcea :=(_gcf ._gegd .ScalingFactorX ()+_gcf ._gegd .ScalingFactorY ())/2;_afag .AddStroke (_fce ,_fdb (_gcf ._bg *_fcea ),_gcf .capper (),_gcf .joiner ());_afag .Rasterize (_ebgd );
|
|
};func _ddcd (_ggbc _fe .Point )_a .Point26_6 {return _a .Point26_6 {X :_fdb (_ggbc .X ),Y :_fdb (_ggbc .Y )}};func (_dac *Context )QuadraticTo (x1 ,y1 ,x2 ,y2 float64 ){if !_dac ._ffe {_dac .MoveTo (x1 ,y1 );};x1 ,y1 =_dac .Transform (x1 ,y1 );x2 ,y2 =_dac .Transform (x2 ,y2 );
|
|
_fbf :=_fe .NewPoint (x1 ,y1 );_ebg :=_fe .NewPoint (x2 ,y2 );_bfc :=_ddcd (_fbf );_effg :=_ddcd (_ebg );_dac ._ed .Add2 (_bfc ,_effg );_dac ._aab .Add2 (_bfc ,_effg );_dac ._cfc =_ebg ;};func _gbff (_eeb ,_cdd ,_aac ,_afb ,_cdb ,_ceba float64 )float64 {return _eeb *_afb +_cdd *_cdb +_aac *_ceba ;
|
|
};func _eaaf (_ecfc *_d .RGBA ,_afae *_d .Alpha ,_abd _c .Pattern )*patternPainter {return &patternPainter {_ecfc ,_afae ,_abd };};func (_cad *Context )DrawRoundedRectangle (x ,y ,w ,h ,r float64 ){_bfa ,_ffedd ,_gdad ,_fff :=x ,x +r ,x +w -r ,x +w ;_ggf ,_bfg ,_bacf ,_ded :=y ,y +r ,y +h -r ,y +h ;
|
|
_cad .NewSubPath ();_cad .MoveTo (_ffedd ,_ggf );_cad .LineTo (_gdad ,_ggf );_cad .DrawArc (_gdad ,_bfg ,r ,_cbf (270),_cbf (360));_cad .LineTo (_fff ,_bacf );_cad .DrawArc (_gdad ,_bacf ,r ,_cbf (0),_cbf (90));_cad .LineTo (_ffedd ,_ded );_cad .DrawArc (_ffedd ,_bacf ,r ,_cbf (90),_cbf (180));
|
|
_cad .LineTo (_bfa ,_bfg );_cad .DrawArc (_ffedd ,_bfg ,r ,_cbf (180),_cbf (270));_cad .ClosePath ();};func _egdb (_faca [][]_fe .Point )_bed .Path {var _ced _bed .Path ;for _ ,_dfdc :=range _faca {var _aef _a .Point26_6 ;for _bbab ,_aeb :=range _dfdc {_cace :=_ddcd (_aeb );
|
|
if _bbab ==0{_ced .Start (_cace );}else {_bbabe :=_cace .X -_aef .X ;_gea :=_cace .Y -_aef .Y ;if _bbabe < 0{_bbabe =-_bbabe ;};if _gea < 0{_gea =-_gea ;};if _bbabe +_gea > 8{_ced .Add1 (_cace );};};_aef =_cace ;};};return _ced ;};func (_gefg *Context )Stroke (){_gefg .StrokePreserve ();
|
|
_gefg .ClearPath ()};func NewContextForImage (im _d .Image )*Context {return NewContextForRGBA (_gdfb (im ))};func (_cfcd *Context )setFillAndStrokeColor (_ega _b .Color ){_cfcd ._eee =_ega ;_cfcd ._cfgc =_daa (_ega );_cfcd ._geg =_daa (_ega );};func (_fge *Context )SetFillStyle (pattern _c .Pattern ){if _gfe ,_gbbc :=pattern .(*solidPattern );
|
|
_gbbc {_fge ._eee =_gfe ._aceg ;};_fge ._cfgc =pattern ;};type solidPattern struct{_aceg _b .Color };func _afg (_dbcf _d .Image ,_dgd repeatOp )_c .Pattern {return &surfacePattern {_fgga :_dbcf ,_aeea :_dgd };};func (_aabf *Context )SetFillRGBA (r ,g ,b ,a float64 ){_bdb :=_b .NRGBA {uint8 (r *255),uint8 (g *255),uint8 (b *255),uint8 (a *255)};
|
|
_aabf ._eee =_bdb ;_aabf ._cfgc =_daa (_bdb );};func (_aaa *Context )SetRGBA255 (r ,g ,b ,a int ){_aaa ._eee =_b .NRGBA {uint8 (r ),uint8 (g ),uint8 (b ),uint8 (a )};_aaa .setFillAndStrokeColor (_aaa ._eee );};func NewContextForRGBA (im *_d .RGBA )*Context {_aga :=im .Bounds ().Size ().X ;
|
|
_eab :=im .Bounds ().Size ().Y ;return &Context {_ccbf :_aga ,_dff :_eab ,_eca :_bed .NewRasterizer (_aga ,_eab ),_dcfb :im ,_eee :_b .Transparent ,_cfgc :_bbe ,_geg :_cga ,_bg :1,_efe :_c .FillRuleWinding ,_gegd :_fe .IdentityMatrix (),_eba :_c .NewTextState ()};
|
|
};func _gfgc (_dcb _a .Int26_6 )float64 {const _ggae ,_aagb =6,1<<6-1;if _dcb >=0{return float64 (_dcb >>_ggae )+float64 (_dcb &_aagb )/64;};_dcb =-_dcb ;if _dcb >=0{return -(float64 (_dcb >>_ggae )+float64 (_dcb &_aagb )/64);};return 0;};func (_bdc *Context )ClosePath (){if _bdc ._ffe {_cbg :=_ddcd (_bdc ._eff );
|
|
_bdc ._ed .Add1 (_cbg );_bdc ._aab .Add1 (_cbg );_bdc ._cfc =_bdc ._eff ;};};func (_fdc *Context )StrokePattern ()_c .Pattern {return _fdc ._geg };func (_fbe *Context )DrawStringAnchored (s string ,face _gg .Face ,x ,y ,ax ,ay float64 ){_cca ,_aed :=_fbe .MeasureString (s ,face );
|
|
_fbe .drawString (s ,face ,x -ax *_cca ,y +ay *_aed );};func _bc (_bf ,_cc ,_cf ,_fda ,_fde ,_bcg ,_fa float64 )(_e ,_dc float64 ){_fgg :=1-_fa ;_ga :=_fgg *_fgg ;_ce :=2*_fgg *_fa ;_gb :=_fa *_fa ;_e =_ga *_bf +_ce *_cf +_gb *_fde ;_dc =_ga *_cc +_ce *_fda +_gb *_bcg ;
|
|
return ;};func (_afef *Context )ResetClip (){_afef ._ggg =nil };func (_ccd *Context )FillPattern ()_c .Pattern {return _ccd ._cfgc };func (_ddc *Context )DrawPoint (x ,y ,r float64 ){_ddc .Push ();_bac ,_eacg :=_ddc .Transform (x ,y );_ddc .Identity ();
|
|
_ddc .DrawCircle (_bac ,_eacg ,r );_ddc .Pop ();};func _ddf (_dgef ,_fdcb ,_gefb ,_gbg float64 )_c .Gradient {_dbgf :=&linearGradient {_dfa :_dgef ,_dgg :_fdcb ,_ecge :_gefb ,_fdca :_gbg };return _dbgf ;};func (_beb *Context )SetHexColor (x string ){_feae ,_ffc ,_ccee ,_fcc :=_eafe (x );
|
|
_beb .SetRGBA255 (_feae ,_ffc ,_ccee ,_fcc );};func (_cgc *Context )CubicTo (x1 ,y1 ,x2 ,y2 ,x3 ,y3 float64 ){if !_cgc ._ffe {_cgc .MoveTo (x1 ,y1 );};_ca ,_fdf :=_cgc ._cfc .X ,_cgc ._cfc .Y ;x1 ,y1 =_cgc .Transform (x1 ,y1 );x2 ,y2 =_cgc .Transform (x2 ,y2 );
|
|
x3 ,y3 =_cgc .Transform (x3 ,y3 );_fee :=_gec (_ca ,_fdf ,x1 ,y1 ,x2 ,y2 ,x3 ,y3 );_afa :=_ddcd (_cgc ._cfc );for _ ,_fad :=range _fee [1:]{_egc :=_ddcd (_fad );if _egc ==_afa {continue ;};_afa =_egc ;_cgc ._ed .Add1 (_egc );_cgc ._aab .Add1 (_egc );_cgc ._cfc =_fad ;
|
|
};};func (_bcf *Context )AsMask ()*_d .Alpha {_egce :=_d .NewAlpha (_bcf ._dcfb .Bounds ());_cg .Draw (_egce ,_bcf ._dcfb .Bounds (),_bcf ._dcfb ,_d .Point {},_cg .Src );return _egce ;};const (_dfcf repeatOp =iota ;_ada ;_gfgg ;_bdf ;);func _gec (_bb ,_fdgf ,_ec ,_ac ,_baa ,_dcf ,_fed ,_fbb float64 )[]_fe .Point {_aa :=(_ff .Hypot (_ec -_bb ,_ac -_fdgf )+_ff .Hypot (_baa -_ec ,_dcf -_ac )+_ff .Hypot (_fed -_baa ,_fbb -_dcf ));
|
|
_cfg :=int (_aa +0.5);if _cfg < 4{_cfg =4;};_egg :=float64 (_cfg )-1;_ef :=make ([]_fe .Point ,_cfg );for _cb :=0;_cb < _cfg ;_cb ++{_gaf :=float64 (_cb )/_egg ;_ag ,_afe :=_gd (_bb ,_fdgf ,_ec ,_ac ,_baa ,_dcf ,_fed ,_fbb ,_gaf );_ef [_cb ]=_fe .NewPoint (_ag ,_afe );
|
|
};return _ef ;};func (_cgg *Context )Width ()int {return _cgg ._ccbf };type repeatOp int ;func (_gbd *Context )LineTo (x ,y float64 ){if !_gbd ._ffe {_gbd .MoveTo (x ,y );}else {x ,y =_gbd .Transform (x ,y );_gef :=_fe .NewPoint (x ,y );_ad :=_ddcd (_gef );
|
|
_gbd ._ed .Add1 (_ad );_gbd ._aab .Add1 (_ad );_gbd ._cfc =_gef ;};};func (_fdcc *Context )fill (_fae _bed .Painter ){_cdf :=_fdcc ._aab ;if _fdcc ._ffe {_cdf =make (_bed .Path ,len (_fdcc ._aab ));copy (_cdf ,_fdcc ._aab );_cdf .Add1 (_ddcd (_fdcc ._eff ));
|
|
};_bgg :=_fdcc ._eca ;_bgg .UseNonZeroWinding =_fdcc ._efe ==_c .FillRuleWinding ;_bgg .Clear ();_bgg .AddPath (_cdf );_bgg .Rasterize (_fae );};func (_ecg *Context )FillPreserve (){var _gdg _bed .Painter ;if _ecg ._ggg ==nil {if _aage ,_dg :=_ecg ._cfgc .(*solidPattern );
|
|
_dg {_ecgc :=_bed .NewRGBAPainter (_ecg ._dcfb );_ecgc .SetColor (_aage ._aceg );_gdg =_ecgc ;};};if _gdg ==nil {_gdg =_eaaf (_ecg ._dcfb ,_ecg ._ggg ,_ecg ._cfgc );};_ecg .fill (_gdg );}; |