mirror of
https://github.com/unidoc/unipdf.git
synced 2025-05-04 22:17:22 +08:00
106 lines
27 KiB
Go
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 (_af "errors";_f "fmt";_d "github.com/golang/freetype/raster";_ce "github.com/unidoc/unipdf/v3/common";_b "github.com/unidoc/unipdf/v3/internal/transform";_be "github.com/unidoc/unipdf/v3/render/internal/context";_ca "golang.org/x/image/draw";
|
|
_ad "golang.org/x/image/font";_aa "golang.org/x/image/math/f64";_gd "golang.org/x/image/math/fixed";_e "image";_ge "image/color";_gb "image/draw";_a "math";_fa "sort";_c "strings";);func (_aae *linearGradient )ColorAt (x ,y int )_ge .Color {if len (_aae ._gfd )==0{return _ge .Transparent ;
|
|
};_fgga ,_cea :=float64 (x ),float64 (y );_gcgc ,_dgec ,_dac ,_fbc :=_aae ._bada ,_aae ._fgcf ,_aae ._efa ,_aae ._fcbaa ;_efaf ,_bea :=_dac -_gcgc ,_fbc -_dgec ;if _bea ==0&&_efaf !=0{return _fddg ((_fgga -_gcgc )/_efaf ,_aae ._gfd );};if _efaf ==0&&_bea !=0{return _fddg ((_cea -_dgec )/_bea ,_aae ._gfd );
|
|
};_eba :=_efaf *(_fgga -_gcgc )+_bea *(_cea -_dgec );if _eba < 0{return _aae ._gfd [0]._afb ;};_bdce :=_a .Hypot (_efaf ,_bea );_aad :=((_fgga -_gcgc )*-_bea +(_cea -_dgec )*_efaf )/(_bdce *_bdce );_afag ,_abf :=_gcgc +_aad *-_bea ,_dgec +_aad *_efaf ;
|
|
_fafe :=_a .Hypot (_fgga -_afag ,_cea -_abf )/_bdce ;return _fddg (_fafe ,_aae ._gfd );};func (_cab *Context )SetPixel (x ,y int ){_cab ._afg .Set (x ,y ,_cab ._bdcf )};func _feca (_gdac _gd .Int26_6 )float64 {const _agce ,_ceee =6,1<<6-1;if _gdac >=0{return float64 (_gdac >>_agce )+float64 (_gdac &_ceee )/64;
|
|
};_gdac =-_gdac ;if _gdac >=0{return -(float64 (_gdac >>_agce )+float64 (_gdac &_ceee )/64);};return 0;};func _gff (_cee ,_eg ,_cdd ,_fg ,_gbc ,_cef ,_ceb ,_cfe ,_fb float64 )(_eb ,_bec float64 ){_gfb :=1-_fb ;_faf :=_gfb *_gfb *_gfb ;_ffb :=3*_gfb *_gfb *_fb ;
|
|
_cc :=3*_gfb *_fb *_fb ;_gaa :=_fb *_fb *_fb ;_eb =_faf *_cee +_ffb *_cdd +_cc *_gbc +_gaa *_ceb ;_bec =_faf *_eg +_ffb *_fg +_cc *_cef +_gaa *_cfe ;return ;};func (_bbb *Context )SetMask (mask *_e .Alpha )error {if mask .Bounds ().Size ()!=_bbb ._afg .Bounds ().Size (){return _af .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");
|
|
};_bbb ._gab =mask ;return nil ;};func (_acae *Context )DrawRoundedRectangle (x ,y ,w ,h ,r float64 ){_fgec ,_cfdf ,_eeg ,_bgb :=x ,x +r ,x +w -r ,x +w ;_bdd ,_cgb ,_fcbd ,_dcb :=y ,y +r ,y +h -r ,y +h ;_acae .NewSubPath ();_acae .MoveTo (_cfdf ,_bdd );
|
|
_acae .LineTo (_eeg ,_bdd );_acae .DrawArc (_eeg ,_cgb ,r ,_dbee (270),_dbee (360));_acae .LineTo (_bgb ,_fcbd );_acae .DrawArc (_eeg ,_fcbd ,r ,_dbee (0),_dbee (90));_acae .LineTo (_cfdf ,_dcb );_acae .DrawArc (_cfdf ,_fcbd ,r ,_dbee (90),_dbee (180));
|
|
_acae .LineTo (_fgec ,_cgb );_acae .DrawArc (_cfdf ,_cgb ,r ,_dbee (180),_dbee (270));_acae .ClosePath ();};func _fddg (_egc float64 ,_egd stops )_ge .Color {if _egc <=0.0||len (_egd )==1{return _egd [0]._afb ;};_edge :=_egd [len (_egd )-1];if _egc >=_edge ._bdg {return _edge ._afb ;
|
|
};for _dbfd ,_cfgc :=range _egd [1:]{if _egc < _cfgc ._bdg {_egc =(_egc -_egd [_dbfd ]._bdg )/(_cfgc ._bdg -_egd [_dbfd ]._bdg );return _eff (_egd [_dbfd ]._afb ,_cfgc ._afb ,_egc );};};return _edge ._afb ;};func (_aeg *Context )DrawImageAnchored (im _e .Image ,x ,y int ,ax ,ay float64 ){_ddad :=im .Bounds ().Size ();
|
|
x -=int (ax *float64 (_ddad .X ));y -=int (ay *float64 (_ddad .Y ));_debg :=_ca .BiLinear ;_gebf :=_aeg ._gef .Clone ().Translate (float64 (x ),float64 (y ));_afc :=_aa .Aff3 {_gebf [0],_gebf [3],_gebf [6],_gebf [1],_gebf [4],_gebf [7]};if _aeg ._gab ==nil {_debg .Transform (_aeg ._afg ,_afc ,im ,im .Bounds (),_ca .Over ,nil );
|
|
}else {_debg .Transform (_aeg ._afg ,_afc ,im ,im .Bounds (),_ca .Over ,&_ca .Options {DstMask :_aeg ._gab ,DstMaskP :_e .Point {}});};};func (_bga *Context )TextState ()*_be .TextState {return &_bga ._ced };func (_cdg *Context )SetLineWidth (lineWidth float64 ){_cdg ._cdc =lineWidth };
|
|
func (_ef *Context )SetStrokeStyle (pattern _be .Pattern ){_ef ._bed =pattern };func (_dce *Context )ResetClip (){_dce ._gab =nil };func (_gcdf *Context )ClearPath (){_gcdf ._adg .Clear ();_gcdf ._ece .Clear ();_gcdf ._fcb =false };func (_ddb *Context )SetRGBA (r ,g ,b ,a float64 ){_ddb ._bdcf =_ge .NRGBA {uint8 (r *255),uint8 (g *255),uint8 (b *255),uint8 (a *255)};
|
|
_ddb .setFillAndStrokeColor (_ddb ._bdcf );};func (_fefe *Context )DrawEllipticalArc (x ,y ,rx ,ry ,angle1 ,angle2 float64 ){const _adf =16;for _cgg :=0;_cgg < _adf ;_cgg ++{_dgc :=float64 (_cgg +0)/_adf ;_bcg :=float64 (_cgg +1)/_adf ;_cfge :=angle1 +(angle2 -angle1 )*_dgc ;
|
|
_cfc :=angle1 +(angle2 -angle1 )*_bcg ;_bde :=x +rx *_a .Cos (_cfge );_eegd :=y +ry *_a .Sin (_cfge );_ffcf :=x +rx *_a .Cos ((_cfge +_cfc )/2);_bac :=y +ry *_a .Sin ((_cfge +_cfc )/2);_dbf :=x +rx *_a .Cos (_cfc );_bfg :=y +ry *_a .Sin (_cfc );_dfg :=2*_ffcf -_bde /2-_dbf /2;
|
|
_cdag :=2*_bac -_eegd /2-_bfg /2;if _cgg ==0{if _fefe ._fcb {_fefe .LineTo (_bde ,_eegd );}else {_fefe .MoveTo (_bde ,_eegd );};};_fefe .QuadraticTo (_dfg ,_cdag ,_dbf ,_bfg );};};func (_bdaa *radialGradient )ColorAt (x ,y int )_ge .Color {if len (_bdaa ._dbe )==0{return _ge .Transparent ;
|
|
};_ede ,_faea :=float64 (x )+0.5-_bdaa ._bff ._cfff ,float64 (y )+0.5-_bdaa ._bff ._gefe ;_gea :=_edf (_ede ,_faea ,_bdaa ._bff ._fdga ,_bdaa ._aaeb ._cfff ,_bdaa ._aaeb ._gefe ,_bdaa ._aaeb ._fdga );_bgbf :=_edf (_ede ,_faea ,-_bdaa ._bff ._fdga ,_ede ,_faea ,_bdaa ._bff ._fdga );
|
|
if _bdaa ._bee ==0{if _gea ==0{return _ge .Transparent ;};_dgac :=0.5*_bgbf /_gea ;if _dgac *_bdaa ._aaeb ._fdga >=_bdaa ._decg {return _fddg (_dgac ,_bdaa ._dbe );};return _ge .Transparent ;};_cgf :=_edf (_gea ,_bdaa ._bee ,0,_gea ,-_bgbf ,0);if _cgf >=0{_ffbg :=_a .Sqrt (_cgf );
|
|
_dffd :=(_gea +_ffbg )*_bdaa ._ebcfc ;_badac :=(_gea -_ffbg )*_bdaa ._ebcfc ;if _dffd *_bdaa ._aaeb ._fdga >=_bdaa ._decg {return _fddg (_dffd ,_bdaa ._dbe );}else if _badac *_bdaa ._aaeb ._fdga >=_bdaa ._decg {return _fddg (_badac ,_bdaa ._dbe );};};return _ge .Transparent ;
|
|
};func (_egg *Context )ClipPreserve (){_dfdb :=_e .NewAlpha (_e .Rect (0,0,_egg ._cac ,_egg ._aga ));_ceec :=_d .NewAlphaOverPainter (_dfdb );_egg .fill (_ceec );if _egg ._gab ==nil {_egg ._gab =_dfdb ;}else {_cfeb :=_e .NewAlpha (_e .Rect (0,0,_egg ._cac ,_egg ._aga ));
|
|
_ca .DrawMask (_cfeb ,_cfeb .Bounds (),_dfdb ,_e .Point {},_egg ._gab ,_e .Point {},_ca .Over );_egg ._gab =_cfeb ;};};func (_ecd *Context )SetRGBA255 (r ,g ,b ,a int ){_ecd ._bdcf =_ge .NRGBA {uint8 (r ),uint8 (g ),uint8 (b ),uint8 (a )};_ecd .setFillAndStrokeColor (_ecd ._bdcf );
|
|
};func (_ddc *Context )SetDash (dashes ...float64 ){_ddc ._cda =dashes };func (_gced stops )Less (i ,j int )bool {return _gced [i ]._bdg < _gced [j ]._bdg };func (_eed *Context )stroke (_fec _d .Painter ){_bca :=_eed ._adg ;if len (_eed ._cda )> 0{_bca =_bdb (_bca ,_eed ._cda ,_eed ._bgd );
|
|
}else {_bca =_cdcc (_fdb (_bca ));};_gabe :=_eed ._caf ;_gabe .UseNonZeroWinding =true ;_gabe .Clear ();_gecae :=(_eed ._gef .ScalingFactorX ()+_eed ._gef .ScalingFactorY ())/2;_gabe .AddStroke (_bca ,_bcee (_eed ._cdc *_gecae ),_eed .capper (),_eed .joiner ());
|
|
_gabe .Rasterize (_fec );};func _edf (_acg ,_fcab ,_cbe ,_eceg ,_ddd ,_ebg float64 )float64 {return _acg *_eceg +_fcab *_ddd +_cbe *_ebg ;};func (_ebd *Context )FillPattern ()_be .Pattern {return _ebd ._fea };func _gbdb (_bgbb _e .Image ,_cdccg repeatOp )_be .Pattern {return &surfacePattern {_fecb :_bgbb ,_ged :_cdccg };
|
|
};func (_gac *Context )DrawCircle (x ,y ,r float64 ){_gac .NewSubPath ();_gac .DrawEllipticalArc (x ,y ,r ,r ,0,2*_a .Pi );_gac .ClosePath ();};func _bdb (_abcf _d .Path ,_aacb []float64 ,_cdb float64 )_d .Path {return _cdcc (_daa (_fdb (_abcf ),_aacb ,_cdb ));
|
|
};func (_geca *Context )SetStrokeRGBA (r ,g ,b ,a float64 ){_dda :=_ge .NRGBA {uint8 (r *255),uint8 (g *255),uint8 (b *255),uint8 (a *255)};_geca ._bed =_bdfe (_dda );};func (_ada *Context )Matrix ()_b .Matrix {return _ada ._gef };func (_fee *Context )LineWidth ()float64 {return _fee ._cdc };
|
|
func (_cgc *Context )Stroke (){_cgc .StrokePreserve ();_cgc .ClearPath ()};func (_gcd *Context )LineTo (x ,y float64 ){if !_gcd ._fcb {_gcd .MoveTo (x ,y );}else {x ,y =_gcd .Transform (x ,y );_fdd :=_b .NewPoint (x ,y );_cbg :=_gdc (_fdd );_gcd ._adg .Add1 (_cbg );
|
|
_gcd ._ece .Add1 (_cbg );_gcd ._cg =_fdd ;};};func (_egb *Context )StrokePattern ()_be .Pattern {return _egb ._bed };func _df (_gffg ,_fc ,_cad ,_de ,_feg ,_dfd ,_dee ,_gddg float64 )[]_b .Point {_ea :=(_a .Hypot (_cad -_gffg ,_de -_fc )+_a .Hypot (_feg -_cad ,_dfd -_de )+_a .Hypot (_dee -_feg ,_gddg -_dfd ));
|
|
_bbg :=int (_ea +0.5);if _bbg < 4{_bbg =4;};_fgf :=float64 (_bbg )-1;_ebc :=make ([]_b .Point ,_bbg );for _ec :=0;_ec < _bbg ;_ec ++{_dgb :=float64 (_ec )/_fgf ;_ae ,_gca :=_gff (_gffg ,_fc ,_cad ,_de ,_feg ,_dfd ,_dee ,_gddg ,_dgb );_ebc [_ec ]=_b .NewPoint (_ae ,_gca );
|
|
};return _ebc ;};func (_gbae *Context )RotateAbout (angle ,x ,y float64 ){_gbae .Translate (x ,y );_gbae .Rotate (angle );_gbae .Translate (-x ,-y );};func (_ddfd *Context )FillPreserve (){var _fdgc _d .Painter ;if _ddfd ._gab ==nil {if _bebd ,_ccc :=_ddfd ._fea .(*solidPattern );
|
|
_ccc {_cca :=_d .NewRGBAPainter (_ddfd ._afg );_cca .SetColor (_bebd ._cgd );_fdgc =_cca ;};};if _fdgc ==nil {_fdgc =_eda (_ddfd ._afg ,_ddfd ._gab ,_ddfd ._fea );};_ddfd .fill (_fdgc );};type surfacePattern struct{_fecb _e .Image ;_ged repeatOp ;};func _faeb (_fcbf ,_afgb ,_gfbd ,_bae float64 )_be .Gradient {_fda :=&linearGradient {_bada :_fcbf ,_fgcf :_afgb ,_efa :_gfbd ,_fcbaa :_bae };
|
|
return _fda ;};func (_da *Context )InvertMask (){if _da ._gab ==nil {_da ._gab =_e .NewAlpha (_da ._afg .Bounds ());}else {for _afa ,_fge :=range _da ._gab .Pix {_da ._gab .Pix [_afa ]=255-_fge ;};};};func _gdc (_aefe _b .Point )_gd .Point26_6 {return _gd .Point26_6 {X :_bcee (_aefe .X ),Y :_bcee (_aefe .Y )}};
|
|
func _dg (_bd ,_cfg ,_ga ,_fe ,_beb ,_bg float64 )[]_b .Point {_cb :=(_a .Hypot (_ga -_bd ,_fe -_cfg )+_a .Hypot (_beb -_ga ,_bg -_fe ));_ed :=int (_cb +0.5);if _ed < 4{_ed =4;};_dd :=float64 (_ed )-1;_bdc :=make ([]_b .Point ,_ed );for _add :=0;_add < _ed ;
|
|
_add ++{_cfd :=float64 (_add )/_dd ;_gdd ,_bb :=_ac (_bd ,_cfg ,_ga ,_fe ,_beb ,_bg ,_cfd );_bdc [_add ]=_b .NewPoint (_gdd ,_bb );};return _bdc ;};func _fdb (_abd _d .Path )[][]_b .Point {var _fcc [][]_b .Point ;var _gaf []_b .Point ;var _dddc ,_aag float64 ;
|
|
for _gabf :=0;_gabf < len (_abd );{switch _abd [_gabf ]{case 0:if len (_gaf )> 0{_fcc =append (_fcc ,_gaf );_gaf =nil ;};_decb :=_feca (_abd [_gabf +1]);_gfc :=_feca (_abd [_gabf +2]);_gaf =append (_gaf ,_b .NewPoint (_decb ,_gfc ));_dddc ,_aag =_decb ,_gfc ;
|
|
_gabf +=4;case 1:_deeae :=_feca (_abd [_gabf +1]);_ccbe :=_feca (_abd [_gabf +2]);_gaf =append (_gaf ,_b .NewPoint (_deeae ,_ccbe ));_dddc ,_aag =_deeae ,_ccbe ;_gabf +=4;case 2:_bffc :=_feca (_abd [_gabf +1]);_aebbf :=_feca (_abd [_gabf +2]);_fde :=_feca (_abd [_gabf +3]);
|
|
_feae :=_feca (_abd [_gabf +4]);_becb :=_dg (_dddc ,_aag ,_bffc ,_aebbf ,_fde ,_feae );_gaf =append (_gaf ,_becb ...);_dddc ,_aag =_fde ,_feae ;_gabf +=6;case 3:_agf :=_feca (_abd [_gabf +1]);_gfbf :=_feca (_abd [_gabf +2]);_caga :=_feca (_abd [_gabf +3]);
|
|
_dfde :=_feca (_abd [_gabf +4]);_gagg :=_feca (_abd [_gabf +5]);_dcca :=_feca (_abd [_gabf +6]);_gecd :=_df (_dddc ,_aag ,_agf ,_gfbf ,_caga ,_dfde ,_gagg ,_dcca );_gaf =append (_gaf ,_gecd ...);_dddc ,_aag =_gagg ,_dcca ;_gabf +=8;default:_ce .Log .Debug ("\u0057\u0041\u0052\u004e: \u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0070\u0061\u0074\u0068\u003a\u0020%\u0076",_abd );
|
|
return _fcc ;};};if len (_gaf )> 0{_fcc =append (_fcc ,_gaf );};return _fcc ;};func (_cfdb *Context )SetFillRule (fillRule _be .FillRule ){_cfdb ._ebcf =fillRule };func (_fdfe *Context )joiner ()_d .Joiner {switch _fdfe ._ddf {case _be .LineJoinBevel :return _d .BevelJoiner ;
|
|
case _be .LineJoinRound :return _d .RoundJoiner ;};return nil ;};func (_cfcd *Context )DrawStringAnchored (s string ,face _ad .Face ,x ,y ,ax ,ay float64 ){_cbd ,_gggg :=_cfcd .MeasureString (s ,face );_cfcd .drawString (s ,face ,x -ax *_cbd ,y +ay *_gggg );
|
|
};func (_gbcd *Context )ScaleAbout (sx ,sy ,x ,y float64 ){_gbcd .Translate (x ,y );_gbcd .Scale (sx ,sy );_gbcd .Translate (-x ,-y );};func (_ab *Context )Fill (){_ab .FillPreserve ();_ab .ClearPath ()};func (_dge *Context )Pop (){_gcag :=*_dge ;_caab :=_dge ._afd ;
|
|
_gae :=_caab [len (_caab )-1];*_dge =*_gae ;_dge ._adg =_gcag ._adg ;_dge ._ece =_gcag ._ece ;_dge ._dc =_gcag ._dc ;_dge ._cg =_gcag ._cg ;_dge ._fcb =_gcag ._fcb ;};type solidPattern struct{_cgd _ge .Color };func (_gce *Context )SetFillRGBA (r ,g ,b ,a float64 ){_edg :=_ge .NRGBA {uint8 (r *255),uint8 (g *255),uint8 (b *255),uint8 (a *255)};
|
|
_gce ._bdcf =_edg ;_gce ._fea =_bdfe (_edg );};const (_fead repeatOp =iota ;_cce ;_dfc ;_eeda ;);func _bcee (_bbae float64 )_gd .Int26_6 {return _gd .Int26_6 (_bbae *64)};func (_gcb *Context )DrawImage (im _e .Image ,x ,y int ){_gcb .DrawImageAnchored (im ,x ,y ,0,0)};
|
|
func (_eac stops )Swap (i ,j int ){_eac [i ],_eac [j ]=_eac [j ],_eac [i ]};func (_bfa *Context )drawRegularPolygon (_gcg int ,_gcf ,_dgg ,_cggf ,_cabb float64 ){_geb :=2*_a .Pi /float64 (_gcg );_cabb -=_a .Pi /2;if _gcg %2==0{_cabb +=_geb /2;};_bfa .NewSubPath ();
|
|
for _edd :=0;_edd < _gcg ;_edd ++{_fce :=_cabb +_geb *float64 (_edd );_bfa .LineTo (_gcf +_cggf *_a .Cos (_fce ),_dgg +_cggf *_a .Sin (_fce ));};_bfa .ClosePath ();};type radialGradient struct{_bff ,_adab ,_aaeb circle ;_bee ,_ebcfc float64 ;_decg float64 ;
|
|
_dbe stops ;};func (_acc *Context )SetHexColor (x string ){_fgc ,_fcd ,_cefg ,_fed :=_bcde (x );_acc .SetRGBA255 (_fgc ,_fcd ,_cefg ,_fed );};func (_fd *Context )Image ()_e .Image {return _fd ._afg };func NewContext (width ,height int )*Context {return NewContextForRGBA (_e .NewRGBA (_e .Rect (0,0,width ,height )));
|
|
};func (_afaa *Context )Identity (){_afaa ._gef =_b .IdentityMatrix ()};func _cdcc (_gde [][]_b .Point )_d .Path {var _aecf _d .Path ;for _ ,_agg :=range _gde {var _ggc _gd .Point26_6 ;for _cfea ,_eab :=range _agg {_cdcf :=_gdc (_eab );if _cfea ==0{_aecf .Start (_cdcf );
|
|
}else {_baa :=_cdcf .X -_ggc .X ;_dccaa :=_cdcf .Y -_ggc .Y ;if _baa < 0{_baa =-_baa ;};if _dccaa < 0{_dccaa =-_dccaa ;};if _baa +_dccaa > 8{_aecf .Add1 (_cdcf );};};_ggc =_cdcf ;};};return _aecf ;};func (_deb *Context )DrawArc (x ,y ,r ,angle1 ,angle2 float64 ){_deb .DrawEllipticalArc (x ,y ,r ,r ,angle1 ,angle2 );
|
|
};func (_eaaf *Context )DrawString (s string ,face _ad .Face ,x ,y float64 ){_eaaf .DrawStringAnchored (s ,face ,x ,y ,0,0);};func (_age *linearGradient )AddColorStop (offset float64 ,color _ge .Color ){_age ._gfd =append (_age ._gfd ,stop {_bdg :offset ,_afb :color });
|
|
_fa .Sort (_age ._gfd );};var (_deg =_bdfe (_ge .White );_aed =_bdfe (_ge .Black ););func _bdfe (_fbgda _ge .Color )_be .Pattern {return &solidPattern {_cgd :_fbgda }};func (_gbd *Context )setFillAndStrokeColor (_cfa _ge .Color ){_gbd ._bdcf =_cfa ;_gbd ._fea =_bdfe (_cfa );
|
|
_gbd ._bed =_bdfe (_cfa );};func _dad (_aef _e .Image )*_e .RGBA {_egaa :=_aef .Bounds ();_acb :=_e .NewRGBA (_egaa );_gb .Draw (_acb ,_egaa ,_aef ,_egaa .Min ,_gb .Src );return _acb ;};func (_bdf *Context )QuadraticTo (x1 ,y1 ,x2 ,y2 float64 ){if !_bdf ._fcb {_bdf .MoveTo (x1 ,y1 );
|
|
};x1 ,y1 =_bdf .Transform (x1 ,y1 );x2 ,y2 =_bdf .Transform (x2 ,y2 );_dec :=_b .NewPoint (x1 ,y1 );_ade :=_b .NewPoint (x2 ,y2 );_ccg :=_gdc (_dec );_fgg :=_gdc (_ade );_bdf ._adg .Add2 (_ccg ,_fgg );_bdf ._ece .Add2 (_ccg ,_fgg );_bdf ._cg =_ade ;};type circle struct{_cfff ,_gefe ,_fdga float64 };
|
|
type linearGradient struct{_bada ,_fgcf ,_efa ,_fcbaa float64 ;_gfd stops ;};func (_cadd *Context )SetRGB (r ,g ,b float64 ){_cadd .SetRGBA (r ,g ,b ,1)};func (_adgf *Context )SetLineCap (lineCap _be .LineCap ){_adgf ._bc =lineCap };func (_ba *Context )DrawPoint (x ,y ,r float64 ){_ba .Push ();
|
|
_dece ,_cde :=_ba .Transform (x ,y );_ba .Identity ();_ba .DrawCircle (_dece ,_cde ,r );_ba .Pop ();};func (_egbb stops )Len ()int {return len (_egbb )};func (_agc *Context )Clip (){_agc .ClipPreserve ();_agc .ClearPath ()};func (_eee *Context )fill (_ace _d .Painter ){_cec :=_eee ._ece ;
|
|
if _eee ._fcb {_cec =make (_d .Path ,len (_eee ._ece ));copy (_cec ,_eee ._ece );_cec .Add1 (_gdc (_eee ._dc ));};_bgde :=_eee ._caf ;_bgde .UseNonZeroWinding =_eee ._ebcf ==_be .FillRuleWinding ;_bgde .Clear ();_bgde .AddPath (_cec );_bgde .Rasterize (_ace );
|
|
};func (_abc *Context )Scale (x ,y float64 ){_abc ._gef =_abc ._gef .Scale (x ,y )};func (_gbbc *solidPattern )ColorAt (x ,y int )_ge .Color {return _gbbc ._cgd };func (_bda *Context )drawString (_fca string ,_dggg _ad .Face ,_eedd ,_ceg float64 ){_acd :=&_ad .Drawer {Src :_e .NewUniform (_bda ._bdcf ),Face :_dggg ,Dot :_gdc (_b .NewPoint (_eedd ,_ceg ))};
|
|
_fcba :=rune (-1);for _ ,_gfeg :=range _fca {if _fcba >=0{_acd .Dot .X +=_acd .Face .Kern (_fcba ,_gfeg );};_deea ,_aba ,_dgd ,_eaa ,_gag :=_acd .Face .Glyph (_acd .Dot ,_gfeg );if !_gag {continue ;};_dabb :=_deea .Sub (_deea .Min );_bcaf :=_e .NewRGBA (_dabb );
|
|
_ca .DrawMask (_bcaf ,_dabb ,_acd .Src ,_e .Point {},_aba ,_dgd ,_ca .Over );var _ggg *_ca .Options ;if _bda ._gab !=nil {_ggg =&_ca .Options {DstMask :_bda ._gab ,DstMaskP :_e .Point {}};};_bad :=_bda ._gef .Clone ().Translate (float64 (_deea .Min .X ),float64 (_deea .Min .Y ));
|
|
_dcbe :=_aa .Aff3 {_bad [0],_bad [3],_bad [6],_bad [1],_bad [4],_bad [7]};_ca .BiLinear .Transform (_bda ._afg ,_dcbe ,_bcaf ,_dabb ,_ca .Over ,_ggg );_acd .Dot .X +=_eaa ;_fcba =_gfeg ;};};type stop struct{_bdg float64 ;_afb _ge .Color ;};func (_dbc *Context )Transform (x ,y float64 )(_fae ,_bgag float64 ){return _dbc ._gef .Transform (x ,y )};
|
|
func (_egf *Context )DrawEllipse (x ,y ,rx ,ry float64 ){_egf .NewSubPath ();_egf .DrawEllipticalArc (x ,y ,rx ,ry ,0,2*_a .Pi );_egf .ClosePath ();};func (_fgce *Context )DrawLine (x1 ,y1 ,x2 ,y2 float64 ){_fgce .MoveTo (x1 ,y1 );_fgce .LineTo (x2 ,y2 )};
|
|
func (_cggg *Context )Push (){_caa :=*_cggg ;_cggg ._afd =append (_cggg ._afd ,&_caa )};func (_aec *Context )Height ()int {return _aec ._aga };func _eda (_ddgf *_e .RGBA ,_eegdg *_e .Alpha ,_gfa _be .Pattern )*patternPainter {return &patternPainter {_ddgf ,_eegdg ,_gfa };
|
|
};func _eff (_dcc ,_adgd _ge .Color ,_bgc float64 )_ge .Color {_gad ,_aab ,_adfc ,_dfdbd :=_dcc .RGBA ();_becg ,_gbg ,_fbf ,_egdb :=_adgd .RGBA ();return _ge .RGBA {_bfge (_gad ,_becg ,_bgc ),_bfge (_aab ,_gbg ,_bgc ),_bfge (_adfc ,_fbf ,_bgc ),_bfge (_dfdbd ,_egdb ,_bgc )};
|
|
};func (_aac *Context )DrawRectangle (x ,y ,w ,h float64 ){_aac .NewSubPath ();_aac .MoveTo (x ,y );_aac .LineTo (x +w ,y );_aac .LineTo (x +w ,y +h );_aac .LineTo (x ,y +h );_aac .ClosePath ();};func (_gg *Context )SetDashOffset (offset float64 ){_gg ._bgd =offset };
|
|
func (_aeb *Context )capper ()_d .Capper {switch _aeb ._bc {case _be .LineCapButt :return _d .ButtCapper ;case _be .LineCapRound :return _d .RoundCapper ;case _be .LineCapSquare :return _d .SquareCapper ;};return nil ;};func (_agca *surfacePattern )ColorAt (x ,y int )_ge .Color {_cgfe :=_agca ._fecb .Bounds ();
|
|
switch _agca ._ged {case _cce :if y >=_cgfe .Dy (){return _ge .Transparent ;};case _dfc :if x >=_cgfe .Dx (){return _ge .Transparent ;};case _eeda :if x >=_cgfe .Dx ()||y >=_cgfe .Dy (){return _ge .Transparent ;};};x =x %_cgfe .Dx ()+_cgfe .Min .X ;y =y %_cgfe .Dy ()+_cgfe .Min .Y ;
|
|
return _agca ._fecb .At (x ,y );};func (_fdg *Context )Width ()int {return _fdg ._cac };func _bfge (_fgeb ,_dcg uint32 ,_egdbf float64 )uint8 {return uint8 (int32 (float64 (_fgeb )*(1.0-_egdbf )+float64 (_dcg )*_egdbf )>>8);};type repeatOp int ;type Context struct{_cac int ;
|
|
_aga int ;_caf *_d .Rasterizer ;_afg *_e .RGBA ;_gab *_e .Alpha ;_bdcf _ge .Color ;_fea _be .Pattern ;_bed _be .Pattern ;_adg _d .Path ;_ece _d .Path ;_dc _b .Point ;_cg _b .Point ;_fcb bool ;_cda []float64 ;_bgd float64 ;_cdc float64 ;_bc _be .LineCap ;
|
|
_ddf _be .LineJoin ;_ebcf _be .FillRule ;_gef _b .Matrix ;_ced _be .TextState ;_afd []*Context ;};func (_dbce *radialGradient )AddColorStop (offset float64 ,color _ge .Color ){_dbce ._dbe =append (_dbce ._dbe ,stop {_bdg :offset ,_afb :color });_fa .Sort (_dbce ._dbe );
|
|
};func (_cbc *Context )Shear (x ,y float64 ){_cbc ._gef .Shear (x ,y )};func (_gcce *Context )CubicTo (x1 ,y1 ,x2 ,y2 ,x3 ,y3 float64 ){if !_gcce ._fcb {_gcce .MoveTo (x1 ,y1 );};_aca ,_acf :=_gcce ._cg .X ,_gcce ._cg .Y ;x1 ,y1 =_gcce .Transform (x1 ,y1 );
|
|
x2 ,y2 =_gcce .Transform (x2 ,y2 );x3 ,y3 =_gcce .Transform (x3 ,y3 );_bge :=_df (_aca ,_acf ,x1 ,y1 ,x2 ,y2 ,x3 ,y3 );_ecg :=_gdc (_gcce ._cg );for _ ,_dga :=range _bge [1:]{_cbgd :=_gdc (_dga );if _cbgd ==_ecg {continue ;};_ecg =_cbgd ;_gcce ._adg .Add1 (_cbgd );
|
|
_gcce ._ece .Add1 (_cbgd );_gcce ._cg =_dga ;};};func (_eegc *patternPainter )Paint (ss []_d .Span ,done bool ){_bce :=_eegc ._gdb .Bounds ();for _ ,_dgf :=range ss {if _dgf .Y < _bce .Min .Y {continue ;};if _dgf .Y >=_bce .Max .Y {return ;};if _dgf .X0 < _bce .Min .X {_dgf .X0 =_bce .Min .X ;
|
|
};if _dgf .X1 > _bce .Max .X {_dgf .X1 =_bce .Max .X ;};if _dgf .X0 >=_dgf .X1 {continue ;};const _gfg =1<<16-1;_fddd :=_dgf .Y -_eegc ._gdb .Rect .Min .Y ;_bba :=_dgf .X0 -_eegc ._gdb .Rect .Min .X ;_acad :=(_dgf .Y -_eegc ._gdb .Rect .Min .Y )*_eegc ._gdb .Stride +(_dgf .X0 -_eegc ._gdb .Rect .Min .X )*4;
|
|
_aced :=_acad +(_dgf .X1 -_dgf .X0 )*4;for _faab ,_adee :=_acad ,_bba ;_faab < _aced ;_faab ,_adee =_faab +4,_adee +1{_ccge :=_dgf .Alpha ;if _eegc ._gaba !=nil {_ccge =_ccge *uint32 (_eegc ._gaba .AlphaAt (_adee ,_fddd ).A )/255;if _ccge ==0{continue ;
|
|
};};_baed :=_eegc ._dag .ColorAt (_adee ,_fddd );_fggg ,_bcd ,_dffb ,_gbf :=_baed .RGBA ();_gefb :=uint32 (_eegc ._gdb .Pix [_faab +0]);_bbe :=uint32 (_eegc ._gdb .Pix [_faab +1]);_gcdb :=uint32 (_eegc ._gdb .Pix [_faab +2]);_dae :=uint32 (_eegc ._gdb .Pix [_faab +3]);
|
|
_dgee :=(_gfg -(_gbf *_ccge /_gfg ))*0x101;_eegc ._gdb .Pix [_faab +0]=uint8 ((_gefb *_dgee +_fggg *_ccge )/_gfg >>8);_eegc ._gdb .Pix [_faab +1]=uint8 ((_bbe *_dgee +_bcd *_ccge )/_gfg >>8);_eegc ._gdb .Pix [_faab +2]=uint8 ((_gcdb *_dgee +_dffb *_ccge )/_gfg >>8);
|
|
_eegc ._gdb .Pix [_faab +3]=uint8 ((_dae *_dgee +_gbf *_ccge )/_gfg >>8);};};};func (_ebcc *Context )ShearAbout (sx ,sy ,x ,y float64 ){_ebcc .Translate (x ,y );_ebcc .Shear (sx ,sy );_ebcc .Translate (-x ,-y );};func (_ege *Context )SetLineJoin (lineJoin _be .LineJoin ){_ege ._ddf =lineJoin };
|
|
type stops []stop ;func _daa (_ceeb [][]_b .Point ,_gefd []float64 ,_adgdc float64 )[][]_b .Point {var _agb [][]_b .Point ;if len (_gefd )==0{return _ceeb ;};if len (_gefd )==1{_gefd =append (_gefd ,_gefd [0]);};for _ ,_ggf :=range _ceeb {if len (_ggf )< 2{continue ;
|
|
};_gda :=_ggf [0];_cadf :=1;_adaa :=0;_cead :=0.0;if _adgdc !=0{var _dgbe float64 ;for _ ,_efb :=range _gefd {_dgbe +=_efb ;};_adgdc =_a .Mod (_adgdc ,_dgbe );if _adgdc < 0{_adgdc +=_dgbe ;};for _cacb ,_agba :=range _gefd {_adgdc -=_agba ;if _adgdc < 0{_adaa =_cacb ;
|
|
_cead =_agba +_adgdc ;break ;};};};var _fff []_b .Point ;_fff =append (_fff ,_gda );for _cadf < len (_ggf ){_dcd :=_gefd [_adaa ];_cdce :=_ggf [_cadf ];_ddg :=_gda .Distance (_cdce );_feac :=_dcd -_cead ;if _ddg > _feac {_dbdc :=_feac /_ddg ;_gbge :=_gda .Interpolate (_cdce ,_dbdc );
|
|
_fff =append (_fff ,_gbge );if _adaa %2==0&&len (_fff )> 1{_agb =append (_agb ,_fff );};_fff =nil ;_fff =append (_fff ,_gbge );_cead =0;_gda =_gbge ;_adaa =(_adaa +1)%len (_gefd );}else {_fff =append (_fff ,_cdce );_gda =_cdce ;_cead +=_ddg ;_cadf ++;};
|
|
};if _adaa %2==0&&len (_fff )> 1{_agb =append (_agb ,_fff );};};return _agb ;};func (_fef *Context )SetRGB255 (r ,g ,b int ){_fef .SetRGBA255 (r ,g ,b ,255)};func _dbee (_ebe float64 )float64 {return _ebe *_a .Pi /180};func (_fdf *Context )ClosePath (){if _fdf ._fcb {_bcc :=_gdc (_fdf ._dc );
|
|
_fdf ._adg .Add1 (_bcc );_fdf ._ece .Add1 (_bcc );_fdf ._cg =_fdf ._dc ;};};func (_egec *Context )NewSubPath (){if _egec ._fcb {_egec ._ece .Add1 (_gdc (_egec ._dc ));};_egec ._fcb =false ;};func (_eggb *Context )MeasureString (s string ,face _ad .Face )(_fabf ,_cebf float64 ){_aebb :=&_ad .Drawer {Face :face };
|
|
_eae :=_aebb .MeasureString (s );return float64 (_eae >>6),_eggb ._ced .Tf .Size ;};func _fbgd (_cag ,_ffce ,_ccaa ,_fbcb ,_cfga ,_ccag float64 )_be .Gradient {_ded :=circle {_cag ,_ffce ,_ccaa };_efd :=circle {_fbcb ,_cfga ,_ccag };_gagf :=circle {_fbcb -_cag ,_cfga -_ffce ,_ccag -_ccaa };
|
|
_cdeg :=_edf (_gagf ._cfff ,_gagf ._gefe ,-_gagf ._fdga ,_gagf ._cfff ,_gagf ._gefe ,_gagf ._fdga );var _ccb float64 ;if _cdeg !=0{_ccb =1.0/_cdeg ;};_fba :=-_ded ._fdga ;_aebd :=&radialGradient {_bff :_ded ,_adab :_efd ,_aaeb :_gagf ,_bee :_cdeg ,_ebcfc :_ccb ,_decg :_fba };
|
|
return _aebd ;};type patternPainter struct{_gdb *_e .RGBA ;_gaba *_e .Alpha ;_dag _be .Pattern ;};func (_cecf *Context )AsMask ()*_e .Alpha {_gfe :=_e .NewAlpha (_cecf ._afg .Bounds ());_ca .Draw (_gfe ,_cecf ._afg .Bounds (),_cecf ._afg ,_e .Point {},_ca .Src );
|
|
return _gfe ;};func (_cga *Context )StrokePreserve (){var _fbg _d .Painter ;if _cga ._gab ==nil {if _cba ,_fece :=_cga ._bed .(*solidPattern );_fece {_ega :=_d .NewRGBAPainter (_cga ._afg );_ega .SetColor (_cba ._cgd );_fbg =_ega ;};};if _fbg ==nil {_fbg =_eda (_cga ._afg ,_cga ._gab ,_cga ._bed );
|
|
};_cga .stroke (_fbg );};func (_gfff *Context )MoveTo (x ,y float64 ){if _gfff ._fcb {_gfff ._ece .Add1 (_gdc (_gfff ._dc ));};x ,y =_gfff .Transform (x ,y );_gabd :=_b .NewPoint (x ,y );_cbf :=_gdc (_gabd );_gfff ._adg .Start (_cbf );_gfff ._ece .Start (_cbf );
|
|
_gfff ._dc =_gabd ;_gfff ._cg =_gabd ;_gfff ._fcb =true ;};func (_cefe *Context )Translate (x ,y float64 ){_cefe ._gef =_cefe ._gef .Translate (x ,y )};func _ac (_gf ,_ee ,_ag ,_gec ,_cd ,_gbb ,_ff float64 )(_cf ,_db float64 ){_ffc :=1-_ff ;_gc :=_ffc *_ffc ;
|
|
_gcc :=2*_ffc *_ff ;_dbd :=_ff *_ff ;_cf =_gc *_gf +_gcc *_ag +_dbd *_cd ;_db =_gc *_ee +_gcc *_gec +_dbd *_gbb ;return ;};func NewContextForRGBA (im *_e .RGBA )*Context {_cbb :=im .Bounds ().Size ().X ;_cff :=im .Bounds ().Size ().Y ;return &Context {_cac :_cbb ,_aga :_cff ,_caf :_d .NewRasterizer (_cbb ,_cff ),_afg :im ,_bdcf :_ge .Transparent ,_fea :_deg ,_bed :_aed ,_cdc :1,_ebcf :_be .FillRuleWinding ,_gef :_b .IdentityMatrix (),_ced :_be .NewTextState ()};
|
|
};func _bcde (_fdfb string )(_gbgb ,_dfe ,_eaeg ,_edgf int ){_fdfb =_c .TrimPrefix (_fdfb ,"\u0023");_edgf =255;if len (_fdfb )==3{_abfg :="\u00251\u0078\u0025\u0031\u0078\u0025\u0031x";_f .Sscanf (_fdfb ,_abfg ,&_gbgb ,&_dfe ,&_eaeg );_gbgb |=_gbgb <<4;
|
|
_dfe |=_dfe <<4;_eaeg |=_eaeg <<4;};if len (_fdfb )==6{_cfcdf :="\u0025\u0030\u0032x\u0025\u0030\u0032\u0078\u0025\u0030\u0032\u0078";_f .Sscanf (_fdfb ,_cfcdf ,&_gbgb ,&_dfe ,&_eaeg );};if len (_fdfb )==8{_dgff :="\u0025\u00302\u0078\u0025\u00302\u0078\u0025\u0030\u0032\u0078\u0025\u0030\u0032\u0078";
|
|
_f .Sscanf (_fdfb ,_dgff ,&_gbgb ,&_dfe ,&_eaeg ,&_edgf );};return ;};func (_bf *Context )SetColor (c _ge .Color ){_bf .setFillAndStrokeColor (c )};func (_gge *Context )SetFillStyle (pattern _be .Pattern ){if _fab ,_ggec :=pattern .(*solidPattern );_ggec {_gge ._bdcf =_fab ._cgd ;
|
|
};_gge ._fea =pattern ;};func (_gagc *Context )Rotate (angle float64 ){_gagc ._gef =_gagc ._gef .Rotate (angle )};func (_bcca *Context )Clear (){_dab :=_e .NewUniform (_bcca ._bdcf );_ca .Draw (_bcca ._afg ,_bcca ._afg .Bounds (),_dab ,_e .Point {},_ca .Src );
|
|
};func (_dff *Context )SetMatrix (m _b .Matrix ){_dff ._gef =m };func NewContextForImage (im _e .Image )*Context {return NewContextForRGBA (_dad (im ))}; |