mirror of
https://github.com/unidoc/unipdf.git
synced 2025-05-02 22:17:06 +08:00
659 lines
196 KiB
Go
659 lines
196 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 bitmap ;import (_dd "encoding/binary";_f "github.com/stretchr/testify/require";_ba "github.com/unidoc/unipdf/v3/common";_a "github.com/unidoc/unipdf/v3/internal/bitwise";_ca "github.com/unidoc/unipdf/v3/internal/imageutil";_fd "github.com/unidoc/unipdf/v3/internal/jbig2/basic";
|
|
_d "github.com/unidoc/unipdf/v3/internal/jbig2/errors";_e "image";_g "math";_bd "sort";_b "strings";_fa "testing";);type ClassedPoints struct{*Points ;_fd .IntSlice ;_befe func (_bbbe ,_cfcd int )bool ;};func (_gcgag *BitmapsArray )GetBox (i int )(*_e .Rectangle ,error ){const _effaf ="\u0042\u0069\u0074\u006dap\u0073\u0041\u0072\u0072\u0061\u0079\u002e\u0047\u0065\u0074\u0042\u006f\u0078";
|
|
if _gcgag ==nil {return nil ,_d .Error (_effaf ,"p\u0072\u006f\u0076\u0069\u0064\u0065d\u0020\u006e\u0069\u006c\u0020\u0027\u0042\u0069\u0074m\u0061\u0070\u0073A\u0072r\u0061\u0079\u0027");};if i > len (_gcgag .Boxes )-1{return nil ,_d .Errorf (_effaf ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
};return _gcgag .Boxes [i ],nil ;};func (_gcfcb *byHeight )Swap (i ,j int ){_gcfcb .Values [i ],_gcfcb .Values [j ]=_gcfcb .Values [j ],_gcfcb .Values [i ];if _gcfcb .Boxes !=nil {_gcfcb .Boxes [i ],_gcfcb .Boxes [j ]=_gcfcb .Boxes [j ],_gcfcb .Boxes [i ];
|
|
};};func (_gga *Bitmap )AddBorderGeneral (left ,right ,top ,bot int ,val int )(*Bitmap ,error ){return _gga .addBorderGeneral (left ,right ,top ,bot ,val );};func _fggb (_fge ,_bdef *Bitmap ,_gegc ,_baef int )(*Bitmap ,error ){const _adaf ="\u0065\u0072\u006f\u0064\u0065\u0042\u0072\u0069\u0063\u006b";
|
|
if _bdef ==nil {return nil ,_d .Error (_adaf ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _gegc < 1||_baef < 1{return nil ,_d .Error (_adaf ,"\u0068\u0073\u0069\u007a\u0065\u0020\u0061\u006e\u0064\u0020\u0076\u0073\u0069\u007a\u0065\u0020\u0061\u0072e\u0020\u006e\u006f\u0074\u0020\u0067\u0072e\u0061\u0074\u0065\u0072\u0020\u0074\u0068\u0061\u006e\u0020\u006fr\u0020\u0065\u0071\u0075\u0061\u006c\u0020\u0074\u006f\u0020\u0031");
|
|
};if _gegc ==1&&_baef ==1{_bbaa ,_bdba :=_bbe (_fge ,_bdef );if _bdba !=nil {return nil ,_d .Wrap (_bdba ,_adaf ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u0026\u0026 \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");};
|
|
return _bbaa ,nil ;};if _gegc ==1||_baef ==1{_eaa :=SelCreateBrick (_baef ,_gegc ,_baef /2,_gegc /2,SelHit );_ccff ,_ggfg :=_afdb (_fge ,_bdef ,_eaa );if _ggfg !=nil {return nil ,_d .Wrap (_ggfg ,_adaf ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _ccff ,nil ;};_fdce :=SelCreateBrick (1,_gegc ,0,_gegc /2,SelHit );_decb :=SelCreateBrick (_baef ,1,_baef /2,0,SelHit );_dcea ,_fcad :=_afdb (nil ,_bdef ,_fdce );if _fcad !=nil {return nil ,_d .Wrap (_fcad ,_adaf ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");
|
|
};_fge ,_fcad =_afdb (_fge ,_dcea ,_decb );if _fcad !=nil {return nil ,_d .Wrap (_fcad ,_adaf ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};return _fge ,nil ;};func SelCreateBrick (h ,w int ,cy ,cx int ,tp SelectionValue )*Selection {_fdec :=_dgeg (h ,w ,"");
|
|
_fdec .setOrigin (cy ,cx );var _bbcc ,_bfcc int ;for _bbcc =0;_bbcc < h ;_bbcc ++{for _bfcc =0;_bfcc < w ;_bfcc ++{_fdec .Data [_bbcc ][_bfcc ]=tp ;};};return _fdec ;};func Centroids (bms []*Bitmap )(*Points ,error ){_fadg :=make ([]Point ,len (bms ));
|
|
_eadb :=_ebde ();_cad :=_fdbe ();var _fcfd error ;for _cdgc ,_dbded :=range bms {_fadg [_cdgc ],_fcfd =_dbded .centroid (_eadb ,_cad );if _fcfd !=nil {return nil ,_fcfd ;};};_aggcg :=Points (_fadg );return &_aggcg ,nil ;};func (_ceed *ClassedPoints )xSortFunction ()func (_abae int ,_bfcf int )bool {return func (_gffc ,_ebaa int )bool {return _ceed .XAtIndex (_gffc )< _ceed .XAtIndex (_ebaa )};
|
|
};func _ceaaf (_cced ,_dbdf *Bitmap ,_ebbdg *Selection )(*Bitmap ,error ){const _gced ="c\u006c\u006f\u0073\u0065\u0042\u0069\u0074\u006d\u0061\u0070";var _efbb error ;if _cced ,_efbb =_ccfg (_cced ,_dbdf ,_ebbdg );_efbb !=nil {return nil ,_efbb ;};_aeef ,_efbb :=_dcd (nil ,_dbdf ,_ebbdg );
|
|
if _efbb !=nil {return nil ,_d .Wrap (_efbb ,_gced ,"");};if _ ,_efbb =_afdb (_cced ,_aeef ,_ebbdg );_efbb !=nil {return nil ,_d .Wrap (_efbb ,_gced ,"");};return _cced ,nil ;};func (_eba *Bitmap )setEightPartlyBytes (_fbcb ,_fbbg int ,_eadf uint64 )(_eea error ){var (_cabd byte ;
|
|
_ded int ;);const _defa ="\u0073\u0065\u0074\u0045ig\u0068\u0074\u0050\u0061\u0072\u0074\u006c\u0079\u0042\u0079\u0074\u0065\u0073";for _bded :=1;_bded <=_fbbg ;_bded ++{_ded =64-_bded *8;_cabd =byte (_eadf >>uint (_ded )&0xff);_ba .Log .Trace ("\u0074\u0065\u006d\u0070\u003a\u0020\u0025\u0030\u0038\u0062\u002c\u0020\u0069\u006e\u0064\u0065\u0078\u003a %\u0064,\u0020\u0069\u0064\u0078\u003a\u0020\u0025\u0064\u002c\u0020\u0066\u0075l\u006c\u0042\u0079\u0074\u0065\u0073\u004e\u0075\u006d\u0062\u0065\u0072\u003a\u0020\u0025\u0064\u002c \u0073\u0068\u0069\u0066\u0074\u003a\u0020\u0025\u0064",_cabd ,_fbcb ,_fbcb +_bded -1,_fbbg ,_ded );
|
|
if _eea =_eba .SetByte (_fbcb +_bded -1,_cabd );_eea !=nil {return _d .Wrap (_eea ,_defa ,"\u0066\u0075\u006c\u006c\u0042\u0079\u0074\u0065");};};_gea :=_eba .RowStride *8-_eba .Width ;if _gea ==0{return nil ;};_ded -=8;_cabd =byte (_eadf >>uint (_ded )&0xff)<<uint (_gea );
|
|
if _eea =_eba .SetByte (_fbcb +_fbbg ,_cabd );_eea !=nil {return _d .Wrap (_eea ,_defa ,"\u0070\u0061\u0064\u0064\u0065\u0064");};return nil ;};func Extract (roi _e .Rectangle ,src *Bitmap )(*Bitmap ,error ){_bfda :=New (roi .Dx (),roi .Dy ());_egae :=roi .Min .X &0x07;
|
|
_dadg :=8-_egae ;_bebeb :=uint (8-_bfda .Width &0x07);_cbfg :=src .GetByteIndex (roi .Min .X ,roi .Min .Y );_ggad :=src .GetByteIndex (roi .Max .X -1,roi .Min .Y );_cfg :=_bfda .RowStride ==_ggad +1-_cbfg ;var _baff int ;for _fbaf :=roi .Min .Y ;_fbaf < roi .Max .Y ;
|
|
_fbaf ++{_bdedc :=_cbfg ;_gdg :=_baff ;switch {case _cbfg ==_ggad :_cgc ,_agdbc :=src .GetByte (_bdedc );if _agdbc !=nil {return nil ,_agdbc ;};_cgc <<=uint (_egae );_agdbc =_bfda .SetByte (_gdg ,_cage (_bebeb ,_cgc ));if _agdbc !=nil {return nil ,_agdbc ;
|
|
};case _egae ==0:for _cddf :=_cbfg ;_cddf <=_ggad ;_cddf ++{_efea ,_acg :=src .GetByte (_bdedc );if _acg !=nil {return nil ,_acg ;};_bdedc ++;if _cddf ==_ggad &&_cfg {_efea =_cage (_bebeb ,_efea );};_acg =_bfda .SetByte (_gdg ,_efea );if _acg !=nil {return nil ,_acg ;
|
|
};_gdg ++;};default:_gecg :=_aaef (src ,_bfda ,uint (_egae ),uint (_dadg ),_bebeb ,_cbfg ,_ggad ,_cfg ,_bdedc ,_gdg );if _gecg !=nil {return nil ,_gecg ;};};_cbfg +=src .RowStride ;_ggad +=src .RowStride ;_baff +=_bfda .RowStride ;};return _bfda ,nil ;
|
|
};func RasterOperation (dest *Bitmap ,dx ,dy ,dw ,dh int ,op RasterOperator ,src *Bitmap ,sx ,sy int )error {return _eagg (dest ,dx ,dy ,dw ,dh ,op ,src ,sx ,sy );};func (_edd *Bitmap )RemoveBorderGeneral (left ,right ,top ,bot int )(*Bitmap ,error ){return _edd .removeBorderGeneral (left ,right ,top ,bot );
|
|
};func _egc (_bab *Bitmap ,_fe int ,_fde []byte )(_cg *Bitmap ,_eec error ){const _ebg ="\u0072\u0065\u0064\u0075\u0063\u0065\u0052\u0061\u006e\u006b\u0042\u0069n\u0061\u0072\u0079\u0032";if _bab ==nil {return nil ,_d .Error (_ebg ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");
|
|
};if _fe < 1||_fe > 4{return nil ,_d .Error (_ebg ,"\u006c\u0065\u0076\u0065\u006c\u0020\u006d\u0075\u0073\u0074 \u0062\u0065\u0020\u0069\u006e\u0020\u0073e\u0074\u0020\u007b\u0031\u002c\u0032\u002c\u0033\u002c\u0034\u007d");};if _bab .Height <=1{return nil ,_d .Errorf (_ebg ,"\u0073o\u0075\u0072c\u0065\u0020\u0068e\u0069\u0067\u0068\u0074\u0020\u006d\u0075s\u0074\u0020\u0062\u0065\u0020\u0061t\u0020\u006c\u0065\u0061\u0073\u0074\u0020\u0027\u0032\u0027\u0020-\u0020\u0069\u0073\u003a\u0020\u0027\u0025\u0064\u0027",_bab .Height );
|
|
};_cg =New (_bab .Width /2,_bab .Height /2);if _fde ==nil {_fde =_bacc ();};_daa :=_cbf (_bab .RowStride ,2*_cg .RowStride );switch _fe {case 1:_eec =_bee (_bab ,_cg ,_fe ,_fde ,_daa );case 2:_eec =_bcb (_bab ,_cg ,_fe ,_fde ,_daa );case 3:_eec =_cge (_bab ,_cg ,_fe ,_fde ,_daa );
|
|
case 4:_eec =_ccg (_bab ,_cg ,_fe ,_fde ,_daa );};if _eec !=nil {return nil ,_eec ;};return _cg ,nil ;};func (_ecdef *ClassedPoints )Less (i ,j int )bool {return _ecdef ._befe (i ,j )};func (_ecaa Points )Size ()int {return len (_ecaa )};func (_cfa *Bitmap )GetChocolateData ()[]byte {if _cfa .Color ==Vanilla {_cfa .inverseData ();
|
|
};return _cfa .Data ;};func init (){for _ecea :=0;_ecea < 256;_ecea ++{_bedd [_ecea ]=uint8 (_ecea &0x1)+(uint8 (_ecea >>1)&0x1)+(uint8 (_ecea >>2)&0x1)+(uint8 (_ecea >>3)&0x1)+(uint8 (_ecea >>4)&0x1)+(uint8 (_ecea >>5)&0x1)+(uint8 (_ecea >>6)&0x1)+(uint8 (_ecea >>7)&0x1);
|
|
};};func _dfdg (_bcgc *Bitmap )(_cgbb *Bitmap ,_fcfg int ,_ddaf error ){const _dgfc ="\u0042i\u0074\u006d\u0061\u0070.\u0077\u006f\u0072\u0064\u004da\u0073k\u0042y\u0044\u0069\u006c\u0061\u0074\u0069\u006fn";if _bcgc ==nil {return nil ,0,_d .Errorf (_dgfc ,"\u0027\u0073\u0027\u0020bi\u0074\u006d\u0061\u0070\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006ee\u0064");
|
|
};var _faaf ,_fdfg *Bitmap ;if _faaf ,_ddaf =_bbe (nil ,_bcgc );_ddaf !=nil {return nil ,0,_d .Wrap (_ddaf ,_dgfc ,"\u0063\u006f\u0070\u0079\u0020\u0027\u0073\u0027");};var (_agba [13]int ;_acda ,_dafea int ;);_dfcb :=12;_ccag :=_fd .NewNumSlice (_dfcb +1);
|
|
_cbed :=_fd .NewNumSlice (_dfcb +1);var _febg *Boxes ;for _cefa :=0;_cefa <=_dfcb ;_cefa ++{if _cefa ==0{if _fdfg ,_ddaf =_bbe (nil ,_faaf );_ddaf !=nil {return nil ,0,_d .Wrap (_ddaf ,_dgfc ,"\u0066i\u0072\u0073\u0074\u0020\u0062\u006d2");};}else {if _fdfg ,_ddaf =_aagd (_faaf ,MorphProcess {Operation :MopDilation ,Arguments :[]int {2,1}});
|
|
_ddaf !=nil {return nil ,0,_d .Wrap (_ddaf ,_dgfc ,"\u0064\u0069\u006ca\u0074\u0069\u006f\u006e\u0020\u0062\u006d\u0032");};};if _febg ,_ddaf =_fdfg .connComponentsBB (4);_ddaf !=nil {return nil ,0,_d .Wrap (_ddaf ,_dgfc ,"");};_agba [_cefa ]=len (*_febg );
|
|
_ccag .AddInt (_agba [_cefa ]);switch _cefa {case 0:_acda =_agba [0];default:_dafea =_agba [_cefa -1]-_agba [_cefa ];_cbed .AddInt (_dafea );};_faaf =_fdfg ;};_bedf :=true ;_degd :=2;var _dgffa ,_dbfd int ;for _afac :=1;_afac < len (*_cbed );_afac ++{if _dgffa ,_ddaf =_ccag .GetInt (_afac );
|
|
_ddaf !=nil {return nil ,0,_d .Wrap (_ddaf ,_dgfc ,"\u0043\u0068\u0065\u0063ki\u006e\u0067\u0020\u0062\u0065\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0069o\u006e");};if _bedf &&_dgffa < int (0.3*float32 (_acda )){_degd =_afac +1;_bedf =false ;};
|
|
if _dafea ,_ddaf =_cbed .GetInt (_afac );_ddaf !=nil {return nil ,0,_d .Wrap (_ddaf ,_dgfc ,"\u0067\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u006ea\u0044\u0069\u0066\u0066");};if _dafea > _dbfd {_dbfd =_dafea ;};};_beec :=_bcgc .XResolution ;if _beec ==0{_beec =150;
|
|
};if _beec > 110{_degd ++;};if _degd < 2{_ba .Log .Trace ("J\u0042\u0049\u0047\u0032\u0020\u0073\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u0069\u0042\u0065\u0073\u0074 \u0074\u006f\u0020\u006d\u0069\u006e\u0069\u006d\u0075\u006d a\u006c\u006c\u006fw\u0061b\u006c\u0065");
|
|
_degd =2;};_fcfg =_degd +1;if _cgbb ,_ddaf =_aegf (nil ,_bcgc ,_degd +1,1);_ddaf !=nil {return nil ,0,_d .Wrap (_ddaf ,_dgfc ,"\u0067\u0065\u0074\u0074in\u0067\u0020\u006d\u0061\u0073\u006b\u0020\u0066\u0061\u0069\u006c\u0065\u0064");};return _cgbb ,_fcfg ,nil ;
|
|
};func (_cdfa *ClassedPoints )validateIntSlice ()error {const _gbde ="\u0076\u0061l\u0069\u0064\u0061t\u0065\u0049\u006e\u0074\u0053\u006c\u0069\u0063\u0065";for _ ,_fcabg :=range _cdfa .IntSlice {if _fcabg >=(_cdfa .Points .Size ()){return _d .Errorf (_gbde ,"c\u006c\u0061\u0073\u0073\u0020\u0069\u0064\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u0069\u0073\u0020\u006e\u006f\u0074\u0020\u0061\u0020\u0076\u0061\u006ci\u0064 \u0069\u006e\u0064\u0065x\u0020\u0069n\u0020\u0074\u0068\u0065\u0020\u0070\u006f\u0069\u006e\u0074\u0073\u0020\u006f\u0066\u0020\u0073\u0069\u007a\u0065\u003a\u0020\u0025\u0064",_fcabg ,_cdfa .Points .Size ());
|
|
};};return nil ;};func (_cag *Bitmap )setPadBits (_eadc int ){_bdc :=8-_cag .Width %8;if _bdc ==8{return ;};_fdg :=_cag .Width /8;_bdcb :=_caeaf [_bdc ];if _eadc ==0{_bdcb ^=_bdcb ;};var _bge int ;for _cgd :=0;_cgd < _cag .Height ;_cgd ++{_bge =_cgd *_cag .RowStride +_fdg ;
|
|
if _eadc ==0{_cag .Data [_bge ]&=_bdcb ;}else {_cag .Data [_bge ]|=_bdcb ;};};};func (_cdbc *Bitmaps )AddBitmap (bm *Bitmap ){_cdbc .Values =append (_cdbc .Values ,bm )};type Getter interface{GetBitmap ()*Bitmap ;};func (_bffg Points )YSorter ()func (_eaaa ,_agdc int )bool {return func (_dgcb ,_gdbd int )bool {return _bffg [_dgcb ].Y < _bffg [_gdbd ].Y };
|
|
};func TstVSymbol (t *_fa .T ,scale ...int )*Bitmap {_efca ,_fcaab :=NewWithData (5,5,[]byte {0x88,0x88,0x88,0x50,0x20});_f .NoError (t ,_fcaab );return TstGetScaledSymbol (t ,_efca ,scale ...);};func DilateBrick (d ,s *Bitmap ,hSize ,vSize int )(*Bitmap ,error ){return _acaa (d ,s ,hSize ,vSize )};
|
|
type LocationFilter int ;func (_baaf *Boxes )Add (box *_e .Rectangle )error {if _baaf ==nil {return _d .Error ("\u0042o\u0078\u0065\u0073\u002e\u0041\u0064d","\u0027\u0042\u006f\u0078es\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};*_baaf =append (*_baaf ,box );return nil ;};func (_dgge *Bitmap )GetBitOffset (x int )int {return x &0x07};func (_bdcge *Bitmap )centroid (_bdcbg ,_bbee []int )(Point ,error ){_bef :=Point {};_bdcge .setPadBits (0);if len (_bdcbg )==0{_bdcbg =_ebde ();
|
|
};if len (_bbee )==0{_bbee =_fdbe ();};var _acca ,_eefc ,_gecgb ,_efge ,_efbec ,_ggdf int ;var _aecb byte ;for _efbec =0;_efbec < _bdcge .Height ;_efbec ++{_gacc :=_bdcge .RowStride *_efbec ;_efge =0;for _ggdf =0;_ggdf < _bdcge .RowStride ;_ggdf ++{_aecb =_bdcge .Data [_gacc +_ggdf ];
|
|
if _aecb !=0{_efge +=_bbee [_aecb ];_acca +=_bdcbg [_aecb ]+_ggdf *8*_bbee [_aecb ];};};_gecgb +=_efge ;_eefc +=_efge *_efbec ;};if _gecgb !=0{_bef .X =float32 (_acca )/float32 (_gecgb );_bef .Y =float32 (_eefc )/float32 (_gecgb );};return _bef ,nil ;};
|
|
func RankHausTest (p1 ,p2 ,p3 ,p4 *Bitmap ,delX ,delY float32 ,maxDiffW ,maxDiffH ,area1 ,area3 int ,rank float32 ,tab8 []int )(_dccd bool ,_cgcc error ){const _adfd ="\u0052\u0061\u006ek\u0048\u0061\u0075\u0073\u0054\u0065\u0073\u0074";_dgec ,_geeb :=p1 .Width ,p1 .Height ;
|
|
_eggf ,_aegd :=p3 .Width ,p3 .Height ;if _fd .Abs (_dgec -_eggf )> maxDiffW {return false ,nil ;};if _fd .Abs (_geeb -_aegd )> maxDiffH {return false ,nil ;};_gcgg :=int (float32 (area1 )*(1.0-rank )+0.5);_bfag :=int (float32 (area3 )*(1.0-rank )+0.5);
|
|
var _cggd ,_gaaf int ;if delX >=0{_cggd =int (delX +0.5);}else {_cggd =int (delX -0.5);};if delY >=0{_gaaf =int (delY +0.5);}else {_gaaf =int (delY -0.5);};_gcfa :=p1 .CreateTemplate ();if _cgcc =_gcfa .RasterOperation (0,0,_dgec ,_geeb ,PixSrc ,p1 ,0,0);
|
|
_cgcc !=nil {return false ,_d .Wrap (_cgcc ,_adfd ,"p\u0031\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _cgcc =_gcfa .RasterOperation (_cggd ,_gaaf ,_dgec ,_geeb ,PixNotSrcAndDst ,p4 ,0,0);_cgcc !=nil {return false ,_d .Wrap (_cgcc ,_adfd ,"\u0074 \u0026\u0020\u0021\u0070\u0034");
|
|
};_dccd ,_cgcc =_gcfa .ThresholdPixelSum (_gcgg ,tab8 );if _cgcc !=nil {return false ,_d .Wrap (_cgcc ,_adfd ,"\u0074\u002d\u003e\u0074\u0068\u0072\u0065\u0073\u0068\u0031");};if _dccd {return false ,nil ;};if _cgcc =_gcfa .RasterOperation (_cggd ,_gaaf ,_eggf ,_aegd ,PixSrc ,p3 ,0,0);
|
|
_cgcc !=nil {return false ,_d .Wrap (_cgcc ,_adfd ,"p\u0033\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _cgcc =_gcfa .RasterOperation (0,0,_eggf ,_aegd ,PixNotSrcAndDst ,p2 ,0,0);_cgcc !=nil {return false ,_d .Wrap (_cgcc ,_adfd ,"\u0074 \u0026\u0020\u0021\u0070\u0032");
|
|
};_dccd ,_cgcc =_gcfa .ThresholdPixelSum (_bfag ,tab8 );if _cgcc !=nil {return false ,_d .Wrap (_cgcc ,_adfd ,"\u0074\u002d\u003e\u0074\u0068\u0072\u0065\u0073\u0068\u0033");};return !_dccd ,nil ;};func _dede (_gbfg *Bitmap ,_aegc *_fd .Stack ,_ebacg ,_gedc int )(_cbd *_e .Rectangle ,_caaa error ){const _bfedd ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";
|
|
if _gbfg ==nil {return nil ,_d .Error (_bfedd ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");};if _aegc ==nil {return nil ,_d .Error (_bfedd ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");
|
|
};_cbcaf ,_gegd :=_gbfg .Width ,_gbfg .Height ;_bage :=_cbcaf -1;_dbba :=_gegd -1;if _ebacg < 0||_ebacg > _bage ||_gedc < 0||_gedc > _dbba ||!_gbfg .GetPixel (_ebacg ,_gedc ){return nil ,nil ;};var _adabe *_e .Rectangle ;_adabe ,_caaa =Rect (100000,100000,0,0);
|
|
if _caaa !=nil {return nil ,_d .Wrap (_caaa ,_bfedd ,"");};if _caaa =_bbcbc (_aegc ,_ebacg ,_ebacg ,_gedc ,1,_dbba ,_adabe );_caaa !=nil {return nil ,_d .Wrap (_caaa ,_bfedd ,"\u0069\u006e\u0069t\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _caaa =_bbcbc (_aegc ,_ebacg ,_ebacg ,_gedc +1,-1,_dbba ,_adabe );
|
|
_caaa !=nil {return nil ,_d .Wrap (_caaa ,_bfedd ,"\u0032\u006ed\u0020\u0069\u006ei\u0074\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};_adabe .Min .X ,_adabe .Max .X =_ebacg ,_ebacg ;_adabe .Min .Y ,_adabe .Max .Y =_gedc ,_gedc ;var (_dbbc *fillSegment ;
|
|
_aace int ;);for _aegc .Len ()> 0{if _dbbc ,_caaa =_aegfb (_aegc );_caaa !=nil {return nil ,_d .Wrap (_caaa ,_bfedd ,"");};_gedc =_dbbc ._daca ;for _ebacg =_dbbc ._bgade ;_ebacg >=0&&_gbfg .GetPixel (_ebacg ,_gedc );_ebacg --{if _caaa =_gbfg .SetPixel (_ebacg ,_gedc ,0);
|
|
_caaa !=nil {return nil ,_d .Wrap (_caaa ,_bfedd ,"");};};if _ebacg >=_dbbc ._bgade {for _ebacg ++;_ebacg <=_dbbc ._bbggc &&_ebacg <=_bage &&!_gbfg .GetPixel (_ebacg ,_gedc );_ebacg ++{};_aace =_ebacg ;if !(_ebacg <=_dbbc ._bbggc &&_ebacg <=_bage ){continue ;
|
|
};}else {_aace =_ebacg +1;if _aace < _dbbc ._bgade -1{if _caaa =_bbcbc (_aegc ,_aace ,_dbbc ._bgade -1,_dbbc ._daca ,-_dbbc ._gdbc ,_dbba ,_adabe );_caaa !=nil {return nil ,_d .Wrap (_caaa ,_bfedd ,"\u006c\u0065\u0061\u006b\u0020\u006f\u006e\u0020\u006c\u0065\u0066\u0074 \u0073\u0069\u0064\u0065");
|
|
};};_ebacg =_dbbc ._bgade +1;};for {for ;_ebacg <=_bage &&_gbfg .GetPixel (_ebacg ,_gedc );_ebacg ++{if _caaa =_gbfg .SetPixel (_ebacg ,_gedc ,0);_caaa !=nil {return nil ,_d .Wrap (_caaa ,_bfedd ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _caaa =_bbcbc (_aegc ,_aace ,_ebacg -1,_dbbc ._daca ,_dbbc ._gdbc ,_dbba ,_adabe );
|
|
_caaa !=nil {return nil ,_d .Wrap (_caaa ,_bfedd ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _ebacg > _dbbc ._bbggc +1{if _caaa =_bbcbc (_aegc ,_dbbc ._bbggc +1,_ebacg -1,_dbbc ._daca ,-_dbbc ._gdbc ,_dbba ,_adabe );_caaa !=nil {return nil ,_d .Wrap (_caaa ,_bfedd ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");
|
|
};};for _ebacg ++;_ebacg <=_dbbc ._bbggc &&_ebacg <=_bage &&!_gbfg .GetPixel (_ebacg ,_gedc );_ebacg ++{};_aace =_ebacg ;if !(_ebacg <=_dbbc ._bbggc &&_ebacg <=_bage ){break ;};};};_adabe .Max .X ++;_adabe .Max .Y ++;return _adabe ,nil ;};const (AsymmetricMorphBC BoundaryCondition =iota ;
|
|
SymmetricMorphBC ;);func (_fcca *Bitmap )SetPixel (x ,y int ,pixel byte )error {_dba :=_fcca .GetByteIndex (x ,y );if _dba > len (_fcca .Data )-1{return _d .Errorf ("\u0053\u0065\u0074\u0050\u0069\u0078\u0065\u006c","\u0069\u006e\u0064\u0065x \u006f\u0075\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u003a\u0020%\u0064",_dba );
|
|
};_bdg :=_fcca .GetBitOffset (x );_dacb :=uint (7-_bdg );_cfe :=_fcca .Data [_dba ];var _cddc byte ;if pixel ==1{_cddc =_cfe |(pixel &0x01<<_dacb );}else {_cddc =_cfe &^(1<<_dacb );};_fcca .Data [_dba ]=_cddc ;return nil ;};func _ccfg (_cecf ,_cfcc *Bitmap ,_cdebc *Selection )(*Bitmap ,error ){const _badg ="\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u004d\u006f\u0072\u0070\u0068A\u0072\u0067\u0073\u0032";
|
|
var _cebe ,_bcae int ;if _cfcc ==nil {return nil ,_d .Error (_badg ,"s\u006fu\u0072\u0063\u0065\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");};if _cdebc ==nil {return nil ,_d .Error (_badg ,"\u0073e\u006c \u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};_cebe =_cdebc .Width ;_bcae =_cdebc .Height ;if _cebe ==0||_bcae ==0{return nil ,_d .Error (_badg ,"\u0073\u0065\u006c\u0020\u006f\u0066\u0020\u0073\u0069\u007a\u0065\u0020\u0030");};if _cecf ==nil {return _cfcc .createTemplate (),nil ;};if _cega :=_cecf .resizeImageData (_cfcc );
|
|
_cega !=nil {return nil ,_cega ;};return _cecf ,nil ;};func (_ebfea *ClassedPoints )SortByX (){_ebfea ._befe =_ebfea .xSortFunction ();_bd .Sort (_ebfea )};func Copy (d ,s *Bitmap )(*Bitmap ,error ){return _bbe (d ,s )};func (_cabbf *Bitmaps )GroupByHeight ()(*BitmapsArray ,error ){const _bagbf ="\u0047\u0072\u006f\u0075\u0070\u0042\u0079\u0048\u0065\u0069\u0067\u0068\u0074";
|
|
if len (_cabbf .Values )==0{return nil ,_d .Error (_bagbf ,"\u006eo\u0020v\u0061\u006c\u0075\u0065\u0073 \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");};_bgace :=&BitmapsArray {};_cabbf .SortByHeight ();_fdag :=-1;_bedfa :=-1;for _cefe :=0;_cefe < len (_cabbf .Values );
|
|
_cefe ++{_gcff :=_cabbf .Values [_cefe ].Height ;if _gcff > _fdag {_fdag =_gcff ;_bedfa ++;_bgace .Values =append (_bgace .Values ,&Bitmaps {});};_bgace .Values [_bedfa ].AddBitmap (_cabbf .Values [_cefe ]);};return _bgace ,nil ;};func _ecae (_dcag *Bitmap ,_dffb *_fd .Stack ,_fgd ,_cfde int )(_efbf *_e .Rectangle ,_dafba error ){const _egcfb ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";
|
|
if _dcag ==nil {return nil ,_d .Error (_egcfb ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");};if _dffb ==nil {return nil ,_d .Error (_egcfb ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");
|
|
};_ggea ,_dcda :=_dcag .Width ,_dcag .Height ;_bbead :=_ggea -1;_caebb :=_dcda -1;if _fgd < 0||_fgd > _bbead ||_cfde < 0||_cfde > _caebb ||!_dcag .GetPixel (_fgd ,_cfde ){return nil ,nil ;};_cadb :=_e .Rect (100000,100000,0,0);if _dafba =_bbcbc (_dffb ,_fgd ,_fgd ,_cfde ,1,_caebb ,&_cadb );
|
|
_dafba !=nil {return nil ,_d .Wrap (_dafba ,_egcfb ,"\u0069\u006e\u0069t\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _dafba =_bbcbc (_dffb ,_fgd ,_fgd ,_cfde +1,-1,_caebb ,&_cadb );_dafba !=nil {return nil ,_d .Wrap (_dafba ,_egcfb ,"\u0032\u006ed\u0020\u0069\u006ei\u0074\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");
|
|
};_cadb .Min .X ,_cadb .Max .X =_fgd ,_fgd ;_cadb .Min .Y ,_cadb .Max .Y =_cfde ,_cfde ;var (_fabgc *fillSegment ;_agdgg int ;);for _dffb .Len ()> 0{if _fabgc ,_dafba =_aegfb (_dffb );_dafba !=nil {return nil ,_d .Wrap (_dafba ,_egcfb ,"");};_cfde =_fabgc ._daca ;
|
|
for _fgd =_fabgc ._bgade -1;_fgd >=0&&_dcag .GetPixel (_fgd ,_cfde );_fgd --{if _dafba =_dcag .SetPixel (_fgd ,_cfde ,0);_dafba !=nil {return nil ,_d .Wrap (_dafba ,_egcfb ,"\u0031s\u0074\u0020\u0073\u0065\u0074");};};if _fgd >=_fabgc ._bgade -1{for {for _fgd ++;
|
|
_fgd <=_fabgc ._bbggc +1&&_fgd <=_bbead &&!_dcag .GetPixel (_fgd ,_cfde );_fgd ++{};_agdgg =_fgd ;if !(_fgd <=_fabgc ._bbggc +1&&_fgd <=_bbead ){break ;};for ;_fgd <=_bbead &&_dcag .GetPixel (_fgd ,_cfde );_fgd ++{if _dafba =_dcag .SetPixel (_fgd ,_cfde ,0);
|
|
_dafba !=nil {return nil ,_d .Wrap (_dafba ,_egcfb ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _dafba =_bbcbc (_dffb ,_agdgg ,_fgd -1,_fabgc ._daca ,_fabgc ._gdbc ,_caebb ,&_cadb );_dafba !=nil {return nil ,_d .Wrap (_dafba ,_egcfb ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");
|
|
};if _fgd > _fabgc ._bbggc {if _dafba =_bbcbc (_dffb ,_fabgc ._bbggc +1,_fgd -1,_fabgc ._daca ,-_fabgc ._gdbc ,_caebb ,&_cadb );_dafba !=nil {return nil ,_d .Wrap (_dafba ,_egcfb ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");
|
|
};};};continue ;};_agdgg =_fgd +1;if _agdgg < _fabgc ._bgade {if _dafba =_bbcbc (_dffb ,_agdgg ,_fabgc ._bgade -1,_fabgc ._daca ,-_fabgc ._gdbc ,_caebb ,&_cadb );_dafba !=nil {return nil ,_d .Wrap (_dafba ,_egcfb ,"\u006c\u0065\u0061\u006b\u0020\u006f\u006e\u0020\u006c\u0065\u0066\u0074 \u0073\u0069\u0064\u0065");
|
|
};};_fgd =_fabgc ._bgade ;for {for ;_fgd <=_bbead &&_dcag .GetPixel (_fgd ,_cfde );_fgd ++{if _dafba =_dcag .SetPixel (_fgd ,_cfde ,0);_dafba !=nil {return nil ,_d .Wrap (_dafba ,_egcfb ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _dafba =_bbcbc (_dffb ,_agdgg ,_fgd -1,_fabgc ._daca ,_fabgc ._gdbc ,_caebb ,&_cadb );
|
|
_dafba !=nil {return nil ,_d .Wrap (_dafba ,_egcfb ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _fgd > _fabgc ._bbggc {if _dafba =_bbcbc (_dffb ,_fabgc ._bbggc +1,_fgd -1,_fabgc ._daca ,-_fabgc ._gdbc ,_caebb ,&_cadb );_dafba !=nil {return nil ,_d .Wrap (_dafba ,_egcfb ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");
|
|
};};for _fgd ++;_fgd <=_fabgc ._bbggc +1&&_fgd <=_bbead &&!_dcag .GetPixel (_fgd ,_cfde );_fgd ++{};_agdgg =_fgd ;if !(_fgd <=_fabgc ._bbggc +1&&_fgd <=_bbead ){break ;};};};_cadb .Max .X ++;_cadb .Max .Y ++;return &_cadb ,nil ;};func (_dbfg MorphProcess )getWidthHeight ()(_fcbe ,_bdcg int ){return _dbfg .Arguments [0],_dbfg .Arguments [1];
|
|
};func _bgc (_fff ,_bba *Bitmap )(_bgcg error ){const _beb ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0038";_ae :=_bba .RowStride ;_eb :=_fff .RowStride ;var _dbe ,_baa ,_bgf ,_ffb ,_ed int ;for _bgf =0;
|
|
_bgf < _bba .Height ;_bgf ++{_dbe =_bgf *_ae ;_baa =8*_bgf *_eb ;for _ffb =0;_ffb < _ae ;_ffb ++{if _bgcg =_fff .setEightBytes (_baa +_ffb *8,_fdee [_bba .Data [_dbe +_ffb ]]);_bgcg !=nil {return _d .Wrap (_bgcg ,_beb ,"");};};for _ed =1;_ed < 8;_ed ++{for _ffb =0;
|
|
_ffb < _eb ;_ffb ++{if _bgcg =_fff .SetByte (_baa +_ed *_eb +_ffb ,_fff .Data [_baa +_ffb ]);_bgcg !=nil {return _d .Wrap (_bgcg ,_beb ,"");};};};};return nil ;};func (_egcf *Bitmap )GetComponents (components Component ,maxWidth ,maxHeight int )(_cfff *Bitmaps ,_fabd *Boxes ,_dbcf error ){const _eafb ="B\u0069t\u006d\u0061\u0070\u002e\u0047\u0065\u0074\u0043o\u006d\u0070\u006f\u006een\u0074\u0073";
|
|
if _egcf ==nil {return nil ,nil ,_d .Error (_eafb ,"\u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0042\u0069\u0074\u006da\u0070\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069n\u0065\u0064\u002e");};switch components {case ComponentConn ,ComponentCharacters ,ComponentWords :default:return nil ,nil ,_d .Error (_eafb ,"\u0069\u006e\u0076\u0061l\u0069\u0064\u0020\u0063\u006f\u006d\u0070\u006f\u006e\u0065n\u0074s\u0020\u0070\u0061\u0072\u0061\u006d\u0065t\u0065\u0072");
|
|
};if _egcf .Zero (){_fabd =&Boxes {};_cfff =&Bitmaps {};return _cfff ,_fabd ,nil ;};switch components {case ComponentConn :_cfff =&Bitmaps {};if _fabd ,_dbcf =_egcf .ConnComponents (_cfff ,8);_dbcf !=nil {return nil ,nil ,_d .Wrap (_dbcf ,_eafb ,"\u006e\u006f \u0070\u0072\u0065p\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");
|
|
};case ComponentCharacters :_degab ,_fecg :=MorphSequence (_egcf ,MorphProcess {Operation :MopClosing ,Arguments :[]int {1,6}});if _fecg !=nil {return nil ,nil ,_d .Wrap (_fecg ,_eafb ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");
|
|
};if _ba .Log .IsLogLevel (_ba .LogLevelTrace ){_ba .Log .Trace ("\u0043o\u006d\u0070o\u006e\u0065\u006e\u0074C\u0068\u0061\u0072a\u0063\u0074\u0065\u0072\u0073\u0020\u0062\u0069\u0074ma\u0070\u0020\u0061f\u0074\u0065r\u0020\u0063\u006c\u006f\u0073\u0069n\u0067\u003a \u0025\u0073",_degab .String ());
|
|
};_ggd :=&Bitmaps {};_fabd ,_fecg =_degab .ConnComponents (_ggd ,8);if _fecg !=nil {return nil ,nil ,_d .Wrap (_fecg ,_eafb ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");
|
|
};if _ba .Log .IsLogLevel (_ba .LogLevelTrace ){_ba .Log .Trace ("\u0043\u006f\u006d\u0070\u006f\u006ee\u006e\u0074\u0043\u0068\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0062\u0069\u0074\u006d\u0061\u0070\u0020a\u0066\u0074\u0065\u0072\u0020\u0063\u006f\u006e\u006e\u0065\u0063\u0074\u0069\u0076i\u0074y\u003a\u0020\u0025\u0073",_ggd .String ());
|
|
};if _cfff ,_fecg =_ggd .ClipToBitmap (_egcf );_fecg !=nil {return nil ,nil ,_d .Wrap (_fecg ,_eafb ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");};case ComponentWords :_edbcd :=1;
|
|
var _aead *Bitmap ;switch {case _egcf .XResolution <=200:_aead =_egcf ;case _egcf .XResolution <=400:_edbcd =2;_aead ,_dbcf =_efe (_egcf ,1,0,0,0);if _dbcf !=nil {return nil ,nil ,_d .Wrap (_dbcf ,_eafb ,"w\u006f\u0072\u0064\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0020\u002d \u0078\u0072\u0065s\u003c=\u0034\u0030\u0030");
|
|
};default:_edbcd =4;_aead ,_dbcf =_efe (_egcf ,1,1,0,0);if _dbcf !=nil {return nil ,nil ,_d .Wrap (_dbcf ,_eafb ,"\u0077\u006f\u0072\u0064 \u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073 \u002d \u0078\u0072\u0065\u0073\u0020\u003e\u00204\u0030\u0030");
|
|
};};_bcef ,_ ,_adcc :=_dfdg (_aead );if _adcc !=nil {return nil ,nil ,_d .Wrap (_adcc ,_eafb ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");};_ddbad ,_adcc :=_ffaf (_bcef ,_edbcd );if _adcc !=nil {return nil ,nil ,_d .Wrap (_adcc ,_eafb ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");
|
|
};_fga :=&Bitmaps {};if _fabd ,_adcc =_ddbad .ConnComponents (_fga ,4);_adcc !=nil {return nil ,nil ,_d .Wrap (_adcc ,_eafb ,"\u0077\u006f\u0072\u0064\u0020\u0070r\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u002c\u0020\u0063\u006f\u006en\u0065\u0063\u0074\u0020\u0065\u0078\u0070a\u006e\u0064\u0065\u0064");
|
|
};if _cfff ,_adcc =_fga .ClipToBitmap (_egcf );_adcc !=nil {return nil ,nil ,_d .Wrap (_adcc ,_eafb ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");};};_cfff ,_dbcf =_cfff .SelectBySize (maxWidth ,maxHeight ,LocSelectIfBoth ,SizeSelectIfLTE );
|
|
if _dbcf !=nil {return nil ,nil ,_d .Wrap (_dbcf ,_eafb ,"");};_fabd ,_dbcf =_fabd .SelectBySize (maxWidth ,maxHeight ,LocSelectIfBoth ,SizeSelectIfLTE );if _dbcf !=nil {return nil ,nil ,_d .Wrap (_dbcf ,_eafb ,"");};return _cfff ,_fabd ,nil ;};func TstASymbol (t *_fa .T )*Bitmap {t .Helper ();
|
|
_cgda :=New (6,6);_f .NoError (t ,_cgda .SetPixel (1,0,1));_f .NoError (t ,_cgda .SetPixel (2,0,1));_f .NoError (t ,_cgda .SetPixel (3,0,1));_f .NoError (t ,_cgda .SetPixel (4,0,1));_f .NoError (t ,_cgda .SetPixel (5,1,1));_f .NoError (t ,_cgda .SetPixel (1,2,1));
|
|
_f .NoError (t ,_cgda .SetPixel (2,2,1));_f .NoError (t ,_cgda .SetPixel (3,2,1));_f .NoError (t ,_cgda .SetPixel (4,2,1));_f .NoError (t ,_cgda .SetPixel (5,2,1));_f .NoError (t ,_cgda .SetPixel (0,3,1));_f .NoError (t ,_cgda .SetPixel (5,3,1));_f .NoError (t ,_cgda .SetPixel (0,4,1));
|
|
_f .NoError (t ,_cgda .SetPixel (5,4,1));_f .NoError (t ,_cgda .SetPixel (1,5,1));_f .NoError (t ,_cgda .SetPixel (2,5,1));_f .NoError (t ,_cgda .SetPixel (3,5,1));_f .NoError (t ,_cgda .SetPixel (4,5,1));_f .NoError (t ,_cgda .SetPixel (5,5,1));return _cgda ;
|
|
};func (_gef *Bitmap )SetByte (index int ,v byte )error {if index > len (_gef .Data )-1||index < 0{return _d .Errorf ("\u0053e\u0074\u0042\u0079\u0074\u0065","\u0069\u006e\u0064\u0065x \u006f\u0075\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u003a\u0020%\u0064",index );
|
|
};_gef .Data [index ]=v ;return nil ;};func (_cbff *byHeight )Len ()int {return len (_cbff .Values )};func _afdb (_bdae ,_deec *Bitmap ,_dddc *Selection )(*Bitmap ,error ){const _gaag ="\u0065\u0072\u006fd\u0065";var (_fda error ;_ggac *Bitmap ;);_bdae ,_fda =_ffee (_bdae ,_deec ,_dddc ,&_ggac );
|
|
if _fda !=nil {return nil ,_d .Wrap (_fda ,_gaag ,"");};if _fda =_bdae .setAll ();_fda !=nil {return nil ,_d .Wrap (_fda ,_gaag ,"");};var _eggc SelectionValue ;for _bcea :=0;_bcea < _dddc .Height ;_bcea ++{for _dcdd :=0;_dcdd < _dddc .Width ;_dcdd ++{_eggc =_dddc .Data [_bcea ][_dcdd ];
|
|
if _eggc ==SelHit {_fda =_eagg (_bdae ,_dddc .Cx -_dcdd ,_dddc .Cy -_bcea ,_deec .Width ,_deec .Height ,PixSrcAndDst ,_ggac ,0,0);if _fda !=nil {return nil ,_d .Wrap (_fda ,_gaag ,"");};};};};if MorphBC ==SymmetricMorphBC {return _bdae ,nil ;};_bafc ,_bbdgg ,_eee ,_baace :=_dddc .findMaxTranslations ();
|
|
if _bafc > 0{if _fda =_bdae .RasterOperation (0,0,_bafc ,_deec .Height ,PixClr ,nil ,0,0);_fda !=nil {return nil ,_d .Wrap (_fda ,_gaag ,"\u0078\u0070\u0020\u003e\u0020\u0030");};};if _eee > 0{if _fda =_bdae .RasterOperation (_deec .Width -_eee ,0,_eee ,_deec .Height ,PixClr ,nil ,0,0);
|
|
_fda !=nil {return nil ,_d .Wrap (_fda ,_gaag ,"\u0078\u006e\u0020\u003e\u0020\u0030");};};if _bbdgg > 0{if _fda =_bdae .RasterOperation (0,0,_deec .Width ,_bbdgg ,PixClr ,nil ,0,0);_fda !=nil {return nil ,_d .Wrap (_fda ,_gaag ,"\u0079\u0070\u0020\u003e\u0020\u0030");
|
|
};};if _baace > 0{if _fda =_bdae .RasterOperation (0,_deec .Height -_baace ,_deec .Width ,_baace ,PixClr ,nil ,0,0);_fda !=nil {return nil ,_d .Wrap (_fda ,_gaag ,"\u0079\u006e\u0020\u003e\u0020\u0030");};};return _bdae ,nil ;};type Color int ;func _cgabd (_dedg *Bitmap ,_ccggd ,_gacca int ,_ccbf ,_fcdc int ,_dcfff RasterOperator ){var (_abga bool ;
|
|
_gadf bool ;_ebee int ;_gaccd int ;_gafg int ;_dabg int ;_debe bool ;_bcee byte ;);_gdgd :=8-(_ccggd &7);_dabe :=_caeaf [_gdgd ];_dcfc :=_dedg .RowStride *_gacca +(_ccggd >>3);if _ccbf < _gdgd {_abga =true ;_dabe &=_fgedf [8-_gdgd +_ccbf ];};if !_abga {_ebee =(_ccbf -_gdgd )>>3;
|
|
if _ebee !=0{_gadf =true ;_gaccd =_dcfc +1;};};_gafg =(_ccggd +_ccbf )&7;if !(_abga ||_gafg ==0){_debe =true ;_bcee =_fgedf [_gafg ];_dabg =_dcfc +1+_ebee ;};var _abdeg ,_acbf int ;switch _dcfff {case PixClr :for _abdeg =0;_abdeg < _fcdc ;_abdeg ++{_dedg .Data [_dcfc ]=_egcce (_dedg .Data [_dcfc ],0x0,_dabe );
|
|
_dcfc +=_dedg .RowStride ;};if _gadf {for _abdeg =0;_abdeg < _fcdc ;_abdeg ++{for _acbf =0;_acbf < _ebee ;_acbf ++{_dedg .Data [_gaccd +_acbf ]=0x0;};_gaccd +=_dedg .RowStride ;};};if _debe {for _abdeg =0;_abdeg < _fcdc ;_abdeg ++{_dedg .Data [_dabg ]=_egcce (_dedg .Data [_dabg ],0x0,_bcee );
|
|
_dabg +=_dedg .RowStride ;};};case PixSet :for _abdeg =0;_abdeg < _fcdc ;_abdeg ++{_dedg .Data [_dcfc ]=_egcce (_dedg .Data [_dcfc ],0xff,_dabe );_dcfc +=_dedg .RowStride ;};if _gadf {for _abdeg =0;_abdeg < _fcdc ;_abdeg ++{for _acbf =0;_acbf < _ebee ;
|
|
_acbf ++{_dedg .Data [_gaccd +_acbf ]=0xff;};_gaccd +=_dedg .RowStride ;};};if _debe {for _abdeg =0;_abdeg < _fcdc ;_abdeg ++{_dedg .Data [_dabg ]=_egcce (_dedg .Data [_dabg ],0xff,_bcee );_dabg +=_dedg .RowStride ;};};case PixNotDst :for _abdeg =0;_abdeg < _fcdc ;
|
|
_abdeg ++{_dedg .Data [_dcfc ]=_egcce (_dedg .Data [_dcfc ],^_dedg .Data [_dcfc ],_dabe );_dcfc +=_dedg .RowStride ;};if _gadf {for _abdeg =0;_abdeg < _fcdc ;_abdeg ++{for _acbf =0;_acbf < _ebee ;_acbf ++{_dedg .Data [_gaccd +_acbf ]=^(_dedg .Data [_gaccd +_acbf ]);
|
|
};_gaccd +=_dedg .RowStride ;};};if _debe {for _abdeg =0;_abdeg < _fcdc ;_abdeg ++{_dedg .Data [_dabg ]=_egcce (_dedg .Data [_dabg ],^_dedg .Data [_dabg ],_bcee );_dabg +=_dedg .RowStride ;};};};};const (PixSrc RasterOperator =0xc;PixDst RasterOperator =0xa;
|
|
PixNotSrc RasterOperator =0x3;PixNotDst RasterOperator =0x5;PixClr RasterOperator =0x0;PixSet RasterOperator =0xf;PixSrcOrDst RasterOperator =0xe;PixSrcAndDst RasterOperator =0x8;PixSrcXorDst RasterOperator =0x6;PixNotSrcOrDst RasterOperator =0xb;PixNotSrcAndDst RasterOperator =0x2;
|
|
PixSrcOrNotDst RasterOperator =0xd;PixSrcAndNotDst RasterOperator =0x4;PixNotPixSrcOrDst RasterOperator =0x1;PixNotPixSrcAndDst RasterOperator =0x7;PixNotPixSrcXorDst RasterOperator =0x9;PixPaint =PixSrcOrDst ;PixSubtract =PixNotSrcAndDst ;PixMask =PixSrcAndDst ;
|
|
);func _fc (_ddb *Bitmap ,_edb ,_bdb int )(*Bitmap ,error ){const _bcf ="e\u0078\u0070\u0061\u006edB\u0069n\u0061\u0072\u0079\u0052\u0065p\u006c\u0069\u0063\u0061\u0074\u0065";if _ddb ==nil {return nil ,_d .Error (_bcf ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if _edb <=0||_bdb <=0{return nil ,_d .Error (_bcf ,"\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0073\u0063\u0061l\u0065\u0020\u0066\u0061\u0063\u0074\u006f\u0072\u003a\u0020<\u003d\u0020\u0030");};if _edb ==_bdb {if _edb ==1{_fce ,_efd :=_bbe (nil ,_ddb );
|
|
if _efd !=nil {return nil ,_d .Wrap (_efd ,_bcf ,"\u0078\u0046\u0061\u0063\u0074\u0020\u003d\u003d\u0020y\u0046\u0061\u0063\u0074");};return _fce ,nil ;};if _edb ==2||_edb ==4||_edb ==8{_ebe ,_efg :=_ag (_ddb ,_edb );if _efg !=nil {return nil ,_d .Wrap (_efg ,_bcf ,"\u0078\u0046a\u0063\u0074\u0020i\u006e\u0020\u007b\u0032\u002c\u0034\u002c\u0038\u007d");
|
|
};return _ebe ,nil ;};};_eg :=_edb *_ddb .Width ;_afd :=_bdb *_ddb .Height ;_bac :=New (_eg ,_afd );_eag :=_bac .RowStride ;var (_deg ,_da ,_egf ,_agb ,_efc int ;_cb byte ;_ce error ;);for _da =0;_da < _ddb .Height ;_da ++{_deg =_bdb *_da *_eag ;for _egf =0;
|
|
_egf < _ddb .Width ;_egf ++{if _ada :=_ddb .GetPixel (_egf ,_da );_ada {_efc =_edb *_egf ;for _agb =0;_agb < _edb ;_agb ++{_bac .setBit (_deg *8+_efc +_agb );};};};for _agb =1;_agb < _bdb ;_agb ++{_ge :=_deg +_agb *_eag ;for _dcg :=0;_dcg < _eag ;_dcg ++{if _cb ,_ce =_bac .GetByte (_deg +_dcg );
|
|
_ce !=nil {return nil ,_d .Wrapf (_ce ,_bcf ,"\u0072\u0065\u0070\u006cic\u0061\u0074\u0069\u006e\u0067\u0020\u006c\u0069\u006e\u0065\u003a\u0020\u0027\u0025d\u0027",_agb );};if _ce =_bac .SetByte (_ge +_dcg ,_cb );_ce !=nil {return nil ,_d .Wrap (_ce ,_bcf ,"\u0053\u0065\u0074\u0074in\u0067\u0020\u0062\u0079\u0074\u0065\u0020\u0066\u0061\u0069\u006c\u0065\u0064");
|
|
};};};};return _bac ,nil ;};func _efeab (_bbbd ,_gefa *Bitmap ,_edfc ,_fdeg int )(_beddd error ){const _gbcb ="\u0073e\u0065d\u0066\u0069\u006c\u006c\u0042i\u006e\u0061r\u0079\u004c\u006f\u0077\u0038";var (_fcdfa ,_baae ,_fbged ,_cfab int ;_cbee ,_dacc ,_dbce ,_dgac ,_gcfdf ,_cgae ,_bgce ,_agbgb byte ;
|
|
);for _fcdfa =0;_fcdfa < _edfc ;_fcdfa ++{_fbged =_fcdfa *_bbbd .RowStride ;_cfab =_fcdfa *_gefa .RowStride ;for _baae =0;_baae < _fdeg ;_baae ++{if _cbee ,_beddd =_bbbd .GetByte (_fbged +_baae );_beddd !=nil {return _d .Wrap (_beddd ,_gbcb ,"\u0067e\u0074 \u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0062\u0079\u0074\u0065");
|
|
};if _dacc ,_beddd =_gefa .GetByte (_cfab +_baae );_beddd !=nil {return _d .Wrap (_beddd ,_gbcb ,"\u0067\u0065\u0074\u0020\u006d\u0061\u0073\u006b\u0020\u0062\u0079\u0074\u0065");};if _fcdfa > 0{if _dbce ,_beddd =_bbbd .GetByte (_fbged -_bbbd .RowStride +_baae );
|
|
_beddd !=nil {return _d .Wrap (_beddd ,_gbcb ,"\u0069\u0020\u003e\u0020\u0030\u0020\u0062\u0079\u0074\u0065");};_cbee |=_dbce |(_dbce <<1)|(_dbce >>1);if _baae > 0{if _agbgb ,_beddd =_bbbd .GetByte (_fbged -_bbbd .RowStride +_baae -1);_beddd !=nil {return _d .Wrap (_beddd ,_gbcb ,"\u0069\u0020\u003e\u00200 \u0026\u0026\u0020\u006a\u0020\u003e\u0020\u0030\u0020\u0062\u0079\u0074\u0065");
|
|
};_cbee |=_agbgb <<7;};if _baae < _fdeg -1{if _agbgb ,_beddd =_bbbd .GetByte (_fbged -_bbbd .RowStride +_baae +1);_beddd !=nil {return _d .Wrap (_beddd ,_gbcb ,"\u006a\u0020<\u0020\u0077\u0070l\u0020\u002d\u0020\u0031\u0020\u0062\u0079\u0074\u0065");};
|
|
_cbee |=_agbgb >>7;};};if _baae > 0{if _dgac ,_beddd =_bbbd .GetByte (_fbged +_baae -1);_beddd !=nil {return _d .Wrap (_beddd ,_gbcb ,"\u006a\u0020\u003e \u0030");};_cbee |=_dgac <<7;};_cbee &=_dacc ;if _cbee ==0||^_cbee ==0{if _beddd =_bbbd .SetByte (_fbged +_baae ,_cbee );
|
|
_beddd !=nil {return _d .Wrap (_beddd ,_gbcb ,"\u0073e\u0074t\u0069\u006e\u0067\u0020\u0065m\u0070\u0074y\u0020\u0062\u0079\u0074\u0065");};};for {_bgce =_cbee ;_cbee =(_cbee |(_cbee >>1)|(_cbee <<1))&_dacc ;if (_cbee ^_bgce )==0{if _beddd =_bbbd .SetByte (_fbged +_baae ,_cbee );
|
|
_beddd !=nil {return _d .Wrap (_beddd ,_gbcb ,"\u0073\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u0070\u0072\u0065\u0076 \u0062\u0079\u0074\u0065");};break ;};};};};for _fcdfa =_edfc -1;_fcdfa >=0;_fcdfa --{_fbged =_fcdfa *_bbbd .RowStride ;_cfab =_fcdfa *_gefa .RowStride ;
|
|
for _baae =_fdeg -1;_baae >=0;_baae --{if _cbee ,_beddd =_bbbd .GetByte (_fbged +_baae );_beddd !=nil {return _d .Wrap (_beddd ,_gbcb ,"\u0072\u0065\u0076er\u0073\u0065\u0020\u0067\u0065\u0074\u0020\u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0062\u0079\u0074\u0065");
|
|
};if _dacc ,_beddd =_gefa .GetByte (_cfab +_baae );_beddd !=nil {return _d .Wrap (_beddd ,_gbcb ,"r\u0065\u0076\u0065\u0072se\u0020g\u0065\u0074\u0020\u006d\u0061s\u006b\u0020\u0062\u0079\u0074\u0065");};if _fcdfa < _edfc -1{if _gcfdf ,_beddd =_bbbd .GetByte (_fbged +_bbbd .RowStride +_baae );
|
|
_beddd !=nil {return _d .Wrap (_beddd ,_gbcb ,"\u0069\u0020\u003c\u0020h\u0020\u002d\u0020\u0031\u0020\u002d\u003e\u0020\u0067\u0065t\u0020s\u006f\u0075\u0072\u0063\u0065\u0020\u0062y\u0074\u0065");};_cbee |=_gcfdf |(_gcfdf <<1)|_gcfdf >>1;if _baae > 0{if _agbgb ,_beddd =_bbbd .GetByte (_fbged +_bbbd .RowStride +_baae -1);
|
|
_beddd !=nil {return _d .Wrap (_beddd ,_gbcb ,"\u0069\u0020\u003c h\u002d\u0031\u0020\u0026\u0020\u006a\u0020\u003e\u00200\u0020-\u003e \u0067e\u0074\u0020\u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0062\u0079\u0074\u0065");};_cbee |=_agbgb <<7;};if _baae < _fdeg -1{if _agbgb ,_beddd =_bbbd .GetByte (_fbged +_bbbd .RowStride +_baae +1);
|
|
_beddd !=nil {return _d .Wrap (_beddd ,_gbcb ,"\u0069\u0020\u003c\u0020\u0068\u002d\u0031\u0020\u0026\u0026\u0020\u006a\u0020\u003c\u0077\u0070\u006c\u002d\u0031\u0020\u002d\u003e\u0020\u0067e\u0074\u0020\u0073\u006f\u0075r\u0063\u0065 \u0062\u0079\u0074\u0065");
|
|
};_cbee |=_agbgb >>7;};};if _baae < _fdeg -1{if _cgae ,_beddd =_bbbd .GetByte (_fbged +_baae +1);_beddd !=nil {return _d .Wrap (_beddd ,_gbcb ,"\u006a\u0020<\u0020\u0077\u0070\u006c\u0020\u002d\u0031\u0020\u002d\u003e\u0020\u0067\u0065\u0074\u0020\u0073\u006f\u0075\u0072\u0063\u0065\u0020by\u0074\u0065");
|
|
};_cbee |=_cgae >>7;};_cbee &=_dacc ;if _cbee ==0||(^_cbee )==0{if _beddd =_bbbd .SetByte (_fbged +_baae ,_cbee );_beddd !=nil {return _d .Wrap (_beddd ,_gbcb ,"\u0073e\u0074 \u006d\u0061\u0073\u006b\u0065\u0064\u0020\u0062\u0079\u0074\u0065");};};for {_bgce =_cbee ;
|
|
_cbee =(_cbee |(_cbee >>1)|(_cbee <<1))&_dacc ;if (_cbee ^_bgce )==0{if _beddd =_bbbd .SetByte (_fbged +_baae ,_cbee );_beddd !=nil {return _d .Wrap (_beddd ,_gbcb ,"r\u0065\u0076\u0065\u0072se\u0020s\u0065\u0074\u0020\u0070\u0072e\u0076\u0020\u0062\u0079\u0074\u0065");
|
|
};break ;};};};};return nil ;};var (_gdde =_dca ();_ebdf =_ga ();_fdee =_bcc (););var MorphBC BoundaryCondition ;func (_dga *Bitmap )inverseData (){if _ddde :=_dga .RasterOperation (0,0,_dga .Width ,_dga .Height ,PixNotDst ,nil ,0,0);_ddde !=nil {_ba .Log .Debug ("\u0049n\u0076\u0065\u0072\u0073e\u0020\u0064\u0061\u0074\u0061 \u0066a\u0069l\u0065\u0064\u003a\u0020\u0027\u0025\u0076'",_ddde );
|
|
};if _dga .Color ==Chocolate {_dga .Color =Vanilla ;}else {_dga .Color =Chocolate ;};};func (_ebddc *ClassedPoints )GetIntXByClass (i int )(int ,error ){const _fdbg ="\u0043\u006c\u0061\u0073s\u0065\u0064\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047e\u0074I\u006e\u0074\u0059\u0042\u0079\u0043\u006ca\u0073\u0073";
|
|
if i >=_ebddc .IntSlice .Size (){return 0,_d .Errorf (_fdbg ,"\u0069\u003a\u0020\u0027\u0025\u0064\u0027 \u0069\u0073\u0020o\u0075\u0074\u0020\u006ff\u0020\u0074\u0068\u0065\u0020\u0072\u0061\u006e\u0067\u0065\u0020\u006f\u0066\u0020\u0074\u0068\u0065\u0020\u0049\u006e\u0074\u0053\u006c\u0069\u0063\u0065",i );
|
|
};return int (_ebddc .XAtIndex (i )),nil ;};func (_gcfc *Bitmap )CountPixels ()int {return _gcfc .countPixels ()};func _bbe (_cgaf ,_dbad *Bitmap )(*Bitmap ,error ){if _dbad ==nil {return nil ,_d .Error ("\u0063\u006f\u0070\u0079\u0042\u0069\u0074\u006d\u0061\u0070","\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if _dbad ==_cgaf {return _cgaf ,nil ;};if _cgaf ==nil {_cgaf =_dbad .createTemplate ();copy (_cgaf .Data ,_dbad .Data );return _cgaf ,nil ;};_bdbf :=_cgaf .resizeImageData (_dbad );if _bdbf !=nil {return nil ,_d .Wrap (_bdbf ,"\u0063\u006f\u0070\u0079\u0042\u0069\u0074\u006d\u0061\u0070","");
|
|
};_cgaf .Text =_dbad .Text ;copy (_cgaf .Data ,_dbad .Data );return _cgaf ,nil ;};func _cbca (_gebd ,_fef *Bitmap ,_dfag ,_cagb int )(*Bitmap ,error ){const _geea ="\u0063\u006c\u006f\u0073\u0065\u0053\u0061\u0066\u0065B\u0072\u0069\u0063\u006b";if _fef ==nil {return nil ,_d .Error (_geea ,"\u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0069\u0073\u0020\u006e\u0069\u006c");
|
|
};if _dfag < 1||_cagb < 1{return nil ,_d .Error (_geea ,"\u0068s\u0069\u007a\u0065\u0020\u0061\u006e\u0064\u0020\u0076\u0073\u0069z\u0065\u0020\u006e\u006f\u0074\u0020\u003e\u003d\u0020\u0031");};if _dfag ==1&&_cagb ==1{return _bbe (_gebd ,_fef );};if MorphBC ==SymmetricMorphBC {_bbef ,_bfcg :=_aegf (_gebd ,_fef ,_dfag ,_cagb );
|
|
if _bfcg !=nil {return nil ,_d .Wrap (_bfcg ,_geea ,"\u0053\u0079m\u006d\u0065\u0074r\u0069\u0063\u004d\u006f\u0072\u0070\u0068\u0042\u0043");};return _bbef ,nil ;};_gedf :=_dggg (_dfag /2,_cagb /2);_gbafb :=8*((_gedf +7)/8);_facb ,_geee :=_fef .AddBorder (_gbafb ,0);
|
|
if _geee !=nil {return nil ,_d .Wrapf (_geee ,_geea ,"\u0042\u006f\u0072\u0064\u0065\u0072\u0053\u0069\u007ae\u003a\u0020\u0025\u0064",_gbafb );};var _bag ,_deee *Bitmap ;if _dfag ==1||_cagb ==1{_bcac :=SelCreateBrick (_cagb ,_dfag ,_cagb /2,_dfag /2,SelHit );
|
|
_bag ,_geee =_ceaaf (nil ,_facb ,_bcac );if _geee !=nil {return nil ,_d .Wrap (_geee ,_geea ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");};}else {_feec :=SelCreateBrick (1,_dfag ,0,_dfag /2,SelHit );
|
|
_gabdb ,_fffe :=_dcd (nil ,_facb ,_feec );if _fffe !=nil {return nil ,_d .Wrap (_fffe ,_geea ,"\u0072\u0065\u0067\u0075la\u0072\u0020\u002d\u0020\u0066\u0069\u0072\u0073\u0074\u0020\u0064\u0069\u006c\u0061t\u0065");};_gdff :=SelCreateBrick (_cagb ,1,_cagb /2,0,SelHit );
|
|
_bag ,_fffe =_dcd (nil ,_gabdb ,_gdff );if _fffe !=nil {return nil ,_d .Wrap (_fffe ,_geea ,"\u0072\u0065\u0067ul\u0061\u0072\u0020\u002d\u0020\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};if _ ,_fffe =_afdb (_gabdb ,_bag ,_feec );
|
|
_fffe !=nil {return nil ,_d .Wrap (_fffe ,_geea ,"r\u0065\u0067\u0075\u006car\u0020-\u0020\u0066\u0069\u0072\u0073t\u0020\u0065\u0072\u006f\u0064\u0065");};if _ ,_fffe =_afdb (_bag ,_gabdb ,_gdff );_fffe !=nil {return nil ,_d .Wrap (_fffe ,_geea ,"\u0072\u0065\u0067\u0075la\u0072\u0020\u002d\u0020\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0065\u0072\u006fd\u0065");
|
|
};};if _deee ,_geee =_bag .RemoveBorder (_gbafb );_geee !=nil {return nil ,_d .Wrap (_geee ,_geea ,"\u0072e\u0067\u0075\u006c\u0061\u0072");};if _gebd ==nil {return _deee ,nil ;};if _ ,_geee =_bbe (_gebd ,_deee );_geee !=nil {return nil ,_geee ;};return _gebd ,nil ;
|
|
};func Dilate (d *Bitmap ,s *Bitmap ,sel *Selection )(*Bitmap ,error ){return _dcd (d ,s ,sel )};func (_cdc *Bitmap )addPadBits ()(_gggg error ){const _bgad ="\u0062\u0069\u0074\u006d\u0061\u0070\u002e\u0061\u0064\u0064\u0050\u0061d\u0042\u0069\u0074\u0073";
|
|
_caa :=_cdc .Width %8;if _caa ==0{return nil ;};_dbd :=_cdc .Width /8;_gcee :=_a .NewReader (_cdc .Data );_dag :=make ([]byte ,_cdc .Height *_cdc .RowStride );_adc :=_a .NewWriterMSB (_dag );_aebb :=make ([]byte ,_dbd );var (_dgff int ;_gbf uint64 ;);for _dgff =0;
|
|
_dgff < _cdc .Height ;_dgff ++{if _ ,_gggg =_gcee .Read (_aebb );_gggg !=nil {return _d .Wrap (_gggg ,_bgad ,"\u0066u\u006c\u006c\u0020\u0062\u0079\u0074e");};if _ ,_gggg =_adc .Write (_aebb );_gggg !=nil {return _d .Wrap (_gggg ,_bgad ,"\u0066\u0075\u006c\u006c\u0020\u0062\u0079\u0074\u0065\u0073");
|
|
};if _gbf ,_gggg =_gcee .ReadBits (byte (_caa ));_gggg !=nil {return _d .Wrap (_gggg ,_bgad ,"\u0073\u006b\u0069\u0070\u0070\u0069\u006e\u0067\u0020\u0062\u0069\u0074\u0073");};if _gggg =_adc .WriteByte (byte (_gbf )<<uint (8-_caa ));_gggg !=nil {return _d .Wrap (_gggg ,_bgad ,"\u006ca\u0073\u0074\u0020\u0062\u0079\u0074e");
|
|
};};_cdc .Data =_adc .Data ();return nil ;};func TstGetScaledSymbol (t *_fa .T ,sm *Bitmap ,scale ...int )*Bitmap {if len (scale )==0{return sm ;};if scale [0]==1{return sm ;};_agbddg ,_bgdc :=MorphSequence (sm ,MorphProcess {Operation :MopReplicativeBinaryExpansion ,Arguments :scale });
|
|
_f .NoError (t ,_bgdc );return _agbddg ;};type Boxes []*_e .Rectangle ;func (_fgcc *Bitmap )setBit (_aedf int ){_fgcc .Data [(_aedf >>3)]|=0x80>>uint (_aedf &7)};const _cfbg =5000;func _dcd (_cfdg *Bitmap ,_bbcb *Bitmap ,_edff *Selection )(*Bitmap ,error ){var (_cadd *Bitmap ;
|
|
_febe error ;);_cfdg ,_febe =_ffee (_cfdg ,_bbcb ,_edff ,&_cadd );if _febe !=nil {return nil ,_febe ;};if _febe =_cfdg .clearAll ();_febe !=nil {return nil ,_febe ;};var _cdce SelectionValue ;for _fddc :=0;_fddc < _edff .Height ;_fddc ++{for _gbgg :=0;
|
|
_gbgg < _edff .Width ;_gbgg ++{_cdce =_edff .Data [_fddc ][_gbgg ];if _cdce ==SelHit {if _febe =_cfdg .RasterOperation (_gbgg -_edff .Cx ,_fddc -_edff .Cy ,_bbcb .Width ,_bbcb .Height ,PixSrcOrDst ,_cadd ,0,0);_febe !=nil {return nil ,_febe ;};};};};return _cfdg ,nil ;
|
|
};func (_dada *Bitmap )SizesEqual (s *Bitmap )bool {if _dada ==s {return true ;};if _dada .Width !=s .Width ||_dada .Height !=s .Height {return false ;};return true ;};func (_fbdg *Bitmap )createTemplate ()*Bitmap {return &Bitmap {Width :_fbdg .Width ,Height :_fbdg .Height ,RowStride :_fbdg .RowStride ,Color :_fbdg .Color ,Text :_fbdg .Text ,BitmapNumber :_fbdg .BitmapNumber ,Special :_fbdg .Special ,Data :make ([]byte ,len (_fbdg .Data ))};
|
|
};func TstPSymbol (t *_fa .T )*Bitmap {t .Helper ();_baabg :=New (5,8);_f .NoError (t ,_baabg .SetPixel (0,0,1));_f .NoError (t ,_baabg .SetPixel (1,0,1));_f .NoError (t ,_baabg .SetPixel (2,0,1));_f .NoError (t ,_baabg .SetPixel (3,0,1));_f .NoError (t ,_baabg .SetPixel (4,1,1));
|
|
_f .NoError (t ,_baabg .SetPixel (0,1,1));_f .NoError (t ,_baabg .SetPixel (4,2,1));_f .NoError (t ,_baabg .SetPixel (0,2,1));_f .NoError (t ,_baabg .SetPixel (4,3,1));_f .NoError (t ,_baabg .SetPixel (0,3,1));_f .NoError (t ,_baabg .SetPixel (0,4,1));
|
|
_f .NoError (t ,_baabg .SetPixel (1,4,1));_f .NoError (t ,_baabg .SetPixel (2,4,1));_f .NoError (t ,_baabg .SetPixel (3,4,1));_f .NoError (t ,_baabg .SetPixel (0,5,1));_f .NoError (t ,_baabg .SetPixel (0,6,1));_f .NoError (t ,_baabg .SetPixel (0,7,1));
|
|
return _baabg ;};func Rect (x ,y ,w ,h int )(*_e .Rectangle ,error ){const _adcb ="b\u0069\u0074\u006d\u0061\u0070\u002e\u0052\u0065\u0063\u0074";if x < 0{w +=x ;x =0;if w <=0{return nil ,_d .Errorf (_adcb ,"x\u003a\u0027\u0025\u0064\u0027\u0020<\u0020\u0030\u0020\u0061\u006e\u0064\u0020\u0077\u003a \u0027\u0025\u0064'\u0020<\u003d\u0020\u0030",x ,w );
|
|
};};if y < 0{h +=y ;y =0;if h <=0{return nil ,_d .Error (_adcb ,"\u0079\u0020\u003c 0\u0020\u0061\u006e\u0064\u0020\u0062\u006f\u0078\u0020\u006f\u0066\u0066\u0020\u002b\u0071\u0075\u0061\u0064");};};_dbgea :=_e .Rect (x ,y ,x +w ,y +h );return &_dbgea ,nil ;
|
|
};func _dad (_egb ,_daacd int )*Bitmap {return &Bitmap {Width :_egb ,Height :_daacd ,RowStride :(_egb +7)>>3};};func _aab (_abfc ,_aff *Bitmap ,_gfef ,_bddg ,_gbec ,_gdb ,_bcbg int ,_dbef CombinationOperator )error {var _ebgb int ;_aggc :=func (){_ebgb ++;
|
|
_gbec +=_aff .RowStride ;_gdb +=_abfc .RowStride ;_bcbg +=_abfc .RowStride };for _ebgb =_gfef ;_ebgb < _bddg ;_aggc (){_baac :=_gbec ;for _gad :=_gdb ;_gad <=_bcbg ;_gad ++{_cgg ,_efcfg :=_aff .GetByte (_baac );if _efcfg !=nil {return _efcfg ;};_gdf ,_efcfg :=_abfc .GetByte (_gad );
|
|
if _efcfg !=nil {return _efcfg ;};if _efcfg =_aff .SetByte (_baac ,_ggbb (_cgg ,_gdf ,_dbef ));_efcfg !=nil {return _efcfg ;};_baac ++;};};return nil ;};func (_efbece *Bitmaps )SortByWidth (){_ggfab :=(*byWidth )(_efbece );_bd .Sort (_ggfab )};func _dggg (_bfe ,_cdbb int )int {if _bfe > _cdbb {return _bfe ;
|
|
};return _cdbb ;};func (_fafb *ClassedPoints )Len ()int {return _fafb .IntSlice .Size ()};func _dca ()(_ddbb [256]uint16 ){for _ddd :=0;_ddd < 256;_ddd ++{if _ddd &0x01!=0{_ddbb [_ddd ]|=0x3;};if _ddd &0x02!=0{_ddbb [_ddd ]|=0xc;};if _ddd &0x04!=0{_ddbb [_ddd ]|=0x30;
|
|
};if _ddd &0x08!=0{_ddbb [_ddd ]|=0xc0;};if _ddd &0x10!=0{_ddbb [_ddd ]|=0x300;};if _ddd &0x20!=0{_ddbb [_ddd ]|=0xc00;};if _ddd &0x40!=0{_ddbb [_ddd ]|=0x3000;};if _ddd &0x80!=0{_ddbb [_ddd ]|=0xc000;};};return _ddbb ;};func (_bafdg *ClassedPoints )GroupByY ()([]*ClassedPoints ,error ){const _abdgf ="\u0043\u006c\u0061\u0073se\u0064\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0072\u006f\u0075\u0070\u0042y\u0059";
|
|
if _aabd :=_bafdg .validateIntSlice ();_aabd !=nil {return nil ,_d .Wrap (_aabd ,_abdgf ,"");};if _bafdg .IntSlice .Size ()==0{return nil ,_d .Error (_abdgf ,"\u004e\u006f\u0020\u0063la\u0073\u0073\u0065\u0073\u0020\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064");
|
|
};_bafdg .SortByY ();var (_edad []*ClassedPoints ;_beagd int ;);_ebac :=-1;var _acfb *ClassedPoints ;for _adbac :=0;_adbac < len (_bafdg .IntSlice );_adbac ++{_beagd =int (_bafdg .YAtIndex (_adbac ));if _beagd !=_ebac {_acfb =&ClassedPoints {Points :_bafdg .Points };
|
|
_ebac =_beagd ;_edad =append (_edad ,_acfb );};_acfb .IntSlice =append (_acfb .IntSlice ,_bafdg .IntSlice [_adbac ]);};for _ ,_ddfab :=range _edad {_ddfab .SortByX ();};return _edad ,nil ;};func (_bfde *Bitmap )nextOnPixelLow (_dacf ,_aea ,_eabb ,_gbab ,_ceg int )(_dcef _e .Point ,_fdcb bool ,_ffbe error ){const _ffbef ="B\u0069\u0074\u006d\u0061p.\u006ee\u0078\u0074\u004f\u006e\u0050i\u0078\u0065\u006c\u004c\u006f\u0077";
|
|
var (_cce int ;_edbc byte ;);_dfdf :=_ceg *_eabb ;_ceda :=_dfdf +(_gbab /8);if _edbc ,_ffbe =_bfde .GetByte (_ceda );_ffbe !=nil {return _dcef ,false ,_d .Wrap (_ffbe ,_ffbef ,"\u0078\u0053\u0074\u0061\u0072\u0074\u0020\u0061\u006e\u0064 \u0079\u0053\u0074\u0061\u0072\u0074\u0020o\u0075\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065");
|
|
};if _edbc !=0{_fbdga :=_gbab -(_gbab %8)+7;for _cce =_gbab ;_cce <=_fbdga &&_cce < _dacf ;_cce ++{if _bfde .GetPixel (_cce ,_ceg ){_dcef .X =_cce ;_dcef .Y =_ceg ;return _dcef ,true ,nil ;};};};_cabc :=(_gbab /8)+1;_cce =8*_cabc ;var _ggb int ;for _ceda =_dfdf +_cabc ;
|
|
_cce < _dacf ;_ceda ,_cce =_ceda +1,_cce +8{if _edbc ,_ffbe =_bfde .GetByte (_ceda );_ffbe !=nil {return _dcef ,false ,_d .Wrap (_ffbe ,_ffbef ,"r\u0065\u0073\u0074\u0020of\u0020t\u0068\u0065\u0020\u006c\u0069n\u0065\u0020\u0062\u0079\u0074\u0065");};if _edbc ==0{continue ;
|
|
};for _ggb =0;_ggb < 8&&_cce < _dacf ;_ggb ,_cce =_ggb +1,_cce +1{if _bfde .GetPixel (_cce ,_ceg ){_dcef .X =_cce ;_dcef .Y =_ceg ;return _dcef ,true ,nil ;};};};for _ceb :=_ceg +1;_ceb < _aea ;_ceb ++{_dfdf =_ceb *_eabb ;for _ceda ,_cce =_dfdf ,0;_cce < _dacf ;
|
|
_ceda ,_cce =_ceda +1,_cce +8{if _edbc ,_ffbe =_bfde .GetByte (_ceda );_ffbe !=nil {return _dcef ,false ,_d .Wrap (_ffbe ,_ffbef ,"\u0066o\u006cl\u006f\u0077\u0069\u006e\u0067\u0020\u006c\u0069\u006e\u0065\u0073");};if _edbc ==0{continue ;};for _ggb =0;
|
|
_ggb < 8&&_cce < _dacf ;_ggb ,_cce =_ggb +1,_cce +1{if _bfde .GetPixel (_cce ,_ceb ){_dcef .X =_cce ;_dcef .Y =_ceb ;return _dcef ,true ,nil ;};};};};return _dcef ,false ,nil ;};func _fegc (_ecdd *Bitmap ,_fged ,_edbef int ,_ggae ,_efaa int ,_gefe RasterOperator ){var (_bbec int ;
|
|
_gdadc byte ;_bagb ,_bafe int ;_fcaaed int ;);_bgdf :=_ggae >>3;_cbfd :=_ggae &7;if _cbfd > 0{_gdadc =_fgedf [_cbfd ];};_bbec =_ecdd .RowStride *_edbef +(_fged >>3);switch _gefe {case PixClr :for _bagb =0;_bagb < _efaa ;_bagb ++{_fcaaed =_bbec +_bagb *_ecdd .RowStride ;
|
|
for _bafe =0;_bafe < _bgdf ;_bafe ++{_ecdd .Data [_fcaaed ]=0x0;_fcaaed ++;};if _cbfd > 0{_ecdd .Data [_fcaaed ]=_egcce (_ecdd .Data [_fcaaed ],0x0,_gdadc );};};case PixSet :for _bagb =0;_bagb < _efaa ;_bagb ++{_fcaaed =_bbec +_bagb *_ecdd .RowStride ;
|
|
for _bafe =0;_bafe < _bgdf ;_bafe ++{_ecdd .Data [_fcaaed ]=0xff;_fcaaed ++;};if _cbfd > 0{_ecdd .Data [_fcaaed ]=_egcce (_ecdd .Data [_fcaaed ],0xff,_gdadc );};};case PixNotDst :for _bagb =0;_bagb < _efaa ;_bagb ++{_fcaaed =_bbec +_bagb *_ecdd .RowStride ;
|
|
for _bafe =0;_bafe < _bgdf ;_bafe ++{_ecdd .Data [_fcaaed ]=^_ecdd .Data [_fcaaed ];_fcaaed ++;};if _cbfd > 0{_ecdd .Data [_fcaaed ]=_egcce (_ecdd .Data [_fcaaed ],^_ecdd .Data [_fcaaed ],_gdadc );};};};};func (_geef Points )Get (i int )(Point ,error ){if i > len (_geef )-1{return Point {},_d .Errorf ("\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0065\u0074","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
};return _geef [i ],nil ;};type BoundaryCondition int ;func (_abgcf Points )XSorter ()func (_gafdf ,_affe int )bool {return func (_dffe ,_ebfa int )bool {return _abgcf [_dffe ].X < _abgcf [_ebfa ].X };};type Selection struct{Height ,Width int ;Cx ,Cy int ;
|
|
Name string ;Data [][]SelectionValue ;};func (_cgfg *BitmapsArray )GetBitmaps (i int )(*Bitmaps ,error ){const _aebe ="\u0042\u0069\u0074ma\u0070\u0073\u0041\u0072\u0072\u0061\u0079\u002e\u0047\u0065\u0074\u0042\u0069\u0074\u006d\u0061\u0070\u0073";if _cgfg ==nil {return nil ,_d .Error (_aebe ,"p\u0072\u006f\u0076\u0069\u0064\u0065d\u0020\u006e\u0069\u006c\u0020\u0027\u0042\u0069\u0074m\u0061\u0070\u0073A\u0072r\u0061\u0079\u0027");
|
|
};if i > len (_cgfg .Values )-1{return nil ,_d .Errorf (_aebe ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return _cgfg .Values [i ],nil ;};func (_gdgb Points )GetIntX (i int )(int ,error ){if i >=len (_gdgb ){return 0,_d .Errorf ("\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0065t\u0049\u006e\u0074\u0058","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
};return int (_gdgb [i ].X ),nil ;};func (_fbd *Bitmap )Zero ()bool {_aeg :=_fbd .Width /8;_cabb :=_fbd .Width &7;var _egbg byte ;if _cabb !=0{_egbg =byte (0xff<<uint (8-_cabb ));};var _bfgb ,_fagg ,_dccc int ;for _fagg =0;_fagg < _fbd .Height ;_fagg ++{_bfgb =_fbd .RowStride *_fagg ;
|
|
for _dccc =0;_dccc < _aeg ;_dccc ,_bfgb =_dccc +1,_bfgb +1{if _fbd .Data [_bfgb ]!=0{return false ;};};if _cabb > 0{if _fbd .Data [_bfgb ]&_egbg !=0{return false ;};};};return true ;};func _ceee (_afaf ,_gbee ,_faga *Bitmap ,_ggdb int )(*Bitmap ,error ){const _dffeb ="\u0073\u0065\u0065\u0064\u0046\u0069\u006c\u006c\u0042i\u006e\u0061\u0072\u0079";
|
|
if _gbee ==nil {return nil ,_d .Error (_dffeb ,"s\u006fu\u0072\u0063\u0065\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");};if _faga ==nil {return nil ,_d .Error (_dffeb ,"'\u006da\u0073\u006b\u0027\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");
|
|
};if _ggdb !=4&&_ggdb !=8{return nil ,_d .Error (_dffeb ,"\u0063\u006f\u006en\u0065\u0063\u0074\u0069v\u0069\u0074\u0079\u0020\u006e\u006f\u0074 \u0069\u006e\u0020\u0072\u0061\u006e\u0067\u0065\u0020\u007b\u0034\u002c\u0038\u007d");};var _fgabc error ;
|
|
_afaf ,_fgabc =_bbe (_afaf ,_gbee );if _fgabc !=nil {return nil ,_d .Wrap (_fgabc ,_dffeb ,"\u0063o\u0070y\u0020\u0073\u006f\u0075\u0072c\u0065\u0020t\u006f\u0020\u0027\u0064\u0027");};_agfg :=_gbee .createTemplate ();_faga .setPadBits (0);for _adcd :=0;
|
|
_adcd < _cfbg ;_adcd ++{_agfg ,_fgabc =_bbe (_agfg ,_afaf );if _fgabc !=nil {return nil ,_d .Wrapf (_fgabc ,_dffeb ,"\u0069\u0074\u0065\u0072\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0064",_adcd );};if _fgabc =_ggdd (_afaf ,_faga ,_ggdb );_fgabc !=nil {return nil ,_d .Wrapf (_fgabc ,_dffeb ,"\u0069\u0074\u0065\u0072\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0064",_adcd );
|
|
};if _agfg .Equals (_afaf ){break ;};};return _afaf ,nil ;};func (_bgfgb CombinationOperator )String ()string {var _gaae string ;switch _bgfgb {case CmbOpOr :_gaae ="\u004f\u0052";case CmbOpAnd :_gaae ="\u0041\u004e\u0044";case CmbOpXor :_gaae ="\u0058\u004f\u0052";
|
|
case CmbOpXNor :_gaae ="\u0058\u004e\u004f\u0052";case CmbOpReplace :_gaae ="\u0052E\u0050\u004c\u0041\u0043\u0045";case CmbOpNot :_gaae ="\u004e\u004f\u0054";};return _gaae ;};func (_adgf MorphProcess )verify (_gbbc int ,_baabc ,_ecde *int )error {const _defab ="\u004d\u006f\u0072\u0070hP\u0072\u006f\u0063\u0065\u0073\u0073\u002e\u0076\u0065\u0072\u0069\u0066\u0079";
|
|
switch _adgf .Operation {case MopDilation ,MopErosion ,MopOpening ,MopClosing :if len (_adgf .Arguments )!=2{return _d .Error (_defab ,"\u004f\u0070\u0065\u0072\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0027\u0064\u0027\u002c\u0020\u0027\u0065\u0027\u002c \u0027\u006f\u0027\u002c\u0020\u0027\u0063\u0027\u0020\u0072\u0065\u0071\u0075\u0069\u0072\u0065\u0073\u0020\u0061\u0074\u0020\u006c\u0065\u0061\u0073\u0074\u0020\u0032\u0020\u0061r\u0067\u0075\u006d\u0065\u006et\u0073");
|
|
};_cbad ,_gdbe :=_adgf .getWidthHeight ();if _cbad <=0||_gdbe <=0{return _d .Error (_defab ,"O\u0070er\u0061t\u0069o\u006e\u003a\u0020\u0027\u0064'\u002c\u0020\u0027e\u0027\u002c\u0020\u0027\u006f'\u002c\u0020\u0027c\u0027\u0020\u0020\u0072\u0065\u0071\u0075\u0069\u0072\u0065\u0073 \u0062\u006f\u0074h w\u0069\u0064\u0074\u0068\u0020\u0061n\u0064\u0020\u0068\u0065\u0069\u0067\u0068\u0074\u0020\u0074\u006f\u0020b\u0065 \u003e\u003d\u0020\u0030");
|
|
};case MopRankBinaryReduction :_bcccg :=len (_adgf .Arguments );*_baabc +=_bcccg ;if _bcccg < 1||_bcccg > 4{return _d .Error (_defab ,"\u004f\u0070\u0065\u0072\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0027\u0072\u0027\u0020\u0072\u0065\u0071\u0075\u0069r\u0065\u0073\u0020\u0061\u0074\u0020\u006c\u0065\u0061s\u0074\u0020\u0031\u0020\u0061\u006e\u0064\u0020\u0061\u0074\u0020\u006d\u006fs\u0074\u0020\u0034\u0020\u0061\u0072g\u0075\u006d\u0065n\u0074\u0073");
|
|
};for _fgfa :=0;_fgfa < _bcccg ;_fgfa ++{if _adgf .Arguments [_fgfa ]< 1||_adgf .Arguments [_fgfa ]> 4{return _d .Error (_defab ,"\u0052\u0061\u006e\u006b\u0042\u0069n\u0061\u0072\u0079\u0052\u0065\u0064\u0075\u0063\u0074\u0069\u006f\u006e\u0020\u006c\u0065\u0076\u0065\u006c\u0020\u006du\u0073\u0074\u0020\u0062\u0065\u0020\u0069\u006e\u0020\u0072\u0061\u006e\u0067\u0065 \u00280\u002c\u0020\u0034\u003e");
|
|
};};case MopReplicativeBinaryExpansion :if len (_adgf .Arguments )==0{return _d .Error (_defab ,"\u0052\u0065\u0070\u006c\u0069\u0063\u0061\u0074i\u0076\u0065\u0042in\u0061\u0072\u0079\u0045\u0078\u0070a\u006e\u0073\u0069\u006f\u006e\u0020\u0072\u0065\u0071\u0075\u0069\u0072\u0065\u0073\u0020o\u006e\u0065\u0020\u0061\u0072\u0067\u0075\u006de\u006e\u0074");
|
|
};_egac :=_adgf .Arguments [0];if _egac !=2&&_egac !=4&&_egac !=8{return _d .Error (_defab ,"R\u0065\u0070\u006c\u0069\u0063\u0061\u0074\u0069\u0076\u0065\u0042\u0069\u006e\u0061\u0072\u0079\u0045\u0078\u0070\u0061\u006e\u0073\u0069\u006f\u006e\u0020m\u0075s\u0074\u0020\u0062\u0065 \u006f\u0066 \u0066\u0061\u0063\u0074\u006f\u0072\u0020\u0069\u006e\u0020\u0072\u0061\u006e\u0067\u0065\u0020\u007b\u0032\u002c\u0034\u002c\u0038\u007d");
|
|
};*_baabc -=_gdae [_egac /4];case MopAddBorder :if len (_adgf .Arguments )==0{return _d .Error (_defab ,"\u0041\u0064\u0064B\u006f\u0072\u0064\u0065r\u0020\u0072\u0065\u0071\u0075\u0069\u0072e\u0073\u0020\u006f\u006e\u0065\u0020\u0061\u0072\u0067\u0075\u006d\u0065\u006e\u0074");
|
|
};_agbd :=_adgf .Arguments [0];if _gbbc > 0{return _d .Error (_defab ,"\u0041\u0064\u0064\u0042\u006f\u0072\u0064\u0065\u0072\u0020\u006d\u0075\u0073t\u0020\u0062\u0065\u0020\u0061\u0020f\u0069\u0072\u0073\u0074\u0020\u006d\u006f\u0072\u0070\u0068\u0020\u0070\u0072o\u0063\u0065\u0073\u0073");
|
|
};if _agbd < 1{return _d .Error (_defab ,"\u0041\u0064\u0064\u0042o\u0072\u0064\u0065\u0072\u0020\u0076\u0061\u006c\u0075\u0065 \u006co\u0077\u0065\u0072\u0020\u0074\u0068\u0061n\u0020\u0030");};*_ecde =_agbd ;};return nil ;};type byHeight Bitmaps ;func _ag (_dfb *Bitmap ,_cae int )(*Bitmap ,error ){const _cde ="\u0065x\u0070a\u006e\u0064\u0042\u0069\u006ea\u0072\u0079P\u006f\u0077\u0065\u0072\u0032";
|
|
if _dfb ==nil {return nil ,_d .Error (_cde ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _cae ==1{return _bbe (nil ,_dfb );};if _cae !=2&&_cae !=4&&_cae !=8{return nil ,_d .Error (_cde ,"\u0066\u0061\u0063t\u006f\u0072\u0020\u006du\u0073\u0074\u0020\u0062\u0065\u0020\u0069n\u0020\u007b\u0032\u002c\u0034\u002c\u0038\u007d\u0020\u0072\u0061\u006e\u0067\u0065");
|
|
};_gce :=_cae *_dfb .Width ;_ece :=_cae *_dfb .Height ;_bbg :=New (_gce ,_ece );var _dg error ;switch _cae {case 2:_dg =_de (_bbg ,_dfb );case 4:_dg =_cf (_bbg ,_dfb );case 8:_dg =_bgc (_bbg ,_dfb );};if _dg !=nil {return nil ,_d .Wrap (_dg ,_cde ,"");
|
|
};return _bbg ,nil ;};func (_bec *Bitmap )nextOnPixel (_fccac ,_bbdc int )(_bebe _e .Point ,_bace bool ,_babb error ){const _faggg ="n\u0065\u0078\u0074\u004f\u006e\u0050\u0069\u0078\u0065\u006c";_bebe ,_bace ,_babb =_bec .nextOnPixelLow (_bec .Width ,_bec .Height ,_bec .RowStride ,_fccac ,_bbdc );
|
|
if _babb !=nil {return _bebe ,false ,_d .Wrap (_babb ,_faggg ,"");};return _bebe ,_bace ,nil ;};func _agdf (_ebddce *Bitmap ,_dcgf ,_gdad ,_gdec ,_bbge int ,_dgaf RasterOperator ,_bcfe *Bitmap ,_cffg ,_cegd int )error {var (_geca byte ;_bbdd int ;_aaeb int ;
|
|
_bdaee ,_dgcgb int ;_fbgb ,_fabg int ;);_acde :=_gdec >>3;_eeee :=_gdec &7;if _eeee > 0{_geca =_fgedf [_eeee ];};_bbdd =_bcfe .RowStride *_cegd +(_cffg >>3);_aaeb =_ebddce .RowStride *_gdad +(_dcgf >>3);switch _dgaf {case PixSrc :for _fbgb =0;_fbgb < _bbge ;
|
|
_fbgb ++{_bdaee =_bbdd +_fbgb *_bcfe .RowStride ;_dgcgb =_aaeb +_fbgb *_ebddce .RowStride ;for _fabg =0;_fabg < _acde ;_fabg ++{_ebddce .Data [_dgcgb ]=_bcfe .Data [_bdaee ];_dgcgb ++;_bdaee ++;};if _eeee > 0{_ebddce .Data [_dgcgb ]=_egcce (_ebddce .Data [_dgcgb ],_bcfe .Data [_bdaee ],_geca );
|
|
};};case PixNotSrc :for _fbgb =0;_fbgb < _bbge ;_fbgb ++{_bdaee =_bbdd +_fbgb *_bcfe .RowStride ;_dgcgb =_aaeb +_fbgb *_ebddce .RowStride ;for _fabg =0;_fabg < _acde ;_fabg ++{_ebddce .Data [_dgcgb ]=^(_bcfe .Data [_bdaee ]);_dgcgb ++;_bdaee ++;};if _eeee > 0{_ebddce .Data [_dgcgb ]=_egcce (_ebddce .Data [_dgcgb ],^_bcfe .Data [_bdaee ],_geca );
|
|
};};case PixSrcOrDst :for _fbgb =0;_fbgb < _bbge ;_fbgb ++{_bdaee =_bbdd +_fbgb *_bcfe .RowStride ;_dgcgb =_aaeb +_fbgb *_ebddce .RowStride ;for _fabg =0;_fabg < _acde ;_fabg ++{_ebddce .Data [_dgcgb ]|=_bcfe .Data [_bdaee ];_dgcgb ++;_bdaee ++;};if _eeee > 0{_ebddce .Data [_dgcgb ]=_egcce (_ebddce .Data [_dgcgb ],_bcfe .Data [_bdaee ]|_ebddce .Data [_dgcgb ],_geca );
|
|
};};case PixSrcAndDst :for _fbgb =0;_fbgb < _bbge ;_fbgb ++{_bdaee =_bbdd +_fbgb *_bcfe .RowStride ;_dgcgb =_aaeb +_fbgb *_ebddce .RowStride ;for _fabg =0;_fabg < _acde ;_fabg ++{_ebddce .Data [_dgcgb ]&=_bcfe .Data [_bdaee ];_dgcgb ++;_bdaee ++;};if _eeee > 0{_ebddce .Data [_dgcgb ]=_egcce (_ebddce .Data [_dgcgb ],_bcfe .Data [_bdaee ]&_ebddce .Data [_dgcgb ],_geca );
|
|
};};case PixSrcXorDst :for _fbgb =0;_fbgb < _bbge ;_fbgb ++{_bdaee =_bbdd +_fbgb *_bcfe .RowStride ;_dgcgb =_aaeb +_fbgb *_ebddce .RowStride ;for _fabg =0;_fabg < _acde ;_fabg ++{_ebddce .Data [_dgcgb ]^=_bcfe .Data [_bdaee ];_dgcgb ++;_bdaee ++;};if _eeee > 0{_ebddce .Data [_dgcgb ]=_egcce (_ebddce .Data [_dgcgb ],_bcfe .Data [_bdaee ]^_ebddce .Data [_dgcgb ],_geca );
|
|
};};case PixNotSrcOrDst :for _fbgb =0;_fbgb < _bbge ;_fbgb ++{_bdaee =_bbdd +_fbgb *_bcfe .RowStride ;_dgcgb =_aaeb +_fbgb *_ebddce .RowStride ;for _fabg =0;_fabg < _acde ;_fabg ++{_ebddce .Data [_dgcgb ]|=^(_bcfe .Data [_bdaee ]);_dgcgb ++;_bdaee ++;};
|
|
if _eeee > 0{_ebddce .Data [_dgcgb ]=_egcce (_ebddce .Data [_dgcgb ],^(_bcfe .Data [_bdaee ])|_ebddce .Data [_dgcgb ],_geca );};};case PixNotSrcAndDst :for _fbgb =0;_fbgb < _bbge ;_fbgb ++{_bdaee =_bbdd +_fbgb *_bcfe .RowStride ;_dgcgb =_aaeb +_fbgb *_ebddce .RowStride ;
|
|
for _fabg =0;_fabg < _acde ;_fabg ++{_ebddce .Data [_dgcgb ]&=^(_bcfe .Data [_bdaee ]);_dgcgb ++;_bdaee ++;};if _eeee > 0{_ebddce .Data [_dgcgb ]=_egcce (_ebddce .Data [_dgcgb ],^(_bcfe .Data [_bdaee ])&_ebddce .Data [_dgcgb ],_geca );};};case PixSrcOrNotDst :for _fbgb =0;
|
|
_fbgb < _bbge ;_fbgb ++{_bdaee =_bbdd +_fbgb *_bcfe .RowStride ;_dgcgb =_aaeb +_fbgb *_ebddce .RowStride ;for _fabg =0;_fabg < _acde ;_fabg ++{_ebddce .Data [_dgcgb ]=_bcfe .Data [_bdaee ]|^(_ebddce .Data [_dgcgb ]);_dgcgb ++;_bdaee ++;};if _eeee > 0{_ebddce .Data [_dgcgb ]=_egcce (_ebddce .Data [_dgcgb ],_bcfe .Data [_bdaee ]|^(_ebddce .Data [_dgcgb ]),_geca );
|
|
};};case PixSrcAndNotDst :for _fbgb =0;_fbgb < _bbge ;_fbgb ++{_bdaee =_bbdd +_fbgb *_bcfe .RowStride ;_dgcgb =_aaeb +_fbgb *_ebddce .RowStride ;for _fabg =0;_fabg < _acde ;_fabg ++{_ebddce .Data [_dgcgb ]=_bcfe .Data [_bdaee ]&^(_ebddce .Data [_dgcgb ]);
|
|
_dgcgb ++;_bdaee ++;};if _eeee > 0{_ebddce .Data [_dgcgb ]=_egcce (_ebddce .Data [_dgcgb ],_bcfe .Data [_bdaee ]&^(_ebddce .Data [_dgcgb ]),_geca );};};case PixNotPixSrcOrDst :for _fbgb =0;_fbgb < _bbge ;_fbgb ++{_bdaee =_bbdd +_fbgb *_bcfe .RowStride ;
|
|
_dgcgb =_aaeb +_fbgb *_ebddce .RowStride ;for _fabg =0;_fabg < _acde ;_fabg ++{_ebddce .Data [_dgcgb ]=^(_bcfe .Data [_bdaee ]|_ebddce .Data [_dgcgb ]);_dgcgb ++;_bdaee ++;};if _eeee > 0{_ebddce .Data [_dgcgb ]=_egcce (_ebddce .Data [_dgcgb ],^(_bcfe .Data [_bdaee ]|_ebddce .Data [_dgcgb ]),_geca );
|
|
};};case PixNotPixSrcAndDst :for _fbgb =0;_fbgb < _bbge ;_fbgb ++{_bdaee =_bbdd +_fbgb *_bcfe .RowStride ;_dgcgb =_aaeb +_fbgb *_ebddce .RowStride ;for _fabg =0;_fabg < _acde ;_fabg ++{_ebddce .Data [_dgcgb ]=^(_bcfe .Data [_bdaee ]&_ebddce .Data [_dgcgb ]);
|
|
_dgcgb ++;_bdaee ++;};if _eeee > 0{_ebddce .Data [_dgcgb ]=_egcce (_ebddce .Data [_dgcgb ],^(_bcfe .Data [_bdaee ]&_ebddce .Data [_dgcgb ]),_geca );};};case PixNotPixSrcXorDst :for _fbgb =0;_fbgb < _bbge ;_fbgb ++{_bdaee =_bbdd +_fbgb *_bcfe .RowStride ;
|
|
_dgcgb =_aaeb +_fbgb *_ebddce .RowStride ;for _fabg =0;_fabg < _acde ;_fabg ++{_ebddce .Data [_dgcgb ]=^(_bcfe .Data [_bdaee ]^_ebddce .Data [_dgcgb ]);_dgcgb ++;_bdaee ++;};if _eeee > 0{_ebddce .Data [_dgcgb ]=_egcce (_ebddce .Data [_dgcgb ],^(_bcfe .Data [_bdaee ]^_ebddce .Data [_dgcgb ]),_geca );
|
|
};};default:_ba .Log .Debug ("\u0050\u0072ov\u0069\u0064\u0065d\u0020\u0069\u006e\u0076ali\u0064 r\u0061\u0073\u0074\u0065\u0072\u0020\u006fpe\u0072\u0061\u0074\u006f\u0072\u003a\u0020%\u0076",_dgaf );return _d .Error ("\u0072\u0061\u0073\u0074er\u004f\u0070\u0042\u0079\u0074\u0065\u0041\u006c\u0069\u0067\u006e\u0065\u0064\u004co\u0077","\u0069\u006e\u0076al\u0069\u0064\u0020\u0072\u0061\u0073\u0074\u0065\u0072\u0020\u006f\u0070\u0065\u0072\u0061\u0074\u006f\u0072");
|
|
};return nil ;};func (_ggbc *Bitmap )ConnComponents (bms *Bitmaps ,connectivity int )(_fecf *Boxes ,_dafe error ){const _dcccb ="B\u0069\u0074\u006d\u0061p.\u0043o\u006e\u006e\u0043\u006f\u006dp\u006f\u006e\u0065\u006e\u0074\u0073";if _ggbc ==nil {return nil ,_d .Error (_dcccb ,"\u0070r\u006f\u0076\u0069\u0064e\u0064\u0020\u0065\u006d\u0070t\u0079 \u0027b\u0027\u0020\u0062\u0069\u0074\u006d\u0061p");
|
|
};if connectivity !=4&&connectivity !=8{return nil ,_d .Error (_dcccb ,"\u0063\u006f\u006ene\u0063\u0074\u0069\u0076\u0069\u0074\u0079\u0020\u006e\u006f\u0074\u0020\u0034\u0020\u006f\u0072\u0020\u0038");};if bms ==nil {if _fecf ,_dafe =_ggbc .connComponentsBB (connectivity );
|
|
_dafe !=nil {return nil ,_d .Wrap (_dafe ,_dcccb ,"");};}else {if _fecf ,_dafe =_ggbc .connComponentsBitmapsBB (bms ,connectivity );_dafe !=nil {return nil ,_d .Wrap (_dafe ,_dcccb ,"");};};return _fecf ,nil ;};type SelectionValue int ;var _ _bd .Interface =&ClassedPoints {};
|
|
type CombinationOperator int ;func _eae (_bcffe ,_dbge *Bitmap ,_cfea ,_gcfd ,_bggc ,_dfdff ,_dfbb ,_ddaa ,_dfbgf ,_faa int ,_fbde CombinationOperator ,_gbc int )error {var _ggef int ;_beage :=func (){_ggef ++;_bggc +=_dbge .RowStride ;_dfdff +=_bcffe .RowStride ;
|
|
_dfbb +=_bcffe .RowStride };for _ggef =_cfea ;_ggef < _gcfd ;_beage (){var _ggaa uint16 ;_ddgc :=_bggc ;for _bcab :=_dfdff ;_bcab <=_dfbb ;_bcab ++{_cfae ,_bbdg :=_dbge .GetByte (_ddgc );if _bbdg !=nil {return _bbdg ;};_dbde ,_bbdg :=_bcffe .GetByte (_bcab );
|
|
if _bbdg !=nil {return _bbdg ;};_ggaa =(_ggaa |(uint16 (_dbde )&0xff))<<uint (_faa );_dbde =byte (_ggaa >>8);if _bbdg =_dbge .SetByte (_ddgc ,_ggbb (_cfae ,_dbde ,_fbde ));_bbdg !=nil {return _bbdg ;};_ddgc ++;_ggaa <<=uint (_dfbgf );if _bcab ==_dfbb {_dbde =byte (_ggaa >>(8-uint8 (_faa )));
|
|
if _gbc !=0{_dbde =_cage (uint (8+_ddaa ),_dbde );};_cfae ,_bbdg =_dbge .GetByte (_ddgc );if _bbdg !=nil {return _bbdg ;};if _bbdg =_dbge .SetByte (_ddgc ,_ggbb (_cfae ,_dbde ,_fbde ));_bbdg !=nil {return _bbdg ;};};};};return nil ;};func (_cbc *Bitmap )countPixels ()int {var (_fbbe int ;
|
|
_cdaa uint8 ;_gafe byte ;_fdda int ;);_fbc :=_cbc .RowStride ;_adg :=uint (_cbc .Width &0x07);if _adg !=0{_cdaa =uint8 ((0xff<<(8-_adg ))&0xff);_fbc --;};for _ffgb :=0;_ffgb < _cbc .Height ;_ffgb ++{for _fdda =0;_fdda < _fbc ;_fdda ++{_gafe =_cbc .Data [_ffgb *_cbc .RowStride +_fdda ];
|
|
_fbbe +=int (_bedd [_gafe ]);};if _adg !=0{_fbbe +=int (_bedd [_cbc .Data [_ffgb *_cbc .RowStride +_fdda ]&_cdaa ]);};};return _fbbe ;};func (_gcef *Bitmap )setEightFullBytes (_bdcf int ,_gbeg uint64 )error {if _bdcf +7> len (_gcef .Data )-1{return _d .Error ("\u0073\u0065\u0074\u0045\u0069\u0067\u0068\u0074\u0042\u0079\u0074\u0065\u0073","\u0069n\u0064e\u0078\u0020\u006f\u0075\u0074 \u006f\u0066 \u0072\u0061\u006e\u0067\u0065");
|
|
};_gcef .Data [_bdcf ]=byte ((_gbeg &0xff00000000000000)>>56);_gcef .Data [_bdcf +1]=byte ((_gbeg &0xff000000000000)>>48);_gcef .Data [_bdcf +2]=byte ((_gbeg &0xff0000000000)>>40);_gcef .Data [_bdcf +3]=byte ((_gbeg &0xff00000000)>>32);_gcef .Data [_bdcf +4]=byte ((_gbeg &0xff000000)>>24);
|
|
_gcef .Data [_bdcf +5]=byte ((_gbeg &0xff0000)>>16);_gcef .Data [_bdcf +6]=byte ((_gbeg &0xff00)>>8);_gcef .Data [_bdcf +7]=byte (_gbeg &0xff);return nil ;};func (_afed *ClassedPoints )SortByY (){_afed ._befe =_afed .ySortFunction ();_bd .Sort (_afed )};
|
|
func (_ddc *Bitmap )setAll ()error {_ebc :=_eagg (_ddc ,0,0,_ddc .Width ,_ddc .Height ,PixSet ,nil ,0,0);if _ebc !=nil {return _d .Wrap (_ebc ,"\u0073\u0065\u0074\u0041\u006c\u006c","");};return nil ;};func (_bcccb *Bitmap )connComponentsBB (_fgae int )(_fabf *Boxes ,_gdcd error ){const _dcfg ="\u0042\u0069\u0074ma\u0070\u002e\u0063\u006f\u006e\u006e\u0043\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074\u0073\u0042\u0042";
|
|
if _fgae !=4&&_fgae !=8{return nil ,_d .Error (_dcfg ,"\u0063\u006f\u006e\u006e\u0065\u0063t\u0069\u0076\u0069\u0074\u0079\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065 \u0061\u0020\u0027\u0034\u0027\u0020\u006fr\u0020\u0027\u0038\u0027");};if _bcccb .Zero (){return &Boxes {},nil ;
|
|
};_bcccb .setPadBits (0);_cded ,_gdcd :=_bbe (nil ,_bcccb );if _gdcd !=nil {return nil ,_d .Wrap (_gdcd ,_dcfg ,"\u0062\u006d\u0031");};_dfdb :=&_fd .Stack {};_dfdb .Aux =&_fd .Stack {};_fabf =&Boxes {};var (_ebfe ,_bgcgf int ;_debd _e .Point ;_gcec bool ;
|
|
_ege *_e .Rectangle ;);for {if _debd ,_gcec ,_gdcd =_cded .nextOnPixel (_bgcgf ,_ebfe );_gdcd !=nil {return nil ,_d .Wrap (_gdcd ,_dcfg ,"");};if !_gcec {break ;};if _ege ,_gdcd =_fgaf (_cded ,_dfdb ,_debd .X ,_debd .Y ,_fgae );_gdcd !=nil {return nil ,_d .Wrap (_gdcd ,_dcfg ,"");
|
|
};if _gdcd =_fabf .Add (_ege );_gdcd !=nil {return nil ,_d .Wrap (_gdcd ,_dcfg ,"");};_bgcgf =_debd .X ;_ebfe =_debd .Y ;};return _fabf ,nil ;};func _bfabb (_bfdg ,_becf *Bitmap ,_fedf ,_bcda ,_ggaf ,_dbga ,_efdf ,_badc ,_bcag ,_fgfd int ,_agga CombinationOperator )error {var _dfde int ;
|
|
_ggbe :=func (){_dfde ++;_ggaf +=_becf .RowStride ;_dbga +=_bfdg .RowStride ;_efdf +=_bfdg .RowStride };for _dfde =_fedf ;_dfde < _bcda ;_ggbe (){var _fffa uint16 ;_agbg :=_ggaf ;for _gdcf :=_dbga ;_gdcf <=_efdf ;_gdcf ++{_eagd ,_gfeb :=_becf .GetByte (_agbg );
|
|
if _gfeb !=nil {return _gfeb ;};_aade ,_gfeb :=_bfdg .GetByte (_gdcf );if _gfeb !=nil {return _gfeb ;};_fffa =(_fffa |uint16 (_aade ))<<uint (_fgfd );_aade =byte (_fffa >>8);if _gdcf ==_efdf {_aade =_cage (uint (_badc ),_aade );};if _gfeb =_becf .SetByte (_agbg ,_ggbb (_eagd ,_aade ,_agga ));
|
|
_gfeb !=nil {return _gfeb ;};_agbg ++;_fffa <<=uint (_bcag );};};return nil ;};func _cgcd (_fbea ...MorphProcess )(_cdeba error ){const _cgecg ="v\u0065r\u0069\u0066\u0079\u004d\u006f\u0072\u0070\u0068P\u0072\u006f\u0063\u0065ss\u0065\u0073";var _bbf ,_cbfc int ;
|
|
for _cdbg ,_eabc :=range _fbea {if _cdeba =_eabc .verify (_cdbg ,&_bbf ,&_cbfc );_cdeba !=nil {return _d .Wrap (_cdeba ,_cgecg ,"");};};if _cbfc !=0&&_bbf !=0{return _d .Error (_cgecg ,"\u004d\u006f\u0072\u0070\u0068\u0020\u0073\u0065\u0071\u0075\u0065n\u0063\u0065\u0020\u002d\u0020\u0062\u006f\u0072d\u0065r\u0020\u0061\u0064\u0064\u0065\u0064\u0020\u0062\u0075\u0074\u0020\u006e\u0065\u0074\u0020\u0072\u0065\u0064u\u0063\u0074\u0069\u006f\u006e\u0020\u006e\u006f\u0074\u0020\u0030");
|
|
};return nil ;};func TstImageBitmap ()*Bitmap {return _fffc .Copy ()};func (_dced *Bitmap )removeBorderGeneral (_bgcb ,_bccc ,_ccb ,_eega int )(*Bitmap ,error ){const _egfd ="\u0072\u0065\u006d\u006fve\u0042\u006f\u0072\u0064\u0065\u0072\u0047\u0065\u006e\u0065\u0072\u0061\u006c";
|
|
if _bgcb < 0||_bccc < 0||_ccb < 0||_eega < 0{return nil ,_d .Error (_egfd ,"\u006e\u0065g\u0061\u0074\u0069\u0076\u0065\u0020\u0062\u0072\u006f\u0064\u0065\u0072\u0020\u0072\u0065\u006d\u006f\u0076\u0065\u0020\u0076\u0061lu\u0065\u0073");};_ffbf ,_ddbac :=_dced .Width ,_dced .Height ;
|
|
_dbb :=_ffbf -_bgcb -_bccc ;_eda :=_ddbac -_ccb -_eega ;if _dbb <=0{return nil ,_d .Errorf (_egfd ,"w\u0069\u0064\u0074\u0068: \u0025d\u0020\u006d\u0075\u0073\u0074 \u0062\u0065\u0020\u003e\u0020\u0030",_dbb );};if _eda <=0{return nil ,_d .Errorf (_egfd ,"\u0068\u0065\u0069\u0067ht\u003a\u0020\u0025\u0064\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065\u0020\u003e \u0030",_eda );
|
|
};_aecd :=New (_dbb ,_eda );_aecd .Color =_dced .Color ;_gfa :=_aecd .RasterOperation (0,0,_dbb ,_eda ,PixSrc ,_dced ,_bgcb ,_ccb );if _gfa !=nil {return nil ,_d .Wrap (_gfa ,_egfd ,"");};return _aecd ,nil ;};func TstDSymbol (t *_fa .T ,scale ...int )*Bitmap {_aaec ,_eecgba :=NewWithData (4,5,[]byte {0xf0,0x90,0x90,0x90,0xE0});
|
|
_f .NoError (t ,_eecgba );return TstGetScaledSymbol (t ,_aaec ,scale ...);};func _gfbc (_fbac *Bitmap ,_fgea ,_afg int ,_caac ,_fagga int ,_dafb RasterOperator ,_fcdb *Bitmap ,_gbcg ,_dgfe int )error {var _caad ,_ccge ,_bgea ,_bgba int ;if _fgea < 0{_gbcg -=_fgea ;
|
|
_caac +=_fgea ;_fgea =0;};if _gbcg < 0{_fgea -=_gbcg ;_caac +=_gbcg ;_gbcg =0;};_caad =_fgea +_caac -_fbac .Width ;if _caad > 0{_caac -=_caad ;};_ccge =_gbcg +_caac -_fcdb .Width ;if _ccge > 0{_caac -=_ccge ;};if _afg < 0{_dgfe -=_afg ;_fagga +=_afg ;_afg =0;
|
|
};if _dgfe < 0{_afg -=_dgfe ;_fagga +=_dgfe ;_dgfe =0;};_bgea =_afg +_fagga -_fbac .Height ;if _bgea > 0{_fagga -=_bgea ;};_bgba =_dgfe +_fagga -_fcdb .Height ;if _bgba > 0{_fagga -=_bgba ;};if _caac <=0||_fagga <=0{return nil ;};var _bcbec error ;switch {case _fgea &7==0&&_gbcg &7==0:_bcbec =_agdf (_fbac ,_fgea ,_afg ,_caac ,_fagga ,_dafb ,_fcdb ,_gbcg ,_dgfe );
|
|
case _fgea &7==_gbcg &7:_bcbec =_gcae (_fbac ,_fgea ,_afg ,_caac ,_fagga ,_dafb ,_fcdb ,_gbcg ,_dgfe );default:_bcbec =_degc (_fbac ,_fgea ,_afg ,_caac ,_fagga ,_dafb ,_fcdb ,_gbcg ,_dgfe );};if _bcbec !=nil {return _d .Wrap (_bcbec ,"r\u0061\u0073\u0074\u0065\u0072\u004f\u0070\u004c\u006f\u0077","");
|
|
};return nil ;};func (_bceb *BitmapsArray )AddBitmaps (bm *Bitmaps ){_bceb .Values =append (_bceb .Values ,bm )};func MakePixelCentroidTab8 ()[]int {return _ebde ()};func (_efab *Boxes )selectWithIndicator (_cacd *_fd .NumSlice )(_aeeb *Boxes ,_gdd error ){const _ddeb ="\u0042o\u0078\u0065\u0073\u002es\u0065\u006c\u0065\u0063\u0074W\u0069t\u0068I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";
|
|
if _efab ==nil {return nil ,_d .Error (_ddeb ,"b\u006f\u0078\u0065\u0073 '\u0062'\u0020\u006e\u006f\u0074\u0020d\u0065\u0066\u0069\u006e\u0065\u0064");};if _cacd ==nil {return nil ,_d .Error (_ddeb ,"\u0027\u006ea\u0027\u0020\u006eo\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};if len (*_cacd )!=len (*_efab ){return nil ,_d .Error (_ddeb ,"\u0062\u006f\u0078\u0065\u0073\u0020\u0027\u0062\u0027\u0020\u0068\u0061\u0073\u0020\u0064\u0069\u0066\u0066\u0065\u0072\u0065\u006e\u0074\u0020s\u0069\u007a\u0065\u0020\u0074h\u0061\u006e \u0027\u006e\u0061\u0027");
|
|
};var _gadb ,_dbdg int ;for _bfce :=0;_bfce < len (*_cacd );_bfce ++{if _gadb ,_gdd =_cacd .GetInt (_bfce );_gdd !=nil {return nil ,_d .Wrap (_gdd ,_ddeb ,"\u0063\u0068\u0065\u0063\u006b\u0069\u006e\u0067\u0020c\u006f\u0075\u006e\u0074");};if _gadb ==1{_dbdg ++;
|
|
};};if _dbdg ==len (*_efab ){return _efab ,nil ;};_gbaf :=Boxes {};for _eagb :=0;_eagb < len (*_cacd );_eagb ++{_gadb =int ((*_cacd )[_eagb ]);if _gadb ==0{continue ;};_gbaf =append (_gbaf ,(*_efab )[_eagb ]);};_aeeb =&_gbaf ;return _aeeb ,nil ;};func _fdf (_bbaf ,_bcg *Bitmap ,_bbea CombinationOperator )*Bitmap {_gacd :=New (_bbaf .Width ,_bbaf .Height );
|
|
for _eaff :=0;_eaff < len (_gacd .Data );_eaff ++{_gacd .Data [_eaff ]=_ggbb (_bbaf .Data [_eaff ],_bcg .Data [_eaff ],_bbea );};return _gacd ;};func Blit (src *Bitmap ,dst *Bitmap ,x ,y int ,op CombinationOperator )error {var _aefd ,_aca int ;_bgac :=src .RowStride -1;
|
|
if x < 0{_aca =-x ;x =0;}else if x +src .Width > dst .Width {_bgac -=src .Width +x -dst .Width ;};if y < 0{_aefd =-y ;y =0;_aca +=src .RowStride ;_bgac +=src .RowStride ;}else if y +src .Height > dst .Height {_aefd =src .Height +y -dst .Height ;};var (_accf int ;
|
|
_gaff error ;);_dbf :=x &0x07;_efag :=8-_dbf ;_ebca :=src .Width &0x07;_cefd :=_efag -_ebca ;_adba :=_efag &0x07!=0;_fede :=src .Width <=((_bgac -_aca )<<3)+_efag ;_ebeb :=dst .GetByteIndex (x ,y );_geec :=_aefd +dst .Height ;if src .Height > _geec {_accf =_geec ;
|
|
}else {_accf =src .Height ;};switch {case !_adba :_gaff =_aab (src ,dst ,_aefd ,_accf ,_ebeb ,_aca ,_bgac ,op );case _fede :_gaff =_bfabb (src ,dst ,_aefd ,_accf ,_ebeb ,_aca ,_bgac ,_cefd ,_dbf ,_efag ,op );default:_gaff =_eae (src ,dst ,_aefd ,_accf ,_ebeb ,_aca ,_bgac ,_cefd ,_dbf ,_efag ,op ,_ebca );
|
|
};return _gaff ;};func _fdbe ()[]int {_ceab :=make ([]int ,256);for _bgdd :=0;_bgdd <=0xff;_bgdd ++{_edffg :=byte (_bgdd );_ceab [_edffg ]=int (_edffg &0x1)+(int (_edffg >>1)&0x1)+(int (_edffg >>2)&0x1)+(int (_edffg >>3)&0x1)+(int (_edffg >>4)&0x1)+(int (_edffg >>5)&0x1)+(int (_edffg >>6)&0x1)+(int (_edffg >>7)&0x1);
|
|
};return _ceab ;};func _ga ()(_cea [256]uint32 ){for _faf :=0;_faf < 256;_faf ++{if _faf &0x01!=0{_cea [_faf ]|=0xf;};if _faf &0x02!=0{_cea [_faf ]|=0xf0;};if _faf &0x04!=0{_cea [_faf ]|=0xf00;};if _faf &0x08!=0{_cea [_faf ]|=0xf000;};if _faf &0x10!=0{_cea [_faf ]|=0xf0000;
|
|
};if _faf &0x20!=0{_cea [_faf ]|=0xf00000;};if _faf &0x40!=0{_cea [_faf ]|=0xf000000;};if _faf &0x80!=0{_cea [_faf ]|=0xf0000000;};};return _cea ;};func (_caeb *Bitmap )And (s *Bitmap )(_ade *Bitmap ,_agbf error ){const _fgg ="\u0042\u0069\u0074\u006d\u0061\u0070\u002e\u0041\u006e\u0064";
|
|
if _caeb ==nil {return nil ,_d .Error (_fgg ,"\u0027b\u0069t\u006d\u0061\u0070\u0020\u0027b\u0027\u0020i\u0073\u0020\u006e\u0069\u006c");};if s ==nil {return nil ,_d .Error (_fgg ,"\u0062\u0069\u0074\u006d\u0061\u0070\u0020\u0027\u0073\u0027\u0020\u0069s\u0020\u006e\u0069\u006c");
|
|
};if !_caeb .SizesEqual (s ){_ba .Log .Debug ("\u0025\u0073\u0020-\u0020\u0042\u0069\u0074\u006d\u0061\u0070\u0020\u0027\u0073\u0027\u0020\u0069\u0073\u0020\u006e\u006f\u0074\u0020\u0065\u0071\u0075\u0061\u006c\u0020\u0073\u0069\u007a\u0065 \u0077\u0069\u0074\u0068\u0020\u0027\u0062\u0027",_fgg );
|
|
};if _ade ,_agbf =_bbe (_ade ,_caeb );_agbf !=nil {return nil ,_d .Wrap (_agbf ,_fgg ,"\u0063\u0061\u006e't\u0020\u0063\u0072\u0065\u0061\u0074\u0065\u0020\u0027\u0064\u0027\u0020\u0062\u0069\u0074\u006d\u0061\u0070");};if _agbf =_ade .RasterOperation (0,0,_ade .Width ,_ade .Height ,PixSrcAndDst ,s ,0,0);
|
|
_agbf !=nil {return nil ,_d .Wrap (_agbf ,_fgg ,"");};return _ade ,nil ;};func (_abaa *Selection )setOrigin (_cgeb ,_bgeac int ){_abaa .Cy ,_abaa .Cx =_cgeb ,_bgeac };func TstOSymbol (t *_fa .T ,scale ...int )*Bitmap {_befa ,_eabf :=NewWithData (4,5,[]byte {0xF0,0x90,0x90,0x90,0xF0});
|
|
_f .NoError (t ,_eabf );return TstGetScaledSymbol (t ,_befa ,scale ...);};const (MopDilation MorphOperation =iota ;MopErosion ;MopOpening ;MopClosing ;MopRankBinaryReduction ;MopReplicativeBinaryExpansion ;MopAddBorder ;);func (_egdc *Points )Add (pt *Points )error {const _fdaa ="\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0041\u0064\u0064";
|
|
if _egdc ==nil {return _d .Error (_fdaa ,"\u0070o\u0069n\u0074\u0073\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if pt ==nil {return _d .Error (_fdaa ,"a\u0072\u0067\u0075\u006d\u0065\u006et\u0020\u0070\u006f\u0069\u006e\u0074\u0073\u0020\u006eo\u0074\u0020\u0064e\u0066i\u006e\u0065\u0064");
|
|
};*_egdc =append (*_egdc ,*pt ...);return nil ;};func _gabd (_baeb ,_gge ,_gec *Bitmap )(*Bitmap ,error ){const _eedf ="\u0062\u0069\u0074\u006d\u0061\u0070\u002e\u0078\u006f\u0072";if _gge ==nil {return nil ,_d .Error (_eedf ,"'\u0062\u0031\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");
|
|
};if _gec ==nil {return nil ,_d .Error (_eedf ,"'\u0062\u0032\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _baeb ==_gec {return nil ,_d .Error (_eedf ,"'\u0064\u0027\u0020\u003d\u003d\u0020\u0027\u0062\u0032\u0027");};if !_gge .SizesEqual (_gec ){_ba .Log .Debug ("\u0025s\u0020\u002d \u0042\u0069\u0074\u006da\u0070\u0020\u0027b\u0031\u0027\u0020\u0069\u0073\u0020\u006e\u006f\u0074 e\u0071\u0075\u0061l\u0020\u0073i\u007a\u0065\u0020\u0077\u0069\u0074h\u0020\u0027b\u0032\u0027",_eedf );
|
|
};var _dcfe error ;if _baeb ,_dcfe =_bbe (_baeb ,_gge );_dcfe !=nil {return nil ,_d .Wrap (_dcfe ,_eedf ,"\u0063\u0061n\u0027\u0074\u0020c\u0072\u0065\u0061\u0074\u0065\u0020\u0027\u0064\u0027");};if _dcfe =_baeb .RasterOperation (0,0,_baeb .Width ,_baeb .Height ,PixSrcXorDst ,_gec ,0,0);
|
|
_dcfe !=nil {return nil ,_d .Wrap (_dcfe ,_eedf ,"");};return _baeb ,nil ;};func (_aebf *Bitmaps )selectByIndicator (_gbcad *_fd .NumSlice )(_fega *Bitmaps ,_gaadg error ){const _adbf ="\u0042i\u0074\u006d\u0061\u0070s\u002e\u0073\u0065\u006c\u0065c\u0074B\u0079I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";
|
|
if _aebf ==nil {return nil ,_d .Error (_adbf ,"\u0027\u0062\u0027 b\u0069\u0074\u006d\u0061\u0070\u0073\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};if _gbcad ==nil {return nil ,_d .Error (_adbf ,"'\u006e\u0061\u0027\u0020\u0069\u006ed\u0069\u0063\u0061\u0074\u006f\u0072\u0073\u0020\u006eo\u0074\u0020\u0064e\u0066i\u006e\u0065\u0064");
|
|
};if len (_aebf .Values )==0{return _aebf ,nil ;};if len (*_gbcad )!=len (_aebf .Values ){return nil ,_d .Errorf (_adbf ,"\u006ea\u0020\u006ce\u006e\u0067\u0074\u0068:\u0020\u0025\u0064,\u0020\u0069\u0073\u0020\u0064\u0069\u0066\u0066\u0065re\u006e\u0074\u0020t\u0068\u0061n\u0020\u0062\u0069\u0074\u006d\u0061p\u0073\u003a \u0025\u0064",len (*_gbcad ),len (_aebf .Values ));
|
|
};var _bddb ,_efae ,_fedfg int ;for _efae =0;_efae < len (*_gbcad );_efae ++{if _bddb ,_gaadg =_gbcad .GetInt (_efae );_gaadg !=nil {return nil ,_d .Wrap (_gaadg ,_adbf ,"f\u0069\u0072\u0073\u0074\u0020\u0063\u0068\u0065\u0063\u006b");};if _bddb ==1{_fedfg ++;
|
|
};};if _fedfg ==len (_aebf .Values ){return _aebf ,nil ;};_fega =&Bitmaps {};_bbafa :=len (_aebf .Values )==len (_aebf .Boxes );for _efae =0;_efae < len (*_gbcad );_efae ++{if _bddb =int ((*_gbcad )[_efae ]);_bddb ==0{continue ;};_fega .Values =append (_fega .Values ,_aebf .Values [_efae ]);
|
|
if _bbafa {_fega .Boxes =append (_fega .Boxes ,_aebf .Boxes [_efae ]);};};return _fega ,nil ;};const (_ LocationFilter =iota ;LocSelectWidth ;LocSelectHeight ;LocSelectXVal ;LocSelectYVal ;LocSelectIfEither ;LocSelectIfBoth ;);const (Vanilla Color =iota ;
|
|
Chocolate ;);func (_aae *Bitmap )GetByte (index int )(byte ,error ){if index > len (_aae .Data )-1||index < 0{return 0,_d .Errorf ("\u0047e\u0074\u0042\u0079\u0074\u0065","\u0069\u006e\u0064\u0065x:\u0020\u0025\u0064\u0020\u006f\u0075\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006eg\u0065",index );
|
|
};return _aae .Data [index ],nil ;};func (_dgad *Bitmap )resizeImageData (_bfab *Bitmap )error {if _bfab ==nil {return _d .Error ("\u0072e\u0073i\u007a\u0065\u0049\u006d\u0061\u0067\u0065\u0044\u0061\u0074\u0061","\u0073r\u0063 \u0069\u0073\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if _dgad .SizesEqual (_bfab ){return nil ;};_dgad .Data =make ([]byte ,len (_bfab .Data ));_dgad .Width =_bfab .Width ;_dgad .Height =_bfab .Height ;_dgad .RowStride =_bfab .RowStride ;return nil ;};func _ffaf (_affda *Bitmap ,_cgga int )(*Bitmap ,error ){const _dcdb ="\u0065x\u0070a\u006e\u0064\u0052\u0065\u0070\u006c\u0069\u0063\u0061\u0074\u0065";
|
|
if _affda ==nil {return nil ,_d .Error (_dcdb ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _cgga <=0{return nil ,_d .Error (_dcdb ,"i\u006e\u0076\u0061\u006cid\u0020f\u0061\u0063\u0074\u006f\u0072 \u002d\u0020\u003c\u003d\u0020\u0030");
|
|
};if _cgga ==1{_dabf ,_dfg :=_bbe (nil ,_affda );if _dfg !=nil {return nil ,_d .Wrap (_dfg ,_dcdb ,"\u0066\u0061\u0063\u0074\u006f\u0072\u0020\u003d\u0020\u0031");};return _dabf ,nil ;};_efee ,_aabc :=_fc (_affda ,_cgga ,_cgga );if _aabc !=nil {return nil ,_d .Wrap (_aabc ,_dcdb ,"");
|
|
};return _efee ,nil ;};func TstNSymbol (t *_fa .T ,scale ...int )*Bitmap {_dbfa ,_ffaa :=NewWithData (4,5,[]byte {0x90,0xD0,0xB0,0x90,0x90});_f .NoError (t ,_ffaa );return TstGetScaledSymbol (t ,_dbfa ,scale ...);};func (_gagc *Bitmap )GetByteIndex (x ,y int )int {return y *_gagc .RowStride +(x >>3)};
|
|
func _eagg (_gebf *Bitmap ,_dbac ,_gcfb ,_fcbc ,_bcec int ,_cagef RasterOperator ,_fcbd *Bitmap ,_aaaf ,_dfga int )error {const _feef ="\u0072a\u0073t\u0065\u0072\u004f\u0070\u0065\u0072\u0061\u0074\u0069\u006f\u006e";if _gebf ==nil {return _d .Error (_feef ,"\u006e\u0069\u006c\u0020\u0027\u0064\u0065\u0073\u0074\u0027\u0020\u0042i\u0074\u006d\u0061\u0070");
|
|
};if _cagef ==PixDst {return nil ;};switch _cagef {case PixClr ,PixSet ,PixNotDst :_bdbaf (_gebf ,_dbac ,_gcfb ,_fcbc ,_bcec ,_cagef );return nil ;};if _fcbd ==nil {_ba .Log .Debug ("\u0052a\u0073\u0074e\u0072\u004f\u0070\u0065r\u0061\u0074\u0069o\u006e\u0020\u0073\u006f\u0075\u0072\u0063\u0065\u0020bi\u0074\u006d\u0061p\u0020\u0069s\u0020\u006e\u006f\u0074\u0020\u0064e\u0066\u0069n\u0065\u0064");
|
|
return _d .Error (_feef ,"\u006e\u0069l\u0020\u0027\u0073r\u0063\u0027\u0020\u0062\u0069\u0074\u006d\u0061\u0070");};if _bagd :=_gfbc (_gebf ,_dbac ,_gcfb ,_fcbc ,_bcec ,_cagef ,_fcbd ,_aaaf ,_dfga );_bagd !=nil {return _d .Wrap (_bagd ,_feef ,"");};return nil ;
|
|
};func NewClassedPoints (points *Points ,classes _fd .IntSlice )(*ClassedPoints ,error ){const _agaa ="\u004e\u0065w\u0043\u006c\u0061s\u0073\u0065\u0064\u0050\u006f\u0069\u006e\u0074\u0073";if points ==nil {return nil ,_d .Error (_agaa ,"\u0070\u0072\u006f\u0076id\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0070\u006f\u0069\u006e\u0074\u0073");
|
|
};if classes ==nil {return nil ,_d .Error (_agaa ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0063\u006c\u0061ss\u0065\u0073");};_fbbb :=&ClassedPoints {Points :points ,IntSlice :classes };if _bbfg :=_fbbb .validateIntSlice ();_bbfg !=nil {return nil ,_d .Wrap (_bbfg ,_agaa ,"");
|
|
};return _fbbb ,nil ;};func _bee (_dgg ,_aaf *Bitmap ,_cee int ,_gg []byte ,_abg int )(_ggf error ){const _eac ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0031";var (_eef ,_bff ,_bgd ,_gag ,_ede ,_cef ,_efgc ,_fca int ;
|
|
_ecb ,_bbgc uint32 ;_gf ,_cac byte ;_agab uint16 ;);_bafd :=make ([]byte ,4);_agbe :=make ([]byte ,4);for _bgd =0;_bgd < _dgg .Height -1;_bgd ,_gag =_bgd +2,_gag +1{_eef =_bgd *_dgg .RowStride ;_bff =_gag *_aaf .RowStride ;for _ede ,_cef =0,0;_ede < _abg ;
|
|
_ede ,_cef =_ede +4,_cef +1{for _efgc =0;_efgc < 4;_efgc ++{_fca =_eef +_ede +_efgc ;if _fca <=len (_dgg .Data )-1&&_fca < _eef +_dgg .RowStride {_bafd [_efgc ]=_dgg .Data [_fca ];}else {_bafd [_efgc ]=0x00;};_fca =_eef +_dgg .RowStride +_ede +_efgc ;if _fca <=len (_dgg .Data )-1&&_fca < _eef +(2*_dgg .RowStride ){_agbe [_efgc ]=_dgg .Data [_fca ];
|
|
}else {_agbe [_efgc ]=0x00;};};_ecb =_dd .BigEndian .Uint32 (_bafd );_bbgc =_dd .BigEndian .Uint32 (_agbe );_bbgc |=_ecb ;_bbgc |=_bbgc <<1;_bbgc &=0xaaaaaaaa;_ecb =_bbgc |(_bbgc <<7);_gf =byte (_ecb >>24);_cac =byte ((_ecb >>8)&0xff);_fca =_bff +_cef ;
|
|
if _fca +1==len (_aaf .Data )-1||_fca +1>=_bff +_aaf .RowStride {_aaf .Data [_fca ]=_gg [_gf ];}else {_agab =(uint16 (_gg [_gf ])<<8)|uint16 (_gg [_cac ]);if _ggf =_aaf .setTwoBytes (_fca ,_agab );_ggf !=nil {return _d .Wrapf (_ggf ,_eac ,"s\u0065\u0074\u0074\u0069\u006e\u0067 \u0074\u0077\u006f\u0020\u0062\u0079t\u0065\u0073\u0020\u0066\u0061\u0069\u006ce\u0064\u002c\u0020\u0069\u006e\u0064\u0065\u0078\u003a\u0020%\u0064",_fca );
|
|
};_cef ++;};};};return nil ;};type shift int ;const (SelDontCare SelectionValue =iota ;SelHit ;SelMiss ;);type MorphOperation int ;func (_cbba *byHeight )Less (i ,j int )bool {return _cbba .Values [i ].Height < _cbba .Values [j ].Height };func (_ecda *Bitmaps )HeightSorter ()func (_gcga ,_ebcb int )bool {return func (_cefab ,_fcff int )bool {_abbc :=_ecda .Values [_cefab ].Height < _ecda .Values [_fcff ].Height ;
|
|
_ba .Log .Debug ("H\u0065i\u0067\u0068\u0074\u003a\u0020\u0025\u0076\u0020<\u0020\u0025\u0076\u0020= \u0025\u0076",_ecda .Values [_cefab ].Height ,_ecda .Values [_fcff ].Height ,_abbc );return _abbc ;};};func (_acce *Bitmaps )GetBitmap (i int )(*Bitmap ,error ){const _agef ="\u0047e\u0074\u0042\u0069\u0074\u006d\u0061p";
|
|
if _acce ==nil {return nil ,_d .Error (_agef ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0042\u0069\u0074ma\u0070\u0073");};if i > len (_acce .Values )-1{return nil ,_d .Errorf (_agef ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
};return _acce .Values [i ],nil ;};func (_bfgc *Boxes )makeSizeIndicator (_bffd ,_cede int ,_egfa LocationFilter ,_acbe SizeComparison )*_fd .NumSlice {_gac :=&_fd .NumSlice {};var _adf ,_bgaa ,_dgga int ;for _ ,_efdc :=range *_bfgc {_adf =0;_bgaa ,_dgga =_efdc .Dx (),_efdc .Dy ();
|
|
switch _egfa {case LocSelectWidth :if (_acbe ==SizeSelectIfLT &&_bgaa < _bffd )||(_acbe ==SizeSelectIfGT &&_bgaa > _bffd )||(_acbe ==SizeSelectIfLTE &&_bgaa <=_bffd )||(_acbe ==SizeSelectIfGTE &&_bgaa >=_bffd ){_adf =1;};case LocSelectHeight :if (_acbe ==SizeSelectIfLT &&_dgga < _cede )||(_acbe ==SizeSelectIfGT &&_dgga > _cede )||(_acbe ==SizeSelectIfLTE &&_dgga <=_cede )||(_acbe ==SizeSelectIfGTE &&_dgga >=_cede ){_adf =1;
|
|
};case LocSelectIfEither :if (_acbe ==SizeSelectIfLT &&(_dgga < _cede ||_bgaa < _bffd ))||(_acbe ==SizeSelectIfGT &&(_dgga > _cede ||_bgaa > _bffd ))||(_acbe ==SizeSelectIfLTE &&(_dgga <=_cede ||_bgaa <=_bffd ))||(_acbe ==SizeSelectIfGTE &&(_dgga >=_cede ||_bgaa >=_bffd )){_adf =1;
|
|
};case LocSelectIfBoth :if (_acbe ==SizeSelectIfLT &&(_dgga < _cede &&_bgaa < _bffd ))||(_acbe ==SizeSelectIfGT &&(_dgga > _cede &&_bgaa > _bffd ))||(_acbe ==SizeSelectIfLTE &&(_dgga <=_cede &&_bgaa <=_bffd ))||(_acbe ==SizeSelectIfGTE &&(_dgga >=_cede &&_bgaa >=_bffd )){_adf =1;
|
|
};};_gac .AddInt (_adf );};return _gac ;};func (_ffe *Bitmap )setFourBytes (_effe int ,_cgec uint32 )error {if _effe +3> len (_ffe .Data )-1{return _d .Errorf ("\u0073\u0065\u0074F\u006f\u0075\u0072\u0042\u0079\u0074\u0065\u0073","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",_effe );
|
|
};_ffe .Data [_effe ]=byte ((_cgec &0xff000000)>>24);_ffe .Data [_effe +1]=byte ((_cgec &0xff0000)>>16);_ffe .Data [_effe +2]=byte ((_cgec &0xff00)>>8);_ffe .Data [_effe +3]=byte (_cgec &0xff);return nil ;};func CorrelationScoreSimple (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab []int )(_dbgef float64 ,_gcca error ){const _ecfa ="\u0043\u006f\u0072\u0072el\u0061\u0074\u0069\u006f\u006e\u0053\u0063\u006f\u0072\u0065\u0053\u0069\u006d\u0070l\u0065";
|
|
if bm1 ==nil ||bm2 ==nil {return _dbgef ,_d .Error (_ecfa ,"n\u0069l\u0020\u0062\u0069\u0074\u006d\u0061\u0070\u0073 \u0070\u0072\u006f\u0076id\u0065\u0064");};if tab ==nil {return _dbgef ,_d .Error (_ecfa ,"\u0074\u0061\u0062\u0020\u0075\u006e\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};if area1 ==0||area2 ==0{return _dbgef ,_d .Error (_ecfa ,"\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064\u0020\u0061\u0072e\u0061\u0073\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065 \u003e\u0020\u0030");};_cedeb ,_cgbg :=bm1 .Width ,bm1 .Height ;
|
|
_dfdfa ,_dabb :=bm2 .Width ,bm2 .Height ;if _gafd (_cedeb -_dfdfa )> maxDiffW {return 0,nil ;};if _gafd (_cgbg -_dabb )> maxDiffH {return 0,nil ;};var _agad ,_efgd int ;if delX >=0{_agad =int (delX +0.5);}else {_agad =int (delX -0.5);};if delY >=0{_efgd =int (delY +0.5);
|
|
}else {_efgd =int (delY -0.5);};_fee :=bm1 .createTemplate ();if _gcca =_fee .RasterOperation (_agad ,_efgd ,_dfdfa ,_dabb ,PixSrc ,bm2 ,0,0);_gcca !=nil {return _dbgef ,_d .Wrap (_gcca ,_ecfa ,"\u0062m\u0032 \u0074\u006f\u0020\u0054\u0065\u006d\u0070\u006c\u0061\u0074\u0065");
|
|
};if _gcca =_fee .RasterOperation (0,0,_cedeb ,_cgbg ,PixSrcAndDst ,bm1 ,0,0);_gcca !=nil {return _dbgef ,_d .Wrap (_gcca ,_ecfa ,"b\u006d\u0031\u0020\u0061\u006e\u0064\u0020\u0062\u006d\u0054");};_baeba :=_fee .countPixels ();_dbgef =float64 (_baeba )*float64 (_baeba )/(float64 (area1 )*float64 (area2 ));
|
|
return _dbgef ,nil ;};func (_fcg *Bitmap )setEightBytes (_dfbg int ,_abdb uint64 )error {_egca :=_fcg .RowStride -(_dfbg %_fcg .RowStride );if _fcg .RowStride !=_fcg .Width >>3{_egca --;};if _egca >=8{return _fcg .setEightFullBytes (_dfbg ,_abdb );};return _fcg .setEightPartlyBytes (_dfbg ,_egca ,_abdb );
|
|
};func (_cddd *Bitmaps )CountPixels ()*_fd .NumSlice {_agff :=&_fd .NumSlice {};for _ ,_baabe :=range _cddd .Values {_agff .AddInt (_baabe .CountPixels ());};return _agff ;};func (_ffea *byWidth )Len ()int {return len (_ffea .Values )};func _bdbaf (_ecbf *Bitmap ,_gabbg ,_bfga ,_aadac ,_bfbg int ,_dbbf RasterOperator ){if _gabbg < 0{_aadac +=_gabbg ;
|
|
_gabbg =0;};_dffd :=_gabbg +_aadac -_ecbf .Width ;if _dffd > 0{_aadac -=_dffd ;};if _bfga < 0{_bfbg +=_bfga ;_bfga =0;};_cdgcb :=_bfga +_bfbg -_ecbf .Height ;if _cdgcb > 0{_bfbg -=_cdgcb ;};if _aadac <=0||_bfbg <=0{return ;};if (_gabbg &7)==0{_fegc (_ecbf ,_gabbg ,_bfga ,_aadac ,_bfbg ,_dbbf );
|
|
}else {_cgabd (_ecbf ,_gabbg ,_bfga ,_aadac ,_bfbg ,_dbbf );};};func TstFrameBitmap ()*Bitmap {return _dgae .Copy ()};func (_gfg *Bitmap )RemoveBorder (borderSize int )(*Bitmap ,error ){if borderSize ==0{return _gfg .Copy (),nil ;};_eeg ,_dega :=_gfg .removeBorderGeneral (borderSize ,borderSize ,borderSize ,borderSize );
|
|
if _dega !=nil {return nil ,_d .Wrap (_dega ,"\u0052\u0065\u006do\u0076\u0065\u0042\u006f\u0072\u0064\u0065\u0072","");};return _eeg ,nil ;};func _cge (_cdf ,_geg *Bitmap ,_agae int ,_acc []byte ,_bbgg int )(_fcaa error ){const _fdb ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0033";
|
|
var (_ddg ,_daac ,_adb ,_ddfa ,_ffff ,_caca ,_ebbg ,_dbg int ;_fgc ,_fea ,_faeg ,_eeb uint32 ;_bae ,_bce byte ;_dcc uint16 ;);_gfbf :=make ([]byte ,4);_cab :=make ([]byte ,4);for _adb =0;_adb < _cdf .Height -1;_adb ,_ddfa =_adb +2,_ddfa +1{_ddg =_adb *_cdf .RowStride ;
|
|
_daac =_ddfa *_geg .RowStride ;for _ffff ,_caca =0,0;_ffff < _bbgg ;_ffff ,_caca =_ffff +4,_caca +1{for _ebbg =0;_ebbg < 4;_ebbg ++{_dbg =_ddg +_ffff +_ebbg ;if _dbg <=len (_cdf .Data )-1&&_dbg < _ddg +_cdf .RowStride {_gfbf [_ebbg ]=_cdf .Data [_dbg ];
|
|
}else {_gfbf [_ebbg ]=0x00;};_dbg =_ddg +_cdf .RowStride +_ffff +_ebbg ;if _dbg <=len (_cdf .Data )-1&&_dbg < _ddg +(2*_cdf .RowStride ){_cab [_ebbg ]=_cdf .Data [_dbg ];}else {_cab [_ebbg ]=0x00;};};_fgc =_dd .BigEndian .Uint32 (_gfbf );_fea =_dd .BigEndian .Uint32 (_cab );
|
|
_faeg =_fgc &_fea ;_faeg |=_faeg <<1;_eeb =_fgc |_fea ;_eeb &=_eeb <<1;_fea =_faeg &_eeb ;_fea &=0xaaaaaaaa;_fgc =_fea |(_fea <<7);_bae =byte (_fgc >>24);_bce =byte ((_fgc >>8)&0xff);_dbg =_daac +_caca ;if _dbg +1==len (_geg .Data )-1||_dbg +1>=_daac +_geg .RowStride {if _fcaa =_geg .SetByte (_dbg ,_acc [_bae ]);
|
|
_fcaa !=nil {return _d .Wrapf (_fcaa ,_fdb ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_dbg );};}else {_dcc =(uint16 (_acc [_bae ])<<8)|uint16 (_acc [_bce ]);if _fcaa =_geg .setTwoBytes (_dbg ,_dcc );_fcaa !=nil {return _d .Wrapf (_fcaa ,_fdb ,"s\u0065\u0074\u0074\u0069\u006e\u0067 \u0074\u0077\u006f\u0020\u0062\u0079t\u0065\u0073\u0020\u0066\u0061\u0069\u006ce\u0064\u002c\u0020\u0069\u006e\u0064\u0065\u0078\u003a\u0020%\u0064",_dbg );
|
|
};_caca ++;};};};return nil ;};func (_aeefb Points )GetIntY (i int )(int ,error ){if i >=len (_aeefb ){return 0,_d .Errorf ("\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0065t\u0049\u006e\u0074\u0059","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
};return int (_aeefb [i ].Y ),nil ;};var (_dgae *Bitmap ;_fffc *Bitmap ;);func TstAddSymbol (t *_fa .T ,bms *Bitmaps ,sym *Bitmap ,x *int ,y int ,space int ){bms .AddBitmap (sym );_dgffc :=_e .Rect (*x ,y ,*x +sym .Width ,y +sym .Height );bms .AddBox (&_dgffc );
|
|
*x +=sym .Width +space ;};type SizeComparison int ;func (_ccc *ClassedPoints )XAtIndex (i int )float32 {return (*_ccc .Points )[_ccc .IntSlice [i ]].X };func Centroid (bm *Bitmap ,centTab ,sumTab []int )(Point ,error ){return bm .centroid (centTab ,sumTab )};
|
|
func (_ecbe *Bitmaps )String ()string {_bdfa :=_b .Builder {};for _ ,_accdb :=range _ecbe .Values {_bdfa .WriteString (_accdb .String ());_bdfa .WriteRune ('\n');};return _bdfa .String ();};func _cbf (_dfcg ,_dcgb int )int {if _dfcg < _dcgb {return _dfcg ;
|
|
};return _dcgb ;};type fillSegment struct{_bgade int ;_bbggc int ;_daca int ;_gdbc int ;};func _efe (_eed *Bitmap ,_abc ...int )(_ebb *Bitmap ,_ddf error ){const _ddbf ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0043\u0061\u0073\u0063\u0061\u0064\u0065";
|
|
if _eed ==nil {return nil ,_d .Error (_ddbf ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};if len (_abc )==0||len (_abc )> 4{return nil ,_d .Error (_ddbf ,"t\u0068\u0065\u0072\u0065\u0020\u006d\u0075\u0073\u0074 \u0062\u0065\u0020\u0061\u0074\u0020\u006cea\u0073\u0074\u0020\u006fn\u0065\u0020\u0061\u006e\u0064\u0020\u0061\u0074\u0020mo\u0073\u0074 \u0034\u0020\u006c\u0065\u0076\u0065\u006c\u0073");
|
|
};if _abc [0]<=0{_ba .Log .Debug ("\u006c\u0065\u0076\u0065\u006c\u0031\u0020\u003c\u003d\u0020\u0030 \u002d\u0020\u006e\u006f\u0020\u0072\u0065\u0064\u0075\u0063t\u0069\u006f\u006e");_ebb ,_ddf =_bbe (nil ,_eed );if _ddf !=nil {return nil ,_d .Wrap (_ddf ,_ddbf ,"l\u0065\u0076\u0065\u006c\u0031\u0020\u003c\u003d\u0020\u0030");
|
|
};return _ebb ,nil ;};_bfg :=_bacc ();_ebb =_eed ;for _efcf ,_bga :=range _abc {if _bga <=0{break ;};_ebb ,_ddf =_egc (_ebb ,_bga ,_bfg );if _ddf !=nil {return nil ,_d .Wrapf (_ddf ,_ddbf ,"\u006c\u0065\u0076\u0065\u006c\u0025\u0064\u0020\u0072\u0065\u0064\u0075c\u0074\u0069\u006f\u006e",_efcf );
|
|
};};return _ebb ,nil ;};type SizeSelection int ;func (_caba *Bitmap )ToImage ()_e .Image {_ecd ,_cga :=_ca .NewImage (_caba .Width ,_caba .Height ,1,1,_caba .Data ,nil ,nil );if _cga !=nil {_ba .Log .Error ("\u0043\u006f\u006e\u0076\u0065\u0072\u0074\u0069\u006e\u0067\u0020j\u0062\u0069\u0067\u0032\u002e\u0042\u0069\u0074m\u0061p\u0020\u0074\u006f\u0020\u0069\u006d\u0061\u0067\u0065\u0075\u0074\u0069\u006c\u002e\u0049\u006d\u0061\u0067e\u0020\u0066\u0061\u0069\u006c\u0065\u0064\u003a\u0020\u0025\u0076",_cga );
|
|
};return _ecd ;};type RasterOperator int ;func (_effa *Bitmaps )GroupByWidth ()(*BitmapsArray ,error ){const _cggf ="\u0047\u0072\u006fu\u0070\u0042\u0079\u0057\u0069\u0064\u0074\u0068";if len (_effa .Values )==0{return nil ,_d .Error (_cggf ,"\u006eo\u0020v\u0061\u006c\u0075\u0065\u0073 \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");
|
|
};_cgabb :=&BitmapsArray {};_effa .SortByWidth ();_fbag :=-1;_dcfcg :=-1;for _dagc :=0;_dagc < len (_effa .Values );_dagc ++{_cfef :=_effa .Values [_dagc ].Width ;if _cfef > _fbag {_fbag =_cfef ;_dcfcg ++;_cgabb .Values =append (_cgabb .Values ,&Bitmaps {});
|
|
};_cgabb .Values [_dcfcg ].AddBitmap (_effa .Values [_dagc ]);};return _cgabb ,nil ;};func (_fgf *Bitmap )Equals (s *Bitmap )bool {if len (_fgf .Data )!=len (s .Data )||_fgf .Width !=s .Width ||_fgf .Height !=s .Height {return false ;};for _edeg :=0;_edeg < _fgf .Height ;
|
|
_edeg ++{_acf :=_edeg *_fgf .RowStride ;for _gd :=0;_gd < _fgf .RowStride ;_gd ++{if _fgf .Data [_acf +_gd ]!=s .Data [_acf +_gd ]{return false ;};};};return true ;};func _gafd (_bcdb int )int {if _bcdb < 0{return -_bcdb ;};return _bcdb ;};func _de (_dc ,_cd *Bitmap )(_bf error ){const _cc ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0032";
|
|
_ef :=_cd .RowStride ;_ad :=_dc .RowStride ;var (_ab byte ;_ff uint16 ;_eff ,_bg ,_gc ,_ee ,_ea int ;);for _gc =0;_gc < _cd .Height ;_gc ++{_eff =_gc *_ef ;_bg =2*_gc *_ad ;for _ee =0;_ee < _ef ;_ee ++{_ab =_cd .Data [_eff +_ee ];_ff =_gdde [_ab ];_ea =_bg +_ee *2;
|
|
if _dc .RowStride !=_cd .RowStride *2&&(_ee +1)*2> _dc .RowStride {_bf =_dc .SetByte (_ea ,byte (_ff >>8));}else {_bf =_dc .setTwoBytes (_ea ,_ff );};if _bf !=nil {return _d .Wrap (_bf ,_cc ,"");};};for _ee =0;_ee < _ad ;_ee ++{_ea =_bg +_ad +_ee ;_ab =_dc .Data [_bg +_ee ];
|
|
if _bf =_dc .SetByte (_ea ,_ab );_bf !=nil {return _d .Wrapf (_bf ,_cc ,"c\u006f\u0070\u0079\u0020\u0064\u006fu\u0062\u006c\u0065\u0064\u0020\u006ci\u006e\u0065\u003a\u0020\u0027\u0025\u0064'\u002c\u0020\u0042\u0079\u0074\u0065\u003a\u0020\u0027\u0025d\u0027",_bg +_ee ,_bg +_ad +_ee );
|
|
};};};return nil ;};func (_bbed *BitmapsArray )AddBox (box *_e .Rectangle ){_bbed .Boxes =append (_bbed .Boxes ,box )};func _bcb (_fdeb ,_gfb *Bitmap ,_cbe int ,_bbgd []byte ,_abf int )(_caf error ){const _fae ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0032";
|
|
var (_fb ,_cdd ,_feb ,_feg ,_ebbd ,_defc ,_afa ,_fg int ;_gaa ,_gcfe ,_fcd ,_ac uint32 ;_abfe ,_agdb byte ;_beg uint16 ;);_cafg :=make ([]byte ,4);_aad :=make ([]byte ,4);for _feb =0;_feb < _fdeb .Height -1;_feb ,_feg =_feb +2,_feg +1{_fb =_feb *_fdeb .RowStride ;
|
|
_cdd =_feg *_gfb .RowStride ;for _ebbd ,_defc =0,0;_ebbd < _abf ;_ebbd ,_defc =_ebbd +4,_defc +1{for _afa =0;_afa < 4;_afa ++{_fg =_fb +_ebbd +_afa ;if _fg <=len (_fdeb .Data )-1&&_fg < _fb +_fdeb .RowStride {_cafg [_afa ]=_fdeb .Data [_fg ];}else {_cafg [_afa ]=0x00;
|
|
};_fg =_fb +_fdeb .RowStride +_ebbd +_afa ;if _fg <=len (_fdeb .Data )-1&&_fg < _fb +(2*_fdeb .RowStride ){_aad [_afa ]=_fdeb .Data [_fg ];}else {_aad [_afa ]=0x00;};};_gaa =_dd .BigEndian .Uint32 (_cafg );_gcfe =_dd .BigEndian .Uint32 (_aad );_fcd =_gaa &_gcfe ;
|
|
_fcd |=_fcd <<1;_ac =_gaa |_gcfe ;_ac &=_ac <<1;_gcfe =_fcd |_ac ;_gcfe &=0xaaaaaaaa;_gaa =_gcfe |(_gcfe <<7);_abfe =byte (_gaa >>24);_agdb =byte ((_gaa >>8)&0xff);_fg =_cdd +_defc ;if _fg +1==len (_gfb .Data )-1||_fg +1>=_cdd +_gfb .RowStride {if _caf =_gfb .SetByte (_fg ,_bbgd [_abfe ]);
|
|
_caf !=nil {return _d .Wrapf (_caf ,_fae ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_fg );};}else {_beg =(uint16 (_bbgd [_abfe ])<<8)|uint16 (_bbgd [_agdb ]);if _caf =_gfb .setTwoBytes (_fg ,_beg );_caf !=nil {return _d .Wrapf (_caf ,_fae ,"s\u0065\u0074\u0074\u0069\u006e\u0067 \u0074\u0077\u006f\u0020\u0062\u0079t\u0065\u0073\u0020\u0066\u0061\u0069\u006ce\u0064\u002c\u0020\u0069\u006e\u0064\u0065\u0078\u003a\u0020%\u0064",_fg );
|
|
};_defc ++;};};};return nil ;};func TstRSymbol (t *_fa .T ,scale ...int )*Bitmap {_adca ,_gcefb :=NewWithData (4,5,[]byte {0xF0,0x90,0xF0,0xA0,0x90});_f .NoError (t ,_gcefb );return TstGetScaledSymbol (t ,_adca ,scale ...);};func CombineBytes (oldByte ,newByte byte ,op CombinationOperator )byte {return _ggbb (oldByte ,newByte ,op );
|
|
};func (_ccda *Bitmaps )WidthSorter ()func (_ddec ,_dbdcd int )bool {return func (_fecff ,_dffg int )bool {return _ccda .Values [_fecff ].Width < _ccda .Values [_dffg ].Width };};type BitmapsArray struct{Values []*Bitmaps ;Boxes []*_e .Rectangle ;};const (ComponentConn Component =iota ;
|
|
ComponentCharacters ;ComponentWords ;);var _gdae =[5]int {1,2,3,0,4};func (_fbae *ClassedPoints )GetIntYByClass (i int )(int ,error ){const _fbeaf ="\u0043\u006c\u0061\u0073s\u0065\u0064\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047e\u0074I\u006e\u0074\u0059\u0042\u0079\u0043\u006ca\u0073\u0073";
|
|
if i >=_fbae .IntSlice .Size (){return 0,_d .Errorf (_fbeaf ,"\u0069\u003a\u0020\u0027\u0025\u0064\u0027 \u0069\u0073\u0020o\u0075\u0074\u0020\u006ff\u0020\u0074\u0068\u0065\u0020\u0072\u0061\u006e\u0067\u0065\u0020\u006f\u0066\u0020\u0074\u0068\u0065\u0020\u0049\u006e\u0074\u0053\u006c\u0069\u0063\u0065",i );
|
|
};return int (_fbae .YAtIndex (i )),nil ;};func (_edc *Bitmap )GetUnpaddedData ()([]byte ,error ){_gffg :=uint (_edc .Width &0x07);if _gffg ==0{return _edc .Data ,nil ;};_aag :=_edc .Width *_edc .Height ;if _aag %8!=0{_aag >>=3;_aag ++;}else {_aag >>=3;
|
|
};_dge :=make ([]byte ,_aag );_add :=_a .NewWriterMSB (_dge );const _ddfg ="\u0047e\u0074U\u006e\u0070\u0061\u0064\u0064\u0065\u0064\u0044\u0061\u0074\u0061";for _ddge :=0;_ddge < _edc .Height ;_ddge ++{for _dfe :=0;_dfe < _edc .RowStride ;_dfe ++{_cda :=_edc .Data [_ddge *_edc .RowStride +_dfe ];
|
|
if _dfe !=_edc .RowStride -1{_agaf :=_add .WriteByte (_cda );if _agaf !=nil {return nil ,_d .Wrap (_agaf ,_ddfg ,"");};continue ;};for _egff :=uint (0);_egff < _gffg ;_egff ++{_ffg :=_add .WriteBit (int (_cda >>(7-_egff )&0x01));if _ffg !=nil {return nil ,_d .Wrap (_ffg ,_ddfg ,"");
|
|
};};};};return _dge ,nil ;};func (_dacg *ClassedPoints )Swap (i ,j int ){_dacg .IntSlice [i ],_dacg .IntSlice [j ]=_dacg .IntSlice [j ],_dacg .IntSlice [i ];};var _bedd [256]uint8 ;const (_fgac shift =iota ;_dacga ;);type Component int ;const (_ SizeSelection =iota ;
|
|
SizeSelectByWidth ;SizeSelectByHeight ;SizeSelectByMaxDimension ;SizeSelectByArea ;SizeSelectByPerimeter ;);type Bitmaps struct{Values []*Bitmap ;Boxes []*_e .Rectangle ;};func (_edcb *ClassedPoints )YAtIndex (i int )float32 {return (*_edcb .Points )[_edcb .IntSlice [i ]].Y };
|
|
func (_abde *Boxes )Get (i int )(*_e .Rectangle ,error ){const _bdeg ="\u0042o\u0078\u0065\u0073\u002e\u0047\u0065t";if _abde ==nil {return nil ,_d .Error (_bdeg ,"\u0027\u0042\u006f\u0078es\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};if i > len (*_abde )-1{return nil ,_d .Errorf (_bdeg ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return (*_abde )[i ],nil ;};func _dcff (_ccgg ,_gca *Bitmap ,_edec *Selection )(*Bitmap ,error ){const _egfe ="\u006f\u0070\u0065\u006e";
|
|
var _dbdd error ;_ccgg ,_dbdd =_ccfg (_ccgg ,_gca ,_edec );if _dbdd !=nil {return nil ,_d .Wrap (_dbdd ,_egfe ,"");};_dead ,_dbdd :=_afdb (nil ,_gca ,_edec );if _dbdd !=nil {return nil ,_d .Wrap (_dbdd ,_egfe ,"");};_ ,_dbdd =_dcd (_ccgg ,_dead ,_edec );
|
|
if _dbdd !=nil {return nil ,_d .Wrap (_dbdd ,_egfe ,"");};return _ccgg ,nil ;};func TstWriteSymbols (t *_fa .T ,bms *Bitmaps ,src *Bitmap ){for _faed :=0;_faed < bms .Size ();_faed ++{_ebdff :=bms .Values [_faed ];_cabg :=bms .Boxes [_faed ];_dgeae :=src .RasterOperation (_cabg .Min .X ,_cabg .Min .Y ,_ebdff .Width ,_ebdff .Height ,PixSrc ,_ebdff ,0,0);
|
|
_f .NoError (t ,_dgeae );};};func (_cdge *Bitmap )clipRectangle (_dbda ,_aed *_e .Rectangle )(_agf *Bitmap ,_bedb error ){const _efb ="\u0063\u006c\u0069\u0070\u0052\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065";if _dbda ==nil {return nil ,_d .Error (_efb ,"\u0070r\u006fv\u0069\u0064\u0065\u0064\u0020n\u0069\u006c \u0027\u0062\u006f\u0078\u0027");
|
|
};_ega ,_fdd :=_cdge .Width ,_cdge .Height ;_ccd ,_bedb :=ClipBoxToRectangle (_dbda ,_ega ,_fdd );if _bedb !=nil {_ba .Log .Warning ("\u0027\u0062ox\u0027\u0020\u0064o\u0065\u0073\u006e\u0027t o\u0076er\u006c\u0061\u0070\u0020\u0062\u0069\u0074ma\u0070\u0020\u0027\u0062\u0027\u003a\u0020%\u0076",_bedb );
|
|
return nil ,nil ;};_gdc ,_gba :=_ccd .Min .X ,_ccd .Min .Y ;_febb ,_fba :=_ccd .Max .X -_ccd .Min .X ,_ccd .Max .Y -_ccd .Min .Y ;_agf =New (_febb ,_fba );_agf .Text =_cdge .Text ;if _bedb =_agf .RasterOperation (0,0,_febb ,_fba ,PixSrc ,_cdge ,_gdc ,_gba );
|
|
_bedb !=nil {return nil ,_d .Wrap (_bedb ,_efb ,"");};if _aed !=nil {*_aed =*_ccd ;};return _agf ,nil ;};type MorphProcess struct{Operation MorphOperation ;Arguments []int ;};func (_ebae *Bitmaps )Size ()int {return len (_ebae .Values )};func (_cddcd *Bitmap )thresholdPixelSum (_ecee int )bool {var (_fad int ;
|
|
_gbegg uint8 ;_egd byte ;_gcbg int ;);_daf :=_cddcd .RowStride ;_dee :=uint (_cddcd .Width &0x07);if _dee !=0{_gbegg =uint8 ((0xff<<(8-_dee ))&0xff);_daf --;};for _abgc :=0;_abgc < _cddcd .Height ;_abgc ++{for _gcbg =0;_gcbg < _daf ;_gcbg ++{_egd =_cddcd .Data [_abgc *_cddcd .RowStride +_gcbg ];
|
|
_fad +=int (_bedd [_egd ]);};if _dee !=0{_egd =_cddcd .Data [_abgc *_cddcd .RowStride +_gcbg ]&_gbegg ;_fad +=int (_bedd [_egd ]);};if _fad > _ecee {return true ;};};return false ;};func _bbcbc (_fbdeb *_fd .Stack ,_gfgce ,_dgeb ,_egdg ,_cefb ,_afef int ,_dffc *_e .Rectangle )(_agaac error ){const _ggfd ="\u0070\u0075\u0073\u0068\u0046\u0069\u006c\u006c\u0053\u0065\u0067m\u0065\u006e\u0074\u0042\u006f\u0075\u006e\u0064\u0069\u006eg\u0042\u006f\u0078";
|
|
if _fbdeb ==nil {return _d .Error (_ggfd ,"\u006ei\u006c \u0073\u0074\u0061\u0063\u006b \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");};if _dffc ==nil {return _d .Error (_ggfd ,"\u0070\u0072\u006f\u0076i\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0069\u006da\u0067e\u002e\u0052\u0065\u0063\u0074\u0061\u006eg\u006c\u0065");
|
|
};_dffc .Min .X =_fd .Min (_dffc .Min .X ,_gfgce );_dffc .Max .X =_fd .Max (_dffc .Max .X ,_dgeb );_dffc .Min .Y =_fd .Min (_dffc .Min .Y ,_egdg );_dffc .Max .Y =_fd .Max (_dffc .Max .Y ,_egdg );if !(_egdg +_cefb >=0&&_egdg +_cefb <=_afef ){return nil ;
|
|
};if _fbdeb .Aux ==nil {return _d .Error (_ggfd ,"a\u0075x\u0053\u0074\u0061\u0063\u006b\u0020\u006e\u006ft\u0020\u0064\u0065\u0066in\u0065\u0064");};var _adafc *fillSegment ;_eefb ,_bbddg :=_fbdeb .Aux .Pop ();if _bbddg {if _adafc ,_bbddg =_eefb .(*fillSegment );
|
|
!_bbddg {return _d .Error (_ggfd ,"a\u0075\u0078\u0053\u0074\u0061\u0063k\u0020\u0064\u0061\u0074\u0061\u0020i\u0073\u0020\u006e\u006f\u0074\u0020\u0061 \u002a\u0066\u0069\u006c\u006c\u0053\u0065\u0067\u006d\u0065n\u0074");};}else {_adafc =&fillSegment {};
|
|
};_adafc ._bgade =_gfgce ;_adafc ._bbggc =_dgeb ;_adafc ._daca =_egdg ;_adafc ._gdbc =_cefb ;_fbdeb .Push (_adafc );return nil ;};func _acaa (_afeg ,_fbdgac *Bitmap ,_dbbe ,_gabf int )(*Bitmap ,error ){const _aega ="d\u0069\u006c\u0061\u0074\u0065\u0042\u0072\u0069\u0063\u006b";
|
|
if _fbdgac ==nil {_ba .Log .Debug ("\u0064\u0069\u006c\u0061\u0074\u0065\u0042\u0072\u0069\u0063k\u0020\u0073\u006f\u0075\u0072\u0063\u0065 \u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");return nil ,_d .Error (_aega ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");
|
|
};if _dbbe < 1||_gabf < 1{return nil ,_d .Error (_aega ,"\u0068\u0053\u007a\u0069\u0065 \u0061\u006e\u0064\u0020\u0076\u0053\u0069\u007a\u0065\u0020\u0061\u0072\u0065 \u006e\u006f\u0020\u0067\u0072\u0065\u0061\u0074\u0065\u0072\u0020\u0065\u0071\u0075\u0061\u006c\u0020\u0074\u006f\u0020\u0031");
|
|
};if _dbbe ==1&&_gabf ==1{_faeb ,_adeg :=_bbe (_afeg ,_fbdgac );if _adeg !=nil {return nil ,_d .Wrap (_adeg ,_aega ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u0026\u0026 \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _faeb ,nil ;};if _dbbe ==1||_gabf ==1{_fcab :=SelCreateBrick (_gabf ,_dbbe ,_gabf /2,_dbbe /2,SelHit );_daaf ,_addb :=_dcd (_afeg ,_fbdgac ,_fcab );if _addb !=nil {return nil ,_d .Wrap (_addb ,_aega ,"\u0068s\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _daaf ,nil ;};_aebd :=SelCreateBrick (1,_dbbe ,0,_dbbe /2,SelHit );_abef :=SelCreateBrick (_gabf ,1,_gabf /2,0,SelHit );_facbe ,_eabbf :=_dcd (nil ,_fbdgac ,_aebd );if _eabbf !=nil {return nil ,_d .Wrap (_eabbf ,_aega ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
};_afeg ,_eabbf =_dcd (_afeg ,_facbe ,_abef );if _eabbf !=nil {return nil ,_d .Wrap (_eabbf ,_aega ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};return _afeg ,nil ;};func _agd (_aef *Bitmap ,_dec *Bitmap ,_baad int )(_bad error ){const _aa ="e\u0078\u0070\u0061\u006edB\u0069n\u0061\u0072\u0079\u0050\u006fw\u0065\u0072\u0032\u004c\u006f\u0077";
|
|
switch _baad {case 2:_bad =_de (_aef ,_dec );case 4:_bad =_cf (_aef ,_dec );case 8:_bad =_bgc (_aef ,_dec );default:return _d .Error (_aa ,"\u0065\u0078p\u0061\u006e\u0073\u0069o\u006e\u0020f\u0061\u0063\u0074\u006f\u0072\u0020\u006e\u006ft\u0020\u0069\u006e\u0020\u007b\u0032\u002c\u0034\u002c\u0038\u007d\u0020r\u0061\u006e\u0067\u0065");
|
|
};if _bad !=nil {_bad =_d .Wrap (_bad ,_aa ,"");};return _bad ;};func _dgeg (_eabdf ,_fefd int ,_ggff string )*Selection {_ffbed :=&Selection {Height :_eabdf ,Width :_fefd ,Name :_ggff };_ffbed .Data =make ([][]SelectionValue ,_eabdf );for _cbabb :=0;_cbabb < _eabdf ;
|
|
_cbabb ++{_ffbed .Data [_cbabb ]=make ([]SelectionValue ,_fefd );};return _ffbed ;};func _ggdd (_ddege *Bitmap ,_eaaaa *Bitmap ,_dfaa int )(_daad error ){const _gece ="\u0073\u0065\u0065\u0064\u0066\u0069\u006c\u006c\u0042\u0069\u006e\u0061r\u0079\u004c\u006f\u0077";
|
|
_agbdd :=_cbf (_ddege .Height ,_eaaaa .Height );_feca :=_cbf (_ddege .RowStride ,_eaaaa .RowStride );switch _dfaa {case 4:_daad =_gfgbc (_ddege ,_eaaaa ,_agbdd ,_feca );case 8:_daad =_efeab (_ddege ,_eaaaa ,_agbdd ,_feca );default:return _d .Errorf (_gece ,"\u0063\u006f\u006e\u006e\u0065\u0063\u0074\u0069\u0076\u0069\u0074\u0079\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065\u0020\u0034\u0020\u006fr\u0020\u0038\u0020\u002d\u0020i\u0073\u003a \u0027\u0025\u0064\u0027",_dfaa );
|
|
};if _daad !=nil {return _d .Wrap (_daad ,_gece ,"");};return nil ;};func _gcae (_cgde *Bitmap ,_caff ,_dbcc ,_efeg ,_daff int ,_aabe RasterOperator ,_egga *Bitmap ,_efeed ,_acdf int )error {var (_fbca bool ;_bffe bool ;_fddcc int ;_gbegd int ;_bfgd int ;
|
|
_bbba bool ;_decd byte ;_eadcf int ;_cdcg int ;_egee int ;_adda ,_gdaf int ;);_dgecf :=8-(_caff &7);_ccgc :=_caeaf [_dgecf ];_cfaea :=_cgde .RowStride *_dbcc +(_caff >>3);_afdc :=_egga .RowStride *_acdf +(_efeed >>3);if _efeg < _dgecf {_fbca =true ;_ccgc &=_fgedf [8-_dgecf +_efeg ];
|
|
};if !_fbca {_fddcc =(_efeg -_dgecf )>>3;if _fddcc > 0{_bffe =true ;_gbegd =_cfaea +1;_bfgd =_afdc +1;};};_eadcf =(_caff +_efeg )&7;if !(_fbca ||_eadcf ==0){_bbba =true ;_decd =_fgedf [_eadcf ];_cdcg =_cfaea +1+_fddcc ;_egee =_afdc +1+_fddcc ;};switch _aabe {case PixSrc :for _adda =0;
|
|
_adda < _daff ;_adda ++{_cgde .Data [_cfaea ]=_egcce (_cgde .Data [_cfaea ],_egga .Data [_afdc ],_ccgc );_cfaea +=_cgde .RowStride ;_afdc +=_egga .RowStride ;};if _bffe {for _adda =0;_adda < _daff ;_adda ++{for _gdaf =0;_gdaf < _fddcc ;_gdaf ++{_cgde .Data [_gbegd +_gdaf ]=_egga .Data [_bfgd +_gdaf ];
|
|
};_gbegd +=_cgde .RowStride ;_bfgd +=_egga .RowStride ;};};if _bbba {for _adda =0;_adda < _daff ;_adda ++{_cgde .Data [_cdcg ]=_egcce (_cgde .Data [_cdcg ],_egga .Data [_egee ],_decd );_cdcg +=_cgde .RowStride ;_egee +=_egga .RowStride ;};};case PixNotSrc :for _adda =0;
|
|
_adda < _daff ;_adda ++{_cgde .Data [_cfaea ]=_egcce (_cgde .Data [_cfaea ],^_egga .Data [_afdc ],_ccgc );_cfaea +=_cgde .RowStride ;_afdc +=_egga .RowStride ;};if _bffe {for _adda =0;_adda < _daff ;_adda ++{for _gdaf =0;_gdaf < _fddcc ;_gdaf ++{_cgde .Data [_gbegd +_gdaf ]=^_egga .Data [_bfgd +_gdaf ];
|
|
};_gbegd +=_cgde .RowStride ;_bfgd +=_egga .RowStride ;};};if _bbba {for _adda =0;_adda < _daff ;_adda ++{_cgde .Data [_cdcg ]=_egcce (_cgde .Data [_cdcg ],^_egga .Data [_egee ],_decd );_cdcg +=_cgde .RowStride ;_egee +=_egga .RowStride ;};};case PixSrcOrDst :for _adda =0;
|
|
_adda < _daff ;_adda ++{_cgde .Data [_cfaea ]=_egcce (_cgde .Data [_cfaea ],_egga .Data [_afdc ]|_cgde .Data [_cfaea ],_ccgc );_cfaea +=_cgde .RowStride ;_afdc +=_egga .RowStride ;};if _bffe {for _adda =0;_adda < _daff ;_adda ++{for _gdaf =0;_gdaf < _fddcc ;
|
|
_gdaf ++{_cgde .Data [_gbegd +_gdaf ]|=_egga .Data [_bfgd +_gdaf ];};_gbegd +=_cgde .RowStride ;_bfgd +=_egga .RowStride ;};};if _bbba {for _adda =0;_adda < _daff ;_adda ++{_cgde .Data [_cdcg ]=_egcce (_cgde .Data [_cdcg ],_egga .Data [_egee ]|_cgde .Data [_cdcg ],_decd );
|
|
_cdcg +=_cgde .RowStride ;_egee +=_egga .RowStride ;};};case PixSrcAndDst :for _adda =0;_adda < _daff ;_adda ++{_cgde .Data [_cfaea ]=_egcce (_cgde .Data [_cfaea ],_egga .Data [_afdc ]&_cgde .Data [_cfaea ],_ccgc );_cfaea +=_cgde .RowStride ;_afdc +=_egga .RowStride ;
|
|
};if _bffe {for _adda =0;_adda < _daff ;_adda ++{for _gdaf =0;_gdaf < _fddcc ;_gdaf ++{_cgde .Data [_gbegd +_gdaf ]&=_egga .Data [_bfgd +_gdaf ];};_gbegd +=_cgde .RowStride ;_bfgd +=_egga .RowStride ;};};if _bbba {for _adda =0;_adda < _daff ;_adda ++{_cgde .Data [_cdcg ]=_egcce (_cgde .Data [_cdcg ],_egga .Data [_egee ]&_cgde .Data [_cdcg ],_decd );
|
|
_cdcg +=_cgde .RowStride ;_egee +=_egga .RowStride ;};};case PixSrcXorDst :for _adda =0;_adda < _daff ;_adda ++{_cgde .Data [_cfaea ]=_egcce (_cgde .Data [_cfaea ],_egga .Data [_afdc ]^_cgde .Data [_cfaea ],_ccgc );_cfaea +=_cgde .RowStride ;_afdc +=_egga .RowStride ;
|
|
};if _bffe {for _adda =0;_adda < _daff ;_adda ++{for _gdaf =0;_gdaf < _fddcc ;_gdaf ++{_cgde .Data [_gbegd +_gdaf ]^=_egga .Data [_bfgd +_gdaf ];};_gbegd +=_cgde .RowStride ;_bfgd +=_egga .RowStride ;};};if _bbba {for _adda =0;_adda < _daff ;_adda ++{_cgde .Data [_cdcg ]=_egcce (_cgde .Data [_cdcg ],_egga .Data [_egee ]^_cgde .Data [_cdcg ],_decd );
|
|
_cdcg +=_cgde .RowStride ;_egee +=_egga .RowStride ;};};case PixNotSrcOrDst :for _adda =0;_adda < _daff ;_adda ++{_cgde .Data [_cfaea ]=_egcce (_cgde .Data [_cfaea ],^(_egga .Data [_afdc ])|_cgde .Data [_cfaea ],_ccgc );_cfaea +=_cgde .RowStride ;_afdc +=_egga .RowStride ;
|
|
};if _bffe {for _adda =0;_adda < _daff ;_adda ++{for _gdaf =0;_gdaf < _fddcc ;_gdaf ++{_cgde .Data [_gbegd +_gdaf ]|=^(_egga .Data [_bfgd +_gdaf ]);};_gbegd +=_cgde .RowStride ;_bfgd +=_egga .RowStride ;};};if _bbba {for _adda =0;_adda < _daff ;_adda ++{_cgde .Data [_cdcg ]=_egcce (_cgde .Data [_cdcg ],^(_egga .Data [_egee ])|_cgde .Data [_cdcg ],_decd );
|
|
_cdcg +=_cgde .RowStride ;_egee +=_egga .RowStride ;};};case PixNotSrcAndDst :for _adda =0;_adda < _daff ;_adda ++{_cgde .Data [_cfaea ]=_egcce (_cgde .Data [_cfaea ],^(_egga .Data [_afdc ])&_cgde .Data [_cfaea ],_ccgc );_cfaea +=_cgde .RowStride ;_afdc +=_egga .RowStride ;
|
|
};if _bffe {for _adda =0;_adda < _daff ;_adda ++{for _gdaf =0;_gdaf < _fddcc ;_gdaf ++{_cgde .Data [_gbegd +_gdaf ]&=^_egga .Data [_bfgd +_gdaf ];};_gbegd +=_cgde .RowStride ;_bfgd +=_egga .RowStride ;};};if _bbba {for _adda =0;_adda < _daff ;_adda ++{_cgde .Data [_cdcg ]=_egcce (_cgde .Data [_cdcg ],^(_egga .Data [_egee ])&_cgde .Data [_cdcg ],_decd );
|
|
_cdcg +=_cgde .RowStride ;_egee +=_egga .RowStride ;};};case PixSrcOrNotDst :for _adda =0;_adda < _daff ;_adda ++{_cgde .Data [_cfaea ]=_egcce (_cgde .Data [_cfaea ],_egga .Data [_afdc ]|^(_cgde .Data [_cfaea ]),_ccgc );_cfaea +=_cgde .RowStride ;_afdc +=_egga .RowStride ;
|
|
};if _bffe {for _adda =0;_adda < _daff ;_adda ++{for _gdaf =0;_gdaf < _fddcc ;_gdaf ++{_cgde .Data [_gbegd +_gdaf ]=_egga .Data [_bfgd +_gdaf ]|^(_cgde .Data [_gbegd +_gdaf ]);};_gbegd +=_cgde .RowStride ;_bfgd +=_egga .RowStride ;};};if _bbba {for _adda =0;
|
|
_adda < _daff ;_adda ++{_cgde .Data [_cdcg ]=_egcce (_cgde .Data [_cdcg ],_egga .Data [_egee ]|^(_cgde .Data [_cdcg ]),_decd );_cdcg +=_cgde .RowStride ;_egee +=_egga .RowStride ;};};case PixSrcAndNotDst :for _adda =0;_adda < _daff ;_adda ++{_cgde .Data [_cfaea ]=_egcce (_cgde .Data [_cfaea ],_egga .Data [_afdc ]&^(_cgde .Data [_cfaea ]),_ccgc );
|
|
_cfaea +=_cgde .RowStride ;_afdc +=_egga .RowStride ;};if _bffe {for _adda =0;_adda < _daff ;_adda ++{for _gdaf =0;_gdaf < _fddcc ;_gdaf ++{_cgde .Data [_gbegd +_gdaf ]=_egga .Data [_bfgd +_gdaf ]&^(_cgde .Data [_gbegd +_gdaf ]);};_gbegd +=_cgde .RowStride ;
|
|
_bfgd +=_egga .RowStride ;};};if _bbba {for _adda =0;_adda < _daff ;_adda ++{_cgde .Data [_cdcg ]=_egcce (_cgde .Data [_cdcg ],_egga .Data [_egee ]&^(_cgde .Data [_cdcg ]),_decd );_cdcg +=_cgde .RowStride ;_egee +=_egga .RowStride ;};};case PixNotPixSrcOrDst :for _adda =0;
|
|
_adda < _daff ;_adda ++{_cgde .Data [_cfaea ]=_egcce (_cgde .Data [_cfaea ],^(_egga .Data [_afdc ]|_cgde .Data [_cfaea ]),_ccgc );_cfaea +=_cgde .RowStride ;_afdc +=_egga .RowStride ;};if _bffe {for _adda =0;_adda < _daff ;_adda ++{for _gdaf =0;_gdaf < _fddcc ;
|
|
_gdaf ++{_cgde .Data [_gbegd +_gdaf ]=^(_egga .Data [_bfgd +_gdaf ]|_cgde .Data [_gbegd +_gdaf ]);};_gbegd +=_cgde .RowStride ;_bfgd +=_egga .RowStride ;};};if _bbba {for _adda =0;_adda < _daff ;_adda ++{_cgde .Data [_cdcg ]=_egcce (_cgde .Data [_cdcg ],^(_egga .Data [_egee ]|_cgde .Data [_cdcg ]),_decd );
|
|
_cdcg +=_cgde .RowStride ;_egee +=_egga .RowStride ;};};case PixNotPixSrcAndDst :for _adda =0;_adda < _daff ;_adda ++{_cgde .Data [_cfaea ]=_egcce (_cgde .Data [_cfaea ],^(_egga .Data [_afdc ]&_cgde .Data [_cfaea ]),_ccgc );_cfaea +=_cgde .RowStride ;_afdc +=_egga .RowStride ;
|
|
};if _bffe {for _adda =0;_adda < _daff ;_adda ++{for _gdaf =0;_gdaf < _fddcc ;_gdaf ++{_cgde .Data [_gbegd +_gdaf ]=^(_egga .Data [_bfgd +_gdaf ]&_cgde .Data [_gbegd +_gdaf ]);};_gbegd +=_cgde .RowStride ;_bfgd +=_egga .RowStride ;};};if _bbba {for _adda =0;
|
|
_adda < _daff ;_adda ++{_cgde .Data [_cdcg ]=_egcce (_cgde .Data [_cdcg ],^(_egga .Data [_egee ]&_cgde .Data [_cdcg ]),_decd );_cdcg +=_cgde .RowStride ;_egee +=_egga .RowStride ;};};case PixNotPixSrcXorDst :for _adda =0;_adda < _daff ;_adda ++{_cgde .Data [_cfaea ]=_egcce (_cgde .Data [_cfaea ],^(_egga .Data [_afdc ]^_cgde .Data [_cfaea ]),_ccgc );
|
|
_cfaea +=_cgde .RowStride ;_afdc +=_egga .RowStride ;};if _bffe {for _adda =0;_adda < _daff ;_adda ++{for _gdaf =0;_gdaf < _fddcc ;_gdaf ++{_cgde .Data [_gbegd +_gdaf ]=^(_egga .Data [_bfgd +_gdaf ]^_cgde .Data [_gbegd +_gdaf ]);};_gbegd +=_cgde .RowStride ;
|
|
_bfgd +=_egga .RowStride ;};};if _bbba {for _adda =0;_adda < _daff ;_adda ++{_cgde .Data [_cdcg ]=_egcce (_cgde .Data [_cdcg ],^(_egga .Data [_egee ]^_cgde .Data [_cdcg ]),_decd );_cdcg +=_cgde .RowStride ;_egee +=_egga .RowStride ;};};default:_ba .Log .Debug ("I\u006e\u0076\u0061\u006c\u0069\u0064 \u0072\u0061\u0073\u0074\u0065\u0072\u0020\u006f\u0070e\u0072\u0061\u0074o\u0072:\u0020\u0025\u0064",_aabe );
|
|
return _d .Error ("\u0072\u0061\u0073\u0074er\u004f\u0070\u0056\u0041\u006c\u0069\u0067\u006e\u0065\u0064\u004c\u006f\u0077","\u0069\u006e\u0076al\u0069\u0064\u0020\u0072\u0061\u0073\u0074\u0065\u0072\u0020\u006f\u0070\u0065\u0072\u0061\u0074\u006f\u0072");
|
|
};return nil ;};func _cage (_cfb uint ,_decf byte )byte {return _decf >>_cfb <<_cfb };func NewWithData (width ,height int ,data []byte )(*Bitmap ,error ){const _dcgc ="N\u0065\u0077\u0057\u0069\u0074\u0068\u0044\u0061\u0074\u0061";_ffa :=_dad (width ,height );
|
|
_ffa .Data =data ;if len (data )< height *_ffa .RowStride {return nil ,_d .Errorf (_dcgc ,"\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0064\u0061\u0074\u0061\u0020l\u0065\u006e\u0067\u0074\u0068\u003a \u0025\u0064\u0020\u002d\u0020\u0073\u0068\u006f\u0075\u006c\u0064\u0020\u0062e\u003a\u0020\u0025\u0064",len (data ),height *_ffa .RowStride );
|
|
};return _ffa ,nil ;};type Bitmap struct{Width ,Height int ;BitmapNumber int ;RowStride int ;Data []byte ;Color Color ;Special int ;Text string ;XResolution ,YResolution int ;};func TstWordBitmapWithSpaces (t *_fa .T ,scale ...int )*Bitmap {_cgca :=1;if len (scale )> 0{_cgca =scale [0];
|
|
};_caacb :=3;_daag :=9+7+15+2*_caacb +2*_caacb ;_abeb :=5+_caacb +5+2*_caacb ;_bcefe :=New (_daag *_cgca ,_abeb *_cgca );_gbege :=&Bitmaps {};var _dggaa *int ;_caacb *=_cgca ;_dcdc :=_caacb ;_dggaa =&_dcdc ;_ffdf :=_caacb ;_agfb :=TstDSymbol (t ,scale ...);
|
|
TstAddSymbol (t ,_gbege ,_agfb ,_dggaa ,_ffdf ,1*_cgca );_agfb =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_gbege ,_agfb ,_dggaa ,_ffdf ,_caacb );_agfb =TstISymbol (t ,scale ...);TstAddSymbol (t ,_gbege ,_agfb ,_dggaa ,_ffdf ,1*_cgca );_agfb =TstTSymbol (t ,scale ...);
|
|
TstAddSymbol (t ,_gbege ,_agfb ,_dggaa ,_ffdf ,_caacb );_agfb =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_gbege ,_agfb ,_dggaa ,_ffdf ,1*_cgca );_agfb =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_gbege ,_agfb ,_dggaa ,_ffdf ,1*_cgca );_agfb =TstWSymbol (t ,scale ...);
|
|
TstAddSymbol (t ,_gbege ,_agfb ,_dggaa ,_ffdf ,0);*_dggaa =_caacb ;_ffdf =5*_cgca +_caacb ;_agfb =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_gbege ,_agfb ,_dggaa ,_ffdf ,1*_cgca );_agfb =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_gbege ,_agfb ,_dggaa ,_ffdf ,_caacb );
|
|
_agfb =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_gbege ,_agfb ,_dggaa ,_ffdf ,1*_cgca );_agfb =TstESymbol (t ,scale ...);TstAddSymbol (t ,_gbege ,_agfb ,_dggaa ,_ffdf ,1*_cgca );_agfb =TstVSymbol (t ,scale ...);TstAddSymbol (t ,_gbege ,_agfb ,_dggaa ,_ffdf ,1*_cgca );
|
|
_agfb =TstESymbol (t ,scale ...);TstAddSymbol (t ,_gbege ,_agfb ,_dggaa ,_ffdf ,1*_cgca );_agfb =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_gbege ,_agfb ,_dggaa ,_ffdf ,0);TstWriteSymbols (t ,_gbege ,_bcefe );return _bcefe ;};func _aagd (_cgab *Bitmap ,_dgecb ...MorphProcess )(_bcdbe *Bitmap ,_baade error ){const _fdff ="\u006d\u006f\u0072\u0070\u0068\u0053\u0065\u0071\u0075\u0065\u006e\u0063\u0065";
|
|
if _cgab ==nil {return nil ,_d .Error (_fdff ,"\u006d\u006f\u0072\u0070\u0068\u0053\u0065\u0071\u0075\u0065\u006e\u0063\u0065 \u0073\u006f\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061\u0070\u0020\u006e\u006f\u0074\u0020\u0064\u0065f\u0069\u006e\u0065\u0064");
|
|
};if len (_dgecb )==0{return nil ,_d .Error (_fdff ,"m\u006f\u0072\u0070\u0068\u0053\u0065q\u0075\u0065\u006e\u0063\u0065\u002c \u0073\u0065\u0071\u0075\u0065\u006e\u0063e\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006ee\u0064");};if _baade =_cgcd (_dgecb ...);
|
|
_baade !=nil {return nil ,_d .Wrap (_baade ,_fdff ,"");};var _eca ,_fcaae ,_aafb int ;_bcdbe =_cgab .Copy ();for _ ,_acbd :=range _dgecb {switch _acbd .Operation {case MopDilation :_eca ,_fcaae =_acbd .getWidthHeight ();_bcdbe ,_baade =DilateBrick (nil ,_bcdbe ,_eca ,_fcaae );
|
|
if _baade !=nil {return nil ,_d .Wrap (_baade ,_fdff ,"");};case MopErosion :_eca ,_fcaae =_acbd .getWidthHeight ();_bcdbe ,_baade =_fggb (nil ,_bcdbe ,_eca ,_fcaae );if _baade !=nil {return nil ,_d .Wrap (_baade ,_fdff ,"");};case MopOpening :_eca ,_fcaae =_acbd .getWidthHeight ();
|
|
_bcdbe ,_baade =_gdcaf (nil ,_bcdbe ,_eca ,_fcaae );if _baade !=nil {return nil ,_d .Wrap (_baade ,_fdff ,"");};case MopClosing :_eca ,_fcaae =_acbd .getWidthHeight ();_bcdbe ,_baade =_cbca (nil ,_bcdbe ,_eca ,_fcaae );if _baade !=nil {return nil ,_d .Wrap (_baade ,_fdff ,"");
|
|
};case MopRankBinaryReduction :_bcdbe ,_baade =_efe (_bcdbe ,_acbd .Arguments ...);if _baade !=nil {return nil ,_d .Wrap (_baade ,_fdff ,"");};case MopReplicativeBinaryExpansion :_bcdbe ,_baade =_ffaf (_bcdbe ,_acbd .Arguments [0]);if _baade !=nil {return nil ,_d .Wrap (_baade ,_fdff ,"");
|
|
};case MopAddBorder :_aafb =_acbd .Arguments [0];_bcdbe ,_baade =_bcdbe .AddBorder (_aafb ,0);if _baade !=nil {return nil ,_d .Wrap (_baade ,_fdff ,"");};default:return nil ,_d .Error (_fdff ,"i\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u006d\u006fr\u0070\u0068\u004f\u0070\u0065\u0072\u0061ti\u006f\u006e\u0020\u0070r\u006f\u0076\u0069\u0064\u0065\u0064\u0020\u0074\u006f t\u0068\u0065 \u0073\u0065\u0071\u0075\u0065\u006e\u0063\u0065");
|
|
};};if _aafb > 0{_bcdbe ,_baade =_bcdbe .RemoveBorder (_aafb );if _baade !=nil {return nil ,_d .Wrap (_baade ,_fdff ,"\u0062\u006f\u0072\u0064\u0065\u0072\u0020\u003e\u0020\u0030");};};return _bcdbe ,nil ;};func TstWSymbol (t *_fa .T ,scale ...int )*Bitmap {_efaed ,_ebadg :=NewWithData (5,5,[]byte {0x88,0x88,0xA8,0xD8,0x88});
|
|
_f .NoError (t ,_ebadg );return TstGetScaledSymbol (t ,_efaed ,scale ...);};func TstESymbol (t *_fa .T ,scale ...int )*Bitmap {_gdef ,_ggfe :=NewWithData (4,5,[]byte {0xF0,0x80,0xE0,0x80,0xF0});_f .NoError (t ,_ggfe );return TstGetScaledSymbol (t ,_gdef ,scale ...);
|
|
};func (_cdcgf *Bitmaps )SelectByIndexes (idx []int )(*Bitmaps ,error ){const _acage ="B\u0069\u0074\u006d\u0061\u0070\u0073.\u0053\u006f\u0072\u0074\u0049\u006e\u0064\u0065\u0078e\u0073\u0042\u0079H\u0065i\u0067\u0068\u0074";_bbeee ,_aecdf :=_cdcgf .selectByIndexes (idx );
|
|
if _aecdf !=nil {return nil ,_d .Wrap (_aecdf ,_acage ,"");};return _bbeee ,nil ;};func (_abcc *byWidth )Swap (i ,j int ){_abcc .Values [i ],_abcc .Values [j ]=_abcc .Values [j ],_abcc .Values [i ];if _abcc .Boxes !=nil {_abcc .Boxes [i ],_abcc .Boxes [j ]=_abcc .Boxes [j ],_abcc .Boxes [i ];
|
|
};};func (_bcafb *Boxes )SelectBySize (width ,height int ,tp LocationFilter ,relation SizeComparison )(_deed *Boxes ,_bfdgc error ){const _fbbef ="\u0042o\u0078e\u0073\u002e\u0053\u0065\u006ce\u0063\u0074B\u0079\u0053\u0069\u007a\u0065";if _bcafb ==nil {return nil ,_d .Error (_fbbef ,"b\u006f\u0078\u0065\u0073 '\u0062'\u0020\u006e\u006f\u0074\u0020d\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};if len (*_bcafb )==0{return _bcafb ,nil ;};switch tp {case LocSelectWidth ,LocSelectHeight ,LocSelectIfEither ,LocSelectIfBoth :default:return nil ,_d .Errorf (_fbbef ,"\u0069\u006e\u0076al\u0069\u0064\u0020\u0066\u0069\u006c\u0074\u0065\u0072\u0020\u0074\u0079\u0070\u0065\u003a\u0020\u0025\u0064",tp );
|
|
};switch relation {case SizeSelectIfLT ,SizeSelectIfGT ,SizeSelectIfLTE ,SizeSelectIfGTE :default:return nil ,_d .Errorf (_fbbef ,"i\u006e\u0076\u0061\u006c\u0069\u0064 \u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u0020t\u0079\u0070\u0065:\u0020'\u0025\u0064\u0027",tp );
|
|
};_edbe :=_bcafb .makeSizeIndicator (width ,height ,tp ,relation );_gcba ,_bfdgc :=_bcafb .selectWithIndicator (_edbe );if _bfdgc !=nil {return nil ,_d .Wrap (_bfdgc ,_fbbef ,"");};return _gcba ,nil ;};func _bcc ()(_dfbf [256]uint64 ){for _aga :=0;_aga < 256;
|
|
_aga ++{if _aga &0x01!=0{_dfbf [_aga ]|=0xff;};if _aga &0x02!=0{_dfbf [_aga ]|=0xff00;};if _aga &0x04!=0{_dfbf [_aga ]|=0xff0000;};if _aga &0x08!=0{_dfbf [_aga ]|=0xff000000;};if _aga &0x10!=0{_dfbf [_aga ]|=0xff00000000;};if _aga &0x20!=0{_dfbf [_aga ]|=0xff0000000000;
|
|
};if _aga &0x40!=0{_dfbf [_aga ]|=0xff000000000000;};if _aga &0x80!=0{_dfbf [_aga ]|=0xff00000000000000;};};return _dfbf ;};func (_ddbe *Bitmaps )SelectBySize (width ,height int ,tp LocationFilter ,relation SizeComparison )(_bfbe *Bitmaps ,_bbdce error ){const _ebab ="B\u0069t\u006d\u0061\u0070\u0073\u002e\u0053\u0065\u006ce\u0063\u0074\u0042\u0079Si\u007a\u0065";
|
|
if _ddbe ==nil {return nil ,_d .Error (_ebab ,"\u0027\u0062\u0027 B\u0069\u0074\u006d\u0061\u0070\u0073\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};switch tp {case LocSelectWidth ,LocSelectHeight ,LocSelectIfEither ,LocSelectIfBoth :default:return nil ,_d .Errorf (_ebab ,"\u0070\u0072\u006f\u0076\u0069d\u0065\u0064\u0020\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u006c\u006fc\u0061\u0074\u0069\u006f\u006e\u0020\u0066\u0069\u006c\u0074\u0065\u0072\u0020\u0074\u0079\u0070\u0065\u003a\u0020\u0025\u0064",tp );
|
|
};switch relation {case SizeSelectIfLT ,SizeSelectIfGT ,SizeSelectIfLTE ,SizeSelectIfGTE ,SizeSelectIfEQ :default:return nil ,_d .Errorf (_ebab ,"\u0069\u006e\u0076\u0061li\u0064\u0020\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0027\u0025d\u0027",relation );
|
|
};_fdgf ,_bbdce :=_ddbe .makeSizeIndicator (width ,height ,tp ,relation );if _bbdce !=nil {return nil ,_d .Wrap (_bbdce ,_ebab ,"");};_bfbe ,_bbdce =_ddbe .selectByIndicator (_fdgf );if _bbdce !=nil {return nil ,_d .Wrap (_bbdce ,_ebab ,"");};return _bfbe ,nil ;
|
|
};type byWidth Bitmaps ;func (_gaca *Bitmaps )AddBox (box *_e .Rectangle ){_gaca .Boxes =append (_gaca .Boxes ,box )};func _ffee (_fgab *Bitmap ,_afec *Bitmap ,_cgfd *Selection ,_ecdb **Bitmap )(*Bitmap ,error ){const _agcf ="\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u004d\u006f\u0072\u0070\u0068A\u0072\u0067\u0073\u0031";
|
|
if _afec ==nil {return nil ,_d .Error (_agcf ,"\u004d\u006f\u0072\u0070\u0068\u0041\u0072\u0067\u0073\u0031\u0020'\u0073\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066i\u006e\u0065\u0064");};if _cgfd ==nil {return nil ,_d .Error (_agcf ,"\u004d\u006f\u0072\u0068p\u0041\u0072\u0067\u0073\u0031\u0020\u0027\u0073\u0065\u006c'\u0020n\u006f\u0074\u0020\u0064\u0065\u0066\u0069n\u0065\u0064");
|
|
};_bcgf ,_dgfb :=_cgfd .Height ,_cgfd .Width ;if _bcgf ==0||_dgfb ==0{return nil ,_d .Error (_agcf ,"\u0073\u0065\u006c\u0065ct\u0069\u006f\u006e\u0020\u006f\u0066\u0020\u0073\u0069\u007a\u0065\u0020\u0030");};if _fgab ==nil {_fgab =_afec .createTemplate ();
|
|
*_ecdb =_afec ;return _fgab ,nil ;};_fgab .Width =_afec .Width ;_fgab .Height =_afec .Height ;_fgab .RowStride =_afec .RowStride ;_fgab .Color =_afec .Color ;_fgab .Data =make ([]byte ,_afec .RowStride *_afec .Height );if _fgab ==_afec {*_ecdb =_afec .Copy ();
|
|
}else {*_ecdb =_afec ;};return _fgab ,nil ;};func (_gee *Bitmap )AddBorder (borderSize ,val int )(*Bitmap ,error ){if borderSize ==0{return _gee .Copy (),nil ;};_fcc ,_fbec :=_gee .addBorderGeneral (borderSize ,borderSize ,borderSize ,borderSize ,val );
|
|
if _fbec !=nil {return nil ,_d .Wrap (_fbec ,"\u0041d\u0064\u0042\u006f\u0072\u0064\u0065r","");};return _fcc ,nil ;};func TstImageBitmapData ()[]byte {return _fffc .Data };func _acb (_fab ,_eacg ,_bgg *Bitmap )(*Bitmap ,error ){const _dbbg ="\u0073\u0075\u0062\u0074\u0072\u0061\u0063\u0074";
|
|
if _eacg ==nil {return nil ,_d .Error (_dbbg ,"'\u0073\u0031\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _bgg ==nil {return nil ,_d .Error (_dbbg ,"'\u0073\u0032\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};var _dfbd error ;switch {case _fab ==_eacg :if _dfbd =_fab .RasterOperation (0,0,_eacg .Width ,_eacg .Height ,PixNotSrcAndDst ,_bgg ,0,0);
|
|
_dfbd !=nil {return nil ,_d .Wrap (_dfbd ,_dbbg ,"\u0064 \u003d\u003d\u0020\u0073\u0031");};case _fab ==_bgg :if _dfbd =_fab .RasterOperation (0,0,_eacg .Width ,_eacg .Height ,PixNotSrcAndDst ,_eacg ,0,0);_dfbd !=nil {return nil ,_d .Wrap (_dfbd ,_dbbg ,"\u0064 \u003d\u003d\u0020\u0073\u0032");
|
|
};default:_fab ,_dfbd =_bbe (_fab ,_eacg );if _dfbd !=nil {return nil ,_d .Wrap (_dfbd ,_dbbg ,"");};if _dfbd =_fab .RasterOperation (0,0,_eacg .Width ,_eacg .Height ,PixNotSrcAndDst ,_bgg ,0,0);_dfbd !=nil {return nil ,_d .Wrap (_dfbd ,_dbbg ,"\u0064e\u0066\u0061\u0075\u006c\u0074");
|
|
};};return _fab ,nil ;};func (_fbcbf *Bitmaps )SortByHeight (){_cbdf :=(*byHeight )(_fbcbf );_bd .Sort (_cbdf )};const (_ SizeComparison =iota ;SizeSelectIfLT ;SizeSelectIfGT ;SizeSelectIfLTE ;SizeSelectIfGTE ;SizeSelectIfEQ ;);func CorrelationScoreThresholded (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab ,downcount []int ,scoreThreshold float32 )(bool ,error ){const _gcd ="C\u006f\u0072\u0072\u0065\u006c\u0061t\u0069\u006f\u006e\u0053\u0063\u006f\u0072\u0065\u0054h\u0072\u0065\u0073h\u006fl\u0064\u0065\u0064";
|
|
if bm1 ==nil {return false ,_d .Error (_gcd ,"\u0063\u006f\u0072\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u0053\u0063\u006f\u0072\u0065\u0054\u0068\u0072\u0065\u0073\u0068\u006f\u006cd\u0065\u0064\u0020\u0062\u006d1\u0020\u0069s\u0020\u006e\u0069\u006c");
|
|
};if bm2 ==nil {return false ,_d .Error (_gcd ,"\u0063\u006f\u0072\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u0053\u0063\u006f\u0072\u0065\u0054\u0068\u0072\u0065\u0073\u0068\u006f\u006cd\u0065\u0064\u0020\u0062\u006d2\u0020\u0069s\u0020\u006e\u0069\u006c");
|
|
};if area1 <=0||area2 <=0{return false ,_d .Error (_gcd ,"c\u006f\u0072\u0072\u0065\u006c\u0061\u0074\u0069\u006fn\u0053\u0063\u006f\u0072\u0065\u0054\u0068re\u0073\u0068\u006f\u006cd\u0065\u0064\u0020\u002d\u0020\u0061\u0072\u0065\u0061s \u006d\u0075s\u0074\u0020\u0062\u0065\u0020\u003e\u0020\u0030");
|
|
};if downcount ==nil {return false ,_d .Error (_gcd ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u006f\u0020\u0027\u0064\u006f\u0077\u006e\u0063\u006f\u0075\u006e\u0074\u0027");};if tab ==nil {return false ,_d .Error (_gcd ,"p\u0072\u006f\u0076\u0069de\u0064 \u006e\u0069\u006c\u0020\u0027s\u0075\u006d\u0074\u0061\u0062\u0027");
|
|
};_abeg ,_geae :=bm1 .Width ,bm1 .Height ;_ceec ,_gdac :=bm2 .Width ,bm2 .Height ;if _fd .Abs (_abeg -_ceec )> maxDiffW {return false ,nil ;};if _fd .Abs (_geae -_gdac )> maxDiffH {return false ,nil ;};_fgcd :=int (delX +_fd .Sign (delX )*0.5);_aebg :=int (delY +_fd .Sign (delY )*0.5);
|
|
_dfea :=int (_g .Ceil (_g .Sqrt (float64 (scoreThreshold )*float64 (area1 )*float64 (area2 ))));_bcfb :=bm2 .RowStride ;_defea :=_dggg (_aebg ,0);_acgc :=_cbf (_gdac +_aebg ,_geae );_caeba :=bm1 .RowStride *_defea ;_fbafc :=bm2 .RowStride *(_defea -_aebg );
|
|
var _acag int ;if _acgc <=_geae {_acag =downcount [_acgc -1];};_fabb :=_dggg (_fgcd ,0);_cafc :=_cbf (_ceec +_fgcd ,_abeg );var _aedfb ,_cece int ;if _fgcd >=8{_aedfb =_fgcd >>3;_caeba +=_aedfb ;_fabb -=_aedfb <<3;_cafc -=_aedfb <<3;_fgcd &=7;}else if _fgcd <=-8{_cece =-((_fgcd +7)>>3);
|
|
_fbafc +=_cece ;_bcfb -=_cece ;_fgcd +=_cece <<3;};var (_dea ,_ffffc ,_fcec int ;_bcabe ,_fdbd ,_eacgd byte ;);if _fabb >=_cafc ||_defea >=_acgc {return false ,nil ;};_gceegc :=(_cafc +7)>>3;switch {case _fgcd ==0:for _ffffc =_defea ;_ffffc < _acgc ;_ffffc ,_caeba ,_fbafc =_ffffc +1,_caeba +bm1 .RowStride ,_fbafc +bm2 .RowStride {for _fcec =0;
|
|
_fcec < _gceegc ;_fcec ++{_bcabe =bm1 .Data [_caeba +_fcec ]&bm2 .Data [_fbafc +_fcec ];_dea +=tab [_bcabe ];};if _dea >=_dfea {return true ,nil ;};if _affd :=_dea +downcount [_ffffc ]-_acag ;_affd < _dfea {return false ,nil ;};};case _fgcd > 0&&_bcfb < _gceegc :for _ffffc =_defea ;
|
|
_ffffc < _acgc ;_ffffc ,_caeba ,_fbafc =_ffffc +1,_caeba +bm1 .RowStride ,_fbafc +bm2 .RowStride {_fdbd =bm1 .Data [_caeba ];_eacgd =bm2 .Data [_fbafc ]>>uint (_fgcd );_bcabe =_fdbd &_eacgd ;_dea +=tab [_bcabe ];for _fcec =1;_fcec < _bcfb ;_fcec ++{_fdbd =bm1 .Data [_caeba +_fcec ];
|
|
_eacgd =bm2 .Data [_fbafc +_fcec ]>>uint (_fgcd )|bm2 .Data [_fbafc +_fcec -1]<<uint (8-_fgcd );_bcabe =_fdbd &_eacgd ;_dea +=tab [_bcabe ];};_fdbd =bm1 .Data [_caeba +_fcec ];_eacgd =bm2 .Data [_fbafc +_fcec -1]<<uint (8-_fgcd );_bcabe =_fdbd &_eacgd ;
|
|
_dea +=tab [_bcabe ];if _dea >=_dfea {return true ,nil ;}else if _dea +downcount [_ffffc ]-_acag < _dfea {return false ,nil ;};};case _fgcd > 0&&_bcfb >=_gceegc :for _ffffc =_defea ;_ffffc < _acgc ;_ffffc ,_caeba ,_fbafc =_ffffc +1,_caeba +bm1 .RowStride ,_fbafc +bm2 .RowStride {_fdbd =bm1 .Data [_caeba ];
|
|
_eacgd =bm2 .Data [_fbafc ]>>uint (_fgcd );_bcabe =_fdbd &_eacgd ;_dea +=tab [_bcabe ];for _fcec =1;_fcec < _gceegc ;_fcec ++{_fdbd =bm1 .Data [_caeba +_fcec ];_eacgd =bm2 .Data [_fbafc +_fcec ]>>uint (_fgcd );_eacgd |=bm2 .Data [_fbafc +_fcec -1]<<uint (8-_fgcd );
|
|
_bcabe =_fdbd &_eacgd ;_dea +=tab [_bcabe ];};if _dea >=_dfea {return true ,nil ;}else if _dea +downcount [_ffffc ]-_acag < _dfea {return false ,nil ;};};case _gceegc < _bcfb :for _ffffc =_defea ;_ffffc < _acgc ;_ffffc ,_caeba ,_fbafc =_ffffc +1,_caeba +bm1 .RowStride ,_fbafc +bm2 .RowStride {for _fcec =0;
|
|
_fcec < _gceegc ;_fcec ++{_fdbd =bm1 .Data [_caeba +_fcec ];_eacgd =bm2 .Data [_fbafc +_fcec ]<<uint (-_fgcd );_eacgd |=bm2 .Data [_fbafc +_fcec +1]>>uint (8+_fgcd );_bcabe =_fdbd &_eacgd ;_dea +=tab [_bcabe ];};if _dea >=_dfea {return true ,nil ;}else if _fdcc :=_dea +downcount [_ffffc ]-_acag ;
|
|
_fdcc < _dfea {return false ,nil ;};};case _bcfb >=_gceegc :for _ffffc =_defea ;_ffffc < _acgc ;_ffffc ,_caeba ,_fbafc =_ffffc +1,_caeba +bm1 .RowStride ,_fbafc +bm2 .RowStride {for _fcec =0;_fcec < _gceegc ;_fcec ++{_fdbd =bm1 .Data [_caeba +_fcec ];_eacgd =bm2 .Data [_fbafc +_fcec ]<<uint (-_fgcd );
|
|
_eacgd |=bm2 .Data [_fbafc +_fcec +1]>>uint (8+_fgcd );_bcabe =_fdbd &_eacgd ;_dea +=tab [_bcabe ];};_fdbd =bm1 .Data [_caeba +_fcec ];_eacgd =bm2 .Data [_fbafc +_fcec ]<<uint (-_fgcd );_bcabe =_fdbd &_eacgd ;_dea +=tab [_bcabe ];if _dea >=_dfea {return true ,nil ;
|
|
}else if _dea +downcount [_ffffc ]-_acag < _dfea {return false ,nil ;};};};_dggb :=float32 (_dea )*float32 (_dea )/(float32 (area1 )*float32 (area2 ));if _dggb >=scoreThreshold {_ba .Log .Trace ("\u0063\u006f\u0075\u006e\u0074\u003a\u0020\u0025\u0064\u0020\u003c\u0020\u0074\u0068\u0072\u0065\u0073\u0068\u006f\u006cd\u0020\u0025\u0064\u0020\u0062\u0075\u0074\u0020\u0073c\u006f\u0072\u0065\u0020\u0025\u0066\u0020\u003e\u003d\u0020\u0073\u0063\u006fr\u0065\u0054\u0068\u0072\u0065\u0073h\u006f\u006c\u0064 \u0025\u0066",_dea ,_dfea ,_dggb ,scoreThreshold );
|
|
};return false ,nil ;};func (_ggge *Bitmaps )GetBox (i int )(*_e .Rectangle ,error ){const _ebdg ="\u0047\u0065\u0074\u0042\u006f\u0078";if _ggge ==nil {return nil ,_d .Error (_ebdg ,"\u0070\u0072\u006f\u0076id\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0042\u0069\u0074\u006d\u0061\u0070s\u0027");
|
|
};if i > len (_ggge .Boxes )-1{return nil ,_d .Errorf (_ebdg ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return _ggge .Boxes [i ],nil ;};func NewWithUnpaddedData (width ,height int ,data []byte )(*Bitmap ,error ){const _dde ="\u004e\u0065\u0077\u0057it\u0068\u0055\u006e\u0070\u0061\u0064\u0064\u0065\u0064\u0044\u0061\u0074\u0061";
|
|
_deb :=_dad (width ,height );_deb .Data =data ;if _ffag :=((width *height )+7)>>3;len (data )< _ffag {return nil ,_d .Errorf (_dde ,"\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u0064a\u0074\u0061\u0020\u006c\u0065\u006e\u0067\u0074\u0068\u003a\u0020\u0027\u0025\u0064\u0027\u002e\u0020\u0054\u0068\u0065\u0020\u0064\u0061t\u0061\u0020s\u0068\u006fu\u006c\u0064\u0020\u0063\u006f\u006e\u0074\u0061\u0069\u006e\u0020\u0061\u0074 l\u0065\u0061\u0073\u0074\u003a\u0020\u0027\u0025\u0064'\u0020\u0062\u0079\u0074\u0065\u0073",len (data ),_ffag );
|
|
};if _gfe :=_deb .addPadBits ();_gfe !=nil {return nil ,_d .Wrap (_gfe ,_dde ,"");};return _deb ,nil ;};func (_gege *Bitmap )addBorderGeneral (_eddc ,_dcf ,_gbbga ,_cdad int ,_abd int )(*Bitmap ,error ){const _bcaf ="\u0061\u0064d\u0042\u006f\u0072d\u0065\u0072\u0047\u0065\u006e\u0065\u0072\u0061\u006c";
|
|
if _eddc < 0||_dcf < 0||_gbbga < 0||_cdad < 0{return nil ,_d .Error (_bcaf ,"n\u0065\u0067\u0061\u0074iv\u0065 \u0062\u006f\u0072\u0064\u0065r\u0020\u0061\u0064\u0064\u0065\u0064");};_ceeb ,_ecbg :=_gege .Width ,_gege .Height ;_gaf :=_ceeb +_eddc +_dcf ;
|
|
_cbg :=_ecbg +_gbbga +_cdad ;_ffbc :=New (_gaf ,_cbg );_ffbc .Color =_gege .Color ;_fcb :=PixClr ;if _abd > 0{_fcb =PixSet ;};_cfc :=_ffbc .RasterOperation (0,0,_eddc ,_cbg ,_fcb ,nil ,0,0);if _cfc !=nil {return nil ,_d .Wrap (_cfc ,_bcaf ,"\u006c\u0065\u0066\u0074");
|
|
};_cfc =_ffbc .RasterOperation (_gaf -_dcf ,0,_dcf ,_cbg ,_fcb ,nil ,0,0);if _cfc !=nil {return nil ,_d .Wrap (_cfc ,_bcaf ,"\u0072\u0069\u0067h\u0074");};_cfc =_ffbc .RasterOperation (0,0,_gaf ,_gbbga ,_fcb ,nil ,0,0);if _cfc !=nil {return nil ,_d .Wrap (_cfc ,_bcaf ,"\u0074\u006f\u0070");
|
|
};_cfc =_ffbc .RasterOperation (0,_cbg -_cdad ,_gaf ,_cdad ,_fcb ,nil ,0,0);if _cfc !=nil {return nil ,_d .Wrap (_cfc ,_bcaf ,"\u0062\u006f\u0074\u0074\u006f\u006d");};_cfc =_ffbc .RasterOperation (_eddc ,_gbbga ,_ceeb ,_ecbg ,PixSrc ,_gege ,0,0);if _cfc !=nil {return nil ,_d .Wrap (_cfc ,_bcaf ,"\u0063\u006f\u0070\u0079");
|
|
};return _ffbc ,nil ;};type Points []Point ;func TstFrameBitmapData ()[]byte {return _dgae .Data };func (_aac *ClassedPoints )ySortFunction ()func (_cdca int ,_edbeb int )bool {return func (_gagg ,_badb int )bool {return _aac .YAtIndex (_gagg )< _aac .YAtIndex (_badb )};
|
|
};func (_bbc *Bitmap )CreateTemplate ()*Bitmap {return _bbc .createTemplate ()};func (_fbb *Bitmap )ThresholdPixelSum (thresh int ,tab8 []int )(_bcff bool ,_ggfa error ){const _agg ="\u0042i\u0074\u006d\u0061\u0070\u002e\u0054\u0068\u0072\u0065\u0073\u0068o\u006c\u0064\u0050\u0069\u0078\u0065\u006c\u0053\u0075\u006d";
|
|
if tab8 ==nil {tab8 =_fdbe ();};_bbd :=_fbb .Width >>3;_beag :=_fbb .Width &7;_bfb :=byte (0xff<<uint (8-_beag ));var (_abe ,_gbd ,_bdd ,_gbbb int ;_aeb byte ;);for _abe =0;_abe < _fbb .Height ;_abe ++{_bdd =_fbb .RowStride *_abe ;for _gbd =0;_gbd < _bbd ;
|
|
_gbd ++{_aeb ,_ggfa =_fbb .GetByte (_bdd +_gbd );if _ggfa !=nil {return false ,_d .Wrap (_ggfa ,_agg ,"\u0066\u0075\u006c\u006c\u0042\u0079\u0074\u0065");};_gbbb +=tab8 [_aeb ];};if _beag !=0{_aeb ,_ggfa =_fbb .GetByte (_bdd +_gbd );if _ggfa !=nil {return false ,_d .Wrap (_ggfa ,_agg ,"p\u0061\u0072\u0074\u0069\u0061\u006c\u0042\u0079\u0074\u0065");
|
|
};_aeb &=_bfb ;_gbbb +=tab8 [_aeb ];};if _gbbb > thresh {return true ,nil ;};};return _bcff ,nil ;};func _aegf (_aadef ,_gfaf *Bitmap ,_gaafb ,_beff int )(*Bitmap ,error ){const _aaeg ="\u0063\u006c\u006f\u0073\u0065\u0042\u0072\u0069\u0063\u006b";if _gfaf ==nil {return nil ,_d .Error (_aaeg ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if _gaafb < 1||_beff < 1{return nil ,_d .Error (_aaeg ,"\u0068S\u0069\u007a\u0065\u0020\u0061\u006e\u0064\u0020\u0076\u0053\u0069z\u0065\u0020\u006e\u006f\u0074\u0020\u003e\u003d\u0020\u0031");};if _gaafb ==1&&_beff ==1{return _gfaf .Copy (),nil ;};if _gaafb ==1||_beff ==1{_dgecc :=SelCreateBrick (_beff ,_gaafb ,_beff /2,_gaafb /2,SelHit );
|
|
var _fbdd error ;_aadef ,_fbdd =_ceaaf (_aadef ,_gfaf ,_dgecc );if _fbdd !=nil {return nil ,_d .Wrap (_fbdd ,_aaeg ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _aadef ,nil ;};_gdbeb :=SelCreateBrick (1,_gaafb ,0,_gaafb /2,SelHit );_acbg :=SelCreateBrick (_beff ,1,_beff /2,0,SelHit );_fabbb ,_bfed :=_dcd (nil ,_gfaf ,_gdbeb );if _bfed !=nil {return nil ,_d .Wrap (_bfed ,_aaeg ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
};if _aadef ,_bfed =_dcd (_aadef ,_fabbb ,_acbg );_bfed !=nil {return nil ,_d .Wrap (_bfed ,_aaeg ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};if _ ,_bfed =_afdb (_fabbb ,_aadef ,_gdbeb );_bfed !=nil {return nil ,_d .Wrap (_bfed ,_aaeg ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");
|
|
};if _ ,_bfed =_afdb (_aadef ,_fabbb ,_acbg );_bfed !=nil {return nil ,_d .Wrap (_bfed ,_aaeg ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};return _aadef ,nil ;};func _aaef (_efec ,_ebad *Bitmap ,_egg ,_feba ,_ggfb uint ,_edbf ,_gabb int ,_fcea bool ,_dae ,_efbe int )error {for _cedg :=_edbf ;
|
|
_cedg < _gabb ;_cedg ++{if _dae +1< len (_efec .Data ){_acd :=_cedg +1==_gabb ;_acgg ,_gcg :=_efec .GetByte (_dae );if _gcg !=nil {return _gcg ;};_dae ++;_acgg <<=_egg ;_eedff ,_gcg :=_efec .GetByte (_dae );if _gcg !=nil {return _gcg ;};_eedff >>=_feba ;
|
|
_abce :=_acgg |_eedff ;if _acd &&!_fcea {_abce =_cage (_ggfb ,_abce );};_gcg =_ebad .SetByte (_efbe ,_abce );if _gcg !=nil {return _gcg ;};_efbe ++;if _acd &&_fcea {_gbfd ,_age :=_efec .GetByte (_dae );if _age !=nil {return _age ;};_gbfd <<=_egg ;_abce =_cage (_ggfb ,_gbfd );
|
|
if _age =_ebad .SetByte (_efbe ,_abce );_age !=nil {return _age ;};};continue ;};_cec ,_adbaa :=_efec .GetByte (_dae );if _adbaa !=nil {_ba .Log .Debug ("G\u0065\u0074\u0074\u0069\u006e\u0067 \u0074\u0068\u0065\u0020\u0076\u0061l\u0075\u0065\u0020\u0061\u0074\u003a\u0020%\u0064\u0020\u0066\u0061\u0069\u006c\u0065\u0064\u003a\u0020%\u0073",_dae ,_adbaa );
|
|
return _adbaa ;};_cec <<=_egg ;_dae ++;_adbaa =_ebad .SetByte (_efbe ,_cec );if _adbaa !=nil {return _adbaa ;};_efbe ++;};return nil ;};func (_gaad *Bitmap )ClipRectangle (box *_e .Rectangle )(_fccd *Bitmap ,_caea *_e .Rectangle ,_gbbg error ){const _dac ="\u0043\u006c\u0069\u0070\u0052\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065";
|
|
if box ==nil {return nil ,nil ,_d .Error (_dac ,"\u0062o\u0078 \u0069\u0073\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};_gbe ,_bcbe :=_gaad .Width ,_gaad .Height ;_gbef :=_e .Rect (0,0,_gbe ,_bcbe );if !box .Overlaps (_gbef ){return nil ,nil ,_d .Error (_dac ,"b\u006f\u0078\u0020\u0064oe\u0073n\u0027\u0074\u0020\u006f\u0076e\u0072\u006c\u0061\u0070\u0020\u0062");
|
|
};_gff :=box .Intersect (_gbef );_agcd ,_eaf :=_gff .Min .X ,_gff .Min .Y ;_cafga ,_bfa :=_gff .Dx (),_gff .Dy ();_fccd =New (_cafga ,_bfa );_fccd .Text =_gaad .Text ;if _gbbg =_fccd .RasterOperation (0,0,_cafga ,_bfa ,PixSrc ,_gaad ,_agcd ,_eaf );_gbbg !=nil {return nil ,nil ,_d .Wrap (_gbbg ,_dac ,"\u0050\u0069\u0078\u0053\u0072\u0063\u0020\u0074\u006f\u0020\u0063\u006ci\u0070\u0070\u0065\u0064");
|
|
};_caea =&_gff ;return _fccd ,_caea ,nil ;};func (_abgd *Bitmap )SetPadBits (value int ){_abgd .setPadBits (value )};func (_fdc *Bitmap )String ()string {var _accb ="\u000a";for _ged :=0;_ged < _fdc .Height ;_ged ++{var _gcb string ;for _baed :=0;_baed < _fdc .Width ;
|
|
_baed ++{_ecf :=_fdc .GetPixel (_baed ,_ged );if _ecf {_gcb +="\u0031";}else {_gcb +="\u0030";};};_accb +=_gcb +"\u000a";};return _accb ;};func (_ccbg *Bitmap )setTwoBytes (_bbb int ,_gde uint16 )error {if _bbb +1> len (_ccbg .Data )-1{return _d .Errorf ("s\u0065\u0074\u0054\u0077\u006f\u0042\u0079\u0074\u0065\u0073","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",_bbb );
|
|
};_ccbg .Data [_bbb ]=byte ((_gde &0xff00)>>8);_ccbg .Data [_bbb +1]=byte (_gde &0xff);return nil ;};func MorphSequence (src *Bitmap ,sequence ...MorphProcess )(*Bitmap ,error ){return _aagd (src ,sequence ...);};func _gdcaf (_deae ,_cgef *Bitmap ,_acfd ,_dcccf int )(*Bitmap ,error ){const _bgda ="\u006fp\u0065\u006e\u0042\u0072\u0069\u0063k";
|
|
if _cgef ==nil {return nil ,_d .Error (_bgda ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};if _acfd < 1&&_dcccf < 1{return nil ,_d .Error (_bgda ,"\u0068\u0053\u0069\u007ae \u003c\u0020\u0031\u0020\u0026\u0026\u0020\u0076\u0053\u0069\u007a\u0065\u0020\u003c \u0031");
|
|
};if _acfd ==1&&_dcccf ==1{return _cgef .Copy (),nil ;};if _acfd ==1||_dcccf ==1{var _gfegd error ;_faggb :=SelCreateBrick (_dcccf ,_acfd ,_dcccf /2,_acfd /2,SelHit );_deae ,_gfegd =_dcff (_deae ,_cgef ,_faggb );if _gfegd !=nil {return nil ,_d .Wrap (_gfegd ,_bgda ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _deae ,nil ;};_cafa :=SelCreateBrick (1,_acfd ,0,_acfd /2,SelHit );_ccae :=SelCreateBrick (_dcccf ,1,_dcccf /2,0,SelHit );_egda ,_agac :=_afdb (nil ,_cgef ,_cafa );if _agac !=nil {return nil ,_d .Wrap (_agac ,_bgda ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");
|
|
};_deae ,_agac =_afdb (_deae ,_egda ,_ccae );if _agac !=nil {return nil ,_d .Wrap (_agac ,_bgda ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};_ ,_agac =_dcd (_egda ,_deae ,_cafa );if _agac !=nil {return nil ,_d .Wrap (_agac ,_bgda ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
};_ ,_agac =_dcd (_deae ,_egda ,_ccae );if _agac !=nil {return nil ,_d .Wrap (_agac ,_bgda ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};return _deae ,nil ;};type Point struct{X ,Y float32 ;};func _ebde ()[]int {_eecc :=make ([]int ,256);
|
|
_eecc [0]=0;_eecc [1]=7;var _eeeg int ;for _eeeg =2;_eeeg < 4;_eeeg ++{_eecc [_eeeg ]=_eecc [_eeeg -2]+6;};for _eeeg =4;_eeeg < 8;_eeeg ++{_eecc [_eeeg ]=_eecc [_eeeg -4]+5;};for _eeeg =8;_eeeg < 16;_eeeg ++{_eecc [_eeeg ]=_eecc [_eeeg -8]+4;};for _eeeg =16;
|
|
_eeeg < 32;_eeeg ++{_eecc [_eeeg ]=_eecc [_eeeg -16]+3;};for _eeeg =32;_eeeg < 64;_eeeg ++{_eecc [_eeeg ]=_eecc [_eeeg -32]+2;};for _eeeg =64;_eeeg < 128;_eeeg ++{_eecc [_eeeg ]=_eecc [_eeeg -64]+1;};for _eeeg =128;_eeeg < 256;_eeeg ++{_eecc [_eeeg ]=_eecc [_eeeg -128];
|
|
};return _eecc ;};func _ggbb (_bcgd ,_gbfc byte ,_cbb CombinationOperator )byte {switch _cbb {case CmbOpOr :return _gbfc |_bcgd ;case CmbOpAnd :return _gbfc &_bcgd ;case CmbOpXor :return _gbfc ^_bcgd ;case CmbOpXNor :return ^(_gbfc ^_bcgd );case CmbOpNot :return ^(_gbfc );
|
|
default:return _gbfc ;};};func TstImageBitmapInverseData ()[]byte {_bccb :=_fffc .Copy ();_bccb .InverseData ();return _bccb .Data ;};func New (width ,height int )*Bitmap {_agc :=_dad (width ,height );_agc .Data =make ([]byte ,height *_agc .RowStride );
|
|
return _agc ;};func (_cgfe *byWidth )Less (i ,j int )bool {return _cgfe .Values [i ].Width < _cgfe .Values [j ].Width };func (_fec *Bitmap )SetDefaultPixel (){for _fbg :=range _fec .Data {_fec .Data [_fbg ]=byte (0xff);};};var (_fgedf =[]byte {0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF};
|
|
_caeaf =[]byte {0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};);func TstWordBitmap (t *_fa .T ,scale ...int )*Bitmap {_afaed :=1;if len (scale )> 0{_afaed =scale [0];};_ebabf :=3;_bdcc :=9+7+15+2*_ebabf ;_gdee :=5+_ebabf +5;_ffgf :=New (_bdcc *_afaed ,_gdee *_afaed );
|
|
_afdcf :=&Bitmaps {};var _bdag *int ;_ebabf *=_afaed ;_ebabe :=0;_bdag =&_ebabe ;_fgfcd :=0;_cada :=TstDSymbol (t ,scale ...);TstAddSymbol (t ,_afdcf ,_cada ,_bdag ,_fgfcd ,1*_afaed );_cada =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_afdcf ,_cada ,_bdag ,_fgfcd ,_ebabf );
|
|
_cada =TstISymbol (t ,scale ...);TstAddSymbol (t ,_afdcf ,_cada ,_bdag ,_fgfcd ,1*_afaed );_cada =TstTSymbol (t ,scale ...);TstAddSymbol (t ,_afdcf ,_cada ,_bdag ,_fgfcd ,_ebabf );_cada =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_afdcf ,_cada ,_bdag ,_fgfcd ,1*_afaed );
|
|
_cada =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_afdcf ,_cada ,_bdag ,_fgfcd ,1*_afaed );_cada =TstWSymbol (t ,scale ...);TstAddSymbol (t ,_afdcf ,_cada ,_bdag ,_fgfcd ,0);*_bdag =0;_fgfcd =5*_afaed +_ebabf ;_cada =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_afdcf ,_cada ,_bdag ,_fgfcd ,1*_afaed );
|
|
_cada =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_afdcf ,_cada ,_bdag ,_fgfcd ,_ebabf );_cada =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_afdcf ,_cada ,_bdag ,_fgfcd ,1*_afaed );_cada =TstESymbol (t ,scale ...);TstAddSymbol (t ,_afdcf ,_cada ,_bdag ,_fgfcd ,1*_afaed );
|
|
_cada =TstVSymbol (t ,scale ...);TstAddSymbol (t ,_afdcf ,_cada ,_bdag ,_fgfcd ,1*_afaed );_cada =TstESymbol (t ,scale ...);TstAddSymbol (t ,_afdcf ,_cada ,_bdag ,_fgfcd ,1*_afaed );_cada =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_afdcf ,_cada ,_bdag ,_fgfcd ,0);
|
|
TstWriteSymbols (t ,_afdcf ,_ffgf );return _ffgf ;};func _ccg (_fceg ,_bdf *Bitmap ,_ccf int ,_egcc []byte ,_dce int )(_dgf error ){const _ggg ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0034";
|
|
var (_ebba ,_cdeb ,_ffd ,_fac ,_bebg ,_gbb ,_bed ,_agdg int ;_bea ,_cff uint32 ;_ebf ,_cca byte ;_fed uint16 ;);_fbe :=make ([]byte ,4);_bca :=make ([]byte ,4);for _ffd =0;_ffd < _fceg .Height -1;_ffd ,_fac =_ffd +2,_fac +1{_ebba =_ffd *_fceg .RowStride ;
|
|
_cdeb =_fac *_bdf .RowStride ;for _bebg ,_gbb =0,0;_bebg < _dce ;_bebg ,_gbb =_bebg +4,_gbb +1{for _bed =0;_bed < 4;_bed ++{_agdg =_ebba +_bebg +_bed ;if _agdg <=len (_fceg .Data )-1&&_agdg < _ebba +_fceg .RowStride {_fbe [_bed ]=_fceg .Data [_agdg ];}else {_fbe [_bed ]=0x00;
|
|
};_agdg =_ebba +_fceg .RowStride +_bebg +_bed ;if _agdg <=len (_fceg .Data )-1&&_agdg < _ebba +(2*_fceg .RowStride ){_bca [_bed ]=_fceg .Data [_agdg ];}else {_bca [_bed ]=0x00;};};_bea =_dd .BigEndian .Uint32 (_fbe );_cff =_dd .BigEndian .Uint32 (_bca );
|
|
_cff &=_bea ;_cff &=_cff <<1;_cff &=0xaaaaaaaa;_bea =_cff |(_cff <<7);_ebf =byte (_bea >>24);_cca =byte ((_bea >>8)&0xff);_agdg =_cdeb +_gbb ;if _agdg +1==len (_bdf .Data )-1||_agdg +1>=_cdeb +_bdf .RowStride {_bdf .Data [_agdg ]=_egcc [_ebf ];if _dgf =_bdf .SetByte (_agdg ,_egcc [_ebf ]);
|
|
_dgf !=nil {return _d .Wrapf (_dgf ,_ggg ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_agdg );};}else {_fed =(uint16 (_egcc [_ebf ])<<8)|uint16 (_egcc [_cca ]);if _dgf =_bdf .setTwoBytes (_agdg ,_fed );_dgf !=nil {return _d .Wrapf (_dgf ,_ggg ,"s\u0065\u0074\u0074\u0069\u006e\u0067 \u0074\u0077\u006f\u0020\u0062\u0079t\u0065\u0073\u0020\u0066\u0061\u0069\u006ce\u0064\u002c\u0020\u0069\u006e\u0064\u0065\u0078\u003a\u0020%\u0064",_agdg );
|
|
};_gbb ++;};};};return nil ;};func HausTest (p1 ,p2 ,p3 ,p4 *Bitmap ,delX ,delY float32 ,maxDiffW ,maxDiffH int )(bool ,error ){const _ccga ="\u0048\u0061\u0075\u0073\u0054\u0065\u0073\u0074";_dgdf ,_gfeg :=p1 .Width ,p1 .Height ;_bege ,_ecdc :=p3 .Width ,p3 .Height ;
|
|
if _fd .Abs (_dgdf -_bege )> maxDiffW {return false ,nil ;};if _fd .Abs (_gfeg -_ecdc )> maxDiffH {return false ,nil ;};_dgce :=int (delX +_fd .Sign (delX )*0.5);_edf :=int (delY +_fd .Sign (delY )*0.5);var _adgg error ;_fada :=p1 .CreateTemplate ();if _adgg =_fada .RasterOperation (0,0,_dgdf ,_gfeg ,PixSrc ,p1 ,0,0);
|
|
_adgg !=nil {return false ,_d .Wrap (_adgg ,_ccga ,"p\u0031\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _adgg =_fada .RasterOperation (_dgce ,_edf ,_dgdf ,_gfeg ,PixNotSrcAndDst ,p4 ,0,0);_adgg !=nil {return false ,_d .Wrap (_adgg ,_ccga ,"\u0021p\u0034\u0020\u0026\u0020\u0074");
|
|
};if _fada .Zero (){return false ,nil ;};if _adgg =_fada .RasterOperation (_dgce ,_edf ,_bege ,_ecdc ,PixSrc ,p3 ,0,0);_adgg !=nil {return false ,_d .Wrap (_adgg ,_ccga ,"p\u0033\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _adgg =_fada .RasterOperation (0,0,_bege ,_ecdc ,PixNotSrcAndDst ,p2 ,0,0);
|
|
_adgg !=nil {return false ,_d .Wrap (_adgg ,_ccga ,"\u0021p\u0032\u0020\u0026\u0020\u0074");};return _fada .Zero (),nil ;};func (_acga *Points )AddPoint (x ,y float32 ){*_acga =append (*_acga ,Point {x ,y })};func _fgaf (_fddg *Bitmap ,_eabd *_fd .Stack ,_badga ,_aaba ,_defad int )(_acbec *_e .Rectangle ,_efbbc error ){const _aeefe ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";
|
|
if _fddg ==nil {return nil ,_d .Error (_aeefe ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");};if _eabd ==nil {return nil ,_d .Error (_aeefe ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");
|
|
};switch _defad {case 4:if _acbec ,_efbbc =_dede (_fddg ,_eabd ,_badga ,_aaba );_efbbc !=nil {return nil ,_d .Wrap (_efbbc ,_aeefe ,"");};return _acbec ,nil ;case 8:if _acbec ,_efbbc =_ecae (_fddg ,_eabd ,_badga ,_aaba );_efbbc !=nil {return nil ,_d .Wrap (_efbbc ,_aeefe ,"");
|
|
};return _acbec ,nil ;default:return nil ,_d .Errorf (_aeefe ,"\u0063\u006f\u006e\u006e\u0065\u0063\u0074\u0069\u0076\u0069\u0074\u0079\u0020\u0069\u0073 \u006eo\u0074\u0020\u0034\u0020\u006f\u0072\u0020\u0038\u003a\u0020\u0027\u0025\u0064\u0027",_defad );
|
|
};};func (_cffc *Bitmap )Copy ()*Bitmap {_cdg :=make ([]byte ,len (_cffc .Data ));copy (_cdg ,_cffc .Data );return &Bitmap {Width :_cffc .Width ,Height :_cffc .Height ,RowStride :_cffc .RowStride ,Data :_cdg ,Color :_cffc .Color ,Text :_cffc .Text ,BitmapNumber :_cffc .BitmapNumber ,Special :_cffc .Special };
|
|
};func (_ebdd Points )GetGeometry (i int )(_fafc ,_efffa float32 ,_cecfc error ){if i > len (_ebdd )-1{return 0,0,_d .Errorf ("\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0065\u0074","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
};_fbdda :=_ebdd [i ];return _fbdda .X ,_fbdda .Y ,nil ;};func (_fcf *Bitmap )InverseData (){_fcf .inverseData ()};func _gfgbc (_adad ,_cdbd *Bitmap ,_aggf ,_daab int )(_aggg error ){const _cdcb ="\u0073e\u0065d\u0066\u0069\u006c\u006c\u0042i\u006e\u0061r\u0079\u004c\u006f\u0077\u0034";
|
|
var (_dadf ,_abefb ,_cdbbg ,_fbeag int ;_cbae ,_bgcd ,_bagbd ,_eace ,_cfec ,_aaefb ,_dcgfa byte ;);for _dadf =0;_dadf < _aggf ;_dadf ++{_cdbbg =_dadf *_adad .RowStride ;_fbeag =_dadf *_cdbd .RowStride ;for _abefb =0;_abefb < _daab ;_abefb ++{_cbae ,_aggg =_adad .GetByte (_cdbbg +_abefb );
|
|
if _aggg !=nil {return _d .Wrap (_aggg ,_cdcb ,"\u0066i\u0072\u0073\u0074\u0020\u0067\u0065t");};_bgcd ,_aggg =_cdbd .GetByte (_fbeag +_abefb );if _aggg !=nil {return _d .Wrap (_aggg ,_cdcb ,"\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0067\u0065\u0074");
|
|
};if _dadf > 0{_bagbd ,_aggg =_adad .GetByte (_cdbbg -_adad .RowStride +_abefb );if _aggg !=nil {return _d .Wrap (_aggg ,_cdcb ,"\u0069\u0020\u003e \u0030");};_cbae |=_bagbd ;};if _abefb > 0{_eace ,_aggg =_adad .GetByte (_cdbbg +_abefb -1);if _aggg !=nil {return _d .Wrap (_aggg ,_cdcb ,"\u006a\u0020\u003e \u0030");
|
|
};_cbae |=_eace <<7;};_cbae &=_bgcd ;if _cbae ==0||(^_cbae )==0{if _aggg =_adad .SetByte (_cdbbg +_abefb ,_cbae );_aggg !=nil {return _d .Wrap (_aggg ,_cdcb ,"b\u0074\u0020\u003d\u003d 0\u0020|\u007c\u0020\u0028\u005e\u0062t\u0029\u0020\u003d\u003d\u0020\u0030");
|
|
};continue ;};for {_dcgfa =_cbae ;_cbae =(_cbae |(_cbae >>1)|(_cbae <<1))&_bgcd ;if (_cbae ^_dcgfa )==0{if _aggg =_adad .SetByte (_cdbbg +_abefb ,_cbae );_aggg !=nil {return _d .Wrap (_aggg ,_cdcb ,"\u0073\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u0070\u0072\u0065\u0076 \u0062\u0079\u0074\u0065");
|
|
};break ;};};};};for _dadf =_aggf -1;_dadf >=0;_dadf --{_cdbbg =_dadf *_adad .RowStride ;_fbeag =_dadf *_cdbd .RowStride ;for _abefb =_daab -1;_abefb >=0;_abefb --{if _cbae ,_aggg =_adad .GetByte (_cdbbg +_abefb );_aggg !=nil {return _d .Wrap (_aggg ,_cdcb ,"\u0072\u0065\u0076\u0065\u0072\u0073\u0065\u0020\u0066\u0069\u0072\u0073t\u0020\u0067\u0065\u0074");
|
|
};if _bgcd ,_aggg =_cdbd .GetByte (_fbeag +_abefb );_aggg !=nil {return _d .Wrap (_aggg ,_cdcb ,"r\u0065\u0076\u0065\u0072se\u0020g\u0065\u0074\u0020\u006d\u0061s\u006b\u0020\u0062\u0079\u0074\u0065");};if _dadf < _aggf -1{if _cfec ,_aggg =_adad .GetByte (_cdbbg +_adad .RowStride +_abefb );
|
|
_aggg !=nil {return _d .Wrap (_aggg ,_cdcb ,"\u0072\u0065v\u0065\u0072\u0073e\u0020\u0069\u0020\u003c\u0020\u0068\u0020\u002d\u0031");};_cbae |=_cfec ;};if _abefb < _daab -1{if _aaefb ,_aggg =_adad .GetByte (_cdbbg +_abefb +1);_aggg !=nil {return _d .Wrap (_aggg ,_cdcb ,"\u0072\u0065\u0076\u0065rs\u0065\u0020\u006a\u0020\u003c\u0020\u0077\u0070\u006c\u0020\u002d\u0020\u0031");
|
|
};_cbae |=_aaefb >>7;};_cbae &=_bgcd ;if _cbae ==0||(^_cbae )==0{if _aggg =_adad .SetByte (_cdbbg +_abefb ,_cbae );_aggg !=nil {return _d .Wrap (_aggg ,_cdcb ,"\u0073\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u006d\u0061\u0073k\u0065\u0064\u0020\u0062\u0079\u0074\u0065\u0020\u0066\u0061i\u006c\u0065\u0064");
|
|
};continue ;};for {_dcgfa =_cbae ;_cbae =(_cbae |(_cbae >>1)|(_cbae <<1))&_bgcd ;if (_cbae ^_dcgfa )==0{if _aggg =_adad .SetByte (_cdbbg +_abefb ,_cbae );_aggg !=nil {return _d .Wrap (_aggg ,_cdcb ,"\u0072e\u0076\u0065\u0072\u0073e\u0020\u0073\u0065\u0074\u0074i\u006eg\u0020p\u0072\u0065\u0076\u0020\u0062\u0079\u0074e");
|
|
};break ;};};};};return nil ;};func TstTSymbol (t *_fa .T ,scale ...int )*Bitmap {_ceebb ,_adde :=NewWithData (5,5,[]byte {0xF8,0x20,0x20,0x20,0x20});_f .NoError (t ,_adde );return TstGetScaledSymbol (t ,_ceebb ,scale ...);};func (_eab *Bitmap )GetPixel (x ,y int )bool {_afe :=_eab .GetByteIndex (x ,y );
|
|
_gcea :=_eab .GetBitOffset (x );_cgf :=uint (7-_gcea );if _afe > len (_eab .Data )-1{_ba .Log .Debug ("\u0054\u0072\u0079\u0069\u006e\u0067\u0020\u0074\u006f\u0020\u0067\u0065\u0074\u0020\u0070\u0069\u0078\u0065\u006c\u0020o\u0075\u0074\u0020\u006f\u0066\u0020\u0074\u0068\u0065\u0020\u0064\u0061\u0074\u0061\u0020\u0072\u0061\u006e\u0067\u0065\u002e \u0078\u003a\u0020\u0027\u0025\u0064\u0027\u002c\u0020\u0079\u003a\u0027\u0025\u0064'\u002c\u0020\u0062m\u003a\u0020\u0027\u0025\u0073\u0027",x ,y ,_eab );
|
|
return false ;};if (_eab .Data [_afe ]>>_cgf )&0x01>=1{return true ;};return false ;};func init (){const _ceaf ="\u0062\u0069\u0074\u006dap\u0073\u002e\u0069\u006e\u0069\u0074\u0069\u0061\u006c\u0069\u007a\u0061\u0074\u0069o\u006e";_dgae =New (50,40);var _cfbf error ;
|
|
_dgae ,_cfbf =_dgae .AddBorder (2,1);if _cfbf !=nil {panic (_d .Wrap (_cfbf ,_ceaf ,"f\u0072\u0061\u006d\u0065\u0042\u0069\u0074\u006d\u0061\u0070"));};_fffc ,_cfbf =NewWithData (50,22,_adcbd );if _cfbf !=nil {panic (_d .Wrap (_cfbf ,_ceaf ,"i\u006d\u0061\u0067\u0065\u0042\u0069\u0074\u006d\u0061\u0070"));
|
|
};};func (_ecc *Bitmap )GetVanillaData ()[]byte {if _ecc .Color ==Chocolate {_ecc .inverseData ();};return _ecc .Data ;};func _aegfb (_ggaee *_fd .Stack )(_dcac *fillSegment ,_efegf error ){const _efega ="\u0070\u006f\u0070\u0046\u0069\u006c\u006c\u0053\u0065g\u006d\u0065\u006e\u0074";
|
|
if _ggaee ==nil {return nil ,_d .Error (_efega ,"\u006ei\u006c \u0073\u0074\u0061\u0063\u006b \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");};if _ggaee .Aux ==nil {return nil ,_d .Error (_efega ,"a\u0075x\u0053\u0074\u0061\u0063\u006b\u0020\u006e\u006ft\u0020\u0064\u0065\u0066in\u0065\u0064");
|
|
};_eegd ,_gabbc :=_ggaee .Pop ();if !_gabbc {return nil ,nil ;};_gdacg ,_gabbc :=_eegd .(*fillSegment );if !_gabbc {return nil ,_d .Error (_efega ,"\u0073\u0074\u0061ck\u0020\u0064\u006f\u0065\u0073\u006e\u0027\u0074\u0020c\u006fn\u0074a\u0069n\u0020\u002a\u0066\u0069\u006c\u006c\u0053\u0065\u0067\u006d\u0065\u006e\u0074");
|
|
};_dcac =&fillSegment {_gdacg ._bgade ,_gdacg ._bbggc ,_gdacg ._daca +_gdacg ._gdbc ,_gdacg ._gdbc };_ggaee .Aux .Push (_gdacg );return _dcac ,nil ;};func ClipBoxToRectangle (box *_e .Rectangle ,wi ,hi int )(_dab *_e .Rectangle ,_accc error ){const _febc ="\u0043l\u0069p\u0042\u006f\u0078\u0054\u006fR\u0065\u0063t\u0061\u006e\u0067\u006c\u0065";
|
|
if box ==nil {return nil ,_d .Error (_febc ,"\u0027\u0062\u006f\u0078\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065f\u0069\u006e\u0065\u0064");};if box .Min .X >=wi ||box .Min .Y >=hi ||box .Max .X <=0||box .Max .Y <=0{return nil ,_d .Error (_febc ,"\u0027\u0062\u006fx'\u0020\u006f\u0075\u0074\u0073\u0069\u0064\u0065\u0020\u0072\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065");
|
|
};_dbc :=*box ;_dab =&_dbc ;if _dab .Min .X < 0{_dab .Max .X +=_dab .Min .X ;_dab .Min .X =0;};if _dab .Min .Y < 0{_dab .Max .Y +=_dab .Min .Y ;_dab .Min .Y =0;};if _dab .Max .X > wi {_dab .Max .X =wi ;};if _dab .Max .Y > hi {_dab .Max .Y =hi ;};return _dab ,nil ;
|
|
};func TstISymbol (t *_fa .T ,scale ...int )*Bitmap {_cbaec ,_cdgcd :=NewWithData (1,5,[]byte {0x80,0x80,0x80,0x80,0x80});_f .NoError (t ,_cdgcd );return TstGetScaledSymbol (t ,_cbaec ,scale ...);};func MakePixelSumTab8 ()[]int {return _fdbe ()};var _adcbd =[]byte {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x78,0x27,0xC2,0x27,0x91,0x00,0x22,0x48,0x21,0x03,0x24,0x91,0x00,0x22,0x48,0x21,0x02,0xA4,0x95,0x00,0x22,0x48,0x21,0x02,0x64,0x9B,0x00,0x3C,0x78,0x21,0x02,0x27,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xF8,0x00,0x00,0x00,0x00,0x00,0x7F,0xF8,0x00,0x00,0x00,0x00,0x00,0x63,0x18,0x00,0x00,0x00,0x00,0x00,0x63,0x18,0x00,0x00,0x00,0x00,0x00,0x63,0x18,0x00,0x00,0x00,0x00,0x00,0x7F,0xF8,0x00,0x00,0x00,0x00,0x00,0x15,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
|
|
func _bacc ()(_bfd []byte ){_bfd =make ([]byte ,256);for _edee :=0;_edee < 256;_edee ++{_aee :=byte (_edee );_bfd [_aee ]=(_aee &0x01)|((_aee &0x04)>>1)|((_aee &0x10)>>2)|((_aee &0x40)>>3)|((_aee &0x02)<<3)|((_aee &0x08)<<2)|((_aee &0x20)<<1)|(_aee &0x80);
|
|
};return _bfd ;};func (_aefe *Bitmaps )makeSizeIndicator (_ecg ,_fgb int ,_aeefc LocationFilter ,_bfdf SizeComparison )(_aegfbf *_fd .NumSlice ,_deba error ){const _feea ="\u0042i\u0074\u006d\u0061\u0070s\u002e\u006d\u0061\u006b\u0065S\u0069z\u0065I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";
|
|
if _aefe ==nil {return nil ,_d .Error (_feea ,"\u0062\u0069\u0074ma\u0070\u0073\u0020\u0027\u0062\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};switch _aeefc {case LocSelectWidth ,LocSelectHeight ,LocSelectIfEither ,LocSelectIfBoth :default:return nil ,_d .Errorf (_feea ,"\u0070\u0072\u006f\u0076\u0069d\u0065\u0064\u0020\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u006c\u006fc\u0061\u0074\u0069\u006f\u006e\u0020\u0066\u0069\u006c\u0074\u0065\u0072\u0020\u0074\u0079\u0070\u0065\u003a\u0020\u0025\u0064",_aeefc );
|
|
};switch _bfdf {case SizeSelectIfLT ,SizeSelectIfGT ,SizeSelectIfLTE ,SizeSelectIfGTE ,SizeSelectIfEQ :default:return nil ,_d .Errorf (_feea ,"\u0069\u006e\u0076\u0061li\u0064\u0020\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0027\u0025d\u0027",_bfdf );
|
|
};_aegfbf =&_fd .NumSlice {};var (_ffgbc ,_eggb ,_eecgb int ;_eedb *Bitmap ;);for _ ,_eedb =range _aefe .Values {_ffgbc =0;_eggb ,_eecgb =_eedb .Width ,_eedb .Height ;switch _aeefc {case LocSelectWidth :if (_bfdf ==SizeSelectIfLT &&_eggb < _ecg )||(_bfdf ==SizeSelectIfGT &&_eggb > _ecg )||(_bfdf ==SizeSelectIfLTE &&_eggb <=_ecg )||(_bfdf ==SizeSelectIfGTE &&_eggb >=_ecg )||(_bfdf ==SizeSelectIfEQ &&_eggb ==_ecg ){_ffgbc =1;
|
|
};case LocSelectHeight :if (_bfdf ==SizeSelectIfLT &&_eecgb < _fgb )||(_bfdf ==SizeSelectIfGT &&_eecgb > _fgb )||(_bfdf ==SizeSelectIfLTE &&_eecgb <=_fgb )||(_bfdf ==SizeSelectIfGTE &&_eecgb >=_fgb )||(_bfdf ==SizeSelectIfEQ &&_eecgb ==_fgb ){_ffgbc =1;
|
|
};case LocSelectIfEither :if (_bfdf ==SizeSelectIfLT &&(_eggb < _ecg ||_eecgb < _fgb ))||(_bfdf ==SizeSelectIfGT &&(_eggb > _ecg ||_eecgb > _fgb ))||(_bfdf ==SizeSelectIfLTE &&(_eggb <=_ecg ||_eecgb <=_fgb ))||(_bfdf ==SizeSelectIfGTE &&(_eggb >=_ecg ||_eecgb >=_fgb ))||(_bfdf ==SizeSelectIfEQ &&(_eggb ==_ecg ||_eecgb ==_fgb )){_ffgbc =1;
|
|
};case LocSelectIfBoth :if (_bfdf ==SizeSelectIfLT &&(_eggb < _ecg &&_eecgb < _fgb ))||(_bfdf ==SizeSelectIfGT &&(_eggb > _ecg &&_eecgb > _fgb ))||(_bfdf ==SizeSelectIfLTE &&(_eggb <=_ecg &&_eecgb <=_fgb ))||(_bfdf ==SizeSelectIfGTE &&(_eggb >=_ecg &&_eecgb >=_fgb ))||(_bfdf ==SizeSelectIfEQ &&(_eggb ==_ecg &&_eecgb ==_fgb )){_ffgbc =1;
|
|
};};_aegfbf .AddInt (_ffgbc );};return _aegfbf ,nil ;};func _egcce (_ffca ,_bcbc ,_dbab byte )byte {return (_ffca &^(_dbab ))|(_bcbc &_dbab )};func _degc (_egacg *Bitmap ,_cege ,_cffgd ,_ebbe ,_adga int ,_aaaa RasterOperator ,_cecd *Bitmap ,_ddad ,_gffe int )error {var (_agcdg bool ;
|
|
_egfad bool ;_afda byte ;_gfgc int ;_cfaa int ;_ecfaa int ;_ffc int ;_adab bool ;_fbgf int ;_debg int ;_bdgd int ;_bcbf bool ;_dcae byte ;_bdaea int ;_cdac int ;_badca int ;_efeb byte ;_gaagf int ;_bfbb int ;_affa uint ;_bdbb uint ;_cbag byte ;_fcbca shift ;
|
|
_faca bool ;_dfcc bool ;_abb ,_acbc int ;);if _ddad &7!=0{_bfbb =8-(_ddad &7);};if _cege &7!=0{_cfaa =8-(_cege &7);};if _bfbb ==0&&_cfaa ==0{_cbag =_caeaf [0];}else {if _cfaa > _bfbb {_affa =uint (_cfaa -_bfbb );}else {_affa =uint (8-(_bfbb -_cfaa ));};
|
|
_bdbb =8-_affa ;_cbag =_caeaf [_affa ];};if (_cege &7)!=0{_agcdg =true ;_gfgc =8-(_cege &7);_afda =_caeaf [_gfgc ];_ecfaa =_egacg .RowStride *_cffgd +(_cege >>3);_ffc =_cecd .RowStride *_gffe +(_ddad >>3);_gaagf =8-(_ddad &7);if _gfgc > _gaagf {_fcbca =_fgac ;
|
|
if _ebbe >=_bfbb {_faca =true ;};}else {_fcbca =_dacga ;};};if _ebbe < _gfgc {_egfad =true ;_afda &=_fgedf [8-_gfgc +_ebbe ];};if !_egfad {_fbgf =(_ebbe -_gfgc )>>3;if _fbgf !=0{_adab =true ;_debg =_egacg .RowStride *_cffgd +((_cege +_cfaa )>>3);_bdgd =_cecd .RowStride *_gffe +((_ddad +_cfaa )>>3);
|
|
};};_bdaea =(_cege +_ebbe )&7;if !(_egfad ||_bdaea ==0){_bcbf =true ;_dcae =_fgedf [_bdaea ];_cdac =_egacg .RowStride *_cffgd +((_cege +_cfaa )>>3)+_fbgf ;_badca =_cecd .RowStride *_gffe +((_ddad +_cfaa )>>3)+_fbgf ;if _bdaea > int (_bdbb ){_dfcc =true ;
|
|
};};switch _aaaa {case PixSrc :if _agcdg {for _abb =0;_abb < _adga ;_abb ++{if _fcbca ==_fgac {_efeb =_cecd .Data [_ffc ]<<_affa ;if _faca {_efeb =_egcce (_efeb ,_cecd .Data [_ffc +1]>>_bdbb ,_cbag );};}else {_efeb =_cecd .Data [_ffc ]>>_bdbb ;};_egacg .Data [_ecfaa ]=_egcce (_egacg .Data [_ecfaa ],_efeb ,_afda );
|
|
_ecfaa +=_egacg .RowStride ;_ffc +=_cecd .RowStride ;};};if _adab {for _abb =0;_abb < _adga ;_abb ++{for _acbc =0;_acbc < _fbgf ;_acbc ++{_efeb =_egcce (_cecd .Data [_bdgd +_acbc ]<<_affa ,_cecd .Data [_bdgd +_acbc +1]>>_bdbb ,_cbag );_egacg .Data [_debg +_acbc ]=_efeb ;
|
|
};_debg +=_egacg .RowStride ;_bdgd +=_cecd .RowStride ;};};if _bcbf {for _abb =0;_abb < _adga ;_abb ++{_efeb =_cecd .Data [_badca ]<<_affa ;if _dfcc {_efeb =_egcce (_efeb ,_cecd .Data [_badca +1]>>_bdbb ,_cbag );};_egacg .Data [_cdac ]=_egcce (_egacg .Data [_cdac ],_efeb ,_dcae );
|
|
_cdac +=_egacg .RowStride ;_badca +=_cecd .RowStride ;};};case PixNotSrc :if _agcdg {for _abb =0;_abb < _adga ;_abb ++{if _fcbca ==_fgac {_efeb =_cecd .Data [_ffc ]<<_affa ;if _faca {_efeb =_egcce (_efeb ,_cecd .Data [_ffc +1]>>_bdbb ,_cbag );};}else {_efeb =_cecd .Data [_ffc ]>>_bdbb ;
|
|
};_egacg .Data [_ecfaa ]=_egcce (_egacg .Data [_ecfaa ],^_efeb ,_afda );_ecfaa +=_egacg .RowStride ;_ffc +=_cecd .RowStride ;};};if _adab {for _abb =0;_abb < _adga ;_abb ++{for _acbc =0;_acbc < _fbgf ;_acbc ++{_efeb =_egcce (_cecd .Data [_bdgd +_acbc ]<<_affa ,_cecd .Data [_bdgd +_acbc +1]>>_bdbb ,_cbag );
|
|
_egacg .Data [_debg +_acbc ]=^_efeb ;};_debg +=_egacg .RowStride ;_bdgd +=_cecd .RowStride ;};};if _bcbf {for _abb =0;_abb < _adga ;_abb ++{_efeb =_cecd .Data [_badca ]<<_affa ;if _dfcc {_efeb =_egcce (_efeb ,_cecd .Data [_badca +1]>>_bdbb ,_cbag );};_egacg .Data [_cdac ]=_egcce (_egacg .Data [_cdac ],^_efeb ,_dcae );
|
|
_cdac +=_egacg .RowStride ;_badca +=_cecd .RowStride ;};};case PixSrcOrDst :if _agcdg {for _abb =0;_abb < _adga ;_abb ++{if _fcbca ==_fgac {_efeb =_cecd .Data [_ffc ]<<_affa ;if _faca {_efeb =_egcce (_efeb ,_cecd .Data [_ffc +1]>>_bdbb ,_cbag );};}else {_efeb =_cecd .Data [_ffc ]>>_bdbb ;
|
|
};_egacg .Data [_ecfaa ]=_egcce (_egacg .Data [_ecfaa ],_efeb |_egacg .Data [_ecfaa ],_afda );_ecfaa +=_egacg .RowStride ;_ffc +=_cecd .RowStride ;};};if _adab {for _abb =0;_abb < _adga ;_abb ++{for _acbc =0;_acbc < _fbgf ;_acbc ++{_efeb =_egcce (_cecd .Data [_bdgd +_acbc ]<<_affa ,_cecd .Data [_bdgd +_acbc +1]>>_bdbb ,_cbag );
|
|
_egacg .Data [_debg +_acbc ]|=_efeb ;};_debg +=_egacg .RowStride ;_bdgd +=_cecd .RowStride ;};};if _bcbf {for _abb =0;_abb < _adga ;_abb ++{_efeb =_cecd .Data [_badca ]<<_affa ;if _dfcc {_efeb =_egcce (_efeb ,_cecd .Data [_badca +1]>>_bdbb ,_cbag );};_egacg .Data [_cdac ]=_egcce (_egacg .Data [_cdac ],_efeb |_egacg .Data [_cdac ],_dcae );
|
|
_cdac +=_egacg .RowStride ;_badca +=_cecd .RowStride ;};};case PixSrcAndDst :if _agcdg {for _abb =0;_abb < _adga ;_abb ++{if _fcbca ==_fgac {_efeb =_cecd .Data [_ffc ]<<_affa ;if _faca {_efeb =_egcce (_efeb ,_cecd .Data [_ffc +1]>>_bdbb ,_cbag );};}else {_efeb =_cecd .Data [_ffc ]>>_bdbb ;
|
|
};_egacg .Data [_ecfaa ]=_egcce (_egacg .Data [_ecfaa ],_efeb &_egacg .Data [_ecfaa ],_afda );_ecfaa +=_egacg .RowStride ;_ffc +=_cecd .RowStride ;};};if _adab {for _abb =0;_abb < _adga ;_abb ++{for _acbc =0;_acbc < _fbgf ;_acbc ++{_efeb =_egcce (_cecd .Data [_bdgd +_acbc ]<<_affa ,_cecd .Data [_bdgd +_acbc +1]>>_bdbb ,_cbag );
|
|
_egacg .Data [_debg +_acbc ]&=_efeb ;};_debg +=_egacg .RowStride ;_bdgd +=_cecd .RowStride ;};};if _bcbf {for _abb =0;_abb < _adga ;_abb ++{_efeb =_cecd .Data [_badca ]<<_affa ;if _dfcc {_efeb =_egcce (_efeb ,_cecd .Data [_badca +1]>>_bdbb ,_cbag );};_egacg .Data [_cdac ]=_egcce (_egacg .Data [_cdac ],_efeb &_egacg .Data [_cdac ],_dcae );
|
|
_cdac +=_egacg .RowStride ;_badca +=_cecd .RowStride ;};};case PixSrcXorDst :if _agcdg {for _abb =0;_abb < _adga ;_abb ++{if _fcbca ==_fgac {_efeb =_cecd .Data [_ffc ]<<_affa ;if _faca {_efeb =_egcce (_efeb ,_cecd .Data [_ffc +1]>>_bdbb ,_cbag );};}else {_efeb =_cecd .Data [_ffc ]>>_bdbb ;
|
|
};_egacg .Data [_ecfaa ]=_egcce (_egacg .Data [_ecfaa ],_efeb ^_egacg .Data [_ecfaa ],_afda );_ecfaa +=_egacg .RowStride ;_ffc +=_cecd .RowStride ;};};if _adab {for _abb =0;_abb < _adga ;_abb ++{for _acbc =0;_acbc < _fbgf ;_acbc ++{_efeb =_egcce (_cecd .Data [_bdgd +_acbc ]<<_affa ,_cecd .Data [_bdgd +_acbc +1]>>_bdbb ,_cbag );
|
|
_egacg .Data [_debg +_acbc ]^=_efeb ;};_debg +=_egacg .RowStride ;_bdgd +=_cecd .RowStride ;};};if _bcbf {for _abb =0;_abb < _adga ;_abb ++{_efeb =_cecd .Data [_badca ]<<_affa ;if _dfcc {_efeb =_egcce (_efeb ,_cecd .Data [_badca +1]>>_bdbb ,_cbag );};_egacg .Data [_cdac ]=_egcce (_egacg .Data [_cdac ],_efeb ^_egacg .Data [_cdac ],_dcae );
|
|
_cdac +=_egacg .RowStride ;_badca +=_cecd .RowStride ;};};case PixNotSrcOrDst :if _agcdg {for _abb =0;_abb < _adga ;_abb ++{if _fcbca ==_fgac {_efeb =_cecd .Data [_ffc ]<<_affa ;if _faca {_efeb =_egcce (_efeb ,_cecd .Data [_ffc +1]>>_bdbb ,_cbag );};}else {_efeb =_cecd .Data [_ffc ]>>_bdbb ;
|
|
};_egacg .Data [_ecfaa ]=_egcce (_egacg .Data [_ecfaa ],^_efeb |_egacg .Data [_ecfaa ],_afda );_ecfaa +=_egacg .RowStride ;_ffc +=_cecd .RowStride ;};};if _adab {for _abb =0;_abb < _adga ;_abb ++{for _acbc =0;_acbc < _fbgf ;_acbc ++{_efeb =_egcce (_cecd .Data [_bdgd +_acbc ]<<_affa ,_cecd .Data [_bdgd +_acbc +1]>>_bdbb ,_cbag );
|
|
_egacg .Data [_debg +_acbc ]|=^_efeb ;};_debg +=_egacg .RowStride ;_bdgd +=_cecd .RowStride ;};};if _bcbf {for _abb =0;_abb < _adga ;_abb ++{_efeb =_cecd .Data [_badca ]<<_affa ;if _dfcc {_efeb =_egcce (_efeb ,_cecd .Data [_badca +1]>>_bdbb ,_cbag );};
|
|
_egacg .Data [_cdac ]=_egcce (_egacg .Data [_cdac ],^_efeb |_egacg .Data [_cdac ],_dcae );_cdac +=_egacg .RowStride ;_badca +=_cecd .RowStride ;};};case PixNotSrcAndDst :if _agcdg {for _abb =0;_abb < _adga ;_abb ++{if _fcbca ==_fgac {_efeb =_cecd .Data [_ffc ]<<_affa ;
|
|
if _faca {_efeb =_egcce (_efeb ,_cecd .Data [_ffc +1]>>_bdbb ,_cbag );};}else {_efeb =_cecd .Data [_ffc ]>>_bdbb ;};_egacg .Data [_ecfaa ]=_egcce (_egacg .Data [_ecfaa ],^_efeb &_egacg .Data [_ecfaa ],_afda );_ecfaa +=_egacg .RowStride ;_ffc +=_cecd .RowStride ;
|
|
};};if _adab {for _abb =0;_abb < _adga ;_abb ++{for _acbc =0;_acbc < _fbgf ;_acbc ++{_efeb =_egcce (_cecd .Data [_bdgd +_acbc ]<<_affa ,_cecd .Data [_bdgd +_acbc +1]>>_bdbb ,_cbag );_egacg .Data [_debg +_acbc ]&=^_efeb ;};_debg +=_egacg .RowStride ;_bdgd +=_cecd .RowStride ;
|
|
};};if _bcbf {for _abb =0;_abb < _adga ;_abb ++{_efeb =_cecd .Data [_badca ]<<_affa ;if _dfcc {_efeb =_egcce (_efeb ,_cecd .Data [_badca +1]>>_bdbb ,_cbag );};_egacg .Data [_cdac ]=_egcce (_egacg .Data [_cdac ],^_efeb &_egacg .Data [_cdac ],_dcae );_cdac +=_egacg .RowStride ;
|
|
_badca +=_cecd .RowStride ;};};case PixSrcOrNotDst :if _agcdg {for _abb =0;_abb < _adga ;_abb ++{if _fcbca ==_fgac {_efeb =_cecd .Data [_ffc ]<<_affa ;if _faca {_efeb =_egcce (_efeb ,_cecd .Data [_ffc +1]>>_bdbb ,_cbag );};}else {_efeb =_cecd .Data [_ffc ]>>_bdbb ;
|
|
};_egacg .Data [_ecfaa ]=_egcce (_egacg .Data [_ecfaa ],_efeb |^_egacg .Data [_ecfaa ],_afda );_ecfaa +=_egacg .RowStride ;_ffc +=_cecd .RowStride ;};};if _adab {for _abb =0;_abb < _adga ;_abb ++{for _acbc =0;_acbc < _fbgf ;_acbc ++{_efeb =_egcce (_cecd .Data [_bdgd +_acbc ]<<_affa ,_cecd .Data [_bdgd +_acbc +1]>>_bdbb ,_cbag );
|
|
_egacg .Data [_debg +_acbc ]=_efeb |^_egacg .Data [_debg +_acbc ];};_debg +=_egacg .RowStride ;_bdgd +=_cecd .RowStride ;};};if _bcbf {for _abb =0;_abb < _adga ;_abb ++{_efeb =_cecd .Data [_badca ]<<_affa ;if _dfcc {_efeb =_egcce (_efeb ,_cecd .Data [_badca +1]>>_bdbb ,_cbag );
|
|
};_egacg .Data [_cdac ]=_egcce (_egacg .Data [_cdac ],_efeb |^_egacg .Data [_cdac ],_dcae );_cdac +=_egacg .RowStride ;_badca +=_cecd .RowStride ;};};case PixSrcAndNotDst :if _agcdg {for _abb =0;_abb < _adga ;_abb ++{if _fcbca ==_fgac {_efeb =_cecd .Data [_ffc ]<<_affa ;
|
|
if _faca {_efeb =_egcce (_efeb ,_cecd .Data [_ffc +1]>>_bdbb ,_cbag );};}else {_efeb =_cecd .Data [_ffc ]>>_bdbb ;};_egacg .Data [_ecfaa ]=_egcce (_egacg .Data [_ecfaa ],_efeb &^_egacg .Data [_ecfaa ],_afda );_ecfaa +=_egacg .RowStride ;_ffc +=_cecd .RowStride ;
|
|
};};if _adab {for _abb =0;_abb < _adga ;_abb ++{for _acbc =0;_acbc < _fbgf ;_acbc ++{_efeb =_egcce (_cecd .Data [_bdgd +_acbc ]<<_affa ,_cecd .Data [_bdgd +_acbc +1]>>_bdbb ,_cbag );_egacg .Data [_debg +_acbc ]=_efeb &^_egacg .Data [_debg +_acbc ];};_debg +=_egacg .RowStride ;
|
|
_bdgd +=_cecd .RowStride ;};};if _bcbf {for _abb =0;_abb < _adga ;_abb ++{_efeb =_cecd .Data [_badca ]<<_affa ;if _dfcc {_efeb =_egcce (_efeb ,_cecd .Data [_badca +1]>>_bdbb ,_cbag );};_egacg .Data [_cdac ]=_egcce (_egacg .Data [_cdac ],_efeb &^_egacg .Data [_cdac ],_dcae );
|
|
_cdac +=_egacg .RowStride ;_badca +=_cecd .RowStride ;};};case PixNotPixSrcOrDst :if _agcdg {for _abb =0;_abb < _adga ;_abb ++{if _fcbca ==_fgac {_efeb =_cecd .Data [_ffc ]<<_affa ;if _faca {_efeb =_egcce (_efeb ,_cecd .Data [_ffc +1]>>_bdbb ,_cbag );};
|
|
}else {_efeb =_cecd .Data [_ffc ]>>_bdbb ;};_egacg .Data [_ecfaa ]=_egcce (_egacg .Data [_ecfaa ],^(_efeb |_egacg .Data [_ecfaa ]),_afda );_ecfaa +=_egacg .RowStride ;_ffc +=_cecd .RowStride ;};};if _adab {for _abb =0;_abb < _adga ;_abb ++{for _acbc =0;
|
|
_acbc < _fbgf ;_acbc ++{_efeb =_egcce (_cecd .Data [_bdgd +_acbc ]<<_affa ,_cecd .Data [_bdgd +_acbc +1]>>_bdbb ,_cbag );_egacg .Data [_debg +_acbc ]=^(_efeb |_egacg .Data [_debg +_acbc ]);};_debg +=_egacg .RowStride ;_bdgd +=_cecd .RowStride ;};};if _bcbf {for _abb =0;
|
|
_abb < _adga ;_abb ++{_efeb =_cecd .Data [_badca ]<<_affa ;if _dfcc {_efeb =_egcce (_efeb ,_cecd .Data [_badca +1]>>_bdbb ,_cbag );};_egacg .Data [_cdac ]=_egcce (_egacg .Data [_cdac ],^(_efeb |_egacg .Data [_cdac ]),_dcae );_cdac +=_egacg .RowStride ;
|
|
_badca +=_cecd .RowStride ;};};case PixNotPixSrcAndDst :if _agcdg {for _abb =0;_abb < _adga ;_abb ++{if _fcbca ==_fgac {_efeb =_cecd .Data [_ffc ]<<_affa ;if _faca {_efeb =_egcce (_efeb ,_cecd .Data [_ffc +1]>>_bdbb ,_cbag );};}else {_efeb =_cecd .Data [_ffc ]>>_bdbb ;
|
|
};_egacg .Data [_ecfaa ]=_egcce (_egacg .Data [_ecfaa ],^(_efeb &_egacg .Data [_ecfaa ]),_afda );_ecfaa +=_egacg .RowStride ;_ffc +=_cecd .RowStride ;};};if _adab {for _abb =0;_abb < _adga ;_abb ++{for _acbc =0;_acbc < _fbgf ;_acbc ++{_efeb =_egcce (_cecd .Data [_bdgd +_acbc ]<<_affa ,_cecd .Data [_bdgd +_acbc +1]>>_bdbb ,_cbag );
|
|
_egacg .Data [_debg +_acbc ]=^(_efeb &_egacg .Data [_debg +_acbc ]);};_debg +=_egacg .RowStride ;_bdgd +=_cecd .RowStride ;};};if _bcbf {for _abb =0;_abb < _adga ;_abb ++{_efeb =_cecd .Data [_badca ]<<_affa ;if _dfcc {_efeb =_egcce (_efeb ,_cecd .Data [_badca +1]>>_bdbb ,_cbag );
|
|
};_egacg .Data [_cdac ]=_egcce (_egacg .Data [_cdac ],^(_efeb &_egacg .Data [_cdac ]),_dcae );_cdac +=_egacg .RowStride ;_badca +=_cecd .RowStride ;};};case PixNotPixSrcXorDst :if _agcdg {for _abb =0;_abb < _adga ;_abb ++{if _fcbca ==_fgac {_efeb =_cecd .Data [_ffc ]<<_affa ;
|
|
if _faca {_efeb =_egcce (_efeb ,_cecd .Data [_ffc +1]>>_bdbb ,_cbag );};}else {_efeb =_cecd .Data [_ffc ]>>_bdbb ;};_egacg .Data [_ecfaa ]=_egcce (_egacg .Data [_ecfaa ],^(_efeb ^_egacg .Data [_ecfaa ]),_afda );_ecfaa +=_egacg .RowStride ;_ffc +=_cecd .RowStride ;
|
|
};};if _adab {for _abb =0;_abb < _adga ;_abb ++{for _acbc =0;_acbc < _fbgf ;_acbc ++{_efeb =_egcce (_cecd .Data [_bdgd +_acbc ]<<_affa ,_cecd .Data [_bdgd +_acbc +1]>>_bdbb ,_cbag );_egacg .Data [_debg +_acbc ]=^(_efeb ^_egacg .Data [_debg +_acbc ]);};
|
|
_debg +=_egacg .RowStride ;_bdgd +=_cecd .RowStride ;};};if _bcbf {for _abb =0;_abb < _adga ;_abb ++{_efeb =_cecd .Data [_badca ]<<_affa ;if _dfcc {_efeb =_egcce (_efeb ,_cecd .Data [_badca +1]>>_bdbb ,_cbag );};_egacg .Data [_cdac ]=_egcce (_egacg .Data [_cdac ],^(_efeb ^_egacg .Data [_cdac ]),_dcae );
|
|
_cdac +=_egacg .RowStride ;_badca +=_cecd .RowStride ;};};default:_ba .Log .Debug ("\u004f\u0070e\u0072\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006e\u006f\u0074\u0020\u0070\u0065\u0072\u006d\u0069tt\u0065\u0064",_aaaa );
|
|
return _d .Error ("\u0072a\u0073t\u0065\u0072\u004f\u0070\u0047e\u006e\u0065r\u0061\u006c\u004c\u006f\u0077","\u0072\u0061\u0073\u0074\u0065\u0072\u0020\u006f\u0070\u0065r\u0061\u0074\u0069\u006f\u006e\u0020\u006eo\u0074\u0020\u0070\u0065\u0072\u006d\u0069\u0074\u0074\u0065\u0064");
|
|
};return nil ;};func (_gcgd *Bitmap )connComponentsBitmapsBB (_bdgf *Bitmaps ,_cdbe int )(_afbe *Boxes ,_aeadd error ){const _fcgd ="\u0063\u006f\u006enC\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074\u0073\u0042\u0069\u0074\u006d\u0061\u0070\u0073\u0042\u0042";
|
|
if _cdbe !=4&&_cdbe !=8{return nil ,_d .Error (_fcgd ,"\u0063\u006f\u006e\u006e\u0065\u0063t\u0069\u0076\u0069\u0074\u0079\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065 \u0061\u0020\u0027\u0034\u0027\u0020\u006fr\u0020\u0027\u0038\u0027");};if _bdgf ==nil {return nil ,_d .Error (_fcgd ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0042\u0069\u0074ma\u0070\u0073");
|
|
};if len (_bdgf .Values )> 0{return nil ,_d .Error (_fcgd ,"\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u006fn\u002d\u0065\u006d\u0070\u0074\u0079\u0020\u0042\u0069\u0074m\u0061\u0070\u0073");};if _gcgd .Zero (){return &Boxes {},nil ;};
|
|
var (_ffeg ,_dbdce ,_fddb ,_gbag *Bitmap ;);_gcgd .setPadBits (0);if _ffeg ,_aeadd =_bbe (nil ,_gcgd );_aeadd !=nil {return nil ,_d .Wrap (_aeadd ,_fcgd ,"\u0062\u006d\u0031");};if _dbdce ,_aeadd =_bbe (nil ,_gcgd );_aeadd !=nil {return nil ,_d .Wrap (_aeadd ,_fcgd ,"\u0062\u006d\u0032");
|
|
};_dgd :=&_fd .Stack {};_dgd .Aux =&_fd .Stack {};_afbe =&Boxes {};var (_dgdg ,_bdeb int ;_aada _e .Point ;_ccbd bool ;_egba *_e .Rectangle ;);for {if _aada ,_ccbd ,_aeadd =_ffeg .nextOnPixel (_dgdg ,_bdeb );_aeadd !=nil {return nil ,_d .Wrap (_aeadd ,_fcgd ,"");
|
|
};if !_ccbd {break ;};if _egba ,_aeadd =_fgaf (_ffeg ,_dgd ,_aada .X ,_aada .Y ,_cdbe );_aeadd !=nil {return nil ,_d .Wrap (_aeadd ,_fcgd ,"");};if _aeadd =_afbe .Add (_egba );_aeadd !=nil {return nil ,_d .Wrap (_aeadd ,_fcgd ,"");};if _fddb ,_aeadd =_ffeg .clipRectangle (_egba ,nil );
|
|
_aeadd !=nil {return nil ,_d .Wrap (_aeadd ,_fcgd ,"\u0062\u006d\u0033");};if _gbag ,_aeadd =_dbdce .clipRectangle (_egba ,nil );_aeadd !=nil {return nil ,_d .Wrap (_aeadd ,_fcgd ,"\u0062\u006d\u0034");};if _ ,_aeadd =_gabd (_fddb ,_fddb ,_gbag );_aeadd !=nil {return nil ,_d .Wrap (_aeadd ,_fcgd ,"\u0062m\u0033\u0020\u005e\u0020\u0062\u006d4");
|
|
};if _aeadd =_dbdce .RasterOperation (_egba .Min .X ,_egba .Min .Y ,_egba .Dx (),_egba .Dy (),PixSrcXorDst ,_fddb ,0,0);_aeadd !=nil {return nil ,_d .Wrap (_aeadd ,_fcgd ,"\u0062\u006d\u0032\u0020\u002d\u0058\u004f\u0052\u002d>\u0020\u0062\u006d\u0033");
|
|
};_bdgf .AddBitmap (_fddb );_dgdg =_aada .X ;_bdeb =_aada .Y ;};_bdgf .Boxes =*_afbe ;return _afbe ,nil ;};func CorrelationScore (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab []int )(_fabdg float64 ,_fead error ){const _debdd ="\u0063\u006fr\u0072\u0065\u006ca\u0074\u0069\u006f\u006e\u0053\u0063\u006f\u0072\u0065";
|
|
if bm1 ==nil ||bm2 ==nil {return 0,_d .Error (_debdd ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0062\u0069\u0074ma\u0070\u0073");};if tab ==nil {return 0,_d .Error (_debdd ,"\u0027\u0074\u0061\u0062\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065f\u0069\u006e\u0065\u0064");
|
|
};if area1 <=0||area2 <=0{return 0,_d .Error (_debdd ,"\u0061\u0072\u0065\u0061s\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065\u0020\u0067r\u0065a\u0074\u0065\u0072\u0020\u0074\u0068\u0061n\u0020\u0030");};_dfaf ,_afdg :=bm1 .Width ,bm1 .Height ;_ffab ,_abdd :=bm2 .Width ,bm2 .Height ;
|
|
_geab :=_gafd (_dfaf -_ffab );if _geab > maxDiffW {return 0,nil ;};_edg :=_gafd (_afdg -_abdd );if _edg > maxDiffH {return 0,nil ;};var _dff ,_aba int ;if delX >=0{_dff =int (delX +0.5);}else {_dff =int (delX -0.5);};if delY >=0{_aba =int (delY +0.5);}else {_aba =int (delY -0.5);
|
|
};_dgea :=_dggg (_aba ,0);_cecc :=_cbf (_abdd +_aba ,_afdg );_cagd :=bm1 .RowStride *_dgea ;_dafa :=bm2 .RowStride *(_dgea -_aba );_aece :=_dggg (_dff ,0);_ceaa :=_cbf (_ffab +_dff ,_dfaf );_fccb :=bm2 .RowStride ;var _ddbade ,_fbf int ;if _dff >=8{_ddbade =_dff >>3;
|
|
_cagd +=_ddbade ;_aece -=_ddbade <<3;_ceaa -=_ddbade <<3;_dff &=7;}else if _dff <=-8{_fbf =-((_dff +7)>>3);_dafa +=_fbf ;_fccb -=_fbf ;_dff +=_fbf <<3;};if _aece >=_ceaa ||_dgea >=_cecc {return 0,nil ;};_cgad :=(_ceaa +7)>>3;var (_ceca ,_faec ,_fcba byte ;
|
|
_gdca ,_degb ,_agca int ;);switch {case _dff ==0:for _agca =_dgea ;_agca < _cecc ;_agca ,_cagd ,_dafa =_agca +1,_cagd +bm1 .RowStride ,_dafa +bm2 .RowStride {for _degb =0;_degb < _cgad ;_degb ++{_fcba =bm1 .Data [_cagd +_degb ]&bm2 .Data [_dafa +_degb ];
|
|
_gdca +=tab [_fcba ];};};case _dff > 0:if _fccb < _cgad {for _agca =_dgea ;_agca < _cecc ;_agca ,_cagd ,_dafa =_agca +1,_cagd +bm1 .RowStride ,_dafa +bm2 .RowStride {_ceca ,_faec =bm1 .Data [_cagd ],bm2 .Data [_dafa ]>>uint (_dff );_fcba =_ceca &_faec ;
|
|
_gdca +=tab [_fcba ];for _degb =1;_degb < _fccb ;_degb ++{_ceca ,_faec =bm1 .Data [_cagd +_degb ],(bm2 .Data [_dafa +_degb ]>>uint (_dff ))|(bm2 .Data [_dafa +_degb -1]<<uint (8-_dff ));_fcba =_ceca &_faec ;_gdca +=tab [_fcba ];};_ceca =bm1 .Data [_cagd +_degb ];
|
|
_faec =bm2 .Data [_dafa +_degb -1]<<uint (8-_dff );_fcba =_ceca &_faec ;_gdca +=tab [_fcba ];};}else {for _agca =_dgea ;_agca < _cecc ;_agca ,_cagd ,_dafa =_agca +1,_cagd +bm1 .RowStride ,_dafa +bm2 .RowStride {_ceca ,_faec =bm1 .Data [_cagd ],bm2 .Data [_dafa ]>>uint (_dff );
|
|
_fcba =_ceca &_faec ;_gdca +=tab [_fcba ];for _degb =1;_degb < _cgad ;_degb ++{_ceca =bm1 .Data [_cagd +_degb ];_faec =(bm2 .Data [_dafa +_degb ]>>uint (_dff ))|(bm2 .Data [_dafa +_degb -1]<<uint (8-_dff ));_fcba =_ceca &_faec ;_gdca +=tab [_fcba ];};};
|
|
};default:if _cgad < _fccb {for _agca =_dgea ;_agca < _cecc ;_agca ,_cagd ,_dafa =_agca +1,_cagd +bm1 .RowStride ,_dafa +bm2 .RowStride {for _degb =0;_degb < _cgad ;_degb ++{_ceca =bm1 .Data [_cagd +_degb ];_faec =bm2 .Data [_dafa +_degb ]<<uint (-_dff );
|
|
_faec |=bm2 .Data [_dafa +_degb +1]>>uint (8+_dff );_fcba =_ceca &_faec ;_gdca +=tab [_fcba ];};};}else {for _agca =_dgea ;_agca < _cecc ;_agca ,_cagd ,_dafa =_agca +1,_cagd +bm1 .RowStride ,_dafa +bm2 .RowStride {for _degb =0;_degb < _cgad -1;_degb ++{_ceca =bm1 .Data [_cagd +_degb ];
|
|
_faec =bm2 .Data [_dafa +_degb ]<<uint (-_dff );_faec |=bm2 .Data [_dafa +_degb +1]>>uint (8+_dff );_fcba =_ceca &_faec ;_gdca +=tab [_fcba ];};_ceca =bm1 .Data [_cagd +_degb ];_faec =bm2 .Data [_dafa +_degb ]<<uint (-_dff );_fcba =_ceca &_faec ;_gdca +=tab [_fcba ];
|
|
};};};_fabdg =float64 (_gdca )*float64 (_gdca )/(float64 (area1 )*float64 (area2 ));return _fabdg ,nil ;};func (_acfg *Selection )findMaxTranslations ()(_bafeg ,_ccea ,_dggee ,_gfga int ){for _cceb :=0;_cceb < _acfg .Height ;_cceb ++{for _accd :=0;_accd < _acfg .Width ;
|
|
_accd ++{if _acfg .Data [_cceb ][_accd ]==SelHit {_bafeg =_dggg (_bafeg ,_acfg .Cx -_accd );_ccea =_dggg (_ccea ,_acfg .Cy -_cceb );_dggee =_dggg (_dggee ,_accd -_acfg .Cx );_gfga =_dggg (_gfga ,_cceb -_acfg .Cy );};};};return _bafeg ,_ccea ,_dggee ,_gfga ;
|
|
};func (_ggfc *Bitmaps )selectByIndexes (_gfbe []int )(*Bitmaps ,error ){_gbgc :=&Bitmaps {};for _ ,_fgfc :=range _gfbe {_gedd ,_gdgdb :=_ggfc .GetBitmap (_fgfc );if _gdgdb !=nil {return nil ,_d .Wrap (_gdgdb ,"\u0073e\u006ce\u0063\u0074\u0042\u0079\u0049\u006e\u0064\u0065\u0078\u0065\u0073","");
|
|
};_gbgc .AddBitmap (_gedd );};return _gbgc ,nil ;};func TstCSymbol (t *_fa .T )*Bitmap {t .Helper ();_gaagfb :=New (6,6);_f .NoError (t ,_gaagfb .SetPixel (1,0,1));_f .NoError (t ,_gaagfb .SetPixel (2,0,1));_f .NoError (t ,_gaagfb .SetPixel (3,0,1));_f .NoError (t ,_gaagfb .SetPixel (4,0,1));
|
|
_f .NoError (t ,_gaagfb .SetPixel (0,1,1));_f .NoError (t ,_gaagfb .SetPixel (5,1,1));_f .NoError (t ,_gaagfb .SetPixel (0,2,1));_f .NoError (t ,_gaagfb .SetPixel (0,3,1));_f .NoError (t ,_gaagfb .SetPixel (0,4,1));_f .NoError (t ,_gaagfb .SetPixel (5,4,1));
|
|
_f .NoError (t ,_gaagfb .SetPixel (1,5,1));_f .NoError (t ,_gaagfb .SetPixel (2,5,1));_f .NoError (t ,_gaagfb .SetPixel (3,5,1));_f .NoError (t ,_gaagfb .SetPixel (4,5,1));return _gaagfb ;};func _cf (_baf ,_ec *Bitmap )(_db error ){const _def ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0034";
|
|
_bc :=_ec .RowStride ;_gb :=_baf .RowStride ;_gcc :=_ec .RowStride *4-_baf .RowStride ;var (_ead ,_df byte ;_gcf uint32 ;_cdb ,_gbg ,_be ,_bb ,_fag ,_bgb ,_af int ;);for _be =0;_be < _ec .Height ;_be ++{_cdb =_be *_bc ;_gbg =4*_be *_gb ;for _bb =0;_bb < _bc ;
|
|
_bb ++{_ead =_ec .Data [_cdb +_bb ];_gcf =_ebdf [_ead ];_bgb =_gbg +_bb *4;if _gcc !=0&&(_bb +1)*4> _baf .RowStride {for _fag =_gcc ;_fag > 0;_fag --{_df =byte ((_gcf >>uint (_fag *8))&0xff);_af =_bgb +(_gcc -_fag );if _db =_baf .SetByte (_af ,_df );_db !=nil {return _d .Wrapf (_db ,_def ,"D\u0069\u0066\u0066\u0065\u0072\u0065n\u0074\u0020\u0072\u006f\u0077\u0073\u0074\u0072\u0069d\u0065\u0073\u002e \u004b:\u0020\u0025\u0064",_fag );
|
|
};};}else if _db =_baf .setFourBytes (_bgb ,_gcf );_db !=nil {return _d .Wrap (_db ,_def ,"");};if _db =_baf .setFourBytes (_gbg +_bb *4,_ebdf [_ec .Data [_cdb +_bb ]]);_db !=nil {return _d .Wrap (_db ,_def ,"");};};for _fag =1;_fag < 4;_fag ++{for _bb =0;
|
|
_bb < _gb ;_bb ++{if _db =_baf .SetByte (_gbg +_fag *_gb +_bb ,_baf .Data [_gbg +_bb ]);_db !=nil {return _d .Wrapf (_db ,_def ,"\u0063\u006f\u0070\u0079\u0020\u0027\u0071\u0075\u0061\u0064\u0072\u0061\u0062l\u0065\u0027\u0020\u006c\u0069\u006ee\u003a\u0020\u0027\u0025\u0064\u0027\u002c\u0020\u0062\u0079\u0074\u0065\u003a \u0027\u0025\u0064\u0027",_fag ,_bb );
|
|
};};};};return nil ;};func (_cbab *Bitmap )RasterOperation (dx ,dy ,dw ,dh int ,op RasterOperator ,src *Bitmap ,sx ,sy int )error {return _eagg (_cbab ,dx ,dy ,dw ,dh ,op ,src ,sx ,sy );};func (_cffa *Bitmap )clearAll ()error {return _cffa .RasterOperation (0,0,_cffa .Width ,_cffa .Height ,PixClr ,nil ,0,0);
|
|
};const (CmbOpOr CombinationOperator =iota ;CmbOpAnd ;CmbOpXor ;CmbOpXNor ;CmbOpReplace ;CmbOpNot ;);func (_baab *Bitmap )Equivalent (s *Bitmap )bool {return _baab .equivalent (s )};func (_aaa *Bitmap )equivalent (_bgae *Bitmap )bool {if _aaa ==_bgae {return true ;
|
|
};if !_aaa .SizesEqual (_bgae ){return false ;};_fcdf :=_fdf (_aaa ,_bgae ,CmbOpXor );_gda :=_aaa .countPixels ();_gfc :=int (0.25*float32 (_gda ));if _fcdf .thresholdPixelSum (_gfc ){return false ;};var (_debf [9][9]int ;_bebb [18][9]int ;_cdae [9][18]int ;
|
|
_bda int ;_ccdb int ;);_bgfg :=9;_afae :=_aaa .Height /_bgfg ;_fdca :=_aaa .Width /_bgfg ;_efff ,_abgdc :=_afae /2,_fdca /2;if _afae < _fdca {_efff =_fdca /2;_abgdc =_afae /2;};_egaf :=float64 (_efff )*float64 (_abgdc )*_g .Pi ;_dfd :=int (float64 (_afae *_fdca /2)*0.9);
|
|
_defe :=int (float64 (_fdca *_afae /2)*0.9);for _cffag :=0;_cffag < _bgfg ;_cffag ++{_bfc :=_fdca *_cffag +_bda ;var _gab int ;if _cffag ==_bgfg -1{_bda =0;_gab =_aaa .Width ;}else {_gab =_bfc +_fdca ;if ((_aaa .Width -_bda )%_bgfg )> 0{_bda ++;_gab ++;
|
|
};};for _eefd :=0;_eefd < _bgfg ;_eefd ++{_adag :=_afae *_eefd +_ccdb ;var _bcd int ;if _eefd ==_bgfg -1{_ccdb =0;_bcd =_aaa .Height ;}else {_bcd =_adag +_afae ;if (_aaa .Height -_ccdb )%_bgfg > 0{_ccdb ++;_bcd ++;};};var _gceeg ,_aadf ,_ced ,_aec int ;
|
|
_gbed :=(_bfc +_gab )/2;_efga :=(_adag +_bcd )/2;for _dgc :=_bfc ;_dgc < _gab ;_dgc ++{for _gcce :=_adag ;_gcce < _bcd ;_gcce ++{if _fcdf .GetPixel (_dgc ,_gcce ){if _dgc < _gbed {_gceeg ++;}else {_aadf ++;};if _gcce < _efga {_aec ++;}else {_ced ++;};};
|
|
};};_debf [_cffag ][_eefd ]=_gceeg +_aadf ;_bebb [_cffag *2][_eefd ]=_gceeg ;_bebb [_cffag *2+1][_eefd ]=_aadf ;_cdae [_cffag ][_eefd *2]=_aec ;_cdae [_cffag ][_eefd *2+1]=_ced ;};};for _cgb :=0;_cgb < _bgfg *2-1;_cgb ++{for _adbb :=0;_adbb < (_bgfg -1);
|
|
_adbb ++{var _dfa int ;for _ffgd :=0;_ffgd < 2;_ffgd ++{for _gfgb :=0;_gfgb < 2;_gfgb ++{_dfa +=_bebb [_cgb +_ffgd ][_adbb +_gfgb ];};};if _dfa > _defe {return false ;};};};for _bdbc :=0;_bdbc < (_bgfg -1);_bdbc ++{for _dgcg :=0;_dgcg < ((_bgfg *2)-1);
|
|
_dgcg ++{var _bde int ;for _dda :=0;_dda < 2;_dda ++{for _dgef :=0;_dgef < 2;_dgef ++{_bde +=_cdae [_bdbc +_dda ][_dgcg +_dgef ];};};if _bde > _dfd {return false ;};};};for _ebd :=0;_ebd < (_bgfg -2);_ebd ++{for _eecg :=0;_eecg < (_bgfg -2);_eecg ++{var _geb ,_fggf int ;
|
|
for _ddba :=0;_ddba < 3;_ddba ++{for _efa :=0;_efa < 3;_efa ++{if _ddba ==_efa {_geb +=_debf [_ebd +_ddba ][_eecg +_efa ];};if (2-_ddba )==_efa {_fggf +=_debf [_ebd +_ddba ][_eecg +_efa ];};};};if _geb > _defe ||_fggf > _defe {return false ;};};};for _fbge :=0;
|
|
_fbge < (_bgfg -1);_fbge ++{for _dbdc :=0;_dbdc < (_bgfg -1);_dbdc ++{var _bgfb int ;for _efef :=0;_efef < 2;_efef ++{for _afb :=0;_afb < 2;_afb ++{_bgfb +=_debf [_fbge +_efef ][_dbdc +_afb ];};};if float64 (_bgfb )> _egaf {return false ;};};};return true ;
|
|
};func (_adgc *Bitmaps )ClipToBitmap (s *Bitmap )(*Bitmaps ,error ){const _egbc ="B\u0069t\u006d\u0061\u0070\u0073\u002e\u0043\u006c\u0069p\u0054\u006f\u0042\u0069tm\u0061\u0070";if _adgc ==nil {return nil ,_d .Error (_egbc ,"\u0042\u0069\u0074\u006dap\u0073\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};if s ==nil {return nil ,_d .Error (_egbc ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};_bbddb :=len (_adgc .Values );_eege :=&Bitmaps {Values :make ([]*Bitmap ,_bbddb ),Boxes :make ([]*_e .Rectangle ,_bbddb )};
|
|
var (_efdb ,_cbge *Bitmap ;_edda *_e .Rectangle ;_gbad error ;);for _gdgc :=0;_gdgc < _bbddb ;_gdgc ++{if _efdb ,_gbad =_adgc .GetBitmap (_gdgc );_gbad !=nil {return nil ,_d .Wrap (_gbad ,_egbc ,"");};if _edda ,_gbad =_adgc .GetBox (_gdgc );_gbad !=nil {return nil ,_d .Wrap (_gbad ,_egbc ,"");
|
|
};if _cbge ,_gbad =s .clipRectangle (_edda ,nil );_gbad !=nil {return nil ,_d .Wrap (_gbad ,_egbc ,"");};if _cbge ,_gbad =_cbge .And (_efdb );_gbad !=nil {return nil ,_d .Wrap (_gbad ,_egbc ,"");};_eege .Values [_gdgc ]=_cbge ;_eege .Boxes [_gdgc ]=_edda ;
|
|
};return _eege ,nil ;}; |