mirror of
https://github.com/unidoc/unipdf.git
synced 2025-04-26 13:48:55 +08:00
12 lines
195 KiB
Go
12 lines
195 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 (_c "encoding/binary";_d "github.com/stretchr/testify/require";_be "github.com/unidoc/unipdf/v3/common";_dda "github.com/unidoc/unipdf/v3/internal/bitwise";_aa "github.com/unidoc/unipdf/v3/internal/imageutil";_dd "github.com/unidoc/unipdf/v3/internal/jbig2/basic";_a "github.com/unidoc/unipdf/v3/internal/jbig2/errors";_b "image";_fb "math";_eg "sort";_e "strings";_da "testing";);func (_bdbg *Bitmaps )String ()string {_fdcf :=_e .Builder {};for _ ,_dffd :=range _bdbg .Values {_fdcf .WriteString (_dffd .String ());_fdcf .WriteRune ('\n');};return _fdcf .String ();};func CorrelationScoreSimple (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab []int )(_dgabb float64 ,_efaf error ){const _bgba ="\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 _dgabb ,_a .Error (_bgba ,"n\u0069l\u0020\u0062\u0069\u0074\u006d\u0061\u0070\u0073 \u0070\u0072\u006f\u0076id\u0065\u0064");};if tab ==nil {return _dgabb ,_a .Error (_bgba ,"\u0074\u0061\u0062\u0020\u0075\u006e\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};if area1 ==0||area2 ==0{return _dgabb ,_a .Error (_bgba ,"\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064\u0020\u0061\u0072e\u0061\u0073\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065 \u003e\u0020\u0030");};_gefdf ,_dacf :=bm1 .Width ,bm1 .Height ;_bcga ,_gbde :=bm2 .Width ,bm2 .Height ;if _bgdc (_gefdf -_bcga )> maxDiffW {return 0,nil ;};if _bgdc (_dacf -_gbde )> maxDiffH {return 0,nil ;};var _dfbc ,_dcbf int ;if delX >=0{_dfbc =int (delX +0.5);}else {_dfbc =int (delX -0.5);};if delY >=0{_dcbf =int (delY +0.5);}else {_dcbf =int (delY -0.5);};_gcfc :=bm1 .createTemplate ();if _efaf =_gcfc .RasterOperation (_dfbc ,_dcbf ,_bcga ,_gbde ,PixSrc ,bm2 ,0,0);_efaf !=nil {return _dgabb ,_a .Wrap (_efaf ,_bgba ,"\u0062m\u0032 \u0074\u006f\u0020\u0054\u0065\u006d\u0070\u006c\u0061\u0074\u0065");};if _efaf =_gcfc .RasterOperation (0,0,_gefdf ,_dacf ,PixSrcAndDst ,bm1 ,0,0);_efaf !=nil {return _dgabb ,_a .Wrap (_efaf ,_bgba ,"b\u006d\u0031\u0020\u0061\u006e\u0064\u0020\u0062\u006d\u0054");};_egaa :=_gcfc .countPixels ();_dgabb =float64 (_egaa )*float64 (_egaa )/(float64 (area1 )*float64 (area2 ));return _dgabb ,nil ;};func (_gece *Bitmap )SetPixel (x ,y int ,pixel byte )error {_bbbf :=_gece .GetByteIndex (x ,y );if _bbbf > len (_gece .Data )-1{return _a .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",_bbbf );};_deaed :=_gece .GetBitOffset (x );_aeebc :=uint (7-_deaed );_begg :=_gece .Data [_bbbf ];var _fbf byte ;if pixel ==1{_fbf =_begg |(pixel &0x01<<_aeebc );}else {_fbf =_begg &^(1<<_aeebc );};_gece .Data [_bbbf ]=_fbf ;return nil ;};type BitmapsArray struct{Values []*Bitmaps ;Boxes []*_b .Rectangle ;};func (_cggb *Bitmaps )WidthSorter ()func (_addcc ,_cedfg int )bool {return func (_egcd ,_gaba int )bool {return _cggb .Values [_egcd ].Width < _cggb .Values [_gaba ].Width };};func (_fgabc *BitmapsArray )AddBitmaps (bm *Bitmaps ){_fgabc .Values =append (_fgabc .Values ,bm )};var (_cbee *Bitmap ;_bedgd *Bitmap ;);func (_cefb *Boxes )SelectBySize (width ,height int ,tp LocationFilter ,relation SizeComparison )(_cgb *Boxes ,_eea error ){const _cccgb ="\u0042o\u0078e\u0073\u002e\u0053\u0065\u006ce\u0063\u0074B\u0079\u0053\u0069\u007a\u0065";if _cefb ==nil {return nil ,_a .Error (_cccgb ,"b\u006f\u0078\u0065\u0073 '\u0062'\u0020\u006e\u006f\u0074\u0020d\u0065\u0066\u0069\u006e\u0065\u0064");};if len (*_cefb )==0{return _cefb ,nil ;};switch tp {case LocSelectWidth ,LocSelectHeight ,LocSelectIfEither ,LocSelectIfBoth :default:return nil ,_a .Errorf (_cccgb ,"\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 ,_a .Errorf (_cccgb ,"i\u006e\u0076\u0061\u006c\u0069\u0064 \u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u0020t\u0079\u0070\u0065:\u0020'\u0025\u0064\u0027",tp );};_beba :=_cefb .makeSizeIndicator (width ,height ,tp ,relation );_fbg ,_eea :=_cefb .selectWithIndicator (_beba );if _eea !=nil {return nil ,_a .Wrap (_eea ,_cccgb ,"");};return _fbg ,nil ;};func (_dcbb *Selection )setOrigin (_eeebg ,_bfdd int ){_dcbb .Cy ,_dcbb .Cx =_eeebg ,_bfdd };func (_cdc *Bitmap )AddBorderGeneral (left ,right ,top ,bot int ,val int )(*Bitmap ,error ){return _cdc .addBorderGeneral (left ,right ,top ,bot ,val );};func _gdcad (_edfdf ,_cdge ,_dagef byte )byte {return (_edfdf &^(_dagef ))|(_cdge &_dagef )};func (_ebbaa *Bitmaps )AddBox (box *_b .Rectangle ){_ebbaa .Boxes =append (_ebbaa .Boxes ,box )};func (_aggba *Bitmaps )selectByIndicator (_ffad *_dd .NumSlice )(_ddcbe *Bitmaps ,_bddbd error ){const _agdcb ="\u0042i\u0074\u006d\u0061\u0070s\u002e\u0073\u0065\u006c\u0065c\u0074B\u0079I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";if _aggba ==nil {return nil ,_a .Error (_agdcb ,"\u0027\u0062\u0027 b\u0069\u0074\u006d\u0061\u0070\u0073\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};if _ffad ==nil {return nil ,_a .Error (_agdcb ,"'\u006e\u0061\u0027\u0020\u0069\u006ed\u0069\u0063\u0061\u0074\u006f\u0072\u0073\u0020\u006eo\u0074\u0020\u0064e\u0066i\u006e\u0065\u0064");};if len (_aggba .Values )==0{return _aggba ,nil ;};if len (*_ffad )!=len (_aggba .Values ){return nil ,_a .Errorf (_agdcb ,"\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 (*_ffad ),len (_aggba .Values ));};var _afb ,_baba ,_dagg int ;for _baba =0;_baba < len (*_ffad );_baba ++{if _afb ,_bddbd =_ffad .GetInt (_baba );_bddbd !=nil {return nil ,_a .Wrap (_bddbd ,_agdcb ,"f\u0069\u0072\u0073\u0074\u0020\u0063\u0068\u0065\u0063\u006b");};if _afb ==1{_dagg ++;};};if _dagg ==len (_aggba .Values ){return _aggba ,nil ;};_ddcbe =&Bitmaps {};_gggc :=len (_aggba .Values )==len (_aggba .Boxes );for _baba =0;_baba < len (*_ffad );_baba ++{if _afb =int ((*_ffad )[_baba ]);_afb ==0{continue ;};_ddcbe .Values =append (_ddcbe .Values ,_aggba .Values [_baba ]);if _gggc {_ddcbe .Boxes =append (_ddcbe .Boxes ,_aggba .Boxes [_baba ]);};};return _ddcbe ,nil ;};func (_bgad *Bitmap )SizesEqual (s *Bitmap )bool {if _bgad ==s {return true ;};if _bgad .Width !=s .Width ||_bgad .Height !=s .Height {return false ;};return true ;};func _fccf (_cgdc ,_dbfg *Bitmap ,_gecg ,_ecea int )(*Bitmap ,error ){const _fdfb ="\u006fp\u0065\u006e\u0042\u0072\u0069\u0063k";if _dbfg ==nil {return nil ,_a .Error (_fdfb ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};if _gecg < 1&&_ecea < 1{return nil ,_a .Error (_fdfb ,"\u0068\u0053\u0069\u007ae \u003c\u0020\u0031\u0020\u0026\u0026\u0020\u0076\u0053\u0069\u007a\u0065\u0020\u003c \u0031");};if _gecg ==1&&_ecea ==1{return _dbfg .Copy (),nil ;};if _gecg ==1||_ecea ==1{var _fbdd error ;_gfde :=SelCreateBrick (_ecea ,_gecg ,_ecea /2,_gecg /2,SelHit );_cgdc ,_fbdd =_dgbg (_cgdc ,_dbfg ,_gfde );if _fbdd !=nil {return nil ,_a .Wrap (_fbdd ,_fdfb ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");};return _cgdc ,nil ;};_acbc :=SelCreateBrick (1,_gecg ,0,_gecg /2,SelHit );_bgcgg :=SelCreateBrick (_ecea ,1,_ecea /2,0,SelHit );_eddae ,_dcbc :=_eefe (nil ,_dbfg ,_acbc );if _dcbc !=nil {return nil ,_a .Wrap (_dcbc ,_fdfb ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");};_cgdc ,_dcbc =_eefe (_cgdc ,_eddae ,_bgcgg );if _dcbc !=nil {return nil ,_a .Wrap (_dcbc ,_fdfb ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};_ ,_dcbc =_dfaa (_eddae ,_cgdc ,_acbc );if _dcbc !=nil {return nil ,_a .Wrap (_dcbc ,_fdfb ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};_ ,_dcbc =_dfaa (_cgdc ,_eddae ,_bgcgg );if _dcbc !=nil {return nil ,_a .Wrap (_dcbc ,_fdfb ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};return _cgdc ,nil ;};func (_fgbfd *byWidth )Swap (i ,j int ){_fgbfd .Values [i ],_fgbfd .Values [j ]=_fgbfd .Values [j ],_fgbfd .Values [i ];if _fgbfd .Boxes !=nil {_fgbfd .Boxes [i ],_fgbfd .Boxes [j ]=_fgbfd .Boxes [j ],_fgbfd .Boxes [i ];};};const _fece =5000;func init (){for _gbb :=0;_gbb < 256;_gbb ++{_deae [_gbb ]=uint8 (_gbb &0x1)+(uint8 (_gbb >>1)&0x1)+(uint8 (_gbb >>2)&0x1)+(uint8 (_gbb >>3)&0x1)+(uint8 (_gbb >>4)&0x1)+(uint8 (_gbb >>5)&0x1)+(uint8 (_gbb >>6)&0x1)+(uint8 (_gbb >>7)&0x1);};};func (_fbeca Points )Size ()int {return len (_fbeca )};func (_afac *byHeight )Swap (i ,j int ){_afac .Values [i ],_afac .Values [j ]=_afac .Values [j ],_afac .Values [i ];if _afac .Boxes !=nil {_afac .Boxes [i ],_afac .Boxes [j ]=_afac .Boxes [j ],_afac .Boxes [i ];};};type Bitmaps struct{Values []*Bitmap ;Boxes []*_b .Rectangle ;};type Getter interface{GetBitmap ()*Bitmap ;};const (Vanilla Color =iota ;Chocolate ;);func TstESymbol (t *_da .T ,scale ...int )*Bitmap {_cccc ,_agbee :=NewWithData (4,5,[]byte {0xF0,0x80,0xE0,0x80,0xF0});_d .NoError (t ,_agbee );return TstGetScaledSymbol (t ,_cccc ,scale ...);};type BoundaryCondition int ;func (_dccf *Boxes )makeSizeIndicator (_aceg ,_gedd int ,_cfg LocationFilter ,_cec SizeComparison )*_dd .NumSlice {_bacb :=&_dd .NumSlice {};var _fdce ,_bgca ,_gfbc int ;for _ ,_ffebc :=range *_dccf {_fdce =0;_bgca ,_gfbc =_ffebc .Dx (),_ffebc .Dy ();switch _cfg {case LocSelectWidth :if (_cec ==SizeSelectIfLT &&_bgca < _aceg )||(_cec ==SizeSelectIfGT &&_bgca > _aceg )||(_cec ==SizeSelectIfLTE &&_bgca <=_aceg )||(_cec ==SizeSelectIfGTE &&_bgca >=_aceg ){_fdce =1;};case LocSelectHeight :if (_cec ==SizeSelectIfLT &&_gfbc < _gedd )||(_cec ==SizeSelectIfGT &&_gfbc > _gedd )||(_cec ==SizeSelectIfLTE &&_gfbc <=_gedd )||(_cec ==SizeSelectIfGTE &&_gfbc >=_gedd ){_fdce =1;};case LocSelectIfEither :if (_cec ==SizeSelectIfLT &&(_gfbc < _gedd ||_bgca < _aceg ))||(_cec ==SizeSelectIfGT &&(_gfbc > _gedd ||_bgca > _aceg ))||(_cec ==SizeSelectIfLTE &&(_gfbc <=_gedd ||_bgca <=_aceg ))||(_cec ==SizeSelectIfGTE &&(_gfbc >=_gedd ||_bgca >=_aceg )){_fdce =1;};case LocSelectIfBoth :if (_cec ==SizeSelectIfLT &&(_gfbc < _gedd &&_bgca < _aceg ))||(_cec ==SizeSelectIfGT &&(_gfbc > _gedd &&_bgca > _aceg ))||(_cec ==SizeSelectIfLTE &&(_gfbc <=_gedd &&_bgca <=_aceg ))||(_cec ==SizeSelectIfGTE &&(_gfbc >=_gedd &&_bgca >=_aceg )){_fdce =1;};};_bacb .AddInt (_fdce );};return _bacb ;};func CombineBytes (oldByte ,newByte byte ,op CombinationOperator )byte {return _fba (oldByte ,newByte ,op );};func (_dca *Bitmap )setBit (_dgac int ){_dca .Data [(_dgac >>3)]|=0x80>>uint (_dgac &7)};func (_bgfa *Bitmap )setEightFullBytes (_dfeg int ,_dde uint64 )error {if _dfeg +7> len (_bgfa .Data )-1{return _a .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");};_bgfa .Data [_dfeg ]=byte ((_dde &0xff00000000000000)>>56);_bgfa .Data [_dfeg +1]=byte ((_dde &0xff000000000000)>>48);_bgfa .Data [_dfeg +2]=byte ((_dde &0xff0000000000)>>40);_bgfa .Data [_dfeg +3]=byte ((_dde &0xff00000000)>>32);_bgfa .Data [_dfeg +4]=byte ((_dde &0xff000000)>>24);_bgfa .Data [_dfeg +5]=byte ((_dde &0xff0000)>>16);_bgfa .Data [_dfeg +6]=byte ((_dde &0xff00)>>8);_bgfa .Data [_dfeg +7]=byte (_dde &0xff);return nil ;};func (_cgfa *Bitmap )thresholdPixelSum (_dfa int )bool {var (_fdc int ;_cdfc uint8 ;_cad byte ;_aaea int ;);_dgf :=_cgfa .RowStride ;_fff :=uint (_cgfa .Width &0x07);if _fff !=0{_cdfc =uint8 ((0xff<<(8-_fff ))&0xff);_dgf --;};for _ggda :=0;_ggda < _cgfa .Height ;_ggda ++{for _aaea =0;_aaea < _dgf ;_aaea ++{_cad =_cgfa .Data [_ggda *_cgfa .RowStride +_aaea ];_fdc +=int (_deae [_cad ]);};if _fff !=0{_cad =_cgfa .Data [_ggda *_cgfa .RowStride +_aaea ]&_cdfc ;_fdc +=int (_deae [_cad ]);};if _fdc > _dfa {return true ;};};return false ;};var MorphBC BoundaryCondition ;func TstASymbol (t *_da .T )*Bitmap {t .Helper ();_ebda :=New (6,6);_d .NoError (t ,_ebda .SetPixel (1,0,1));_d .NoError (t ,_ebda .SetPixel (2,0,1));_d .NoError (t ,_ebda .SetPixel (3,0,1));_d .NoError (t ,_ebda .SetPixel (4,0,1));_d .NoError (t ,_ebda .SetPixel (5,1,1));_d .NoError (t ,_ebda .SetPixel (1,2,1));_d .NoError (t ,_ebda .SetPixel (2,2,1));_d .NoError (t ,_ebda .SetPixel (3,2,1));_d .NoError (t ,_ebda .SetPixel (4,2,1));_d .NoError (t ,_ebda .SetPixel (5,2,1));_d .NoError (t ,_ebda .SetPixel (0,3,1));_d .NoError (t ,_ebda .SetPixel (5,3,1));_d .NoError (t ,_ebda .SetPixel (0,4,1));_d .NoError (t ,_ebda .SetPixel (5,4,1));_d .NoError (t ,_ebda .SetPixel (1,5,1));_d .NoError (t ,_ebda .SetPixel (2,5,1));_d .NoError (t ,_ebda .SetPixel (3,5,1));_d .NoError (t ,_ebda .SetPixel (4,5,1));_d .NoError (t ,_ebda .SetPixel (5,5,1));return _ebda ;};func New (width ,height int )*Bitmap {_bdf :=_ega (width ,height );_bdf .Data =make ([]byte ,height *_bdf .RowStride );return _bdf ;};type shift int ;func (_dgafd *Bitmap )connComponentsBB (_gega int )(_cdage *Boxes ,_gfgc error ){const _ffcdb ="\u0042\u0069\u0074ma\u0070\u002e\u0063\u006f\u006e\u006e\u0043\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074\u0073\u0042\u0042";if _gega !=4&&_gega !=8{return nil ,_a .Error (_ffcdb ,"\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 _dgafd .Zero (){return &Boxes {},nil ;};_dgafd .setPadBits (0);_fed ,_gfgc :=_fffe (nil ,_dgafd );if _gfgc !=nil {return nil ,_a .Wrap (_gfgc ,_ffcdb ,"\u0062\u006d\u0031");};_gfeg :=&_dd .Stack {};_gfeg .Aux =&_dd .Stack {};_cdage =&Boxes {};var (_dggaf ,_bgbf int ;_gcea _b .Point ;_edfd bool ;_dbgf *_b .Rectangle ;);for {if _gcea ,_edfd ,_gfgc =_fed .nextOnPixel (_bgbf ,_dggaf );_gfgc !=nil {return nil ,_a .Wrap (_gfgc ,_ffcdb ,"");};if !_edfd {break ;};if _dbgf ,_gfgc =_eeefd (_fed ,_gfeg ,_gcea .X ,_gcea .Y ,_gega );_gfgc !=nil {return nil ,_a .Wrap (_gfgc ,_ffcdb ,"");};if _gfgc =_cdage .Add (_dbgf );_gfgc !=nil {return nil ,_a .Wrap (_gfgc ,_ffcdb ,"");};_bgbf =_gcea .X ;_dggaf =_gcea .Y ;};return _cdage ,nil ;};func _afaa (_cbfd ,_fecg *Bitmap ,_fcae *Selection )(*Bitmap ,error ){const _dad ="c\u006c\u006f\u0073\u0065\u0042\u0069\u0074\u006d\u0061\u0070";var _adc error ;if _cbfd ,_adc =_gegcc (_cbfd ,_fecg ,_fcae );_adc !=nil {return nil ,_adc ;};_cffd ,_adc :=_dfaa (nil ,_fecg ,_fcae );if _adc !=nil {return nil ,_a .Wrap (_adc ,_dad ,"");};if _ ,_adc =_eefe (_cbfd ,_cffd ,_fcae );_adc !=nil {return nil ,_a .Wrap (_adc ,_dad ,"");};return _cbfd ,nil ;};type Color int ;func (_egda *ClassedPoints )Len ()int {return _egda .IntSlice .Size ()};func _debc (_gffd *Bitmap ,_faafa *_dd .Stack ,_adccd ,_degfd int )(_fcdf *_b .Rectangle ,_aggb error ){const _bgea ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";if _gffd ==nil {return nil ,_a .Error (_bgea ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");};if _faafa ==nil {return nil ,_a .Error (_bgea ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");};_dddcb ,_dgee :=_gffd .Width ,_gffd .Height ;_ffea :=_dddcb -1;_afdbg :=_dgee -1;if _adccd < 0||_adccd > _ffea ||_degfd < 0||_degfd > _afdbg ||!_gffd .GetPixel (_adccd ,_degfd ){return nil ,nil ;};var _dbbec *_b .Rectangle ;_dbbec ,_aggb =Rect (100000,100000,0,0);if _aggb !=nil {return nil ,_a .Wrap (_aggb ,_bgea ,"");};if _aggb =_adee (_faafa ,_adccd ,_adccd ,_degfd ,1,_afdbg ,_dbbec );_aggb !=nil {return nil ,_a .Wrap (_aggb ,_bgea ,"\u0069\u006e\u0069t\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _aggb =_adee (_faafa ,_adccd ,_adccd ,_degfd +1,-1,_afdbg ,_dbbec );_aggb !=nil {return nil ,_a .Wrap (_aggb ,_bgea ,"\u0032\u006ed\u0020\u0069\u006ei\u0074\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};_dbbec .Min .X ,_dbbec .Max .X =_adccd ,_adccd ;_dbbec .Min .Y ,_dbbec .Max .Y =_degfd ,_degfd ;var (_egdb *fillSegment ;_cagdg int ;);for _faafa .Len ()> 0{if _egdb ,_aggb =_cedf (_faafa );_aggb !=nil {return nil ,_a .Wrap (_aggb ,_bgea ,"");};_degfd =_egdb ._faee ;for _adccd =_egdb ._ecdcb ;_adccd >=0&&_gffd .GetPixel (_adccd ,_degfd );_adccd --{if _aggb =_gffd .SetPixel (_adccd ,_degfd ,0);_aggb !=nil {return nil ,_a .Wrap (_aggb ,_bgea ,"");};};if _adccd >=_egdb ._ecdcb {for _adccd ++;_adccd <=_egdb ._edeag &&_adccd <=_ffea &&!_gffd .GetPixel (_adccd ,_degfd );_adccd ++{};_cagdg =_adccd ;if !(_adccd <=_egdb ._edeag &&_adccd <=_ffea ){continue ;};}else {_cagdg =_adccd +1;if _cagdg < _egdb ._ecdcb -1{if _aggb =_adee (_faafa ,_cagdg ,_egdb ._ecdcb -1,_egdb ._faee ,-_egdb ._gade ,_afdbg ,_dbbec );_aggb !=nil {return nil ,_a .Wrap (_aggb ,_bgea ,"\u006c\u0065\u0061\u006b\u0020\u006f\u006e\u0020\u006c\u0065\u0066\u0074 \u0073\u0069\u0064\u0065");};};_adccd =_egdb ._ecdcb +1;};for {for ;_adccd <=_ffea &&_gffd .GetPixel (_adccd ,_degfd );_adccd ++{if _aggb =_gffd .SetPixel (_adccd ,_degfd ,0);_aggb !=nil {return nil ,_a .Wrap (_aggb ,_bgea ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _aggb =_adee (_faafa ,_cagdg ,_adccd -1,_egdb ._faee ,_egdb ._gade ,_afdbg ,_dbbec );_aggb !=nil {return nil ,_a .Wrap (_aggb ,_bgea ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _adccd > _egdb ._edeag +1{if _aggb =_adee (_faafa ,_egdb ._edeag +1,_adccd -1,_egdb ._faee ,-_egdb ._gade ,_afdbg ,_dbbec );_aggb !=nil {return nil ,_a .Wrap (_aggb ,_bgea ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");};};for _adccd ++;_adccd <=_egdb ._edeag &&_adccd <=_ffea &&!_gffd .GetPixel (_adccd ,_degfd );_adccd ++{};_cagdg =_adccd ;if !(_adccd <=_egdb ._edeag &&_adccd <=_ffea ){break ;};};};_dbbec .Max .X ++;_dbbec .Max .Y ++;return _dbbec ,nil ;};func (_ccaea *Bitmaps )SelectByIndexes (idx []int )(*Bitmaps ,error ){const _ffce ="B\u0069\u0074\u006d\u0061\u0070\u0073.\u0053\u006f\u0072\u0074\u0049\u006e\u0064\u0065\u0078e\u0073\u0042\u0079H\u0065i\u0067\u0068\u0074";_ccabc ,_gcec :=_ccaea .selectByIndexes (idx );if _gcec !=nil {return nil ,_a .Wrap (_gcec ,_ffce ,"");};return _ccabc ,nil ;};func Extract (roi _b .Rectangle ,src *Bitmap )(*Bitmap ,error ){_edea :=New (roi .Dx (),roi .Dy ());_dabg :=roi .Min .X &0x07;_egdd :=8-_dabg ;_begge :=uint (8-_edea .Width &0x07);_efce :=src .GetByteIndex (roi .Min .X ,roi .Min .Y );_aaga :=src .GetByteIndex (roi .Max .X -1,roi .Min .Y );_dgfg :=_edea .RowStride ==_aaga +1-_efce ;var _beec int ;for _gbbc :=roi .Min .Y ;_gbbc < roi .Max .Y ;_gbbc ++{_efgd :=_efce ;_dgef :=_beec ;switch {case _efce ==_aaga :_afgb ,_afa :=src .GetByte (_efgd );if _afa !=nil {return nil ,_afa ;};_afgb <<=uint (_dabg );_afa =_edea .SetByte (_dgef ,_gdd (_begge ,_afgb ));if _afa !=nil {return nil ,_afa ;};case _dabg ==0:for _dgcae :=_efce ;_dgcae <=_aaga ;_dgcae ++{_gbc ,_babb :=src .GetByte (_efgd );if _babb !=nil {return nil ,_babb ;};_efgd ++;if _dgcae ==_aaga &&_dgfg {_gbc =_gdd (_begge ,_gbc );};_babb =_edea .SetByte (_dgef ,_gbc );if _babb !=nil {return nil ,_babb ;};_dgef ++;};default:_fcb :=_dgdc (src ,_edea ,uint (_dabg ),uint (_egdd ),_begge ,_efce ,_aaga ,_dgfg ,_efgd ,_dgef );if _fcb !=nil {return nil ,_fcb ;};};_efce +=src .RowStride ;_aaga +=src .RowStride ;_beec +=_edea .RowStride ;};return _edea ,nil ;};func RankHausTest (p1 ,p2 ,p3 ,p4 *Bitmap ,delX ,delY float32 ,maxDiffW ,maxDiffH ,area1 ,area3 int ,rank float32 ,tab8 []int )(_ccef bool ,_abee error ){const _gebd ="\u0052\u0061\u006ek\u0048\u0061\u0075\u0073\u0054\u0065\u0073\u0074";_fbae ,_baed :=p1 .Width ,p1 .Height ;_bade ,_debbe :=p3 .Width ,p3 .Height ;if _dd .Abs (_fbae -_bade )> maxDiffW {return false ,nil ;};if _dd .Abs (_baed -_debbe )> maxDiffH {return false ,nil ;};_bedc :=int (float32 (area1 )*(1.0-rank )+0.5);_ccfg :=int (float32 (area3 )*(1.0-rank )+0.5);var _bfdb ,_ccec int ;if delX >=0{_bfdb =int (delX +0.5);}else {_bfdb =int (delX -0.5);};if delY >=0{_ccec =int (delY +0.5);}else {_ccec =int (delY -0.5);};_bgfd :=p1 .CreateTemplate ();if _abee =_bgfd .RasterOperation (0,0,_fbae ,_baed ,PixSrc ,p1 ,0,0);_abee !=nil {return false ,_a .Wrap (_abee ,_gebd ,"p\u0031\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _abee =_bgfd .RasterOperation (_bfdb ,_ccec ,_fbae ,_baed ,PixNotSrcAndDst ,p4 ,0,0);_abee !=nil {return false ,_a .Wrap (_abee ,_gebd ,"\u0074 \u0026\u0020\u0021\u0070\u0034");};_ccef ,_abee =_bgfd .ThresholdPixelSum (_bedc ,tab8 );if _abee !=nil {return false ,_a .Wrap (_abee ,_gebd ,"\u0074\u002d\u003e\u0074\u0068\u0072\u0065\u0073\u0068\u0031");};if _ccef {return false ,nil ;};if _abee =_bgfd .RasterOperation (_bfdb ,_ccec ,_bade ,_debbe ,PixSrc ,p3 ,0,0);_abee !=nil {return false ,_a .Wrap (_abee ,_gebd ,"p\u0033\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _abee =_bgfd .RasterOperation (0,0,_bade ,_debbe ,PixNotSrcAndDst ,p2 ,0,0);_abee !=nil {return false ,_a .Wrap (_abee ,_gebd ,"\u0074 \u0026\u0020\u0021\u0070\u0032");};_ccef ,_abee =_bgfd .ThresholdPixelSum (_ccfg ,tab8 );if _abee !=nil {return false ,_a .Wrap (_abee ,_gebd ,"\u0074\u002d\u003e\u0074\u0068\u0072\u0065\u0073\u0068\u0033");};return !_ccef ,nil ;};func _aafe (_fggc ,_bfgf int )int {if _fggc > _bfgf {return _fggc ;};return _bfgf ;};func (_debb *Bitmap )resizeImageData (_gea *Bitmap )error {if _gea ==nil {return _a .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 _debb .SizesEqual (_gea ){return nil ;};_debb .Data =make ([]byte ,len (_gea .Data ));_debb .Width =_gea .Width ;_debb .Height =_gea .Height ;_debb .RowStride =_gea .RowStride ;return nil ;};func (_dddg *Bitmap )GetByte (index int )(byte ,error ){if index > len (_dddg .Data )-1||index < 0{return 0,_a .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 _dddg .Data [index ],nil ;};var (_bge =[]byte {0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF};_gbbb =[]byte {0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};);func (_aacf *ClassedPoints )xSortFunction ()func (_gefc int ,_bgcf int )bool {return func (_gceg ,_agfc int )bool {return _aacf .XAtIndex (_gceg )< _aacf .XAtIndex (_agfc )};};func (_babe *BitmapsArray )GetBitmaps (i int )(*Bitmaps ,error ){const _bdcf ="\u0042\u0069\u0074ma\u0070\u0073\u0041\u0072\u0072\u0061\u0079\u002e\u0047\u0065\u0074\u0042\u0069\u0074\u006d\u0061\u0070\u0073";if _babe ==nil {return nil ,_a .Error (_bdcf ,"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 (_babe .Values )-1{return nil ,_a .Errorf (_bdcf ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return _babe .Values [i ],nil ;};func (_eagaa MorphProcess )getWidthHeight ()(_ffge ,_gddd int ){return _eagaa .Arguments [0],_eagaa .Arguments [1];};func _ebb (_db *Bitmap ,_ebc int )(*Bitmap ,error ){const _cc ="\u0065x\u0070a\u006e\u0064\u0042\u0069\u006ea\u0072\u0079P\u006f\u0077\u0065\u0072\u0032";if _db ==nil {return nil ,_a .Error (_cc ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _ebc ==1{return _fffe (nil ,_db );};if _ebc !=2&&_ebc !=4&&_ebc !=8{return nil ,_a .Error (_cc ,"\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");};_bf :=_ebc *_db .Width ;_ed :=_ebc *_db .Height ;_df :=New (_bf ,_ed );var _eag error ;switch _ebc {case 2:_eag =_g (_df ,_db );case 4:_eag =_dcd (_df ,_db );case 8:_eag =_gdc (_df ,_db );};if _eag !=nil {return nil ,_a .Wrap (_eag ,_cc ,"");};return _df ,nil ;};func _bgdc (_faba int )int {if _faba < 0{return -_faba ;};return _faba ;};func (_cdg *Bitmap )GetVanillaData ()[]byte {if _cdg .Color ==Chocolate {_cdg .inverseData ();};return _cdg .Data ;};func _cgfb (_bdfe ,_edcg *Bitmap ,_gcda CombinationOperator )*Bitmap {_dfdg :=New (_bdfe .Width ,_bdfe .Height );for _abca :=0;_abca < len (_dfdg .Data );_abca ++{_dfdg .Data [_abca ]=_fba (_bdfe .Data [_abca ],_edcg .Data [_abca ],_gcda );};return _dfdg ;};func (_bef *Bitmap )setPadBits (_ecab int ){_ggff :=8-_bef .Width %8;if _ggff ==8{return ;};_aed :=_bef .Width /8;_afd :=_gbbb [_ggff ];if _ecab ==0{_afd ^=_afd ;};var _bbfg int ;for _ded :=0;_ded < _bef .Height ;_ded ++{_bbfg =_ded *_bef .RowStride +_aed ;if _ecab ==0{_bef .Data [_bbfg ]&=_afd ;}else {_bef .Data [_bbfg ]|=_afd ;};};};func _bffe (_gfgb ,_cegce int ,_abdf string )*Selection {_caae :=&Selection {Height :_gfgb ,Width :_cegce ,Name :_abdf };_caae .Data =make ([][]SelectionValue ,_gfgb );for _fadg :=0;_fadg < _gfgb ;_fadg ++{_caae .Data [_fadg ]=make ([]SelectionValue ,_cegce );};return _caae ;};func (_gedc *Bitmap )ConnComponents (bms *Bitmaps ,connectivity int )(_bgcd *Boxes ,_bgcg error ){const _ddad ="B\u0069\u0074\u006d\u0061p.\u0043o\u006e\u006e\u0043\u006f\u006dp\u006f\u006e\u0065\u006e\u0074\u0073";if _gedc ==nil {return nil ,_a .Error (_ddad ,"\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 ,_a .Error (_ddad ,"\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 _bgcd ,_bgcg =_gedc .connComponentsBB (connectivity );_bgcg !=nil {return nil ,_a .Wrap (_bgcg ,_ddad ,"");};}else {if _bgcd ,_bgcg =_gedc .connComponentsBitmapsBB (bms ,connectivity );_bgcg !=nil {return nil ,_a .Wrap (_bgcg ,_ddad ,"");};};return _bgcd ,nil ;};func (_fegb *Bitmaps )GetBitmap (i int )(*Bitmap ,error ){const _egfb ="\u0047e\u0074\u0042\u0069\u0074\u006d\u0061p";if _fegb ==nil {return nil ,_a .Error (_egfb ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0042\u0069\u0074ma\u0070\u0073");};if i > len (_fegb .Values )-1{return nil ,_a .Errorf (_egfb ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return _fegb .Values [i ],nil ;};func _aee (_baef ,_ddca *Bitmap ,_gfed int ,_gbf []byte ,_ebba int )(_ebe error ){const _dbb ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0034";var (_bba ,_adgb ,_egfe ,_adeg ,_dba ,_feg ,_gga ,_adb int ;_ggad ,_afe uint32 ;_gfg ,_ffeg byte ;_gbd uint16 ;);_dcb :=make ([]byte ,4);_bff :=make ([]byte ,4);for _egfe =0;_egfe < _baef .Height -1;_egfe ,_adeg =_egfe +2,_adeg +1{_bba =_egfe *_baef .RowStride ;_adgb =_adeg *_ddca .RowStride ;for _dba ,_feg =0,0;_dba < _ebba ;_dba ,_feg =_dba +4,_feg +1{for _gga =0;_gga < 4;_gga ++{_adb =_bba +_dba +_gga ;if _adb <=len (_baef .Data )-1&&_adb < _bba +_baef .RowStride {_dcb [_gga ]=_baef .Data [_adb ];}else {_dcb [_gga ]=0x00;};_adb =_bba +_baef .RowStride +_dba +_gga ;if _adb <=len (_baef .Data )-1&&_adb < _bba +(2*_baef .RowStride ){_bff [_gga ]=_baef .Data [_adb ];}else {_bff [_gga ]=0x00;};};_ggad =_c .BigEndian .Uint32 (_dcb );_afe =_c .BigEndian .Uint32 (_bff );_afe &=_ggad ;_afe &=_afe <<1;_afe &=0xaaaaaaaa;_ggad =_afe |(_afe <<7);_gfg =byte (_ggad >>24);_ffeg =byte ((_ggad >>8)&0xff);_adb =_adgb +_feg ;if _adb +1==len (_ddca .Data )-1||_adb +1>=_adgb +_ddca .RowStride {_ddca .Data [_adb ]=_gbf [_gfg ];if _ebe =_ddca .SetByte (_adb ,_gbf [_gfg ]);_ebe !=nil {return _a .Wrapf (_ebe ,_dbb ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_adb );};}else {_gbd =(uint16 (_gbf [_gfg ])<<8)|uint16 (_gbf [_ffeg ]);if _ebe =_ddca .setTwoBytes (_adb ,_gbd );_ebe !=nil {return _a .Wrapf (_ebe ,_dbb ,"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",_adb );};_feg ++;};};};return nil ;};func TstImageBitmap ()*Bitmap {return _bedgd .Copy ()};func (_eccb *ClassedPoints )Swap (i ,j int ){_eccb .IntSlice [i ],_eccb .IntSlice [j ]=_eccb .IntSlice [j ],_eccb .IntSlice [i ];};var _bbfc =[5]int {1,2,3,0,4};func (_bfegc *Bitmaps )Size ()int {return len (_bfegc .Values )};func (_bdee *byWidth )Len ()int {return len (_bdee .Values )};func (_fcg *Bitmap )GetUnpaddedData ()([]byte ,error ){_ceg :=uint (_fcg .Width &0x07);if _ceg ==0{return _fcg .Data ,nil ;};_bfe :=_fcg .Width *_fcg .Height ;if _bfe %8!=0{_bfe >>=3;_bfe ++;}else {_bfe >>=3;};_edgb :=make ([]byte ,_bfe );_ebg :=_dda .NewWriterMSB (_edgb );const _ecbc ="\u0047e\u0074U\u006e\u0070\u0061\u0064\u0064\u0065\u0064\u0044\u0061\u0074\u0061";for _geb :=0;_geb < _fcg .Height ;_geb ++{for _bfg :=0;_bfg < _fcg .RowStride ;_bfg ++{_efbd :=_fcg .Data [_geb *_fcg .RowStride +_bfg ];if _bfg !=_fcg .RowStride -1{_bgc :=_ebg .WriteByte (_efbd );if _bgc !=nil {return nil ,_a .Wrap (_bgc ,_ecbc ,"");};continue ;};for _bga :=uint (0);_bga < _ceg ;_bga ++{_ffeb :=_ebg .WriteBit (int (_efbd >>(7-_bga )&0x01));if _ffeb !=nil {return nil ,_a .Wrap (_ffeb ,_ecbc ,"");};};};};return _edgb ,nil ;};func _ccab (_agca ,_bcfe ,_agde *Bitmap )(*Bitmap ,error ){const _acg ="\u0073\u0075\u0062\u0074\u0072\u0061\u0063\u0074";if _bcfe ==nil {return nil ,_a .Error (_acg ,"'\u0073\u0031\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _agde ==nil {return nil ,_a .Error (_acg ,"'\u0073\u0032\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};var _gaea error ;switch {case _agca ==_bcfe :if _gaea =_agca .RasterOperation (0,0,_bcfe .Width ,_bcfe .Height ,PixNotSrcAndDst ,_agde ,0,0);_gaea !=nil {return nil ,_a .Wrap (_gaea ,_acg ,"\u0064 \u003d\u003d\u0020\u0073\u0031");};case _agca ==_agde :if _gaea =_agca .RasterOperation (0,0,_bcfe .Width ,_bcfe .Height ,PixNotSrcAndDst ,_bcfe ,0,0);_gaea !=nil {return nil ,_a .Wrap (_gaea ,_acg ,"\u0064 \u003d\u003d\u0020\u0073\u0032");};default:_agca ,_gaea =_fffe (_agca ,_bcfe );if _gaea !=nil {return nil ,_a .Wrap (_gaea ,_acg ,"");};if _gaea =_agca .RasterOperation (0,0,_bcfe .Width ,_bcfe .Height ,PixNotSrcAndDst ,_agde ,0,0);_gaea !=nil {return nil ,_a .Wrap (_gaea ,_acg ,"\u0064e\u0066\u0061\u0075\u006c\u0074");};};return _agca ,nil ;};func (_fega *Bitmaps )GetBox (i int )(*_b .Rectangle ,error ){const _aefab ="\u0047\u0065\u0074\u0042\u006f\u0078";if _fega ==nil {return nil ,_a .Error (_aefab ,"\u0070\u0072\u006f\u0076id\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0042\u0069\u0074\u006d\u0061\u0070s\u0027");};if i > len (_fega .Boxes )-1{return nil ,_a .Errorf (_aefab ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return _fega .Boxes [i ],nil ;};func (_aade Points )YSorter ()func (_gfbb ,_gbbg int )bool {return func (_dbeeb ,_ebbd int )bool {return _aade [_dbeeb ].Y < _aade [_ebbd ].Y };};func Centroid (bm *Bitmap ,centTab ,sumTab []int )(Point ,error ){return bm .centroid (centTab ,sumTab )};func (_badf *Bitmap )String ()string {var _dgad ="\u000a";for _dgg :=0;_dgg < _badf .Height ;_dgg ++{var _dff string ;for _cg :=0;_cg < _badf .Width ;_cg ++{_aac :=_badf .GetPixel (_cg ,_dgg );if _aac {_dff +="\u0031";}else {_dff +="\u0030";};};_dgad +=_dff +"\u000a";};return _dgad ;};func TstAddSymbol (t *_da .T ,bms *Bitmaps ,sym *Bitmap ,x *int ,y int ,space int ){bms .AddBitmap (sym );_dfaad :=_b .Rect (*x ,y ,*x +sym .Width ,y +sym .Height );bms .AddBox (&_dfaad );*x +=sym .Width +space ;};func (_degf MorphProcess )verify (_deab int ,_dedg ,_cebe *int )error {const _cgbc ="\u004d\u006f\u0072\u0070hP\u0072\u006f\u0063\u0065\u0073\u0073\u002e\u0076\u0065\u0072\u0069\u0066\u0079";switch _degf .Operation {case MopDilation ,MopErosion ,MopOpening ,MopClosing :if len (_degf .Arguments )!=2{return _a .Error (_cgbc ,"\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");};_cdga ,_dcbd :=_degf .getWidthHeight ();if _cdga <=0||_dcbd <=0{return _a .Error (_cgbc ,"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 :_abcf :=len (_degf .Arguments );*_dedg +=_abcf ;if _abcf < 1||_abcf > 4{return _a .Error (_cgbc ,"\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 _deag :=0;_deag < _abcf ;_deag ++{if _degf .Arguments [_deag ]< 1||_degf .Arguments [_deag ]> 4{return _a .Error (_cgbc ,"\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 (_degf .Arguments )==0{return _a .Error (_cgbc ,"\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");};_agbgd :=_degf .Arguments [0];if _agbgd !=2&&_agbgd !=4&&_agbgd !=8{return _a .Error (_cgbc ,"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");};*_dedg -=_bbfc [_agbgd /4];case MopAddBorder :if len (_degf .Arguments )==0{return _a .Error (_cgbc ,"\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");};_ggef :=_degf .Arguments [0];if _deab > 0{return _a .Error (_cgbc ,"\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 _ggef < 1{return _a .Error (_cgbc ,"\u0041\u0064\u0064\u0042o\u0072\u0064\u0065\u0072\u0020\u0076\u0061\u006c\u0075\u0065 \u006co\u0077\u0065\u0072\u0020\u0074\u0068\u0061n\u0020\u0030");};*_cebe =_ggef ;};return nil ;};func _bbaf (_bgagg *Bitmap ,_gbgbf ...MorphProcess )(_bfeda *Bitmap ,_abbg error ){const _edda ="\u006d\u006f\u0072\u0070\u0068\u0053\u0065\u0071\u0075\u0065\u006e\u0063\u0065";if _bgagg ==nil {return nil ,_a .Error (_edda ,"\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 (_gbgbf )==0{return nil ,_a .Error (_edda ,"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 _abbg =_bdcc (_gbgbf ...);_abbg !=nil {return nil ,_a .Wrap (_abbg ,_edda ,"");};var _dgdd ,_eaaga ,_dfaf int ;_bfeda =_bgagg .Copy ();for _ ,_dgfc :=range _gbgbf {switch _dgfc .Operation {case MopDilation :_dgdd ,_eaaga =_dgfc .getWidthHeight ();_bfeda ,_abbg =DilateBrick (nil ,_bfeda ,_dgdd ,_eaaga );if _abbg !=nil {return nil ,_a .Wrap (_abbg ,_edda ,"");};case MopErosion :_dgdd ,_eaaga =_dgfc .getWidthHeight ();_bfeda ,_abbg =_gded (nil ,_bfeda ,_dgdd ,_eaaga );if _abbg !=nil {return nil ,_a .Wrap (_abbg ,_edda ,"");};case MopOpening :_dgdd ,_eaaga =_dgfc .getWidthHeight ();_bfeda ,_abbg =_fccf (nil ,_bfeda ,_dgdd ,_eaaga );if _abbg !=nil {return nil ,_a .Wrap (_abbg ,_edda ,"");};case MopClosing :_dgdd ,_eaaga =_dgfc .getWidthHeight ();_bfeda ,_abbg =_ceaa (nil ,_bfeda ,_dgdd ,_eaaga );if _abbg !=nil {return nil ,_a .Wrap (_abbg ,_edda ,"");};case MopRankBinaryReduction :_bfeda ,_abbg =_dce (_bfeda ,_dgfc .Arguments ...);if _abbg !=nil {return nil ,_a .Wrap (_abbg ,_edda ,"");};case MopReplicativeBinaryExpansion :_bfeda ,_abbg =_ebge (_bfeda ,_dgfc .Arguments [0]);if _abbg !=nil {return nil ,_a .Wrap (_abbg ,_edda ,"");};case MopAddBorder :_dfaf =_dgfc .Arguments [0];_bfeda ,_abbg =_bfeda .AddBorder (_dfaf ,0);if _abbg !=nil {return nil ,_a .Wrap (_abbg ,_edda ,"");};default:return nil ,_a .Error (_edda ,"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 _dfaf > 0{_bfeda ,_abbg =_bfeda .RemoveBorder (_dfaf );if _abbg !=nil {return nil ,_a .Wrap (_abbg ,_edda ,"\u0062\u006f\u0072\u0064\u0065\u0072\u0020\u003e\u0020\u0030");};};return _bfeda ,nil ;};func _bdcc (_bcdc ...MorphProcess )(_ecdc error ){const _bbbe ="v\u0065r\u0069\u0066\u0079\u004d\u006f\u0072\u0070\u0068P\u0072\u006f\u0063\u0065ss\u0065\u0073";var _dfdgg ,_decf int ;for _baec ,_ggdb :=range _bcdc {if _ecdc =_ggdb .verify (_baec ,&_dfdgg ,&_decf );_ecdc !=nil {return _a .Wrap (_ecdc ,_bbbe ,"");};};if _decf !=0&&_dfdgg !=0{return _a .Error (_bbbe ,"\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 TstTSymbol (t *_da .T ,scale ...int )*Bitmap {_ebfdd ,_fgda :=NewWithData (5,5,[]byte {0xF8,0x20,0x20,0x20,0x20});_d .NoError (t ,_fgda );return TstGetScaledSymbol (t ,_ebfdd ,scale ...);};func (_edec *Bitmap )InverseData (){_edec .inverseData ()};func _babbd (_febg *Bitmap ,_bgda ,_abac ,_aeec ,_dfbcg int ,_aacec RasterOperator ,_bgfg *Bitmap ,_cfddf ,_fddgc int )error {const _efbf ="\u0072a\u0073t\u0065\u0072\u004f\u0070\u0065\u0072\u0061\u0074\u0069\u006f\u006e";if _febg ==nil {return _a .Error (_efbf ,"\u006e\u0069\u006c\u0020\u0027\u0064\u0065\u0073\u0074\u0027\u0020\u0042i\u0074\u006d\u0061\u0070");};if _aacec ==PixDst {return nil ;};switch _aacec {case PixClr ,PixSet ,PixNotDst :_fddb (_febg ,_bgda ,_abac ,_aeec ,_dfbcg ,_aacec );return nil ;};if _bgfg ==nil {_be .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 _a .Error (_efbf ,"\u006e\u0069l\u0020\u0027\u0073r\u0063\u0027\u0020\u0062\u0069\u0074\u006d\u0061\u0070");};if _fage :=_cbgdc (_febg ,_bgda ,_abac ,_aeec ,_dfbcg ,_aacec ,_bgfg ,_cfddf ,_fddgc );_fage !=nil {return _a .Wrap (_fage ,_efbf ,"");};return nil ;};func (_cceg Points )GetGeometry (i int )(_ffcc ,_agcec float32 ,_feaa error ){if i > len (_cceg )-1{return 0,0,_a .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 );};_gbbe :=_cceg [i ];return _gbbe .X ,_gbbe .Y ,nil ;};type CombinationOperator int ;func (_febgf *Bitmaps )selectByIndexes (_dgcd []int )(*Bitmaps ,error ){_edff :=&Bitmaps {};for _ ,_efge :=range _dgcd {_bbabea ,_dfcd :=_febgf .GetBitmap (_efge );if _dfcd !=nil {return nil ,_a .Wrap (_dfcd ,"\u0073e\u006ce\u0063\u0074\u0042\u0079\u0049\u006e\u0064\u0065\u0078\u0065\u0073","");};_edff .AddBitmap (_bbabea );};return _edff ,nil ;};func (_abgc *Bitmap )addBorderGeneral (_dbgd ,_abed ,_agb ,_dae int ,_cfff int )(*Bitmap ,error ){const _bfec ="\u0061\u0064d\u0042\u006f\u0072d\u0065\u0072\u0047\u0065\u006e\u0065\u0072\u0061\u006c";if _dbgd < 0||_abed < 0||_agb < 0||_dae < 0{return nil ,_a .Error (_bfec ,"n\u0065\u0067\u0061\u0074iv\u0065 \u0062\u006f\u0072\u0064\u0065r\u0020\u0061\u0064\u0064\u0065\u0064");};_eda ,_ceag :=_abgc .Width ,_abgc .Height ;_ffc :=_eda +_dbgd +_abed ;_cef :=_ceag +_agb +_dae ;_dfe :=New (_ffc ,_cef );_dfe .Color =_abgc .Color ;_fecb :=PixClr ;if _cfff > 0{_fecb =PixSet ;};_dgd :=_dfe .RasterOperation (0,0,_dbgd ,_cef ,_fecb ,nil ,0,0);if _dgd !=nil {return nil ,_a .Wrap (_dgd ,_bfec ,"\u006c\u0065\u0066\u0074");};_dgd =_dfe .RasterOperation (_ffc -_abed ,0,_abed ,_cef ,_fecb ,nil ,0,0);if _dgd !=nil {return nil ,_a .Wrap (_dgd ,_bfec ,"\u0072\u0069\u0067h\u0074");};_dgd =_dfe .RasterOperation (0,0,_ffc ,_agb ,_fecb ,nil ,0,0);if _dgd !=nil {return nil ,_a .Wrap (_dgd ,_bfec ,"\u0074\u006f\u0070");};_dgd =_dfe .RasterOperation (0,_cef -_dae ,_ffc ,_dae ,_fecb ,nil ,0,0);if _dgd !=nil {return nil ,_a .Wrap (_dgd ,_bfec ,"\u0062\u006f\u0074\u0074\u006f\u006d");};_dgd =_dfe .RasterOperation (_dbgd ,_agb ,_eda ,_ceag ,PixSrc ,_abgc ,0,0);if _dgd !=nil {return nil ,_a .Wrap (_dgd ,_bfec ,"\u0063\u006f\u0070\u0079");};return _dfe ,nil ;};func (_afdf *Bitmaps )GroupByHeight ()(*BitmapsArray ,error ){const _fce ="\u0047\u0072\u006f\u0075\u0070\u0042\u0079\u0048\u0065\u0069\u0067\u0068\u0074";if len (_afdf .Values )==0{return nil ,_a .Error (_fce ,"\u006eo\u0020v\u0061\u006c\u0075\u0065\u0073 \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");};_bcde :=&BitmapsArray {};_afdf .SortByHeight ();_ggeba :=-1;_ebegg :=-1;for _bbeg :=0;_bbeg < len (_afdf .Values );_bbeg ++{_cagda :=_afdf .Values [_bbeg ].Height ;if _cagda > _ggeba {_ggeba =_cagda ;_ebegg ++;_bcde .Values =append (_bcde .Values ,&Bitmaps {});};_bcde .Values [_ebegg ].AddBitmap (_afdf .Values [_bbeg ]);};return _bcde ,nil ;};func _cage (_bbdb *Bitmap ,_aagdc ,_ddbe ,_deagg ,_efcc int ,_gcgb RasterOperator ,_dbdf *Bitmap ,_eaab ,_cfga int )error {var (_fdeb bool ;_fac bool ;_bcee byte ;_accbe int ;_fdcg int ;_cded int ;_bedg int ;_fddf bool ;_bdcde int ;_fdfd int ;_adgge int ;_fdba bool ;_gegf byte ;_cfaaf int ;_cdaa int ;_gccd int ;_bcbbc byte ;_efafd int ;_edadb int ;_gbdac uint ;_ddeb uint ;_baegg byte ;_affcf shift ;_cgcg bool ;_agaaa bool ;_aeeg ,_bebfc int ;);if _eaab &7!=0{_edadb =8-(_eaab &7);};if _aagdc &7!=0{_fdcg =8-(_aagdc &7);};if _edadb ==0&&_fdcg ==0{_baegg =_gbbb [0];}else {if _fdcg > _edadb {_gbdac =uint (_fdcg -_edadb );}else {_gbdac =uint (8-(_edadb -_fdcg ));};_ddeb =8-_gbdac ;_baegg =_gbbb [_gbdac ];};if (_aagdc &7)!=0{_fdeb =true ;_accbe =8-(_aagdc &7);_bcee =_gbbb [_accbe ];_cded =_bbdb .RowStride *_ddbe +(_aagdc >>3);_bedg =_dbdf .RowStride *_cfga +(_eaab >>3);_efafd =8-(_eaab &7);if _accbe > _efafd {_affcf =_gffc ;if _deagg >=_edadb {_cgcg =true ;};}else {_affcf =_fcdg ;};};if _deagg < _accbe {_fac =true ;_bcee &=_bge [8-_accbe +_deagg ];};if !_fac {_bdcde =(_deagg -_accbe )>>3;if _bdcde !=0{_fddf =true ;_fdfd =_bbdb .RowStride *_ddbe +((_aagdc +_fdcg )>>3);_adgge =_dbdf .RowStride *_cfga +((_eaab +_fdcg )>>3);};};_cfaaf =(_aagdc +_deagg )&7;if !(_fac ||_cfaaf ==0){_fdba =true ;_gegf =_bge [_cfaaf ];_cdaa =_bbdb .RowStride *_ddbe +((_aagdc +_fdcg )>>3)+_bdcde ;_gccd =_dbdf .RowStride *_cfga +((_eaab +_fdcg )>>3)+_bdcde ;if _cfaaf > int (_ddeb ){_agaaa =true ;};};switch _gcgb {case PixSrc :if _fdeb {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{if _affcf ==_gffc {_bcbbc =_dbdf .Data [_bedg ]<<_gbdac ;if _cgcg {_bcbbc =_gdcad (_bcbbc ,_dbdf .Data [_bedg +1]>>_ddeb ,_baegg );};}else {_bcbbc =_dbdf .Data [_bedg ]>>_ddeb ;};_bbdb .Data [_cded ]=_gdcad (_bbdb .Data [_cded ],_bcbbc ,_bcee );_cded +=_bbdb .RowStride ;_bedg +=_dbdf .RowStride ;};};if _fddf {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{for _bebfc =0;_bebfc < _bdcde ;_bebfc ++{_bcbbc =_gdcad (_dbdf .Data [_adgge +_bebfc ]<<_gbdac ,_dbdf .Data [_adgge +_bebfc +1]>>_ddeb ,_baegg );_bbdb .Data [_fdfd +_bebfc ]=_bcbbc ;};_fdfd +=_bbdb .RowStride ;_adgge +=_dbdf .RowStride ;};};if _fdba {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{_bcbbc =_dbdf .Data [_gccd ]<<_gbdac ;if _agaaa {_bcbbc =_gdcad (_bcbbc ,_dbdf .Data [_gccd +1]>>_ddeb ,_baegg );};_bbdb .Data [_cdaa ]=_gdcad (_bbdb .Data [_cdaa ],_bcbbc ,_gegf );_cdaa +=_bbdb .RowStride ;_gccd +=_dbdf .RowStride ;};};case PixNotSrc :if _fdeb {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{if _affcf ==_gffc {_bcbbc =_dbdf .Data [_bedg ]<<_gbdac ;if _cgcg {_bcbbc =_gdcad (_bcbbc ,_dbdf .Data [_bedg +1]>>_ddeb ,_baegg );};}else {_bcbbc =_dbdf .Data [_bedg ]>>_ddeb ;};_bbdb .Data [_cded ]=_gdcad (_bbdb .Data [_cded ],^_bcbbc ,_bcee );_cded +=_bbdb .RowStride ;_bedg +=_dbdf .RowStride ;};};if _fddf {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{for _bebfc =0;_bebfc < _bdcde ;_bebfc ++{_bcbbc =_gdcad (_dbdf .Data [_adgge +_bebfc ]<<_gbdac ,_dbdf .Data [_adgge +_bebfc +1]>>_ddeb ,_baegg );_bbdb .Data [_fdfd +_bebfc ]=^_bcbbc ;};_fdfd +=_bbdb .RowStride ;_adgge +=_dbdf .RowStride ;};};if _fdba {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{_bcbbc =_dbdf .Data [_gccd ]<<_gbdac ;if _agaaa {_bcbbc =_gdcad (_bcbbc ,_dbdf .Data [_gccd +1]>>_ddeb ,_baegg );};_bbdb .Data [_cdaa ]=_gdcad (_bbdb .Data [_cdaa ],^_bcbbc ,_gegf );_cdaa +=_bbdb .RowStride ;_gccd +=_dbdf .RowStride ;};};case PixSrcOrDst :if _fdeb {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{if _affcf ==_gffc {_bcbbc =_dbdf .Data [_bedg ]<<_gbdac ;if _cgcg {_bcbbc =_gdcad (_bcbbc ,_dbdf .Data [_bedg +1]>>_ddeb ,_baegg );};}else {_bcbbc =_dbdf .Data [_bedg ]>>_ddeb ;};_bbdb .Data [_cded ]=_gdcad (_bbdb .Data [_cded ],_bcbbc |_bbdb .Data [_cded ],_bcee );_cded +=_bbdb .RowStride ;_bedg +=_dbdf .RowStride ;};};if _fddf {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{for _bebfc =0;_bebfc < _bdcde ;_bebfc ++{_bcbbc =_gdcad (_dbdf .Data [_adgge +_bebfc ]<<_gbdac ,_dbdf .Data [_adgge +_bebfc +1]>>_ddeb ,_baegg );_bbdb .Data [_fdfd +_bebfc ]|=_bcbbc ;};_fdfd +=_bbdb .RowStride ;_adgge +=_dbdf .RowStride ;};};if _fdba {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{_bcbbc =_dbdf .Data [_gccd ]<<_gbdac ;if _agaaa {_bcbbc =_gdcad (_bcbbc ,_dbdf .Data [_gccd +1]>>_ddeb ,_baegg );};_bbdb .Data [_cdaa ]=_gdcad (_bbdb .Data [_cdaa ],_bcbbc |_bbdb .Data [_cdaa ],_gegf );_cdaa +=_bbdb .RowStride ;_gccd +=_dbdf .RowStride ;};};case PixSrcAndDst :if _fdeb {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{if _affcf ==_gffc {_bcbbc =_dbdf .Data [_bedg ]<<_gbdac ;if _cgcg {_bcbbc =_gdcad (_bcbbc ,_dbdf .Data [_bedg +1]>>_ddeb ,_baegg );};}else {_bcbbc =_dbdf .Data [_bedg ]>>_ddeb ;};_bbdb .Data [_cded ]=_gdcad (_bbdb .Data [_cded ],_bcbbc &_bbdb .Data [_cded ],_bcee );_cded +=_bbdb .RowStride ;_bedg +=_dbdf .RowStride ;};};if _fddf {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{for _bebfc =0;_bebfc < _bdcde ;_bebfc ++{_bcbbc =_gdcad (_dbdf .Data [_adgge +_bebfc ]<<_gbdac ,_dbdf .Data [_adgge +_bebfc +1]>>_ddeb ,_baegg );_bbdb .Data [_fdfd +_bebfc ]&=_bcbbc ;};_fdfd +=_bbdb .RowStride ;_adgge +=_dbdf .RowStride ;};};if _fdba {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{_bcbbc =_dbdf .Data [_gccd ]<<_gbdac ;if _agaaa {_bcbbc =_gdcad (_bcbbc ,_dbdf .Data [_gccd +1]>>_ddeb ,_baegg );};_bbdb .Data [_cdaa ]=_gdcad (_bbdb .Data [_cdaa ],_bcbbc &_bbdb .Data [_cdaa ],_gegf );_cdaa +=_bbdb .RowStride ;_gccd +=_dbdf .RowStride ;};};case PixSrcXorDst :if _fdeb {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{if _affcf ==_gffc {_bcbbc =_dbdf .Data [_bedg ]<<_gbdac ;if _cgcg {_bcbbc =_gdcad (_bcbbc ,_dbdf .Data [_bedg +1]>>_ddeb ,_baegg );};}else {_bcbbc =_dbdf .Data [_bedg ]>>_ddeb ;};_bbdb .Data [_cded ]=_gdcad (_bbdb .Data [_cded ],_bcbbc ^_bbdb .Data [_cded ],_bcee );_cded +=_bbdb .RowStride ;_bedg +=_dbdf .RowStride ;};};if _fddf {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{for _bebfc =0;_bebfc < _bdcde ;_bebfc ++{_bcbbc =_gdcad (_dbdf .Data [_adgge +_bebfc ]<<_gbdac ,_dbdf .Data [_adgge +_bebfc +1]>>_ddeb ,_baegg );_bbdb .Data [_fdfd +_bebfc ]^=_bcbbc ;};_fdfd +=_bbdb .RowStride ;_adgge +=_dbdf .RowStride ;};};if _fdba {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{_bcbbc =_dbdf .Data [_gccd ]<<_gbdac ;if _agaaa {_bcbbc =_gdcad (_bcbbc ,_dbdf .Data [_gccd +1]>>_ddeb ,_baegg );};_bbdb .Data [_cdaa ]=_gdcad (_bbdb .Data [_cdaa ],_bcbbc ^_bbdb .Data [_cdaa ],_gegf );_cdaa +=_bbdb .RowStride ;_gccd +=_dbdf .RowStride ;};};case PixNotSrcOrDst :if _fdeb {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{if _affcf ==_gffc {_bcbbc =_dbdf .Data [_bedg ]<<_gbdac ;if _cgcg {_bcbbc =_gdcad (_bcbbc ,_dbdf .Data [_bedg +1]>>_ddeb ,_baegg );};}else {_bcbbc =_dbdf .Data [_bedg ]>>_ddeb ;};_bbdb .Data [_cded ]=_gdcad (_bbdb .Data [_cded ],^_bcbbc |_bbdb .Data [_cded ],_bcee );_cded +=_bbdb .RowStride ;_bedg +=_dbdf .RowStride ;};};if _fddf {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{for _bebfc =0;_bebfc < _bdcde ;_bebfc ++{_bcbbc =_gdcad (_dbdf .Data [_adgge +_bebfc ]<<_gbdac ,_dbdf .Data [_adgge +_bebfc +1]>>_ddeb ,_baegg );_bbdb .Data [_fdfd +_bebfc ]|=^_bcbbc ;};_fdfd +=_bbdb .RowStride ;_adgge +=_dbdf .RowStride ;};};if _fdba {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{_bcbbc =_dbdf .Data [_gccd ]<<_gbdac ;if _agaaa {_bcbbc =_gdcad (_bcbbc ,_dbdf .Data [_gccd +1]>>_ddeb ,_baegg );};_bbdb .Data [_cdaa ]=_gdcad (_bbdb .Data [_cdaa ],^_bcbbc |_bbdb .Data [_cdaa ],_gegf );_cdaa +=_bbdb .RowStride ;_gccd +=_dbdf .RowStride ;};};case PixNotSrcAndDst :if _fdeb {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{if _affcf ==_gffc {_bcbbc =_dbdf .Data [_bedg ]<<_gbdac ;if _cgcg {_bcbbc =_gdcad (_bcbbc ,_dbdf .Data [_bedg +1]>>_ddeb ,_baegg );};}else {_bcbbc =_dbdf .Data [_bedg ]>>_ddeb ;};_bbdb .Data [_cded ]=_gdcad (_bbdb .Data [_cded ],^_bcbbc &_bbdb .Data [_cded ],_bcee );_cded +=_bbdb .RowStride ;_bedg +=_dbdf .RowStride ;};};if _fddf {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{for _bebfc =0;_bebfc < _bdcde ;_bebfc ++{_bcbbc =_gdcad (_dbdf .Data [_adgge +_bebfc ]<<_gbdac ,_dbdf .Data [_adgge +_bebfc +1]>>_ddeb ,_baegg );_bbdb .Data [_fdfd +_bebfc ]&=^_bcbbc ;};_fdfd +=_bbdb .RowStride ;_adgge +=_dbdf .RowStride ;};};if _fdba {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{_bcbbc =_dbdf .Data [_gccd ]<<_gbdac ;if _agaaa {_bcbbc =_gdcad (_bcbbc ,_dbdf .Data [_gccd +1]>>_ddeb ,_baegg );};_bbdb .Data [_cdaa ]=_gdcad (_bbdb .Data [_cdaa ],^_bcbbc &_bbdb .Data [_cdaa ],_gegf );_cdaa +=_bbdb .RowStride ;_gccd +=_dbdf .RowStride ;};};case PixSrcOrNotDst :if _fdeb {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{if _affcf ==_gffc {_bcbbc =_dbdf .Data [_bedg ]<<_gbdac ;if _cgcg {_bcbbc =_gdcad (_bcbbc ,_dbdf .Data [_bedg +1]>>_ddeb ,_baegg );};}else {_bcbbc =_dbdf .Data [_bedg ]>>_ddeb ;};_bbdb .Data [_cded ]=_gdcad (_bbdb .Data [_cded ],_bcbbc |^_bbdb .Data [_cded ],_bcee );_cded +=_bbdb .RowStride ;_bedg +=_dbdf .RowStride ;};};if _fddf {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{for _bebfc =0;_bebfc < _bdcde ;_bebfc ++{_bcbbc =_gdcad (_dbdf .Data [_adgge +_bebfc ]<<_gbdac ,_dbdf .Data [_adgge +_bebfc +1]>>_ddeb ,_baegg );_bbdb .Data [_fdfd +_bebfc ]=_bcbbc |^_bbdb .Data [_fdfd +_bebfc ];};_fdfd +=_bbdb .RowStride ;_adgge +=_dbdf .RowStride ;};};if _fdba {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{_bcbbc =_dbdf .Data [_gccd ]<<_gbdac ;if _agaaa {_bcbbc =_gdcad (_bcbbc ,_dbdf .Data [_gccd +1]>>_ddeb ,_baegg );};_bbdb .Data [_cdaa ]=_gdcad (_bbdb .Data [_cdaa ],_bcbbc |^_bbdb .Data [_cdaa ],_gegf );_cdaa +=_bbdb .RowStride ;_gccd +=_dbdf .RowStride ;};};case PixSrcAndNotDst :if _fdeb {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{if _affcf ==_gffc {_bcbbc =_dbdf .Data [_bedg ]<<_gbdac ;if _cgcg {_bcbbc =_gdcad (_bcbbc ,_dbdf .Data [_bedg +1]>>_ddeb ,_baegg );};}else {_bcbbc =_dbdf .Data [_bedg ]>>_ddeb ;};_bbdb .Data [_cded ]=_gdcad (_bbdb .Data [_cded ],_bcbbc &^_bbdb .Data [_cded ],_bcee );_cded +=_bbdb .RowStride ;_bedg +=_dbdf .RowStride ;};};if _fddf {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{for _bebfc =0;_bebfc < _bdcde ;_bebfc ++{_bcbbc =_gdcad (_dbdf .Data [_adgge +_bebfc ]<<_gbdac ,_dbdf .Data [_adgge +_bebfc +1]>>_ddeb ,_baegg );_bbdb .Data [_fdfd +_bebfc ]=_bcbbc &^_bbdb .Data [_fdfd +_bebfc ];};_fdfd +=_bbdb .RowStride ;_adgge +=_dbdf .RowStride ;};};if _fdba {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{_bcbbc =_dbdf .Data [_gccd ]<<_gbdac ;if _agaaa {_bcbbc =_gdcad (_bcbbc ,_dbdf .Data [_gccd +1]>>_ddeb ,_baegg );};_bbdb .Data [_cdaa ]=_gdcad (_bbdb .Data [_cdaa ],_bcbbc &^_bbdb .Data [_cdaa ],_gegf );_cdaa +=_bbdb .RowStride ;_gccd +=_dbdf .RowStride ;};};case PixNotPixSrcOrDst :if _fdeb {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{if _affcf ==_gffc {_bcbbc =_dbdf .Data [_bedg ]<<_gbdac ;if _cgcg {_bcbbc =_gdcad (_bcbbc ,_dbdf .Data [_bedg +1]>>_ddeb ,_baegg );};}else {_bcbbc =_dbdf .Data [_bedg ]>>_ddeb ;};_bbdb .Data [_cded ]=_gdcad (_bbdb .Data [_cded ],^(_bcbbc |_bbdb .Data [_cded ]),_bcee );_cded +=_bbdb .RowStride ;_bedg +=_dbdf .RowStride ;};};if _fddf {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{for _bebfc =0;_bebfc < _bdcde ;_bebfc ++{_bcbbc =_gdcad (_dbdf .Data [_adgge +_bebfc ]<<_gbdac ,_dbdf .Data [_adgge +_bebfc +1]>>_ddeb ,_baegg );_bbdb .Data [_fdfd +_bebfc ]=^(_bcbbc |_bbdb .Data [_fdfd +_bebfc ]);};_fdfd +=_bbdb .RowStride ;_adgge +=_dbdf .RowStride ;};};if _fdba {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{_bcbbc =_dbdf .Data [_gccd ]<<_gbdac ;if _agaaa {_bcbbc =_gdcad (_bcbbc ,_dbdf .Data [_gccd +1]>>_ddeb ,_baegg );};_bbdb .Data [_cdaa ]=_gdcad (_bbdb .Data [_cdaa ],^(_bcbbc |_bbdb .Data [_cdaa ]),_gegf );_cdaa +=_bbdb .RowStride ;_gccd +=_dbdf .RowStride ;};};case PixNotPixSrcAndDst :if _fdeb {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{if _affcf ==_gffc {_bcbbc =_dbdf .Data [_bedg ]<<_gbdac ;if _cgcg {_bcbbc =_gdcad (_bcbbc ,_dbdf .Data [_bedg +1]>>_ddeb ,_baegg );};}else {_bcbbc =_dbdf .Data [_bedg ]>>_ddeb ;};_bbdb .Data [_cded ]=_gdcad (_bbdb .Data [_cded ],^(_bcbbc &_bbdb .Data [_cded ]),_bcee );_cded +=_bbdb .RowStride ;_bedg +=_dbdf .RowStride ;};};if _fddf {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{for _bebfc =0;_bebfc < _bdcde ;_bebfc ++{_bcbbc =_gdcad (_dbdf .Data [_adgge +_bebfc ]<<_gbdac ,_dbdf .Data [_adgge +_bebfc +1]>>_ddeb ,_baegg );_bbdb .Data [_fdfd +_bebfc ]=^(_bcbbc &_bbdb .Data [_fdfd +_bebfc ]);};_fdfd +=_bbdb .RowStride ;_adgge +=_dbdf .RowStride ;};};if _fdba {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{_bcbbc =_dbdf .Data [_gccd ]<<_gbdac ;if _agaaa {_bcbbc =_gdcad (_bcbbc ,_dbdf .Data [_gccd +1]>>_ddeb ,_baegg );};_bbdb .Data [_cdaa ]=_gdcad (_bbdb .Data [_cdaa ],^(_bcbbc &_bbdb .Data [_cdaa ]),_gegf );_cdaa +=_bbdb .RowStride ;_gccd +=_dbdf .RowStride ;};};case PixNotPixSrcXorDst :if _fdeb {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{if _affcf ==_gffc {_bcbbc =_dbdf .Data [_bedg ]<<_gbdac ;if _cgcg {_bcbbc =_gdcad (_bcbbc ,_dbdf .Data [_bedg +1]>>_ddeb ,_baegg );};}else {_bcbbc =_dbdf .Data [_bedg ]>>_ddeb ;};_bbdb .Data [_cded ]=_gdcad (_bbdb .Data [_cded ],^(_bcbbc ^_bbdb .Data [_cded ]),_bcee );_cded +=_bbdb .RowStride ;_bedg +=_dbdf .RowStride ;};};if _fddf {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{for _bebfc =0;_bebfc < _bdcde ;_bebfc ++{_bcbbc =_gdcad (_dbdf .Data [_adgge +_bebfc ]<<_gbdac ,_dbdf .Data [_adgge +_bebfc +1]>>_ddeb ,_baegg );_bbdb .Data [_fdfd +_bebfc ]=^(_bcbbc ^_bbdb .Data [_fdfd +_bebfc ]);};_fdfd +=_bbdb .RowStride ;_adgge +=_dbdf .RowStride ;};};if _fdba {for _aeeg =0;_aeeg < _efcc ;_aeeg ++{_bcbbc =_dbdf .Data [_gccd ]<<_gbdac ;if _agaaa {_bcbbc =_gdcad (_bcbbc ,_dbdf .Data [_gccd +1]>>_ddeb ,_baegg );};_bbdb .Data [_cdaa ]=_gdcad (_bbdb .Data [_cdaa ],^(_bcbbc ^_bbdb .Data [_cdaa ]),_gegf );_cdaa +=_bbdb .RowStride ;_gccd +=_dbdf .RowStride ;};};default:_be .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",_gcgb );return _a .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 (_aeeb *Bitmap )Equivalent (s *Bitmap )bool {return _aeeb .equivalent (s )};func (_ecfg *Bitmap )removeBorderGeneral (_fecc ,_aaeb ,_aceb ,_egcc int )(*Bitmap ,error ){const _bdc ="\u0072\u0065\u006d\u006fve\u0042\u006f\u0072\u0064\u0065\u0072\u0047\u0065\u006e\u0065\u0072\u0061\u006c";if _fecc < 0||_aaeb < 0||_aceb < 0||_egcc < 0{return nil ,_a .Error (_bdc ,"\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");};_dbad ,_fdabc :=_ecfg .Width ,_ecfg .Height ;_dceg :=_dbad -_fecc -_aaeb ;_eed :=_fdabc -_aceb -_egcc ;if _dceg <=0{return nil ,_a .Errorf (_bdc ,"w\u0069\u0064\u0074\u0068: \u0025d\u0020\u006d\u0075\u0073\u0074 \u0062\u0065\u0020\u003e\u0020\u0030",_dceg );};if _eed <=0{return nil ,_a .Errorf (_bdc ,"\u0068\u0065\u0069\u0067ht\u003a\u0020\u0025\u0064\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065\u0020\u003e \u0030",_eed );};_gfb :=New (_dceg ,_eed );_gfb .Color =_ecfg .Color ;_bdca :=_gfb .RasterOperation (0,0,_dceg ,_eed ,PixSrc ,_ecfg ,_fecc ,_aceb );if _bdca !=nil {return nil ,_a .Wrap (_bdca ,_bdc ,"");};return _gfb ,nil ;};const (_ LocationFilter =iota ;LocSelectWidth ;LocSelectHeight ;LocSelectXVal ;LocSelectYVal ;LocSelectIfEither ;LocSelectIfBoth ;);func MakePixelSumTab8 ()[]int {return _bbabe ()};func (_gbec *byHeight )Len ()int {return len (_gbec .Values )};func _adcc (_bdfed *Bitmap ,_aege ,_daf int ,_aggg ,_afeb int ,_fbda RasterOperator ){var (_dcae bool ;_bcfd bool ;_geffc int ;_fbbb int ;_gfff int ;_bbafc int ;_dbfad bool ;_aegd byte ;);_gbdccf :=8-(_aege &7);_egbf :=_gbbb [_gbdccf ];_fggba :=_bdfed .RowStride *_daf +(_aege >>3);if _aggg < _gbdccf {_dcae =true ;_egbf &=_bge [8-_gbdccf +_aggg ];};if !_dcae {_geffc =(_aggg -_gbdccf )>>3;if _geffc !=0{_bcfd =true ;_fbbb =_fggba +1;};};_gfff =(_aege +_aggg )&7;if !(_dcae ||_gfff ==0){_dbfad =true ;_aegd =_bge [_gfff ];_bbafc =_fggba +1+_geffc ;};var _gagg ,_gedfb int ;switch _fbda {case PixClr :for _gagg =0;_gagg < _afeb ;_gagg ++{_bdfed .Data [_fggba ]=_gdcad (_bdfed .Data [_fggba ],0x0,_egbf );_fggba +=_bdfed .RowStride ;};if _bcfd {for _gagg =0;_gagg < _afeb ;_gagg ++{for _gedfb =0;_gedfb < _geffc ;_gedfb ++{_bdfed .Data [_fbbb +_gedfb ]=0x0;};_fbbb +=_bdfed .RowStride ;};};if _dbfad {for _gagg =0;_gagg < _afeb ;_gagg ++{_bdfed .Data [_bbafc ]=_gdcad (_bdfed .Data [_bbafc ],0x0,_aegd );_bbafc +=_bdfed .RowStride ;};};case PixSet :for _gagg =0;_gagg < _afeb ;_gagg ++{_bdfed .Data [_fggba ]=_gdcad (_bdfed .Data [_fggba ],0xff,_egbf );_fggba +=_bdfed .RowStride ;};if _bcfd {for _gagg =0;_gagg < _afeb ;_gagg ++{for _gedfb =0;_gedfb < _geffc ;_gedfb ++{_bdfed .Data [_fbbb +_gedfb ]=0xff;};_fbbb +=_bdfed .RowStride ;};};if _dbfad {for _gagg =0;_gagg < _afeb ;_gagg ++{_bdfed .Data [_bbafc ]=_gdcad (_bdfed .Data [_bbafc ],0xff,_aegd );_bbafc +=_bdfed .RowStride ;};};case PixNotDst :for _gagg =0;_gagg < _afeb ;_gagg ++{_bdfed .Data [_fggba ]=_gdcad (_bdfed .Data [_fggba ],^_bdfed .Data [_fggba ],_egbf );_fggba +=_bdfed .RowStride ;};if _bcfd {for _gagg =0;_gagg < _afeb ;_gagg ++{for _gedfb =0;_gedfb < _geffc ;_gedfb ++{_bdfed .Data [_fbbb +_gedfb ]=^(_bdfed .Data [_fbbb +_gedfb ]);};_fbbb +=_bdfed .RowStride ;};};if _dbfad {for _gagg =0;_gagg < _afeb ;_gagg ++{_bdfed .Data [_bbafc ]=_gdcad (_bdfed .Data [_bbafc ],^_bdfed .Data [_bbafc ],_aegd );_bbafc +=_bdfed .RowStride ;};};};};func _dcc ()(_fae []byte ){_fae =make ([]byte ,256);for _ced :=0;_ced < 256;_ced ++{_dbe :=byte (_ced );_fae [_dbe ]=(_dbe &0x01)|((_dbe &0x04)>>1)|((_dbe &0x10)>>2)|((_dbe &0x40)>>3)|((_dbe &0x02)<<3)|((_dbe &0x08)<<2)|((_dbe &0x20)<<1)|(_dbe &0x80);};return _fae ;};func (_ddcd *ClassedPoints )YAtIndex (i int )float32 {return (*_ddcd .Points )[_ddcd .IntSlice [i ]].Y };func (_gcca *Bitmaps )SortByHeight (){_acdc :=(*byHeight )(_gcca );_eg .Sort (_acdc )};func (_adbge *Bitmaps )makeSizeIndicator (_dbaef ,_bbabeg int ,_ggddf LocationFilter ,_bdccf SizeComparison )(_cgfd *_dd .NumSlice ,_gddc error ){const _eedb ="\u0042i\u0074\u006d\u0061\u0070s\u002e\u006d\u0061\u006b\u0065S\u0069z\u0065I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";if _adbge ==nil {return nil ,_a .Error (_eedb ,"\u0062\u0069\u0074ma\u0070\u0073\u0020\u0027\u0062\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};switch _ggddf {case LocSelectWidth ,LocSelectHeight ,LocSelectIfEither ,LocSelectIfBoth :default:return nil ,_a .Errorf (_eedb ,"\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",_ggddf );};switch _bdccf {case SizeSelectIfLT ,SizeSelectIfGT ,SizeSelectIfLTE ,SizeSelectIfGTE ,SizeSelectIfEQ :default:return nil ,_a .Errorf (_eedb ,"\u0069\u006e\u0076\u0061li\u0064\u0020\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0027\u0025d\u0027",_bdccf );};_cgfd =&_dd .NumSlice {};var (_cbde ,_abbge ,_cfac int ;_bdef *Bitmap ;);for _ ,_bdef =range _adbge .Values {_cbde =0;_abbge ,_cfac =_bdef .Width ,_bdef .Height ;switch _ggddf {case LocSelectWidth :if (_bdccf ==SizeSelectIfLT &&_abbge < _dbaef )||(_bdccf ==SizeSelectIfGT &&_abbge > _dbaef )||(_bdccf ==SizeSelectIfLTE &&_abbge <=_dbaef )||(_bdccf ==SizeSelectIfGTE &&_abbge >=_dbaef )||(_bdccf ==SizeSelectIfEQ &&_abbge ==_dbaef ){_cbde =1;};case LocSelectHeight :if (_bdccf ==SizeSelectIfLT &&_cfac < _bbabeg )||(_bdccf ==SizeSelectIfGT &&_cfac > _bbabeg )||(_bdccf ==SizeSelectIfLTE &&_cfac <=_bbabeg )||(_bdccf ==SizeSelectIfGTE &&_cfac >=_bbabeg )||(_bdccf ==SizeSelectIfEQ &&_cfac ==_bbabeg ){_cbde =1;};case LocSelectIfEither :if (_bdccf ==SizeSelectIfLT &&(_abbge < _dbaef ||_cfac < _bbabeg ))||(_bdccf ==SizeSelectIfGT &&(_abbge > _dbaef ||_cfac > _bbabeg ))||(_bdccf ==SizeSelectIfLTE &&(_abbge <=_dbaef ||_cfac <=_bbabeg ))||(_bdccf ==SizeSelectIfGTE &&(_abbge >=_dbaef ||_cfac >=_bbabeg ))||(_bdccf ==SizeSelectIfEQ &&(_abbge ==_dbaef ||_cfac ==_bbabeg )){_cbde =1;};case LocSelectIfBoth :if (_bdccf ==SizeSelectIfLT &&(_abbge < _dbaef &&_cfac < _bbabeg ))||(_bdccf ==SizeSelectIfGT &&(_abbge > _dbaef &&_cfac > _bbabeg ))||(_bdccf ==SizeSelectIfLTE &&(_abbge <=_dbaef &&_cfac <=_bbabeg ))||(_bdccf ==SizeSelectIfGTE &&(_abbge >=_dbaef &&_cfac >=_bbabeg ))||(_bdccf ==SizeSelectIfEQ &&(_abbge ==_dbaef &&_cfac ==_bbabeg )){_cbde =1;};};_cgfd .AddInt (_cbde );};return _cgfd ,nil ;};func (_bcb *Bitmap )CountPixels ()int {return _bcb .countPixels ()};func TstImageBitmapData ()[]byte {return _bedgd .Data };func _bcac (_ceab *Bitmap ,_geade ,_cgca int ,_ddbf ,_cgde int ,_adge RasterOperator ){var (_eccf int ;_cdegf byte ;_fdfc ,_bgbac int ;_ceac int ;);_gfaf :=_ddbf >>3;_eeef :=_ddbf &7;if _eeef > 0{_cdegf =_bge [_eeef ];};_eccf =_ceab .RowStride *_cgca +(_geade >>3);switch _adge {case PixClr :for _fdfc =0;_fdfc < _cgde ;_fdfc ++{_ceac =_eccf +_fdfc *_ceab .RowStride ;for _bgbac =0;_bgbac < _gfaf ;_bgbac ++{_ceab .Data [_ceac ]=0x0;_ceac ++;};if _eeef > 0{_ceab .Data [_ceac ]=_gdcad (_ceab .Data [_ceac ],0x0,_cdegf );};};case PixSet :for _fdfc =0;_fdfc < _cgde ;_fdfc ++{_ceac =_eccf +_fdfc *_ceab .RowStride ;for _bgbac =0;_bgbac < _gfaf ;_bgbac ++{_ceab .Data [_ceac ]=0xff;_ceac ++;};if _eeef > 0{_ceab .Data [_ceac ]=_gdcad (_ceab .Data [_ceac ],0xff,_cdegf );};};case PixNotDst :for _fdfc =0;_fdfc < _cgde ;_fdfc ++{_ceac =_eccf +_fdfc *_ceab .RowStride ;for _bgbac =0;_bgbac < _gfaf ;_bgbac ++{_ceab .Data [_ceac ]=^_ceab .Data [_ceac ];_ceac ++;};if _eeef > 0{_ceab .Data [_ceac ]=_gdcad (_ceab .Data [_ceac ],^_ceab .Data [_ceac ],_cdegf );};};};};func _fba (_daaf ,_eaba byte ,_aagg CombinationOperator )byte {switch _aagg {case CmbOpOr :return _eaba |_daaf ;case CmbOpAnd :return _eaba &_daaf ;case CmbOpXor :return _eaba ^_daaf ;case CmbOpXNor :return ^(_eaba ^_daaf );case CmbOpNot :return ^(_eaba );default:return _eaba ;};};type Component int ;func _ad ()(_eae [256]uint16 ){for _fc :=0;_fc < 256;_fc ++{if _fc &0x01!=0{_eae [_fc ]|=0x3;};if _fc &0x02!=0{_eae [_fc ]|=0xc;};if _fc &0x04!=0{_eae [_fc ]|=0x30;};if _fc &0x08!=0{_eae [_fc ]|=0xc0;};if _fc &0x10!=0{_eae [_fc ]|=0x300;};if _fc &0x20!=0{_eae [_fc ]|=0xc00;};if _fc &0x40!=0{_eae [_fc ]|=0x3000;};if _fc &0x80!=0{_eae [_fc ]|=0xc000;};};return _eae ;};func (_ggeg *Bitmap )RasterOperation (dx ,dy ,dw ,dh int ,op RasterOperator ,src *Bitmap ,sx ,sy int )error {return _babbd (_ggeg ,dx ,dy ,dw ,dh ,op ,src ,sx ,sy );};func (_eeag *Bitmap )GetComponents (components Component ,maxWidth ,maxHeight int )(_bcgg *Bitmaps ,_ffcde *Boxes ,_ebca error ){const _aeee ="B\u0069t\u006d\u0061\u0070\u002e\u0047\u0065\u0074\u0043o\u006d\u0070\u006f\u006een\u0074\u0073";if _eeag ==nil {return nil ,nil ,_a .Error (_aeee ,"\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 ,_a .Error (_aeee ,"\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 _eeag .Zero (){_ffcde =&Boxes {};_bcgg =&Bitmaps {};return _bcgg ,_ffcde ,nil ;};switch components {case ComponentConn :_bcgg =&Bitmaps {};if _ffcde ,_ebca =_eeag .ConnComponents (_bcgg ,8);_ebca !=nil {return nil ,nil ,_a .Wrap (_ebca ,_aeee ,"\u006e\u006f \u0070\u0072\u0065p\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");};case ComponentCharacters :_fbce ,_gcc :=MorphSequence (_eeag ,MorphProcess {Operation :MopClosing ,Arguments :[]int {1,6}});if _gcc !=nil {return nil ,nil ,_a .Wrap (_gcc ,_aeee ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");};if _be .Log .IsLogLevel (_be .LogLevelTrace ){_be .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",_fbce .String ());};_acaf :=&Bitmaps {};_ffcde ,_gcc =_fbce .ConnComponents (_acaf ,8);if _gcc !=nil {return nil ,nil ,_a .Wrap (_gcc ,_aeee ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");};if _be .Log .IsLogLevel (_be .LogLevelTrace ){_be .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",_acaf .String ());};if _bcgg ,_gcc =_acaf .ClipToBitmap (_eeag );_gcc !=nil {return nil ,nil ,_a .Wrap (_gcc ,_aeee ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");};case ComponentWords :_cffaf :=1;var _gedf *Bitmap ;switch {case _eeag .XResolution <=200:_gedf =_eeag ;case _eeag .XResolution <=400:_cffaf =2;_gedf ,_ebca =_dce (_eeag ,1,0,0,0);if _ebca !=nil {return nil ,nil ,_a .Wrap (_ebca ,_aeee ,"w\u006f\u0072\u0064\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0020\u002d \u0078\u0072\u0065s\u003c=\u0034\u0030\u0030");};default:_cffaf =4;_gedf ,_ebca =_dce (_eeag ,1,1,0,0);if _ebca !=nil {return nil ,nil ,_a .Wrap (_ebca ,_aeee ,"\u0077\u006f\u0072\u0064 \u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073 \u002d \u0078\u0072\u0065\u0073\u0020\u003e\u00204\u0030\u0030");};};_fgeb ,_ ,_cfega :=_eddb (_gedf );if _cfega !=nil {return nil ,nil ,_a .Wrap (_cfega ,_aeee ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");};_eeee ,_cfega :=_ebge (_fgeb ,_cffaf );if _cfega !=nil {return nil ,nil ,_a .Wrap (_cfega ,_aeee ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");};_gfba :=&Bitmaps {};if _ffcde ,_cfega =_eeee .ConnComponents (_gfba ,4);_cfega !=nil {return nil ,nil ,_a .Wrap (_cfega ,_aeee ,"\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 _bcgg ,_cfega =_gfba .ClipToBitmap (_eeag );_cfega !=nil {return nil ,nil ,_a .Wrap (_cfega ,_aeee ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");};};_bcgg ,_ebca =_bcgg .SelectBySize (maxWidth ,maxHeight ,LocSelectIfBoth ,SizeSelectIfLTE );if _ebca !=nil {return nil ,nil ,_a .Wrap (_ebca ,_aeee ,"");};_ffcde ,_ebca =_ffcde .SelectBySize (maxWidth ,maxHeight ,LocSelectIfBoth ,SizeSelectIfLTE );if _ebca !=nil {return nil ,nil ,_a .Wrap (_ebca ,_aeee ,"");};return _bcgg ,_ffcde ,nil ;};const (_ SizeSelection =iota ;SizeSelectByWidth ;SizeSelectByHeight ;SizeSelectByMaxDimension ;SizeSelectByArea ;SizeSelectByPerimeter ;);func (_cdd *Bitmap )ClipRectangle (box *_b .Rectangle )(_babg *Bitmap ,_fec *_b .Rectangle ,_def error ){const _bdd ="\u0043\u006c\u0069\u0070\u0052\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065";if box ==nil {return nil ,nil ,_a .Error (_bdd ,"\u0062o\u0078 \u0069\u0073\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};_cag ,_eeb :=_cdd .Width ,_cdd .Height ;_caec :=_b .Rect (0,0,_cag ,_eeb );if !box .Overlaps (_caec ){return nil ,nil ,_a .Error (_bdd ,"b\u006f\u0078\u0020\u0064oe\u0073n\u0027\u0074\u0020\u006f\u0076e\u0072\u006c\u0061\u0070\u0020\u0062");};_beab :=box .Intersect (_caec );_fabd ,_beb :=_beab .Min .X ,_beab .Min .Y ;_bbg ,_aaa :=_beab .Dx (),_beab .Dy ();_babg =New (_bbg ,_aaa );_babg .Text =_cdd .Text ;if _def =_babg .RasterOperation (0,0,_bbg ,_aaa ,PixSrc ,_cdd ,_fabd ,_beb );_def !=nil {return nil ,nil ,_a .Wrap (_def ,_bdd ,"\u0050\u0069\u0078\u0053\u0072\u0063\u0020\u0074\u006f\u0020\u0063\u006ci\u0070\u0070\u0065\u0064");};_fec =&_beab ;return _babg ,_fec ,nil ;};type SizeSelection int ;func _gegcc (_cfgd ,_bfag *Bitmap ,_badg *Selection )(*Bitmap ,error ){const _deaaa ="\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u004d\u006f\u0072\u0070\u0068A\u0072\u0067\u0073\u0032";var _cbce ,_fag int ;if _bfag ==nil {return nil ,_a .Error (_deaaa ,"s\u006fu\u0072\u0063\u0065\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");};if _badg ==nil {return nil ,_a .Error (_deaaa ,"\u0073e\u006c \u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};_cbce =_badg .Width ;_fag =_badg .Height ;if _cbce ==0||_fag ==0{return nil ,_a .Error (_deaaa ,"\u0073\u0065\u006c\u0020\u006f\u0066\u0020\u0073\u0069\u007a\u0065\u0020\u0030");};if _cfgd ==nil {return _bfag .createTemplate (),nil ;};if _fbb :=_cfgd .resizeImageData (_bfag );_fbb !=nil {return nil ,_fbb ;};return _cfgd ,nil ;};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 (_afcf *ClassedPoints )SortByY (){_afcf ._cbcc =_afcf .ySortFunction ();_eg .Sort (_afcf )};func (_beaa *Bitmap )Copy ()*Bitmap {_bcf :=make ([]byte ,len (_beaa .Data ));copy (_bcf ,_beaa .Data );return &Bitmap {Width :_beaa .Width ,Height :_beaa .Height ,RowStride :_beaa .RowStride ,Data :_bcf ,Color :_beaa .Color ,Text :_beaa .Text ,BitmapNumber :_beaa .BitmapNumber ,Special :_beaa .Special };};func _dcbe (_acgg *Bitmap ,_fgbed *_dd .Stack ,_ggcb ,_cdff int )(_fgfd *_b .Rectangle ,_cdedd error ){const _adde ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";if _acgg ==nil {return nil ,_a .Error (_adde ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");};if _fgbed ==nil {return nil ,_a .Error (_adde ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");};_affe ,_bfecg :=_acgg .Width ,_acgg .Height ;_dfbff :=_affe -1;_cffec :=_bfecg -1;if _ggcb < 0||_ggcb > _dfbff ||_cdff < 0||_cdff > _cffec ||!_acgg .GetPixel (_ggcb ,_cdff ){return nil ,nil ;};_fdfba :=_b .Rect (100000,100000,0,0);if _cdedd =_adee (_fgbed ,_ggcb ,_ggcb ,_cdff ,1,_cffec ,&_fdfba );_cdedd !=nil {return nil ,_a .Wrap (_cdedd ,_adde ,"\u0069\u006e\u0069t\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _cdedd =_adee (_fgbed ,_ggcb ,_ggcb ,_cdff +1,-1,_cffec ,&_fdfba );_cdedd !=nil {return nil ,_a .Wrap (_cdedd ,_adde ,"\u0032\u006ed\u0020\u0069\u006ei\u0074\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};_fdfba .Min .X ,_fdfba .Max .X =_ggcb ,_ggcb ;_fdfba .Min .Y ,_fdfba .Max .Y =_cdff ,_cdff ;var (_bedfd *fillSegment ;_gfgd int ;);for _fgbed .Len ()> 0{if _bedfd ,_cdedd =_cedf (_fgbed );_cdedd !=nil {return nil ,_a .Wrap (_cdedd ,_adde ,"");};_cdff =_bedfd ._faee ;for _ggcb =_bedfd ._ecdcb -1;_ggcb >=0&&_acgg .GetPixel (_ggcb ,_cdff );_ggcb --{if _cdedd =_acgg .SetPixel (_ggcb ,_cdff ,0);_cdedd !=nil {return nil ,_a .Wrap (_cdedd ,_adde ,"\u0031s\u0074\u0020\u0073\u0065\u0074");};};if _ggcb >=_bedfd ._ecdcb -1{for {for _ggcb ++;_ggcb <=_bedfd ._edeag +1&&_ggcb <=_dfbff &&!_acgg .GetPixel (_ggcb ,_cdff );_ggcb ++{};_gfgd =_ggcb ;if !(_ggcb <=_bedfd ._edeag +1&&_ggcb <=_dfbff ){break ;};for ;_ggcb <=_dfbff &&_acgg .GetPixel (_ggcb ,_cdff );_ggcb ++{if _cdedd =_acgg .SetPixel (_ggcb ,_cdff ,0);_cdedd !=nil {return nil ,_a .Wrap (_cdedd ,_adde ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _cdedd =_adee (_fgbed ,_gfgd ,_ggcb -1,_bedfd ._faee ,_bedfd ._gade ,_cffec ,&_fdfba );_cdedd !=nil {return nil ,_a .Wrap (_cdedd ,_adde ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _ggcb > _bedfd ._edeag {if _cdedd =_adee (_fgbed ,_bedfd ._edeag +1,_ggcb -1,_bedfd ._faee ,-_bedfd ._gade ,_cffec ,&_fdfba );_cdedd !=nil {return nil ,_a .Wrap (_cdedd ,_adde ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");};};};continue ;};_gfgd =_ggcb +1;if _gfgd < _bedfd ._ecdcb {if _cdedd =_adee (_fgbed ,_gfgd ,_bedfd ._ecdcb -1,_bedfd ._faee ,-_bedfd ._gade ,_cffec ,&_fdfba );_cdedd !=nil {return nil ,_a .Wrap (_cdedd ,_adde ,"\u006c\u0065\u0061\u006b\u0020\u006f\u006e\u0020\u006c\u0065\u0066\u0074 \u0073\u0069\u0064\u0065");};};_ggcb =_bedfd ._ecdcb ;for {for ;_ggcb <=_dfbff &&_acgg .GetPixel (_ggcb ,_cdff );_ggcb ++{if _cdedd =_acgg .SetPixel (_ggcb ,_cdff ,0);_cdedd !=nil {return nil ,_a .Wrap (_cdedd ,_adde ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _cdedd =_adee (_fgbed ,_gfgd ,_ggcb -1,_bedfd ._faee ,_bedfd ._gade ,_cffec ,&_fdfba );_cdedd !=nil {return nil ,_a .Wrap (_cdedd ,_adde ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _ggcb > _bedfd ._edeag {if _cdedd =_adee (_fgbed ,_bedfd ._edeag +1,_ggcb -1,_bedfd ._faee ,-_bedfd ._gade ,_cffec ,&_fdfba );_cdedd !=nil {return nil ,_a .Wrap (_cdedd ,_adde ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");};};for _ggcb ++;_ggcb <=_bedfd ._edeag +1&&_ggcb <=_dfbff &&!_acgg .GetPixel (_ggcb ,_cdff );_ggcb ++{};_gfgd =_ggcb ;if !(_ggcb <=_bedfd ._edeag +1&&_ggcb <=_dfbff ){break ;};};};_fdfba .Max .X ++;_fdfba .Max .Y ++;return &_fdfba ,nil ;};func (_faea *Bitmap )setFourBytes (_egd int ,_gagc uint32 )error {if _egd +3> len (_faea .Data )-1{return _a .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",_egd );};_faea .Data [_egd ]=byte ((_gagc &0xff000000)>>24);_faea .Data [_egd +1]=byte ((_gagc &0xff0000)>>16);_faea .Data [_egd +2]=byte ((_gagc &0xff00)>>8);_faea .Data [_egd +3]=byte (_gagc &0xff);return nil ;};func _dgdc (_defb ,_dcdb *Bitmap ,_gdfbe ,_fgga ,_fggad uint ,_ebfa ,_gbgac int ,_daefc bool ,_cdag ,_aegf int )error {for _gdga :=_ebfa ;_gdga < _gbgac ;_gdga ++{if _cdag +1< len (_defb .Data ){_fbac :=_gdga +1==_gbgac ;_cefdb ,_dbfd :=_defb .GetByte (_cdag );if _dbfd !=nil {return _dbfd ;};_cdag ++;_cefdb <<=_gdfbe ;_cbgdg ,_dbfd :=_defb .GetByte (_cdag );if _dbfd !=nil {return _dbfd ;};_cbgdg >>=_fgga ;_ggg :=_cefdb |_cbgdg ;if _fbac &&!_daefc {_ggg =_gdd (_fggad ,_ggg );};_dbfd =_dcdb .SetByte (_aegf ,_ggg );if _dbfd !=nil {return _dbfd ;};_aegf ++;if _fbac &&_daefc {_bbc ,_fegc :=_defb .GetByte (_cdag );if _fegc !=nil {return _fegc ;};_bbc <<=_gdfbe ;_ggg =_gdd (_fggad ,_bbc );if _fegc =_dcdb .SetByte (_aegf ,_ggg );_fegc !=nil {return _fegc ;};};continue ;};_bacf ,_fdga :=_defb .GetByte (_cdag );if _fdga !=nil {_be .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",_cdag ,_fdga );return _fdga ;};_bacf <<=_gdfbe ;_cdag ++;_fdga =_dcdb .SetByte (_aegf ,_bacf );if _fdga !=nil {return _fdga ;};_aegf ++;};return nil ;};func _bda ()(_adg [256]uint32 ){for _eec :=0;_eec < 256;_eec ++{if _eec &0x01!=0{_adg [_eec ]|=0xf;};if _eec &0x02!=0{_adg [_eec ]|=0xf0;};if _eec &0x04!=0{_adg [_eec ]|=0xf00;};if _eec &0x08!=0{_adg [_eec ]|=0xf000;};if _eec &0x10!=0{_adg [_eec ]|=0xf0000;};if _eec &0x20!=0{_adg [_eec ]|=0xf00000;};if _eec &0x40!=0{_adg [_eec ]|=0xf000000;};if _eec &0x80!=0{_adg [_eec ]|=0xf0000000;};};return _adg ;};func (_abf *Bitmap )And (s *Bitmap )(_cbe *Bitmap ,_feb error ){const _ggc ="\u0042\u0069\u0074\u006d\u0061\u0070\u002e\u0041\u006e\u0064";if _abf ==nil {return nil ,_a .Error (_ggc ,"\u0027b\u0069t\u006d\u0061\u0070\u0020\u0027b\u0027\u0020i\u0073\u0020\u006e\u0069\u006c");};if s ==nil {return nil ,_a .Error (_ggc ,"\u0062\u0069\u0074\u006d\u0061\u0070\u0020\u0027\u0073\u0027\u0020\u0069s\u0020\u006e\u0069\u006c");};if !_abf .SizesEqual (s ){_be .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",_ggc );};if _cbe ,_feb =_fffe (_cbe ,_abf );_feb !=nil {return nil ,_a .Wrap (_feb ,_ggc ,"\u0063\u0061\u006e't\u0020\u0063\u0072\u0065\u0061\u0074\u0065\u0020\u0027\u0064\u0027\u0020\u0062\u0069\u0074\u006d\u0061\u0070");};if _feb =_cbe .RasterOperation (0,0,_cbe .Width ,_cbe .Height ,PixSrcAndDst ,s ,0,0);_feb !=nil {return nil ,_a .Wrap (_feb ,_ggc ,"");};return _cbe ,nil ;};func _egc (_gde ,_faf *Bitmap ,_dbg int ,_fgab []byte ,_bbf int )(_ged error ){const _aaee ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0033";var (_eaga ,_cca ,_dfb ,_cccg ,_fdgg ,_bbb ,_egf ,_dga int ;_fafe ,_edf ,_dgc ,_dea uint32 ;_eab ,_eaa byte ;_efa uint16 ;);_cbf :=make ([]byte ,4);_ede :=make ([]byte ,4);for _dfb =0;_dfb < _gde .Height -1;_dfb ,_cccg =_dfb +2,_cccg +1{_eaga =_dfb *_gde .RowStride ;_cca =_cccg *_faf .RowStride ;for _fdgg ,_bbb =0,0;_fdgg < _bbf ;_fdgg ,_bbb =_fdgg +4,_bbb +1{for _egf =0;_egf < 4;_egf ++{_dga =_eaga +_fdgg +_egf ;if _dga <=len (_gde .Data )-1&&_dga < _eaga +_gde .RowStride {_cbf [_egf ]=_gde .Data [_dga ];}else {_cbf [_egf ]=0x00;};_dga =_eaga +_gde .RowStride +_fdgg +_egf ;if _dga <=len (_gde .Data )-1&&_dga < _eaga +(2*_gde .RowStride ){_ede [_egf ]=_gde .Data [_dga ];}else {_ede [_egf ]=0x00;};};_fafe =_c .BigEndian .Uint32 (_cbf );_edf =_c .BigEndian .Uint32 (_ede );_dgc =_fafe &_edf ;_dgc |=_dgc <<1;_dea =_fafe |_edf ;_dea &=_dea <<1;_edf =_dgc &_dea ;_edf &=0xaaaaaaaa;_fafe =_edf |(_edf <<7);_eab =byte (_fafe >>24);_eaa =byte ((_fafe >>8)&0xff);_dga =_cca +_bbb ;if _dga +1==len (_faf .Data )-1||_dga +1>=_cca +_faf .RowStride {if _ged =_faf .SetByte (_dga ,_fgab [_eab ]);_ged !=nil {return _a .Wrapf (_ged ,_aaee ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_dga );};}else {_efa =(uint16 (_fgab [_eab ])<<8)|uint16 (_fgab [_eaa ]);if _ged =_faf .setTwoBytes (_dga ,_efa );_ged !=nil {return _a .Wrapf (_ged ,_aaee ,"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",_dga );};_bbb ++;};};};return nil ;};func TstPSymbol (t *_da .T )*Bitmap {t .Helper ();_bfgef :=New (5,8);_d .NoError (t ,_bfgef .SetPixel (0,0,1));_d .NoError (t ,_bfgef .SetPixel (1,0,1));_d .NoError (t ,_bfgef .SetPixel (2,0,1));_d .NoError (t ,_bfgef .SetPixel (3,0,1));_d .NoError (t ,_bfgef .SetPixel (4,1,1));_d .NoError (t ,_bfgef .SetPixel (0,1,1));_d .NoError (t ,_bfgef .SetPixel (4,2,1));_d .NoError (t ,_bfgef .SetPixel (0,2,1));_d .NoError (t ,_bfgef .SetPixel (4,3,1));_d .NoError (t ,_bfgef .SetPixel (0,3,1));_d .NoError (t ,_bfgef .SetPixel (0,4,1));_d .NoError (t ,_bfgef .SetPixel (1,4,1));_d .NoError (t ,_bfgef .SetPixel (2,4,1));_d .NoError (t ,_bfgef .SetPixel (3,4,1));_d .NoError (t ,_bfgef .SetPixel (0,5,1));_d .NoError (t ,_bfgef .SetPixel (0,6,1));_d .NoError (t ,_bfgef .SetPixel (0,7,1));return _bfgef ;};func (_cafe *Bitmap )createTemplate ()*Bitmap {return &Bitmap {Width :_cafe .Width ,Height :_cafe .Height ,RowStride :_cafe .RowStride ,Color :_cafe .Color ,Text :_cafe .Text ,BitmapNumber :_cafe .BitmapNumber ,Special :_cafe .Special ,Data :make ([]byte ,len (_cafe .Data ))};};const (_ SizeComparison =iota ;SizeSelectIfLT ;SizeSelectIfGT ;SizeSelectIfLTE ;SizeSelectIfGTE ;SizeSelectIfEQ ;);func _fadb (_bddgc *Bitmap ,_fcgc *Bitmap ,_cefdbe *Selection ,_cefc **Bitmap )(*Bitmap ,error ){const _abeba ="\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u004d\u006f\u0072\u0070\u0068A\u0072\u0067\u0073\u0031";if _fcgc ==nil {return nil ,_a .Error (_abeba ,"\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 _cefdbe ==nil {return nil ,_a .Error (_abeba ,"\u004d\u006f\u0072\u0068p\u0041\u0072\u0067\u0073\u0031\u0020\u0027\u0073\u0065\u006c'\u0020n\u006f\u0074\u0020\u0064\u0065\u0066\u0069n\u0065\u0064");};_effb ,_cbd :=_cefdbe .Height ,_cefdbe .Width ;if _effb ==0||_cbd ==0{return nil ,_a .Error (_abeba ,"\u0073\u0065\u006c\u0065ct\u0069\u006f\u006e\u0020\u006f\u0066\u0020\u0073\u0069\u007a\u0065\u0020\u0030");};if _bddgc ==nil {_bddgc =_fcgc .createTemplate ();*_cefc =_fcgc ;return _bddgc ,nil ;};_bddgc .Width =_fcgc .Width ;_bddgc .Height =_fcgc .Height ;_bddgc .RowStride =_fcgc .RowStride ;_bddgc .Color =_fcgc .Color ;_bddgc .Data =make ([]byte ,_fcgc .RowStride *_fcgc .Height );if _bddgc ==_fcgc {*_cefc =_fcgc .Copy ();}else {*_cefc =_fcgc ;};return _bddgc ,nil ;};func Centroids (bms []*Bitmap )(*Points ,error ){_fbaef :=make ([]Point ,len (bms ));_gffe :=_gdcd ();_gaeg :=_bbabe ();var _cbed error ;for _bdge ,_edecc :=range bms {_fbaef [_bdge ],_cbed =_edecc .centroid (_gffe ,_gaeg );if _cbed !=nil {return nil ,_cbed ;};};_dfac :=Points (_fbaef );return &_dfac ,nil ;};func (_bfgd *Bitmap )setEightPartlyBytes (_fded ,_aeacf int ,_dbba uint64 )(_eagd error ){var (_cffa byte ;_gbgd int ;);const _aecb ="\u0073\u0065\u0074\u0045ig\u0068\u0074\u0050\u0061\u0072\u0074\u006c\u0079\u0042\u0079\u0074\u0065\u0073";for _gebg :=1;_gebg <=_aeacf ;_gebg ++{_gbgd =64-_gebg *8;_cffa =byte (_dbba >>uint (_gbgd )&0xff);_be .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",_cffa ,_fded ,_fded +_gebg -1,_aeacf ,_gbgd );if _eagd =_bfgd .SetByte (_fded +_gebg -1,_cffa );_eagd !=nil {return _a .Wrap (_eagd ,_aecb ,"\u0066\u0075\u006c\u006c\u0042\u0079\u0074\u0065");};};_fea :=_bfgd .RowStride *8-_bfgd .Width ;if _fea ==0{return nil ;};_gbgd -=8;_cffa =byte (_dbba >>uint (_gbgd )&0xff)<<uint (_fea );if _eagd =_bfgd .SetByte (_fded +_aeacf ,_cffa );_eagd !=nil {return _a .Wrap (_eagd ,_aecb ,"\u0070\u0061\u0064\u0064\u0065\u0064");};return nil ;};func _gbda (_dgfe ,_dfd int )int {if _dgfe < _dfd {return _dgfe ;};return _dfd ;};func Blit (src *Bitmap ,dst *Bitmap ,x ,y int ,op CombinationOperator )error {var _decc ,_cgd int ;_cce :=src .RowStride -1;if x < 0{_cgd =-x ;x =0;}else if x +src .Width > dst .Width {_cce -=src .Width +x -dst .Width ;};if y < 0{_decc =-y ;y =0;_cgd +=src .RowStride ;_cce +=src .RowStride ;}else if y +src .Height > dst .Height {_decc =src .Height +y -dst .Height ;};var (_fbfe int ;_cgg error ;);_dgde :=x &0x07;_age :=8-_dgde ;_aad :=src .Width &0x07;_aagf :=_age -_aad ;_bfea :=_age &0x07!=0;_dab :=src .Width <=((_cce -_cgd )<<3)+_age ;_dgca :=dst .GetByteIndex (x ,y );_gdec :=_decc +dst .Height ;if src .Height > _gdec {_fbfe =_gdec ;}else {_fbfe =src .Height ;};switch {case !_bfea :_cgg =_dcgb (src ,dst ,_decc ,_fbfe ,_dgca ,_cgd ,_cce ,op );case _dab :_cgg =_abgb (src ,dst ,_decc ,_fbfe ,_dgca ,_cgd ,_cce ,_aagf ,_dgde ,_age ,op );default:_cgg =_aef (src ,dst ,_decc ,_fbfe ,_dgca ,_cgd ,_cce ,_aagf ,_dgde ,_age ,op ,_aad );};return _cgg ;};func (_ddeg *BitmapsArray )GetBox (i int )(*_b .Rectangle ,error ){const _effc ="\u0042\u0069\u0074\u006dap\u0073\u0041\u0072\u0072\u0061\u0079\u002e\u0047\u0065\u0074\u0042\u006f\u0078";if _ddeg ==nil {return nil ,_a .Error (_effc ,"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 (_ddeg .Boxes )-1{return nil ,_a .Errorf (_effc ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return _ddeg .Boxes [i ],nil ;};const (MopDilation MorphOperation =iota ;MopErosion ;MopOpening ;MopClosing ;MopRankBinaryReduction ;MopReplicativeBinaryExpansion ;MopAddBorder ;);func (_eadf *Bitmaps )CountPixels ()*_dd .NumSlice {_ecbg :=&_dd .NumSlice {};for _ ,_gceb :=range _eadf .Values {_ecbg .AddInt (_gceb .CountPixels ());};return _ecbg ;};type byWidth Bitmaps ;func (_dcee *Bitmaps )GroupByWidth ()(*BitmapsArray ,error ){const _gcag ="\u0047\u0072\u006fu\u0070\u0042\u0079\u0057\u0069\u0064\u0074\u0068";if len (_dcee .Values )==0{return nil ,_a .Error (_gcag ,"\u006eo\u0020v\u0061\u006c\u0075\u0065\u0073 \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");};_bdaf :=&BitmapsArray {};_dcee .SortByWidth ();_ccecf :=-1;_acafc :=-1;for _ggfg :=0;_ggfg < len (_dcee .Values );_ggfg ++{_dfce :=_dcee .Values [_ggfg ].Width ;if _dfce > _ccecf {_ccecf =_dfce ;_acafc ++;_bdaf .Values =append (_bdaf .Values ,&Bitmaps {});};_bdaf .Values [_acafc ].AddBitmap (_dcee .Values [_ggfg ]);};return _bdaf ,nil ;};func _eddb (_cdde *Bitmap )(_dbea *Bitmap ,_gacg int ,_agbg error ){const _ggce ="\u0042i\u0074\u006d\u0061\u0070.\u0077\u006f\u0072\u0064\u004da\u0073k\u0042y\u0044\u0069\u006c\u0061\u0074\u0069\u006fn";if _cdde ==nil {return nil ,0,_a .Errorf (_ggce ,"\u0027\u0073\u0027\u0020bi\u0074\u006d\u0061\u0070\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006ee\u0064");};var _deacd ,_dcega *Bitmap ;if _deacd ,_agbg =_fffe (nil ,_cdde );_agbg !=nil {return nil ,0,_a .Wrap (_agbg ,_ggce ,"\u0063\u006f\u0070\u0079\u0020\u0027\u0073\u0027");};var (_affb [13]int ;_dfbf ,_dcff int ;);_agdb :=12;_eaag :=_dd .NewNumSlice (_agdb +1);_dcfa :=_dd .NewNumSlice (_agdb +1);var _cbac *Boxes ;for _fabf :=0;_fabf <=_agdb ;_fabf ++{if _fabf ==0{if _dcega ,_agbg =_fffe (nil ,_deacd );_agbg !=nil {return nil ,0,_a .Wrap (_agbg ,_ggce ,"\u0066i\u0072\u0073\u0074\u0020\u0062\u006d2");};}else {if _dcega ,_agbg =_bbaf (_deacd ,MorphProcess {Operation :MopDilation ,Arguments :[]int {2,1}});_agbg !=nil {return nil ,0,_a .Wrap (_agbg ,_ggce ,"\u0064\u0069\u006ca\u0074\u0069\u006f\u006e\u0020\u0062\u006d\u0032");};};if _cbac ,_agbg =_dcega .connComponentsBB (4);_agbg !=nil {return nil ,0,_a .Wrap (_agbg ,_ggce ,"");};_affb [_fabf ]=len (*_cbac );_eaag .AddInt (_affb [_fabf ]);switch _fabf {case 0:_dfbf =_affb [0];default:_dcff =_affb [_fabf -1]-_affb [_fabf ];_dcfa .AddInt (_dcff );};_deacd =_dcega ;};_cfec :=true ;_adfb :=2;var _bdb ,_dfgc int ;for _edfb :=1;_edfb < len (*_dcfa );_edfb ++{if _bdb ,_agbg =_eaag .GetInt (_edfb );_agbg !=nil {return nil ,0,_a .Wrap (_agbg ,_ggce ,"\u0043\u0068\u0065\u0063ki\u006e\u0067\u0020\u0062\u0065\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0069o\u006e");};if _cfec &&_bdb < int (0.3*float32 (_dfbf )){_adfb =_edfb +1;_cfec =false ;};if _dcff ,_agbg =_dcfa .GetInt (_edfb );_agbg !=nil {return nil ,0,_a .Wrap (_agbg ,_ggce ,"\u0067\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u006ea\u0044\u0069\u0066\u0066");};if _dcff > _dfgc {_dfgc =_dcff ;};};_feba :=_cdde .XResolution ;if _feba ==0{_feba =150;};if _feba > 110{_adfb ++;};if _adfb < 2{_be .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");_adfb =2;};_gacg =_adfb +1;if _dbea ,_agbg =_ecaf (nil ,_cdde ,_adfb +1,1);_agbg !=nil {return nil ,0,_a .Wrap (_agbg ,_ggce ,"\u0067\u0065\u0074\u0074in\u0067\u0020\u006d\u0061\u0073\u006b\u0020\u0066\u0061\u0069\u006c\u0065\u0064");};return _dbea ,_gacg ,nil ;};const (CmbOpOr CombinationOperator =iota ;CmbOpAnd ;CmbOpXor ;CmbOpXNor ;CmbOpReplace ;CmbOpNot ;);func (_eccd *ClassedPoints )Less (i ,j int )bool {return _eccd ._cbcc (i ,j )};func (_aega *Bitmap )GetByteIndex (x ,y int )int {return y *_aega .RowStride +(x >>3)};func _cead (_bdff *Bitmap ,_abbab *Bitmap ,_badb int )(_ggfb error ){const _fdbgb ="\u0073\u0065\u0065\u0064\u0066\u0069\u006c\u006c\u0042\u0069\u006e\u0061r\u0079\u004c\u006f\u0077";_eddc :=_gbda (_bdff .Height ,_abbab .Height );_dedc :=_gbda (_bdff .RowStride ,_abbab .RowStride );switch _badb {case 4:_ggfb =_egfg (_bdff ,_abbab ,_eddc ,_dedc );case 8:_ggfb =_cgce (_bdff ,_abbab ,_eddc ,_dedc );default:return _a .Errorf (_fdbgb ,"\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",_badb );};if _ggfb !=nil {return _a .Wrap (_ggfb ,_fdbgb ,"");};return nil ;};func (_cabe *ClassedPoints )ySortFunction ()func (_gdca int ,_gdgab int )bool {return func (_abba ,_fedb int )bool {return _cabe .YAtIndex (_abba )< _cabe .YAtIndex (_fedb )};};func (_cdfg *Points )Add (pt *Points )error {const _dgfdg ="\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0041\u0064\u0064";if _cdfg ==nil {return _a .Error (_dgfdg ,"\u0070o\u0069n\u0074\u0073\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if pt ==nil {return _a .Error (_dgfdg ,"a\u0072\u0067\u0075\u006d\u0065\u006et\u0020\u0070\u006f\u0069\u006e\u0074\u0073\u0020\u006eo\u0074\u0020\u0064e\u0066i\u006e\u0065\u0064");};*_cdfg =append (*_cdfg ,*pt ...);return nil ;};func MorphSequence (src *Bitmap ,sequence ...MorphProcess )(*Bitmap ,error ){return _bbaf (src ,sequence ...);};func NewWithUnpaddedData (width ,height int ,data []byte )(*Bitmap ,error ){const _ggee ="\u004e\u0065\u0077\u0057it\u0068\u0055\u006e\u0070\u0061\u0064\u0064\u0065\u0064\u0044\u0061\u0074\u0061";_agce :=_ega (width ,height );_agce .Data =data ;if _faa :=((width *height )+7)>>3;len (data )< _faa {return nil ,_a .Errorf (_ggee ,"\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 ),_faa );};if _cffc :=_agce .addPadBits ();_cffc !=nil {return nil ,_a .Wrap (_cffc ,_ggee ,"");};return _agce ,nil ;};func (_cadd *byHeight )Less (i ,j int )bool {return _cadd .Values [i ].Height < _cadd .Values [j ].Height };func (_cdeg *Bitmap )nextOnPixel (_dfc ,_acd int )(_cge _b .Point ,_dee bool ,_aeac error ){const _cdcf ="n\u0065\u0078\u0074\u004f\u006e\u0050\u0069\u0078\u0065\u006c";_cge ,_dee ,_aeac =_cdeg .nextOnPixelLow (_cdeg .Width ,_cdeg .Height ,_cdeg .RowStride ,_dfc ,_acd );if _aeac !=nil {return _cge ,false ,_a .Wrap (_aeac ,_cdcf ,"");};return _cge ,_dee ,nil ;};func _dcgb (_aeea ,_cedc *Bitmap ,_bddg ,_fcf ,_fffa ,_dddgc ,_daga int ,_dcea CombinationOperator )error {var _ffg int ;_bgb :=func (){_ffg ++;_fffa +=_cedc .RowStride ;_dddgc +=_aeea .RowStride ;_daga +=_aeea .RowStride };for _ffg =_bddg ;_ffg < _fcf ;_bgb (){_efdf :=_fffa ;for _cgge :=_dddgc ;_cgge <=_daga ;_cgge ++{_cccb ,_cgda :=_cedc .GetByte (_efdf );if _cgda !=nil {return _cgda ;};_agdf ,_cgda :=_aeea .GetByte (_cgge );if _cgda !=nil {return _cgda ;};if _cgda =_cedc .SetByte (_efdf ,_fba (_cccb ,_agdf ,_dcea ));_cgda !=nil {return _cgda ;};_efdf ++;};};return nil ;};func (_dccc *Bitmap )connComponentsBitmapsBB (_ebbe *Bitmaps ,_cffafa int )(_fgfgf *Boxes ,_bfde error ){const _agf ="\u0063\u006f\u006enC\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074\u0073\u0042\u0069\u0074\u006d\u0061\u0070\u0073\u0042\u0042";if _cffafa !=4&&_cffafa !=8{return nil ,_a .Error (_agf ,"\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 _ebbe ==nil {return nil ,_a .Error (_agf ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0042\u0069\u0074ma\u0070\u0073");};if len (_ebbe .Values )> 0{return nil ,_a .Error (_agf ,"\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 _dccc .Zero (){return &Boxes {},nil ;};var (_dced ,_fegg ,_dbef ,_ecc *Bitmap ;);_dccc .setPadBits (0);if _dced ,_bfde =_fffe (nil ,_dccc );_bfde !=nil {return nil ,_a .Wrap (_bfde ,_agf ,"\u0062\u006d\u0031");};if _fegg ,_bfde =_fffe (nil ,_dccc );_bfde !=nil {return nil ,_a .Wrap (_bfde ,_agf ,"\u0062\u006d\u0032");};_effg :=&_dd .Stack {};_effg .Aux =&_dd .Stack {};_fgfgf =&Boxes {};var (_geda ,_ggfa int ;_gecc _b .Point ;_efae bool ;_eagc *_b .Rectangle ;);for {if _gecc ,_efae ,_bfde =_dced .nextOnPixel (_geda ,_ggfa );_bfde !=nil {return nil ,_a .Wrap (_bfde ,_agf ,"");};if !_efae {break ;};if _eagc ,_bfde =_eeefd (_dced ,_effg ,_gecc .X ,_gecc .Y ,_cffafa );_bfde !=nil {return nil ,_a .Wrap (_bfde ,_agf ,"");};if _bfde =_fgfgf .Add (_eagc );_bfde !=nil {return nil ,_a .Wrap (_bfde ,_agf ,"");};if _dbef ,_bfde =_dced .clipRectangle (_eagc ,nil );_bfde !=nil {return nil ,_a .Wrap (_bfde ,_agf ,"\u0062\u006d\u0033");};if _ecc ,_bfde =_fegg .clipRectangle (_eagc ,nil );_bfde !=nil {return nil ,_a .Wrap (_bfde ,_agf ,"\u0062\u006d\u0034");};if _ ,_bfde =_fbedc (_dbef ,_dbef ,_ecc );_bfde !=nil {return nil ,_a .Wrap (_bfde ,_agf ,"\u0062m\u0033\u0020\u005e\u0020\u0062\u006d4");};if _bfde =_fegg .RasterOperation (_eagc .Min .X ,_eagc .Min .Y ,_eagc .Dx (),_eagc .Dy (),PixSrcXorDst ,_dbef ,0,0);_bfde !=nil {return nil ,_a .Wrap (_bfde ,_agf ,"\u0062\u006d\u0032\u0020\u002d\u0058\u004f\u0052\u002d>\u0020\u0062\u006d\u0033");};_ebbe .AddBitmap (_dbef );_geda =_gecc .X ;_ggfa =_gecc .Y ;};_ebbe .Boxes =*_fgfgf ;return _fgfgf ,nil ;};func _dce (_eac *Bitmap ,_eff ...int )(_dac *Bitmap ,_bfa error ){const _eeg ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0043\u0061\u0073\u0063\u0061\u0064\u0065";if _eac ==nil {return nil ,_a .Error (_eeg ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};if len (_eff )==0||len (_eff )> 4{return nil ,_a .Error (_eeg ,"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 _eff [0]<=0{_be .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");_dac ,_bfa =_fffe (nil ,_eac );if _bfa !=nil {return nil ,_a .Wrap (_bfa ,_eeg ,"l\u0065\u0076\u0065\u006c\u0031\u0020\u003c\u003d\u0020\u0030");};return _dac ,nil ;};_bae :=_dcc ();_dac =_eac ;for _ecg ,_cff :=range _eff {if _cff <=0{break ;};_dac ,_bfa =_gcad (_dac ,_cff ,_bae );if _bfa !=nil {return nil ,_a .Wrapf (_bfa ,_eeg ,"\u006c\u0065\u0076\u0065\u006c\u0025\u0064\u0020\u0072\u0065\u0064\u0075c\u0074\u0069\u006f\u006e",_ecg );};};return _dac ,nil ;};func _dcd (_cf ,_fd *Bitmap )(_ee error ){const _ge ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0034";_bd :=_fd .RowStride ;_ef :=_cf .RowStride ;_dg :=_fd .RowStride *4-_cf .RowStride ;var (_gc ,_bc byte ;_eb uint32 ;_dcf ,_bac ,_ddc ,_gca ,_ddd ,_ca ,_fee int ;);for _ddc =0;_ddc < _fd .Height ;_ddc ++{_dcf =_ddc *_bd ;_bac =4*_ddc *_ef ;for _gca =0;_gca < _bd ;_gca ++{_gc =_fd .Data [_dcf +_gca ];_eb =_bbdg [_gc ];_ca =_bac +_gca *4;if _dg !=0&&(_gca +1)*4> _cf .RowStride {for _ddd =_dg ;_ddd > 0;_ddd --{_bc =byte ((_eb >>uint (_ddd *8))&0xff);_fee =_ca +(_dg -_ddd );if _ee =_cf .SetByte (_fee ,_bc );_ee !=nil {return _a .Wrapf (_ee ,_ge ,"D\u0069\u0066\u0066\u0065\u0072\u0065n\u0074\u0020\u0072\u006f\u0077\u0073\u0074\u0072\u0069d\u0065\u0073\u002e \u004b:\u0020\u0025\u0064",_ddd );};};}else if _ee =_cf .setFourBytes (_ca ,_eb );_ee !=nil {return _a .Wrap (_ee ,_ge ,"");};if _ee =_cf .setFourBytes (_bac +_gca *4,_bbdg [_fd .Data [_dcf +_gca ]]);_ee !=nil {return _a .Wrap (_ee ,_ge ,"");};};for _ddd =1;_ddd < 4;_ddd ++{for _gca =0;_gca < _ef ;_gca ++{if _ee =_cf .SetByte (_bac +_ddd *_ef +_gca ,_cf .Data [_bac +_gca ]);_ee !=nil {return _a .Wrapf (_ee ,_ge ,"\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",_ddd ,_gca );};};};};return nil ;};func _dgbg (_edad ,_bgdf *Bitmap ,_dabgb *Selection )(*Bitmap ,error ){const _dccac ="\u006f\u0070\u0065\u006e";var _ffgg error ;_edad ,_ffgg =_gegcc (_edad ,_bgdf ,_dabgb );if _ffgg !=nil {return nil ,_a .Wrap (_ffgg ,_dccac ,"");};_abdbc ,_ffgg :=_eefe (nil ,_bgdf ,_dabgb );if _ffgg !=nil {return nil ,_a .Wrap (_ffgg ,_dccac ,"");};_ ,_ffgg =_dfaa (_edad ,_abdbc ,_dabgb );if _ffgg !=nil {return nil ,_a .Wrap (_ffgg ,_dccac ,"");};return _edad ,nil ;};func (_dcac *ClassedPoints )GetIntYByClass (i int )(int ,error ){const _cfbe ="\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 >=_dcac .IntSlice .Size (){return 0,_a .Errorf (_cfbe ,"\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 (_dcac .YAtIndex (i )),nil ;};func (_bfacb *Boxes )Add (box *_b .Rectangle )error {if _bfacb ==nil {return _a .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");};*_bfacb =append (*_bfacb ,box );return nil ;};func TstGetScaledSymbol (t *_da .T ,sm *Bitmap ,scale ...int )*Bitmap {if len (scale )==0{return sm ;};if scale [0]==1{return sm ;};_gdffb ,_gede :=MorphSequence (sm ,MorphProcess {Operation :MopReplicativeBinaryExpansion ,Arguments :scale });_d .NoError (t ,_gede );return _gdffb ;};type Points []Point ;func (_aegc *Bitmap )CreateTemplate ()*Bitmap {return _aegc .createTemplate ()};func _eeefd (_gab *Bitmap ,_cgdd *_dd .Stack ,_daea ,_bebb ,_gcfa int )(_eeeb *_b .Rectangle ,_edba error ){const _bbdbg ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";if _gab ==nil {return nil ,_a .Error (_bbdbg ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");};if _cgdd ==nil {return nil ,_a .Error (_bbdbg ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");};switch _gcfa {case 4:if _eeeb ,_edba =_debc (_gab ,_cgdd ,_daea ,_bebb );_edba !=nil {return nil ,_a .Wrap (_edba ,_bbdbg ,"");};return _eeeb ,nil ;case 8:if _eeeb ,_edba =_dcbe (_gab ,_cgdd ,_daea ,_bebb );_edba !=nil {return nil ,_a .Wrap (_edba ,_bbdbg ,"");};return _eeeb ,nil ;default:return nil ,_a .Errorf (_bbdbg ,"\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",_gcfa );};};func (_badee *Bitmaps )SortByWidth (){_ggac :=(*byWidth )(_badee );_eg .Sort (_ggac )};func (_badea *byWidth )Less (i ,j int )bool {return _badea .Values [i ].Width < _badea .Values [j ].Width };func (_aecc Points )XSorter ()func (_gfa ,_gecd int )bool {return func (_eafa ,_cgc int )bool {return _aecc [_eafa ].X < _aecc [_cgc ].X };};func (_cdec CombinationOperator )String ()string {var _gda string ;switch _cdec {case CmbOpOr :_gda ="\u004f\u0052";case CmbOpAnd :_gda ="\u0041\u004e\u0044";case CmbOpXor :_gda ="\u0058\u004f\u0052";case CmbOpXNor :_gda ="\u0058\u004e\u004f\u0052";case CmbOpReplace :_gda ="\u0052E\u0050\u004c\u0041\u0043\u0045";case CmbOpNot :_gda ="\u004e\u004f\u0054";};return _gda ;};func _cbgdc (_ceagc *Bitmap ,_fdfa ,_fadd int ,_agfb ,_ccee int ,_beda RasterOperator ,_ccegc *Bitmap ,_ecec ,_abab int )error {var _acda ,_bca ,_effd ,_dcedg int ;if _fdfa < 0{_ecec -=_fdfa ;_agfb +=_fdfa ;_fdfa =0;};if _ecec < 0{_fdfa -=_ecec ;_agfb +=_ecec ;_ecec =0;};_acda =_fdfa +_agfb -_ceagc .Width ;if _acda > 0{_agfb -=_acda ;};_bca =_ecec +_agfb -_ccegc .Width ;if _bca > 0{_agfb -=_bca ;};if _fadd < 0{_abab -=_fadd ;_ccee +=_fadd ;_fadd =0;};if _abab < 0{_fadd -=_abab ;_ccee +=_abab ;_abab =0;};_effd =_fadd +_ccee -_ceagc .Height ;if _effd > 0{_ccee -=_effd ;};_dcedg =_abab +_ccee -_ccegc .Height ;if _dcedg > 0{_ccee -=_dcedg ;};if _agfb <=0||_ccee <=0{return nil ;};var _agaf error ;switch {case _fdfa &7==0&&_ecec &7==0:_agaf =_cadf (_ceagc ,_fdfa ,_fadd ,_agfb ,_ccee ,_beda ,_ccegc ,_ecec ,_abab );case _fdfa &7==_ecec &7:_agaf =_fcab (_ceagc ,_fdfa ,_fadd ,_agfb ,_ccee ,_beda ,_ccegc ,_ecec ,_abab );default:_agaf =_cage (_ceagc ,_fdfa ,_fadd ,_agfb ,_ccee ,_beda ,_ccegc ,_ecec ,_abab );};if _agaf !=nil {return _a .Wrap (_agaf ,"r\u0061\u0073\u0074\u0065\u0072\u004f\u0070\u004c\u006f\u0077","");};return nil ;};func _g (_gf ,_dc *Bitmap )(_gd error ){const _fe ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0032";_ce :=_dc .RowStride ;_ab :=_gf .RowStride ;var (_abe byte ;_ff uint16 ;_gdf ,_ffd ,_af ,_ae ,_ba int ;);for _af =0;_af < _dc .Height ;_af ++{_gdf =_af *_ce ;_ffd =2*_af *_ab ;for _ae =0;_ae < _ce ;_ae ++{_abe =_dc .Data [_gdf +_ae ];_ff =_ddcg [_abe ];_ba =_ffd +_ae *2;if _gf .RowStride !=_dc .RowStride *2&&(_ae +1)*2> _gf .RowStride {_gd =_gf .SetByte (_ba ,byte (_ff >>8));}else {_gd =_gf .setTwoBytes (_ba ,_ff );};if _gd !=nil {return _a .Wrap (_gd ,_fe ,"");};};for _ae =0;_ae < _ab ;_ae ++{_ba =_ffd +_ab +_ae ;_abe =_gf .Data [_ffd +_ae ];if _gd =_gf .SetByte (_ba ,_abe );_gd !=nil {return _a .Wrapf (_gd ,_fe ,"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",_ffd +_ae ,_ffd +_ab +_ae );};};};return nil ;};type fillSegment struct{_ecdcb int ;_edeag int ;_faee int ;_gade int ;};type LocationFilter int ;func _cedf (_eacb *_dd .Stack )(_fgceg *fillSegment ,_dedd error ){const _dbda ="\u0070\u006f\u0070\u0046\u0069\u006c\u006c\u0053\u0065g\u006d\u0065\u006e\u0074";if _eacb ==nil {return nil ,_a .Error (_dbda ,"\u006ei\u006c \u0073\u0074\u0061\u0063\u006b \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");};if _eacb .Aux ==nil {return nil ,_a .Error (_dbda ,"a\u0075x\u0053\u0074\u0061\u0063\u006b\u0020\u006e\u006ft\u0020\u0064\u0065\u0066in\u0065\u0064");};_bbde ,_gfbbd :=_eacb .Pop ();if !_gfbbd {return nil ,nil ;};_caea ,_gfbbd :=_bbde .(*fillSegment );if !_gfbbd {return nil ,_a .Error (_dbda ,"\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");};_fgceg =&fillSegment {_caea ._ecdcb ,_caea ._edeag ,_caea ._faee +_caea ._gade ,_caea ._gade };_eacb .Aux .Push (_caea );return _fgceg ,nil ;};func (_cbaf *Bitmap )setEightBytes (_gaag int ,_cfaac uint64 )error {_adf :=_cbaf .RowStride -(_gaag %_cbaf .RowStride );if _cbaf .RowStride !=_cbaf .Width >>3{_adf --;};if _adf >=8{return _cbaf .setEightFullBytes (_gaag ,_cfaac );};return _cbaf .setEightPartlyBytes (_gaag ,_adf ,_cfaac );};const (SelDontCare SelectionValue =iota ;SelHit ;SelMiss ;);func _deadc (_ffa ,_deba ,_eddbe *Bitmap ,_dcgga int )(*Bitmap ,error ){const _debaa ="\u0073\u0065\u0065\u0064\u0046\u0069\u006c\u006c\u0042i\u006e\u0061\u0072\u0079";if _deba ==nil {return nil ,_a .Error (_debaa ,"s\u006fu\u0072\u0063\u0065\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");};if _eddbe ==nil {return nil ,_a .Error (_debaa ,"'\u006da\u0073\u006b\u0027\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");};if _dcgga !=4&&_dcgga !=8{return nil ,_a .Error (_debaa ,"\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 _ebee error ;_ffa ,_ebee =_fffe (_ffa ,_deba );if _ebee !=nil {return nil ,_a .Wrap (_ebee ,_debaa ,"\u0063o\u0070y\u0020\u0073\u006f\u0075\u0072c\u0065\u0020t\u006f\u0020\u0027\u0064\u0027");};_gfbab :=_deba .createTemplate ();_eddbe .setPadBits (0);for _ggbb :=0;_ggbb < _fece ;_ggbb ++{_gfbab ,_ebee =_fffe (_gfbab ,_ffa );if _ebee !=nil {return nil ,_a .Wrapf (_ebee ,_debaa ,"\u0069\u0074\u0065\u0072\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0064",_ggbb );};if _ebee =_cead (_ffa ,_eddbe ,_dcgga );_ebee !=nil {return nil ,_a .Wrapf (_ebee ,_debaa ,"\u0069\u0074\u0065\u0072\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0064",_ggbb );};if _gfbab .Equals (_ffa ){break ;};};return _ffa ,nil ;};type SizeComparison int ;func _ceaa (_beabe ,_fcbe *Bitmap ,_daed ,_faaa int )(*Bitmap ,error ){const _cabg ="\u0063\u006c\u006f\u0073\u0065\u0053\u0061\u0066\u0065B\u0072\u0069\u0063\u006b";if _fcbe ==nil {return nil ,_a .Error (_cabg ,"\u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _daed < 1||_faaa < 1{return nil ,_a .Error (_cabg ,"\u0068s\u0069\u007a\u0065\u0020\u0061\u006e\u0064\u0020\u0076\u0073\u0069z\u0065\u0020\u006e\u006f\u0074\u0020\u003e\u003d\u0020\u0031");};if _daed ==1&&_faaa ==1{return _fffe (_beabe ,_fcbe );};if MorphBC ==SymmetricMorphBC {_afgbe ,_bfed :=_ecaf (_beabe ,_fcbe ,_daed ,_faaa );if _bfed !=nil {return nil ,_a .Wrap (_bfed ,_cabg ,"\u0053\u0079m\u006d\u0065\u0074r\u0069\u0063\u004d\u006f\u0072\u0070\u0068\u0042\u0043");};return _afgbe ,nil ;};_bceb :=_aafe (_daed /2,_faaa /2);_efdg :=8*((_bceb +7)/8);_cdb ,_eaae :=_fcbe .AddBorder (_efdg ,0);if _eaae !=nil {return nil ,_a .Wrapf (_eaae ,_cabg ,"\u0042\u006f\u0072\u0064\u0065\u0072\u0053\u0069\u007ae\u003a\u0020\u0025\u0064",_efdg );};var _dagce ,_fefd *Bitmap ;if _daed ==1||_faaa ==1{_gbdcc :=SelCreateBrick (_faaa ,_daed ,_faaa /2,_daed /2,SelHit );_dagce ,_eaae =_afaa (nil ,_cdb ,_gbdcc );if _eaae !=nil {return nil ,_a .Wrap (_eaae ,_cabg ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");};}else {_fdbg :=SelCreateBrick (1,_daed ,0,_daed /2,SelHit );_adga ,_bcea :=_dfaa (nil ,_cdb ,_fdbg );if _bcea !=nil {return nil ,_a .Wrap (_bcea ,_cabg ,"\u0072\u0065\u0067\u0075la\u0072\u0020\u002d\u0020\u0066\u0069\u0072\u0073\u0074\u0020\u0064\u0069\u006c\u0061t\u0065");};_adbgg :=SelCreateBrick (_faaa ,1,_faaa /2,0,SelHit );_dagce ,_bcea =_dfaa (nil ,_adga ,_adbgg );if _bcea !=nil {return nil ,_a .Wrap (_bcea ,_cabg ,"\u0072\u0065\u0067ul\u0061\u0072\u0020\u002d\u0020\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};if _ ,_bcea =_eefe (_adga ,_dagce ,_fdbg );_bcea !=nil {return nil ,_a .Wrap (_bcea ,_cabg ,"r\u0065\u0067\u0075\u006car\u0020-\u0020\u0066\u0069\u0072\u0073t\u0020\u0065\u0072\u006f\u0064\u0065");};if _ ,_bcea =_eefe (_dagce ,_adga ,_adbgg );_bcea !=nil {return nil ,_a .Wrap (_bcea ,_cabg ,"\u0072\u0065\u0067\u0075la\u0072\u0020\u002d\u0020\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0065\u0072\u006fd\u0065");};};if _fefd ,_eaae =_dagce .RemoveBorder (_efdg );_eaae !=nil {return nil ,_a .Wrap (_eaae ,_cabg ,"\u0072e\u0067\u0075\u006c\u0061\u0072");};if _beabe ==nil {return _fefd ,nil ;};if _ ,_eaae =_fffe (_beabe ,_fefd );_eaae !=nil {return nil ,_eaae ;};return _beabe ,nil ;};func _fbedc (_gfca ,_bgag ,_gcd *Bitmap )(*Bitmap ,error ){const _aeb ="\u0062\u0069\u0074\u006d\u0061\u0070\u002e\u0078\u006f\u0072";if _bgag ==nil {return nil ,_a .Error (_aeb ,"'\u0062\u0031\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _gcd ==nil {return nil ,_a .Error (_aeb ,"'\u0062\u0032\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _gfca ==_gcd {return nil ,_a .Error (_aeb ,"'\u0064\u0027\u0020\u003d\u003d\u0020\u0027\u0062\u0032\u0027");};if !_bgag .SizesEqual (_gcd ){_be .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",_aeb );};var _eadg error ;if _gfca ,_eadg =_fffe (_gfca ,_bgag );_eadg !=nil {return nil ,_a .Wrap (_eadg ,_aeb ,"\u0063\u0061n\u0027\u0074\u0020c\u0072\u0065\u0061\u0074\u0065\u0020\u0027\u0064\u0027");};if _eadg =_gfca .RasterOperation (0,0,_gfca .Width ,_gfca .Height ,PixSrcXorDst ,_gcd ,0,0);_eadg !=nil {return nil ,_a .Wrap (_eadg ,_aeb ,"");};return _gfca ,nil ;};func (_fcca *Bitmaps )ClipToBitmap (s *Bitmap )(*Bitmaps ,error ){const _cgac ="B\u0069t\u006d\u0061\u0070\u0073\u002e\u0043\u006c\u0069p\u0054\u006f\u0042\u0069tm\u0061\u0070";if _fcca ==nil {return nil ,_a .Error (_cgac ,"\u0042\u0069\u0074\u006dap\u0073\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};if s ==nil {return nil ,_a .Error (_cgac ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};_fdff :=len (_fcca .Values );_abfbg :=&Bitmaps {Values :make ([]*Bitmap ,_fdff ),Boxes :make ([]*_b .Rectangle ,_fdff )};var (_eabe ,_cfdeg *Bitmap ;_bcgd *_b .Rectangle ;_afgg error ;);for _babc :=0;_babc < _fdff ;_babc ++{if _eabe ,_afgg =_fcca .GetBitmap (_babc );_afgg !=nil {return nil ,_a .Wrap (_afgg ,_cgac ,"");};if _bcgd ,_afgg =_fcca .GetBox (_babc );_afgg !=nil {return nil ,_a .Wrap (_afgg ,_cgac ,"");};if _cfdeg ,_afgg =s .clipRectangle (_bcgd ,nil );_afgg !=nil {return nil ,_a .Wrap (_afgg ,_cgac ,"");};if _cfdeg ,_afgg =_cfdeg .And (_eabe );_afgg !=nil {return nil ,_a .Wrap (_afgg ,_cgac ,"");};_abfbg .Values [_babc ]=_cfdeg ;_abfbg .Boxes [_babc ]=_bcgd ;};return _abfbg ,nil ;};func (_geg *Bitmap )GetBitOffset (x int )int {return x &0x07};type Bitmap struct{Width ,Height int ;BitmapNumber int ;RowStride int ;Data []byte ;Color Color ;Special int ;Text string ;XResolution ,YResolution int ;};func (_ccfb *Bitmap )SetPadBits (value int ){_ccfb .setPadBits (value )};func SelCreateBrick (h ,w int ,cy ,cx int ,tp SelectionValue )*Selection {_cegcg :=_bffe (h ,w ,"");_cegcg .setOrigin (cy ,cx );var _dedaf ,_cffac int ;for _dedaf =0;_dedaf < h ;_dedaf ++{for _cffac =0;_cffac < w ;_cffac ++{_cegcg .Data [_dedaf ][_cffac ]=tp ;};};return _cegcg ;};var (_ddcg =_ad ();_bbdg =_bda ();_gaab =_fg (););func (_addb *Bitmap )RemoveBorderGeneral (left ,right ,top ,bot int )(*Bitmap ,error ){return _addb .removeBorderGeneral (left ,right ,top ,bot );};func TstWSymbol (t *_da .T ,scale ...int )*Bitmap {_fbfb ,_acec :=NewWithData (5,5,[]byte {0x88,0x88,0xA8,0xD8,0x88});_d .NoError (t ,_acec );return TstGetScaledSymbol (t ,_fbfb ,scale ...);};func (_cfdd *ClassedPoints )validateIntSlice ()error {const _eaagg ="\u0076\u0061l\u0069\u0064\u0061t\u0065\u0049\u006e\u0074\u0053\u006c\u0069\u0063\u0065";for _ ,_gcgd :=range _cfdd .IntSlice {if _gcgd >=(_cfdd .Points .Size ()){return _a .Errorf (_eaagg ,"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",_gcgd ,_cfdd .Points .Size ());};};return nil ;};func _ecgb (_dcdf ,_bcdg *Bitmap ,_aefa ,_afed int )(*Bitmap ,error ){const _efdb ="d\u0069\u006c\u0061\u0074\u0065\u0042\u0072\u0069\u0063\u006b";if _bcdg ==nil {_be .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 ,_a .Error (_efdb ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};if _aefa < 1||_afed < 1{return nil ,_a .Error (_efdb ,"\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 _aefa ==1&&_afed ==1{_dcgd ,_aeba :=_fffe (_dcdf ,_bcdg );if _aeba !=nil {return nil ,_a .Wrap (_aeba ,_efdb ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u0026\u0026 \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");};return _dcgd ,nil ;};if _aefa ==1||_afed ==1{_dbbe :=SelCreateBrick (_afed ,_aefa ,_afed /2,_aefa /2,SelHit );_dcaf ,_ccgb :=_dfaa (_dcdf ,_bcdg ,_dbbe );if _ccgb !=nil {return nil ,_a .Wrap (_ccgb ,_efdb ,"\u0068s\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");};return _dcaf ,nil ;};_cgec :=SelCreateBrick (1,_aefa ,0,_aefa /2,SelHit );_ggeb :=SelCreateBrick (_afed ,1,_afed /2,0,SelHit );_cadef ,_ebgdb :=_dfaa (nil ,_bcdg ,_cgec );if _ebgdb !=nil {return nil ,_a .Wrap (_ebgdb ,_efdb ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};_dcdf ,_ebgdb =_dfaa (_dcdf ,_cadef ,_ggeb );if _ebgdb !=nil {return nil ,_a .Wrap (_ebgdb ,_efdb ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};return _dcdf ,nil ;};func (_afgc *Bitmap )SetByte (index int ,v byte )error {if index > len (_afgc .Data )-1||index < 0{return _a .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 );};_afgc .Data [index ]=v ;return nil ;};func TstWordBitmapWithSpaces (t *_da .T ,scale ...int )*Bitmap {_efab :=1;if len (scale )> 0{_efab =scale [0];};_eaff :=3;_bfcb :=9+7+15+2*_eaff +2*_eaff ;_gabe :=5+_eaff +5+2*_eaff ;_acfg :=New (_bfcb *_efab ,_gabe *_efab );_dgcaf :=&Bitmaps {};var _ccb *int ;_eaff *=_efab ;_gadba :=_eaff ;_ccb =&_gadba ;_adea :=_eaff ;_fcbc :=TstDSymbol (t ,scale ...);TstAddSymbol (t ,_dgcaf ,_fcbc ,_ccb ,_adea ,1*_efab );_fcbc =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_dgcaf ,_fcbc ,_ccb ,_adea ,_eaff );_fcbc =TstISymbol (t ,scale ...);TstAddSymbol (t ,_dgcaf ,_fcbc ,_ccb ,_adea ,1*_efab );_fcbc =TstTSymbol (t ,scale ...);TstAddSymbol (t ,_dgcaf ,_fcbc ,_ccb ,_adea ,_eaff );_fcbc =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_dgcaf ,_fcbc ,_ccb ,_adea ,1*_efab );_fcbc =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_dgcaf ,_fcbc ,_ccb ,_adea ,1*_efab );_fcbc =TstWSymbol (t ,scale ...);TstAddSymbol (t ,_dgcaf ,_fcbc ,_ccb ,_adea ,0);*_ccb =_eaff ;_adea =5*_efab +_eaff ;_fcbc =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_dgcaf ,_fcbc ,_ccb ,_adea ,1*_efab );_fcbc =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_dgcaf ,_fcbc ,_ccb ,_adea ,_eaff );_fcbc =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_dgcaf ,_fcbc ,_ccb ,_adea ,1*_efab );_fcbc =TstESymbol (t ,scale ...);TstAddSymbol (t ,_dgcaf ,_fcbc ,_ccb ,_adea ,1*_efab );_fcbc =TstVSymbol (t ,scale ...);TstAddSymbol (t ,_dgcaf ,_fcbc ,_ccb ,_adea ,1*_efab );_fcbc =TstESymbol (t ,scale ...);TstAddSymbol (t ,_dgcaf ,_fcbc ,_ccb ,_adea ,1*_efab );_fcbc =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_dgcaf ,_fcbc ,_ccb ,_adea ,0);TstWriteSymbols (t ,_dgcaf ,_acfg );return _acfg ;};func (_bfac *Bitmap )clipRectangle (_fgb ,_abde *_b .Rectangle )(_aea *Bitmap ,_efd error ){const _ggf ="\u0063\u006c\u0069\u0070\u0052\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065";if _fgb ==nil {return nil ,_a .Error (_ggf ,"\u0070r\u006fv\u0069\u0064\u0065\u0064\u0020n\u0069\u006c \u0027\u0062\u006f\u0078\u0027");};_aceec ,_cbge :=_bfac .Width ,_bfac .Height ;_fdf ,_efd :=ClipBoxToRectangle (_fgb ,_aceec ,_cbge );if _efd !=nil {_be .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",_efd );return nil ,nil ;};_cbgd ,_cfeg :=_fdf .Min .X ,_fdf .Min .Y ;_gecea ,_dddc :=_fdf .Max .X -_fdf .Min .X ,_fdf .Max .Y -_fdf .Min .Y ;_aea =New (_gecea ,_dddc );_aea .Text =_bfac .Text ;if _efd =_aea .RasterOperation (0,0,_gecea ,_dddc ,PixSrc ,_bfac ,_cbgd ,_cfeg );_efd !=nil {return nil ,_a .Wrap (_efd ,_ggf ,"");};if _abde !=nil {*_abde =*_fdf ;};return _aea ,nil ;};func (_fdbf *BitmapsArray )AddBox (box *_b .Rectangle ){_fdbf .Boxes =append (_fdbf .Boxes ,box )};func TstNSymbol (t *_da .T ,scale ...int )*Bitmap {_agfbb ,_dabb :=NewWithData (4,5,[]byte {0x90,0xD0,0xB0,0x90,0x90});_d .NoError (t ,_dabb );return TstGetScaledSymbol (t ,_agfbb ,scale ...);};func TstCSymbol (t *_da .T )*Bitmap {t .Helper ();_cdbg :=New (6,6);_d .NoError (t ,_cdbg .SetPixel (1,0,1));_d .NoError (t ,_cdbg .SetPixel (2,0,1));_d .NoError (t ,_cdbg .SetPixel (3,0,1));_d .NoError (t ,_cdbg .SetPixel (4,0,1));_d .NoError (t ,_cdbg .SetPixel (0,1,1));_d .NoError (t ,_cdbg .SetPixel (5,1,1));_d .NoError (t ,_cdbg .SetPixel (0,2,1));_d .NoError (t ,_cdbg .SetPixel (0,3,1));_d .NoError (t ,_cdbg .SetPixel (0,4,1));_d .NoError (t ,_cdbg .SetPixel (5,4,1));_d .NoError (t ,_cdbg .SetPixel (1,5,1));_d .NoError (t ,_cdbg .SetPixel (2,5,1));_d .NoError (t ,_cdbg .SetPixel (3,5,1));_d .NoError (t ,_cdbg .SetPixel (4,5,1));return _cdbg ;};func _fddb (_fbgf *Bitmap ,_abeee ,_abaf ,_gbge ,_fafd int ,_caed RasterOperator ){if _abeee < 0{_gbge +=_abeee ;_abeee =0;};_cgba :=_abeee +_gbge -_fbgf .Width ;if _cgba > 0{_gbge -=_cgba ;};if _abaf < 0{_fafd +=_abaf ;_abaf =0;};_fcaeb :=_abaf +_fafd -_fbgf .Height ;if _fcaeb > 0{_fafd -=_fcaeb ;};if _gbge <=0||_fafd <=0{return ;};if (_abeee &7)==0{_bcac (_fbgf ,_abeee ,_abaf ,_gbge ,_fafd ,_caed );}else {_adcc (_fbgf ,_abeee ,_abaf ,_gbge ,_fafd ,_caed );};};func NewWithData (width ,height int ,data []byte )(*Bitmap ,error ){const _ece ="N\u0065\u0077\u0057\u0069\u0074\u0068\u0044\u0061\u0074\u0061";_agc :=_ega (width ,height );_agc .Data =data ;if len (data )< height *_agc .RowStride {return nil ,_a .Errorf (_ece ,"\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 *_agc .RowStride );};return _agc ,nil ;};func _dcg (_fgg ,_afg *Bitmap ,_ceef int ,_gae []byte ,_acee int )(_caf error ){const _ggd ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0032";var (_bfd ,_adgdf ,_bad ,_efbe ,_gfea ,_cbc ,_ebcc ,_efc int ;_cfc ,_aag ,_cfa ,_gcg uint32 ;_ade ,_fga byte ;_dfg uint16 ;);_ecb :=make ([]byte ,4);_ccc :=make ([]byte ,4);for _bad =0;_bad < _fgg .Height -1;_bad ,_efbe =_bad +2,_efbe +1{_bfd =_bad *_fgg .RowStride ;_adgdf =_efbe *_afg .RowStride ;for _gfea ,_cbc =0,0;_gfea < _acee ;_gfea ,_cbc =_gfea +4,_cbc +1{for _ebcc =0;_ebcc < 4;_ebcc ++{_efc =_bfd +_gfea +_ebcc ;if _efc <=len (_fgg .Data )-1&&_efc < _bfd +_fgg .RowStride {_ecb [_ebcc ]=_fgg .Data [_efc ];}else {_ecb [_ebcc ]=0x00;};_efc =_bfd +_fgg .RowStride +_gfea +_ebcc ;if _efc <=len (_fgg .Data )-1&&_efc < _bfd +(2*_fgg .RowStride ){_ccc [_ebcc ]=_fgg .Data [_efc ];}else {_ccc [_ebcc ]=0x00;};};_cfc =_c .BigEndian .Uint32 (_ecb );_aag =_c .BigEndian .Uint32 (_ccc );_cfa =_cfc &_aag ;_cfa |=_cfa <<1;_gcg =_cfc |_aag ;_gcg &=_gcg <<1;_aag =_cfa |_gcg ;_aag &=0xaaaaaaaa;_cfc =_aag |(_aag <<7);_ade =byte (_cfc >>24);_fga =byte ((_cfc >>8)&0xff);_efc =_adgdf +_cbc ;if _efc +1==len (_afg .Data )-1||_efc +1>=_adgdf +_afg .RowStride {if _caf =_afg .SetByte (_efc ,_gae [_ade ]);_caf !=nil {return _a .Wrapf (_caf ,_ggd ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_efc );};}else {_dfg =(uint16 (_gae [_ade ])<<8)|uint16 (_gae [_fga ]);if _caf =_afg .setTwoBytes (_efc ,_dfg );_caf !=nil {return _a .Wrapf (_caf ,_ggd ,"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",_efc );};_cbc ++;};};};return nil ;};func (_cdeb *Bitmap )ThresholdPixelSum (thresh int ,tab8 []int )(_dbd bool ,_ddcb error ){const _geff ="\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 =_bbabe ();};_fbc :=_cdeb .Width >>3;_gfc :=_cdeb .Width &7;_fcc :=byte (0xff<<uint (8-_gfc ));var (_eba ,_dbae ,_cba ,_gbfd int ;_caa byte ;);for _eba =0;_eba < _cdeb .Height ;_eba ++{_cba =_cdeb .RowStride *_eba ;for _dbae =0;_dbae < _fbc ;_dbae ++{_caa ,_ddcb =_cdeb .GetByte (_cba +_dbae );if _ddcb !=nil {return false ,_a .Wrap (_ddcb ,_geff ,"\u0066\u0075\u006c\u006c\u0042\u0079\u0074\u0065");};_gbfd +=tab8 [_caa ];};if _gfc !=0{_caa ,_ddcb =_cdeb .GetByte (_cba +_dbae );if _ddcb !=nil {return false ,_a .Wrap (_ddcb ,_geff ,"p\u0061\u0072\u0074\u0069\u0061\u006c\u0042\u0079\u0074\u0065");};_caa &=_fcc ;_gbfd +=tab8 [_caa ];};if _gbfd > thresh {return true ,nil ;};};return _dbd ,nil ;};var _ _eg .Interface =&ClassedPoints {};func (_gbfa *Bitmap )ToImage ()_b .Image {_edc ,_agdd :=_aa .NewImage (_gbfa .Width ,_gbfa .Height ,1,1,_gbfa .Data ,nil ,nil );if _agdd !=nil {_be .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",_agdd );};return _edc ;};var _deae [256]uint8 ;func ClipBoxToRectangle (box *_b .Rectangle ,wi ,hi int )(_ceca *_b .Rectangle ,_dagc error ){const _fgfg ="\u0043l\u0069p\u0042\u006f\u0078\u0054\u006fR\u0065\u0063t\u0061\u006e\u0067\u006c\u0065";if box ==nil {return nil ,_a .Error (_fgfg ,"\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 ,_a .Error (_fgfg ,"\u0027\u0062\u006fx'\u0020\u006f\u0075\u0074\u0073\u0069\u0064\u0065\u0020\u0072\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065");};_ceca =&(*box );if _ceca .Min .X < 0{_ceca .Max .X +=_ceca .Min .X ;_ceca .Min .X =0;};if _ceca .Min .Y < 0{_ceca .Max .Y +=_ceca .Min .Y ;_ceca .Min .Y =0;};if _ceca .Max .X > wi {_ceca .Max .X =wi ;};if _ceca .Max .Y > hi {_ceca .Max .Y =hi ;};return _ceca ,nil ;};func (_faef *Boxes )selectWithIndicator (_cbff *_dd .NumSlice )(_adbc *Boxes ,_dgab error ){const _gfbe ="\u0042o\u0078\u0065\u0073\u002es\u0065\u006c\u0065\u0063\u0074W\u0069t\u0068I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";if _faef ==nil {return nil ,_a .Error (_gfbe ,"b\u006f\u0078\u0065\u0073 '\u0062'\u0020\u006e\u006f\u0074\u0020d\u0065\u0066\u0069\u006e\u0065\u0064");};if _cbff ==nil {return nil ,_a .Error (_gfbe ,"\u0027\u006ea\u0027\u0020\u006eo\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};if len (*_cbff )!=len (*_faef ){return nil ,_a .Error (_gfbe ,"\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 _bbfe ,_bcef int ;for _egbb :=0;_egbb < len (*_cbff );_egbb ++{if _bbfe ,_dgab =_cbff .GetInt (_egbb );_dgab !=nil {return nil ,_a .Wrap (_dgab ,_gfbe ,"\u0063\u0068\u0065\u0063\u006b\u0069\u006e\u0067\u0020c\u006f\u0075\u006e\u0074");};if _bbfe ==1{_bcef ++;};};if _bcef ==len (*_faef ){return _faef ,nil ;};_fecce :=Boxes {};for _bfaf :=0;_bfaf < len (*_cbff );_bfaf ++{_bbfe =int ((*_cbff )[_bfaf ]);if _bbfe ==0{continue ;};_fecce =append (_fecce ,(*_faef )[_bfaf ]);};_adbc =&_fecce ;return _adbc ,nil ;};func _eefe (_aagd ,_dgbe *Bitmap ,_cdgae *Selection )(*Bitmap ,error ){const _gffge ="\u0065\u0072\u006fd\u0065";var (_ggbd error ;_acf *Bitmap ;);_aagd ,_ggbd =_fadb (_aagd ,_dgbe ,_cdgae ,&_acf );if _ggbd !=nil {return nil ,_a .Wrap (_ggbd ,_gffge ,"");};if _ggbd =_aagd .setAll ();_ggbd !=nil {return nil ,_a .Wrap (_ggbd ,_gffge ,"");};var _fdcc SelectionValue ;for _fbec :=0;_fbec < _cdgae .Height ;_fbec ++{for _gggg :=0;_gggg < _cdgae .Width ;_gggg ++{_fdcc =_cdgae .Data [_fbec ][_gggg ];if _fdcc ==SelHit {_ggbd =_babbd (_aagd ,_cdgae .Cx -_gggg ,_cdgae .Cy -_fbec ,_dgbe .Width ,_dgbe .Height ,PixSrcAndDst ,_acf ,0,0);if _ggbd !=nil {return nil ,_a .Wrap (_ggbd ,_gffge ,"");};};};};if MorphBC ==SymmetricMorphBC {return _aagd ,nil ;};_cgdg ,_cdgg ,_fgce ,_bfb :=_cdgae .findMaxTranslations ();if _cgdg > 0{if _ggbd =_aagd .RasterOperation (0,0,_cgdg ,_dgbe .Height ,PixClr ,nil ,0,0);_ggbd !=nil {return nil ,_a .Wrap (_ggbd ,_gffge ,"\u0078\u0070\u0020\u003e\u0020\u0030");};};if _fgce > 0{if _ggbd =_aagd .RasterOperation (_dgbe .Width -_fgce ,0,_fgce ,_dgbe .Height ,PixClr ,nil ,0,0);_ggbd !=nil {return nil ,_a .Wrap (_ggbd ,_gffge ,"\u0078\u006e\u0020\u003e\u0020\u0030");};};if _cdgg > 0{if _ggbd =_aagd .RasterOperation (0,0,_dgbe .Width ,_cdgg ,PixClr ,nil ,0,0);_ggbd !=nil {return nil ,_a .Wrap (_ggbd ,_gffge ,"\u0079\u0070\u0020\u003e\u0020\u0030");};};if _bfb > 0{if _ggbd =_aagd .RasterOperation (0,_dgbe .Height -_bfb ,_dgbe .Width ,_bfb ,PixClr ,nil ,0,0);_ggbd !=nil {return nil ,_a .Wrap (_ggbd ,_gffge ,"\u0079\u006e\u0020\u003e\u0020\u0030");};};return _aagd ,nil ;};const (AsymmetricMorphBC BoundaryCondition =iota ;SymmetricMorphBC ;);func _gcad (_edg *Bitmap ,_cde int ,_cae []byte )(_fabg *Bitmap ,_gge error ){const _dbf ="\u0072\u0065\u0064\u0075\u0063\u0065\u0052\u0061\u006e\u006b\u0042\u0069n\u0061\u0072\u0079\u0032";if _edg ==nil {return nil ,_a .Error (_dbf ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};if _cde < 1||_cde > 4{return nil ,_a .Error (_dbf ,"\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 _edg .Height <=1{return nil ,_a .Errorf (_dbf ,"\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",_edg .Height );};_fabg =New (_edg .Width /2,_edg .Height /2);if _cae ==nil {_cae =_dcc ();};_agd :=_gbda (_edg .RowStride ,2*_fabg .RowStride );switch _cde {case 1:_gge =_bgd (_edg ,_fabg ,_cde ,_cae ,_agd );case 2:_gge =_dcg (_edg ,_fabg ,_cde ,_cae ,_agd );case 3:_gge =_egc (_edg ,_fabg ,_cde ,_cae ,_agd );case 4:_gge =_aee (_edg ,_fabg ,_cde ,_cae ,_agd );};if _gge !=nil {return nil ,_gge ;};return _fabg ,nil ;};func (_cdcd *Selection )findMaxTranslations ()(_feab ,_dcga ,_bfbe ,_geadd int ){for _beee :=0;_beee < _cdcd .Height ;_beee ++{for _bebab :=0;_bebab < _cdcd .Width ;_bebab ++{if _cdcd .Data [_beee ][_bebab ]==SelHit {_feab =_aafe (_feab ,_cdcd .Cx -_bebab );_dcga =_aafe (_dcga ,_cdcd .Cy -_beee );_bfbe =_aafe (_bfbe ,_bebab -_cdcd .Cx );_geadd =_aafe (_geadd ,_beee -_cdcd .Cy );};};};return _feab ,_dcga ,_bfbe ,_geadd ;};func _adee (_bbfcd *_dd .Stack ,_edgbg ,_dagf ,_eceae ,_faad ,_dagcb int ,_aafc *_b .Rectangle )(_aeed error ){const _afeg ="\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 _bbfcd ==nil {return _a .Error (_afeg ,"\u006ei\u006c \u0073\u0074\u0061\u0063\u006b \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");};if _aafc ==nil {return _a .Error (_afeg ,"\u0070\u0072\u006f\u0076i\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0069\u006da\u0067e\u002e\u0052\u0065\u0063\u0074\u0061\u006eg\u006c\u0065");};_aafc .Min .X =_dd .Min (_aafc .Min .X ,_edgbg );_aafc .Max .X =_dd .Max (_aafc .Max .X ,_dagf );_aafc .Min .Y =_dd .Min (_aafc .Min .Y ,_eceae );_aafc .Max .Y =_dd .Max (_aafc .Max .Y ,_eceae );if !(_eceae +_faad >=0&&_eceae +_faad <=_dagcb ){return nil ;};if _bbfcd .Aux ==nil {return _a .Error (_afeg ,"a\u0075x\u0053\u0074\u0061\u0063\u006b\u0020\u006e\u006ft\u0020\u0064\u0065\u0066in\u0065\u0064");};var _effe *fillSegment ;_ecff ,_faab :=_bbfcd .Aux .Pop ();if _faab {if _effe ,_faab =_ecff .(*fillSegment );!_faab {return _a .Error (_afeg ,"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 {_effe =&fillSegment {};};_effe ._ecdcb =_edgbg ;_effe ._edeag =_dagf ;_effe ._faee =_eceae ;_effe ._gade =_faad ;_bbfcd .Push (_effe );return nil ;};func _fg ()(_dage [256]uint64 ){for _aec :=0;_aec < 256;_aec ++{if _aec &0x01!=0{_dage [_aec ]|=0xff;};if _aec &0x02!=0{_dage [_aec ]|=0xff00;};if _aec &0x04!=0{_dage [_aec ]|=0xff0000;};if _aec &0x08!=0{_dage [_aec ]|=0xff000000;};if _aec &0x10!=0{_dage [_aec ]|=0xff00000000;};if _aec &0x20!=0{_dage [_aec ]|=0xff0000000000;};if _aec &0x40!=0{_dage [_aec ]|=0xff000000000000;};if _aec &0x80!=0{_dage [_aec ]|=0xff00000000000000;};};return _dage ;};func _bgd (_adgd ,_bee *Bitmap ,_cfe int ,_fgf []byte ,_cea int )(_fad error ){const _ecgd ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0031";var (_cac ,_aaf ,_efg ,_add ,_egb ,_gac ,_gfe ,_dge int ;_gb ,_baa uint32 ;_acc ,_ace byte ;_bbe uint16 ;);_fbe :=make ([]byte ,4);_abd :=make ([]byte ,4);for _efg =0;_efg < _adgd .Height -1;_efg ,_add =_efg +2,_add +1{_cac =_efg *_adgd .RowStride ;_aaf =_add *_bee .RowStride ;for _egb ,_gac =0,0;_egb < _cea ;_egb ,_gac =_egb +4,_gac +1{for _gfe =0;_gfe < 4;_gfe ++{_dge =_cac +_egb +_gfe ;if _dge <=len (_adgd .Data )-1&&_dge < _cac +_adgd .RowStride {_fbe [_gfe ]=_adgd .Data [_dge ];}else {_fbe [_gfe ]=0x00;};_dge =_cac +_adgd .RowStride +_egb +_gfe ;if _dge <=len (_adgd .Data )-1&&_dge < _cac +(2*_adgd .RowStride ){_abd [_gfe ]=_adgd .Data [_dge ];}else {_abd [_gfe ]=0x00;};};_gb =_c .BigEndian .Uint32 (_fbe );_baa =_c .BigEndian .Uint32 (_abd );_baa |=_gb ;_baa |=_baa <<1;_baa &=0xaaaaaaaa;_gb =_baa |(_baa <<7);_acc =byte (_gb >>24);_ace =byte ((_gb >>8)&0xff);_dge =_aaf +_gac ;if _dge +1==len (_bee .Data )-1||_dge +1>=_aaf +_bee .RowStride {_bee .Data [_dge ]=_fgf [_acc ];}else {_bbe =(uint16 (_fgf [_acc ])<<8)|uint16 (_fgf [_ace ]);if _fad =_bee .setTwoBytes (_dge ,_bbe );_fad !=nil {return _a .Wrapf (_fad ,_ecgd ,"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",_dge );};_gac ++;};};};return nil ;};func _abgb (_aeef ,_dbee *Bitmap ,_cgeg ,_fgef ,_fef ,_cdea ,_ccaaa ,_fgbd ,_gbga ,_gdcf int ,_cab CombinationOperator )error {var _gecec int ;_geba :=func (){_gecec ++;_fef +=_dbee .RowStride ;_cdea +=_aeef .RowStride ;_ccaaa +=_aeef .RowStride };for _gecec =_cgeg ;_gecec < _fgef ;_geba (){var _ccd uint16 ;_aab :=_fef ;for _feef :=_cdea ;_feef <=_ccaaa ;_feef ++{_dgga ,_eefd :=_dbee .GetByte (_aab );if _eefd !=nil {return _eefd ;};_fefg ,_eefd :=_aeef .GetByte (_feef );if _eefd !=nil {return _eefd ;};_ccd =(_ccd |uint16 (_fefg ))<<uint (_gdcf );_fefg =byte (_ccd >>8);if _feef ==_ccaaa {_fefg =_gdd (uint (_fgbd ),_fefg );};if _eefd =_dbee .SetByte (_aab ,_fba (_dgga ,_fefg ,_cab ));_eefd !=nil {return _eefd ;};_aab ++;_ccd <<=uint (_gbga );};};return nil ;};type RasterOperator int ;func (_eca *Bitmap )addPadBits ()(_beac error ){const _gce ="\u0062\u0069\u0074\u006d\u0061\u0070\u002e\u0061\u0064\u0064\u0050\u0061d\u0042\u0069\u0074\u0073";_aaag :=_eca .Width %8;if _aaag ==0{return nil ;};_gaae :=_eca .Width /8;_ecf :=_dda .NewReader (_eca .Data );_cbeg :=make ([]byte ,_eca .Height *_eca .RowStride );_gaf :=_dda .NewWriterMSB (_cbeg );_abc :=make ([]byte ,_gaae );var (_dcge int ;_caee uint64 ;);for _dcge =0;_dcge < _eca .Height ;_dcge ++{if _ ,_beac =_ecf .Read (_abc );_beac !=nil {return _a .Wrap (_beac ,_gce ,"\u0066u\u006c\u006c\u0020\u0062\u0079\u0074e");};if _ ,_beac =_gaf .Write (_abc );_beac !=nil {return _a .Wrap (_beac ,_gce ,"\u0066\u0075\u006c\u006c\u0020\u0062\u0079\u0074\u0065\u0073");};if _caee ,_beac =_ecf .ReadBits (byte (_aaag ));_beac !=nil {return _a .Wrap (_beac ,_gce ,"\u0073\u006b\u0069\u0070\u0070\u0069\u006e\u0067\u0020\u0062\u0069\u0074\u0073");};if _beac =_gaf .WriteByte (byte (_caee )<<uint (8-_aaag ));_beac !=nil {return _a .Wrap (_beac ,_gce ,"\u006ca\u0073\u0074\u0020\u0062\u0079\u0074e");};};_eca .Data =_gaf .Data ();return nil ;};func (_gff *Bitmap )equivalent (_bec *Bitmap )bool {if _gff ==_bec {return true ;};if !_gff .SizesEqual (_bec ){return false ;};_deb :=_cgfb (_gff ,_bec ,CmbOpXor );_ceb :=_gff .countPixels ();_aegb :=int (0.25*float32 (_ceb ));if _deb .thresholdPixelSum (_aegb ){return false ;};var (_bbgb [9][9]int ;_ggaa [18][9]int ;_bgg [9][18]int ;_dbfa int ;_cfd int ;);_aead :=9;_gdg :=_gff .Height /_aead ;_ebgd :=_gff .Width /_aead ;_fbed ,_eaf :=_gdg /2,_ebgd /2;if _gdg < _ebgd {_fbed =_ebgd /2;_eaf =_gdg /2;};_eaad :=float64 (_fbed )*float64 (_eaf )*_fb .Pi ;_fgcg :=int (float64 (_gdg *_ebgd /2)*0.9);_aba :=int (float64 (_ebgd *_gdg /2)*0.9);for _gfga :=0;_gfga < _aead ;_gfga ++{_gefg :=_ebgd *_gfga +_dbfa ;var _ffdf int ;if _gfga ==_aead -1{_dbfa =0;_ffdf =_gff .Width ;}else {_ffdf =_gefg +_ebgd ;if ((_gff .Width -_dbfa )%_aead )> 0{_dbfa ++;_ffdf ++;};};for _gefa :=0;_gefa < _aead ;_gefa ++{_fgcgf :=_gdg *_gefa +_cfd ;var _cbcg int ;if _gefa ==_aead -1{_cfd =0;_cbcg =_gff .Height ;}else {_cbcg =_fgcgf +_gdg ;if (_gff .Height -_cfd )%_aead > 0{_cfd ++;_cbcg ++;};};var _edb ,_dcfe ,_egff ,_edag int ;_baeg :=(_gefg +_ffdf )/2;_accb :=(_fgcgf +_cbcg )/2;for _fegd :=_gefg ;_fegd < _ffdf ;_fegd ++{for _acb :=_fgcgf ;_acb < _cbcg ;_acb ++{if _deb .GetPixel (_fegd ,_acb ){if _fegd < _baeg {_edb ++;}else {_dcfe ++;};if _acb < _accb {_edag ++;}else {_egff ++;};};};};_bbgb [_gfga ][_gefa ]=_edb +_dcfe ;_ggaa [_gfga *2][_gefa ]=_edb ;_ggaa [_gfga *2+1][_gefa ]=_dcfe ;_bgg [_gfga ][_gefa *2]=_edag ;_bgg [_gfga ][_gefa *2+1]=_egff ;};};for _dbdg :=0;_dbdg < _aead *2-1;_dbdg ++{for _dgda :=0;_dgda < (_aead -1);_dgda ++{var _ggbg int ;for _gad :=0;_gad < 2;_gad ++{for _ffdd :=0;_ffdd < 2;_ffdd ++{_ggbg +=_ggaa [_dbdg +_gad ][_dgda +_ffdd ];};};if _ggbg > _aba {return false ;};};};for _deg :=0;_deg < (_aead -1);_deg ++{for _aca :=0;_aca < ((_aead *2)-1);_aca ++{var _agbe int ;for _ebf :=0;_ebf < 2;_ebf ++{for _faacg :=0;_faacg < 2;_faacg ++{_agbe +=_bgg [_deg +_ebf ][_aca +_faacg ];};};if _agbe > _fgcg {return false ;};};};for _daef :=0;_daef < (_aead -2);_daef ++{for _cfaa :=0;_cfaa < (_aead -2);_cfaa ++{var _gdfba ,_dfee int ;for _dec :=0;_dec < 3;_dec ++{for _gcfe :=0;_gcfe < 3;_gcfe ++{if _dec ==_gcfe {_gdfba +=_bbgb [_daef +_dec ][_cfaa +_gcfe ];};if (2-_dec )==_gcfe {_dfee +=_bbgb [_daef +_dec ][_cfaa +_gcfe ];};};};if _gdfba > _aba ||_dfee > _aba {return false ;};};};for _eacf :=0;_eacf < (_aead -1);_eacf ++{for _efe :=0;_efe < (_aead -1);_efe ++{var _deac int ;for _bcc :=0;_bcc < 2;_bcc ++{for _dcca :=0;_dcca < 2;_dcca ++{_deac +=_bbgb [_eacf +_bcc ][_efe +_dcca ];};};if float64 (_deac )> _eaad {return false ;};};};return true ;};func _gdd (_gead uint ,_caef byte )byte {return _caef >>_gead <<_gead };const (ComponentConn Component =iota ;ComponentCharacters ;ComponentWords ;);func TstFrameBitmap ()*Bitmap {return _cbee .Copy ()};func TstVSymbol (t *_da .T ,scale ...int )*Bitmap {_bgfde ,_cbad :=NewWithData (5,5,[]byte {0x88,0x88,0x88,0x50,0x20});_d .NoError (t ,_cbad );return TstGetScaledSymbol (t ,_bgfde ,scale ...);};func Copy (d ,s *Bitmap )(*Bitmap ,error ){return _fffe (d ,s )};func TstRSymbol (t *_da .T ,scale ...int )*Bitmap {_dfeed ,_cbae :=NewWithData (4,5,[]byte {0xF0,0x90,0xF0,0xA0,0x90});_d .NoError (t ,_cbae );return TstGetScaledSymbol (t ,_dfeed ,scale ...);};func (_bgf *Bitmap )Zero ()bool {_abb :=_bgf .Width /8;_cga :=_bgf .Width &7;var _dbfe byte ;if _cga !=0{_dbfe =byte (0xff<<uint (8-_cga ));};var _ggb ,_bdfb ,_fdd int ;for _bdfb =0;_bdfb < _bgf .Height ;_bdfb ++{_ggb =_bgf .RowStride *_bdfb ;for _fdd =0;_fdd < _abb ;_fdd ,_ggb =_fdd +1,_ggb +1{if _bgf .Data [_ggb ]!=0{return false ;};};if _cga > 0{if _bgf .Data [_ggb ]&_dbfe !=0{return false ;};};};return true ;};func (_baf *Bitmap )countPixels ()int {var (_ead int ;_ccaa uint8 ;_fgbf byte ;_eebg int ;);_fdab :=_baf .RowStride ;_eecg :=uint (_baf .Width &0x07);if _eecg !=0{_ccaa =uint8 ((0xff<<(8-_eecg ))&0xff);_fdab --;};for _faac :=0;_faac < _baf .Height ;_faac ++{for _eebg =0;_eebg < _fdab ;_eebg ++{_fgbf =_baf .Data [_faac *_baf .RowStride +_eebg ];_ead +=int (_deae [_fgbf ]);};if _eecg !=0{_ead +=int (_deae [_baf .Data [_faac *_baf .RowStride +_eebg ]&_ccaa ]);};};return _ead ;};func (_cege *Bitmap )inverseData (){if _gag :=_cege .RasterOperation (0,0,_cege .Width ,_cege .Height ,PixNotDst ,nil ,0,0);_gag !=nil {_be .Log .Debug ("\u0049n\u0076\u0065\u0072\u0073e\u0020\u0064\u0061\u0074\u0061 \u0066a\u0069l\u0065\u0064\u003a\u0020\u0027\u0025\u0076'",_gag );};if _cege .Color ==Chocolate {_cege .Color =Vanilla ;}else {_cege .Color =Chocolate ;};};func _ecaf (_agdc ,_ffgb *Bitmap ,_cacec ,_gadb int )(*Bitmap ,error ){const _bfafc ="\u0063\u006c\u006f\u0073\u0065\u0042\u0072\u0069\u0063\u006b";if _ffgb ==nil {return nil ,_a .Error (_bfafc ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _cacec < 1||_gadb < 1{return nil ,_a .Error (_bfafc ,"\u0068S\u0069\u007a\u0065\u0020\u0061\u006e\u0064\u0020\u0076\u0053\u0069z\u0065\u0020\u006e\u006f\u0074\u0020\u003e\u003d\u0020\u0031");};if _cacec ==1&&_gadb ==1{return _ffgb .Copy (),nil ;};if _cacec ==1||_gadb ==1{_abeb :=SelCreateBrick (_gadb ,_cacec ,_gadb /2,_cacec /2,SelHit );var _dgdaa error ;_agdc ,_dgdaa =_afaa (_agdc ,_ffgb ,_abeb );if _dgdaa !=nil {return nil ,_a .Wrap (_dgdaa ,_bfafc ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");};return _agdc ,nil ;};_aecd :=SelCreateBrick (1,_cacec ,0,_cacec /2,SelHit );_adbg :=SelCreateBrick (_gadb ,1,_gadb /2,0,SelHit );_dcggf ,_gegc :=_dfaa (nil ,_ffgb ,_aecd );if _gegc !=nil {return nil ,_a .Wrap (_gegc ,_bfafc ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};if _agdc ,_gegc =_dfaa (_agdc ,_dcggf ,_adbg );_gegc !=nil {return nil ,_a .Wrap (_gegc ,_bfafc ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};if _ ,_gegc =_eefe (_dcggf ,_agdc ,_aecd );_gegc !=nil {return nil ,_a .Wrap (_gegc ,_bfafc ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");};if _ ,_gegc =_eefe (_agdc ,_dcggf ,_adbg );_gegc !=nil {return nil ,_a .Wrap (_gegc ,_bfafc ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};return _agdc ,nil ;};func TstWriteSymbols (t *_da .T ,bms *Bitmaps ,src *Bitmap ){for _eecc :=0;_eecc < bms .Size ();_eecc ++{_faacd :=bms .Values [_eecc ];_cbbd :=bms .Boxes [_eecc ];_baag :=src .RasterOperation (_cbbd .Min .X ,_cbbd .Min .Y ,_faacd .Width ,_faacd .Height ,PixSrc ,_faacd ,0,0);_d .NoError (t ,_baag );};};func _cgce (_gaec ,_bfagf *Bitmap ,_efcb ,_ceeg int )(_fbcga error ){const _ccdc ="\u0073e\u0065d\u0066\u0069\u006c\u006c\u0042i\u006e\u0061r\u0079\u004c\u006f\u0077\u0038";var (_efeg ,_dade ,_bddb ,_dffg int ;_ccda ,_addd ,_agdce ,_bfee ,_acafb ,_eggf ,_bacaf ,_fbgc byte ;);for _efeg =0;_efeg < _efcb ;_efeg ++{_bddb =_efeg *_gaec .RowStride ;_dffg =_efeg *_bfagf .RowStride ;for _dade =0;_dade < _ceeg ;_dade ++{if _ccda ,_fbcga =_gaec .GetByte (_bddb +_dade );_fbcga !=nil {return _a .Wrap (_fbcga ,_ccdc ,"\u0067e\u0074 \u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0062\u0079\u0074\u0065");};if _addd ,_fbcga =_bfagf .GetByte (_dffg +_dade );_fbcga !=nil {return _a .Wrap (_fbcga ,_ccdc ,"\u0067\u0065\u0074\u0020\u006d\u0061\u0073\u006b\u0020\u0062\u0079\u0074\u0065");};if _efeg > 0{if _agdce ,_fbcga =_gaec .GetByte (_bddb -_gaec .RowStride +_dade );_fbcga !=nil {return _a .Wrap (_fbcga ,_ccdc ,"\u0069\u0020\u003e\u0020\u0030\u0020\u0062\u0079\u0074\u0065");};_ccda |=_agdce |(_agdce <<1)|(_agdce >>1);if _dade > 0{if _fbgc ,_fbcga =_gaec .GetByte (_bddb -_gaec .RowStride +_dade -1);_fbcga !=nil {return _a .Wrap (_fbcga ,_ccdc ,"\u0069\u0020\u003e\u00200 \u0026\u0026\u0020\u006a\u0020\u003e\u0020\u0030\u0020\u0062\u0079\u0074\u0065");};_ccda |=_fbgc <<7;};if _dade < _ceeg -1{if _fbgc ,_fbcga =_gaec .GetByte (_bddb -_gaec .RowStride +_dade +1);_fbcga !=nil {return _a .Wrap (_fbcga ,_ccdc ,"\u006a\u0020<\u0020\u0077\u0070l\u0020\u002d\u0020\u0031\u0020\u0062\u0079\u0074\u0065");};_ccda |=_fbgc >>7;};};if _dade > 0{if _bfee ,_fbcga =_gaec .GetByte (_bddb +_dade -1);_fbcga !=nil {return _a .Wrap (_fbcga ,_ccdc ,"\u006a\u0020\u003e \u0030");};_ccda |=_bfee <<7;};_ccda &=_addd ;if _ccda ==0||^_ccda ==0{if _fbcga =_gaec .SetByte (_bddb +_dade ,_ccda );_fbcga !=nil {return _a .Wrap (_fbcga ,_ccdc ,"\u0073e\u0074t\u0069\u006e\u0067\u0020\u0065m\u0070\u0074y\u0020\u0062\u0079\u0074\u0065");};};for {_bacaf =_ccda ;_ccda =(_ccda |(_ccda >>1)|(_ccda <<1))&_addd ;if (_ccda ^_bacaf )==0{if _fbcga =_gaec .SetByte (_bddb +_dade ,_ccda );_fbcga !=nil {return _a .Wrap (_fbcga ,_ccdc ,"\u0073\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u0070\u0072\u0065\u0076 \u0062\u0079\u0074\u0065");};break ;};};};};for _efeg =_efcb -1;_efeg >=0;_efeg --{_bddb =_efeg *_gaec .RowStride ;_dffg =_efeg *_bfagf .RowStride ;for _dade =_ceeg -1;_dade >=0;_dade --{if _ccda ,_fbcga =_gaec .GetByte (_bddb +_dade );_fbcga !=nil {return _a .Wrap (_fbcga ,_ccdc ,"\u0072\u0065\u0076er\u0073\u0065\u0020\u0067\u0065\u0074\u0020\u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0062\u0079\u0074\u0065");};if _addd ,_fbcga =_bfagf .GetByte (_dffg +_dade );_fbcga !=nil {return _a .Wrap (_fbcga ,_ccdc ,"r\u0065\u0076\u0065\u0072se\u0020g\u0065\u0074\u0020\u006d\u0061s\u006b\u0020\u0062\u0079\u0074\u0065");};if _efeg < _efcb -1{if _acafb ,_fbcga =_gaec .GetByte (_bddb +_gaec .RowStride +_dade );_fbcga !=nil {return _a .Wrap (_fbcga ,_ccdc ,"\u0069\u0020\u003c\u0020h\u0020\u002d\u0020\u0031\u0020\u002d\u003e\u0020\u0067\u0065t\u0020s\u006f\u0075\u0072\u0063\u0065\u0020\u0062y\u0074\u0065");};_ccda |=_acafb |(_acafb <<1)|_acafb >>1;if _dade > 0{if _fbgc ,_fbcga =_gaec .GetByte (_bddb +_gaec .RowStride +_dade -1);_fbcga !=nil {return _a .Wrap (_fbcga ,_ccdc ,"\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");};_ccda |=_fbgc <<7;};if _dade < _ceeg -1{if _fbgc ,_fbcga =_gaec .GetByte (_bddb +_gaec .RowStride +_dade +1);_fbcga !=nil {return _a .Wrap (_fbcga ,_ccdc ,"\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");};_ccda |=_fbgc >>7;};};if _dade < _ceeg -1{if _eggf ,_fbcga =_gaec .GetByte (_bddb +_dade +1);_fbcga !=nil {return _a .Wrap (_fbcga ,_ccdc ,"\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");};_ccda |=_eggf >>7;};_ccda &=_addd ;if _ccda ==0||(^_ccda )==0{if _fbcga =_gaec .SetByte (_bddb +_dade ,_ccda );_fbcga !=nil {return _a .Wrap (_fbcga ,_ccdc ,"\u0073e\u0074 \u006d\u0061\u0073\u006b\u0065\u0064\u0020\u0062\u0079\u0074\u0065");};};for {_bacaf =_ccda ;_ccda =(_ccda |(_ccda >>1)|(_ccda <<1))&_addd ;if (_ccda ^_bacaf )==0{if _fbcga =_gaec .SetByte (_bddb +_dade ,_ccda );_fbcga !=nil {return _a .Wrap (_fbcga ,_ccdc ,"r\u0065\u0076\u0065\u0072se\u0020s\u0065\u0074\u0020\u0070\u0072e\u0076\u0020\u0062\u0079\u0074\u0065");};break ;};};};};return nil ;};func TstDSymbol (t *_da .T ,scale ...int )*Bitmap {_abgg ,_afbac :=NewWithData (4,5,[]byte {0xf0,0x90,0x90,0x90,0xE0});_d .NoError (t ,_afbac );return TstGetScaledSymbol (t ,_abgg ,scale ...);};func (_cbb *Bitmap )Equals (s *Bitmap )bool {if len (_cbb .Data )!=len (s .Data )||_cbb .Width !=s .Width ||_cbb .Height !=s .Height {return false ;};for _fabe :=0;_fabe < _cbb .Height ;_fabe ++{_cdf :=_fabe *_cbb .RowStride ;for _ebd :=0;_ebd < _cbb .RowStride ;_ebd ++{if _cbb .Data [_cdf +_ebd ]!=s .Data [_cdf +_ebd ]{return false ;};};};return true ;};func (_fagf *ClassedPoints )GroupByY ()([]*ClassedPoints ,error ){const _bebag ="\u0043\u006c\u0061\u0073se\u0064\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0072\u006f\u0075\u0070\u0042y\u0059";if _ccgbb :=_fagf .validateIntSlice ();_ccgbb !=nil {return nil ,_a .Wrap (_ccgbb ,_bebag ,"");};if _fagf .IntSlice .Size ()==0{return nil ,_a .Error (_bebag ,"\u004e\u006f\u0020\u0063la\u0073\u0073\u0065\u0073\u0020\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064");};_fagf .SortByY ();var (_aagfg []*ClassedPoints ;_accd int ;);_dbfea :=-1;var _edgg *ClassedPoints ;for _cfde :=0;_cfde < len (_fagf .IntSlice );_cfde ++{_accd =int (_fagf .YAtIndex (_cfde ));if _accd !=_dbfea {_edgg =&ClassedPoints {Points :_fagf .Points };_dbfea =_accd ;_aagfg =append (_aagfg ,_edgg );};_edgg .IntSlice =append (_edgg .IntSlice ,_fagf .IntSlice [_cfde ]);};for _ ,_bcbe :=range _aagfg {_bcbe .SortByX ();};return _aagfg ,nil ;};type byHeight Bitmaps ;func (_fdag *Bitmap )GetChocolateData ()[]byte {if _fdag .Color ==Vanilla {_fdag .inverseData ();};return _fdag .Data ;};func _gdcd ()[]int {_geaa :=make ([]int ,256);_geaa [0]=0;_geaa [1]=7;var _cfad int ;for _cfad =2;_cfad < 4;_cfad ++{_geaa [_cfad ]=_geaa [_cfad -2]+6;};for _cfad =4;_cfad < 8;_cfad ++{_geaa [_cfad ]=_geaa [_cfad -4]+5;};for _cfad =8;_cfad < 16;_cfad ++{_geaa [_cfad ]=_geaa [_cfad -8]+4;};for _cfad =16;_cfad < 32;_cfad ++{_geaa [_cfad ]=_geaa [_cfad -16]+3;};for _cfad =32;_cfad < 64;_cfad ++{_geaa [_cfad ]=_geaa [_cfad -32]+2;};for _cfad =64;_cfad < 128;_cfad ++{_geaa [_cfad ]=_geaa [_cfad -64]+1;};for _cfad =128;_cfad < 256;_cfad ++{_geaa [_cfad ]=_geaa [_cfad -128];};return _geaa ;};func (_gafb Points )GetIntY (i int )(int ,error ){if i >=len (_gafb ){return 0,_a .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 (_gafb [i ].Y ),nil ;};type SelectionValue int ;func Rect (x ,y ,w ,h int )(*_b .Rectangle ,error ){const _bed ="b\u0069\u0074\u006d\u0061\u0070\u002e\u0052\u0065\u0063\u0074";if x < 0{w +=x ;x =0;if w <=0{return nil ,_a .Errorf (_bed ,"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 ,_a .Error (_bed ,"\u0079\u0020\u003c 0\u0020\u0061\u006e\u0064\u0020\u0062\u006f\u0078\u0020\u006f\u0066\u0066\u0020\u002b\u0071\u0075\u0061\u0064");};};_adbe :=_b .Rect (x ,y ,x +w ,y +h );return &_adbe ,nil ;};func (_cefd *Bitmap )nextOnPixelLow (_fbd ,_aff ,_caff ,_ebbg ,_bbgec int )(_gefd _b .Point ,_fge bool ,_cafb error ){const _gbg ="B\u0069\u0074\u006d\u0061p.\u006ee\u0078\u0074\u004f\u006e\u0050i\u0078\u0065\u006c\u004c\u006f\u0077";var (_gfdg int ;_eabb byte ;);_cdfa :=_bbgec *_caff ;_bbd :=_cdfa +(_ebbg /8);if _eabb ,_cafb =_cefd .GetByte (_bbd );_cafb !=nil {return _gefd ,false ,_a .Wrap (_cafb ,_gbg ,"\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 _eabb !=0{_cdcff :=_ebbg -(_ebbg %8)+7;for _gfdg =_ebbg ;_gfdg <=_cdcff &&_gfdg < _fbd ;_gfdg ++{if _cefd .GetPixel (_gfdg ,_bbgec ){_gefd .X =_gfdg ;_gefd .Y =_bbgec ;return _gefd ,true ,nil ;};};};_abdb :=(_ebbg /8)+1;_gfdg =8*_abdb ;var _edab int ;for _bbd =_cdfa +_abdb ;_gfdg < _fbd ;_bbd ,_gfdg =_bbd +1,_gfdg +8{if _eabb ,_cafb =_cefd .GetByte (_bbd );_cafb !=nil {return _gefd ,false ,_a .Wrap (_cafb ,_gbg ,"r\u0065\u0073\u0074\u0020of\u0020t\u0068\u0065\u0020\u006c\u0069n\u0065\u0020\u0062\u0079\u0074\u0065");};if _eabb ==0{continue ;};for _edab =0;_edab < 8&&_gfdg < _fbd ;_edab ,_gfdg =_edab +1,_gfdg +1{if _cefd .GetPixel (_gfdg ,_bbgec ){_gefd .X =_gfdg ;_gefd .Y =_bbgec ;return _gefd ,true ,nil ;};};};for _fcda :=_bbgec +1;_fcda < _aff ;_fcda ++{_cdfa =_fcda *_caff ;for _bbd ,_gfdg =_cdfa ,0;_gfdg < _fbd ;_bbd ,_gfdg =_bbd +1,_gfdg +8{if _eabb ,_cafb =_cefd .GetByte (_bbd );_cafb !=nil {return _gefd ,false ,_a .Wrap (_cafb ,_gbg ,"\u0066o\u006cl\u006f\u0077\u0069\u006e\u0067\u0020\u006c\u0069\u006e\u0065\u0073");};if _eabb ==0{continue ;};for _edab =0;_edab < 8&&_gfdg < _fbd ;_edab ,_gfdg =_edab +1,_gfdg +1{if _cefd .GetPixel (_gfdg ,_fcda ){_gefd .X =_gfdg ;_gefd .Y =_fcda ;return _gefd ,true ,nil ;};};};};return _gefd ,false ,nil ;};func (_bffg *Bitmaps )SelectBySize (width ,height int ,tp LocationFilter ,relation SizeComparison )(_ddcc *Bitmaps ,_ebfda error ){const _fdgc ="B\u0069t\u006d\u0061\u0070\u0073\u002e\u0053\u0065\u006ce\u0063\u0074\u0042\u0079Si\u007a\u0065";if _bffg ==nil {return nil ,_a .Error (_fdgc ,"\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 ,_a .Errorf (_fdgc ,"\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 ,_a .Errorf (_fdgc ,"\u0069\u006e\u0076\u0061li\u0064\u0020\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0027\u0025d\u0027",relation );};_fbde ,_ebfda :=_bffg .makeSizeIndicator (width ,height ,tp ,relation );if _ebfda !=nil {return nil ,_a .Wrap (_ebfda ,_fdgc ,"");};_ddcc ,_ebfda =_bffg .selectByIndicator (_fbde );if _ebfda !=nil {return nil ,_a .Wrap (_ebfda ,_fdgc ,"");};return _ddcc ,nil ;};func _cadf (_abcc *Bitmap ,_cebb ,_fggag ,_cfdf ,_gfac int ,_bbea RasterOperator ,_agfba *Bitmap ,_dadc ,_dcec int )error {var (_fecag byte ;_gggb int ;_fggb int ;_acebg ,_defae int ;_beabd ,_bebf int ;);_fbab :=_cfdf >>3;_bfff :=_cfdf &7;if _bfff > 0{_fecag =_bge [_bfff ];};_gggb =_agfba .RowStride *_dcec +(_dadc >>3);_fggb =_abcc .RowStride *_fggag +(_cebb >>3);switch _bbea {case PixSrc :for _beabd =0;_beabd < _gfac ;_beabd ++{_acebg =_gggb +_beabd *_agfba .RowStride ;_defae =_fggb +_beabd *_abcc .RowStride ;for _bebf =0;_bebf < _fbab ;_bebf ++{_abcc .Data [_defae ]=_agfba .Data [_acebg ];_defae ++;_acebg ++;};if _bfff > 0{_abcc .Data [_defae ]=_gdcad (_abcc .Data [_defae ],_agfba .Data [_acebg ],_fecag );};};case PixNotSrc :for _beabd =0;_beabd < _gfac ;_beabd ++{_acebg =_gggb +_beabd *_agfba .RowStride ;_defae =_fggb +_beabd *_abcc .RowStride ;for _bebf =0;_bebf < _fbab ;_bebf ++{_abcc .Data [_defae ]=^(_agfba .Data [_acebg ]);_defae ++;_acebg ++;};if _bfff > 0{_abcc .Data [_defae ]=_gdcad (_abcc .Data [_defae ],^_agfba .Data [_acebg ],_fecag );};};case PixSrcOrDst :for _beabd =0;_beabd < _gfac ;_beabd ++{_acebg =_gggb +_beabd *_agfba .RowStride ;_defae =_fggb +_beabd *_abcc .RowStride ;for _bebf =0;_bebf < _fbab ;_bebf ++{_abcc .Data [_defae ]|=_agfba .Data [_acebg ];_defae ++;_acebg ++;};if _bfff > 0{_abcc .Data [_defae ]=_gdcad (_abcc .Data [_defae ],_agfba .Data [_acebg ]|_abcc .Data [_defae ],_fecag );};};case PixSrcAndDst :for _beabd =0;_beabd < _gfac ;_beabd ++{_acebg =_gggb +_beabd *_agfba .RowStride ;_defae =_fggb +_beabd *_abcc .RowStride ;for _bebf =0;_bebf < _fbab ;_bebf ++{_abcc .Data [_defae ]&=_agfba .Data [_acebg ];_defae ++;_acebg ++;};if _bfff > 0{_abcc .Data [_defae ]=_gdcad (_abcc .Data [_defae ],_agfba .Data [_acebg ]&_abcc .Data [_defae ],_fecag );};};case PixSrcXorDst :for _beabd =0;_beabd < _gfac ;_beabd ++{_acebg =_gggb +_beabd *_agfba .RowStride ;_defae =_fggb +_beabd *_abcc .RowStride ;for _bebf =0;_bebf < _fbab ;_bebf ++{_abcc .Data [_defae ]^=_agfba .Data [_acebg ];_defae ++;_acebg ++;};if _bfff > 0{_abcc .Data [_defae ]=_gdcad (_abcc .Data [_defae ],_agfba .Data [_acebg ]^_abcc .Data [_defae ],_fecag );};};case PixNotSrcOrDst :for _beabd =0;_beabd < _gfac ;_beabd ++{_acebg =_gggb +_beabd *_agfba .RowStride ;_defae =_fggb +_beabd *_abcc .RowStride ;for _bebf =0;_bebf < _fbab ;_bebf ++{_abcc .Data [_defae ]|=^(_agfba .Data [_acebg ]);_defae ++;_acebg ++;};if _bfff > 0{_abcc .Data [_defae ]=_gdcad (_abcc .Data [_defae ],^(_agfba .Data [_acebg ])|_abcc .Data [_defae ],_fecag );};};case PixNotSrcAndDst :for _beabd =0;_beabd < _gfac ;_beabd ++{_acebg =_gggb +_beabd *_agfba .RowStride ;_defae =_fggb +_beabd *_abcc .RowStride ;for _bebf =0;_bebf < _fbab ;_bebf ++{_abcc .Data [_defae ]&=^(_agfba .Data [_acebg ]);_defae ++;_acebg ++;};if _bfff > 0{_abcc .Data [_defae ]=_gdcad (_abcc .Data [_defae ],^(_agfba .Data [_acebg ])&_abcc .Data [_defae ],_fecag );};};case PixSrcOrNotDst :for _beabd =0;_beabd < _gfac ;_beabd ++{_acebg =_gggb +_beabd *_agfba .RowStride ;_defae =_fggb +_beabd *_abcc .RowStride ;for _bebf =0;_bebf < _fbab ;_bebf ++{_abcc .Data [_defae ]=_agfba .Data [_acebg ]|^(_abcc .Data [_defae ]);_defae ++;_acebg ++;};if _bfff > 0{_abcc .Data [_defae ]=_gdcad (_abcc .Data [_defae ],_agfba .Data [_acebg ]|^(_abcc .Data [_defae ]),_fecag );};};case PixSrcAndNotDst :for _beabd =0;_beabd < _gfac ;_beabd ++{_acebg =_gggb +_beabd *_agfba .RowStride ;_defae =_fggb +_beabd *_abcc .RowStride ;for _bebf =0;_bebf < _fbab ;_bebf ++{_abcc .Data [_defae ]=_agfba .Data [_acebg ]&^(_abcc .Data [_defae ]);_defae ++;_acebg ++;};if _bfff > 0{_abcc .Data [_defae ]=_gdcad (_abcc .Data [_defae ],_agfba .Data [_acebg ]&^(_abcc .Data [_defae ]),_fecag );};};case PixNotPixSrcOrDst :for _beabd =0;_beabd < _gfac ;_beabd ++{_acebg =_gggb +_beabd *_agfba .RowStride ;_defae =_fggb +_beabd *_abcc .RowStride ;for _bebf =0;_bebf < _fbab ;_bebf ++{_abcc .Data [_defae ]=^(_agfba .Data [_acebg ]|_abcc .Data [_defae ]);_defae ++;_acebg ++;};if _bfff > 0{_abcc .Data [_defae ]=_gdcad (_abcc .Data [_defae ],^(_agfba .Data [_acebg ]|_abcc .Data [_defae ]),_fecag );};};case PixNotPixSrcAndDst :for _beabd =0;_beabd < _gfac ;_beabd ++{_acebg =_gggb +_beabd *_agfba .RowStride ;_defae =_fggb +_beabd *_abcc .RowStride ;for _bebf =0;_bebf < _fbab ;_bebf ++{_abcc .Data [_defae ]=^(_agfba .Data [_acebg ]&_abcc .Data [_defae ]);_defae ++;_acebg ++;};if _bfff > 0{_abcc .Data [_defae ]=_gdcad (_abcc .Data [_defae ],^(_agfba .Data [_acebg ]&_abcc .Data [_defae ]),_fecag );};};case PixNotPixSrcXorDst :for _beabd =0;_beabd < _gfac ;_beabd ++{_acebg =_gggb +_beabd *_agfba .RowStride ;_defae =_fggb +_beabd *_abcc .RowStride ;for _bebf =0;_bebf < _fbab ;_bebf ++{_abcc .Data [_defae ]=^(_agfba .Data [_acebg ]^_abcc .Data [_defae ]);_defae ++;_acebg ++;};if _bfff > 0{_abcc .Data [_defae ]=_gdcad (_abcc .Data [_defae ],^(_agfba .Data [_acebg ]^_abcc .Data [_defae ]),_fecag );};};default:_be .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",_bbea );return _a .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 ;};type ClassedPoints struct{*Points ;_dd .IntSlice ;_cbcc func (_ccea ,_ebeg int )bool ;};type MorphProcess struct{Operation MorphOperation ;Arguments []int ;};func (_bde *Bitmaps )HeightSorter ()func (_dcda ,_bcec int )bool {return func (_ebfd ,_abcfg int )bool {_aaead :=_bde .Values [_ebfd ].Height < _bde .Values [_abcfg ].Height ;_be .Log .Debug ("H\u0065i\u0067\u0068\u0074\u003a\u0020\u0025\u0076\u0020<\u0020\u0025\u0076\u0020= \u0025\u0076",_bde .Values [_ebfd ].Height ,_bde .Values [_abcfg ].Height ,_aaead );return _aaead ;};};func (_dggac *ClassedPoints )GetIntXByClass (i int )(int ,error ){const _bgff ="\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 >=_dggac .IntSlice .Size (){return 0,_a .Errorf (_bgff ,"\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 (_dggac .XAtIndex (i )),nil ;};type Selection struct{Height ,Width int ;Cx ,Cy int ;Name string ;Data [][]SelectionValue ;};func TstISymbol (t *_da .T ,scale ...int )*Bitmap {_gba ,_afdg :=NewWithData (1,5,[]byte {0x80,0x80,0x80,0x80,0x80});_d .NoError (t ,_afdg );return TstGetScaledSymbol (t ,_gba ,scale ...);};func (_gcba *Bitmap )setAll ()error {_fbcg :=_babbd (_gcba ,0,0,_gcba .Width ,_gcba .Height ,PixSet ,nil ,0,0);if _fbcg !=nil {return _a .Wrap (_fbcg ,"\u0073\u0065\u0074\u0041\u006c\u006c","");};return nil ;};func _egfg (_cagd ,_bfeg *Bitmap ,_afee ,_eaea int )(_daff error ){const _afca ="\u0073e\u0065d\u0066\u0069\u006c\u006c\u0042i\u006e\u0061r\u0079\u004c\u006f\u0077\u0034";var (_edeg ,_bcag ,_dfgd ,_geae int ;_dbada ,_bagg ,_faeb ,_fafda ,_beace ,_eaeag ,_ccae byte ;);for _edeg =0;_edeg < _afee ;_edeg ++{_dfgd =_edeg *_cagd .RowStride ;_geae =_edeg *_bfeg .RowStride ;for _bcag =0;_bcag < _eaea ;_bcag ++{_dbada ,_daff =_cagd .GetByte (_dfgd +_bcag );if _daff !=nil {return _a .Wrap (_daff ,_afca ,"\u0066i\u0072\u0073\u0074\u0020\u0067\u0065t");};_bagg ,_daff =_bfeg .GetByte (_geae +_bcag );if _daff !=nil {return _a .Wrap (_daff ,_afca ,"\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0067\u0065\u0074");};if _edeg > 0{_faeb ,_daff =_cagd .GetByte (_dfgd -_cagd .RowStride +_bcag );if _daff !=nil {return _a .Wrap (_daff ,_afca ,"\u0069\u0020\u003e \u0030");};_dbada |=_faeb ;};if _bcag > 0{_fafda ,_daff =_cagd .GetByte (_dfgd +_bcag -1);if _daff !=nil {return _a .Wrap (_daff ,_afca ,"\u006a\u0020\u003e \u0030");};_dbada |=_fafda <<7;};_dbada &=_bagg ;if _dbada ==0||(^_dbada )==0{if _daff =_cagd .SetByte (_dfgd +_bcag ,_dbada );_daff !=nil {return _a .Wrap (_daff ,_afca ,"b\u0074\u0020\u003d\u003d 0\u0020|\u007c\u0020\u0028\u005e\u0062t\u0029\u0020\u003d\u003d\u0020\u0030");};continue ;};for {_ccae =_dbada ;_dbada =(_dbada |(_dbada >>1)|(_dbada <<1))&_bagg ;if (_dbada ^_ccae )==0{if _daff =_cagd .SetByte (_dfgd +_bcag ,_dbada );_daff !=nil {return _a .Wrap (_daff ,_afca ,"\u0073\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u0070\u0072\u0065\u0076 \u0062\u0079\u0074\u0065");};break ;};};};};for _edeg =_afee -1;_edeg >=0;_edeg --{_dfgd =_edeg *_cagd .RowStride ;_geae =_edeg *_bfeg .RowStride ;for _bcag =_eaea -1;_bcag >=0;_bcag --{if _dbada ,_daff =_cagd .GetByte (_dfgd +_bcag );_daff !=nil {return _a .Wrap (_daff ,_afca ,"\u0072\u0065\u0076\u0065\u0072\u0073\u0065\u0020\u0066\u0069\u0072\u0073t\u0020\u0067\u0065\u0074");};if _bagg ,_daff =_bfeg .GetByte (_geae +_bcag );_daff !=nil {return _a .Wrap (_daff ,_afca ,"r\u0065\u0076\u0065\u0072se\u0020g\u0065\u0074\u0020\u006d\u0061s\u006b\u0020\u0062\u0079\u0074\u0065");};if _edeg < _afee -1{if _beace ,_daff =_cagd .GetByte (_dfgd +_cagd .RowStride +_bcag );_daff !=nil {return _a .Wrap (_daff ,_afca ,"\u0072\u0065v\u0065\u0072\u0073e\u0020\u0069\u0020\u003c\u0020\u0068\u0020\u002d\u0031");};_dbada |=_beace ;};if _bcag < _eaea -1{if _eaeag ,_daff =_cagd .GetByte (_dfgd +_bcag +1);_daff !=nil {return _a .Wrap (_daff ,_afca ,"\u0072\u0065\u0076\u0065rs\u0065\u0020\u006a\u0020\u003c\u0020\u0077\u0070\u006c\u0020\u002d\u0020\u0031");};_dbada |=_eaeag >>7;};_dbada &=_bagg ;if _dbada ==0||(^_dbada )==0{if _daff =_cagd .SetByte (_dfgd +_bcag ,_dbada );_daff !=nil {return _a .Wrap (_daff ,_afca ,"\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 {_ccae =_dbada ;_dbada =(_dbada |(_dbada >>1)|(_dbada <<1))&_bagg ;if (_dbada ^_ccae )==0{if _daff =_cagd .SetByte (_dfgd +_bcag ,_dbada );_daff !=nil {return _a .Wrap (_daff ,_afca ,"\u0072e\u0076\u0065\u0072\u0073e\u0020\u0073\u0065\u0074\u0074i\u006eg\u0020p\u0072\u0065\u0076\u0020\u0062\u0079\u0074e");};break ;};};};};return nil ;};func (_dfga *Bitmap )SetDefaultPixel (){for _bbge :=range _dfga .Data {_dfga .Data [_bbge ]=byte (0xff);};};func CorrelationScoreThresholded (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab ,downcount []int ,scoreThreshold float32 )(bool ,error ){const _fddg ="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 ,_a .Error (_fddg ,"\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 ,_a .Error (_fddg ,"\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 ,_a .Error (_fddg ,"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 ,_a .Error (_fddg ,"\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 ,_a .Error (_fddg ,"p\u0072\u006f\u0076\u0069de\u0064 \u006e\u0069\u006c\u0020\u0027s\u0075\u006d\u0074\u0061\u0062\u0027");};_egba ,_ggdf :=bm1 .Width ,bm1 .Height ;_cegc ,_cgbb :=bm2 .Width ,bm2 .Height ;if _dd .Abs (_egba -_cegc )> maxDiffW {return false ,nil ;};if _dd .Abs (_ggdf -_cgbb )> maxDiffH {return false ,nil ;};_cbcgd :=int (delX +_dd .Sign (delX )*0.5);_baca :=int (delY +_dd .Sign (delY )*0.5);_gbdc :=int (_fb .Ceil (_fb .Sqrt (float64 (scoreThreshold )*float64 (area1 )*float64 (area2 ))));_dgfa :=bm2 .RowStride ;_bfgg :=_aafe (_baca ,0);_cece :=_gbda (_cgbb +_baca ,_ggdf );_gbfe :=bm1 .RowStride *_bfgg ;_fbdg :=bm2 .RowStride *(_bfgg -_baca );var _fgd int ;if _cece <=_ggdf {_fgd =downcount [_cece -1];};_fbaf :=_aafe (_cbcgd ,0);_dabd :=_gbda (_cegc +_cbcgd ,_egba );var _gffg ,_gbgb int ;if _cbcgd >=8{_gffg =_cbcgd >>3;_gbfe +=_gffg ;_fbaf -=_gffg <<3;_dabd -=_gffg <<3;_cbcgd &=7;}else if _cbcgd <=-8{_gbgb =-((_cbcgd +7)>>3);_fbdg +=_gbgb ;_dgfa -=_gbgb ;_cbcgd +=_gbgb <<3;};var (_edef ,_bfge ,_efffb int ;_dege ,_abgd ,_ageg byte ;);if _fbaf >=_dabd ||_bfgg >=_cece {return false ,nil ;};_fcge :=(_dabd +7)>>3;switch {case _cbcgd ==0:for _bfge =_bfgg ;_bfge < _cece ;_bfge ,_gbfe ,_fbdg =_bfge +1,_gbfe +bm1 .RowStride ,_fbdg +bm2 .RowStride {for _efffb =0;_efffb < _fcge ;_efffb ++{_dege =bm1 .Data [_gbfe +_efffb ]&bm2 .Data [_fbdg +_efffb ];_edef +=tab [_dege ];};if _edef >=_gbdc {return true ,nil ;};if _dbab :=_edef +downcount [_bfge ]-_fgd ;_dbab < _gbdc {return false ,nil ;};};case _cbcgd > 0&&_dgfa < _fcge :for _bfge =_bfgg ;_bfge < _cece ;_bfge ,_gbfe ,_fbdg =_bfge +1,_gbfe +bm1 .RowStride ,_fbdg +bm2 .RowStride {_abgd =bm1 .Data [_gbfe ];_ageg =bm2 .Data [_fbdg ]>>uint (_cbcgd );_dege =_abgd &_ageg ;_edef +=tab [_dege ];for _efffb =1;_efffb < _dgfa ;_efffb ++{_abgd =bm1 .Data [_gbfe +_efffb ];_ageg =bm2 .Data [_fbdg +_efffb ]>>uint (_cbcgd )|bm2 .Data [_fbdg +_efffb -1]<<uint (8-_cbcgd );_dege =_abgd &_ageg ;_edef +=tab [_dege ];};_abgd =bm1 .Data [_gbfe +_efffb ];_ageg =bm2 .Data [_fbdg +_efffb -1]<<uint (8-_cbcgd );_dege =_abgd &_ageg ;_edef +=tab [_dege ];if _edef >=_gbdc {return true ,nil ;}else if _edef +downcount [_bfge ]-_fgd < _gbdc {return false ,nil ;};};case _cbcgd > 0&&_dgfa >=_fcge :for _bfge =_bfgg ;_bfge < _cece ;_bfge ,_gbfe ,_fbdg =_bfge +1,_gbfe +bm1 .RowStride ,_fbdg +bm2 .RowStride {_abgd =bm1 .Data [_gbfe ];_ageg =bm2 .Data [_fbdg ]>>uint (_cbcgd );_dege =_abgd &_ageg ;_edef +=tab [_dege ];for _efffb =1;_efffb < _fcge ;_efffb ++{_abgd =bm1 .Data [_gbfe +_efffb ];_ageg =bm2 .Data [_fbdg +_efffb ]>>uint (_cbcgd );_ageg |=bm2 .Data [_fbdg +_efffb -1]<<uint (8-_cbcgd );_dege =_abgd &_ageg ;_edef +=tab [_dege ];};if _edef >=_gbdc {return true ,nil ;}else if _edef +downcount [_bfge ]-_fgd < _gbdc {return false ,nil ;};};case _fcge < _dgfa :for _bfge =_bfgg ;_bfge < _cece ;_bfge ,_gbfe ,_fbdg =_bfge +1,_gbfe +bm1 .RowStride ,_fbdg +bm2 .RowStride {for _efffb =0;_efffb < _fcge ;_efffb ++{_abgd =bm1 .Data [_gbfe +_efffb ];_ageg =bm2 .Data [_fbdg +_efffb ]<<uint (-_cbcgd );_ageg |=bm2 .Data [_fbdg +_efffb +1]>>uint (8+_cbcgd );_dege =_abgd &_ageg ;_edef +=tab [_dege ];};if _edef >=_gbdc {return true ,nil ;}else if _ecd :=_edef +downcount [_bfge ]-_fgd ;_ecd < _gbdc {return false ,nil ;};};case _dgfa >=_fcge :for _bfge =_bfgg ;_bfge < _cece ;_bfge ,_gbfe ,_fbdg =_bfge +1,_gbfe +bm1 .RowStride ,_fbdg +bm2 .RowStride {for _efffb =0;_efffb < _fcge ;_efffb ++{_abgd =bm1 .Data [_gbfe +_efffb ];_ageg =bm2 .Data [_fbdg +_efffb ]<<uint (-_cbcgd );_ageg |=bm2 .Data [_fbdg +_efffb +1]>>uint (8+_cbcgd );_dege =_abgd &_ageg ;_edef +=tab [_dege ];};_abgd =bm1 .Data [_gbfe +_efffb ];_ageg =bm2 .Data [_fbdg +_efffb ]<<uint (-_cbcgd );_dege =_abgd &_ageg ;_edef +=tab [_dege ];if _edef >=_gbdc {return true ,nil ;}else if _edef +downcount [_bfge ]-_fgd < _gbdc {return false ,nil ;};};};_fgbe :=float32 (_edef )*float32 (_edef )/(float32 (area1 )*float32 (area2 ));if _fgbe >=scoreThreshold {_be .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",_edef ,_gbdc ,_fgbe ,scoreThreshold );};return false ,nil ;};func (_afef *ClassedPoints )XAtIndex (i int )float32 {return (*_afef .Points )[_afef .IntSlice [i ]].X };type MorphOperation int ;func _fffe (_dcag ,_ecbd *Bitmap )(*Bitmap ,error ){if _ecbd ==nil {return nil ,_a .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 _ecbd ==_dcag {return _dcag ,nil ;};if _dcag ==nil {_dcag =_ecbd .createTemplate ();copy (_dcag .Data ,_ecbd .Data );return _dcag ,nil ;};_egfa :=_dcag .resizeImageData (_ecbd );if _egfa !=nil {return nil ,_a .Wrap (_egfa ,"\u0063\u006f\u0070\u0079\u0042\u0069\u0074\u006d\u0061\u0070","");};_dcag .Text =_ecbd .Text ;copy (_dcag .Data ,_ecbd .Data );return _dcag ,nil ;};func _ebge (_aafd *Bitmap ,_afge int )(*Bitmap ,error ){const _bdac ="\u0065x\u0070a\u006e\u0064\u0052\u0065\u0070\u006c\u0069\u0063\u0061\u0074\u0065";if _aafd ==nil {return nil ,_a .Error (_bdac ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _afge <=0{return nil ,_a .Error (_bdac ,"i\u006e\u0076\u0061\u006cid\u0020f\u0061\u0063\u0074\u006f\u0072 \u002d\u0020\u003c\u003d\u0020\u0030");};if _afge ==1{_bbdf ,_dcffg :=_fffe (nil ,_aafd );if _dcffg !=nil {return nil ,_a .Wrap (_dcffg ,_bdac ,"\u0066\u0061\u0063\u0074\u006f\u0072\u0020\u003d\u0020\u0031");};return _bbdf ,nil ;};_gdeg ,_edeac :=_gaa (_aafd ,_afge ,_afge );if _edeac !=nil {return nil ,_a .Wrap (_edeac ,_bdac ,"");};return _gdeg ,nil ;};func _aef (_fgabe ,_bfaa *Bitmap ,_gfdb ,_eage ,_acdf ,_dagec ,_bce ,_deaa ,_cfb ,_ffcd int ,_gefe CombinationOperator ,_ecbce int )error {var _daa int ;_fdedb :=func (){_daa ++;_acdf +=_bfaa .RowStride ;_dagec +=_fgabe .RowStride ;_bce +=_fgabe .RowStride };for _daa =_gfdb ;_daa < _eage ;_fdedb (){var _cffe uint16 ;_fdgd :=_acdf ;for _beef :=_dagec ;_beef <=_bce ;_beef ++{_gdgd ,_afga :=_bfaa .GetByte (_fdgd );if _afga !=nil {return _afga ;};_baeb ,_afga :=_fgabe .GetByte (_beef );if _afga !=nil {return _afga ;};_cffe =(_cffe |(uint16 (_baeb )&0xff))<<uint (_ffcd );_baeb =byte (_cffe >>8);if _afga =_bfaa .SetByte (_fdgd ,_fba (_gdgd ,_baeb ,_gefe ));_afga !=nil {return _afga ;};_fdgd ++;_cffe <<=uint (_cfb );if _beef ==_bce {_baeb =byte (_cffe >>(8-uint8 (_ffcd )));if _ecbce !=0{_baeb =_gdd (uint (8+_deaa ),_baeb );};_gdgd ,_afga =_bfaa .GetByte (_fdgd );if _afga !=nil {return _afga ;};if _afga =_bfaa .SetByte (_fdgd ,_fba (_gdgd ,_baeb ,_gefe ));_afga !=nil {return _afga ;};};};};return nil ;};type Point struct{X ,Y float32 ;};func (_fecga Points )GetIntX (i int )(int ,error ){if i >=len (_fecga ){return 0,_a .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 (_fecga [i ].X ),nil ;};func (_ddg *Bitmap )centroid (_gcdag ,_dffb []int )(Point ,error ){_bbgc :=Point {};_ddg .setPadBits (0);if len (_gcdag )==0{_gcdag =_gdcd ();};if len (_dffb )==0{_dffb =_bbabe ();};var _dbcfe ,_fca ,_acbg ,_agcf ,_agga ,_afc int ;var _bggf byte ;for _agga =0;_agga < _ddg .Height ;_agga ++{_ebfe :=_ddg .RowStride *_agga ;_agcf =0;for _afc =0;_afc < _ddg .RowStride ;_afc ++{_bggf =_ddg .Data [_ebfe +_afc ];if _bggf !=0{_agcf +=_dffb [_bggf ];_dbcfe +=_gcdag [_bggf ]+_afc *8*_dffb [_bggf ];};};_acbg +=_agcf ;_fca +=_agcf *_agga ;};if _acbg !=0{_bbgc .X =float32 (_dbcfe )/float32 (_acbg );_bbgc .Y =float32 (_fca )/float32 (_acbg );};return _bbgc ,nil ;};func (_acea *Bitmap )GetPixel (x ,y int )bool {_fcd :=_acea .GetByteIndex (x ,y );_dgaf :=_acea .GetBitOffset (x );_egac :=uint (7-_dgaf );if _fcd > len (_acea .Data )-1{_be .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 ,_acea );return false ;};if (_acea .Data [_fcd ]>>_egac )&0x01>=1{return true ;};return false ;};func _ega (_fde ,_gcf int )*Bitmap {return &Bitmap {Width :_fde ,Height :_gcf ,RowStride :(_fde +7)>>3};};func _dfaa (_gdff *Bitmap ,_bdce *Bitmap ,_agaa *Selection )(*Bitmap ,error ){var (_cgegg *Bitmap ;_cdbb error ;);_gdff ,_cdbb =_fadb (_gdff ,_bdce ,_agaa ,&_cgegg );if _cdbb !=nil {return nil ,_cdbb ;};if _cdbb =_gdff .clearAll ();_cdbb !=nil {return nil ,_cdbb ;};var _gdgf SelectionValue ;for _gagca :=0;_gagca < _agaa .Height ;_gagca ++{for _adgg :=0;_adgg < _agaa .Width ;_adgg ++{_gdgf =_agaa .Data [_gagca ][_adgg ];if _gdgf ==SelHit {if _cdbb =_gdff .RasterOperation (_adgg -_agaa .Cx ,_gagca -_agaa .Cy ,_bdce .Width ,_bdce .Height ,PixSrcOrDst ,_cgegg ,0,0);_cdbb !=nil {return nil ,_cdbb ;};};};};return _gdff ,nil ;};func (_feca Points )Get (i int )(Point ,error ){if i > len (_feca )-1{return Point {},_a .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 _feca [i ],nil ;};func HausTest (p1 ,p2 ,p3 ,p4 *Bitmap ,delX ,delY float32 ,maxDiffW ,maxDiffH int )(bool ,error ){const _ggdd ="\u0048\u0061\u0075\u0073\u0054\u0065\u0073\u0074";_aada ,_cace :=p1 .Width ,p1 .Height ;_gbe ,_aace :=p3 .Width ,p3 .Height ;if _dd .Abs (_aada -_gbe )> maxDiffW {return false ,nil ;};if _dd .Abs (_cace -_aace )> maxDiffH {return false ,nil ;};_beefe :=int (delX +_dd .Sign (delX )*0.5);_cefdd :=int (delY +_dd .Sign (delY )*0.5);var _aegfc error ;_dead :=p1 .CreateTemplate ();if _aegfc =_dead .RasterOperation (0,0,_aada ,_cace ,PixSrc ,p1 ,0,0);_aegfc !=nil {return false ,_a .Wrap (_aegfc ,_ggdd ,"p\u0031\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _aegfc =_dead .RasterOperation (_beefe ,_cefdd ,_aada ,_cace ,PixNotSrcAndDst ,p4 ,0,0);_aegfc !=nil {return false ,_a .Wrap (_aegfc ,_ggdd ,"\u0021p\u0034\u0020\u0026\u0020\u0074");};if _dead .Zero (){return false ,nil ;};if _aegfc =_dead .RasterOperation (_beefe ,_cefdd ,_gbe ,_aace ,PixSrc ,p3 ,0,0);_aegfc !=nil {return false ,_a .Wrap (_aegfc ,_ggdd ,"p\u0033\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _aegfc =_dead .RasterOperation (0,0,_gbe ,_aace ,PixNotSrcAndDst ,p2 ,0,0);_aegfc !=nil {return false ,_a .Wrap (_aegfc ,_ggdd ,"\u0021p\u0032\u0020\u0026\u0020\u0074");};return _dead .Zero (),nil ;};type Boxes []*_b .Rectangle ;var _abef =[]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 _gdc (_gdfb ,_cd *Bitmap )(_fa error ){const _ea ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0038";_dag :=_cd .RowStride ;_bb :=_gdfb .RowStride ;var _gfd ,_gef ,_fdg ,_efb ,_ffe int ;for _fdg =0;_fdg < _cd .Height ;_fdg ++{_gfd =_fdg *_dag ;_gef =8*_fdg *_bb ;for _efb =0;_efb < _dag ;_efb ++{if _fa =_gdfb .setEightBytes (_gef +_efb *8,_gaab [_cd .Data [_gfd +_efb ]]);_fa !=nil {return _a .Wrap (_fa ,_ea ,"");};};for _ffe =1;_ffe < 8;_ffe ++{for _efb =0;_efb < _bb ;_efb ++{if _fa =_gdfb .SetByte (_gef +_ffe *_bb +_efb ,_gdfb .Data [_gef +_efb ]);_fa !=nil {return _a .Wrap (_fa ,_ea ,"");};};};};return nil ;};func Dilate (d *Bitmap ,s *Bitmap ,sel *Selection )(*Bitmap ,error ){return _dfaa (d ,s ,sel )};func TstOSymbol (t *_da .T ,scale ...int )*Bitmap {_befb ,_dceee :=NewWithData (4,5,[]byte {0xF0,0x90,0x90,0x90,0xF0});_d .NoError (t ,_dceee );return TstGetScaledSymbol (t ,_befb ,scale ...);};func init (){const _cgee ="\u0062\u0069\u0074\u006dap\u0073\u002e\u0069\u006e\u0069\u0074\u0069\u0061\u006c\u0069\u007a\u0061\u0074\u0069o\u006e";_cbee =New (50,40);var _aaeg error ;_cbee ,_aaeg =_cbee .AddBorder (2,1);if _aaeg !=nil {panic (_a .Wrap (_aaeg ,_cgee ,"f\u0072\u0061\u006d\u0065\u0042\u0069\u0074\u006d\u0061\u0070"));};_bedgd ,_aaeg =NewWithData (50,22,_abef );if _aaeg !=nil {panic (_a .Wrap (_aaeg ,_cgee ,"i\u006d\u0061\u0067\u0065\u0042\u0069\u0074\u006d\u0061\u0070"));};};func NewClassedPoints (points *Points ,classes _dd .IntSlice )(*ClassedPoints ,error ){const _dfde ="\u004e\u0065w\u0043\u006c\u0061s\u0073\u0065\u0064\u0050\u006f\u0069\u006e\u0074\u0073";if points ==nil {return nil ,_a .Error (_dfde ,"\u0070\u0072\u006f\u0076id\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0070\u006f\u0069\u006e\u0074\u0073");};if classes ==nil {return nil ,_a .Error (_dfde ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0063\u006c\u0061ss\u0065\u0073");};_cefdf :=&ClassedPoints {Points :points ,IntSlice :classes };if _gfaa :=_cefdf .validateIntSlice ();_gfaa !=nil {return nil ,_a .Wrap (_gfaa ,_dfde ,"");};return _cefdf ,nil ;};func _fda (_abg *Bitmap ,_ccg *Bitmap ,_aeg int )(_de error ){const _ga ="e\u0078\u0070\u0061\u006edB\u0069n\u0061\u0072\u0079\u0050\u006fw\u0065\u0072\u0032\u004c\u006f\u0077";switch _aeg {case 2:_de =_g (_abg ,_ccg );case 4:_de =_dcd (_abg ,_ccg );case 8:_de =_gdc (_abg ,_ccg );default:return _a .Error (_ga ,"\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 _de !=nil {_de =_a .Wrap (_de ,_ga ,"");};return _de ;};func _gded (_bcebe ,_aaaa *Bitmap ,_dada ,_bedf int )(*Bitmap ,error ){const _ecba ="\u0065\u0072\u006f\u0064\u0065\u0042\u0072\u0069\u0063\u006b";if _aaaa ==nil {return nil ,_a .Error (_ecba ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _dada < 1||_bedf < 1{return nil ,_a .Error (_ecba ,"\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 _dada ==1&&_bedf ==1{_abcfb ,_adfd :=_fffe (_bcebe ,_aaaa );if _adfd !=nil {return nil ,_a .Wrap (_adfd ,_ecba ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u0026\u0026 \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");};return _abcfb ,nil ;};if _dada ==1||_bedf ==1{_fegf :=SelCreateBrick (_bedf ,_dada ,_bedf /2,_dada /2,SelHit );_faaac ,_deef :=_eefe (_bcebe ,_aaaa ,_fegf );if _deef !=nil {return nil ,_a .Wrap (_deef ,_ecba ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");};return _faaac ,nil ;};_degg :=SelCreateBrick (1,_dada ,0,_dada /2,SelHit );_addc :=SelCreateBrick (_bedf ,1,_bedf /2,0,SelHit );_bgbg ,_affc :=_eefe (nil ,_aaaa ,_degg );if _affc !=nil {return nil ,_a .Wrap (_affc ,_ecba ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");};_bcebe ,_affc =_eefe (_bcebe ,_bgbg ,_addc );if _affc !=nil {return nil ,_a .Wrap (_affc ,_ecba ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};return _bcebe ,nil ;};func (_fgc *Bitmap )RemoveBorder (borderSize int )(*Bitmap ,error ){if borderSize ==0{return _fgc .Copy (),nil ;};_faaf ,_bbab :=_fgc .removeBorderGeneral (borderSize ,borderSize ,borderSize ,borderSize );if _bbab !=nil {return nil ,_a .Wrap (_bbab ,"\u0052\u0065\u006do\u0076\u0065\u0042\u006f\u0072\u0064\u0065\u0072","");};return _faaf ,nil ;};func RasterOperation (dest *Bitmap ,dx ,dy ,dw ,dh int ,op RasterOperator ,src *Bitmap ,sx ,sy int )error {return _babbd (dest ,dx ,dy ,dw ,dh ,op ,src ,sx ,sy );};func (_adbf *Boxes )Get (i int )(*_b .Rectangle ,error ){const _gadg ="\u0042o\u0078\u0065\u0073\u002e\u0047\u0065t";if _adbf ==nil {return nil ,_a .Error (_gadg ,"\u0027\u0042\u006f\u0078es\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};if i > len (*_adbf )-1{return nil ,_a .Errorf (_gadg ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return (*_adbf )[i ],nil ;};func (_cagg *ClassedPoints )SortByX (){_cagg ._cbcc =_cagg .xSortFunction ();_eg .Sort (_cagg )};func _gaa (_gec *Bitmap ,_aae ,_bcg int )(*Bitmap ,error ){const _ac ="e\u0078\u0070\u0061\u006edB\u0069n\u0061\u0072\u0079\u0052\u0065p\u006c\u0069\u0063\u0061\u0074\u0065";if _gec ==nil {return nil ,_a .Error (_ac ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _aae <=0||_bcg <=0{return nil ,_a .Error (_ac ,"\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 _aae ==_bcg {if _aae ==1{_eee ,_ag :=_fffe (nil ,_gec );if _ag !=nil {return nil ,_a .Wrap (_ag ,_ac ,"\u0078\u0046\u0061\u0063\u0074\u0020\u003d\u003d\u0020y\u0046\u0061\u0063\u0074");};return _eee ,nil ;};if _aae ==2||_aae ==4||_aae ==8{_dgb ,_cb :=_ebb (_gec ,_aae );if _cb !=nil {return nil ,_a .Wrap (_cb ,_ac ,"\u0078\u0046a\u0063\u0074\u0020i\u006e\u0020\u007b\u0032\u002c\u0034\u002c\u0038\u007d");};return _dgb ,nil ;};};_bea :=_aae *_gec .Width ;_cbg :=_bcg *_gec .Height ;_ccf :=New (_bea ,_cbg );_bg :=_ccf .RowStride ;var (_edd ,_ec ,_fab ,_cee ,_cda int ;_beg byte ;_bdg error ;);for _ec =0;_ec < _gec .Height ;_ec ++{_edd =_bcg *_ec *_bg ;for _fab =0;_fab < _gec .Width ;_fab ++{if _gg :=_gec .GetPixel (_fab ,_ec );_gg {_cda =_aae *_fab ;for _cee =0;_cee < _aae ;_cee ++{_ccf .setBit (_edd *8+_cda +_cee );};};};for _cee =1;_cee < _bcg ;_cee ++{_gcb :=_edd +_cee *_bg ;for _bab :=0;_bab < _bg ;_bab ++{if _beg ,_bdg =_ccf .GetByte (_edd +_bab );_bdg !=nil {return nil ,_a .Wrapf (_bdg ,_ac ,"\u0072\u0065\u0070\u006cic\u0061\u0074\u0069\u006e\u0067\u0020\u006c\u0069\u006e\u0065\u003a\u0020\u0027\u0025d\u0027",_cee );};if _bdg =_ccf .SetByte (_gcb +_bab ,_beg );_bdg !=nil {return nil ,_a .Wrap (_bdg ,_ac ,"\u0053\u0065\u0074\u0074in\u0067\u0020\u0062\u0079\u0074\u0065\u0020\u0066\u0061\u0069\u006c\u0065\u0064");};};};};return _ccf ,nil ;};func MakePixelCentroidTab8 ()[]int {return _gdcd ()};const (_gffc shift =iota ;_fcdg ;);func (_bggfa *Bitmaps )AddBitmap (bm *Bitmap ){_bggfa .Values =append (_bggfa .Values ,bm )};func _fcab (_gaga *Bitmap ,_ffdg ,_dbgb ,_aebd ,_fgfga int ,_agfcb RasterOperator ,_ceae *Bitmap ,_abcda ,_cbcb int )error {var (_eebf bool ;_ffff bool ;_eeff int ;_gege int ;_aebb int ;_acfe bool ;_eade byte ;_fgbg int ;_fbbc int ;_babf int ;_cbaca ,_gee int ;);_abcac :=8-(_ffdg &7);_efed :=_gbbb [_abcac ];_ggcef :=_gaga .RowStride *_dbgb +(_ffdg >>3);_ecaba :=_ceae .RowStride *_cbcb +(_abcda >>3);if _aebd < _abcac {_eebf =true ;_efed &=_bge [8-_abcac +_aebd ];};if !_eebf {_eeff =(_aebd -_abcac )>>3;if _eeff > 0{_ffff =true ;_gege =_ggcef +1;_aebb =_ecaba +1;};};_fgbg =(_ffdg +_aebd )&7;if !(_eebf ||_fgbg ==0){_acfe =true ;_eade =_bge [_fgbg ];_fbbc =_ggcef +1+_eeff ;_babf =_ecaba +1+_eeff ;};switch _agfcb {case PixSrc :for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{_gaga .Data [_ggcef ]=_gdcad (_gaga .Data [_ggcef ],_ceae .Data [_ecaba ],_efed );_ggcef +=_gaga .RowStride ;_ecaba +=_ceae .RowStride ;};if _ffff {for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{for _gee =0;_gee < _eeff ;_gee ++{_gaga .Data [_gege +_gee ]=_ceae .Data [_aebb +_gee ];};_gege +=_gaga .RowStride ;_aebb +=_ceae .RowStride ;};};if _acfe {for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{_gaga .Data [_fbbc ]=_gdcad (_gaga .Data [_fbbc ],_ceae .Data [_babf ],_eade );_fbbc +=_gaga .RowStride ;_babf +=_ceae .RowStride ;};};case PixNotSrc :for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{_gaga .Data [_ggcef ]=_gdcad (_gaga .Data [_ggcef ],^_ceae .Data [_ecaba ],_efed );_ggcef +=_gaga .RowStride ;_ecaba +=_ceae .RowStride ;};if _ffff {for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{for _gee =0;_gee < _eeff ;_gee ++{_gaga .Data [_gege +_gee ]=^_ceae .Data [_aebb +_gee ];};_gege +=_gaga .RowStride ;_aebb +=_ceae .RowStride ;};};if _acfe {for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{_gaga .Data [_fbbc ]=_gdcad (_gaga .Data [_fbbc ],^_ceae .Data [_babf ],_eade );_fbbc +=_gaga .RowStride ;_babf +=_ceae .RowStride ;};};case PixSrcOrDst :for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{_gaga .Data [_ggcef ]=_gdcad (_gaga .Data [_ggcef ],_ceae .Data [_ecaba ]|_gaga .Data [_ggcef ],_efed );_ggcef +=_gaga .RowStride ;_ecaba +=_ceae .RowStride ;};if _ffff {for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{for _gee =0;_gee < _eeff ;_gee ++{_gaga .Data [_gege +_gee ]|=_ceae .Data [_aebb +_gee ];};_gege +=_gaga .RowStride ;_aebb +=_ceae .RowStride ;};};if _acfe {for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{_gaga .Data [_fbbc ]=_gdcad (_gaga .Data [_fbbc ],_ceae .Data [_babf ]|_gaga .Data [_fbbc ],_eade );_fbbc +=_gaga .RowStride ;_babf +=_ceae .RowStride ;};};case PixSrcAndDst :for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{_gaga .Data [_ggcef ]=_gdcad (_gaga .Data [_ggcef ],_ceae .Data [_ecaba ]&_gaga .Data [_ggcef ],_efed );_ggcef +=_gaga .RowStride ;_ecaba +=_ceae .RowStride ;};if _ffff {for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{for _gee =0;_gee < _eeff ;_gee ++{_gaga .Data [_gege +_gee ]&=_ceae .Data [_aebb +_gee ];};_gege +=_gaga .RowStride ;_aebb +=_ceae .RowStride ;};};if _acfe {for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{_gaga .Data [_fbbc ]=_gdcad (_gaga .Data [_fbbc ],_ceae .Data [_babf ]&_gaga .Data [_fbbc ],_eade );_fbbc +=_gaga .RowStride ;_babf +=_ceae .RowStride ;};};case PixSrcXorDst :for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{_gaga .Data [_ggcef ]=_gdcad (_gaga .Data [_ggcef ],_ceae .Data [_ecaba ]^_gaga .Data [_ggcef ],_efed );_ggcef +=_gaga .RowStride ;_ecaba +=_ceae .RowStride ;};if _ffff {for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{for _gee =0;_gee < _eeff ;_gee ++{_gaga .Data [_gege +_gee ]^=_ceae .Data [_aebb +_gee ];};_gege +=_gaga .RowStride ;_aebb +=_ceae .RowStride ;};};if _acfe {for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{_gaga .Data [_fbbc ]=_gdcad (_gaga .Data [_fbbc ],_ceae .Data [_babf ]^_gaga .Data [_fbbc ],_eade );_fbbc +=_gaga .RowStride ;_babf +=_ceae .RowStride ;};};case PixNotSrcOrDst :for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{_gaga .Data [_ggcef ]=_gdcad (_gaga .Data [_ggcef ],^(_ceae .Data [_ecaba ])|_gaga .Data [_ggcef ],_efed );_ggcef +=_gaga .RowStride ;_ecaba +=_ceae .RowStride ;};if _ffff {for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{for _gee =0;_gee < _eeff ;_gee ++{_gaga .Data [_gege +_gee ]|=^(_ceae .Data [_aebb +_gee ]);};_gege +=_gaga .RowStride ;_aebb +=_ceae .RowStride ;};};if _acfe {for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{_gaga .Data [_fbbc ]=_gdcad (_gaga .Data [_fbbc ],^(_ceae .Data [_babf ])|_gaga .Data [_fbbc ],_eade );_fbbc +=_gaga .RowStride ;_babf +=_ceae .RowStride ;};};case PixNotSrcAndDst :for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{_gaga .Data [_ggcef ]=_gdcad (_gaga .Data [_ggcef ],^(_ceae .Data [_ecaba ])&_gaga .Data [_ggcef ],_efed );_ggcef +=_gaga .RowStride ;_ecaba +=_ceae .RowStride ;};if _ffff {for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{for _gee =0;_gee < _eeff ;_gee ++{_gaga .Data [_gege +_gee ]&=^_ceae .Data [_aebb +_gee ];};_gege +=_gaga .RowStride ;_aebb +=_ceae .RowStride ;};};if _acfe {for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{_gaga .Data [_fbbc ]=_gdcad (_gaga .Data [_fbbc ],^(_ceae .Data [_babf ])&_gaga .Data [_fbbc ],_eade );_fbbc +=_gaga .RowStride ;_babf +=_ceae .RowStride ;};};case PixSrcOrNotDst :for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{_gaga .Data [_ggcef ]=_gdcad (_gaga .Data [_ggcef ],_ceae .Data [_ecaba ]|^(_gaga .Data [_ggcef ]),_efed );_ggcef +=_gaga .RowStride ;_ecaba +=_ceae .RowStride ;};if _ffff {for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{for _gee =0;_gee < _eeff ;_gee ++{_gaga .Data [_gege +_gee ]=_ceae .Data [_aebb +_gee ]|^(_gaga .Data [_gege +_gee ]);};_gege +=_gaga .RowStride ;_aebb +=_ceae .RowStride ;};};if _acfe {for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{_gaga .Data [_fbbc ]=_gdcad (_gaga .Data [_fbbc ],_ceae .Data [_babf ]|^(_gaga .Data [_fbbc ]),_eade );_fbbc +=_gaga .RowStride ;_babf +=_ceae .RowStride ;};};case PixSrcAndNotDst :for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{_gaga .Data [_ggcef ]=_gdcad (_gaga .Data [_ggcef ],_ceae .Data [_ecaba ]&^(_gaga .Data [_ggcef ]),_efed );_ggcef +=_gaga .RowStride ;_ecaba +=_ceae .RowStride ;};if _ffff {for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{for _gee =0;_gee < _eeff ;_gee ++{_gaga .Data [_gege +_gee ]=_ceae .Data [_aebb +_gee ]&^(_gaga .Data [_gege +_gee ]);};_gege +=_gaga .RowStride ;_aebb +=_ceae .RowStride ;};};if _acfe {for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{_gaga .Data [_fbbc ]=_gdcad (_gaga .Data [_fbbc ],_ceae .Data [_babf ]&^(_gaga .Data [_fbbc ]),_eade );_fbbc +=_gaga .RowStride ;_babf +=_ceae .RowStride ;};};case PixNotPixSrcOrDst :for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{_gaga .Data [_ggcef ]=_gdcad (_gaga .Data [_ggcef ],^(_ceae .Data [_ecaba ]|_gaga .Data [_ggcef ]),_efed );_ggcef +=_gaga .RowStride ;_ecaba +=_ceae .RowStride ;};if _ffff {for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{for _gee =0;_gee < _eeff ;_gee ++{_gaga .Data [_gege +_gee ]=^(_ceae .Data [_aebb +_gee ]|_gaga .Data [_gege +_gee ]);};_gege +=_gaga .RowStride ;_aebb +=_ceae .RowStride ;};};if _acfe {for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{_gaga .Data [_fbbc ]=_gdcad (_gaga .Data [_fbbc ],^(_ceae .Data [_babf ]|_gaga .Data [_fbbc ]),_eade );_fbbc +=_gaga .RowStride ;_babf +=_ceae .RowStride ;};};case PixNotPixSrcAndDst :for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{_gaga .Data [_ggcef ]=_gdcad (_gaga .Data [_ggcef ],^(_ceae .Data [_ecaba ]&_gaga .Data [_ggcef ]),_efed );_ggcef +=_gaga .RowStride ;_ecaba +=_ceae .RowStride ;};if _ffff {for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{for _gee =0;_gee < _eeff ;_gee ++{_gaga .Data [_gege +_gee ]=^(_ceae .Data [_aebb +_gee ]&_gaga .Data [_gege +_gee ]);};_gege +=_gaga .RowStride ;_aebb +=_ceae .RowStride ;};};if _acfe {for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{_gaga .Data [_fbbc ]=_gdcad (_gaga .Data [_fbbc ],^(_ceae .Data [_babf ]&_gaga .Data [_fbbc ]),_eade );_fbbc +=_gaga .RowStride ;_babf +=_ceae .RowStride ;};};case PixNotPixSrcXorDst :for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{_gaga .Data [_ggcef ]=_gdcad (_gaga .Data [_ggcef ],^(_ceae .Data [_ecaba ]^_gaga .Data [_ggcef ]),_efed );_ggcef +=_gaga .RowStride ;_ecaba +=_ceae .RowStride ;};if _ffff {for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{for _gee =0;_gee < _eeff ;_gee ++{_gaga .Data [_gege +_gee ]=^(_ceae .Data [_aebb +_gee ]^_gaga .Data [_gege +_gee ]);};_gege +=_gaga .RowStride ;_aebb +=_ceae .RowStride ;};};if _acfe {for _cbaca =0;_cbaca < _fgfga ;_cbaca ++{_gaga .Data [_fbbc ]=_gdcad (_gaga .Data [_fbbc ],^(_ceae .Data [_babf ]^_gaga .Data [_fbbc ]),_eade );_fbbc +=_gaga .RowStride ;_babf +=_ceae .RowStride ;};};default:_be .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",_agfcb );return _a .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 DilateBrick (d ,s *Bitmap ,hSize ,vSize int )(*Bitmap ,error ){return _ecgb (d ,s ,hSize ,vSize )};func _bbabe ()[]int {_dfed :=make ([]int ,256);for _bcbb :=0;_bcbb <=0xff;_bcbb ++{_bdcd :=byte (_bcbb );_dfed [_bdcd ]=int (_bdcd &0x1)+(int (_bdcd >>1)&0x1)+(int (_bdcd >>2)&0x1)+(int (_bdcd >>3)&0x1)+(int (_bdcd >>4)&0x1)+(int (_bdcd >>5)&0x1)+(int (_bdcd >>6)&0x1)+(int (_bdcd >>7)&0x1);};return _dfed ;};func (_cegd *Points )AddPoint (x ,y float32 ){*_cegd =append (*_cegd ,Point {x ,y })};func CorrelationScore (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab []int )(_agg float64 ,_bgbb error ){const _dbcf ="\u0063\u006fr\u0072\u0065\u006ca\u0074\u0069\u006f\u006e\u0053\u0063\u006f\u0072\u0065";if bm1 ==nil ||bm2 ==nil {return 0,_a .Error (_dbcf ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0062\u0069\u0074ma\u0070\u0073");};if tab ==nil {return 0,_a .Error (_dbcf ,"\u0027\u0074\u0061\u0062\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065f\u0069\u006e\u0065\u0064");};if area1 <=0||area2 <=0{return 0,_a .Error (_dbcf ,"\u0061\u0072\u0065\u0061s\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065\u0020\u0067r\u0065a\u0074\u0065\u0072\u0020\u0074\u0068\u0061n\u0020\u0030");};_aefc ,_dcgg :=bm1 .Width ,bm1 .Height ;_gcgc ,_gbcd :=bm2 .Width ,bm2 .Height ;_adegb :=_bgdc (_aefc -_gcgc );if _adegb > maxDiffW {return 0,nil ;};_fcdb :=_bgdc (_dcgg -_gbcd );if _fcdb > maxDiffH {return 0,nil ;};var _bag ,_dgfd int ;if delX >=0{_bag =int (delX +0.5);}else {_bag =int (delX -0.5);};if delY >=0{_dgfd =int (delY +0.5);}else {_dgfd =int (delY -0.5);};_bfc :=_aafe (_dgfd ,0);_efff :=_gbda (_gbcd +_dgfd ,_dcgg );_dedb :=bm1 .RowStride *_bfc ;_fgea :=bm2 .RowStride *(_bfc -_dgfd );_abfb :=_aafe (_bag ,0);_fcdag :=_gbda (_gcgc +_bag ,_aefc );_daee :=bm2 .RowStride ;var _bfgdc ,_aga int ;if _bag >=8{_bfgdc =_bag >>3;_dedb +=_bfgdc ;_abfb -=_bfgdc <<3;_fcdag -=_bfgdc <<3;_bag &=7;}else if _bag <=-8{_aga =-((_bag +7)>>3);_fgea +=_aga ;_daee -=_aga ;_bag +=_aga <<3;};if _abfb >=_fcdag ||_bfc >=_efff {return 0,nil ;};_cade :=(_fcdag +7)>>3;var (_ecfd ,_fbga ,_fccb byte ;_egg ,_ddb ,_bdga int ;);switch {case _bag ==0:for _bdga =_bfc ;_bdga < _efff ;_bdga ,_dedb ,_fgea =_bdga +1,_dedb +bm1 .RowStride ,_fgea +bm2 .RowStride {for _ddb =0;_ddb < _cade ;_ddb ++{_fccb =bm1 .Data [_dedb +_ddb ]&bm2 .Data [_fgea +_ddb ];_egg +=tab [_fccb ];};};case _bag > 0:if _daee < _cade {for _bdga =_bfc ;_bdga < _efff ;_bdga ,_dedb ,_fgea =_bdga +1,_dedb +bm1 .RowStride ,_fgea +bm2 .RowStride {_ecfd ,_fbga =bm1 .Data [_dedb ],bm2 .Data [_fgea ]>>uint (_bag );_fccb =_ecfd &_fbga ;_egg +=tab [_fccb ];for _ddb =1;_ddb < _daee ;_ddb ++{_ecfd ,_fbga =bm1 .Data [_dedb +_ddb ],(bm2 .Data [_fgea +_ddb ]>>uint (_bag ))|(bm2 .Data [_fgea +_ddb -1]<<uint (8-_bag ));_fccb =_ecfd &_fbga ;_egg +=tab [_fccb ];};_ecfd =bm1 .Data [_dedb +_ddb ];_fbga =bm2 .Data [_fgea +_ddb -1]<<uint (8-_bag );_fccb =_ecfd &_fbga ;_egg +=tab [_fccb ];};}else {for _bdga =_bfc ;_bdga < _efff ;_bdga ,_dedb ,_fgea =_bdga +1,_dedb +bm1 .RowStride ,_fgea +bm2 .RowStride {_ecfd ,_fbga =bm1 .Data [_dedb ],bm2 .Data [_fgea ]>>uint (_bag );_fccb =_ecfd &_fbga ;_egg +=tab [_fccb ];for _ddb =1;_ddb < _cade ;_ddb ++{_ecfd =bm1 .Data [_dedb +_ddb ];_fbga =(bm2 .Data [_fgea +_ddb ]>>uint (_bag ))|(bm2 .Data [_fgea +_ddb -1]<<uint (8-_bag ));_fccb =_ecfd &_fbga ;_egg +=tab [_fccb ];};};};default:if _cade < _daee {for _bdga =_bfc ;_bdga < _efff ;_bdga ,_dedb ,_fgea =_bdga +1,_dedb +bm1 .RowStride ,_fgea +bm2 .RowStride {for _ddb =0;_ddb < _cade ;_ddb ++{_ecfd =bm1 .Data [_dedb +_ddb ];_fbga =bm2 .Data [_fgea +_ddb ]<<uint (-_bag );_fbga |=bm2 .Data [_fgea +_ddb +1]>>uint (8+_bag );_fccb =_ecfd &_fbga ;_egg +=tab [_fccb ];};};}else {for _bdga =_bfc ;_bdga < _efff ;_bdga ,_dedb ,_fgea =_bdga +1,_dedb +bm1 .RowStride ,_fgea +bm2 .RowStride {for _ddb =0;_ddb < _cade -1;_ddb ++{_ecfd =bm1 .Data [_dedb +_ddb ];_fbga =bm2 .Data [_fgea +_ddb ]<<uint (-_bag );_fbga |=bm2 .Data [_fgea +_ddb +1]>>uint (8+_bag );_fccb =_ecfd &_fbga ;_egg +=tab [_fccb ];};_ecfd =bm1 .Data [_dedb +_ddb ];_fbga =bm2 .Data [_fgea +_ddb ]<<uint (-_bag );_fccb =_ecfd &_fbga ;_egg +=tab [_fccb ];};};};_agg =float64 (_egg )*float64 (_egg )/(float64 (area1 )*float64 (area2 ));return _agg ,nil ;};func TstFrameBitmapData ()[]byte {return _cbee .Data };func (_fdb *Bitmap )AddBorder (borderSize ,val int )(*Bitmap ,error ){if borderSize ==0{return _fdb .Copy (),nil ;};_fabgd ,_fdac :=_fdb .addBorderGeneral (borderSize ,borderSize ,borderSize ,borderSize ,val );if _fdac !=nil {return nil ,_a .Wrap (_fdac ,"\u0041d\u0064\u0042\u006f\u0072\u0064\u0065r","");};return _fabgd ,nil ;};func TstWordBitmap (t *_da .T ,scale ...int )*Bitmap {_cbdd :=1;if len (scale )> 0{_cbdd =scale [0];};_geca :=3;_fgbgb :=9+7+15+2*_geca ;_afba :=5+_geca +5;_daafa :=New (_fgbgb *_cbdd ,_afba *_cbdd );_dgdde :=&Bitmaps {};var _ffed *int ;_geca *=_cbdd ;_gfacd :=0;_ffed =&_gfacd ;_begf :=0;_dceb :=TstDSymbol (t ,scale ...);TstAddSymbol (t ,_dgdde ,_dceb ,_ffed ,_begf ,1*_cbdd );_dceb =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_dgdde ,_dceb ,_ffed ,_begf ,_geca );_dceb =TstISymbol (t ,scale ...);TstAddSymbol (t ,_dgdde ,_dceb ,_ffed ,_begf ,1*_cbdd );_dceb =TstTSymbol (t ,scale ...);TstAddSymbol (t ,_dgdde ,_dceb ,_ffed ,_begf ,_geca );_dceb =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_dgdde ,_dceb ,_ffed ,_begf ,1*_cbdd );_dceb =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_dgdde ,_dceb ,_ffed ,_begf ,1*_cbdd );_dceb =TstWSymbol (t ,scale ...);TstAddSymbol (t ,_dgdde ,_dceb ,_ffed ,_begf ,0);*_ffed =0;_begf =5*_cbdd +_geca ;_dceb =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_dgdde ,_dceb ,_ffed ,_begf ,1*_cbdd );_dceb =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_dgdde ,_dceb ,_ffed ,_begf ,_geca );_dceb =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_dgdde ,_dceb ,_ffed ,_begf ,1*_cbdd );_dceb =TstESymbol (t ,scale ...);TstAddSymbol (t ,_dgdde ,_dceb ,_ffed ,_begf ,1*_cbdd );_dceb =TstVSymbol (t ,scale ...);TstAddSymbol (t ,_dgdde ,_dceb ,_ffed ,_begf ,1*_cbdd );_dceb =TstESymbol (t ,scale ...);TstAddSymbol (t ,_dgdde ,_dceb ,_ffed ,_begf ,1*_cbdd );_dceb =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_dgdde ,_dceb ,_ffed ,_begf ,0);TstWriteSymbols (t ,_dgdde ,_daafa );return _daafa ;};func (_eabf *Bitmap )clearAll ()error {return _eabf .RasterOperation (0,0,_eabf .Width ,_eabf .Height ,PixClr ,nil ,0,0);};func (_dbc *Bitmap )setTwoBytes (_cbgg int ,_cgf uint16 )error {if _cbgg +1> len (_dbc .Data )-1{return _a .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",_cbgg );};_dbc .Data [_cbgg ]=byte ((_cgf &0xff00)>>8);_dbc .Data [_cbgg +1]=byte (_cgf &0xff);return nil ;}; |