mirror of
https://github.com/unidoc/unipdf.git
synced 2025-05-01 22:17:29 +08:00
666 lines
196 KiB
Go
666 lines
196 KiB
Go
//
|
|
// Copyright 2020 FoxyUtils ehf. All rights reserved.
|
|
//
|
|
// This is a commercial product and requires a license to operate.
|
|
// A trial license can be obtained at https://unidoc.io
|
|
//
|
|
// DO NOT EDIT: generated by unitwist Go source code obfuscator.
|
|
//
|
|
// Use of this source code is governed by the UniDoc End User License Agreement
|
|
// terms that can be accessed at https://unidoc.io/eula/
|
|
|
|
package bitmap ;import (_ea "encoding/binary";_d "github.com/stretchr/testify/require";_dd "github.com/unidoc/unipdf/v3/common";_gd "github.com/unidoc/unipdf/v3/internal/bitwise";_ce "github.com/unidoc/unipdf/v3/internal/imageutil";_dg "github.com/unidoc/unipdf/v3/internal/jbig2/basic";
|
|
_f "github.com/unidoc/unipdf/v3/internal/jbig2/errors";_ab "image";_e "math";_c "sort";_b "strings";_g "testing";);func _bdgf (_cea *Bitmap ,_cfa ...int )(_eca *Bitmap ,_fff error ){const _bbd ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0043\u0061\u0073\u0063\u0061\u0064\u0065";
|
|
if _cea ==nil {return nil ,_f .Error (_bbd ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};if len (_cfa )==0||len (_cfa )> 4{return nil ,_f .Error (_bbd ,"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 _cfa [0]<=0{_dd .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");_eca ,_fff =_gcff (nil ,_cea );if _fff !=nil {return nil ,_f .Wrap (_fff ,_bbd ,"l\u0065\u0076\u0065\u006c\u0031\u0020\u003c\u003d\u0020\u0030");
|
|
};return _eca ,nil ;};_adb :=_bgbe ();_eca =_cea ;for _ee ,_dbff :=range _cfa {if _dbff <=0{break ;};_eca ,_fff =_efg (_eca ,_dbff ,_adb );if _fff !=nil {return nil ,_f .Wrapf (_fff ,_bbd ,"\u006c\u0065\u0076\u0065\u006c\u0025\u0064\u0020\u0072\u0065\u0064\u0075c\u0074\u0069\u006f\u006e",_ee );
|
|
};};return _eca ,nil ;};func _ecd ()(_gad [256]uint64 ){for _efe :=0;_efe < 256;_efe ++{if _efe &0x01!=0{_gad [_efe ]|=0xff;};if _efe &0x02!=0{_gad [_efe ]|=0xff00;};if _efe &0x04!=0{_gad [_efe ]|=0xff0000;};if _efe &0x08!=0{_gad [_efe ]|=0xff000000;};
|
|
if _efe &0x10!=0{_gad [_efe ]|=0xff00000000;};if _efe &0x20!=0{_gad [_efe ]|=0xff0000000000;};if _efe &0x40!=0{_gad [_efe ]|=0xff000000000000;};if _efe &0x80!=0{_gad [_efe ]|=0xff00000000000000;};};return _gad ;};func HausTest (p1 ,p2 ,p3 ,p4 *Bitmap ,delX ,delY float32 ,maxDiffW ,maxDiffH int )(bool ,error ){const _fabg ="\u0048\u0061\u0075\u0073\u0054\u0065\u0073\u0074";
|
|
_cga ,_bfba :=p1 .Width ,p1 .Height ;_bffg ,_ffcf :=p3 .Width ,p3 .Height ;if _dg .Abs (_cga -_bffg )> maxDiffW {return false ,nil ;};if _dg .Abs (_bfba -_ffcf )> maxDiffH {return false ,nil ;};_dafd :=int (delX +_dg .Sign (delX )*0.5);_gcef :=int (delY +_dg .Sign (delY )*0.5);
|
|
var _gebc error ;_beeg :=p1 .CreateTemplate ();if _gebc =_beeg .RasterOperation (0,0,_cga ,_bfba ,PixSrc ,p1 ,0,0);_gebc !=nil {return false ,_f .Wrap (_gebc ,_fabg ,"p\u0031\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _gebc =_beeg .RasterOperation (_dafd ,_gcef ,_cga ,_bfba ,PixNotSrcAndDst ,p4 ,0,0);
|
|
_gebc !=nil {return false ,_f .Wrap (_gebc ,_fabg ,"\u0021p\u0034\u0020\u0026\u0020\u0074");};if _beeg .Zero (){return false ,nil ;};if _gebc =_beeg .RasterOperation (_dafd ,_gcef ,_bffg ,_ffcf ,PixSrc ,p3 ,0,0);_gebc !=nil {return false ,_f .Wrap (_gebc ,_fabg ,"p\u0033\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");
|
|
};if _gebc =_beeg .RasterOperation (0,0,_bffg ,_ffcf ,PixNotSrcAndDst ,p2 ,0,0);_gebc !=nil {return false ,_f .Wrap (_gebc ,_fabg ,"\u0021p\u0032\u0020\u0026\u0020\u0074");};return _beeg .Zero (),nil ;};func CorrelationScoreThresholded (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab ,downcount []int ,scoreThreshold float32 )(bool ,error ){const _ebeb ="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 ,_f .Error (_ebeb ,"\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 ,_f .Error (_ebeb ,"\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 ,_f .Error (_ebeb ,"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 ,_f .Error (_ebeb ,"\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 ,_f .Error (_ebeb ,"p\u0072\u006f\u0076\u0069de\u0064 \u006e\u0069\u006c\u0020\u0027s\u0075\u006d\u0074\u0061\u0062\u0027");
|
|
};_gebe ,_geeg :=bm1 .Width ,bm1 .Height ;_faaf ,_gagde :=bm2 .Width ,bm2 .Height ;if _dg .Abs (_gebe -_faaf )> maxDiffW {return false ,nil ;};if _dg .Abs (_geeg -_gagde )> maxDiffH {return false ,nil ;};_fcgdb :=int (delX +_dg .Sign (delX )*0.5);_gegb :=int (delY +_dg .Sign (delY )*0.5);
|
|
_dbge :=int (_e .Ceil (_e .Sqrt (float64 (scoreThreshold )*float64 (area1 )*float64 (area2 ))));_acge :=bm2 .RowStride ;_babg :=_edad (_gegb ,0);_dcccc :=_bfada (_gagde +_gegb ,_geeg );_deaf :=bm1 .RowStride *_babg ;_edg :=bm2 .RowStride *(_babg -_gegb );
|
|
var _egfc int ;if _dcccc <=_geeg {_egfc =downcount [_dcccc -1];};_agd :=_edad (_fcgdb ,0);_gab :=_bfada (_faaf +_fcgdb ,_gebe );var _adg ,_acef int ;if _fcgdb >=8{_adg =_fcgdb >>3;_deaf +=_adg ;_agd -=_adg <<3;_gab -=_adg <<3;_fcgdb &=7;}else if _fcgdb <=-8{_acef =-((_fcgdb +7)>>3);
|
|
_edg +=_acef ;_acge -=_acef ;_fcgdb +=_acef <<3;};var (_gaf ,_dcbf ,_edbd int ;_babd ,_fgdad ,_ggfgb byte ;);if _agd >=_gab ||_babg >=_dcccc {return false ,nil ;};_deag :=(_gab +7)>>3;switch {case _fcgdb ==0:for _dcbf =_babg ;_dcbf < _dcccc ;_dcbf ,_deaf ,_edg =_dcbf +1,_deaf +bm1 .RowStride ,_edg +bm2 .RowStride {for _edbd =0;
|
|
_edbd < _deag ;_edbd ++{_babd =bm1 .Data [_deaf +_edbd ]&bm2 .Data [_edg +_edbd ];_gaf +=tab [_babd ];};if _gaf >=_dbge {return true ,nil ;};if _gccd :=_gaf +downcount [_dcbf ]-_egfc ;_gccd < _dbge {return false ,nil ;};};case _fcgdb > 0&&_acge < _deag :for _dcbf =_babg ;
|
|
_dcbf < _dcccc ;_dcbf ,_deaf ,_edg =_dcbf +1,_deaf +bm1 .RowStride ,_edg +bm2 .RowStride {_fgdad =bm1 .Data [_deaf ];_ggfgb =bm2 .Data [_edg ]>>uint (_fcgdb );_babd =_fgdad &_ggfgb ;_gaf +=tab [_babd ];for _edbd =1;_edbd < _acge ;_edbd ++{_fgdad =bm1 .Data [_deaf +_edbd ];
|
|
_ggfgb =bm2 .Data [_edg +_edbd ]>>uint (_fcgdb )|bm2 .Data [_edg +_edbd -1]<<uint (8-_fcgdb );_babd =_fgdad &_ggfgb ;_gaf +=tab [_babd ];};_fgdad =bm1 .Data [_deaf +_edbd ];_ggfgb =bm2 .Data [_edg +_edbd -1]<<uint (8-_fcgdb );_babd =_fgdad &_ggfgb ;_gaf +=tab [_babd ];
|
|
if _gaf >=_dbge {return true ,nil ;}else if _gaf +downcount [_dcbf ]-_egfc < _dbge {return false ,nil ;};};case _fcgdb > 0&&_acge >=_deag :for _dcbf =_babg ;_dcbf < _dcccc ;_dcbf ,_deaf ,_edg =_dcbf +1,_deaf +bm1 .RowStride ,_edg +bm2 .RowStride {_fgdad =bm1 .Data [_deaf ];
|
|
_ggfgb =bm2 .Data [_edg ]>>uint (_fcgdb );_babd =_fgdad &_ggfgb ;_gaf +=tab [_babd ];for _edbd =1;_edbd < _deag ;_edbd ++{_fgdad =bm1 .Data [_deaf +_edbd ];_ggfgb =bm2 .Data [_edg +_edbd ]>>uint (_fcgdb );_ggfgb |=bm2 .Data [_edg +_edbd -1]<<uint (8-_fcgdb );
|
|
_babd =_fgdad &_ggfgb ;_gaf +=tab [_babd ];};if _gaf >=_dbge {return true ,nil ;}else if _gaf +downcount [_dcbf ]-_egfc < _dbge {return false ,nil ;};};case _deag < _acge :for _dcbf =_babg ;_dcbf < _dcccc ;_dcbf ,_deaf ,_edg =_dcbf +1,_deaf +bm1 .RowStride ,_edg +bm2 .RowStride {for _edbd =0;
|
|
_edbd < _deag ;_edbd ++{_fgdad =bm1 .Data [_deaf +_edbd ];_ggfgb =bm2 .Data [_edg +_edbd ]<<uint (-_fcgdb );_ggfgb |=bm2 .Data [_edg +_edbd +1]>>uint (8+_fcgdb );_babd =_fgdad &_ggfgb ;_gaf +=tab [_babd ];};if _gaf >=_dbge {return true ,nil ;}else if _eef :=_gaf +downcount [_dcbf ]-_egfc ;
|
|
_eef < _dbge {return false ,nil ;};};case _acge >=_deag :for _dcbf =_babg ;_dcbf < _dcccc ;_dcbf ,_deaf ,_edg =_dcbf +1,_deaf +bm1 .RowStride ,_edg +bm2 .RowStride {for _edbd =0;_edbd < _deag ;_edbd ++{_fgdad =bm1 .Data [_deaf +_edbd ];_ggfgb =bm2 .Data [_edg +_edbd ]<<uint (-_fcgdb );
|
|
_ggfgb |=bm2 .Data [_edg +_edbd +1]>>uint (8+_fcgdb );_babd =_fgdad &_ggfgb ;_gaf +=tab [_babd ];};_fgdad =bm1 .Data [_deaf +_edbd ];_ggfgb =bm2 .Data [_edg +_edbd ]<<uint (-_fcgdb );_babd =_fgdad &_ggfgb ;_gaf +=tab [_babd ];if _gaf >=_dbge {return true ,nil ;
|
|
}else if _gaf +downcount [_dcbf ]-_egfc < _dbge {return false ,nil ;};};};_debe :=float32 (_gaf )*float32 (_gaf )/(float32 (area1 )*float32 (area2 ));if _debe >=scoreThreshold {_dd .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",_gaf ,_dbge ,_debe ,scoreThreshold );
|
|
};return false ,nil ;};func (_bbf *Bitmap )Equals (s *Bitmap )bool {if len (_bbf .Data )!=len (s .Data )||_bbf .Width !=s .Width ||_bbf .Height !=s .Height {return false ;};for _ddad :=0;_ddad < _bbf .Height ;_ddad ++{_ddfd :=_ddad *_bbf .RowStride ;for _cad :=0;
|
|
_cad < _bbf .RowStride ;_cad ++{if _bbf .Data [_ddfd +_cad ]!=s .Data [_ddfd +_cad ]{return false ;};};};return true ;};type Boxes []*_ab .Rectangle ;var _ _c .Interface =&ClassedPoints {};func (_bdd *Bitmap )CountPixels ()int {return _bdd .countPixels ()};
|
|
func _dfadd (_gged ,_bcfd *Bitmap ,_gdbc ,_cegc int )(*Bitmap ,error ){const _aggb ="d\u0069\u006c\u0061\u0074\u0065\u0042\u0072\u0069\u0063\u006b";if _bcfd ==nil {_dd .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 ,_f .Error (_aggb ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};if _gdbc < 1||_cegc < 1{return nil ,_f .Error (_aggb ,"\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 _gdbc ==1&&_cegc ==1{_affbg ,_edfe :=_gcff (_gged ,_bcfd );if _edfe !=nil {return nil ,_f .Wrap (_edfe ,_aggb ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u0026\u0026 \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _affbg ,nil ;};if _gdbc ==1||_cegc ==1{_ggdf :=SelCreateBrick (_cegc ,_gdbc ,_cegc /2,_gdbc /2,SelHit );_gdabg ,_dgcf :=_fdff (_gged ,_bcfd ,_ggdf );if _dgcf !=nil {return nil ,_f .Wrap (_dgcf ,_aggb ,"\u0068s\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _gdabg ,nil ;};_eecd :=SelCreateBrick (1,_gdbc ,0,_gdbc /2,SelHit );_abca :=SelCreateBrick (_cegc ,1,_cegc /2,0,SelHit );_aced ,_ddfe :=_fdff (nil ,_bcfd ,_eecd );if _ddfe !=nil {return nil ,_f .Wrap (_ddfe ,_aggb ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
};_gged ,_ddfe =_fdff (_gged ,_aced ,_abca );if _ddfe !=nil {return nil ,_f .Wrap (_ddfe ,_aggb ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};return _gged ,nil ;};func (_affb *Bitmap )equivalent (_cddd *Bitmap )bool {if _affb ==_cddd {return true ;
|
|
};if !_affb .SizesEqual (_cddd ){return false ;};_dcab :=_cbdb (_affb ,_cddd ,CmbOpXor );_geda :=_affb .countPixels ();_fabe :=int (0.25*float32 (_geda ));if _dcab .thresholdPixelSum (_fabe ){return false ;};var (_eega [9][9]int ;_bfc [18][9]int ;_bbee [9][18]int ;
|
|
_bbbg int ;_aaaa int ;);_cecg :=9;_fcca :=_affb .Height /_cecg ;_abdg :=_affb .Width /_cecg ;_cae ,_bac :=_fcca /2,_abdg /2;if _fcca < _abdg {_cae =_abdg /2;_bac =_fcca /2;};_geee :=float64 (_cae )*float64 (_bac )*_e .Pi ;_cfae :=int (float64 (_fcca *_abdg /2)*0.9);
|
|
_ege :=int (float64 (_abdg *_fcca /2)*0.9);for _gbe :=0;_gbe < _cecg ;_gbe ++{_deba :=_abdg *_gbe +_bbbg ;var _abf int ;if _gbe ==_cecg -1{_bbbg =0;_abf =_affb .Width ;}else {_abf =_deba +_abdg ;if ((_affb .Width -_bbbg )%_cecg )> 0{_bbbg ++;_abf ++;};
|
|
};for _gdf :=0;_gdf < _cecg ;_gdf ++{_gaaa :=_fcca *_gdf +_aaaa ;var _cabc int ;if _gdf ==_cecg -1{_aaaa =0;_cabc =_affb .Height ;}else {_cabc =_gaaa +_fcca ;if (_affb .Height -_aaaa )%_cecg > 0{_aaaa ++;_cabc ++;};};var _dbe ,_dbab ,_edff ,_dcdf int ;
|
|
_dee :=(_deba +_abf )/2;_gde :=(_gaaa +_cabc )/2;for _cbda :=_deba ;_cbda < _abf ;_cbda ++{for _aeadb :=_gaaa ;_aeadb < _cabc ;_aeadb ++{if _dcab .GetPixel (_cbda ,_aeadb ){if _cbda < _dee {_dbe ++;}else {_dbab ++;};if _aeadb < _gde {_dcdf ++;}else {_edff ++;
|
|
};};};};_eega [_gbe ][_gdf ]=_dbe +_dbab ;_bfc [_gbe *2][_gdf ]=_dbe ;_bfc [_gbe *2+1][_gdf ]=_dbab ;_bbee [_gbe ][_gdf *2]=_dcdf ;_bbee [_gbe ][_gdf *2+1]=_edff ;};};for _cgd :=0;_cgd < _cecg *2-1;_cgd ++{for _afg :=0;_afg < (_cecg -1);_afg ++{var _gdg int ;
|
|
for _eea :=0;_eea < 2;_eea ++{for _bdf :=0;_bdf < 2;_bdf ++{_gdg +=_bfc [_cgd +_eea ][_afg +_bdf ];};};if _gdg > _ege {return false ;};};};for _ece :=0;_ece < (_cecg -1);_ece ++{for _bfb :=0;_bfb < ((_cecg *2)-1);_bfb ++{var _fgb int ;for _gcaa :=0;_gcaa < 2;
|
|
_gcaa ++{for _ebfd :=0;_ebfd < 2;_ebfd ++{_fgb +=_bbee [_ece +_gcaa ][_bfb +_ebfd ];};};if _fgb > _cfae {return false ;};};};for _ade :=0;_ade < (_cecg -2);_ade ++{for _ceba :=0;_ceba < (_cecg -2);_ceba ++{var _fcgd ,_fcge int ;for _abaf :=0;_abaf < 3;
|
|
_abaf ++{for _ffd :=0;_ffd < 3;_ffd ++{if _abaf ==_ffd {_fcgd +=_eega [_ade +_abaf ][_ceba +_ffd ];};if (2-_abaf )==_ffd {_fcge +=_eega [_ade +_abaf ][_ceba +_ffd ];};};};if _fcgd > _ege ||_fcge > _ege {return false ;};};};for _aeg :=0;_aeg < (_cecg -1);
|
|
_aeg ++{for _ebae :=0;_ebae < (_cecg -1);_ebae ++{var _fdf int ;for _bccd :=0;_bccd < 2;_bccd ++{for _ffed :=0;_ffed < 2;_ffed ++{_fdf +=_eega [_aeg +_bccd ][_ebae +_ffed ];};};if float64 (_fdf )> _geee {return false ;};};};return true ;};func (_abbd *Bitmap )ClipRectangle (box *_ab .Rectangle )(_gcf *Bitmap ,_ceb *_ab .Rectangle ,_bad error ){const _gcc ="\u0043\u006c\u0069\u0070\u0052\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065";
|
|
if box ==nil {return nil ,nil ,_f .Error (_gcc ,"\u0062o\u0078 \u0069\u0073\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};_ddf ,_debd :=_abbd .Width ,_abbd .Height ;_bbe :=_ab .Rect (0,0,_ddf ,_debd );if !box .Overlaps (_bbe ){return nil ,nil ,_f .Error (_gcc ,"b\u006f\u0078\u0020\u0064oe\u0073n\u0027\u0074\u0020\u006f\u0076e\u0072\u006c\u0061\u0070\u0020\u0062");
|
|
};_aff :=box .Intersect (_bbe );_fddc ,_cdb :=_aff .Min .X ,_aff .Min .Y ;_fgd ,_dfa :=_aff .Dx (),_aff .Dy ();_gcf =New (_fgd ,_dfa );_gcf .Text =_abbd .Text ;if _bad =_gcf .RasterOperation (0,0,_fgd ,_dfa ,PixSrc ,_abbd ,_fddc ,_cdb );_bad !=nil {return nil ,nil ,_f .Wrap (_bad ,_gcc ,"\u0050\u0069\u0078\u0053\u0072\u0063\u0020\u0074\u006f\u0020\u0063\u006ci\u0070\u0070\u0065\u0064");
|
|
};_ceb =&_aff ;return _gcf ,_ceb ,nil ;};func _cce (_dc ,_de *Bitmap )(_df error ){const _cfg ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0038";_caa :=_de .RowStride ;_ggf :=_dc .RowStride ;var _facf ,_da ,_cg ,_agf ,_aa int ;
|
|
for _cg =0;_cg < _de .Height ;_cg ++{_facf =_cg *_caa ;_da =8*_cg *_ggf ;for _agf =0;_agf < _caa ;_agf ++{if _df =_dc .setEightBytes (_da +_agf *8,_faae [_de .Data [_facf +_agf ]]);_df !=nil {return _f .Wrap (_df ,_cfg ,"");};};for _aa =1;_aa < 8;_aa ++{for _agf =0;
|
|
_agf < _ggf ;_agf ++{if _df =_dc .SetByte (_da +_aa *_ggf +_agf ,_dc .Data [_da +_agf ]);_df !=nil {return _f .Wrap (_df ,_cfg ,"");};};};};return nil ;};const (Vanilla Color =iota ;Chocolate ;);func _agad (_gbdf ,_bcd *Bitmap ,_gefa ,_fcagb int )(*Bitmap ,error ){const _acca ="\u0065\u0072\u006f\u0064\u0065\u0042\u0072\u0069\u0063\u006b";
|
|
if _bcd ==nil {return nil ,_f .Error (_acca ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _gefa < 1||_fcagb < 1{return nil ,_f .Error (_acca ,"\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 _gefa ==1&&_fcagb ==1{_eeaa ,_fccag :=_gcff (_gbdf ,_bcd );if _fccag !=nil {return nil ,_f .Wrap (_fccag ,_acca ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u0026\u0026 \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _eeaa ,nil ;};if _gefa ==1||_fcagb ==1{_gaeac :=SelCreateBrick (_fcagb ,_gefa ,_fcagb /2,_gefa /2,SelHit );_gfg ,_egbf :=_cdcf (_gbdf ,_bcd ,_gaeac );if _egbf !=nil {return nil ,_f .Wrap (_egbf ,_acca ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _gfg ,nil ;};_bbdg :=SelCreateBrick (1,_gefa ,0,_gefa /2,SelHit );_ddaad :=SelCreateBrick (_fcagb ,1,_fcagb /2,0,SelHit );_cccb ,_fdag :=_cdcf (nil ,_bcd ,_bbdg );if _fdag !=nil {return nil ,_f .Wrap (_fdag ,_acca ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");
|
|
};_gbdf ,_fdag =_cdcf (_gbdf ,_cccb ,_ddaad );if _fdag !=nil {return nil ,_f .Wrap (_fdag ,_acca ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};return _gbdf ,nil ;};func (_dgdd Points )GetIntX (i int )(int ,error ){if i >=len (_dgdd ){return 0,_f .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 (_dgdd [i ].X ),nil ;};func _cee (_bdgg ,_fad *Bitmap ,_ecc int ,_gc []byte ,_ebgg int )(_gca error ){const _fab ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0033";
|
|
var (_fcb ,_fea ,_edf ,_bag ,_fgce ,_gfd ,_ebc ,_dab int ;_gcg ,_fgfe ,_gec ,_cafd uint32 ;_acc ,_cbg byte ;_dgf uint16 ;);_aba :=make ([]byte ,4);_fee :=make ([]byte ,4);for _edf =0;_edf < _bdgg .Height -1;_edf ,_bag =_edf +2,_bag +1{_fcb =_edf *_bdgg .RowStride ;
|
|
_fea =_bag *_fad .RowStride ;for _fgce ,_gfd =0,0;_fgce < _ebgg ;_fgce ,_gfd =_fgce +4,_gfd +1{for _ebc =0;_ebc < 4;_ebc ++{_dab =_fcb +_fgce +_ebc ;if _dab <=len (_bdgg .Data )-1&&_dab < _fcb +_bdgg .RowStride {_aba [_ebc ]=_bdgg .Data [_dab ];}else {_aba [_ebc ]=0x00;
|
|
};_dab =_fcb +_bdgg .RowStride +_fgce +_ebc ;if _dab <=len (_bdgg .Data )-1&&_dab < _fcb +(2*_bdgg .RowStride ){_fee [_ebc ]=_bdgg .Data [_dab ];}else {_fee [_ebc ]=0x00;};};_gcg =_ea .BigEndian .Uint32 (_aba );_fgfe =_ea .BigEndian .Uint32 (_fee );_gec =_gcg &_fgfe ;
|
|
_gec |=_gec <<1;_cafd =_gcg |_fgfe ;_cafd &=_cafd <<1;_fgfe =_gec &_cafd ;_fgfe &=0xaaaaaaaa;_gcg =_fgfe |(_fgfe <<7);_acc =byte (_gcg >>24);_cbg =byte ((_gcg >>8)&0xff);_dab =_fea +_gfd ;if _dab +1==len (_fad .Data )-1||_dab +1>=_fea +_fad .RowStride {if _gca =_fad .SetByte (_dab ,_gc [_acc ]);
|
|
_gca !=nil {return _f .Wrapf (_gca ,_fab ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_dab );};}else {_dgf =(uint16 (_gc [_acc ])<<8)|uint16 (_gc [_cbg ]);if _gca =_fad .setTwoBytes (_dab ,_dgf );_gca !=nil {return _f .Wrapf (_gca ,_fab ,"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",_dab );
|
|
};_gfd ++;};};};return nil ;};func _ebab (_cca ,_cda *Bitmap ,_afe int ,_fgf []byte ,_fd int )(_cac error ){const _gee ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0031";var (_gaea ,_efa ,_bfdg ,_gbd ,_ccb ,_aae ,_ebg ,_fce int ;
|
|
_bab ,_deb uint32 ;_fgc ,_fgg byte ;_aea uint16 ;);_fde :=make ([]byte ,4);_gfb :=make ([]byte ,4);for _bfdg =0;_bfdg < _cca .Height -1;_bfdg ,_gbd =_bfdg +2,_gbd +1{_gaea =_bfdg *_cca .RowStride ;_efa =_gbd *_cda .RowStride ;for _ccb ,_aae =0,0;_ccb < _fd ;
|
|
_ccb ,_aae =_ccb +4,_aae +1{for _ebg =0;_ebg < 4;_ebg ++{_fce =_gaea +_ccb +_ebg ;if _fce <=len (_cca .Data )-1&&_fce < _gaea +_cca .RowStride {_fde [_ebg ]=_cca .Data [_fce ];}else {_fde [_ebg ]=0x00;};_fce =_gaea +_cca .RowStride +_ccb +_ebg ;if _fce <=len (_cca .Data )-1&&_fce < _gaea +(2*_cca .RowStride ){_gfb [_ebg ]=_cca .Data [_fce ];
|
|
}else {_gfb [_ebg ]=0x00;};};_bab =_ea .BigEndian .Uint32 (_fde );_deb =_ea .BigEndian .Uint32 (_gfb );_deb |=_bab ;_deb |=_deb <<1;_deb &=0xaaaaaaaa;_bab =_deb |(_deb <<7);_fgc =byte (_bab >>24);_fgg =byte ((_bab >>8)&0xff);_fce =_efa +_aae ;if _fce +1==len (_cda .Data )-1||_fce +1>=_efa +_cda .RowStride {_cda .Data [_fce ]=_fgf [_fgc ];
|
|
}else {_aea =(uint16 (_fgf [_fgc ])<<8)|uint16 (_fgf [_fgg ]);if _cac =_cda .setTwoBytes (_fce ,_aea );_cac !=nil {return _f .Wrapf (_cac ,_gee ,"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",_fce );
|
|
};_aae ++;};};};return nil ;};func init (){for _facc :=0;_facc < 256;_facc ++{_dabe [_facc ]=uint8 (_facc &0x1)+(uint8 (_facc >>1)&0x1)+(uint8 (_facc >>2)&0x1)+(uint8 (_facc >>3)&0x1)+(uint8 (_facc >>4)&0x1)+(uint8 (_facc >>5)&0x1)+(uint8 (_facc >>6)&0x1)+(uint8 (_facc >>7)&0x1);
|
|
};};func (_cgg *Bitmap )GetVanillaData ()[]byte {if _cgg .Color ==Chocolate {_cgg .inverseData ();};return _cgg .Data ;};func (_fba *Bitmap )RemoveBorder (borderSize int )(*Bitmap ,error ){if borderSize ==0{return _fba .Copy (),nil ;};_dcac ,_cdc :=_fba .removeBorderGeneral (borderSize ,borderSize ,borderSize ,borderSize );
|
|
if _cdc !=nil {return nil ,_f .Wrap (_cdc ,"\u0052\u0065\u006do\u0076\u0065\u0042\u006f\u0072\u0064\u0065\u0072","");};return _dcac ,nil ;};func (_cbgg *Bitmap )AddBorder (borderSize ,val int )(*Bitmap ,error ){if borderSize ==0{return _cbgg .Copy (),nil ;
|
|
};_cgb ,_gcd :=_cbgg .addBorderGeneral (borderSize ,borderSize ,borderSize ,borderSize ,val );if _gcd !=nil {return nil ,_f .Wrap (_gcd ,"\u0041d\u0064\u0042\u006f\u0072\u0064\u0065r","");};return _cgb ,nil ;};type Point struct{X ,Y float32 ;};func _bg (_ced ,_fa *Bitmap )(_ad error ){const _cb ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0032";
|
|
_cd :=_fa .RowStride ;_gdb :=_ced .RowStride ;var (_ed byte ;_dga uint16 ;_gg ,_ag ,_eg ,_cc ,_be int ;);for _eg =0;_eg < _fa .Height ;_eg ++{_gg =_eg *_cd ;_ag =2*_eg *_gdb ;for _cc =0;_cc < _cd ;_cc ++{_ed =_fa .Data [_gg +_cc ];_dga =_feab [_ed ];_be =_ag +_cc *2;
|
|
if _ced .RowStride !=_fa .RowStride *2&&(_cc +1)*2> _ced .RowStride {_ad =_ced .SetByte (_be ,byte (_dga >>8));}else {_ad =_ced .setTwoBytes (_be ,_dga );};if _ad !=nil {return _f .Wrap (_ad ,_cb ,"");};};for _cc =0;_cc < _gdb ;_cc ++{_be =_ag +_gdb +_cc ;
|
|
_ed =_ced .Data [_ag +_cc ];if _ad =_ced .SetByte (_be ,_ed );_ad !=nil {return _f .Wrapf (_ad ,_cb ,"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",_ag +_cc ,_ag +_gdb +_cc );
|
|
};};};return nil ;};func (_bddf *Bitmap )countPixels ()int {var (_baac int ;_aga uint8 ;_bbba byte ;_cgbb int ;);_bdcd :=_bddf .RowStride ;_fgee :=uint (_bddf .Width &0x07);if _fgee !=0{_aga =uint8 ((0xff<<(8-_fgee ))&0xff);_bdcd --;};for _dcd :=0;_dcd < _bddf .Height ;
|
|
_dcd ++{for _cgbb =0;_cgbb < _bdcd ;_cgbb ++{_bbba =_bddf .Data [_dcd *_bddf .RowStride +_cgbb ];_baac +=int (_dabe [_bbba ]);};if _fgee !=0{_baac +=int (_dabe [_bddf .Data [_dcd *_bddf .RowStride +_cgbb ]&_aga ]);};};return _baac ;};func (_abcd *Bitmap )GetByte (index int )(byte ,error ){if index > len (_abcd .Data )-1||index < 0{return 0,_f .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 _abcd .Data [index ],nil ;};func TstISymbol (t *_g .T ,scale ...int )*Bitmap {_dbedb ,_faafc :=NewWithData (1,5,[]byte {0x80,0x80,0x80,0x80,0x80});_d .NoError (t ,_faafc );return TstGetScaledSymbol (t ,_dbedb ,scale ...);};func (_ffdd *Bitmaps )SortByHeight (){_egced :=(*byHeight )(_ffdd );
|
|
_c .Sort (_egced )};const (MopDilation MorphOperation =iota ;MopErosion ;MopOpening ;MopClosing ;MopRankBinaryReduction ;MopReplicativeBinaryExpansion ;MopAddBorder ;);func (_aeb *Bitmap )And (s *Bitmap )(_bfa *Bitmap ,_fbc error ){const _bed ="\u0042\u0069\u0074\u006d\u0061\u0070\u002e\u0041\u006e\u0064";
|
|
if _aeb ==nil {return nil ,_f .Error (_bed ,"\u0027b\u0069t\u006d\u0061\u0070\u0020\u0027b\u0027\u0020i\u0073\u0020\u006e\u0069\u006c");};if s ==nil {return nil ,_f .Error (_bed ,"\u0062\u0069\u0074\u006d\u0061\u0070\u0020\u0027\u0073\u0027\u0020\u0069s\u0020\u006e\u0069\u006c");
|
|
};if !_aeb .SizesEqual (s ){_dd .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",_bed );
|
|
};if _bfa ,_fbc =_gcff (_bfa ,_aeb );_fbc !=nil {return nil ,_f .Wrap (_fbc ,_bed ,"\u0063\u0061\u006e't\u0020\u0063\u0072\u0065\u0061\u0074\u0065\u0020\u0027\u0064\u0027\u0020\u0062\u0069\u0074\u006d\u0061\u0070");};if _fbc =_bfa .RasterOperation (0,0,_bfa .Width ,_bfa .Height ,PixSrcAndDst ,s ,0,0);
|
|
_fbc !=nil {return nil ,_f .Wrap (_fbc ,_bed ,"");};return _bfa ,nil ;};func (_bbfcg Points )XSorter ()func (_gedb ,_ggbad int )bool {return func (_dccd ,_ecb int )bool {return _bbfcg [_dccd ].X < _bbfcg [_ecb ].X };};func _ccd ()(_ebf [256]uint16 ){for _eba :=0;
|
|
_eba < 256;_eba ++{if _eba &0x01!=0{_ebf [_eba ]|=0x3;};if _eba &0x02!=0{_ebf [_eba ]|=0xc;};if _eba &0x04!=0{_ebf [_eba ]|=0x30;};if _eba &0x08!=0{_ebf [_eba ]|=0xc0;};if _eba &0x10!=0{_ebf [_eba ]|=0x300;};if _eba &0x20!=0{_ebf [_eba ]|=0xc00;};if _eba &0x40!=0{_ebf [_eba ]|=0x3000;
|
|
};if _eba &0x80!=0{_ebf [_eba ]|=0xc000;};};return _ebf ;};const (_ LocationFilter =iota ;LocSelectWidth ;LocSelectHeight ;LocSelectXVal ;LocSelectYVal ;LocSelectIfEither ;LocSelectIfBoth ;);func _bfcdc (_cgba *Bitmap ,_febb ...MorphProcess )(_eeggg *Bitmap ,_bgae error ){const _eccab ="\u006d\u006f\u0072\u0070\u0068\u0053\u0065\u0071\u0075\u0065\u006e\u0063\u0065";
|
|
if _cgba ==nil {return nil ,_f .Error (_eccab ,"\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 (_febb )==0{return nil ,_f .Error (_eccab ,"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 _bgae =_bgbb (_febb ...);
|
|
_bgae !=nil {return nil ,_f .Wrap (_bgae ,_eccab ,"");};var _ggg ,_eddg ,_aggbg int ;_eeggg =_cgba .Copy ();for _ ,_babe :=range _febb {switch _babe .Operation {case MopDilation :_ggg ,_eddg =_babe .getWidthHeight ();_eeggg ,_bgae =DilateBrick (nil ,_eeggg ,_ggg ,_eddg );
|
|
if _bgae !=nil {return nil ,_f .Wrap (_bgae ,_eccab ,"");};case MopErosion :_ggg ,_eddg =_babe .getWidthHeight ();_eeggg ,_bgae =_agad (nil ,_eeggg ,_ggg ,_eddg );if _bgae !=nil {return nil ,_f .Wrap (_bgae ,_eccab ,"");};case MopOpening :_ggg ,_eddg =_babe .getWidthHeight ();
|
|
_eeggg ,_bgae =_dggeg (nil ,_eeggg ,_ggg ,_eddg );if _bgae !=nil {return nil ,_f .Wrap (_bgae ,_eccab ,"");};case MopClosing :_ggg ,_eddg =_babe .getWidthHeight ();_eeggg ,_bgae =_gaaab (nil ,_eeggg ,_ggg ,_eddg );if _bgae !=nil {return nil ,_f .Wrap (_bgae ,_eccab ,"");
|
|
};case MopRankBinaryReduction :_eeggg ,_bgae =_bdgf (_eeggg ,_babe .Arguments ...);if _bgae !=nil {return nil ,_f .Wrap (_bgae ,_eccab ,"");};case MopReplicativeBinaryExpansion :_eeggg ,_bgae =_ffde (_eeggg ,_babe .Arguments [0]);if _bgae !=nil {return nil ,_f .Wrap (_bgae ,_eccab ,"");
|
|
};case MopAddBorder :_aggbg =_babe .Arguments [0];_eeggg ,_bgae =_eeggg .AddBorder (_aggbg ,0);if _bgae !=nil {return nil ,_f .Wrap (_bgae ,_eccab ,"");};default:return nil ,_f .Error (_eccab ,"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 _aggbg > 0{_eeggg ,_bgae =_eeggg .RemoveBorder (_aggbg );if _bgae !=nil {return nil ,_f .Wrap (_bgae ,_eccab ,"\u0062\u006f\u0072\u0064\u0065\u0072\u0020\u003e\u0020\u0030");};};return _eeggg ,nil ;};type MorphProcess struct{Operation MorphOperation ;
|
|
Arguments []int ;};func (_acff *Bitmap )nextOnPixel (_ddc ,_bgdf int )(_efb _ab .Point ,_fdea bool ,_cbab error ){const _cdde ="n\u0065\u0078\u0074\u004f\u006e\u0050\u0069\u0078\u0065\u006c";_efb ,_fdea ,_cbab =_acff .nextOnPixelLow (_acff .Width ,_acff .Height ,_acff .RowStride ,_ddc ,_bgdf );
|
|
if _cbab !=nil {return _efb ,false ,_f .Wrap (_cbab ,_cdde ,"");};return _efb ,_fdea ,nil ;};func (_ead *Bitmap )clipRectangle (_acf ,_dabb *_ab .Rectangle )(_fcfb *Bitmap ,_abdf error ){const _dggf ="\u0063\u006c\u0069\u0070\u0052\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065";
|
|
if _acf ==nil {return nil ,_f .Error (_dggf ,"\u0070r\u006fv\u0069\u0064\u0065\u0064\u0020n\u0069\u006c \u0027\u0062\u006f\u0078\u0027");};_efd ,_ebe :=_ead .Width ,_ead .Height ;_gccb ,_abdf :=ClipBoxToRectangle (_acf ,_efd ,_ebe );if _abdf !=nil {_dd .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",_abdf );
|
|
return nil ,nil ;};_dff ,_dge :=_gccb .Min .X ,_gccb .Min .Y ;_gfa ,_gcb :=_gccb .Max .X -_gccb .Min .X ,_gccb .Max .Y -_gccb .Min .Y ;_fcfb =New (_gfa ,_gcb );_fcfb .Text =_ead .Text ;if _abdf =_fcfb .RasterOperation (0,0,_gfa ,_gcb ,PixSrc ,_ead ,_dff ,_dge );
|
|
_abdf !=nil {return nil ,_f .Wrap (_abdf ,_dggf ,"");};if _dabb !=nil {*_dabb =*_gccb ;};return _fcfb ,nil ;};func Blit (src *Bitmap ,dst *Bitmap ,x ,y int ,op CombinationOperator )error {var _ede ,_ecec int ;_abg :=src .RowStride -1;if x < 0{_ecec =-x ;
|
|
x =0;}else if x +src .Width > dst .Width {_abg -=src .Width +x -dst .Width ;};if y < 0{_ede =-y ;y =0;_ecec +=src .RowStride ;_abg +=src .RowStride ;}else if y +src .Height > dst .Height {_ede =src .Height +y -dst .Height ;};var (_cdbb int ;_debae error ;
|
|
);_geb :=x &0x07;_efgc :=8-_geb ;_abe :=src .Width &0x07;_edc :=_efgc -_abe ;_fbgc :=_efgc &0x07!=0;_cfacc :=src .Width <=((_abg -_ecec )<<3)+_efgc ;_gdgf :=dst .GetByteIndex (x ,y );_fgag :=_ede +dst .Height ;if src .Height > _fgag {_cdbb =_fgag ;}else {_cdbb =src .Height ;
|
|
};switch {case !_fbgc :_debae =_fcad (src ,dst ,_ede ,_cdbb ,_gdgf ,_ecec ,_abg ,op );case _cfacc :_debae =_cdae (src ,dst ,_ede ,_cdbb ,_gdgf ,_ecec ,_abg ,_edc ,_geb ,_efgc ,op );default:_debae =_fdead (src ,dst ,_ede ,_cdbb ,_gdgf ,_ecec ,_abg ,_edc ,_geb ,_efgc ,op ,_abe );
|
|
};return _debae ;};func _fgcgd (_fcbb ,_ebdc *Bitmap ,_ecff *Selection )(*Bitmap ,error ){const _eceb ="\u006f\u0070\u0065\u006e";var _abfc error ;_fcbb ,_abfc =_dffb (_fcbb ,_ebdc ,_ecff );if _abfc !=nil {return nil ,_f .Wrap (_abfc ,_eceb ,"");};_bbfc ,_abfc :=_cdcf (nil ,_ebdc ,_ecff );
|
|
if _abfc !=nil {return nil ,_f .Wrap (_abfc ,_eceb ,"");};_ ,_abfc =_fdff (_fcbb ,_bbfc ,_ecff );if _abfc !=nil {return nil ,_f .Wrap (_abfc ,_eceb ,"");};return _fcbb ,nil ;};type Bitmaps struct{Values []*Bitmap ;Boxes []*_ab .Rectangle ;};func Extract (roi _ab .Rectangle ,src *Bitmap )(*Bitmap ,error ){_eafc :=New (roi .Dx (),roi .Dy ());
|
|
_baab :=roi .Min .X &0x07;_aeba :=8-_baab ;_cffa :=uint (8-_eafc .Width &0x07);_eafb :=src .GetByteIndex (roi .Min .X ,roi .Min .Y );_debf :=src .GetByteIndex (roi .Max .X -1,roi .Min .Y );_fgfd :=_eafc .RowStride ==_debf +1-_eafb ;var _fdfa int ;for _ecad :=roi .Min .Y ;
|
|
_ecad < roi .Max .Y ;_ecad ++{_fegdg :=_eafb ;_eeab :=_fdfa ;switch {case _eafb ==_debf :_bbca ,_dbdf :=src .GetByte (_fegdg );if _dbdf !=nil {return nil ,_dbdf ;};_bbca <<=uint (_baab );_dbdf =_eafc .SetByte (_eeab ,_eade (_cffa ,_bbca ));if _dbdf !=nil {return nil ,_dbdf ;
|
|
};case _baab ==0:for _cbba :=_eafb ;_cbba <=_debf ;_cbba ++{_gcad ,_debdd :=src .GetByte (_fegdg );if _debdd !=nil {return nil ,_debdd ;};_fegdg ++;if _cbba ==_debf &&_fgfd {_gcad =_eade (_cffa ,_gcad );};_debdd =_eafc .SetByte (_eeab ,_gcad );if _debdd !=nil {return nil ,_debdd ;
|
|
};_eeab ++;};default:_edcd :=_eeaf (src ,_eafc ,uint (_baab ),uint (_aeba ),_cffa ,_eafb ,_debf ,_fgfd ,_fegdg ,_eeab );if _edcd !=nil {return nil ,_edcd ;};};_eafb +=src .RowStride ;_debf +=src .RowStride ;_fdfa +=_eafc .RowStride ;};return _eafc ,nil ;
|
|
};func _bd (_faa *Bitmap ,_ggb ,_dca int )(*Bitmap ,error ){const _faf ="e\u0078\u0070\u0061\u006edB\u0069n\u0061\u0072\u0079\u0052\u0065p\u006c\u0069\u0063\u0061\u0074\u0065";if _faa ==nil {return nil ,_f .Error (_faf ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if _ggb <=0||_dca <=0{return nil ,_f .Error (_faf ,"\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 _ggb ==_dca {if _ggb ==1{_add ,_bdg :=_gcff (nil ,_faa );
|
|
if _bdg !=nil {return nil ,_f .Wrap (_bdg ,_faf ,"\u0078\u0046\u0061\u0063\u0074\u0020\u003d\u003d\u0020y\u0046\u0061\u0063\u0074");};return _add ,nil ;};if _ggb ==2||_ggb ==4||_ggb ==8{_gac ,_bb :=_eaa (_faa ,_ggb );if _bb !=nil {return nil ,_f .Wrap (_bb ,_faf ,"\u0078\u0046a\u0063\u0074\u0020i\u006e\u0020\u007b\u0032\u002c\u0034\u002c\u0038\u007d");
|
|
};return _gac ,nil ;};};_edd :=_ggb *_faa .Width ;_bcf :=_dca *_faa .Height ;_bbb :=New (_edd ,_bcf );_bef :=_bbb .RowStride ;var (_cbd ,_daf ,_cba ,_af ,_gb int ;_aad byte ;_fb error ;);for _daf =0;_daf < _faa .Height ;_daf ++{_cbd =_dca *_daf *_bef ;
|
|
for _cba =0;_cba < _faa .Width ;_cba ++{if _dcb :=_faa .GetPixel (_cba ,_daf );_dcb {_gb =_ggb *_cba ;for _af =0;_af < _ggb ;_af ++{_bbb .setBit (_cbd *8+_gb +_af );};};};for _af =1;_af < _dca ;_af ++{_agfa :=_cbd +_af *_bef ;for _ef :=0;_ef < _bef ;_ef ++{if _aad ,_fb =_bbb .GetByte (_cbd +_ef );
|
|
_fb !=nil {return nil ,_f .Wrapf (_fb ,_faf ,"\u0072\u0065\u0070\u006cic\u0061\u0074\u0069\u006e\u0067\u0020\u006c\u0069\u006e\u0065\u003a\u0020\u0027\u0025d\u0027",_af );};if _fb =_bbb .SetByte (_agfa +_ef ,_aad );_fb !=nil {return nil ,_f .Wrap (_fb ,_faf ,"\u0053\u0065\u0074\u0074in\u0067\u0020\u0062\u0079\u0074\u0065\u0020\u0066\u0061\u0069\u006c\u0065\u0064");
|
|
};};};};return _bbb ,nil ;};func (_bcb *BitmapsArray )AddBitmaps (bm *Bitmaps ){_bcb .Values =append (_bcb .Values ,bm )};func (_aagg *Boxes )makeSizeIndicator (_cdbg ,_dabc int ,_abdd LocationFilter ,_efcc SizeComparison )*_dg .NumSlice {_fgbg :=&_dg .NumSlice {};
|
|
var _aaae ,_gagd ,_fcgeb int ;for _ ,_eaba :=range *_aagg {_aaae =0;_gagd ,_fcgeb =_eaba .Dx (),_eaba .Dy ();switch _abdd {case LocSelectWidth :if (_efcc ==SizeSelectIfLT &&_gagd < _cdbg )||(_efcc ==SizeSelectIfGT &&_gagd > _cdbg )||(_efcc ==SizeSelectIfLTE &&_gagd <=_cdbg )||(_efcc ==SizeSelectIfGTE &&_gagd >=_cdbg ){_aaae =1;
|
|
};case LocSelectHeight :if (_efcc ==SizeSelectIfLT &&_fcgeb < _dabc )||(_efcc ==SizeSelectIfGT &&_fcgeb > _dabc )||(_efcc ==SizeSelectIfLTE &&_fcgeb <=_dabc )||(_efcc ==SizeSelectIfGTE &&_fcgeb >=_dabc ){_aaae =1;};case LocSelectIfEither :if (_efcc ==SizeSelectIfLT &&(_fcgeb < _dabc ||_gagd < _cdbg ))||(_efcc ==SizeSelectIfGT &&(_fcgeb > _dabc ||_gagd > _cdbg ))||(_efcc ==SizeSelectIfLTE &&(_fcgeb <=_dabc ||_gagd <=_cdbg ))||(_efcc ==SizeSelectIfGTE &&(_fcgeb >=_dabc ||_gagd >=_cdbg )){_aaae =1;
|
|
};case LocSelectIfBoth :if (_efcc ==SizeSelectIfLT &&(_fcgeb < _dabc &&_gagd < _cdbg ))||(_efcc ==SizeSelectIfGT &&(_fcgeb > _dabc &&_gagd > _cdbg ))||(_efcc ==SizeSelectIfLTE &&(_fcgeb <=_dabc &&_gagd <=_cdbg ))||(_efcc ==SizeSelectIfGTE &&(_fcgeb >=_dabc &&_gagd >=_cdbg )){_aaae =1;
|
|
};};_fgbg .AddInt (_aaae );};return _fgbg ;};func _fge (_fbg ,_dbc *Bitmap ,_cfc int ,_eag []byte ,_gaa int )(_egcg error ){const _eeg ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0032";
|
|
var (_ada ,_fcf ,_bec ,_egd ,_fbdf ,_eda ,_ggfb ,_ecf int ;_ddd ,_dbag ,_caf ,_ggd uint32 ;_dda ,_ffe byte ;_aead uint16 ;);_fae :=make ([]byte ,4);_acg :=make ([]byte ,4);for _bec =0;_bec < _fbg .Height -1;_bec ,_egd =_bec +2,_egd +1{_ada =_bec *_fbg .RowStride ;
|
|
_fcf =_egd *_dbc .RowStride ;for _fbdf ,_eda =0,0;_fbdf < _gaa ;_fbdf ,_eda =_fbdf +4,_eda +1{for _ggfb =0;_ggfb < 4;_ggfb ++{_ecf =_ada +_fbdf +_ggfb ;if _ecf <=len (_fbg .Data )-1&&_ecf < _ada +_fbg .RowStride {_fae [_ggfb ]=_fbg .Data [_ecf ];}else {_fae [_ggfb ]=0x00;
|
|
};_ecf =_ada +_fbg .RowStride +_fbdf +_ggfb ;if _ecf <=len (_fbg .Data )-1&&_ecf < _ada +(2*_fbg .RowStride ){_acg [_ggfb ]=_fbg .Data [_ecf ];}else {_acg [_ggfb ]=0x00;};};_ddd =_ea .BigEndian .Uint32 (_fae );_dbag =_ea .BigEndian .Uint32 (_acg );_caf =_ddd &_dbag ;
|
|
_caf |=_caf <<1;_ggd =_ddd |_dbag ;_ggd &=_ggd <<1;_dbag =_caf |_ggd ;_dbag &=0xaaaaaaaa;_ddd =_dbag |(_dbag <<7);_dda =byte (_ddd >>24);_ffe =byte ((_ddd >>8)&0xff);_ecf =_fcf +_eda ;if _ecf +1==len (_dbc .Data )-1||_ecf +1>=_fcf +_dbc .RowStride {if _egcg =_dbc .SetByte (_ecf ,_eag [_dda ]);
|
|
_egcg !=nil {return _f .Wrapf (_egcg ,_eeg ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_ecf );};}else {_aead =(uint16 (_eag [_dda ])<<8)|uint16 (_eag [_ffe ]);if _egcg =_dbc .setTwoBytes (_ecf ,_aead );_egcg !=nil {return _f .Wrapf (_egcg ,_eeg ,"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",_ecf );
|
|
};_eda ++;};};};return nil ;};func MakePixelCentroidTab8 ()[]int {return _efdae ()};func (_fcfaa *byHeight )Less (i ,j int )bool {return _fcfaa .Values [i ].Height < _fcfaa .Values [j ].Height };const (AsymmetricMorphBC BoundaryCondition =iota ;SymmetricMorphBC ;
|
|
);func (_dfc *Bitmap )InverseData (){_dfc .inverseData ()};func (_abbde *Bitmap )setEightBytes (_egae int ,_gce uint64 )error {_fadf :=_abbde .RowStride -(_egae %_abbde .RowStride );if _abbde .RowStride !=_abbde .Width >>3{_fadf --;};if _fadf >=8{return _abbde .setEightFullBytes (_egae ,_gce );
|
|
};return _abbde .setEightPartlyBytes (_egae ,_fadf ,_gce );};var _dabe [256]uint8 ;func (_effc *Bitmap )resizeImageData (_fbgb *Bitmap )error {if _fbgb ==nil {return _f .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 _effc .SizesEqual (_fbgb ){return nil ;};_effc .Data =make ([]byte ,len (_fbgb .Data ));_effc .Width =_fbgb .Width ;_effc .Height =_fbgb .Height ;_effc .RowStride =_fbgb .RowStride ;return nil ;};func TstDSymbol (t *_g .T ,scale ...int )*Bitmap {_dfae ,_ffcd :=NewWithData (4,5,[]byte {0xf0,0x90,0x90,0x90,0xE0});
|
|
_d .NoError (t ,_ffcd );return TstGetScaledSymbol (t ,_dfae ,scale ...);};var _efefg =[5]int {1,2,3,0,4};func TstOSymbol (t *_g .T ,scale ...int )*Bitmap {_dacca ,_dgbdcb :=NewWithData (4,5,[]byte {0xF0,0x90,0x90,0x90,0xF0});_d .NoError (t ,_dgbdcb );return TstGetScaledSymbol (t ,_dacca ,scale ...);
|
|
};func _fdfef (_bged ,_fbdcg *Bitmap ,_eaag ,_ggac int )(_cegdf error ){const _dbed ="\u0073e\u0065d\u0066\u0069\u006c\u006c\u0042i\u006e\u0061r\u0079\u004c\u006f\u0077\u0038";var (_adecf ,_efgca ,_dbeg ,_dfeba int ;_defb ,_bba ,_bdda ,_acaa ,_ddbfa ,_bcdb ,_fafb ,_cddddf byte ;
|
|
);for _adecf =0;_adecf < _eaag ;_adecf ++{_dbeg =_adecf *_bged .RowStride ;_dfeba =_adecf *_fbdcg .RowStride ;for _efgca =0;_efgca < _ggac ;_efgca ++{if _defb ,_cegdf =_bged .GetByte (_dbeg +_efgca );_cegdf !=nil {return _f .Wrap (_cegdf ,_dbed ,"\u0067e\u0074 \u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0062\u0079\u0074\u0065");
|
|
};if _bba ,_cegdf =_fbdcg .GetByte (_dfeba +_efgca );_cegdf !=nil {return _f .Wrap (_cegdf ,_dbed ,"\u0067\u0065\u0074\u0020\u006d\u0061\u0073\u006b\u0020\u0062\u0079\u0074\u0065");};if _adecf > 0{if _bdda ,_cegdf =_bged .GetByte (_dbeg -_bged .RowStride +_efgca );
|
|
_cegdf !=nil {return _f .Wrap (_cegdf ,_dbed ,"\u0069\u0020\u003e\u0020\u0030\u0020\u0062\u0079\u0074\u0065");};_defb |=_bdda |(_bdda <<1)|(_bdda >>1);if _efgca > 0{if _cddddf ,_cegdf =_bged .GetByte (_dbeg -_bged .RowStride +_efgca -1);_cegdf !=nil {return _f .Wrap (_cegdf ,_dbed ,"\u0069\u0020\u003e\u00200 \u0026\u0026\u0020\u006a\u0020\u003e\u0020\u0030\u0020\u0062\u0079\u0074\u0065");
|
|
};_defb |=_cddddf <<7;};if _efgca < _ggac -1{if _cddddf ,_cegdf =_bged .GetByte (_dbeg -_bged .RowStride +_efgca +1);_cegdf !=nil {return _f .Wrap (_cegdf ,_dbed ,"\u006a\u0020<\u0020\u0077\u0070l\u0020\u002d\u0020\u0031\u0020\u0062\u0079\u0074\u0065");
|
|
};_defb |=_cddddf >>7;};};if _efgca > 0{if _acaa ,_cegdf =_bged .GetByte (_dbeg +_efgca -1);_cegdf !=nil {return _f .Wrap (_cegdf ,_dbed ,"\u006a\u0020\u003e \u0030");};_defb |=_acaa <<7;};_defb &=_bba ;if _defb ==0||^_defb ==0{if _cegdf =_bged .SetByte (_dbeg +_efgca ,_defb );
|
|
_cegdf !=nil {return _f .Wrap (_cegdf ,_dbed ,"\u0073e\u0074t\u0069\u006e\u0067\u0020\u0065m\u0070\u0074y\u0020\u0062\u0079\u0074\u0065");};};for {_fafb =_defb ;_defb =(_defb |(_defb >>1)|(_defb <<1))&_bba ;if (_defb ^_fafb )==0{if _cegdf =_bged .SetByte (_dbeg +_efgca ,_defb );
|
|
_cegdf !=nil {return _f .Wrap (_cegdf ,_dbed ,"\u0073\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u0070\u0072\u0065\u0076 \u0062\u0079\u0074\u0065");};break ;};};};};for _adecf =_eaag -1;_adecf >=0;_adecf --{_dbeg =_adecf *_bged .RowStride ;_dfeba =_adecf *_fbdcg .RowStride ;
|
|
for _efgca =_ggac -1;_efgca >=0;_efgca --{if _defb ,_cegdf =_bged .GetByte (_dbeg +_efgca );_cegdf !=nil {return _f .Wrap (_cegdf ,_dbed ,"\u0072\u0065\u0076er\u0073\u0065\u0020\u0067\u0065\u0074\u0020\u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0062\u0079\u0074\u0065");
|
|
};if _bba ,_cegdf =_fbdcg .GetByte (_dfeba +_efgca );_cegdf !=nil {return _f .Wrap (_cegdf ,_dbed ,"r\u0065\u0076\u0065\u0072se\u0020g\u0065\u0074\u0020\u006d\u0061s\u006b\u0020\u0062\u0079\u0074\u0065");};if _adecf < _eaag -1{if _ddbfa ,_cegdf =_bged .GetByte (_dbeg +_bged .RowStride +_efgca );
|
|
_cegdf !=nil {return _f .Wrap (_cegdf ,_dbed ,"\u0069\u0020\u003c\u0020h\u0020\u002d\u0020\u0031\u0020\u002d\u003e\u0020\u0067\u0065t\u0020s\u006f\u0075\u0072\u0063\u0065\u0020\u0062y\u0074\u0065");};_defb |=_ddbfa |(_ddbfa <<1)|_ddbfa >>1;if _efgca > 0{if _cddddf ,_cegdf =_bged .GetByte (_dbeg +_bged .RowStride +_efgca -1);
|
|
_cegdf !=nil {return _f .Wrap (_cegdf ,_dbed ,"\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");};_defb |=_cddddf <<7;};if _efgca < _ggac -1{if _cddddf ,_cegdf =_bged .GetByte (_dbeg +_bged .RowStride +_efgca +1);
|
|
_cegdf !=nil {return _f .Wrap (_cegdf ,_dbed ,"\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");
|
|
};_defb |=_cddddf >>7;};};if _efgca < _ggac -1{if _bcdb ,_cegdf =_bged .GetByte (_dbeg +_efgca +1);_cegdf !=nil {return _f .Wrap (_cegdf ,_dbed ,"\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");
|
|
};_defb |=_bcdb >>7;};_defb &=_bba ;if _defb ==0||(^_defb )==0{if _cegdf =_bged .SetByte (_dbeg +_efgca ,_defb );_cegdf !=nil {return _f .Wrap (_cegdf ,_dbed ,"\u0073e\u0074 \u006d\u0061\u0073\u006b\u0065\u0064\u0020\u0062\u0079\u0074\u0065");};};for {_fafb =_defb ;
|
|
_defb =(_defb |(_defb >>1)|(_defb <<1))&_bba ;if (_defb ^_fafb )==0{if _cegdf =_bged .SetByte (_dbeg +_efgca ,_defb );_cegdf !=nil {return _f .Wrap (_cegdf ,_dbed ,"r\u0065\u0076\u0065\u0072se\u0020s\u0065\u0074\u0020\u0070\u0072e\u0076\u0020\u0062\u0079\u0074\u0065");
|
|
};break ;};};};};return nil ;};func (_egba *ClassedPoints )validateIntSlice ()error {const _aedg ="\u0076\u0061l\u0069\u0064\u0061t\u0065\u0049\u006e\u0074\u0053\u006c\u0069\u0063\u0065";for _ ,_ddcg :=range _egba .IntSlice {if _ddcg >=(_egba .Points .Size ()){return _f .Errorf (_aedg ,"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",_ddcg ,_egba .Points .Size ());
|
|
};};return nil ;};func (_gffg *Bitmaps )SelectBySize (width ,height int ,tp LocationFilter ,relation SizeComparison )(_efcdb *Bitmaps ,_bgee error ){const _ggacb ="B\u0069t\u006d\u0061\u0070\u0073\u002e\u0053\u0065\u006ce\u0063\u0074\u0042\u0079Si\u007a\u0065";
|
|
if _gffg ==nil {return nil ,_f .Error (_ggacb ,"\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 ,_f .Errorf (_ggacb ,"\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 ,_f .Errorf (_ggacb ,"\u0069\u006e\u0076\u0061li\u0064\u0020\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0027\u0025d\u0027",relation );
|
|
};_agfb ,_bgee :=_gffg .makeSizeIndicator (width ,height ,tp ,relation );if _bgee !=nil {return nil ,_f .Wrap (_bgee ,_ggacb ,"");};_efcdb ,_bgee =_gffg .selectByIndicator (_agfb );if _bgee !=nil {return nil ,_f .Wrap (_bgee ,_ggacb ,"");};return _efcdb ,nil ;
|
|
};func TstAddSymbol (t *_g .T ,bms *Bitmaps ,sym *Bitmap ,x *int ,y int ,space int ){bms .AddBitmap (sym );_aacfe :=_ab .Rect (*x ,y ,*x +sym .Width ,y +sym .Height );bms .AddBox (&_aacfe );*x +=sym .Width +space ;};func _faff (_gbda ,_aacf byte ,_ddae CombinationOperator )byte {switch _ddae {case CmbOpOr :return _aacf |_gbda ;
|
|
case CmbOpAnd :return _aacf &_gbda ;case CmbOpXor :return _aacf ^_gbda ;case CmbOpXNor :return ^(_aacf ^_gbda );case CmbOpNot :return ^(_aacf );default:return _aacf ;};};func TstWordBitmap (t *_g .T ,scale ...int )*Bitmap {_cdad :=1;if len (scale )> 0{_cdad =scale [0];
|
|
};_gfbcd :=3;_fedec :=9+7+15+2*_gfbcd ;_ebbgb :=5+_gfbcd +5;_cfe :=New (_fedec *_cdad ,_ebbgb *_cdad );_cfgag :=&Bitmaps {};var _dabg *int ;_gfbcd *=_cdad ;_fbaac :=0;_dabg =&_fbaac ;_bcbg :=0;_gecaa :=TstDSymbol (t ,scale ...);TstAddSymbol (t ,_cfgag ,_gecaa ,_dabg ,_bcbg ,1*_cdad );
|
|
_gecaa =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_cfgag ,_gecaa ,_dabg ,_bcbg ,_gfbcd );_gecaa =TstISymbol (t ,scale ...);TstAddSymbol (t ,_cfgag ,_gecaa ,_dabg ,_bcbg ,1*_cdad );_gecaa =TstTSymbol (t ,scale ...);TstAddSymbol (t ,_cfgag ,_gecaa ,_dabg ,_bcbg ,_gfbcd );
|
|
_gecaa =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_cfgag ,_gecaa ,_dabg ,_bcbg ,1*_cdad );_gecaa =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_cfgag ,_gecaa ,_dabg ,_bcbg ,1*_cdad );_gecaa =TstWSymbol (t ,scale ...);TstAddSymbol (t ,_cfgag ,_gecaa ,_dabg ,_bcbg ,0);
|
|
*_dabg =0;_bcbg =5*_cdad +_gfbcd ;_gecaa =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_cfgag ,_gecaa ,_dabg ,_bcbg ,1*_cdad );_gecaa =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_cfgag ,_gecaa ,_dabg ,_bcbg ,_gfbcd );_gecaa =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_cfgag ,_gecaa ,_dabg ,_bcbg ,1*_cdad );
|
|
_gecaa =TstESymbol (t ,scale ...);TstAddSymbol (t ,_cfgag ,_gecaa ,_dabg ,_bcbg ,1*_cdad );_gecaa =TstVSymbol (t ,scale ...);TstAddSymbol (t ,_cfgag ,_gecaa ,_dabg ,_bcbg ,1*_cdad );_gecaa =TstESymbol (t ,scale ...);TstAddSymbol (t ,_cfgag ,_gecaa ,_dabg ,_bcbg ,1*_cdad );
|
|
_gecaa =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_cfgag ,_gecaa ,_dabg ,_bcbg ,0);TstWriteSymbols (t ,_cfgag ,_cfe );return _cfe ;};func _fbae (_cfab ,_cgcd ,_abafa *Bitmap ,_cfbg int )(*Bitmap ,error ){const _ddea ="\u0073\u0065\u0065\u0064\u0046\u0069\u006c\u006c\u0042i\u006e\u0061\u0072\u0079";
|
|
if _cgcd ==nil {return nil ,_f .Error (_ddea ,"s\u006fu\u0072\u0063\u0065\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");};if _abafa ==nil {return nil ,_f .Error (_ddea ,"'\u006da\u0073\u006b\u0027\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");
|
|
};if _cfbg !=4&&_cfbg !=8{return nil ,_f .Error (_ddea ,"\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 _aebgf error ;_cfab ,_aebgf =_gcff (_cfab ,_cgcd );
|
|
if _aebgf !=nil {return nil ,_f .Wrap (_aebgf ,_ddea ,"\u0063o\u0070y\u0020\u0073\u006f\u0075\u0072c\u0065\u0020t\u006f\u0020\u0027\u0064\u0027");};_dcfd :=_cgcd .createTemplate ();_abafa .setPadBits (0);for _ccfe :=0;_ccfe < _ggbf ;_ccfe ++{_dcfd ,_aebgf =_gcff (_dcfd ,_cfab );
|
|
if _aebgf !=nil {return nil ,_f .Wrapf (_aebgf ,_ddea ,"\u0069\u0074\u0065\u0072\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0064",_ccfe );};if _aebgf =_ded (_cfab ,_abafa ,_cfbg );_aebgf !=nil {return nil ,_f .Wrapf (_aebgf ,_ddea ,"\u0069\u0074\u0065\u0072\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0064",_ccfe );
|
|
};if _dcfd .Equals (_cfab ){break ;};};return _cfab ,nil ;};type BoundaryCondition int ;func (_efcd *Bitmap )setPadBits (_dfd int ){_bdgb :=8-_efcd .Width %8;if _bdgb ==8{return ;};_edae :=_efcd .Width /8;_gacg :=_dggdd [_bdgb ];if _dfd ==0{_gacg ^=_gacg ;
|
|
};var _bff int ;for _bbeea :=0;_bbeea < _efcd .Height ;_bbeea ++{_bff =_bbeea *_efcd .RowStride +_edae ;if _dfd ==0{_efcd .Data [_bff ]&=_gacg ;}else {_efcd .Data [_bff ]|=_gacg ;};};};func (_aaa *Bitmap )SetDefaultPixel (){for _eddd :=range _aaa .Data {_aaa .Data [_eddd ]=byte (0xff);
|
|
};};func _cdbeb (_eccf *_dg .Stack ,_cdca ,_fbe ,_fddbe ,_bage ,_cedd int ,_cega *_ab .Rectangle )(_acceb error ){const _eefb ="\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 _eccf ==nil {return _f .Error (_eefb ,"\u006ei\u006c \u0073\u0074\u0061\u0063\u006b \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");};if _cega ==nil {return _f .Error (_eefb ,"\u0070\u0072\u006f\u0076i\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0069\u006da\u0067e\u002e\u0052\u0065\u0063\u0074\u0061\u006eg\u006c\u0065");
|
|
};_cega .Min .X =_dg .Min (_cega .Min .X ,_cdca );_cega .Max .X =_dg .Max (_cega .Max .X ,_fbe );_cega .Min .Y =_dg .Min (_cega .Min .Y ,_fddbe );_cega .Max .Y =_dg .Max (_cega .Max .Y ,_fddbe );if !(_fddbe +_bage >=0&&_fddbe +_bage <=_cedd ){return nil ;
|
|
};if _eccf .Aux ==nil {return _f .Error (_eefb ,"a\u0075x\u0053\u0074\u0061\u0063\u006b\u0020\u006e\u006ft\u0020\u0064\u0065\u0066in\u0065\u0064");};var _adge *fillSegment ;_gcgg ,_cbdgd :=_eccf .Aux .Pop ();if _cbdgd {if _adge ,_cbdgd =_gcgg .(*fillSegment );
|
|
!_cbdgd {return _f .Error (_eefb ,"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 {_adge =&fillSegment {};
|
|
};_adge ._gcda =_cdca ;_adge ._dbcd =_fbe ;_adge ._cccf =_fddbe ;_adge ._cefc =_bage ;_eccf .Push (_adge );return nil ;};type MorphOperation int ;func (_fcbg *Bitmaps )makeSizeIndicator (_eaeg ,_egea int ,_bfee LocationFilter ,_ebgc SizeComparison )(_cbdc *_dg .NumSlice ,_fagbc error ){const _gagac ="\u0042i\u0074\u006d\u0061\u0070s\u002e\u006d\u0061\u006b\u0065S\u0069z\u0065I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";
|
|
if _fcbg ==nil {return nil ,_f .Error (_gagac ,"\u0062\u0069\u0074ma\u0070\u0073\u0020\u0027\u0062\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};switch _bfee {case LocSelectWidth ,LocSelectHeight ,LocSelectIfEither ,LocSelectIfBoth :default:return nil ,_f .Errorf (_gagac ,"\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",_bfee );
|
|
};switch _ebgc {case SizeSelectIfLT ,SizeSelectIfGT ,SizeSelectIfLTE ,SizeSelectIfGTE ,SizeSelectIfEQ :default:return nil ,_f .Errorf (_gagac ,"\u0069\u006e\u0076\u0061li\u0064\u0020\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0027\u0025d\u0027",_ebgc );
|
|
};_cbdc =&_dg .NumSlice {};var (_cefcd ,_cfbe ,_gcfd int ;_ddgf *Bitmap ;);for _ ,_ddgf =range _fcbg .Values {_cefcd =0;_cfbe ,_gcfd =_ddgf .Width ,_ddgf .Height ;switch _bfee {case LocSelectWidth :if (_ebgc ==SizeSelectIfLT &&_cfbe < _eaeg )||(_ebgc ==SizeSelectIfGT &&_cfbe > _eaeg )||(_ebgc ==SizeSelectIfLTE &&_cfbe <=_eaeg )||(_ebgc ==SizeSelectIfGTE &&_cfbe >=_eaeg )||(_ebgc ==SizeSelectIfEQ &&_cfbe ==_eaeg ){_cefcd =1;
|
|
};case LocSelectHeight :if (_ebgc ==SizeSelectIfLT &&_gcfd < _egea )||(_ebgc ==SizeSelectIfGT &&_gcfd > _egea )||(_ebgc ==SizeSelectIfLTE &&_gcfd <=_egea )||(_ebgc ==SizeSelectIfGTE &&_gcfd >=_egea )||(_ebgc ==SizeSelectIfEQ &&_gcfd ==_egea ){_cefcd =1;
|
|
};case LocSelectIfEither :if (_ebgc ==SizeSelectIfLT &&(_cfbe < _eaeg ||_gcfd < _egea ))||(_ebgc ==SizeSelectIfGT &&(_cfbe > _eaeg ||_gcfd > _egea ))||(_ebgc ==SizeSelectIfLTE &&(_cfbe <=_eaeg ||_gcfd <=_egea ))||(_ebgc ==SizeSelectIfGTE &&(_cfbe >=_eaeg ||_gcfd >=_egea ))||(_ebgc ==SizeSelectIfEQ &&(_cfbe ==_eaeg ||_gcfd ==_egea )){_cefcd =1;
|
|
};case LocSelectIfBoth :if (_ebgc ==SizeSelectIfLT &&(_cfbe < _eaeg &&_gcfd < _egea ))||(_ebgc ==SizeSelectIfGT &&(_cfbe > _eaeg &&_gcfd > _egea ))||(_ebgc ==SizeSelectIfLTE &&(_cfbe <=_eaeg &&_gcfd <=_egea ))||(_ebgc ==SizeSelectIfGTE &&(_cfbe >=_eaeg &&_gcfd >=_egea ))||(_ebgc ==SizeSelectIfEQ &&(_cfbe ==_eaeg &&_gcfd ==_egea )){_cefcd =1;
|
|
};};_cbdc .AddInt (_cefcd );};return _cbdc ,nil ;};func (_faabe *Bitmaps )SortByWidth (){_gbga :=(*byWidth )(_faabe );_c .Sort (_gbga )};func _ebbe (_abcc *Bitmap ,_ggdc ,_gafe int ,_dbbb ,_bfeg int ,_ccega RasterOperator ){var (_cfdb int ;_cegd byte ;
|
|
_dggc ,_adbb int ;_dfeb int ;);_gffb :=_dbbb >>3;_fagff :=_dbbb &7;if _fagff > 0{_cegd =_cadf [_fagff ];};_cfdb =_abcc .RowStride *_gafe +(_ggdc >>3);switch _ccega {case PixClr :for _dggc =0;_dggc < _bfeg ;_dggc ++{_dfeb =_cfdb +_dggc *_abcc .RowStride ;
|
|
for _adbb =0;_adbb < _gffb ;_adbb ++{_abcc .Data [_dfeb ]=0x0;_dfeb ++;};if _fagff > 0{_abcc .Data [_dfeb ]=_gega (_abcc .Data [_dfeb ],0x0,_cegd );};};case PixSet :for _dggc =0;_dggc < _bfeg ;_dggc ++{_dfeb =_cfdb +_dggc *_abcc .RowStride ;for _adbb =0;
|
|
_adbb < _gffb ;_adbb ++{_abcc .Data [_dfeb ]=0xff;_dfeb ++;};if _fagff > 0{_abcc .Data [_dfeb ]=_gega (_abcc .Data [_dfeb ],0xff,_cegd );};};case PixNotDst :for _dggc =0;_dggc < _bfeg ;_dggc ++{_dfeb =_cfdb +_dggc *_abcc .RowStride ;for _adbb =0;_adbb < _gffb ;
|
|
_adbb ++{_abcc .Data [_dfeb ]=^_abcc .Data [_dfeb ];_dfeb ++;};if _fagff > 0{_abcc .Data [_dfeb ]=_gega (_abcc .Data [_dfeb ],^_abcc .Data [_dfeb ],_cegd );};};};};func RankHausTest (p1 ,p2 ,p3 ,p4 *Bitmap ,delX ,delY float32 ,maxDiffW ,maxDiffH ,area1 ,area3 int ,rank float32 ,tab8 []int )(_aaggd bool ,_gccdd error ){const _bdae ="\u0052\u0061\u006ek\u0048\u0061\u0075\u0073\u0054\u0065\u0073\u0074";
|
|
_becc ,_dddgb :=p1 .Width ,p1 .Height ;_dcgc ,_cbbgc :=p3 .Width ,p3 .Height ;if _dg .Abs (_becc -_dcgc )> maxDiffW {return false ,nil ;};if _dg .Abs (_dddgb -_cbbgc )> maxDiffH {return false ,nil ;};_fbbb :=int (float32 (area1 )*(1.0-rank )+0.5);_fbaa :=int (float32 (area3 )*(1.0-rank )+0.5);
|
|
var _afeb ,_fgeab int ;if delX >=0{_afeb =int (delX +0.5);}else {_afeb =int (delX -0.5);};if delY >=0{_fgeab =int (delY +0.5);}else {_fgeab =int (delY -0.5);};_gece :=p1 .CreateTemplate ();if _gccdd =_gece .RasterOperation (0,0,_becc ,_dddgb ,PixSrc ,p1 ,0,0);
|
|
_gccdd !=nil {return false ,_f .Wrap (_gccdd ,_bdae ,"p\u0031\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _gccdd =_gece .RasterOperation (_afeb ,_fgeab ,_becc ,_dddgb ,PixNotSrcAndDst ,p4 ,0,0);_gccdd !=nil {return false ,_f .Wrap (_gccdd ,_bdae ,"\u0074 \u0026\u0020\u0021\u0070\u0034");
|
|
};_aaggd ,_gccdd =_gece .ThresholdPixelSum (_fbbb ,tab8 );if _gccdd !=nil {return false ,_f .Wrap (_gccdd ,_bdae ,"\u0074\u002d\u003e\u0074\u0068\u0072\u0065\u0073\u0068\u0031");};if _aaggd {return false ,nil ;};if _gccdd =_gece .RasterOperation (_afeb ,_fgeab ,_dcgc ,_cbbgc ,PixSrc ,p3 ,0,0);
|
|
_gccdd !=nil {return false ,_f .Wrap (_gccdd ,_bdae ,"p\u0033\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _gccdd =_gece .RasterOperation (0,0,_dcgc ,_cbbgc ,PixNotSrcAndDst ,p2 ,0,0);_gccdd !=nil {return false ,_f .Wrap (_gccdd ,_bdae ,"\u0074 \u0026\u0020\u0021\u0070\u0032");
|
|
};_aaggd ,_gccdd =_gece .ThresholdPixelSum (_fbaa ,tab8 );if _gccdd !=nil {return false ,_f .Wrap (_gccdd ,_bdae ,"\u0074\u002d\u003e\u0074\u0068\u0072\u0065\u0073\u0068\u0033");};return !_aaggd ,nil ;};func _ded (_acedf *Bitmap ,_caea *Bitmap ,_dded int )(_fbdb error ){const _aaefa ="\u0073\u0065\u0065\u0064\u0066\u0069\u006c\u006c\u0042\u0069\u006e\u0061r\u0079\u004c\u006f\u0077";
|
|
_cbabb :=_bfada (_acedf .Height ,_caea .Height );_ebbg :=_bfada (_acedf .RowStride ,_caea .RowStride );switch _dded {case 4:_fbdb =_acfd (_acedf ,_caea ,_cbabb ,_ebbg );case 8:_fbdb =_fdfef (_acedf ,_caea ,_cbabb ,_ebbg );default:return _f .Errorf (_aaefa ,"\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",_dded );
|
|
};if _fbdb !=nil {return _f .Wrap (_fbdb ,_aaefa ,"");};return nil ;};func (_gag *Bitmap )addBorderGeneral (_baga ,_dafef ,_ebfb ,_dea int ,_aggf int )(*Bitmap ,error ){const _gfbg ="\u0061\u0064d\u0042\u006f\u0072d\u0065\u0072\u0047\u0065\u006e\u0065\u0072\u0061\u006c";
|
|
if _baga < 0||_dafef < 0||_ebfb < 0||_dea < 0{return nil ,_f .Error (_gfbg ,"n\u0065\u0067\u0061\u0074iv\u0065 \u0062\u006f\u0072\u0064\u0065r\u0020\u0061\u0064\u0064\u0065\u0064");};_ggfg ,_aag :=_gag .Width ,_gag .Height ;_ccbgf :=_ggfg +_baga +_dafef ;
|
|
_begg :=_aag +_ebfb +_dea ;_abda :=New (_ccbgf ,_begg );_abda .Color =_gag .Color ;_bcg :=PixClr ;if _aggf > 0{_bcg =PixSet ;};_bae :=_abda .RasterOperation (0,0,_baga ,_begg ,_bcg ,nil ,0,0);if _bae !=nil {return nil ,_f .Wrap (_bae ,_gfbg ,"\u006c\u0065\u0066\u0074");
|
|
};_bae =_abda .RasterOperation (_ccbgf -_dafef ,0,_dafef ,_begg ,_bcg ,nil ,0,0);if _bae !=nil {return nil ,_f .Wrap (_bae ,_gfbg ,"\u0072\u0069\u0067h\u0074");};_bae =_abda .RasterOperation (0,0,_ccbgf ,_ebfb ,_bcg ,nil ,0,0);if _bae !=nil {return nil ,_f .Wrap (_bae ,_gfbg ,"\u0074\u006f\u0070");
|
|
};_bae =_abda .RasterOperation (0,_begg -_dea ,_ccbgf ,_dea ,_bcg ,nil ,0,0);if _bae !=nil {return nil ,_f .Wrap (_bae ,_gfbg ,"\u0062\u006f\u0074\u0074\u006f\u006d");};_bae =_abda .RasterOperation (_baga ,_ebfb ,_ggfg ,_aag ,PixSrc ,_gag ,0,0);if _bae !=nil {return nil ,_f .Wrap (_bae ,_gfbg ,"\u0063\u006f\u0070\u0079");
|
|
};return _abda ,nil ;};func (_cced *Bitmap )setFourBytes (_fddd int ,_adeg uint32 )error {if _fddd +3> len (_cced .Data )-1{return _f .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",_fddd );
|
|
};_cced .Data [_fddd ]=byte ((_adeg &0xff000000)>>24);_cced .Data [_fddd +1]=byte ((_adeg &0xff0000)>>16);_cced .Data [_fddd +2]=byte ((_adeg &0xff00)>>8);_cced .Data [_fddd +3]=byte (_adeg &0xff);return nil ;};type Component int ;func (_gaaag CombinationOperator )String ()string {var _eafe string ;
|
|
switch _gaaag {case CmbOpOr :_eafe ="\u004f\u0052";case CmbOpAnd :_eafe ="\u0041\u004e\u0044";case CmbOpXor :_eafe ="\u0058\u004f\u0052";case CmbOpXNor :_eafe ="\u0058\u004e\u004f\u0052";case CmbOpReplace :_eafe ="\u0052E\u0050\u004c\u0041\u0043\u0045";
|
|
case CmbOpNot :_eafe ="\u004e\u004f\u0054";};return _eafe ;};func _dffb (_aeeg ,_afa *Bitmap ,_agc *Selection )(*Bitmap ,error ){const _aeda ="\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u004d\u006f\u0072\u0070\u0068A\u0072\u0067\u0073\u0032";var _fdcf ,_bbcad int ;
|
|
if _afa ==nil {return nil ,_f .Error (_aeda ,"s\u006fu\u0072\u0063\u0065\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");};if _agc ==nil {return nil ,_f .Error (_aeda ,"\u0073e\u006c \u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};_fdcf =_agc .Width ;_bbcad =_agc .Height ;if _fdcf ==0||_bbcad ==0{return nil ,_f .Error (_aeda ,"\u0073\u0065\u006c\u0020\u006f\u0066\u0020\u0073\u0069\u007a\u0065\u0020\u0030");};if _aeeg ==nil {return _afa .createTemplate (),nil ;};if _ddbf :=_aeeg .resizeImageData (_afa );
|
|
_ddbf !=nil {return nil ,_ddbf ;};return _aeeg ,nil ;};func TstCSymbol (t *_g .T )*Bitmap {t .Helper ();_ccbgd :=New (6,6);_d .NoError (t ,_ccbgd .SetPixel (1,0,1));_d .NoError (t ,_ccbgd .SetPixel (2,0,1));_d .NoError (t ,_ccbgd .SetPixel (3,0,1));_d .NoError (t ,_ccbgd .SetPixel (4,0,1));
|
|
_d .NoError (t ,_ccbgd .SetPixel (0,1,1));_d .NoError (t ,_ccbgd .SetPixel (5,1,1));_d .NoError (t ,_ccbgd .SetPixel (0,2,1));_d .NoError (t ,_ccbgd .SetPixel (0,3,1));_d .NoError (t ,_ccbgd .SetPixel (0,4,1));_d .NoError (t ,_ccbgd .SetPixel (5,4,1));
|
|
_d .NoError (t ,_ccbgd .SetPixel (1,5,1));_d .NoError (t ,_ccbgd .SetPixel (2,5,1));_d .NoError (t ,_ccbgd .SetPixel (3,5,1));_d .NoError (t ,_ccbgd .SetPixel (4,5,1));return _ccbgd ;};func TstWordBitmapWithSpaces (t *_g .T ,scale ...int )*Bitmap {_bdacd :=1;
|
|
if len (scale )> 0{_bdacd =scale [0];};_aaab :=3;_bcbga :=9+7+15+2*_aaab +2*_aaab ;_dcbbg :=5+_aaab +5+2*_aaab ;_fadaa :=New (_bcbga *_bdacd ,_dcbbg *_bdacd );_dffff :=&Bitmaps {};var _ffcea *int ;_aaab *=_bdacd ;_ecbd :=_aaab ;_ffcea =&_ecbd ;_aceg :=_aaab ;
|
|
_cddc :=TstDSymbol (t ,scale ...);TstAddSymbol (t ,_dffff ,_cddc ,_ffcea ,_aceg ,1*_bdacd );_cddc =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_dffff ,_cddc ,_ffcea ,_aceg ,_aaab );_cddc =TstISymbol (t ,scale ...);TstAddSymbol (t ,_dffff ,_cddc ,_ffcea ,_aceg ,1*_bdacd );
|
|
_cddc =TstTSymbol (t ,scale ...);TstAddSymbol (t ,_dffff ,_cddc ,_ffcea ,_aceg ,_aaab );_cddc =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_dffff ,_cddc ,_ffcea ,_aceg ,1*_bdacd );_cddc =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_dffff ,_cddc ,_ffcea ,_aceg ,1*_bdacd );
|
|
_cddc =TstWSymbol (t ,scale ...);TstAddSymbol (t ,_dffff ,_cddc ,_ffcea ,_aceg ,0);*_ffcea =_aaab ;_aceg =5*_bdacd +_aaab ;_cddc =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_dffff ,_cddc ,_ffcea ,_aceg ,1*_bdacd );_cddc =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_dffff ,_cddc ,_ffcea ,_aceg ,_aaab );
|
|
_cddc =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_dffff ,_cddc ,_ffcea ,_aceg ,1*_bdacd );_cddc =TstESymbol (t ,scale ...);TstAddSymbol (t ,_dffff ,_cddc ,_ffcea ,_aceg ,1*_bdacd );_cddc =TstVSymbol (t ,scale ...);TstAddSymbol (t ,_dffff ,_cddc ,_ffcea ,_aceg ,1*_bdacd );
|
|
_cddc =TstESymbol (t ,scale ...);TstAddSymbol (t ,_dffff ,_cddc ,_ffcea ,_aceg ,1*_bdacd );_cddc =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_dffff ,_cddc ,_ffcea ,_aceg ,0);TstWriteSymbols (t ,_dffff ,_fadaa );return _fadaa ;};const (_ SizeComparison =iota ;
|
|
SizeSelectIfLT ;SizeSelectIfGT ;SizeSelectIfLTE ;SizeSelectIfGTE ;SizeSelectIfEQ ;);func _bbgba (_dafff *Bitmap ,_afae ,_faed ,_ebdb ,_adee int ,_ddefe RasterOperator ,_fcaf *Bitmap ,_cfbf ,_aece int )error {var (_ggeb bool ;_bdbd bool ;_dag byte ;_effd int ;
|
|
_fgfb int ;_cfaa int ;_ffeeg int ;_fcdc bool ;_aadd int ;_cafagd int ;_geed int ;_efcb bool ;_aagc byte ;_fbff int ;_faac int ;_gfgd int ;_fagb byte ;_dbaab int ;_gfabc int ;_adcb uint ;_eddgf uint ;_fddbc byte ;_aabe shift ;_begc bool ;_bcffee bool ;_cgda ,_dcda int ;
|
|
);if _cfbf &7!=0{_gfabc =8-(_cfbf &7);};if _afae &7!=0{_fgfb =8-(_afae &7);};if _gfabc ==0&&_fgfb ==0{_fddbc =_dggdd [0];}else {if _fgfb > _gfabc {_adcb =uint (_fgfb -_gfabc );}else {_adcb =uint (8-(_gfabc -_fgfb ));};_eddgf =8-_adcb ;_fddbc =_dggdd [_adcb ];
|
|
};if (_afae &7)!=0{_ggeb =true ;_effd =8-(_afae &7);_dag =_dggdd [_effd ];_cfaa =_dafff .RowStride *_faed +(_afae >>3);_ffeeg =_fcaf .RowStride *_aece +(_cfbf >>3);_dbaab =8-(_cfbf &7);if _effd > _dbaab {_aabe =_fefdd ;if _ebdb >=_gfabc {_begc =true ;};
|
|
}else {_aabe =_efae ;};};if _ebdb < _effd {_bdbd =true ;_dag &=_cadf [8-_effd +_ebdb ];};if !_bdbd {_aadd =(_ebdb -_effd )>>3;if _aadd !=0{_fcdc =true ;_cafagd =_dafff .RowStride *_faed +((_afae +_fgfb )>>3);_geed =_fcaf .RowStride *_aece +((_cfbf +_fgfb )>>3);
|
|
};};_fbff =(_afae +_ebdb )&7;if !(_bdbd ||_fbff ==0){_efcb =true ;_aagc =_cadf [_fbff ];_faac =_dafff .RowStride *_faed +((_afae +_fgfb )>>3)+_aadd ;_gfgd =_fcaf .RowStride *_aece +((_cfbf +_fgfb )>>3)+_aadd ;if _fbff > int (_eddgf ){_bcffee =true ;};};
|
|
switch _ddefe {case PixSrc :if _ggeb {for _cgda =0;_cgda < _adee ;_cgda ++{if _aabe ==_fefdd {_fagb =_fcaf .Data [_ffeeg ]<<_adcb ;if _begc {_fagb =_gega (_fagb ,_fcaf .Data [_ffeeg +1]>>_eddgf ,_fddbc );};}else {_fagb =_fcaf .Data [_ffeeg ]>>_eddgf ;};
|
|
_dafff .Data [_cfaa ]=_gega (_dafff .Data [_cfaa ],_fagb ,_dag );_cfaa +=_dafff .RowStride ;_ffeeg +=_fcaf .RowStride ;};};if _fcdc {for _cgda =0;_cgda < _adee ;_cgda ++{for _dcda =0;_dcda < _aadd ;_dcda ++{_fagb =_gega (_fcaf .Data [_geed +_dcda ]<<_adcb ,_fcaf .Data [_geed +_dcda +1]>>_eddgf ,_fddbc );
|
|
_dafff .Data [_cafagd +_dcda ]=_fagb ;};_cafagd +=_dafff .RowStride ;_geed +=_fcaf .RowStride ;};};if _efcb {for _cgda =0;_cgda < _adee ;_cgda ++{_fagb =_fcaf .Data [_gfgd ]<<_adcb ;if _bcffee {_fagb =_gega (_fagb ,_fcaf .Data [_gfgd +1]>>_eddgf ,_fddbc );
|
|
};_dafff .Data [_faac ]=_gega (_dafff .Data [_faac ],_fagb ,_aagc );_faac +=_dafff .RowStride ;_gfgd +=_fcaf .RowStride ;};};case PixNotSrc :if _ggeb {for _cgda =0;_cgda < _adee ;_cgda ++{if _aabe ==_fefdd {_fagb =_fcaf .Data [_ffeeg ]<<_adcb ;if _begc {_fagb =_gega (_fagb ,_fcaf .Data [_ffeeg +1]>>_eddgf ,_fddbc );
|
|
};}else {_fagb =_fcaf .Data [_ffeeg ]>>_eddgf ;};_dafff .Data [_cfaa ]=_gega (_dafff .Data [_cfaa ],^_fagb ,_dag );_cfaa +=_dafff .RowStride ;_ffeeg +=_fcaf .RowStride ;};};if _fcdc {for _cgda =0;_cgda < _adee ;_cgda ++{for _dcda =0;_dcda < _aadd ;_dcda ++{_fagb =_gega (_fcaf .Data [_geed +_dcda ]<<_adcb ,_fcaf .Data [_geed +_dcda +1]>>_eddgf ,_fddbc );
|
|
_dafff .Data [_cafagd +_dcda ]=^_fagb ;};_cafagd +=_dafff .RowStride ;_geed +=_fcaf .RowStride ;};};if _efcb {for _cgda =0;_cgda < _adee ;_cgda ++{_fagb =_fcaf .Data [_gfgd ]<<_adcb ;if _bcffee {_fagb =_gega (_fagb ,_fcaf .Data [_gfgd +1]>>_eddgf ,_fddbc );
|
|
};_dafff .Data [_faac ]=_gega (_dafff .Data [_faac ],^_fagb ,_aagc );_faac +=_dafff .RowStride ;_gfgd +=_fcaf .RowStride ;};};case PixSrcOrDst :if _ggeb {for _cgda =0;_cgda < _adee ;_cgda ++{if _aabe ==_fefdd {_fagb =_fcaf .Data [_ffeeg ]<<_adcb ;if _begc {_fagb =_gega (_fagb ,_fcaf .Data [_ffeeg +1]>>_eddgf ,_fddbc );
|
|
};}else {_fagb =_fcaf .Data [_ffeeg ]>>_eddgf ;};_dafff .Data [_cfaa ]=_gega (_dafff .Data [_cfaa ],_fagb |_dafff .Data [_cfaa ],_dag );_cfaa +=_dafff .RowStride ;_ffeeg +=_fcaf .RowStride ;};};if _fcdc {for _cgda =0;_cgda < _adee ;_cgda ++{for _dcda =0;
|
|
_dcda < _aadd ;_dcda ++{_fagb =_gega (_fcaf .Data [_geed +_dcda ]<<_adcb ,_fcaf .Data [_geed +_dcda +1]>>_eddgf ,_fddbc );_dafff .Data [_cafagd +_dcda ]|=_fagb ;};_cafagd +=_dafff .RowStride ;_geed +=_fcaf .RowStride ;};};if _efcb {for _cgda =0;_cgda < _adee ;
|
|
_cgda ++{_fagb =_fcaf .Data [_gfgd ]<<_adcb ;if _bcffee {_fagb =_gega (_fagb ,_fcaf .Data [_gfgd +1]>>_eddgf ,_fddbc );};_dafff .Data [_faac ]=_gega (_dafff .Data [_faac ],_fagb |_dafff .Data [_faac ],_aagc );_faac +=_dafff .RowStride ;_gfgd +=_fcaf .RowStride ;
|
|
};};case PixSrcAndDst :if _ggeb {for _cgda =0;_cgda < _adee ;_cgda ++{if _aabe ==_fefdd {_fagb =_fcaf .Data [_ffeeg ]<<_adcb ;if _begc {_fagb =_gega (_fagb ,_fcaf .Data [_ffeeg +1]>>_eddgf ,_fddbc );};}else {_fagb =_fcaf .Data [_ffeeg ]>>_eddgf ;};_dafff .Data [_cfaa ]=_gega (_dafff .Data [_cfaa ],_fagb &_dafff .Data [_cfaa ],_dag );
|
|
_cfaa +=_dafff .RowStride ;_ffeeg +=_fcaf .RowStride ;};};if _fcdc {for _cgda =0;_cgda < _adee ;_cgda ++{for _dcda =0;_dcda < _aadd ;_dcda ++{_fagb =_gega (_fcaf .Data [_geed +_dcda ]<<_adcb ,_fcaf .Data [_geed +_dcda +1]>>_eddgf ,_fddbc );_dafff .Data [_cafagd +_dcda ]&=_fagb ;
|
|
};_cafagd +=_dafff .RowStride ;_geed +=_fcaf .RowStride ;};};if _efcb {for _cgda =0;_cgda < _adee ;_cgda ++{_fagb =_fcaf .Data [_gfgd ]<<_adcb ;if _bcffee {_fagb =_gega (_fagb ,_fcaf .Data [_gfgd +1]>>_eddgf ,_fddbc );};_dafff .Data [_faac ]=_gega (_dafff .Data [_faac ],_fagb &_dafff .Data [_faac ],_aagc );
|
|
_faac +=_dafff .RowStride ;_gfgd +=_fcaf .RowStride ;};};case PixSrcXorDst :if _ggeb {for _cgda =0;_cgda < _adee ;_cgda ++{if _aabe ==_fefdd {_fagb =_fcaf .Data [_ffeeg ]<<_adcb ;if _begc {_fagb =_gega (_fagb ,_fcaf .Data [_ffeeg +1]>>_eddgf ,_fddbc );
|
|
};}else {_fagb =_fcaf .Data [_ffeeg ]>>_eddgf ;};_dafff .Data [_cfaa ]=_gega (_dafff .Data [_cfaa ],_fagb ^_dafff .Data [_cfaa ],_dag );_cfaa +=_dafff .RowStride ;_ffeeg +=_fcaf .RowStride ;};};if _fcdc {for _cgda =0;_cgda < _adee ;_cgda ++{for _dcda =0;
|
|
_dcda < _aadd ;_dcda ++{_fagb =_gega (_fcaf .Data [_geed +_dcda ]<<_adcb ,_fcaf .Data [_geed +_dcda +1]>>_eddgf ,_fddbc );_dafff .Data [_cafagd +_dcda ]^=_fagb ;};_cafagd +=_dafff .RowStride ;_geed +=_fcaf .RowStride ;};};if _efcb {for _cgda =0;_cgda < _adee ;
|
|
_cgda ++{_fagb =_fcaf .Data [_gfgd ]<<_adcb ;if _bcffee {_fagb =_gega (_fagb ,_fcaf .Data [_gfgd +1]>>_eddgf ,_fddbc );};_dafff .Data [_faac ]=_gega (_dafff .Data [_faac ],_fagb ^_dafff .Data [_faac ],_aagc );_faac +=_dafff .RowStride ;_gfgd +=_fcaf .RowStride ;
|
|
};};case PixNotSrcOrDst :if _ggeb {for _cgda =0;_cgda < _adee ;_cgda ++{if _aabe ==_fefdd {_fagb =_fcaf .Data [_ffeeg ]<<_adcb ;if _begc {_fagb =_gega (_fagb ,_fcaf .Data [_ffeeg +1]>>_eddgf ,_fddbc );};}else {_fagb =_fcaf .Data [_ffeeg ]>>_eddgf ;};_dafff .Data [_cfaa ]=_gega (_dafff .Data [_cfaa ],^_fagb |_dafff .Data [_cfaa ],_dag );
|
|
_cfaa +=_dafff .RowStride ;_ffeeg +=_fcaf .RowStride ;};};if _fcdc {for _cgda =0;_cgda < _adee ;_cgda ++{for _dcda =0;_dcda < _aadd ;_dcda ++{_fagb =_gega (_fcaf .Data [_geed +_dcda ]<<_adcb ,_fcaf .Data [_geed +_dcda +1]>>_eddgf ,_fddbc );_dafff .Data [_cafagd +_dcda ]|=^_fagb ;
|
|
};_cafagd +=_dafff .RowStride ;_geed +=_fcaf .RowStride ;};};if _efcb {for _cgda =0;_cgda < _adee ;_cgda ++{_fagb =_fcaf .Data [_gfgd ]<<_adcb ;if _bcffee {_fagb =_gega (_fagb ,_fcaf .Data [_gfgd +1]>>_eddgf ,_fddbc );};_dafff .Data [_faac ]=_gega (_dafff .Data [_faac ],^_fagb |_dafff .Data [_faac ],_aagc );
|
|
_faac +=_dafff .RowStride ;_gfgd +=_fcaf .RowStride ;};};case PixNotSrcAndDst :if _ggeb {for _cgda =0;_cgda < _adee ;_cgda ++{if _aabe ==_fefdd {_fagb =_fcaf .Data [_ffeeg ]<<_adcb ;if _begc {_fagb =_gega (_fagb ,_fcaf .Data [_ffeeg +1]>>_eddgf ,_fddbc );
|
|
};}else {_fagb =_fcaf .Data [_ffeeg ]>>_eddgf ;};_dafff .Data [_cfaa ]=_gega (_dafff .Data [_cfaa ],^_fagb &_dafff .Data [_cfaa ],_dag );_cfaa +=_dafff .RowStride ;_ffeeg +=_fcaf .RowStride ;};};if _fcdc {for _cgda =0;_cgda < _adee ;_cgda ++{for _dcda =0;
|
|
_dcda < _aadd ;_dcda ++{_fagb =_gega (_fcaf .Data [_geed +_dcda ]<<_adcb ,_fcaf .Data [_geed +_dcda +1]>>_eddgf ,_fddbc );_dafff .Data [_cafagd +_dcda ]&=^_fagb ;};_cafagd +=_dafff .RowStride ;_geed +=_fcaf .RowStride ;};};if _efcb {for _cgda =0;_cgda < _adee ;
|
|
_cgda ++{_fagb =_fcaf .Data [_gfgd ]<<_adcb ;if _bcffee {_fagb =_gega (_fagb ,_fcaf .Data [_gfgd +1]>>_eddgf ,_fddbc );};_dafff .Data [_faac ]=_gega (_dafff .Data [_faac ],^_fagb &_dafff .Data [_faac ],_aagc );_faac +=_dafff .RowStride ;_gfgd +=_fcaf .RowStride ;
|
|
};};case PixSrcOrNotDst :if _ggeb {for _cgda =0;_cgda < _adee ;_cgda ++{if _aabe ==_fefdd {_fagb =_fcaf .Data [_ffeeg ]<<_adcb ;if _begc {_fagb =_gega (_fagb ,_fcaf .Data [_ffeeg +1]>>_eddgf ,_fddbc );};}else {_fagb =_fcaf .Data [_ffeeg ]>>_eddgf ;};_dafff .Data [_cfaa ]=_gega (_dafff .Data [_cfaa ],_fagb |^_dafff .Data [_cfaa ],_dag );
|
|
_cfaa +=_dafff .RowStride ;_ffeeg +=_fcaf .RowStride ;};};if _fcdc {for _cgda =0;_cgda < _adee ;_cgda ++{for _dcda =0;_dcda < _aadd ;_dcda ++{_fagb =_gega (_fcaf .Data [_geed +_dcda ]<<_adcb ,_fcaf .Data [_geed +_dcda +1]>>_eddgf ,_fddbc );_dafff .Data [_cafagd +_dcda ]=_fagb |^_dafff .Data [_cafagd +_dcda ];
|
|
};_cafagd +=_dafff .RowStride ;_geed +=_fcaf .RowStride ;};};if _efcb {for _cgda =0;_cgda < _adee ;_cgda ++{_fagb =_fcaf .Data [_gfgd ]<<_adcb ;if _bcffee {_fagb =_gega (_fagb ,_fcaf .Data [_gfgd +1]>>_eddgf ,_fddbc );};_dafff .Data [_faac ]=_gega (_dafff .Data [_faac ],_fagb |^_dafff .Data [_faac ],_aagc );
|
|
_faac +=_dafff .RowStride ;_gfgd +=_fcaf .RowStride ;};};case PixSrcAndNotDst :if _ggeb {for _cgda =0;_cgda < _adee ;_cgda ++{if _aabe ==_fefdd {_fagb =_fcaf .Data [_ffeeg ]<<_adcb ;if _begc {_fagb =_gega (_fagb ,_fcaf .Data [_ffeeg +1]>>_eddgf ,_fddbc );
|
|
};}else {_fagb =_fcaf .Data [_ffeeg ]>>_eddgf ;};_dafff .Data [_cfaa ]=_gega (_dafff .Data [_cfaa ],_fagb &^_dafff .Data [_cfaa ],_dag );_cfaa +=_dafff .RowStride ;_ffeeg +=_fcaf .RowStride ;};};if _fcdc {for _cgda =0;_cgda < _adee ;_cgda ++{for _dcda =0;
|
|
_dcda < _aadd ;_dcda ++{_fagb =_gega (_fcaf .Data [_geed +_dcda ]<<_adcb ,_fcaf .Data [_geed +_dcda +1]>>_eddgf ,_fddbc );_dafff .Data [_cafagd +_dcda ]=_fagb &^_dafff .Data [_cafagd +_dcda ];};_cafagd +=_dafff .RowStride ;_geed +=_fcaf .RowStride ;};};
|
|
if _efcb {for _cgda =0;_cgda < _adee ;_cgda ++{_fagb =_fcaf .Data [_gfgd ]<<_adcb ;if _bcffee {_fagb =_gega (_fagb ,_fcaf .Data [_gfgd +1]>>_eddgf ,_fddbc );};_dafff .Data [_faac ]=_gega (_dafff .Data [_faac ],_fagb &^_dafff .Data [_faac ],_aagc );_faac +=_dafff .RowStride ;
|
|
_gfgd +=_fcaf .RowStride ;};};case PixNotPixSrcOrDst :if _ggeb {for _cgda =0;_cgda < _adee ;_cgda ++{if _aabe ==_fefdd {_fagb =_fcaf .Data [_ffeeg ]<<_adcb ;if _begc {_fagb =_gega (_fagb ,_fcaf .Data [_ffeeg +1]>>_eddgf ,_fddbc );};}else {_fagb =_fcaf .Data [_ffeeg ]>>_eddgf ;
|
|
};_dafff .Data [_cfaa ]=_gega (_dafff .Data [_cfaa ],^(_fagb |_dafff .Data [_cfaa ]),_dag );_cfaa +=_dafff .RowStride ;_ffeeg +=_fcaf .RowStride ;};};if _fcdc {for _cgda =0;_cgda < _adee ;_cgda ++{for _dcda =0;_dcda < _aadd ;_dcda ++{_fagb =_gega (_fcaf .Data [_geed +_dcda ]<<_adcb ,_fcaf .Data [_geed +_dcda +1]>>_eddgf ,_fddbc );
|
|
_dafff .Data [_cafagd +_dcda ]=^(_fagb |_dafff .Data [_cafagd +_dcda ]);};_cafagd +=_dafff .RowStride ;_geed +=_fcaf .RowStride ;};};if _efcb {for _cgda =0;_cgda < _adee ;_cgda ++{_fagb =_fcaf .Data [_gfgd ]<<_adcb ;if _bcffee {_fagb =_gega (_fagb ,_fcaf .Data [_gfgd +1]>>_eddgf ,_fddbc );
|
|
};_dafff .Data [_faac ]=_gega (_dafff .Data [_faac ],^(_fagb |_dafff .Data [_faac ]),_aagc );_faac +=_dafff .RowStride ;_gfgd +=_fcaf .RowStride ;};};case PixNotPixSrcAndDst :if _ggeb {for _cgda =0;_cgda < _adee ;_cgda ++{if _aabe ==_fefdd {_fagb =_fcaf .Data [_ffeeg ]<<_adcb ;
|
|
if _begc {_fagb =_gega (_fagb ,_fcaf .Data [_ffeeg +1]>>_eddgf ,_fddbc );};}else {_fagb =_fcaf .Data [_ffeeg ]>>_eddgf ;};_dafff .Data [_cfaa ]=_gega (_dafff .Data [_cfaa ],^(_fagb &_dafff .Data [_cfaa ]),_dag );_cfaa +=_dafff .RowStride ;_ffeeg +=_fcaf .RowStride ;
|
|
};};if _fcdc {for _cgda =0;_cgda < _adee ;_cgda ++{for _dcda =0;_dcda < _aadd ;_dcda ++{_fagb =_gega (_fcaf .Data [_geed +_dcda ]<<_adcb ,_fcaf .Data [_geed +_dcda +1]>>_eddgf ,_fddbc );_dafff .Data [_cafagd +_dcda ]=^(_fagb &_dafff .Data [_cafagd +_dcda ]);
|
|
};_cafagd +=_dafff .RowStride ;_geed +=_fcaf .RowStride ;};};if _efcb {for _cgda =0;_cgda < _adee ;_cgda ++{_fagb =_fcaf .Data [_gfgd ]<<_adcb ;if _bcffee {_fagb =_gega (_fagb ,_fcaf .Data [_gfgd +1]>>_eddgf ,_fddbc );};_dafff .Data [_faac ]=_gega (_dafff .Data [_faac ],^(_fagb &_dafff .Data [_faac ]),_aagc );
|
|
_faac +=_dafff .RowStride ;_gfgd +=_fcaf .RowStride ;};};case PixNotPixSrcXorDst :if _ggeb {for _cgda =0;_cgda < _adee ;_cgda ++{if _aabe ==_fefdd {_fagb =_fcaf .Data [_ffeeg ]<<_adcb ;if _begc {_fagb =_gega (_fagb ,_fcaf .Data [_ffeeg +1]>>_eddgf ,_fddbc );
|
|
};}else {_fagb =_fcaf .Data [_ffeeg ]>>_eddgf ;};_dafff .Data [_cfaa ]=_gega (_dafff .Data [_cfaa ],^(_fagb ^_dafff .Data [_cfaa ]),_dag );_cfaa +=_dafff .RowStride ;_ffeeg +=_fcaf .RowStride ;};};if _fcdc {for _cgda =0;_cgda < _adee ;_cgda ++{for _dcda =0;
|
|
_dcda < _aadd ;_dcda ++{_fagb =_gega (_fcaf .Data [_geed +_dcda ]<<_adcb ,_fcaf .Data [_geed +_dcda +1]>>_eddgf ,_fddbc );_dafff .Data [_cafagd +_dcda ]=^(_fagb ^_dafff .Data [_cafagd +_dcda ]);};_cafagd +=_dafff .RowStride ;_geed +=_fcaf .RowStride ;};
|
|
};if _efcb {for _cgda =0;_cgda < _adee ;_cgda ++{_fagb =_fcaf .Data [_gfgd ]<<_adcb ;if _bcffee {_fagb =_gega (_fagb ,_fcaf .Data [_gfgd +1]>>_eddgf ,_fddbc );};_dafff .Data [_faac ]=_gega (_dafff .Data [_faac ],^(_fagb ^_dafff .Data [_faac ]),_aagc );
|
|
_faac +=_dafff .RowStride ;_gfgd +=_fcaf .RowStride ;};};default:_dd .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",_ddefe );
|
|
return _f .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 _acb (_efga ,_bcea *Bitmap ,_fccaf ,_gdgfa int )(*Bitmap ,error ){const _aebag ="\u0063\u006c\u006f\u0073\u0065\u0042\u0072\u0069\u0063\u006b";if _bcea ==nil {return nil ,_f .Error (_aebag ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if _fccaf < 1||_gdgfa < 1{return nil ,_f .Error (_aebag ,"\u0068S\u0069\u007a\u0065\u0020\u0061\u006e\u0064\u0020\u0076\u0053\u0069z\u0065\u0020\u006e\u006f\u0074\u0020\u003e\u003d\u0020\u0031");};if _fccaf ==1&&_gdgfa ==1{return _bcea .Copy (),nil ;
|
|
};if _fccaf ==1||_gdgfa ==1{_ccfg :=SelCreateBrick (_gdgfa ,_fccaf ,_gdgfa /2,_fccaf /2,SelHit );var _ebca error ;_efga ,_ebca =_fbcb (_efga ,_bcea ,_ccfg );if _ebca !=nil {return nil ,_f .Wrap (_ebca ,_aebag ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _efga ,nil ;};_bbgb :=SelCreateBrick (1,_fccaf ,0,_fccaf /2,SelHit );_bcffe :=SelCreateBrick (_gdgfa ,1,_gdgfa /2,0,SelHit );_bdcf ,_fdce :=_fdff (nil ,_bcea ,_bbgb );if _fdce !=nil {return nil ,_f .Wrap (_fdce ,_aebag ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
};if _efga ,_fdce =_fdff (_efga ,_bdcf ,_bcffe );_fdce !=nil {return nil ,_f .Wrap (_fdce ,_aebag ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};if _ ,_fdce =_cdcf (_bdcf ,_efga ,_bbgb );_fdce !=nil {return nil ,_f .Wrap (_fdce ,_aebag ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");
|
|
};if _ ,_fdce =_cdcf (_efga ,_bdcf ,_bcffe );_fdce !=nil {return nil ,_f .Wrap (_fdce ,_aebag ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};return _efga ,nil ;};const (_ SizeSelection =iota ;SizeSelectByWidth ;SizeSelectByHeight ;SizeSelectByMaxDimension ;
|
|
SizeSelectByArea ;SizeSelectByPerimeter ;);func ClipBoxToRectangle (box *_ab .Rectangle ,wi ,hi int )(_aacg *_ab .Rectangle ,_cbe error ){const _caeb ="\u0043l\u0069p\u0042\u006f\u0078\u0054\u006fR\u0065\u0063t\u0061\u006e\u0067\u006c\u0065";if box ==nil {return nil ,_f .Error (_caeb ,"\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 ,_f .Error (_caeb ,"\u0027\u0062\u006fx'\u0020\u006f\u0075\u0074\u0073\u0069\u0064\u0065\u0020\u0072\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065");};_bagfe :=*box ;
|
|
_aacg =&_bagfe ;if _aacg .Min .X < 0{_aacg .Max .X +=_aacg .Min .X ;_aacg .Min .X =0;};if _aacg .Min .Y < 0{_aacg .Max .Y +=_aacg .Min .Y ;_aacg .Min .Y =0;};if _aacg .Max .X > wi {_aacg .Max .X =wi ;};if _aacg .Max .Y > hi {_aacg .Max .Y =hi ;};return _aacg ,nil ;
|
|
};func _eeed (_dgge *Bitmap )(_eeee *Bitmap ,_fbceg int ,_dfagc error ){const _cgeg ="\u0042i\u0074\u006d\u0061\u0070.\u0077\u006f\u0072\u0064\u004da\u0073k\u0042y\u0044\u0069\u006c\u0061\u0074\u0069\u006fn";if _dgge ==nil {return nil ,0,_f .Errorf (_cgeg ,"\u0027\u0073\u0027\u0020bi\u0074\u006d\u0061\u0070\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006ee\u0064");
|
|
};var _ceeg ,_abef *Bitmap ;if _ceeg ,_dfagc =_gcff (nil ,_dgge );_dfagc !=nil {return nil ,0,_f .Wrap (_dfagc ,_cgeg ,"\u0063\u006f\u0070\u0079\u0020\u0027\u0073\u0027");};var (_eadc [13]int ;_bdag ,_aeaf int ;);_dccb :=12;_dabbe :=_dg .NewNumSlice (_dccb +1);
|
|
_eeggc :=_dg .NewNumSlice (_dccb +1);var _fdfe *Boxes ;for _dgfg :=0;_dgfg <=_dccb ;_dgfg ++{if _dgfg ==0{if _abef ,_dfagc =_gcff (nil ,_ceeg );_dfagc !=nil {return nil ,0,_f .Wrap (_dfagc ,_cgeg ,"\u0066i\u0072\u0073\u0074\u0020\u0062\u006d2");};}else {if _abef ,_dfagc =_bfcdc (_ceeg ,MorphProcess {Operation :MopDilation ,Arguments :[]int {2,1}});
|
|
_dfagc !=nil {return nil ,0,_f .Wrap (_dfagc ,_cgeg ,"\u0064\u0069\u006ca\u0074\u0069\u006f\u006e\u0020\u0062\u006d\u0032");};};if _fdfe ,_dfagc =_abef .connComponentsBB (4);_dfagc !=nil {return nil ,0,_f .Wrap (_dfagc ,_cgeg ,"");};_eadc [_dgfg ]=len (*_fdfe );
|
|
_dabbe .AddInt (_eadc [_dgfg ]);switch _dgfg {case 0:_bdag =_eadc [0];default:_aeaf =_eadc [_dgfg -1]-_eadc [_dgfg ];_eeggc .AddInt (_aeaf );};_ceeg =_abef ;};_gcga :=true ;_aebd :=2;var _ccfb ,_aggg int ;for _fagad :=1;_fagad < len (*_eeggc );_fagad ++{if _ccfb ,_dfagc =_dabbe .GetInt (_fagad );
|
|
_dfagc !=nil {return nil ,0,_f .Wrap (_dfagc ,_cgeg ,"\u0043\u0068\u0065\u0063ki\u006e\u0067\u0020\u0062\u0065\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0069o\u006e");};if _gcga &&_ccfb < int (0.3*float32 (_bdag )){_aebd =_fagad +1;_gcga =false ;
|
|
};if _aeaf ,_dfagc =_eeggc .GetInt (_fagad );_dfagc !=nil {return nil ,0,_f .Wrap (_dfagc ,_cgeg ,"\u0067\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u006ea\u0044\u0069\u0066\u0066");};if _aeaf > _aggg {_aggg =_aeaf ;};};_cgef :=_dgge .XResolution ;if _cgef ==0{_cgef =150;
|
|
};if _cgef > 110{_aebd ++;};if _aebd < 2{_dd .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");
|
|
_aebd =2;};_fbceg =_aebd +1;if _eeee ,_dfagc =_acb (nil ,_dgge ,_aebd +1,1);_dfagc !=nil {return nil ,0,_f .Wrap (_dfagc ,_cgeg ,"\u0067\u0065\u0074\u0074in\u0067\u0020\u006d\u0061\u0073\u006b\u0020\u0066\u0061\u0069\u006c\u0065\u0064");};return _eeee ,_fbceg ,nil ;
|
|
};func _cedf (_baafg *Bitmap ,_cgbe *_dg .Stack ,_adef ,_bbgbe int )(_cgcb *_ab .Rectangle ,_fdga error ){const _bgbg ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";if _baafg ==nil {return nil ,_f .Error (_bgbg ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");
|
|
};if _cgbe ==nil {return nil ,_f .Error (_bgbg ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");};_eafbb ,_cddg :=_baafg .Width ,_baafg .Height ;_efdag :=_eafbb -1;_efefb :=_cddg -1;if _adef < 0||_adef > _efdag ||_bbgbe < 0||_bbgbe > _efefb ||!_baafg .GetPixel (_adef ,_bbgbe ){return nil ,nil ;
|
|
};_bgac :=_ab .Rect (100000,100000,0,0);if _fdga =_cdbeb (_cgbe ,_adef ,_adef ,_bbgbe ,1,_efefb ,&_bgac );_fdga !=nil {return nil ,_f .Wrap (_fdga ,_bgbg ,"\u0069\u006e\u0069t\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _fdga =_cdbeb (_cgbe ,_adef ,_adef ,_bbgbe +1,-1,_efefb ,&_bgac );
|
|
_fdga !=nil {return nil ,_f .Wrap (_fdga ,_bgbg ,"\u0032\u006ed\u0020\u0069\u006ei\u0074\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};_bgac .Min .X ,_bgac .Max .X =_adef ,_adef ;_bgac .Min .Y ,_bgac .Max .Y =_bbgbe ,_bbgbe ;var (_dfea *fillSegment ;
|
|
_edfb int ;);for _cgbe .Len ()> 0{if _dfea ,_fdga =_dbcg (_cgbe );_fdga !=nil {return nil ,_f .Wrap (_fdga ,_bgbg ,"");};_bbgbe =_dfea ._cccf ;for _adef =_dfea ._gcda -1;_adef >=0&&_baafg .GetPixel (_adef ,_bbgbe );_adef --{if _fdga =_baafg .SetPixel (_adef ,_bbgbe ,0);
|
|
_fdga !=nil {return nil ,_f .Wrap (_fdga ,_bgbg ,"\u0031s\u0074\u0020\u0073\u0065\u0074");};};if _adef >=_dfea ._gcda -1{for {for _adef ++;_adef <=_dfea ._dbcd +1&&_adef <=_efdag &&!_baafg .GetPixel (_adef ,_bbgbe );_adef ++{};_edfb =_adef ;if !(_adef <=_dfea ._dbcd +1&&_adef <=_efdag ){break ;
|
|
};for ;_adef <=_efdag &&_baafg .GetPixel (_adef ,_bbgbe );_adef ++{if _fdga =_baafg .SetPixel (_adef ,_bbgbe ,0);_fdga !=nil {return nil ,_f .Wrap (_fdga ,_bgbg ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _fdga =_cdbeb (_cgbe ,_edfb ,_adef -1,_dfea ._cccf ,_dfea ._cefc ,_efefb ,&_bgac );
|
|
_fdga !=nil {return nil ,_f .Wrap (_fdga ,_bgbg ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _adef > _dfea ._dbcd {if _fdga =_cdbeb (_cgbe ,_dfea ._dbcd +1,_adef -1,_dfea ._cccf ,-_dfea ._cefc ,_efefb ,&_bgac );_fdga !=nil {return nil ,_f .Wrap (_fdga ,_bgbg ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");
|
|
};};};continue ;};_edfb =_adef +1;if _edfb < _dfea ._gcda {if _fdga =_cdbeb (_cgbe ,_edfb ,_dfea ._gcda -1,_dfea ._cccf ,-_dfea ._cefc ,_efefb ,&_bgac );_fdga !=nil {return nil ,_f .Wrap (_fdga ,_bgbg ,"\u006c\u0065\u0061\u006b\u0020\u006f\u006e\u0020\u006c\u0065\u0066\u0074 \u0073\u0069\u0064\u0065");
|
|
};};_adef =_dfea ._gcda ;for {for ;_adef <=_efdag &&_baafg .GetPixel (_adef ,_bbgbe );_adef ++{if _fdga =_baafg .SetPixel (_adef ,_bbgbe ,0);_fdga !=nil {return nil ,_f .Wrap (_fdga ,_bgbg ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _fdga =_cdbeb (_cgbe ,_edfb ,_adef -1,_dfea ._cccf ,_dfea ._cefc ,_efefb ,&_bgac );
|
|
_fdga !=nil {return nil ,_f .Wrap (_fdga ,_bgbg ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _adef > _dfea ._dbcd {if _fdga =_cdbeb (_cgbe ,_dfea ._dbcd +1,_adef -1,_dfea ._cccf ,-_dfea ._cefc ,_efefb ,&_bgac );_fdga !=nil {return nil ,_f .Wrap (_fdga ,_bgbg ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");
|
|
};};for _adef ++;_adef <=_dfea ._dbcd +1&&_adef <=_efdag &&!_baafg .GetPixel (_adef ,_bbgbe );_adef ++{};_edfb =_adef ;if !(_adef <=_dfea ._dbcd +1&&_adef <=_efdag ){break ;};};};_bgac .Max .X ++;_bgac .Max .Y ++;return &_bgac ,nil ;};func Centroid (bm *Bitmap ,centTab ,sumTab []int )(Point ,error ){return bm .centroid (centTab ,sumTab )};
|
|
type SelectionValue int ;func SelCreateBrick (h ,w int ,cy ,cx int ,tp SelectionValue )*Selection {_geaa :=_bgab (h ,w ,"");_geaa .setOrigin (cy ,cx );var _fecc ,_dbde int ;for _fecc =0;_fecc < h ;_fecc ++{for _dbde =0;_dbde < w ;_dbde ++{_geaa .Data [_fecc ][_dbde ]=tp ;
|
|
};};return _geaa ;};func (_bda *Bitmap )GetBitOffset (x int )int {return x &0x07};func (_eace Points )GetIntY (i int )(int ,error ){if i >=len (_eace ){return 0,_f .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 (_eace [i ].Y ),nil ;};func (_eadb *Bitmap )thresholdPixelSum (_baed int )bool {var (_fbf int ;_gea uint8 ;_dfe byte ;_fcfc int ;);_gbf :=_eadb .RowStride ;_feb :=uint (_eadb .Width &0x07);if _feb !=0{_gea =uint8 ((0xff<<(8-_feb ))&0xff);_gbf --;
|
|
};for _dbgc :=0;_dbgc < _eadb .Height ;_dbgc ++{for _fcfc =0;_fcfc < _gbf ;_fcfc ++{_dfe =_eadb .Data [_dbgc *_eadb .RowStride +_fcfc ];_fbf +=int (_dabe [_dfe ]);};if _feb !=0{_dfe =_eadb .Data [_dbgc *_eadb .RowStride +_fcfc ]&_gea ;_fbf +=int (_dabe [_dfe ]);
|
|
};if _fbf > _baed {return true ;};};return false ;};func _gcab (_ebeg *Bitmap ,_bfdc *Bitmap ,_gbbg *Selection ,_decd **Bitmap )(*Bitmap ,error ){const _fadd ="\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u004d\u006f\u0072\u0070\u0068A\u0072\u0067\u0073\u0031";
|
|
if _bfdc ==nil {return nil ,_f .Error (_fadd ,"\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 _gbbg ==nil {return nil ,_f .Error (_fadd ,"\u004d\u006f\u0072\u0068p\u0041\u0072\u0067\u0073\u0031\u0020\u0027\u0073\u0065\u006c'\u0020n\u006f\u0074\u0020\u0064\u0065\u0066\u0069n\u0065\u0064");
|
|
};_cedc ,_dbaf :=_gbbg .Height ,_gbbg .Width ;if _cedc ==0||_dbaf ==0{return nil ,_f .Error (_fadd ,"\u0073\u0065\u006c\u0065ct\u0069\u006f\u006e\u0020\u006f\u0066\u0020\u0073\u0069\u007a\u0065\u0020\u0030");};if _ebeg ==nil {_ebeg =_bfdc .createTemplate ();
|
|
*_decd =_bfdc ;return _ebeg ,nil ;};_ebeg .Width =_bfdc .Width ;_ebeg .Height =_bfdc .Height ;_ebeg .RowStride =_bfdc .RowStride ;_ebeg .Color =_bfdc .Color ;_ebeg .Data =make ([]byte ,_bfdc .RowStride *_bfdc .Height );if _ebeg ==_bfdc {*_decd =_bfdc .Copy ();
|
|
}else {*_decd =_bfdc ;};return _ebeg ,nil ;};func (_ggbg *ClassedPoints )GroupByY ()([]*ClassedPoints ,error ){const _faddd ="\u0043\u006c\u0061\u0073se\u0064\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0072\u006f\u0075\u0070\u0042y\u0059";if _afb :=_ggbg .validateIntSlice ();
|
|
_afb !=nil {return nil ,_f .Wrap (_afb ,_faddd ,"");};if _ggbg .IntSlice .Size ()==0{return nil ,_f .Error (_faddd ,"\u004e\u006f\u0020\u0063la\u0073\u0073\u0065\u0073\u0020\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064");};_ggbg .SortByY ();var (_agaa []*ClassedPoints ;
|
|
_fbgf int ;);_fgeeg :=-1;var _dfb *ClassedPoints ;for _fbdc :=0;_fbdc < len (_ggbg .IntSlice );_fbdc ++{_fbgf =int (_ggbg .YAtIndex (_fbdc ));if _fbgf !=_fgeeg {_dfb =&ClassedPoints {Points :_ggbg .Points };_fgeeg =_fbgf ;_agaa =append (_agaa ,_dfb );};
|
|
_dfb .IntSlice =append (_dfb .IntSlice ,_ggbg .IntSlice [_fbdc ]);};for _ ,_eggf :=range _agaa {_eggf .SortByX ();};return _agaa ,nil ;};func TstPSymbol (t *_g .T )*Bitmap {t .Helper ();_ggae :=New (5,8);_d .NoError (t ,_ggae .SetPixel (0,0,1));_d .NoError (t ,_ggae .SetPixel (1,0,1));
|
|
_d .NoError (t ,_ggae .SetPixel (2,0,1));_d .NoError (t ,_ggae .SetPixel (3,0,1));_d .NoError (t ,_ggae .SetPixel (4,1,1));_d .NoError (t ,_ggae .SetPixel (0,1,1));_d .NoError (t ,_ggae .SetPixel (4,2,1));_d .NoError (t ,_ggae .SetPixel (0,2,1));_d .NoError (t ,_ggae .SetPixel (4,3,1));
|
|
_d .NoError (t ,_ggae .SetPixel (0,3,1));_d .NoError (t ,_ggae .SetPixel (0,4,1));_d .NoError (t ,_ggae .SetPixel (1,4,1));_d .NoError (t ,_ggae .SetPixel (2,4,1));_d .NoError (t ,_ggae .SetPixel (3,4,1));_d .NoError (t ,_ggae .SetPixel (0,5,1));_d .NoError (t ,_ggae .SetPixel (0,6,1));
|
|
_d .NoError (t ,_ggae .SetPixel (0,7,1));return _ggae ;};type Points []Point ;func _afbb (_gcdd *Bitmap ,_efdb *_dg .Stack ,_bcad ,_bdage ,_cdgd int )(_bfag *_ab .Rectangle ,_aagf error ){const _adcg ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";
|
|
if _gcdd ==nil {return nil ,_f .Error (_adcg ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");};if _efdb ==nil {return nil ,_f .Error (_adcg ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");
|
|
};switch _cdgd {case 4:if _bfag ,_aagf =_efab (_gcdd ,_efdb ,_bcad ,_bdage );_aagf !=nil {return nil ,_f .Wrap (_aagf ,_adcg ,"");};return _bfag ,nil ;case 8:if _bfag ,_aagf =_cedf (_gcdd ,_efdb ,_bcad ,_bdage );_aagf !=nil {return nil ,_f .Wrap (_aagf ,_adcg ,"");
|
|
};return _bfag ,nil ;default:return nil ,_f .Errorf (_adcg ,"\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",_cdgd );
|
|
};};func TstESymbol (t *_g .T ,scale ...int )*Bitmap {_caebd ,_aeae :=NewWithData (4,5,[]byte {0xF0,0x80,0xE0,0x80,0xF0});_d .NoError (t ,_aeae );return TstGetScaledSymbol (t ,_caebd ,scale ...);};var (_efff *Bitmap ;_eeeeff *Bitmap ;);func (_gdef *Bitmaps )selectByIndexes (_bdaed []int )(*Bitmaps ,error ){_dbgcg :=&Bitmaps {};
|
|
for _ ,_eggca :=range _bdaed {_fcfg ,_fecg :=_gdef .GetBitmap (_eggca );if _fecg !=nil {return nil ,_f .Wrap (_fecg ,"\u0073e\u006ce\u0063\u0074\u0042\u0079\u0049\u006e\u0064\u0065\u0078\u0065\u0073","");};_dbgcg .AddBitmap (_fcfg );};return _dbgcg ,nil ;
|
|
};func CombineBytes (oldByte ,newByte byte ,op CombinationOperator )byte {return _faff (oldByte ,newByte ,op );};var (_feab =_ccd ();_ffee =_cec ();_faae =_ecd (););func (_aebe Points )Get (i int )(Point ,error ){if i > len (_aebe )-1{return Point {},_f .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 _aebe [i ],nil ;};func (_baacd *ClassedPoints )Less (i ,j int )bool {return _baacd ._beeeb (i ,j )};func (_dacc *Bitmaps )Size ()int {return len (_dacc .Values )};func _caeg (_bedg *Bitmap ,_aeab ,_adgd ,_eage ,_fgdg int ,_ddec RasterOperator ,_edca *Bitmap ,_dbabb ,_fdffb int )error {const _ebdad ="\u0072a\u0073t\u0065\u0072\u004f\u0070\u0065\u0072\u0061\u0074\u0069\u006f\u006e";
|
|
if _bedg ==nil {return _f .Error (_ebdad ,"\u006e\u0069\u006c\u0020\u0027\u0064\u0065\u0073\u0074\u0027\u0020\u0042i\u0074\u006d\u0061\u0070");};if _ddec ==PixDst {return nil ;};switch _ddec {case PixClr ,PixSet ,PixNotDst :_gfcg (_bedg ,_aeab ,_adgd ,_eage ,_fgdg ,_ddec );
|
|
return nil ;};if _edca ==nil {_dd .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 _f .Error (_ebdad ,"\u006e\u0069l\u0020\u0027\u0073r\u0063\u0027\u0020\u0062\u0069\u0074\u006d\u0061\u0070");};if _efbb :=_daee (_bedg ,_aeab ,_adgd ,_eage ,_fgdg ,_ddec ,_edca ,_dbabb ,_fdffb );_efbb !=nil {return _f .Wrap (_efbb ,_ebdad ,"");};
|
|
return nil ;};func _bfada (_gdgd ,_fbag int )int {if _gdgd < _fbag {return _gdgd ;};return _fbag ;};func _gfcg (_adaed *Bitmap ,_gcde ,_cfad ,_dbgcc ,_begf int ,_fccfg RasterOperator ){if _gcde < 0{_dbgcc +=_gcde ;_gcde =0;};_ccfc :=_gcde +_dbgcc -_adaed .Width ;
|
|
if _ccfc > 0{_dbgcc -=_ccfc ;};if _cfad < 0{_begf +=_cfad ;_cfad =0;};_edda :=_cfad +_begf -_adaed .Height ;if _edda > 0{_begf -=_edda ;};if _dbgcc <=0||_begf <=0{return ;};if (_gcde &7)==0{_ebbe (_adaed ,_gcde ,_cfad ,_dbgcc ,_begf ,_fccfg );}else {_gfce (_adaed ,_gcde ,_cfad ,_dbgcc ,_begf ,_fccfg );
|
|
};};func (_debag Points )YSorter ()func (_ebfc ,_cbaae int )bool {return func (_ecba ,_fcae int )bool {return _debag [_ecba ].Y < _debag [_fcae ].Y };};func Dilate (d *Bitmap ,s *Bitmap ,sel *Selection )(*Bitmap ,error ){return _fdff (d ,s ,sel )};type Bitmap struct{Width ,Height int ;
|
|
BitmapNumber int ;RowStride int ;Data []byte ;Color Color ;Special int ;Text string ;XResolution ,YResolution int ;};func _dddg (_fdde ,_cabb ,_egfa *Bitmap )(*Bitmap ,error ){const _affc ="\u0062\u0069\u0074\u006d\u0061\u0070\u002e\u0078\u006f\u0072";
|
|
if _cabb ==nil {return nil ,_f .Error (_affc ,"'\u0062\u0031\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _egfa ==nil {return nil ,_f .Error (_affc ,"'\u0062\u0032\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _fdde ==_egfa {return nil ,_f .Error (_affc ,"'\u0064\u0027\u0020\u003d\u003d\u0020\u0027\u0062\u0032\u0027");
|
|
};if !_cabb .SizesEqual (_egfa ){_dd .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",_affc );
|
|
};var _bdgce error ;if _fdde ,_bdgce =_gcff (_fdde ,_cabb );_bdgce !=nil {return nil ,_f .Wrap (_bdgce ,_affc ,"\u0063\u0061n\u0027\u0074\u0020c\u0072\u0065\u0061\u0074\u0065\u0020\u0027\u0064\u0027");};if _bdgce =_fdde .RasterOperation (0,0,_fdde .Width ,_fdde .Height ,PixSrcXorDst ,_egfa ,0,0);
|
|
_bdgce !=nil {return nil ,_f .Wrap (_bdgce ,_affc ,"");};return _fdde ,nil ;};const (CmbOpOr CombinationOperator =iota ;CmbOpAnd ;CmbOpXor ;CmbOpXNor ;CmbOpReplace ;CmbOpNot ;);func (_gfaba *byHeight )Swap (i ,j int ){_gfaba .Values [i ],_gfaba .Values [j ]=_gfaba .Values [j ],_gfaba .Values [i ];
|
|
if _gfaba .Boxes !=nil {_gfaba .Boxes [i ],_gfaba .Boxes [j ]=_gfaba .Boxes [j ],_gfaba .Boxes [i ];};};func _eade (_fgeac uint ,_bbcb byte )byte {return _bbcb >>_fgeac <<_fgeac };func (_cbag *Bitmap )nextOnPixelLow (_fgfg ,_edaa ,_gef ,_bea ,_bgf int )(_ggba _ab .Point ,_bfg bool ,_agga error ){const _beb ="B\u0069\u0074\u006d\u0061p.\u006ee\u0078\u0074\u004f\u006e\u0050i\u0078\u0065\u006c\u004c\u006f\u0077";
|
|
var (_eff int ;_fegd byte ;);_decg :=_bgf *_gef ;_bgg :=_decg +(_bea /8);if _fegd ,_agga =_cbag .GetByte (_bgg );_agga !=nil {return _ggba ,false ,_f .Wrap (_agga ,_beb ,"\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 _fegd !=0{_dgfe :=_bea -(_bea %8)+7;for _eff =_bea ;_eff <=_dgfe &&_eff < _fgfg ;_eff ++{if _cbag .GetPixel (_eff ,_bgf ){_ggba .X =_eff ;_ggba .Y =_bgf ;return _ggba ,true ,nil ;};};};_fafd :=(_bea /8)+1;_eff =8*_fafd ;var _gcae int ;for _bgg =_decg +_fafd ;
|
|
_eff < _fgfg ;_bgg ,_eff =_bgg +1,_eff +8{if _fegd ,_agga =_cbag .GetByte (_bgg );_agga !=nil {return _ggba ,false ,_f .Wrap (_agga ,_beb ,"r\u0065\u0073\u0074\u0020of\u0020t\u0068\u0065\u0020\u006c\u0069n\u0065\u0020\u0062\u0079\u0074\u0065");};if _fegd ==0{continue ;
|
|
};for _gcae =0;_gcae < 8&&_eff < _fgfg ;_gcae ,_eff =_gcae +1,_eff +1{if _cbag .GetPixel (_eff ,_bgf ){_ggba .X =_eff ;_ggba .Y =_bgf ;return _ggba ,true ,nil ;};};};for _adbc :=_bgf +1;_adbc < _edaa ;_adbc ++{_decg =_adbc *_gef ;for _bgg ,_eff =_decg ,0;
|
|
_eff < _fgfg ;_bgg ,_eff =_bgg +1,_eff +8{if _fegd ,_agga =_cbag .GetByte (_bgg );_agga !=nil {return _ggba ,false ,_f .Wrap (_agga ,_beb ,"\u0066o\u006cl\u006f\u0077\u0069\u006e\u0067\u0020\u006c\u0069\u006e\u0065\u0073");};if _fegd ==0{continue ;};for _gcae =0;
|
|
_gcae < 8&&_eff < _fgfg ;_gcae ,_eff =_gcae +1,_eff +1{if _cbag .GetPixel (_eff ,_adbc ){_ggba .X =_eff ;_ggba .Y =_adbc ;return _ggba ,true ,nil ;};};};};return _ggba ,false ,nil ;};func (_cbdg *Boxes )selectWithIndicator (_bead *_dg .NumSlice )(_aed *Boxes ,_effa error ){const _febc ="\u0042o\u0078\u0065\u0073\u002es\u0065\u006c\u0065\u0063\u0074W\u0069t\u0068I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";
|
|
if _cbdg ==nil {return nil ,_f .Error (_febc ,"b\u006f\u0078\u0065\u0073 '\u0062'\u0020\u006e\u006f\u0074\u0020d\u0065\u0066\u0069\u006e\u0065\u0064");};if _bead ==nil {return nil ,_f .Error (_febc ,"\u0027\u006ea\u0027\u0020\u006eo\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};if len (*_bead )!=len (*_cbdg ){return nil ,_f .Error (_febc ,"\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 _dfad ,_bgdg int ;for _cacd :=0;_cacd < len (*_bead );_cacd ++{if _dfad ,_effa =_bead .GetInt (_cacd );_effa !=nil {return nil ,_f .Wrap (_effa ,_febc ,"\u0063\u0068\u0065\u0063\u006b\u0069\u006e\u0067\u0020c\u006f\u0075\u006e\u0074");};if _dfad ==1{_bgdg ++;
|
|
};};if _bgdg ==len (*_cbdg ){return _cbdg ,nil ;};_bagf :=Boxes {};for _fbb :=0;_fbb < len (*_bead );_fbb ++{_dfad =int ((*_bead )[_fbb ]);if _dfad ==0{continue ;};_bagf =append (_bagf ,(*_cbdg )[_fbb ]);};_aed =&_bagf ;return _aed ,nil ;};func (_ffa *Bitmap )centroid (_dde ,_cddff []int )(Point ,error ){_aedda :=Point {};
|
|
_ffa .setPadBits (0);if len (_dde )==0{_dde =_efdae ();};if len (_cddff )==0{_cddff =_gbc ();};var _aab ,_abbcd ,_efeb ,_eecc ,_cfaee ,_dggb int ;var _bga byte ;for _cfaee =0;_cfaee < _ffa .Height ;_cfaee ++{_ffdb :=_ffa .RowStride *_cfaee ;_eecc =0;for _dggb =0;
|
|
_dggb < _ffa .RowStride ;_dggb ++{_bga =_ffa .Data [_ffdb +_dggb ];if _bga !=0{_eecc +=_cddff [_bga ];_aab +=_dde [_bga ]+_dggb *8*_cddff [_bga ];};};_efeb +=_eecc ;_abbcd +=_eecc *_cfaee ;};if _efeb !=0{_aedda .X =float32 (_aab )/float32 (_efeb );_aedda .Y =float32 (_abbcd )/float32 (_efeb );
|
|
};return _aedda ,nil ;};func RasterOperation (dest *Bitmap ,dx ,dy ,dw ,dh int ,op RasterOperator ,src *Bitmap ,sx ,sy int )error {return _caeg (dest ,dx ,dy ,dw ,dh ,op ,src ,sx ,sy );};func (_fbgbe *Bitmaps )SelectByIndexes (idx []int )(*Bitmaps ,error ){const _gfef ="B\u0069\u0074\u006d\u0061\u0070\u0073.\u0053\u006f\u0072\u0074\u0049\u006e\u0064\u0065\u0078e\u0073\u0042\u0079H\u0065i\u0067\u0068\u0074";
|
|
_bffgd ,_baf :=_fbgbe .selectByIndexes (idx );if _baf !=nil {return nil ,_f .Wrap (_baf ,_gfef ,"");};return _bffgd ,nil ;};func (_afc *Bitmap )SetPadBits (value int ){_afc .setPadBits (value )};func (_dcc *Bitmap )inverseData (){if _feag :=_dcc .RasterOperation (0,0,_dcc .Width ,_dcc .Height ,PixNotDst ,nil ,0,0);
|
|
_feag !=nil {_dd .Log .Debug ("\u0049n\u0076\u0065\u0072\u0073e\u0020\u0064\u0061\u0074\u0061 \u0066a\u0069l\u0065\u0064\u003a\u0020\u0027\u0025\u0076'",_feag );};if _dcc .Color ==Chocolate {_dcc .Color =Vanilla ;}else {_dcc .Color =Chocolate ;};};func (_ddbe *Bitmap )setEightFullBytes (_ecfd int ,_fda uint64 )error {if _ecfd +7> len (_ddbe .Data )-1{return _f .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");
|
|
};_ddbe .Data [_ecfd ]=byte ((_fda &0xff00000000000000)>>56);_ddbe .Data [_ecfd +1]=byte ((_fda &0xff000000000000)>>48);_ddbe .Data [_ecfd +2]=byte ((_fda &0xff0000000000)>>40);_ddbe .Data [_ecfd +3]=byte ((_fda &0xff00000000)>>32);_ddbe .Data [_ecfd +4]=byte ((_fda &0xff000000)>>24);
|
|
_ddbe .Data [_ecfd +5]=byte ((_fda &0xff0000)>>16);_ddbe .Data [_ecfd +6]=byte ((_fda &0xff00)>>8);_ddbe .Data [_ecfd +7]=byte (_fda &0xff);return nil ;};func (_cfaae *Selection )setOrigin (_cgbee ,_aegb int ){_cfaae .Cy ,_cfaae .Cx =_cgbee ,_aegb };func (_addf *Bitmap )AddBorderGeneral (left ,right ,top ,bot int ,val int )(*Bitmap ,error ){return _addf .addBorderGeneral (left ,right ,top ,bot ,val );
|
|
};func _dbcg (_aaga *_dg .Stack )(_afdcd *fillSegment ,_eggc error ){const _gfba ="\u0070\u006f\u0070\u0046\u0069\u006c\u006c\u0053\u0065g\u006d\u0065\u006e\u0074";if _aaga ==nil {return nil ,_f .Error (_gfba ,"\u006ei\u006c \u0073\u0074\u0061\u0063\u006b \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");
|
|
};if _aaga .Aux ==nil {return nil ,_f .Error (_gfba ,"a\u0075x\u0053\u0074\u0061\u0063\u006b\u0020\u006e\u006ft\u0020\u0064\u0065\u0066in\u0065\u0064");};_fcef ,_aegc :=_aaga .Pop ();if !_aegc {return nil ,nil ;};_bdacg ,_aegc :=_fcef .(*fillSegment );
|
|
if !_aegc {return nil ,_f .Error (_gfba ,"\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");};_afdcd =&fillSegment {_bdacg ._gcda ,_bdacg ._dbcd ,_bdacg ._cccf +_bdacg ._cefc ,_bdacg ._cefc };
|
|
_aaga .Aux .Push (_bdacg );return _afdcd ,nil ;};func TstImageBitmapInverseData ()[]byte {_fgagd :=_eeeeff .Copy ();_fgagd .InverseData ();return _fgagd .Data ;};func _eeaf (_fed ,_adbgb *Bitmap ,_fceg ,_gdce ,_gaga uint ,_fceb ,_eddda int ,_ffda bool ,_fdfc ,_dadf int )error {for _bdaa :=_fceb ;
|
|
_bdaa < _eddda ;_bdaa ++{if _fdfc +1< len (_fed .Data ){_gffd :=_bdaa +1==_eddda ;_geba ,_bdac :=_fed .GetByte (_fdfc );if _bdac !=nil {return _bdac ;};_fdfc ++;_geba <<=_fceg ;_dgc ,_bdac :=_fed .GetByte (_fdfc );if _bdac !=nil {return _bdac ;};_dgc >>=_gdce ;
|
|
_aedd :=_geba |_dgc ;if _gffd &&!_ffda {_aedd =_eade (_gaga ,_aedd );};_bdac =_adbgb .SetByte (_dadf ,_aedd );if _bdac !=nil {return _bdac ;};_dadf ++;if _gffd &&_ffda {_ddcc ,_dfg :=_fed .GetByte (_fdfc );if _dfg !=nil {return _dfg ;};_ddcc <<=_fceg ;
|
|
_aedd =_eade (_gaga ,_ddcc );if _dfg =_adbgb .SetByte (_dadf ,_aedd );_dfg !=nil {return _dfg ;};};continue ;};_eaadb ,_gceg :=_fed .GetByte (_fdfc );if _gceg !=nil {_dd .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",_fdfc ,_gceg );
|
|
return _gceg ;};_eaadb <<=_fceg ;_fdfc ++;_gceg =_adbgb .SetByte (_dadf ,_eaadb );if _gceg !=nil {return _gceg ;};_dadf ++;};return 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 (_feea *Bitmap )createTemplate ()*Bitmap {return &Bitmap {Width :_feea .Width ,Height :_feea .Height ,RowStride :_feea .RowStride ,Color :_feea .Color ,Text :_feea .Text ,BitmapNumber :_feea .BitmapNumber ,Special :_feea .Special ,Data :make ([]byte ,len (_feea .Data ))};
|
|
};type Color int ;type CombinationOperator int ;func _gaaab (_becg ,_fcfe *Bitmap ,_dfab ,_gfab int )(*Bitmap ,error ){const _effg ="\u0063\u006c\u006f\u0073\u0065\u0053\u0061\u0066\u0065B\u0072\u0069\u0063\u006b";if _fcfe ==nil {return nil ,_f .Error (_effg ,"\u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0069\u0073\u0020\u006e\u0069\u006c");
|
|
};if _dfab < 1||_gfab < 1{return nil ,_f .Error (_effg ,"\u0068s\u0069\u007a\u0065\u0020\u0061\u006e\u0064\u0020\u0076\u0073\u0069z\u0065\u0020\u006e\u006f\u0074\u0020\u003e\u003d\u0020\u0031");};if _dfab ==1&&_gfab ==1{return _gcff (_becg ,_fcfe );};if MorphBC ==SymmetricMorphBC {_gecb ,_fedc :=_acb (_becg ,_fcfe ,_dfab ,_gfab );
|
|
if _fedc !=nil {return nil ,_f .Wrap (_fedc ,_effg ,"\u0053\u0079m\u006d\u0065\u0074r\u0069\u0063\u004d\u006f\u0072\u0070\u0068\u0042\u0043");};return _gecb ,nil ;};_eead :=_edad (_dfab /2,_gfab /2);_gcfg :=8*((_eead +7)/8);_fdfd ,_eeba :=_fcfe .AddBorder (_gcfg ,0);
|
|
if _eeba !=nil {return nil ,_f .Wrapf (_eeba ,_effg ,"\u0042\u006f\u0072\u0064\u0065\u0072\u0053\u0069\u007ae\u003a\u0020\u0025\u0064",_gcfg );};var _bcga ,_ddef *Bitmap ;if _dfab ==1||_gfab ==1{_gfe :=SelCreateBrick (_gfab ,_dfab ,_gfab /2,_dfab /2,SelHit );
|
|
_bcga ,_eeba =_fbcb (nil ,_fdfd ,_gfe );if _eeba !=nil {return nil ,_f .Wrap (_eeba ,_effg ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");};}else {_eae :=SelCreateBrick (1,_dfab ,0,_dfab /2,SelHit );
|
|
_dfcc ,_ebff :=_fdff (nil ,_fdfd ,_eae );if _ebff !=nil {return nil ,_f .Wrap (_ebff ,_effg ,"\u0072\u0065\u0067\u0075la\u0072\u0020\u002d\u0020\u0066\u0069\u0072\u0073\u0074\u0020\u0064\u0069\u006c\u0061t\u0065");};_bfcd :=SelCreateBrick (_gfab ,1,_gfab /2,0,SelHit );
|
|
_bcga ,_ebff =_fdff (nil ,_dfcc ,_bfcd );if _ebff !=nil {return nil ,_f .Wrap (_ebff ,_effg ,"\u0072\u0065\u0067ul\u0061\u0072\u0020\u002d\u0020\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};if _ ,_ebff =_cdcf (_dfcc ,_bcga ,_eae );
|
|
_ebff !=nil {return nil ,_f .Wrap (_ebff ,_effg ,"r\u0065\u0067\u0075\u006car\u0020-\u0020\u0066\u0069\u0072\u0073t\u0020\u0065\u0072\u006f\u0064\u0065");};if _ ,_ebff =_cdcf (_bcga ,_dfcc ,_bfcd );_ebff !=nil {return nil ,_f .Wrap (_ebff ,_effg ,"\u0072\u0065\u0067\u0075la\u0072\u0020\u002d\u0020\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0065\u0072\u006fd\u0065");
|
|
};};if _ddef ,_eeba =_bcga .RemoveBorder (_gcfg );_eeba !=nil {return nil ,_f .Wrap (_eeba ,_effg ,"\u0072e\u0067\u0075\u006c\u0061\u0072");};if _becg ==nil {return _ddef ,nil ;};if _ ,_eeba =_gcff (_becg ,_ddef );_eeba !=nil {return nil ,_eeba ;};return _becg ,nil ;
|
|
};const (_fefdd shift =iota ;_efae ;);func _cbdb (_gebb ,_egcc *Bitmap ,_gfbc CombinationOperator )*Bitmap {_dffd :=New (_gebb .Width ,_gebb .Height );for _dddc :=0;_dddc < len (_dffd .Data );_dddc ++{_dffd .Data [_dddc ]=_faff (_gebb .Data [_dddc ],_egcc .Data [_dddc ],_gfbc );
|
|
};return _dffd ;};var (_cadf =[]byte {0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF};_dggdd =[]byte {0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};);func (_cbbb *Bitmap )ToImage ()_ab .Image {_fag ,_gfc :=_ce .NewImage (_cbbb .Width ,_cbbb .Height ,1,1,_cbbb .Data ,nil ,nil );
|
|
if _gfc !=nil {_dd .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",_gfc );
|
|
};return _fag ;};func _bgbe ()(_fadb []byte ){_fadb =make ([]byte ,256);for _ecab :=0;_ecab < 256;_ecab ++{_fcag :=byte (_ecab );_fadb [_fcag ]=(_fcag &0x01)|((_fcag &0x04)>>1)|((_fcag &0x10)>>2)|((_fcag &0x40)>>3)|((_fcag &0x02)<<3)|((_fcag &0x08)<<2)|((_fcag &0x20)<<1)|(_fcag &0x80);
|
|
};return _fadb ;};func Rect (x ,y ,w ,h int )(*_ab .Rectangle ,error ){const _afgb ="b\u0069\u0074\u006d\u0061\u0070\u002e\u0052\u0065\u0063\u0074";if x < 0{w +=x ;x =0;if w <=0{return nil ,_f .Errorf (_afgb ,"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 ,_f .Error (_afgb ,"\u0079\u0020\u003c 0\u0020\u0061\u006e\u0064\u0020\u0062\u006f\u0078\u0020\u006f\u0066\u0066\u0020\u002b\u0071\u0075\u0061\u0064");};};_dadb :=_ab .Rect (x ,y ,x +w ,y +h );return &_dadb ,nil ;
|
|
};func (_bdgd *byHeight )Len ()int {return len (_bdgd .Values )};func TstRSymbol (t *_g .T ,scale ...int )*Bitmap {_edab ,_gedad :=NewWithData (4,5,[]byte {0xF0,0x90,0xF0,0xA0,0x90});_d .NoError (t ,_gedad );return TstGetScaledSymbol (t ,_edab ,scale ...);
|
|
};func (_efgd *ClassedPoints )xSortFunction ()func (_geaf int ,_fbcbe int )bool {return func (_baca ,_fdb int )bool {return _efgd .XAtIndex (_baca )< _efgd .XAtIndex (_fdb )};};type shift int ;func (_edgg *Bitmaps )AddBitmap (bm *Bitmap ){_edgg .Values =append (_edgg .Values ,bm )};
|
|
func _efg (_gda *Bitmap ,_ae int ,_def []byte )(_dbb *Bitmap ,_abb error ){const _ffg ="\u0072\u0065\u0064\u0075\u0063\u0065\u0052\u0061\u006e\u006b\u0042\u0069n\u0061\u0072\u0079\u0032";if _gda ==nil {return nil ,_f .Error (_ffg ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");
|
|
};if _ae < 1||_ae > 4{return nil ,_f .Error (_ffg ,"\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 _gda .Height <=1{return nil ,_f .Errorf (_ffg ,"\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",_gda .Height );
|
|
};_dbb =New (_gda .Width /2,_gda .Height /2);if _def ==nil {_def =_bgbe ();};_fbd :=_bfada (_gda .RowStride ,2*_dbb .RowStride );switch _ae {case 1:_abb =_ebab (_gda ,_dbb ,_ae ,_def ,_fbd );case 2:_abb =_fge (_gda ,_dbb ,_ae ,_def ,_fbd );case 3:_abb =_cee (_gda ,_dbb ,_ae ,_def ,_fbd );
|
|
case 4:_abb =_fca (_gda ,_dbb ,_ae ,_def ,_fbd );};if _abb !=nil {return nil ,_abb ;};return _dbb ,nil ;};func (_bfde *BitmapsArray )GetBox (i int )(*_ab .Rectangle ,error ){const _ddeg ="\u0042\u0069\u0074\u006dap\u0073\u0041\u0072\u0072\u0061\u0079\u002e\u0047\u0065\u0074\u0042\u006f\u0078";
|
|
if _bfde ==nil {return nil ,_f .Error (_ddeg ,"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 (_bfde .Boxes )-1{return nil ,_f .Errorf (_ddeg ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
};return _bfde .Boxes [i ],nil ;};func (_adgg *ClassedPoints )GetIntXByClass (i int )(int ,error ){const _abfa ="\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 >=_adgg .IntSlice .Size (){return 0,_f .Errorf (_abfa ,"\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 (_adgg .XAtIndex (i )),nil ;};func (_bfaa *Selection )findMaxTranslations ()(_faeb ,_gfbeb ,_cbee ,_cbcd int ){for _ggee :=0;_ggee < _bfaa .Height ;_ggee ++{for _eeda :=0;_eeda < _bfaa .Width ;_eeda ++{if _bfaa .Data [_ggee ][_eeda ]==SelHit {_faeb =_edad (_faeb ,_bfaa .Cx -_eeda );
|
|
_gfbeb =_edad (_gfbeb ,_bfaa .Cy -_ggee );_cbee =_edad (_cbee ,_eeda -_bfaa .Cx );_cbcd =_edad (_cbcd ,_ggee -_bfaa .Cy );};};};return _faeb ,_gfbeb ,_cbee ,_cbcd ;};func (_fcfa *Bitmap )SetPixel (x ,y int ,pixel byte )error {_dfag :=_fcfa .GetByteIndex (x ,y );
|
|
if _dfag > len (_fcfa .Data )-1{return _f .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",_dfag );};_ebd :=_fcfa .GetBitOffset (x );
|
|
_agfd :=uint (7-_ebd );_ega :=_fcfa .Data [_dfag ];var _bce byte ;if pixel ==1{_bce =_ega |(pixel &0x01<<_agfd );}else {_bce =_ega &^(1<<_agfd );};_fcfa .Data [_dfag ]=_bce ;return nil ;};func _fcc (_beg ,_fdd int )*Bitmap {return &Bitmap {Width :_beg ,Height :_fdd ,RowStride :(_beg +7)>>3};
|
|
};func (_dgdf *ClassedPoints )XAtIndex (i int )float32 {return (*_dgdf .Points )[_dgdf .IntSlice [i ]].X };func MakePixelSumTab8 ()[]int {return _gbc ()};func (_bedf *ClassedPoints )SortByY (){_bedf ._beeeb =_bedf .ySortFunction ();_c .Sort (_bedf )};func (_cgbf *Bitmap )RasterOperation (dx ,dy ,dw ,dh int ,op RasterOperator ,src *Bitmap ,sx ,sy int )error {return _caeg (_cgbf ,dx ,dy ,dw ,dh ,op ,src ,sx ,sy );
|
|
};func _eaa (_eb *Bitmap ,_bfd int )(*Bitmap ,error ){const _ba ="\u0065x\u0070a\u006e\u0064\u0042\u0069\u006ea\u0072\u0079P\u006f\u0077\u0065\u0072\u0032";if _eb ==nil {return nil ,_f .Error (_ba ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if _bfd ==1{return _gcff (nil ,_eb );};if _bfd !=2&&_bfd !=4&&_bfd !=8{return nil ,_f .Error (_ba ,"\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");
|
|
};_ac :=_bfd *_eb .Width ;_cdd :=_bfd *_eb .Height ;_cff :=New (_ac ,_cdd );var _eaf error ;switch _bfd {case 2:_eaf =_bg (_cff ,_eb );case 4:_eaf =_ddb (_cff ,_eb );case 8:_eaf =_cce (_cff ,_eb );};if _eaf !=nil {return nil ,_f .Wrap (_eaf ,_ba ,"");};
|
|
return _cff ,nil ;};func TstFrameBitmapData ()[]byte {return _efff .Data };func (_cfbcg *Points )AddPoint (x ,y float32 ){*_cfbcg =append (*_cfbcg ,Point {x ,y })};func _gfce (_daeec *Bitmap ,_cdbga ,_dccda int ,_cfgb ,_cdbe int ,_acdf RasterOperator ){var (_ggcb bool ;
|
|
_edag bool ;_aegd int ;_daed int ;_ddeb int ;_agef int ;_afcef bool ;_aaag byte ;);_ffab :=8-(_cdbga &7);_fddbd :=_dggdd [_ffab ];_bgca :=_daeec .RowStride *_dccda +(_cdbga >>3);if _cfgb < _ffab {_ggcb =true ;_fddbd &=_cadf [8-_ffab +_cfgb ];};if !_ggcb {_aegd =(_cfgb -_ffab )>>3;
|
|
if _aegd !=0{_edag =true ;_daed =_bgca +1;};};_ddeb =(_cdbga +_cfgb )&7;if !(_ggcb ||_ddeb ==0){_afcef =true ;_aaag =_cadf [_ddeb ];_agef =_bgca +1+_aegd ;};var _becd ,_caegd int ;switch _acdf {case PixClr :for _becd =0;_becd < _cdbe ;_becd ++{_daeec .Data [_bgca ]=_gega (_daeec .Data [_bgca ],0x0,_fddbd );
|
|
_bgca +=_daeec .RowStride ;};if _edag {for _becd =0;_becd < _cdbe ;_becd ++{for _caegd =0;_caegd < _aegd ;_caegd ++{_daeec .Data [_daed +_caegd ]=0x0;};_daed +=_daeec .RowStride ;};};if _afcef {for _becd =0;_becd < _cdbe ;_becd ++{_daeec .Data [_agef ]=_gega (_daeec .Data [_agef ],0x0,_aaag );
|
|
_agef +=_daeec .RowStride ;};};case PixSet :for _becd =0;_becd < _cdbe ;_becd ++{_daeec .Data [_bgca ]=_gega (_daeec .Data [_bgca ],0xff,_fddbd );_bgca +=_daeec .RowStride ;};if _edag {for _becd =0;_becd < _cdbe ;_becd ++{for _caegd =0;_caegd < _aegd ;
|
|
_caegd ++{_daeec .Data [_daed +_caegd ]=0xff;};_daed +=_daeec .RowStride ;};};if _afcef {for _becd =0;_becd < _cdbe ;_becd ++{_daeec .Data [_agef ]=_gega (_daeec .Data [_agef ],0xff,_aaag );_agef +=_daeec .RowStride ;};};case PixNotDst :for _becd =0;_becd < _cdbe ;
|
|
_becd ++{_daeec .Data [_bgca ]=_gega (_daeec .Data [_bgca ],^_daeec .Data [_bgca ],_fddbd );_bgca +=_daeec .RowStride ;};if _edag {for _becd =0;_becd < _cdbe ;_becd ++{for _caegd =0;_caegd < _aegd ;_caegd ++{_daeec .Data [_daed +_caegd ]=^(_daeec .Data [_daed +_caegd ]);
|
|
};_daed +=_daeec .RowStride ;};};if _afcef {for _becd =0;_becd < _cdbe ;_becd ++{_daeec .Data [_agef ]=_gega (_daeec .Data [_agef ],^_daeec .Data [_agef ],_aaag );_agef +=_daeec .RowStride ;};};};};func (_accc *Bitmap )ThresholdPixelSum (thresh int ,tab8 []int )(_bcc bool ,_cde error ){const _addb ="\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 =_gbc ();};_adab :=_accc .Width >>3;_dggd :=_accc .Width &7;_gcac :=byte (0xff<<uint (8-_dggd ));var (_bgd ,_fgda ,_aaef ,_adbg int ;_agg byte ;);for _bgd =0;_bgd < _accc .Height ;_bgd ++{_aaef =_accc .RowStride *_bgd ;for _fgda =0;
|
|
_fgda < _adab ;_fgda ++{_agg ,_cde =_accc .GetByte (_aaef +_fgda );if _cde !=nil {return false ,_f .Wrap (_cde ,_addb ,"\u0066\u0075\u006c\u006c\u0042\u0079\u0074\u0065");};_adbg +=tab8 [_agg ];};if _dggd !=0{_agg ,_cde =_accc .GetByte (_aaef +_fgda );
|
|
if _cde !=nil {return false ,_f .Wrap (_cde ,_addb ,"p\u0061\u0072\u0074\u0069\u0061\u006c\u0042\u0079\u0074\u0065");};_agg &=_gcac ;_adbg +=tab8 [_agg ];};if _adbg > thresh {return true ,nil ;};};return _bcc ,nil ;};func (_bfcg *byWidth )Len ()int {return len (_bfcg .Values )};
|
|
func _fcad (_ffdg ,_edb *Bitmap ,_faga ,_ebge ,_eedb ,_dfff ,_feeag int ,_egfd CombinationOperator )error {var _dgbd int ;_acd :=func (){_dgbd ++;_eedb +=_edb .RowStride ;_dfff +=_ffdg .RowStride ;_feeag +=_ffdg .RowStride };for _dgbd =_faga ;_dgbd < _ebge ;
|
|
_acd (){_gbdc :=_eedb ;for _ggbae :=_dfff ;_ggbae <=_feeag ;_ggbae ++{_affa ,_gcce :=_edb .GetByte (_gbdc );if _gcce !=nil {return _gcce ;};_aadg ,_gcce :=_ffdg .GetByte (_ggbae );if _gcce !=nil {return _gcce ;};if _gcce =_edb .SetByte (_gbdc ,_faff (_affa ,_aadg ,_egfd ));
|
|
_gcce !=nil {return _gcce ;};_gbdc ++;};};return nil ;};func (_bacg *ClassedPoints )Len ()int {return _bacg .IntSlice .Size ()};const _ggbf =5000;type LocationFilter int ;func _edad (_cfac ,_cada int )int {if _cfac > _cada {return _cfac ;};return _cada ;
|
|
};func _bc (_gf *Bitmap ,_ffc *Bitmap ,_fc int )(_ged error ){const _dcg ="e\u0078\u0070\u0061\u006edB\u0069n\u0061\u0072\u0079\u0050\u006fw\u0065\u0072\u0032\u004c\u006f\u0077";switch _fc {case 2:_ged =_bg (_gf ,_ffc );case 4:_ged =_ddb (_gf ,_ffc );case 8:_ged =_cce (_gf ,_ffc );
|
|
default:return _f .Error (_dcg ,"\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 _ged !=nil {_ged =_f .Wrap (_ged ,_dcg ,"");
|
|
};return _ged ;};type byWidth Bitmaps ;func (_gba *Bitmap )connComponentsBB (_efge int )(_bbce *Boxes ,_abbc error ){const _bfe ="\u0042\u0069\u0074ma\u0070\u002e\u0063\u006f\u006e\u006e\u0043\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074\u0073\u0042\u0042";
|
|
if _efge !=4&&_efge !=8{return nil ,_f .Error (_bfe ,"\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 _gba .Zero (){return &Boxes {},nil ;
|
|
};_gba .setPadBits (0);_dbfd ,_abbc :=_gcff (nil ,_gba );if _abbc !=nil {return nil ,_f .Wrap (_abbc ,_bfe ,"\u0062\u006d\u0031");};_dac :=&_dg .Stack {};_dac .Aux =&_dg .Stack {};_bbce =&Boxes {};var (_eecf ,_dfef int ;_adac _ab .Point ;_cedb bool ;_gga *_ab .Rectangle ;
|
|
);for {if _adac ,_cedb ,_abbc =_dbfd .nextOnPixel (_dfef ,_eecf );_abbc !=nil {return nil ,_f .Wrap (_abbc ,_bfe ,"");};if !_cedb {break ;};if _gga ,_abbc =_afbb (_dbfd ,_dac ,_adac .X ,_adac .Y ,_efge );_abbc !=nil {return nil ,_f .Wrap (_abbc ,_bfe ,"");
|
|
};if _abbc =_bbce .Add (_gga );_abbc !=nil {return nil ,_f .Wrap (_abbc ,_bfe ,"");};_dfef =_adac .X ;_eecf =_adac .Y ;};return _bbce ,nil ;};func (_abbg *Bitmaps )String ()string {_abgg :=_b .Builder {};for _ ,_fbfa :=range _abbg .Values {_abgg .WriteString (_fbfa .String ());
|
|
_abgg .WriteRune ('\n');};return _abgg .String ();};func _gega (_acde ,_gfae ,_ggcf byte )byte {return (_acde &^(_ggcf ))|(_gfae &_ggcf )};func (_ace *Bitmap )addPadBits ()(_aec error ){const _gbg ="\u0062\u0069\u0074\u006d\u0061\u0070\u002e\u0061\u0064\u0064\u0050\u0061d\u0042\u0069\u0074\u0073";
|
|
_bbfe :=_ace .Width %8;if _bbfe ==0{return nil ;};_dbac :=_ace .Width /8;_gaca :=_gd .NewReader (_ace .Data );_cfdf :=make ([]byte ,_ace .Height *_ace .RowStride );_eee :=_gd .NewWriterMSB (_cfdf );_bdb :=make ([]byte ,_dbac );var (_gff int ;_eac uint64 ;
|
|
);for _gff =0;_gff < _ace .Height ;_gff ++{if _ ,_aec =_gaca .Read (_bdb );_aec !=nil {return _f .Wrap (_aec ,_gbg ,"\u0066u\u006c\u006c\u0020\u0062\u0079\u0074e");};if _ ,_aec =_eee .Write (_bdb );_aec !=nil {return _f .Wrap (_aec ,_gbg ,"\u0066\u0075\u006c\u006c\u0020\u0062\u0079\u0074\u0065\u0073");
|
|
};if _eac ,_aec =_gaca .ReadBits (byte (_bbfe ));_aec !=nil {return _f .Wrap (_aec ,_gbg ,"\u0073\u006b\u0069\u0070\u0070\u0069\u006e\u0067\u0020\u0062\u0069\u0074\u0073");};if _aec =_eee .WriteByte (byte (_eac )<<uint (8-_bbfe ));_aec !=nil {return _f .Wrap (_aec ,_gbg ,"\u006ca\u0073\u0074\u0020\u0062\u0079\u0074e");
|
|
};};_ace .Data =_eee .Data ();return nil ;};func (_egb *Bitmap )Copy ()*Bitmap {_ccbb :=make ([]byte ,len (_egb .Data ));copy (_ccbb ,_egb .Data );return &Bitmap {Width :_egb .Width ,Height :_egb .Height ,RowStride :_egb .RowStride ,Data :_ccbb ,Color :_egb .Color ,Text :_egb .Text ,BitmapNumber :_egb .BitmapNumber ,Special :_egb .Special };
|
|
};func _bgbb (_acga ...MorphProcess )(_fef error ){const _bbgae ="v\u0065r\u0069\u0066\u0079\u004d\u006f\u0072\u0070\u0068P\u0072\u006f\u0063\u0065ss\u0065\u0073";var _ffcec ,_bace int ;for _eeaae ,_dced :=range _acga {if _fef =_dced .verify (_eeaae ,&_ffcec ,&_bace );
|
|
_fef !=nil {return _f .Wrap (_fef ,_bbgae ,"");};};if _bace !=0&&_ffcec !=0{return _f .Error (_bbgae ,"\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 (_eabb MorphProcess )getWidthHeight ()(_edgf ,_ebce int ){return _eabb .Arguments [0],_eabb .Arguments [1];};func (_cgga *ClassedPoints )YAtIndex (i int )float32 {return (*_cgga .Points )[_cgga .IntSlice [i ]].Y };func (_gfabfe *Bitmaps )CountPixels ()*_dg .NumSlice {_ceef :=&_dg .NumSlice {};
|
|
for _ ,_baef :=range _gfabfe .Values {_ceef .AddInt (_baef .CountPixels ());};return _ceef ;};func _fdead (_ffga ,_feae *Bitmap ,_fegb ,_afdc ,_bfgb ,_ffce ,_ccbd ,_adae ,_adc ,_deef int ,_baace CombinationOperator ,_dged int )error {var _bdgge int ;_fdfg :=func (){_bdgge ++;
|
|
_bfgb +=_feae .RowStride ;_ffce +=_ffga .RowStride ;_ccbd +=_ffga .RowStride };for _bdgge =_fegb ;_bdgge < _afdc ;_fdfg (){var _edaea uint16 ;_aeff :=_bfgb ;for _ddfa :=_ffce ;_ddfa <=_ccbd ;_ddfa ++{_dfdc ,_adege :=_feae .GetByte (_aeff );if _adege !=nil {return _adege ;
|
|
};_bdfb ,_adege :=_ffga .GetByte (_ddfa );if _adege !=nil {return _adege ;};_edaea =(_edaea |(uint16 (_bdfb )&0xff))<<uint (_deef );_bdfb =byte (_edaea >>8);if _adege =_feae .SetByte (_aeff ,_faff (_dfdc ,_bdfb ,_baace ));_adege !=nil {return _adege ;};
|
|
_aeff ++;_edaea <<=uint (_adc );if _ddfa ==_ccbd {_bdfb =byte (_edaea >>(8-uint8 (_deef )));if _dged !=0{_bdfb =_eade (uint (8+_adae ),_bdfb );};_dfdc ,_adege =_feae .GetByte (_aeff );if _adege !=nil {return _adege ;};if _adege =_feae .SetByte (_aeff ,_faff (_dfdc ,_bdfb ,_baace ));
|
|
_adege !=nil {return _adege ;};};};};return nil ;};func (_dbbc *byWidth )Swap (i ,j int ){_dbbc .Values [i ],_dbbc .Values [j ]=_dbbc .Values [j ],_dbbc .Values [i ];if _dbbc .Boxes !=nil {_dbbc .Boxes [i ],_dbbc .Boxes [j ]=_dbbc .Boxes [j ],_dbbc .Boxes [i ];
|
|
};};func _efdae ()[]int {_egbc :=make ([]int ,256);_egbc [0]=0;_egbc [1]=7;var _egeef int ;for _egeef =2;_egeef < 4;_egeef ++{_egbc [_egeef ]=_egbc [_egeef -2]+6;};for _egeef =4;_egeef < 8;_egeef ++{_egbc [_egeef ]=_egbc [_egeef -4]+5;};for _egeef =8;_egeef < 16;
|
|
_egeef ++{_egbc [_egeef ]=_egbc [_egeef -8]+4;};for _egeef =16;_egeef < 32;_egeef ++{_egbc [_egeef ]=_egbc [_egeef -16]+3;};for _egeef =32;_egeef < 64;_egeef ++{_egbc [_egeef ]=_egbc [_egeef -32]+2;};for _egeef =64;_egeef < 128;_egeef ++{_egbc [_egeef ]=_egbc [_egeef -64]+1;
|
|
};for _egeef =128;_egeef < 256;_egeef ++{_egbc [_egeef ]=_egbc [_egeef -128];};return _egbc ;};func NewWithUnpaddedData (width ,height int ,data []byte )(*Bitmap ,error ){const _efc ="\u004e\u0065\u0077\u0057it\u0068\u0055\u006e\u0070\u0061\u0064\u0064\u0065\u0064\u0044\u0061\u0074\u0061";
|
|
_dce :=_fcc (width ,height );_dce .Data =data ;if _fcd :=((width *height )+7)>>3;len (data )< _fcd {return nil ,_f .Errorf (_efc ,"\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 ),_fcd );
|
|
};if _egdf :=_dce .addPadBits ();_egdf !=nil {return nil ,_f .Wrap (_egdf ,_efc ,"");};return _dce ,nil ;};type SizeComparison int ;func _gbc ()[]int {_adga :=make ([]int ,256);for _dcba :=0;_dcba <=0xff;_dcba ++{_cgc :=byte (_dcba );_adga [_cgc ]=int (_cgc &0x1)+(int (_cgc >>1)&0x1)+(int (_cgc >>2)&0x1)+(int (_cgc >>3)&0x1)+(int (_cgc >>4)&0x1)+(int (_cgc >>5)&0x1)+(int (_cgc >>6)&0x1)+(int (_cgc >>7)&0x1);
|
|
};return _adga ;};func _fbcb (_acdc ,_fbcd *Bitmap ,_fgde *Selection )(*Bitmap ,error ){const _ggdb ="c\u006c\u006f\u0073\u0065\u0042\u0069\u0074\u006d\u0061\u0070";var _gfac error ;if _acdc ,_gfac =_dffb (_acdc ,_fbcd ,_fgde );_gfac !=nil {return nil ,_gfac ;
|
|
};_feed ,_gfac :=_fdff (nil ,_fbcd ,_fgde );if _gfac !=nil {return nil ,_f .Wrap (_gfac ,_ggdb ,"");};if _ ,_gfac =_cdcf (_acdc ,_feed ,_fgde );_gfac !=nil {return nil ,_f .Wrap (_gfac ,_ggdb ,"");};return _acdc ,nil ;};func (_cdddd *Boxes )Get (i int )(*_ab .Rectangle ,error ){const _aecb ="\u0042o\u0078\u0065\u0073\u002e\u0047\u0065t";
|
|
if _cdddd ==nil {return nil ,_f .Error (_aecb ,"\u0027\u0042\u006f\u0078es\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};if i > len (*_cdddd )-1{return nil ,_f .Errorf (_aecb ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
};return (*_cdddd )[i ],nil ;};func _bgab (_dcgf ,_aecea int ,_afaa string )*Selection {_dgaf :=&Selection {Height :_dcgf ,Width :_aecea ,Name :_afaa };_dgaf .Data =make ([][]SelectionValue ,_dcgf );for _bggg :=0;_bggg < _dcgf ;_bggg ++{_dgaf .Data [_bggg ]=make ([]SelectionValue ,_aecea );
|
|
};return _dgaf ;};func Copy (d ,s *Bitmap )(*Bitmap ,error ){return _gcff (d ,s )};func (_daec *ClassedPoints )GetIntYByClass (i int )(int ,error ){const _gcabg ="\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 >=_daec .IntSlice .Size (){return 0,_f .Errorf (_gcabg ,"\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 (_daec .YAtIndex (i )),nil ;};func _eddb (_gdd int )int {if _gdd < 0{return -_gdd ;};return _gdd ;};func Centroids (bms []*Bitmap )(*Points ,error ){_ceag :=make ([]Point ,len (bms ));_aebg :=_efdae ();_beag :=_gbc ();var _cbaa error ;for _dfcg ,_fgcee :=range bms {_ceag [_dfcg ],_cbaa =_fgcee .centroid (_aebg ,_beag );
|
|
if _cbaa !=nil {return nil ,_cbaa ;};};_dgfgd :=Points (_ceag );return &_dgfgd ,nil ;};func (_cddee *Bitmaps )WidthSorter ()func (_eefe ,_afdb int )bool {return func (_dcdab ,_aecge int )bool {return _cddee .Values [_dcdab ].Width < _cddee .Values [_aecge ].Width };
|
|
};type byHeight Bitmaps ;func _gcff (_aaeg ,_babf *Bitmap )(*Bitmap ,error ){if _babf ==nil {return nil ,_f .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 _babf ==_aaeg {return _aaeg ,nil ;};if _aaeg ==nil {_aaeg =_babf .createTemplate ();copy (_aaeg .Data ,_babf .Data );return _aaeg ,nil ;};_adeb :=_aaeg .resizeImageData (_babf );if _adeb !=nil {return nil ,_f .Wrap (_adeb ,"\u0063\u006f\u0070\u0079\u0042\u0069\u0074\u006d\u0061\u0070","");
|
|
};_aaeg .Text =_babf .Text ;copy (_aaeg .Data ,_babf .Data );return _aaeg ,nil ;};func _acfd (_cage ,_aafc *Bitmap ,_edcb ,_faffd int )(_ebgac error ){const _gbdfa ="\u0073e\u0065d\u0066\u0069\u006c\u006c\u0042i\u006e\u0061r\u0079\u004c\u006f\u0077\u0034";
|
|
var (_gddd ,_dedd ,_dadbe ,_eddgd int ;_cdf ,_acce ,_gbeb ,_gabc ,_bdab ,_gaac ,_caaa byte ;);for _gddd =0;_gddd < _edcb ;_gddd ++{_dadbe =_gddd *_cage .RowStride ;_eddgd =_gddd *_aafc .RowStride ;for _dedd =0;_dedd < _faffd ;_dedd ++{_cdf ,_ebgac =_cage .GetByte (_dadbe +_dedd );
|
|
if _ebgac !=nil {return _f .Wrap (_ebgac ,_gbdfa ,"\u0066i\u0072\u0073\u0074\u0020\u0067\u0065t");};_acce ,_ebgac =_aafc .GetByte (_eddgd +_dedd );if _ebgac !=nil {return _f .Wrap (_ebgac ,_gbdfa ,"\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0067\u0065\u0074");
|
|
};if _gddd > 0{_gbeb ,_ebgac =_cage .GetByte (_dadbe -_cage .RowStride +_dedd );if _ebgac !=nil {return _f .Wrap (_ebgac ,_gbdfa ,"\u0069\u0020\u003e \u0030");};_cdf |=_gbeb ;};if _dedd > 0{_gabc ,_ebgac =_cage .GetByte (_dadbe +_dedd -1);if _ebgac !=nil {return _f .Wrap (_ebgac ,_gbdfa ,"\u006a\u0020\u003e \u0030");
|
|
};_cdf |=_gabc <<7;};_cdf &=_acce ;if _cdf ==0||(^_cdf )==0{if _ebgac =_cage .SetByte (_dadbe +_dedd ,_cdf );_ebgac !=nil {return _f .Wrap (_ebgac ,_gbdfa ,"b\u0074\u0020\u003d\u003d 0\u0020|\u007c\u0020\u0028\u005e\u0062t\u0029\u0020\u003d\u003d\u0020\u0030");
|
|
};continue ;};for {_caaa =_cdf ;_cdf =(_cdf |(_cdf >>1)|(_cdf <<1))&_acce ;if (_cdf ^_caaa )==0{if _ebgac =_cage .SetByte (_dadbe +_dedd ,_cdf );_ebgac !=nil {return _f .Wrap (_ebgac ,_gbdfa ,"\u0073\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u0070\u0072\u0065\u0076 \u0062\u0079\u0074\u0065");
|
|
};break ;};};};};for _gddd =_edcb -1;_gddd >=0;_gddd --{_dadbe =_gddd *_cage .RowStride ;_eddgd =_gddd *_aafc .RowStride ;for _dedd =_faffd -1;_dedd >=0;_dedd --{if _cdf ,_ebgac =_cage .GetByte (_dadbe +_dedd );_ebgac !=nil {return _f .Wrap (_ebgac ,_gbdfa ,"\u0072\u0065\u0076\u0065\u0072\u0073\u0065\u0020\u0066\u0069\u0072\u0073t\u0020\u0067\u0065\u0074");
|
|
};if _acce ,_ebgac =_aafc .GetByte (_eddgd +_dedd );_ebgac !=nil {return _f .Wrap (_ebgac ,_gbdfa ,"r\u0065\u0076\u0065\u0072se\u0020g\u0065\u0074\u0020\u006d\u0061s\u006b\u0020\u0062\u0079\u0074\u0065");};if _gddd < _edcb -1{if _bdab ,_ebgac =_cage .GetByte (_dadbe +_cage .RowStride +_dedd );
|
|
_ebgac !=nil {return _f .Wrap (_ebgac ,_gbdfa ,"\u0072\u0065v\u0065\u0072\u0073e\u0020\u0069\u0020\u003c\u0020\u0068\u0020\u002d\u0031");};_cdf |=_bdab ;};if _dedd < _faffd -1{if _gaac ,_ebgac =_cage .GetByte (_dadbe +_dedd +1);_ebgac !=nil {return _f .Wrap (_ebgac ,_gbdfa ,"\u0072\u0065\u0076\u0065rs\u0065\u0020\u006a\u0020\u003c\u0020\u0077\u0070\u006c\u0020\u002d\u0020\u0031");
|
|
};_cdf |=_gaac >>7;};_cdf &=_acce ;if _cdf ==0||(^_cdf )==0{if _ebgac =_cage .SetByte (_dadbe +_dedd ,_cdf );_ebgac !=nil {return _f .Wrap (_ebgac ,_gbdfa ,"\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 {_caaa =_cdf ;_cdf =(_cdf |(_cdf >>1)|(_cdf <<1))&_acce ;if (_cdf ^_caaa )==0{if _ebgac =_cage .SetByte (_dadbe +_dedd ,_cdf );_ebgac !=nil {return _f .Wrap (_ebgac ,_gbdfa ,"\u0072e\u0076\u0065\u0072\u0073e\u0020\u0073\u0065\u0074\u0074i\u006eg\u0020p\u0072\u0065\u0076\u0020\u0062\u0079\u0074e");
|
|
};break ;};};};};return nil ;};func _eefc (_ggda *Bitmap ,_badf ,_bcfef ,_edgb ,_ccae int ,_fefd RasterOperator ,_cbggc *Bitmap ,_ecfb ,_ddcb int )error {var (_fcbbb byte ;_eaee int ;_dgcc int ;_edgfg ,_fegdf int ;_aegf ,_gdec int ;);_cdgb :=_edgb >>3;
|
|
_ddaf :=_edgb &7;if _ddaf > 0{_fcbbb =_cadf [_ddaf ];};_eaee =_cbggc .RowStride *_ddcb +(_ecfb >>3);_dgcc =_ggda .RowStride *_bcfef +(_badf >>3);switch _fefd {case PixSrc :for _aegf =0;_aegf < _ccae ;_aegf ++{_edgfg =_eaee +_aegf *_cbggc .RowStride ;_fegdf =_dgcc +_aegf *_ggda .RowStride ;
|
|
for _gdec =0;_gdec < _cdgb ;_gdec ++{_ggda .Data [_fegdf ]=_cbggc .Data [_edgfg ];_fegdf ++;_edgfg ++;};if _ddaf > 0{_ggda .Data [_fegdf ]=_gega (_ggda .Data [_fegdf ],_cbggc .Data [_edgfg ],_fcbbb );};};case PixNotSrc :for _aegf =0;_aegf < _ccae ;_aegf ++{_edgfg =_eaee +_aegf *_cbggc .RowStride ;
|
|
_fegdf =_dgcc +_aegf *_ggda .RowStride ;for _gdec =0;_gdec < _cdgb ;_gdec ++{_ggda .Data [_fegdf ]=^(_cbggc .Data [_edgfg ]);_fegdf ++;_edgfg ++;};if _ddaf > 0{_ggda .Data [_fegdf ]=_gega (_ggda .Data [_fegdf ],^_cbggc .Data [_edgfg ],_fcbbb );};};case PixSrcOrDst :for _aegf =0;
|
|
_aegf < _ccae ;_aegf ++{_edgfg =_eaee +_aegf *_cbggc .RowStride ;_fegdf =_dgcc +_aegf *_ggda .RowStride ;for _gdec =0;_gdec < _cdgb ;_gdec ++{_ggda .Data [_fegdf ]|=_cbggc .Data [_edgfg ];_fegdf ++;_edgfg ++;};if _ddaf > 0{_ggda .Data [_fegdf ]=_gega (_ggda .Data [_fegdf ],_cbggc .Data [_edgfg ]|_ggda .Data [_fegdf ],_fcbbb );
|
|
};};case PixSrcAndDst :for _aegf =0;_aegf < _ccae ;_aegf ++{_edgfg =_eaee +_aegf *_cbggc .RowStride ;_fegdf =_dgcc +_aegf *_ggda .RowStride ;for _gdec =0;_gdec < _cdgb ;_gdec ++{_ggda .Data [_fegdf ]&=_cbggc .Data [_edgfg ];_fegdf ++;_edgfg ++;};if _ddaf > 0{_ggda .Data [_fegdf ]=_gega (_ggda .Data [_fegdf ],_cbggc .Data [_edgfg ]&_ggda .Data [_fegdf ],_fcbbb );
|
|
};};case PixSrcXorDst :for _aegf =0;_aegf < _ccae ;_aegf ++{_edgfg =_eaee +_aegf *_cbggc .RowStride ;_fegdf =_dgcc +_aegf *_ggda .RowStride ;for _gdec =0;_gdec < _cdgb ;_gdec ++{_ggda .Data [_fegdf ]^=_cbggc .Data [_edgfg ];_fegdf ++;_edgfg ++;};if _ddaf > 0{_ggda .Data [_fegdf ]=_gega (_ggda .Data [_fegdf ],_cbggc .Data [_edgfg ]^_ggda .Data [_fegdf ],_fcbbb );
|
|
};};case PixNotSrcOrDst :for _aegf =0;_aegf < _ccae ;_aegf ++{_edgfg =_eaee +_aegf *_cbggc .RowStride ;_fegdf =_dgcc +_aegf *_ggda .RowStride ;for _gdec =0;_gdec < _cdgb ;_gdec ++{_ggda .Data [_fegdf ]|=^(_cbggc .Data [_edgfg ]);_fegdf ++;_edgfg ++;};if _ddaf > 0{_ggda .Data [_fegdf ]=_gega (_ggda .Data [_fegdf ],^(_cbggc .Data [_edgfg ])|_ggda .Data [_fegdf ],_fcbbb );
|
|
};};case PixNotSrcAndDst :for _aegf =0;_aegf < _ccae ;_aegf ++{_edgfg =_eaee +_aegf *_cbggc .RowStride ;_fegdf =_dgcc +_aegf *_ggda .RowStride ;for _gdec =0;_gdec < _cdgb ;_gdec ++{_ggda .Data [_fegdf ]&=^(_cbggc .Data [_edgfg ]);_fegdf ++;_edgfg ++;};
|
|
if _ddaf > 0{_ggda .Data [_fegdf ]=_gega (_ggda .Data [_fegdf ],^(_cbggc .Data [_edgfg ])&_ggda .Data [_fegdf ],_fcbbb );};};case PixSrcOrNotDst :for _aegf =0;_aegf < _ccae ;_aegf ++{_edgfg =_eaee +_aegf *_cbggc .RowStride ;_fegdf =_dgcc +_aegf *_ggda .RowStride ;
|
|
for _gdec =0;_gdec < _cdgb ;_gdec ++{_ggda .Data [_fegdf ]=_cbggc .Data [_edgfg ]|^(_ggda .Data [_fegdf ]);_fegdf ++;_edgfg ++;};if _ddaf > 0{_ggda .Data [_fegdf ]=_gega (_ggda .Data [_fegdf ],_cbggc .Data [_edgfg ]|^(_ggda .Data [_fegdf ]),_fcbbb );};
|
|
};case PixSrcAndNotDst :for _aegf =0;_aegf < _ccae ;_aegf ++{_edgfg =_eaee +_aegf *_cbggc .RowStride ;_fegdf =_dgcc +_aegf *_ggda .RowStride ;for _gdec =0;_gdec < _cdgb ;_gdec ++{_ggda .Data [_fegdf ]=_cbggc .Data [_edgfg ]&^(_ggda .Data [_fegdf ]);_fegdf ++;
|
|
_edgfg ++;};if _ddaf > 0{_ggda .Data [_fegdf ]=_gega (_ggda .Data [_fegdf ],_cbggc .Data [_edgfg ]&^(_ggda .Data [_fegdf ]),_fcbbb );};};case PixNotPixSrcOrDst :for _aegf =0;_aegf < _ccae ;_aegf ++{_edgfg =_eaee +_aegf *_cbggc .RowStride ;_fegdf =_dgcc +_aegf *_ggda .RowStride ;
|
|
for _gdec =0;_gdec < _cdgb ;_gdec ++{_ggda .Data [_fegdf ]=^(_cbggc .Data [_edgfg ]|_ggda .Data [_fegdf ]);_fegdf ++;_edgfg ++;};if _ddaf > 0{_ggda .Data [_fegdf ]=_gega (_ggda .Data [_fegdf ],^(_cbggc .Data [_edgfg ]|_ggda .Data [_fegdf ]),_fcbbb );};
|
|
};case PixNotPixSrcAndDst :for _aegf =0;_aegf < _ccae ;_aegf ++{_edgfg =_eaee +_aegf *_cbggc .RowStride ;_fegdf =_dgcc +_aegf *_ggda .RowStride ;for _gdec =0;_gdec < _cdgb ;_gdec ++{_ggda .Data [_fegdf ]=^(_cbggc .Data [_edgfg ]&_ggda .Data [_fegdf ]);
|
|
_fegdf ++;_edgfg ++;};if _ddaf > 0{_ggda .Data [_fegdf ]=_gega (_ggda .Data [_fegdf ],^(_cbggc .Data [_edgfg ]&_ggda .Data [_fegdf ]),_fcbbb );};};case PixNotPixSrcXorDst :for _aegf =0;_aegf < _ccae ;_aegf ++{_edgfg =_eaee +_aegf *_cbggc .RowStride ;_fegdf =_dgcc +_aegf *_ggda .RowStride ;
|
|
for _gdec =0;_gdec < _cdgb ;_gdec ++{_ggda .Data [_fegdf ]=^(_cbggc .Data [_edgfg ]^_ggda .Data [_fegdf ]);_fegdf ++;_edgfg ++;};if _ddaf > 0{_ggda .Data [_fegdf ]=_gega (_ggda .Data [_fegdf ],^(_cbggc .Data [_edgfg ]^_ggda .Data [_fegdf ]),_fcbbb );};
|
|
};default:_dd .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",_fefd );return _f .Error ("\u0072\u0061\u0073\u0074er\u004f\u0070\u0042\u0079\u0074\u0065\u0041\u006c\u0069\u0067\u006e\u0065\u0064\u004co\u0077","\u0069\u006e\u0076al\u0069\u0064\u0020\u0072\u0061\u0073\u0074\u0065\u0072\u0020\u006f\u0070\u0065\u0072\u0061\u0074\u006f\u0072");
|
|
};return nil ;};func (_bbcg Points )Size ()int {return len (_bbcg )};func (_ceed *Bitmap )setAll ()error {_cag :=_caeg (_ceed ,0,0,_ceed .Width ,_ceed .Height ,PixSet ,nil ,0,0);if _cag !=nil {return _f .Wrap (_cag ,"\u0073\u0065\u0074\u0041\u006c\u006c","");
|
|
};return nil ;};func (_dcec *Bitmap )connComponentsBitmapsBB (_ebgb *Bitmaps ,_ageg int )(_gefd *Boxes ,_afgg error ){const _bfgg ="\u0063\u006f\u006enC\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074\u0073\u0042\u0069\u0074\u006d\u0061\u0070\u0073\u0042\u0042";
|
|
if _ageg !=4&&_ageg !=8{return nil ,_f .Error (_bfgg ,"\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 _ebgb ==nil {return nil ,_f .Error (_bfgg ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0042\u0069\u0074ma\u0070\u0073");
|
|
};if len (_ebgb .Values )> 0{return nil ,_f .Error (_bfgg ,"\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 _dcec .Zero (){return &Boxes {},nil ;};
|
|
var (_ggc ,_egee ,_fcea ,_aada *Bitmap ;);_dcec .setPadBits (0);if _ggc ,_afgg =_gcff (nil ,_dcec );_afgg !=nil {return nil ,_f .Wrap (_afgg ,_bfgg ,"\u0062\u006d\u0031");};if _egee ,_afgg =_gcff (nil ,_dcec );_afgg !=nil {return nil ,_f .Wrap (_afgg ,_bfgg ,"\u0062\u006d\u0032");
|
|
};_fddeg :=&_dg .Stack {};_fddeg .Aux =&_dg .Stack {};_gefd =&Boxes {};var (_fagf ,_degd int ;_fcab _ab .Point ;_aedb bool ;_bge *_ab .Rectangle ;);for {if _fcab ,_aedb ,_afgg =_ggc .nextOnPixel (_fagf ,_degd );_afgg !=nil {return nil ,_f .Wrap (_afgg ,_bfgg ,"");
|
|
};if !_aedb {break ;};if _bge ,_afgg =_afbb (_ggc ,_fddeg ,_fcab .X ,_fcab .Y ,_ageg );_afgg !=nil {return nil ,_f .Wrap (_afgg ,_bfgg ,"");};if _afgg =_gefd .Add (_bge );_afgg !=nil {return nil ,_f .Wrap (_afgg ,_bfgg ,"");};if _fcea ,_afgg =_ggc .clipRectangle (_bge ,nil );
|
|
_afgg !=nil {return nil ,_f .Wrap (_afgg ,_bfgg ,"\u0062\u006d\u0033");};if _aada ,_afgg =_egee .clipRectangle (_bge ,nil );_afgg !=nil {return nil ,_f .Wrap (_afgg ,_bfgg ,"\u0062\u006d\u0034");};if _ ,_afgg =_dddg (_fcea ,_fcea ,_aada );_afgg !=nil {return nil ,_f .Wrap (_afgg ,_bfgg ,"\u0062m\u0033\u0020\u005e\u0020\u0062\u006d4");
|
|
};if _afgg =_egee .RasterOperation (_bge .Min .X ,_bge .Min .Y ,_bge .Dx (),_bge .Dy (),PixSrcXorDst ,_fcea ,0,0);_afgg !=nil {return nil ,_f .Wrap (_afgg ,_bfgg ,"\u0062\u006d\u0032\u0020\u002d\u0058\u004f\u0052\u002d>\u0020\u0062\u006d\u0033");};_ebgb .AddBitmap (_fcea );
|
|
_fagf =_fcab .X ;_degd =_fcab .Y ;};_ebgb .Boxes =*_gefd ;return _gefd ,nil ;};func TstImageBitmapData ()[]byte {return _eeeeff .Data };func (_egbg *Bitmap )clearAll ()error {return _egbg .RasterOperation (0,0,_egbg .Width ,_egbg .Height ,PixClr ,nil ,0,0);
|
|
};func NewClassedPoints (points *Points ,classes _dg .IntSlice )(*ClassedPoints ,error ){const _gacga ="\u004e\u0065w\u0043\u006c\u0061s\u0073\u0065\u0064\u0050\u006f\u0069\u006e\u0074\u0073";if points ==nil {return nil ,_f .Error (_gacga ,"\u0070\u0072\u006f\u0076id\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0070\u006f\u0069\u006e\u0074\u0073");
|
|
};if classes ==nil {return nil ,_f .Error (_gacga ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0063\u006c\u0061ss\u0065\u0073");};_ggcd :=&ClassedPoints {Points :points ,IntSlice :classes };if _cecd :=_ggcd .validateIntSlice ();_cecd !=nil {return nil ,_f .Wrap (_cecd ,_gacga ,"");
|
|
};return _ggcd ,nil ;};func (_dbgf *Boxes )Add (box *_ab .Rectangle )error {if _dbgf ==nil {return _f .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");
|
|
};*_dbgf =append (*_dbgf ,box );return nil ;};func (_bega *Bitmap )Zero ()bool {_ebac :=_bega .Width /8;_fdef :=_bega .Width &7;var _ccaf byte ;if _fdef !=0{_ccaf =byte (0xff<<uint (8-_fdef ));};var _eaad ,_gge ,_ggfbc int ;for _gge =0;_gge < _bega .Height ;
|
|
_gge ++{_eaad =_bega .RowStride *_gge ;for _ggfbc =0;_ggfbc < _ebac ;_ggfbc ,_eaad =_ggfbc +1,_eaad +1{if _bega .Data [_eaad ]!=0{return false ;};};if _fdef > 0{if _bega .Data [_eaad ]&_ccaf !=0{return false ;};};};return true ;};func TstVSymbol (t *_g .T ,scale ...int )*Bitmap {_fccb ,_fceaf :=NewWithData (5,5,[]byte {0x88,0x88,0x88,0x50,0x20});
|
|
_d .NoError (t ,_fceaf );return TstGetScaledSymbol (t ,_fccb ,scale ...);};func (_bgfa *Bitmaps )GetBitmap (i int )(*Bitmap ,error ){const _fadc ="\u0047e\u0074\u0042\u0069\u0074\u006d\u0061p";if _bgfa ==nil {return nil ,_f .Error (_fadc ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0042\u0069\u0074ma\u0070\u0073");
|
|
};if i > len (_bgfa .Values )-1{return nil ,_f .Errorf (_fadc ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return _bgfa .Values [i ],nil ;};func (_cceg *Bitmap )GetByteIndex (x ,y int )int {return y *_cceg .RowStride +(x >>3)};
|
|
type RasterOperator int ;func (_gbbfe *Bitmaps )selectByIndicator (_gcfc *_dg .NumSlice )(_bffd *Bitmaps ,_edfc error ){const _ecfe ="\u0042i\u0074\u006d\u0061\u0070s\u002e\u0073\u0065\u006c\u0065c\u0074B\u0079I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";
|
|
if _gbbfe ==nil {return nil ,_f .Error (_ecfe ,"\u0027\u0062\u0027 b\u0069\u0074\u006d\u0061\u0070\u0073\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};if _gcfc ==nil {return nil ,_f .Error (_ecfe ,"'\u006e\u0061\u0027\u0020\u0069\u006ed\u0069\u0063\u0061\u0074\u006f\u0072\u0073\u0020\u006eo\u0074\u0020\u0064e\u0066i\u006e\u0065\u0064");
|
|
};if len (_gbbfe .Values )==0{return _gbbfe ,nil ;};if len (*_gcfc )!=len (_gbbfe .Values ){return nil ,_f .Errorf (_ecfe ,"\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 (*_gcfc ),len (_gbbfe .Values ));
|
|
};var _bcdba ,_dbaee ,_edbfa int ;for _dbaee =0;_dbaee < len (*_gcfc );_dbaee ++{if _bcdba ,_edfc =_gcfc .GetInt (_dbaee );_edfc !=nil {return nil ,_f .Wrap (_edfc ,_ecfe ,"f\u0069\u0072\u0073\u0074\u0020\u0063\u0068\u0065\u0063\u006b");};if _bcdba ==1{_edbfa ++;
|
|
};};if _edbfa ==len (_gbbfe .Values ){return _gbbfe ,nil ;};_bffd =&Bitmaps {};_fbcc :=len (_gbbfe .Values )==len (_gbbfe .Boxes );for _dbaee =0;_dbaee < len (*_gcfc );_dbaee ++{if _bcdba =int ((*_gcfc )[_dbaee ]);_bcdba ==0{continue ;};_bffd .Values =append (_bffd .Values ,_gbbfe .Values [_dbaee ]);
|
|
if _fbcc {_bffd .Boxes =append (_bffd .Boxes ,_gbbfe .Boxes [_dbaee ]);};};return _bffd ,nil ;};func (_cecc *Bitmap )setBit (_fdc int ){_cecc .Data [(_fdc >>3)]|=0x80>>uint (_fdc &7)};func (_gfec *BitmapsArray )AddBox (box *_ab .Rectangle ){_gfec .Boxes =append (_gfec .Boxes ,box )};
|
|
func New (width ,height int )*Bitmap {_dbfb :=_fcc (width ,height );_dbfb .Data =make ([]byte ,height *_dbfb .RowStride );return _dbfb ;};func (_cebg *Bitmaps )GetBox (i int )(*_ab .Rectangle ,error ){const _efaff ="\u0047\u0065\u0074\u0042\u006f\u0078";
|
|
if _cebg ==nil {return nil ,_f .Error (_efaff ,"\u0070\u0072\u006f\u0076id\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0042\u0069\u0074\u006d\u0061\u0070s\u0027");};if i > len (_cebg .Boxes )-1{return nil ,_f .Errorf (_efaff ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
};return _cebg .Boxes [i ],nil ;};func TstWSymbol (t *_g .T ,scale ...int )*Bitmap {_ddcd ,_aagad :=NewWithData (5,5,[]byte {0x88,0x88,0xA8,0xD8,0x88});_d .NoError (t ,_aagad );return TstGetScaledSymbol (t ,_ddcd ,scale ...);};const (ComponentConn Component =iota ;
|
|
ComponentCharacters ;ComponentWords ;);func TstASymbol (t *_g .T )*Bitmap {t .Helper ();_caab :=New (6,6);_d .NoError (t ,_caab .SetPixel (1,0,1));_d .NoError (t ,_caab .SetPixel (2,0,1));_d .NoError (t ,_caab .SetPixel (3,0,1));_d .NoError (t ,_caab .SetPixel (4,0,1));
|
|
_d .NoError (t ,_caab .SetPixel (5,1,1));_d .NoError (t ,_caab .SetPixel (1,2,1));_d .NoError (t ,_caab .SetPixel (2,2,1));_d .NoError (t ,_caab .SetPixel (3,2,1));_d .NoError (t ,_caab .SetPixel (4,2,1));_d .NoError (t ,_caab .SetPixel (5,2,1));_d .NoError (t ,_caab .SetPixel (0,3,1));
|
|
_d .NoError (t ,_caab .SetPixel (5,3,1));_d .NoError (t ,_caab .SetPixel (0,4,1));_d .NoError (t ,_caab .SetPixel (5,4,1));_d .NoError (t ,_caab .SetPixel (1,5,1));_d .NoError (t ,_caab .SetPixel (2,5,1));_d .NoError (t ,_caab .SetPixel (3,5,1));_d .NoError (t ,_caab .SetPixel (4,5,1));
|
|
_d .NoError (t ,_caab .SetPixel (5,5,1));return _caab ;};func (_egdfb *Bitmap )setEightPartlyBytes (_fgge ,_fgdb int ,_cdg uint64 )(_fbce error ){var (_feeab byte ;_fddb int ;);const _cfb ="\u0073\u0065\u0074\u0045ig\u0068\u0074\u0050\u0061\u0072\u0074\u006c\u0079\u0042\u0079\u0074\u0065\u0073";
|
|
for _abfg :=1;_abfg <=_fgdb ;_abfg ++{_fddb =64-_abfg *8;_feeab =byte (_cdg >>uint (_fddb )&0xff);_dd .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",_feeab ,_fgge ,_fgge +_abfg -1,_fgdb ,_fddb );
|
|
if _fbce =_egdfb .SetByte (_fgge +_abfg -1,_feeab );_fbce !=nil {return _f .Wrap (_fbce ,_cfb ,"\u0066\u0075\u006c\u006c\u0042\u0079\u0074\u0065");};};_aecg :=_egdfb .RowStride *8-_egdfb .Width ;if _aecg ==0{return nil ;};_fddb -=8;_feeab =byte (_cdg >>uint (_fddb )&0xff)<<uint (_aecg );
|
|
if _fbce =_egdfb .SetByte (_fgge +_fgdb ,_feeab );_fbce !=nil {return _f .Wrap (_fbce ,_cfb ,"\u0070\u0061\u0064\u0064\u0065\u0064");};return nil ;};func CorrelationScore (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab []int )(_bbeead float64 ,_gbdd error ){const _fcee ="\u0063\u006fr\u0072\u0065\u006ca\u0074\u0069\u006f\u006e\u0053\u0063\u006f\u0072\u0065";
|
|
if bm1 ==nil ||bm2 ==nil {return 0,_f .Error (_fcee ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0062\u0069\u0074ma\u0070\u0073");};if tab ==nil {return 0,_f .Error (_fcee ,"\u0027\u0074\u0061\u0062\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065f\u0069\u006e\u0065\u0064");
|
|
};if area1 <=0||area2 <=0{return 0,_f .Error (_fcee ,"\u0061\u0072\u0065\u0061s\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065\u0020\u0067r\u0065a\u0074\u0065\u0072\u0020\u0074\u0068\u0061n\u0020\u0030");};_gbef ,_adda :=bm1 .Width ,bm1 .Height ;_ecca ,_gfcd :=bm2 .Width ,bm2 .Height ;
|
|
_beadb :=_eddb (_gbef -_ecca );if _beadb > maxDiffW {return 0,nil ;};_dgbc :=_eddb (_adda -_gfcd );if _dgbc > maxDiffH {return 0,nil ;};var _agfc ,_cddf int ;if delX >=0{_agfc =int (delX +0.5);}else {_agfc =int (delX -0.5);};if delY >=0{_cddf =int (delY +0.5);
|
|
}else {_cddf =int (delY -0.5);};_ddaa :=_edad (_cddf ,0);_bbga :=_bfada (_gfcd +_cddf ,_adda );_dddb :=bm1 .RowStride *_ddaa ;_ccc :=bm2 .RowStride *(_ddaa -_cddf );_ebda :=_edad (_agfc ,0);_cgega :=_bfada (_ecca +_agfc ,_gbef );_cbae :=bm2 .RowStride ;
|
|
var _efcg ,_geg int ;if _agfc >=8{_efcg =_agfc >>3;_dddb +=_efcg ;_ebda -=_efcg <<3;_cgega -=_efcg <<3;_agfc &=7;}else if _agfc <=-8{_geg =-((_agfc +7)>>3);_ccc +=_geg ;_cbae -=_geg ;_agfc +=_geg <<3;};if _ebda >=_cgega ||_ddaa >=_bbga {return 0,nil ;};
|
|
_adea :=(_cgega +7)>>3;var (_dgde ,_bagc ,_abfgf byte ;_afef ,_cfcd ,_fec int ;);switch {case _agfc ==0:for _fec =_ddaa ;_fec < _bbga ;_fec ,_dddb ,_ccc =_fec +1,_dddb +bm1 .RowStride ,_ccc +bm2 .RowStride {for _cfcd =0;_cfcd < _adea ;_cfcd ++{_abfgf =bm1 .Data [_dddb +_cfcd ]&bm2 .Data [_ccc +_cfcd ];
|
|
_afef +=tab [_abfgf ];};};case _agfc > 0:if _cbae < _adea {for _fec =_ddaa ;_fec < _bbga ;_fec ,_dddb ,_ccc =_fec +1,_dddb +bm1 .RowStride ,_ccc +bm2 .RowStride {_dgde ,_bagc =bm1 .Data [_dddb ],bm2 .Data [_ccc ]>>uint (_agfc );_abfgf =_dgde &_bagc ;_afef +=tab [_abfgf ];
|
|
for _cfcd =1;_cfcd < _cbae ;_cfcd ++{_dgde ,_bagc =bm1 .Data [_dddb +_cfcd ],(bm2 .Data [_ccc +_cfcd ]>>uint (_agfc ))|(bm2 .Data [_ccc +_cfcd -1]<<uint (8-_agfc ));_abfgf =_dgde &_bagc ;_afef +=tab [_abfgf ];};_dgde =bm1 .Data [_dddb +_cfcd ];_bagc =bm2 .Data [_ccc +_cfcd -1]<<uint (8-_agfc );
|
|
_abfgf =_dgde &_bagc ;_afef +=tab [_abfgf ];};}else {for _fec =_ddaa ;_fec < _bbga ;_fec ,_dddb ,_ccc =_fec +1,_dddb +bm1 .RowStride ,_ccc +bm2 .RowStride {_dgde ,_bagc =bm1 .Data [_dddb ],bm2 .Data [_ccc ]>>uint (_agfc );_abfgf =_dgde &_bagc ;_afef +=tab [_abfgf ];
|
|
for _cfcd =1;_cfcd < _adea ;_cfcd ++{_dgde =bm1 .Data [_dddb +_cfcd ];_bagc =(bm2 .Data [_ccc +_cfcd ]>>uint (_agfc ))|(bm2 .Data [_ccc +_cfcd -1]<<uint (8-_agfc ));_abfgf =_dgde &_bagc ;_afef +=tab [_abfgf ];};};};default:if _adea < _cbae {for _fec =_ddaa ;
|
|
_fec < _bbga ;_fec ,_dddb ,_ccc =_fec +1,_dddb +bm1 .RowStride ,_ccc +bm2 .RowStride {for _cfcd =0;_cfcd < _adea ;_cfcd ++{_dgde =bm1 .Data [_dddb +_cfcd ];_bagc =bm2 .Data [_ccc +_cfcd ]<<uint (-_agfc );_bagc |=bm2 .Data [_ccc +_cfcd +1]>>uint (8+_agfc );
|
|
_abfgf =_dgde &_bagc ;_afef +=tab [_abfgf ];};};}else {for _fec =_ddaa ;_fec < _bbga ;_fec ,_dddb ,_ccc =_fec +1,_dddb +bm1 .RowStride ,_ccc +bm2 .RowStride {for _cfcd =0;_cfcd < _adea -1;_cfcd ++{_dgde =bm1 .Data [_dddb +_cfcd ];_bagc =bm2 .Data [_ccc +_cfcd ]<<uint (-_agfc );
|
|
_bagc |=bm2 .Data [_ccc +_cfcd +1]>>uint (8+_agfc );_abfgf =_dgde &_bagc ;_afef +=tab [_abfgf ];};_dgde =bm1 .Data [_dddb +_cfcd ];_bagc =bm2 .Data [_ccc +_cfcd ]<<uint (-_agfc );_abfgf =_dgde &_bagc ;_afef +=tab [_abfgf ];};};};_bbeead =float64 (_afef )*float64 (_afef )/(float64 (area1 )*float64 (area2 ));
|
|
return _bbeead ,nil ;};func (_bee *Boxes )SelectBySize (width ,height int ,tp LocationFilter ,relation SizeComparison )(_gacf *Boxes ,_edbf error ){const _adec ="\u0042o\u0078e\u0073\u002e\u0053\u0065\u006ce\u0063\u0074B\u0079\u0053\u0069\u007a\u0065";
|
|
if _bee ==nil {return nil ,_f .Error (_adec ,"b\u006f\u0078\u0065\u0073 '\u0062'\u0020\u006e\u006f\u0074\u0020d\u0065\u0066\u0069\u006e\u0065\u0064");};if len (*_bee )==0{return _bee ,nil ;};switch tp {case LocSelectWidth ,LocSelectHeight ,LocSelectIfEither ,LocSelectIfBoth :default:return nil ,_f .Errorf (_adec ,"\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 ,_f .Errorf (_adec ,"i\u006e\u0076\u0061\u006c\u0069\u0064 \u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u0020t\u0079\u0070\u0065:\u0020'\u0025\u0064\u0027",tp );
|
|
};_gdab :=_bee .makeSizeIndicator (width ,height ,tp ,relation );_eegg ,_edbf :=_bee .selectWithIndicator (_gdab );if _edbf !=nil {return nil ,_f .Wrap (_edbf ,_adec ,"");};return _eegg ,nil ;};func (_baaca *Bitmap )setTwoBytes (_ecce int ,_cgdf uint16 )error {if _ecce +1> len (_baaca .Data )-1{return _f .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",_ecce );
|
|
};_baaca .Data [_ecce ]=byte ((_cgdf &0xff00)>>8);_baaca .Data [_ecce +1]=byte (_cgdf &0xff);return nil ;};func (_dae *Bitmap )SizesEqual (s *Bitmap )bool {if _dae ==s {return true ;};if _dae .Width !=s .Width ||_dae .Height !=s .Height {return false ;
|
|
};return true ;};func (_bdagea *Bitmaps )HeightSorter ()func (_adaa ,_ccgd int )bool {return func (_dcef ,_gfgf int )bool {_daca :=_bdagea .Values [_dcef ].Height < _bdagea .Values [_gfgf ].Height ;_dd .Log .Debug ("H\u0065i\u0067\u0068\u0074\u003a\u0020\u0025\u0076\u0020<\u0020\u0025\u0076\u0020= \u0025\u0076",_bdagea .Values [_dcef ].Height ,_bdagea .Values [_gfgf ].Height ,_daca );
|
|
return _daca ;};};func (_cgbg *Bitmaps )AddBox (box *_ab .Rectangle ){_cgbg .Boxes =append (_cgbg .Boxes ,box )};const (SelDontCare SelectionValue =iota ;SelHit ;SelMiss ;);func DilateBrick (d ,s *Bitmap ,hSize ,vSize int )(*Bitmap ,error ){return _dfadd (d ,s ,hSize ,vSize )};
|
|
func TstFrameBitmap ()*Bitmap {return _efff .Copy ()};func (_eed *Bitmap )String ()string {var _age ="\u000a";for _abbb :=0;_abbb < _eed .Height ;_abbb ++{var _dbae string ;for _fddca :=0;_fddca < _eed .Width ;_fddca ++{_befg :=_eed .GetPixel (_fddca ,_abbb );
|
|
if _befg {_dbae +="\u0031";}else {_dbae +="\u0030";};};_age +=_dbae +"\u000a";};return _age ;};func (_cgec MorphProcess )verify (_ebb int ,_aaaea ,_aacgf *int )error {const _cccd ="\u004d\u006f\u0072\u0070hP\u0072\u006f\u0063\u0065\u0073\u0073\u002e\u0076\u0065\u0072\u0069\u0066\u0079";
|
|
switch _cgec .Operation {case MopDilation ,MopErosion ,MopOpening ,MopClosing :if len (_cgec .Arguments )!=2{return _f .Error (_cccd ,"\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");
|
|
};_fdg ,_fggc :=_cgec .getWidthHeight ();if _fdg <=0||_fggc <=0{return _f .Error (_cccd ,"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 :_aacd :=len (_cgec .Arguments );*_aaaea +=_aacd ;if _aacd < 1||_aacd > 4{return _f .Error (_cccd ,"\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 _ggaf :=0;_ggaf < _aacd ;_ggaf ++{if _cgec .Arguments [_ggaf ]< 1||_cgec .Arguments [_ggaf ]> 4{return _f .Error (_cccd ,"\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 (_cgec .Arguments )==0{return _f .Error (_cccd ,"\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");
|
|
};_cgad :=_cgec .Arguments [0];if _cgad !=2&&_cgad !=4&&_cgad !=8{return _f .Error (_cccd ,"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");
|
|
};*_aaaea -=_efefg [_cgad /4];case MopAddBorder :if len (_cgec .Arguments )==0{return _f .Error (_cccd ,"\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");
|
|
};_fggb :=_cgec .Arguments [0];if _ebb > 0{return _f .Error (_cccd ,"\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 _fggb < 1{return _f .Error (_cccd ,"\u0041\u0064\u0064\u0042o\u0072\u0064\u0065\u0072\u0020\u0076\u0061\u006c\u0075\u0065 \u006co\u0077\u0065\u0072\u0020\u0074\u0068\u0061n\u0020\u0030");};*_aacgf =_fggb ;};return nil ;};func (_cfcag *ClassedPoints )ySortFunction ()func (_gfacg int ,_fgbe int )bool {return func (_eeca ,_cagf int )bool {return _cfcag .YAtIndex (_eeca )< _cfcag .YAtIndex (_cagf )};
|
|
};func (_ggga *BitmapsArray )GetBitmaps (i int )(*Bitmaps ,error ){const _ccac ="\u0042\u0069\u0074ma\u0070\u0073\u0041\u0072\u0072\u0061\u0079\u002e\u0047\u0065\u0074\u0042\u0069\u0074\u006d\u0061\u0070\u0073";if _ggga ==nil {return nil ,_f .Error (_ccac ,"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 (_ggga .Values )-1{return nil ,_f .Errorf (_ccac ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return _ggga .Values [i ],nil ;};func _daee (_ddab *Bitmap ,_ebaa ,_efgea int ,_gbgf ,_fbcf int ,_eeeef RasterOperator ,_ecbb *Bitmap ,_dfec ,_gdag int )error {var _daeg ,_bgc ,_ddag ,_ceedf int ;
|
|
if _ebaa < 0{_dfec -=_ebaa ;_gbgf +=_ebaa ;_ebaa =0;};if _dfec < 0{_ebaa -=_dfec ;_gbgf +=_dfec ;_dfec =0;};_daeg =_ebaa +_gbgf -_ddab .Width ;if _daeg > 0{_gbgf -=_daeg ;};_bgc =_dfec +_gbgf -_ecbb .Width ;if _bgc > 0{_gbgf -=_bgc ;};if _efgea < 0{_gdag -=_efgea ;
|
|
_fbcf +=_efgea ;_efgea =0;};if _gdag < 0{_efgea -=_gdag ;_fbcf +=_gdag ;_gdag =0;};_ddag =_efgea +_fbcf -_ddab .Height ;if _ddag > 0{_fbcf -=_ddag ;};_ceedf =_gdag +_fbcf -_ecbb .Height ;if _ceedf > 0{_fbcf -=_ceedf ;};if _gbgf <=0||_fbcf <=0{return nil ;
|
|
};var _befb error ;switch {case _ebaa &7==0&&_dfec &7==0:_befb =_eefc (_ddab ,_ebaa ,_efgea ,_gbgf ,_fbcf ,_eeeef ,_ecbb ,_dfec ,_gdag );case _ebaa &7==_dfec &7:_befb =_fddce (_ddab ,_ebaa ,_efgea ,_gbgf ,_fbcf ,_eeeef ,_ecbb ,_dfec ,_gdag );default:_befb =_bbgba (_ddab ,_ebaa ,_efgea ,_gbgf ,_fbcf ,_eeeef ,_ecbb ,_dfec ,_gdag );
|
|
};if _befb !=nil {return _f .Wrap (_befb ,"r\u0061\u0073\u0074\u0065\u0072\u004f\u0070\u004c\u006f\u0077","");};return nil ;};var MorphBC BoundaryCondition ;func _fca (_cbbf ,_cece *Bitmap ,_fga int ,_ceg []byte ,_bcff int )(_fabd error ){const _aef ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0034";
|
|
var (_agb ,_cegb ,_dbg ,_dcf ,_bdc ,_abc ,_cbbg ,_dad int ;_dafe ,_eab uint32 ;_cfd ,_faab byte ;_abag uint16 ;);_eec :=make ([]byte ,4);_daff :=make ([]byte ,4);for _dbg =0;_dbg < _cbbf .Height -1;_dbg ,_dcf =_dbg +2,_dcf +1{_agb =_dbg *_cbbf .RowStride ;
|
|
_cegb =_dcf *_cece .RowStride ;for _bdc ,_abc =0,0;_bdc < _bcff ;_bdc ,_abc =_bdc +4,_abc +1{for _cbbg =0;_cbbg < 4;_cbbg ++{_dad =_agb +_bdc +_cbbg ;if _dad <=len (_cbbf .Data )-1&&_dad < _agb +_cbbf .RowStride {_eec [_cbbg ]=_cbbf .Data [_dad ];}else {_eec [_cbbg ]=0x00;
|
|
};_dad =_agb +_cbbf .RowStride +_bdc +_cbbg ;if _dad <=len (_cbbf .Data )-1&&_dad < _agb +(2*_cbbf .RowStride ){_daff [_cbbg ]=_cbbf .Data [_dad ];}else {_daff [_cbbg ]=0x00;};};_dafe =_ea .BigEndian .Uint32 (_eec );_eab =_ea .BigEndian .Uint32 (_daff );
|
|
_eab &=_dafe ;_eab &=_eab <<1;_eab &=0xaaaaaaaa;_dafe =_eab |(_eab <<7);_cfd =byte (_dafe >>24);_faab =byte ((_dafe >>8)&0xff);_dad =_cegb +_abc ;if _dad +1==len (_cece .Data )-1||_dad +1>=_cegb +_cece .RowStride {_cece .Data [_dad ]=_ceg [_cfd ];if _fabd =_cece .SetByte (_dad ,_ceg [_cfd ]);
|
|
_fabd !=nil {return _f .Wrapf (_fabd ,_aef ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_dad );};}else {_abag =(uint16 (_ceg [_cfd ])<<8)|uint16 (_ceg [_faab ]);if _fabd =_cece .setTwoBytes (_dad ,_abag );_fabd !=nil {return _f .Wrapf (_fabd ,_aef ,"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",_dad );
|
|
};_abc ++;};};};return nil ;};func _ddb (_bf ,_cf *Bitmap )(_fg error ){const _ec ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0034";_bgb :=_cf .RowStride ;_db :=_bf .RowStride ;_dbf :=_cf .RowStride *4-_bf .RowStride ;
|
|
var (_fe ,_fac byte ;_dgb uint32 ;_cbb ,_ff ,_ca ,_ge ,_ga ,_gae ,_egc int ;);for _ca =0;_ca < _cf .Height ;_ca ++{_cbb =_ca *_bgb ;_ff =4*_ca *_db ;for _ge =0;_ge < _bgb ;_ge ++{_fe =_cf .Data [_cbb +_ge ];_dgb =_ffee [_fe ];_gae =_ff +_ge *4;if _dbf !=0&&(_ge +1)*4> _bf .RowStride {for _ga =_dbf ;
|
|
_ga > 0;_ga --{_fac =byte ((_dgb >>uint (_ga *8))&0xff);_egc =_gae +(_dbf -_ga );if _fg =_bf .SetByte (_egc ,_fac );_fg !=nil {return _f .Wrapf (_fg ,_ec ,"D\u0069\u0066\u0066\u0065\u0072\u0065n\u0074\u0020\u0072\u006f\u0077\u0073\u0074\u0072\u0069d\u0065\u0073\u002e \u004b:\u0020\u0025\u0064",_ga );
|
|
};};}else if _fg =_bf .setFourBytes (_gae ,_dgb );_fg !=nil {return _f .Wrap (_fg ,_ec ,"");};if _fg =_bf .setFourBytes (_ff +_ge *4,_ffee [_cf .Data [_cbb +_ge ]]);_fg !=nil {return _f .Wrap (_fg ,_ec ,"");};};for _ga =1;_ga < 4;_ga ++{for _ge =0;_ge < _db ;
|
|
_ge ++{if _fg =_bf .SetByte (_ff +_ga *_db +_ge ,_bf .Data [_ff +_ge ]);_fg !=nil {return _f .Wrapf (_fg ,_ec ,"\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",_ga ,_ge );
|
|
};};};};return nil ;};type BitmapsArray struct{Values []*Bitmaps ;Boxes []*_ab .Rectangle ;};func TstTSymbol (t *_g .T ,scale ...int )*Bitmap {_bddad ,_bbad :=NewWithData (5,5,[]byte {0xF8,0x20,0x20,0x20,0x20});_d .NoError (t ,_bbad );return TstGetScaledSymbol (t ,_bddad ,scale ...);
|
|
};func _cdcf (_cef ,_ffac *Bitmap ,_cefd *Selection )(*Bitmap ,error ){const _eegc ="\u0065\u0072\u006fd\u0065";var (_dgbce error ;_fbdg *Bitmap ;);_cef ,_dgbce =_gcab (_cef ,_ffac ,_cefd ,&_fbdg );if _dgbce !=nil {return nil ,_f .Wrap (_dgbce ,_eegc ,"");
|
|
};if _dgbce =_cef .setAll ();_dgbce !=nil {return nil ,_f .Wrap (_dgbce ,_eegc ,"");};var _gfea SelectionValue ;for _abea :=0;_abea < _cefd .Height ;_abea ++{for _febf :=0;_febf < _cefd .Width ;_febf ++{_gfea =_cefd .Data [_abea ][_febf ];if _gfea ==SelHit {_dgbce =_caeg (_cef ,_cefd .Cx -_febf ,_cefd .Cy -_abea ,_ffac .Width ,_ffac .Height ,PixSrcAndDst ,_fbdg ,0,0);
|
|
if _dgbce !=nil {return nil ,_f .Wrap (_dgbce ,_eegc ,"");};};};};if MorphBC ==SymmetricMorphBC {return _cef ,nil ;};_cfgc ,_ebbb ,_ebga ,_aaaf :=_cefd .findMaxTranslations ();if _cfgc > 0{if _dgbce =_cef .RasterOperation (0,0,_cfgc ,_ffac .Height ,PixClr ,nil ,0,0);
|
|
_dgbce !=nil {return nil ,_f .Wrap (_dgbce ,_eegc ,"\u0078\u0070\u0020\u003e\u0020\u0030");};};if _ebga > 0{if _dgbce =_cef .RasterOperation (_ffac .Width -_ebga ,0,_ebga ,_ffac .Height ,PixClr ,nil ,0,0);_dgbce !=nil {return nil ,_f .Wrap (_dgbce ,_eegc ,"\u0078\u006e\u0020\u003e\u0020\u0030");
|
|
};};if _ebbb > 0{if _dgbce =_cef .RasterOperation (0,0,_ffac .Width ,_ebbb ,PixClr ,nil ,0,0);_dgbce !=nil {return nil ,_f .Wrap (_dgbce ,_eegc ,"\u0079\u0070\u0020\u003e\u0020\u0030");};};if _aaaf > 0{if _dgbce =_cef .RasterOperation (0,_ffac .Height -_aaaf ,_ffac .Width ,_aaaf ,PixClr ,nil ,0,0);
|
|
_dgbce !=nil {return nil ,_f .Wrap (_dgbce ,_eegc ,"\u0079\u006e\u0020\u003e\u0020\u0030");};};return _cef ,nil ;};var _dedb =[]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 (_ggef Points )GetGeometry (i int )(_gcdf ,_egeb float32 ,_bdee error ){if i > len (_ggef )-1{return 0,0,_f .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 );
|
|
};_ebgd :=_ggef [i ];return _ebgd .X ,_ebgd .Y ,nil ;};type Getter interface{GetBitmap ()*Bitmap ;};func TstImageBitmap ()*Bitmap {return _eeeeff .Copy ()};func _cec ()(_bbc [256]uint32 ){for _dba :=0;_dba < 256;_dba ++{if _dba &0x01!=0{_bbc [_dba ]|=0xf;
|
|
};if _dba &0x02!=0{_bbc [_dba ]|=0xf0;};if _dba &0x04!=0{_bbc [_dba ]|=0xf00;};if _dba &0x08!=0{_bbc [_dba ]|=0xf000;};if _dba &0x10!=0{_bbc [_dba ]|=0xf0000;};if _dba &0x20!=0{_bbc [_dba ]|=0xf00000;};if _dba &0x40!=0{_bbc [_dba ]|=0xf000000;};if _dba &0x80!=0{_bbc [_dba ]|=0xf0000000;
|
|
};};return _bbc ;};func (_bbbc *Bitmap )SetByte (index int ,v byte )error {if index > len (_bbbc .Data )-1||index < 0{return _f .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 );
|
|
};_bbbc .Data [index ]=v ;return nil ;};func CorrelationScoreSimple (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab []int )(_gacfd float64 ,_dgdc error ){const _aggec ="\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 _gacfd ,_f .Error (_aggec ,"n\u0069l\u0020\u0062\u0069\u0074\u006d\u0061\u0070\u0073 \u0070\u0072\u006f\u0076id\u0065\u0064");};if tab ==nil {return _gacfd ,_f .Error (_aggec ,"\u0074\u0061\u0062\u0020\u0075\u006e\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};if area1 ==0||area2 ==0{return _gacfd ,_f .Error (_aggec ,"\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064\u0020\u0061\u0072e\u0061\u0073\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065 \u003e\u0020\u0030");};_cdda ,_ccfd :=bm1 .Width ,bm1 .Height ;
|
|
_aebf ,_eeb :=bm2 .Width ,bm2 .Height ;if _eddb (_cdda -_aebf )> maxDiffW {return 0,nil ;};if _eddb (_ccfd -_eeb )> maxDiffH {return 0,nil ;};var _ccge ,_aebdd int ;if delX >=0{_ccge =int (delX +0.5);}else {_ccge =int (delX -0.5);};if delY >=0{_aebdd =int (delY +0.5);
|
|
}else {_aebdd =int (delY -0.5);};_adddb :=bm1 .createTemplate ();if _dgdc =_adddb .RasterOperation (_ccge ,_aebdd ,_aebf ,_eeb ,PixSrc ,bm2 ,0,0);_dgdc !=nil {return _gacfd ,_f .Wrap (_dgdc ,_aggec ,"\u0062m\u0032 \u0074\u006f\u0020\u0054\u0065\u006d\u0070\u006c\u0061\u0074\u0065");
|
|
};if _dgdc =_adddb .RasterOperation (0,0,_cdda ,_ccfd ,PixSrcAndDst ,bm1 ,0,0);_dgdc !=nil {return _gacfd ,_f .Wrap (_dgdc ,_aggec ,"b\u006d\u0031\u0020\u0061\u006e\u0064\u0020\u0062\u006d\u0054");};_dbcf :=_adddb .countPixels ();_gacfd =float64 (_dbcf )*float64 (_dbcf )/(float64 (area1 )*float64 (area2 ));
|
|
return _gacfd ,nil ;};func (_eabd *Bitmap )GetComponents (components Component ,maxWidth ,maxHeight int )(_fdcd *Bitmaps ,_gfcc *Boxes ,_cffe error ){const _dccc ="B\u0069t\u006d\u0061\u0070\u002e\u0047\u0065\u0074\u0043o\u006d\u0070\u006f\u006een\u0074\u0073";
|
|
if _eabd ==nil {return nil ,nil ,_f .Error (_dccc ,"\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 ,_f .Error (_dccc ,"\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 _eabd .Zero (){_gfcc =&Boxes {};_fdcd =&Bitmaps {};return _fdcd ,_gfcc ,nil ;};switch components {case ComponentConn :_fdcd =&Bitmaps {};if _gfcc ,_cffe =_eabd .ConnComponents (_fdcd ,8);_cffe !=nil {return nil ,nil ,_f .Wrap (_cffe ,_dccc ,"\u006e\u006f \u0070\u0072\u0065p\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");
|
|
};case ComponentCharacters :_gcbc ,_geec :=MorphSequence (_eabd ,MorphProcess {Operation :MopClosing ,Arguments :[]int {1,6}});if _geec !=nil {return nil ,nil ,_f .Wrap (_geec ,_dccc ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");
|
|
};if _dd .Log .IsLogLevel (_dd .LogLevelTrace ){_dd .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",_gcbc .String ());
|
|
};_cagg :=&Bitmaps {};_gfcc ,_geec =_gcbc .ConnComponents (_cagg ,8);if _geec !=nil {return nil ,nil ,_f .Wrap (_geec ,_dccc ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");
|
|
};if _dd .Log .IsLogLevel (_dd .LogLevelTrace ){_dd .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",_cagg .String ());
|
|
};if _fdcd ,_geec =_cagg .ClipToBitmap (_eabd );_geec !=nil {return nil ,nil ,_f .Wrap (_geec ,_dccc ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");};case ComponentWords :_gcgc :=1;
|
|
var _baedf *Bitmap ;switch {case _eabd .XResolution <=200:_baedf =_eabd ;case _eabd .XResolution <=400:_gcgc =2;_baedf ,_cffe =_bdgf (_eabd ,1,0,0,0);if _cffe !=nil {return nil ,nil ,_f .Wrap (_cffe ,_dccc ,"w\u006f\u0072\u0064\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0020\u002d \u0078\u0072\u0065s\u003c=\u0034\u0030\u0030");
|
|
};default:_gcgc =4;_baedf ,_cffe =_bdgf (_eabd ,1,1,0,0);if _cffe !=nil {return nil ,nil ,_f .Wrap (_cffe ,_dccc ,"\u0077\u006f\u0072\u0064 \u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073 \u002d \u0078\u0072\u0065\u0073\u0020\u003e\u00204\u0030\u0030");
|
|
};};_fgcg ,_ ,_gcegb :=_eeed (_baedf );if _gcegb !=nil {return nil ,nil ,_f .Wrap (_gcegb ,_dccc ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");};_beec ,_gcegb :=_ffde (_fgcg ,_gcgc );if _gcegb !=nil {return nil ,nil ,_f .Wrap (_gcegb ,_dccc ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");
|
|
};_ccff :=&Bitmaps {};if _gfcc ,_gcegb =_beec .ConnComponents (_ccff ,4);_gcegb !=nil {return nil ,nil ,_f .Wrap (_gcegb ,_dccc ,"\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 _fdcd ,_gcegb =_ccff .ClipToBitmap (_eabd );_gcegb !=nil {return nil ,nil ,_f .Wrap (_gcegb ,_dccc ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");};};_fdcd ,_cffe =_fdcd .SelectBySize (maxWidth ,maxHeight ,LocSelectIfBoth ,SizeSelectIfLTE );
|
|
if _cffe !=nil {return nil ,nil ,_f .Wrap (_cffe ,_dccc ,"");};_gfcc ,_cffe =_gfcc .SelectBySize (maxWidth ,maxHeight ,LocSelectIfBoth ,SizeSelectIfLTE );if _cffe !=nil {return nil ,nil ,_f .Wrap (_cffe ,_dccc ,"");};return _fdcd ,_gfcc ,nil ;};func TstWriteSymbols (t *_g .T ,bms *Bitmaps ,src *Bitmap ){for _dcdd :=0;
|
|
_dcdd < bms .Size ();_dcdd ++{_cegda :=bms .Values [_dcdd ];_eagb :=bms .Boxes [_dcdd ];_dffffc :=src .RasterOperation (_eagb .Min .X ,_eagb .Min .Y ,_cegda .Width ,_cegda .Height ,PixSrc ,_cegda ,0,0);_d .NoError (t ,_dffffc );};};func (_gegbb *Bitmaps )ClipToBitmap (s *Bitmap )(*Bitmaps ,error ){const _cbbe ="B\u0069t\u006d\u0061\u0070\u0073\u002e\u0043\u006c\u0069p\u0054\u006f\u0042\u0069tm\u0061\u0070";
|
|
if _gegbb ==nil {return nil ,_f .Error (_cbbe ,"\u0042\u0069\u0074\u006dap\u0073\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};if s ==nil {return nil ,_f .Error (_cbbe ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");
|
|
};_cfga :=len (_gegbb .Values );_cdgdd :=&Bitmaps {Values :make ([]*Bitmap ,_cfga ),Boxes :make ([]*_ab .Rectangle ,_cfga )};var (_dgcff ,_bcge *Bitmap ;_bbff *_ab .Rectangle ;_cged error ;);for _bddag :=0;_bddag < _cfga ;_bddag ++{if _dgcff ,_cged =_gegbb .GetBitmap (_bddag );
|
|
_cged !=nil {return nil ,_f .Wrap (_cged ,_cbbe ,"");};if _bbff ,_cged =_gegbb .GetBox (_bddag );_cged !=nil {return nil ,_f .Wrap (_cged ,_cbbe ,"");};if _bcge ,_cged =s .clipRectangle (_bbff ,nil );_cged !=nil {return nil ,_f .Wrap (_cged ,_cbbe ,"");
|
|
};if _bcge ,_cged =_bcge .And (_dgcff );_cged !=nil {return nil ,_f .Wrap (_cged ,_cbbe ,"");};_cdgdd .Values [_bddag ]=_bcge ;_cdgdd .Boxes [_bddag ]=_bbff ;};return _cdgdd ,nil ;};func NewWithData (width ,height int ,data []byte )(*Bitmap ,error ){const _gdc ="N\u0065\u0077\u0057\u0069\u0074\u0068\u0044\u0061\u0074\u0061";
|
|
_baa :=_fcc (width ,height );_baa .Data =data ;if len (data )< height *_baa .RowStride {return nil ,_f .Errorf (_gdc ,"\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 *_baa .RowStride );
|
|
};return _baa ,nil ;};func (_dfaa *Bitmap )removeBorderGeneral (_faef ,_aaf ,_fgea ,_gcbf int )(*Bitmap ,error ){const _bbg ="\u0072\u0065\u006d\u006fve\u0042\u006f\u0072\u0064\u0065\u0072\u0047\u0065\u006e\u0065\u0072\u0061\u006c";if _faef < 0||_aaf < 0||_fgea < 0||_gcbf < 0{return nil ,_f .Error (_bbg ,"\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");
|
|
};_gfbe ,_bfad :=_dfaa .Width ,_dfaa .Height ;_efda :=_gfbe -_faef -_aaf ;_bfbd :=_bfad -_fgea -_gcbf ;if _efda <=0{return nil ,_f .Errorf (_bbg ,"w\u0069\u0064\u0074\u0068: \u0025d\u0020\u006d\u0075\u0073\u0074 \u0062\u0065\u0020\u003e\u0020\u0030",_efda );
|
|
};if _bfbd <=0{return nil ,_f .Errorf (_bbg ,"\u0068\u0065\u0069\u0067ht\u003a\u0020\u0025\u0064\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065\u0020\u003e \u0030",_bfbd );};_fbdff :=New (_efda ,_bfbd );_fbdff .Color =_dfaa .Color ;_geca :=_fbdff .RasterOperation (0,0,_efda ,_bfbd ,PixSrc ,_dfaa ,_faef ,_fgea );
|
|
if _geca !=nil {return nil ,_f .Wrap (_geca ,_bbg ,"");};return _fbdff ,nil ;};type fillSegment struct{_gcda int ;_dbcd int ;_cccf int ;_cefc int ;};func _efab (_abdgf *Bitmap ,_bgbef *_dg .Stack ,_bggb ,_geag int )(_eafg *_ab .Rectangle ,_bbgfg error ){const _fcde ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";
|
|
if _abdgf ==nil {return nil ,_f .Error (_fcde ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");};if _bgbef ==nil {return nil ,_f .Error (_fcde ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");
|
|
};_fbdca ,_gdge :=_abdgf .Width ,_abdgf .Height ;_gdgg :=_fbdca -1;_bada :=_gdge -1;if _bggb < 0||_bggb > _gdgg ||_geag < 0||_geag > _bada ||!_abdgf .GetPixel (_bggb ,_geag ){return nil ,nil ;};var _dffg *_ab .Rectangle ;_dffg ,_bbgfg =Rect (100000,100000,0,0);
|
|
if _bbgfg !=nil {return nil ,_f .Wrap (_bbgfg ,_fcde ,"");};if _bbgfg =_cdbeb (_bgbef ,_bggb ,_bggb ,_geag ,1,_bada ,_dffg );_bbgfg !=nil {return nil ,_f .Wrap (_bbgfg ,_fcde ,"\u0069\u006e\u0069t\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _bbgfg =_cdbeb (_bgbef ,_bggb ,_bggb ,_geag +1,-1,_bada ,_dffg );
|
|
_bbgfg !=nil {return nil ,_f .Wrap (_bbgfg ,_fcde ,"\u0032\u006ed\u0020\u0069\u006ei\u0074\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};_dffg .Min .X ,_dffg .Max .X =_bggb ,_bggb ;_dffg .Min .Y ,_dffg .Max .Y =_geag ,_geag ;var (_eaea *fillSegment ;
|
|
_ccde int ;);for _bgbef .Len ()> 0{if _eaea ,_bbgfg =_dbcg (_bgbef );_bbgfg !=nil {return nil ,_f .Wrap (_bbgfg ,_fcde ,"");};_geag =_eaea ._cccf ;for _bggb =_eaea ._gcda ;_bggb >=0&&_abdgf .GetPixel (_bggb ,_geag );_bggb --{if _bbgfg =_abdgf .SetPixel (_bggb ,_geag ,0);
|
|
_bbgfg !=nil {return nil ,_f .Wrap (_bbgfg ,_fcde ,"");};};if _bggb >=_eaea ._gcda {for _bggb ++;_bggb <=_eaea ._dbcd &&_bggb <=_gdgg &&!_abdgf .GetPixel (_bggb ,_geag );_bggb ++{};_ccde =_bggb ;if !(_bggb <=_eaea ._dbcd &&_bggb <=_gdgg ){continue ;};}else {_ccde =_bggb +1;
|
|
if _ccde < _eaea ._gcda -1{if _bbgfg =_cdbeb (_bgbef ,_ccde ,_eaea ._gcda -1,_eaea ._cccf ,-_eaea ._cefc ,_bada ,_dffg );_bbgfg !=nil {return nil ,_f .Wrap (_bbgfg ,_fcde ,"\u006c\u0065\u0061\u006b\u0020\u006f\u006e\u0020\u006c\u0065\u0066\u0074 \u0073\u0069\u0064\u0065");
|
|
};};_bggb =_eaea ._gcda +1;};for {for ;_bggb <=_gdgg &&_abdgf .GetPixel (_bggb ,_geag );_bggb ++{if _bbgfg =_abdgf .SetPixel (_bggb ,_geag ,0);_bbgfg !=nil {return nil ,_f .Wrap (_bbgfg ,_fcde ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _bbgfg =_cdbeb (_bgbef ,_ccde ,_bggb -1,_eaea ._cccf ,_eaea ._cefc ,_bada ,_dffg );
|
|
_bbgfg !=nil {return nil ,_f .Wrap (_bbgfg ,_fcde ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _bggb > _eaea ._dbcd +1{if _bbgfg =_cdbeb (_bgbef ,_eaea ._dbcd +1,_bggb -1,_eaea ._cccf ,-_eaea ._cefc ,_bada ,_dffg );_bbgfg !=nil {return nil ,_f .Wrap (_bbgfg ,_fcde ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");
|
|
};};for _bggb ++;_bggb <=_eaea ._dbcd &&_bggb <=_gdgg &&!_abdgf .GetPixel (_bggb ,_geag );_bggb ++{};_ccde =_bggb ;if !(_bggb <=_eaea ._dbcd &&_bggb <=_gdgg ){break ;};};};_dffg .Max .X ++;_dffg .Max .Y ++;return _dffg ,nil ;};func (_afcd *Bitmap )ConnComponents (bms *Bitmaps ,connectivity int )(_gbb *Boxes ,_bdgcb error ){const _addd ="B\u0069\u0074\u006d\u0061p.\u0043o\u006e\u006e\u0043\u006f\u006dp\u006f\u006e\u0065\u006e\u0074\u0073";
|
|
if _afcd ==nil {return nil ,_f .Error (_addd ,"\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 ,_f .Error (_addd ,"\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 _gbb ,_bdgcb =_afcd .connComponentsBB (connectivity );_bdgcb !=nil {return nil ,_f .Wrap (_bdgcb ,_addd ,"");};}else {if _gbb ,_bdgcb =_afcd .connComponentsBitmapsBB (bms ,connectivity );_bdgcb !=nil {return nil ,_f .Wrap (_bdgcb ,_addd ,"");
|
|
};};return _gbb ,nil ;};func _bbgf (_gbed ,_daef ,_cge *Bitmap )(*Bitmap ,error ){const _acea ="\u0073\u0075\u0062\u0074\u0072\u0061\u0063\u0074";if _daef ==nil {return nil ,_f .Error (_acea ,"'\u0073\u0031\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");
|
|
};if _cge ==nil {return nil ,_f .Error (_acea ,"'\u0073\u0032\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};var _ccg error ;switch {case _gbed ==_daef :if _ccg =_gbed .RasterOperation (0,0,_daef .Width ,_daef .Height ,PixNotSrcAndDst ,_cge ,0,0);
|
|
_ccg !=nil {return nil ,_f .Wrap (_ccg ,_acea ,"\u0064 \u003d\u003d\u0020\u0073\u0031");};case _gbed ==_cge :if _ccg =_gbed .RasterOperation (0,0,_daef .Width ,_daef .Height ,PixNotSrcAndDst ,_daef ,0,0);_ccg !=nil {return nil ,_f .Wrap (_ccg ,_acea ,"\u0064 \u003d\u003d\u0020\u0073\u0032");
|
|
};default:_gbed ,_ccg =_gcff (_gbed ,_daef );if _ccg !=nil {return nil ,_f .Wrap (_ccg ,_acea ,"");};if _ccg =_gbed .RasterOperation (0,0,_daef .Width ,_daef .Height ,PixNotSrcAndDst ,_cge ,0,0);_ccg !=nil {return nil ,_f .Wrap (_ccg ,_acea ,"\u0064e\u0066\u0061\u0075\u006c\u0074");
|
|
};};return _gbed ,nil ;};func _ffde (_fede *Bitmap ,_agfg int )(*Bitmap ,error ){const _fgdab ="\u0065x\u0070a\u006e\u0064\u0052\u0065\u0070\u006c\u0069\u0063\u0061\u0074\u0065";if _fede ==nil {return nil ,_f .Error (_fgdab ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if _agfg <=0{return nil ,_f .Error (_fgdab ,"i\u006e\u0076\u0061\u006cid\u0020f\u0061\u0063\u0074\u006f\u0072 \u002d\u0020\u003c\u003d\u0020\u0030");};if _agfg ==1{_fagg ,_gffdf :=_gcff (nil ,_fede );if _gffdf !=nil {return nil ,_f .Wrap (_gffdf ,_fgdab ,"\u0066\u0061\u0063\u0074\u006f\u0072\u0020\u003d\u0020\u0031");
|
|
};return _fagg ,nil ;};_afce ,_aaca :=_bd (_fede ,_agfg ,_agfg );if _aaca !=nil {return nil ,_f .Wrap (_aaca ,_fgdab ,"");};return _afce ,nil ;};func init (){const _bfga ="\u0062\u0069\u0074\u006dap\u0073\u002e\u0069\u006e\u0069\u0074\u0069\u0061\u006c\u0069\u007a\u0061\u0074\u0069o\u006e";
|
|
_efff =New (50,40);var _egff error ;_efff ,_egff =_efff .AddBorder (2,1);if _egff !=nil {panic (_f .Wrap (_egff ,_bfga ,"f\u0072\u0061\u006d\u0065\u0042\u0069\u0074\u006d\u0061\u0070"));};_eeeeff ,_egff =NewWithData (50,22,_dedb );if _egff !=nil {panic (_f .Wrap (_egff ,_bfga ,"i\u006d\u0061\u0067\u0065\u0042\u0069\u0074\u006d\u0061\u0070"));
|
|
};};func TstGetScaledSymbol (t *_g .T ,sm *Bitmap ,scale ...int )*Bitmap {if len (scale )==0{return sm ;};if scale [0]==1{return sm ;};_cedg ,_baaa :=MorphSequence (sm ,MorphProcess {Operation :MopReplicativeBinaryExpansion ,Arguments :scale });_d .NoError (t ,_baaa );
|
|
return _cedg ;};func (_acgb *byWidth )Less (i ,j int )bool {return _acgb .Values [i ].Width < _acgb .Values [j ].Width };func (_dcbb *Bitmap )CreateTemplate ()*Bitmap {return _dcbb .createTemplate ()};func TstNSymbol (t *_g .T ,scale ...int )*Bitmap {_aggbc ,_dcdff :=NewWithData (4,5,[]byte {0x90,0xD0,0xB0,0x90,0x90});
|
|
_d .NoError (t ,_dcdff );return TstGetScaledSymbol (t ,_aggbc ,scale ...);};func (_bbfd *Bitmaps )GroupByHeight ()(*BitmapsArray ,error ){const _fdcg ="\u0047\u0072\u006f\u0075\u0070\u0042\u0079\u0048\u0065\u0069\u0067\u0068\u0074";if len (_bbfd .Values )==0{return nil ,_f .Error (_fdcg ,"\u006eo\u0020v\u0061\u006c\u0075\u0065\u0073 \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");
|
|
};_aceda :=&BitmapsArray {};_bbfd .SortByHeight ();_dabd :=-1;_ecg :=-1;for _ddfeg :=0;_ddfeg < len (_bbfd .Values );_ddfeg ++{_adcba :=_bbfd .Values [_ddfeg ].Height ;if _adcba > _dabd {_dabd =_adcba ;_ecg ++;_aceda .Values =append (_aceda .Values ,&Bitmaps {});
|
|
};_aceda .Values [_ecg ].AddBitmap (_bbfd .Values [_ddfeg ]);};return _aceda ,nil ;};func _fdff (_deae *Bitmap ,_efaf *Bitmap ,_ebcab *Selection )(*Bitmap ,error ){var (_fece *Bitmap ;_dgbdc error ;);_deae ,_dgbdc =_gcab (_deae ,_efaf ,_ebcab ,&_fece );
|
|
if _dgbdc !=nil {return nil ,_dgbdc ;};if _dgbdc =_deae .clearAll ();_dgbdc !=nil {return nil ,_dgbdc ;};var _edec SelectionValue ;for _cfbc :=0;_cfbc < _ebcab .Height ;_cfbc ++{for _fccf :=0;_fccf < _ebcab .Width ;_fccf ++{_edec =_ebcab .Data [_cfbc ][_fccf ];
|
|
if _edec ==SelHit {if _dgbdc =_deae .RasterOperation (_fccf -_ebcab .Cx ,_cfbc -_ebcab .Cy ,_efaf .Width ,_efaf .Height ,PixSrcOrDst ,_fece ,0,0);_dgbdc !=nil {return nil ,_dgbdc ;};};};};return _deae ,nil ;};func (_caec *ClassedPoints )Swap (i ,j int ){_caec .IntSlice [i ],_caec .IntSlice [j ]=_caec .IntSlice [j ],_caec .IntSlice [i ];
|
|
};func (_deg *Bitmap )GetPixel (x ,y int )bool {_afd :=_deg .GetByteIndex (x ,y );_fgcf :=_deg .GetBitOffset (x );_feg :=uint (7-_fgcf );if _afd > len (_deg .Data )-1{_dd .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 ,_deg );
|
|
return false ;};if (_deg .Data [_afd ]>>_feg )&0x01>=1{return true ;};return false ;};func (_geff *ClassedPoints )SortByX (){_geff ._beeeb =_geff .xSortFunction ();_c .Sort (_geff )};func _cdae (_fgaf ,_agge *Bitmap ,_efef ,_gcfe ,_egg ,_eabg ,_dcbd ,_dbbe ,_fcgef ,_fega int ,_gcdg CombinationOperator )error {var _eedg int ;
|
|
_bde :=func (){_eedg ++;_egg +=_agge .RowStride ;_eabg +=_fgaf .RowStride ;_dcbd +=_fgaf .RowStride };for _eedg =_efef ;_eedg < _gcfe ;_bde (){var _gebd uint16 ;_gbfe :=_egg ;for _ccf :=_eabg ;_ccf <=_dcbd ;_ccf ++{_aee ,_dggdf :=_agge .GetByte (_gbfe );
|
|
if _dggdf !=nil {return _dggdf ;};_dbd ,_dggdf :=_fgaf .GetByte (_ccf );if _dggdf !=nil {return _dggdf ;};_gebd =(_gebd |uint16 (_dbd ))<<uint (_fega );_dbd =byte (_gebd >>8);if _ccf ==_dcbd {_dbd =_eade (uint (_dbbe ),_dbd );};if _dggdf =_agge .SetByte (_gbfe ,_faff (_aee ,_dbd ,_gcdg ));
|
|
_dggdf !=nil {return _dggdf ;};_gbfe ++;_gebd <<=uint (_fcgef );};};return nil ;};func (_cab *Bitmap )Equivalent (s *Bitmap )bool {return _cab .equivalent (s )};func _dggeg (_aacc ,_gafd *Bitmap ,_ggab ,_edgd int )(*Bitmap ,error ){const _bcfe ="\u006fp\u0065\u006e\u0042\u0072\u0069\u0063k";
|
|
if _gafd ==nil {return nil ,_f .Error (_bcfe ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};if _ggab < 1&&_edgd < 1{return nil ,_f .Error (_bcfe ,"\u0068\u0053\u0069\u007ae \u003c\u0020\u0031\u0020\u0026\u0026\u0020\u0076\u0053\u0069\u007a\u0065\u0020\u003c \u0031");
|
|
};if _ggab ==1&&_edgd ==1{return _gafd .Copy (),nil ;};if _ggab ==1||_edgd ==1{var _dffc error ;_dbef :=SelCreateBrick (_edgd ,_ggab ,_edgd /2,_ggab /2,SelHit );_aacc ,_dffc =_fgcgd (_aacc ,_gafd ,_dbef );if _dffc !=nil {return nil ,_f .Wrap (_dffc ,_bcfe ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _aacc ,nil ;};_cbc :=SelCreateBrick (1,_ggab ,0,_ggab /2,SelHit );_dgcd :=SelCreateBrick (_edgd ,1,_edgd /2,0,SelHit );_gbfc ,_gbba :=_cdcf (nil ,_gafd ,_cbc );if _gbba !=nil {return nil ,_f .Wrap (_gbba ,_bcfe ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");
|
|
};_aacc ,_gbba =_cdcf (_aacc ,_gbfc ,_dgcd );if _gbba !=nil {return nil ,_f .Wrap (_gbba ,_bcfe ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};_ ,_gbba =_fdff (_gbfc ,_aacc ,_cbc );if _gbba !=nil {return nil ,_f .Wrap (_gbba ,_bcfe ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
};_ ,_gbba =_fdff (_aacc ,_gbfc ,_dgcd );if _gbba !=nil {return nil ,_f .Wrap (_gbba ,_bcfe ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};return _aacc ,nil ;};func (_ccbg *Bitmap )RemoveBorderGeneral (left ,right ,top ,bot int )(*Bitmap ,error ){return _ccbg .removeBorderGeneral (left ,right ,top ,bot );
|
|
};func (_cafag *Points )Add (pt *Points )error {const _facfb ="\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0041\u0064\u0064";if _cafag ==nil {return _f .Error (_facfb ,"\u0070o\u0069n\u0074\u0073\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if pt ==nil {return _f .Error (_facfb ,"a\u0072\u0067\u0075\u006d\u0065\u006et\u0020\u0070\u006f\u0069\u006e\u0074\u0073\u0020\u006eo\u0074\u0020\u0064e\u0066i\u006e\u0065\u0064");};*_cafag =append (*_cafag ,*pt ...);return nil ;};type Selection struct{Height ,Width int ;
|
|
Cx ,Cy int ;Name string ;Data [][]SelectionValue ;};func MorphSequence (src *Bitmap ,sequence ...MorphProcess )(*Bitmap ,error ){return _bfcdc (src ,sequence ...);};func (_fcg *Bitmap )GetUnpaddedData ()([]byte ,error ){_bdgc :=uint (_fcg .Width &0x07);
|
|
if _bdgc ==0{return _fcg .Data ,nil ;};_dgg :=_fcg .Width *_fcg .Height ;if _dgg %8!=0{_dgg >>=3;_dgg ++;}else {_dgg >>=3;};_ebag :=make ([]byte ,_dgg );_dec :=_gd .NewWriterMSB (_ebag );const _cfca ="\u0047e\u0074U\u006e\u0070\u0061\u0064\u0064\u0065\u0064\u0044\u0061\u0074\u0061";
|
|
for _efec :=0;_efec < _fcg .Height ;_efec ++{for _adf :=0;_adf < _fcg .RowStride ;_adf ++{_fffe :=_fcg .Data [_efec *_fcg .RowStride +_adf ];if _adf !=_fcg .RowStride -1{_abd :=_dec .WriteByte (_fffe );if _abd !=nil {return nil ,_f .Wrap (_abd ,_cfca ,"");
|
|
};continue ;};for _aac :=uint (0);_aac < _bdgc ;_aac ++{_bca :=_dec .WriteBit (int (_fffe >>(7-_aac )&0x01));if _bca !=nil {return nil ,_f .Wrap (_bca ,_cfca ,"");};};};};return _ebag ,nil ;};func _fddce (_gedbc *Bitmap ,_baaf ,_fabga ,_egce ,_bcfa int ,_bece RasterOperator ,_bcce *Bitmap ,_gbbf ,_gbbag int )error {var (_dadc bool ;
|
|
_bedc bool ;_cegf int ;_fdbg int ;_ddg int ;_gfabf bool ;_dgac byte ;_defa int ;_dgfb int ;_dfcf int ;_fada ,_aca int ;);_dbaa :=8-(_baaf &7);_gafdf :=_dggdd [_dbaa ];_aeef :=_gedbc .RowStride *_fabga +(_baaf >>3);_ceab :=_bcce .RowStride *_gbbag +(_gbbf >>3);
|
|
if _egce < _dbaa {_dadc =true ;_gafdf &=_cadf [8-_dbaa +_egce ];};if !_dadc {_cegf =(_egce -_dbaa )>>3;if _cegf > 0{_bedc =true ;_fdbg =_aeef +1;_ddg =_ceab +1;};};_defa =(_baaf +_egce )&7;if !(_dadc ||_defa ==0){_gfabf =true ;_dgac =_cadf [_defa ];_dgfb =_aeef +1+_cegf ;
|
|
_dfcf =_ceab +1+_cegf ;};switch _bece {case PixSrc :for _fada =0;_fada < _bcfa ;_fada ++{_gedbc .Data [_aeef ]=_gega (_gedbc .Data [_aeef ],_bcce .Data [_ceab ],_gafdf );_aeef +=_gedbc .RowStride ;_ceab +=_bcce .RowStride ;};if _bedc {for _fada =0;_fada < _bcfa ;
|
|
_fada ++{for _aca =0;_aca < _cegf ;_aca ++{_gedbc .Data [_fdbg +_aca ]=_bcce .Data [_ddg +_aca ];};_fdbg +=_gedbc .RowStride ;_ddg +=_bcce .RowStride ;};};if _gfabf {for _fada =0;_fada < _bcfa ;_fada ++{_gedbc .Data [_dgfb ]=_gega (_gedbc .Data [_dgfb ],_bcce .Data [_dfcf ],_dgac );
|
|
_dgfb +=_gedbc .RowStride ;_dfcf +=_bcce .RowStride ;};};case PixNotSrc :for _fada =0;_fada < _bcfa ;_fada ++{_gedbc .Data [_aeef ]=_gega (_gedbc .Data [_aeef ],^_bcce .Data [_ceab ],_gafdf );_aeef +=_gedbc .RowStride ;_ceab +=_bcce .RowStride ;};if _bedc {for _fada =0;
|
|
_fada < _bcfa ;_fada ++{for _aca =0;_aca < _cegf ;_aca ++{_gedbc .Data [_fdbg +_aca ]=^_bcce .Data [_ddg +_aca ];};_fdbg +=_gedbc .RowStride ;_ddg +=_bcce .RowStride ;};};if _gfabf {for _fada =0;_fada < _bcfa ;_fada ++{_gedbc .Data [_dgfb ]=_gega (_gedbc .Data [_dgfb ],^_bcce .Data [_dfcf ],_dgac );
|
|
_dgfb +=_gedbc .RowStride ;_dfcf +=_bcce .RowStride ;};};case PixSrcOrDst :for _fada =0;_fada < _bcfa ;_fada ++{_gedbc .Data [_aeef ]=_gega (_gedbc .Data [_aeef ],_bcce .Data [_ceab ]|_gedbc .Data [_aeef ],_gafdf );_aeef +=_gedbc .RowStride ;_ceab +=_bcce .RowStride ;
|
|
};if _bedc {for _fada =0;_fada < _bcfa ;_fada ++{for _aca =0;_aca < _cegf ;_aca ++{_gedbc .Data [_fdbg +_aca ]|=_bcce .Data [_ddg +_aca ];};_fdbg +=_gedbc .RowStride ;_ddg +=_bcce .RowStride ;};};if _gfabf {for _fada =0;_fada < _bcfa ;_fada ++{_gedbc .Data [_dgfb ]=_gega (_gedbc .Data [_dgfb ],_bcce .Data [_dfcf ]|_gedbc .Data [_dgfb ],_dgac );
|
|
_dgfb +=_gedbc .RowStride ;_dfcf +=_bcce .RowStride ;};};case PixSrcAndDst :for _fada =0;_fada < _bcfa ;_fada ++{_gedbc .Data [_aeef ]=_gega (_gedbc .Data [_aeef ],_bcce .Data [_ceab ]&_gedbc .Data [_aeef ],_gafdf );_aeef +=_gedbc .RowStride ;_ceab +=_bcce .RowStride ;
|
|
};if _bedc {for _fada =0;_fada < _bcfa ;_fada ++{for _aca =0;_aca < _cegf ;_aca ++{_gedbc .Data [_fdbg +_aca ]&=_bcce .Data [_ddg +_aca ];};_fdbg +=_gedbc .RowStride ;_ddg +=_bcce .RowStride ;};};if _gfabf {for _fada =0;_fada < _bcfa ;_fada ++{_gedbc .Data [_dgfb ]=_gega (_gedbc .Data [_dgfb ],_bcce .Data [_dfcf ]&_gedbc .Data [_dgfb ],_dgac );
|
|
_dgfb +=_gedbc .RowStride ;_dfcf +=_bcce .RowStride ;};};case PixSrcXorDst :for _fada =0;_fada < _bcfa ;_fada ++{_gedbc .Data [_aeef ]=_gega (_gedbc .Data [_aeef ],_bcce .Data [_ceab ]^_gedbc .Data [_aeef ],_gafdf );_aeef +=_gedbc .RowStride ;_ceab +=_bcce .RowStride ;
|
|
};if _bedc {for _fada =0;_fada < _bcfa ;_fada ++{for _aca =0;_aca < _cegf ;_aca ++{_gedbc .Data [_fdbg +_aca ]^=_bcce .Data [_ddg +_aca ];};_fdbg +=_gedbc .RowStride ;_ddg +=_bcce .RowStride ;};};if _gfabf {for _fada =0;_fada < _bcfa ;_fada ++{_gedbc .Data [_dgfb ]=_gega (_gedbc .Data [_dgfb ],_bcce .Data [_dfcf ]^_gedbc .Data [_dgfb ],_dgac );
|
|
_dgfb +=_gedbc .RowStride ;_dfcf +=_bcce .RowStride ;};};case PixNotSrcOrDst :for _fada =0;_fada < _bcfa ;_fada ++{_gedbc .Data [_aeef ]=_gega (_gedbc .Data [_aeef ],^(_bcce .Data [_ceab ])|_gedbc .Data [_aeef ],_gafdf );_aeef +=_gedbc .RowStride ;_ceab +=_bcce .RowStride ;
|
|
};if _bedc {for _fada =0;_fada < _bcfa ;_fada ++{for _aca =0;_aca < _cegf ;_aca ++{_gedbc .Data [_fdbg +_aca ]|=^(_bcce .Data [_ddg +_aca ]);};_fdbg +=_gedbc .RowStride ;_ddg +=_bcce .RowStride ;};};if _gfabf {for _fada =0;_fada < _bcfa ;_fada ++{_gedbc .Data [_dgfb ]=_gega (_gedbc .Data [_dgfb ],^(_bcce .Data [_dfcf ])|_gedbc .Data [_dgfb ],_dgac );
|
|
_dgfb +=_gedbc .RowStride ;_dfcf +=_bcce .RowStride ;};};case PixNotSrcAndDst :for _fada =0;_fada < _bcfa ;_fada ++{_gedbc .Data [_aeef ]=_gega (_gedbc .Data [_aeef ],^(_bcce .Data [_ceab ])&_gedbc .Data [_aeef ],_gafdf );_aeef +=_gedbc .RowStride ;_ceab +=_bcce .RowStride ;
|
|
};if _bedc {for _fada =0;_fada < _bcfa ;_fada ++{for _aca =0;_aca < _cegf ;_aca ++{_gedbc .Data [_fdbg +_aca ]&=^_bcce .Data [_ddg +_aca ];};_fdbg +=_gedbc .RowStride ;_ddg +=_bcce .RowStride ;};};if _gfabf {for _fada =0;_fada < _bcfa ;_fada ++{_gedbc .Data [_dgfb ]=_gega (_gedbc .Data [_dgfb ],^(_bcce .Data [_dfcf ])&_gedbc .Data [_dgfb ],_dgac );
|
|
_dgfb +=_gedbc .RowStride ;_dfcf +=_bcce .RowStride ;};};case PixSrcOrNotDst :for _fada =0;_fada < _bcfa ;_fada ++{_gedbc .Data [_aeef ]=_gega (_gedbc .Data [_aeef ],_bcce .Data [_ceab ]|^(_gedbc .Data [_aeef ]),_gafdf );_aeef +=_gedbc .RowStride ;_ceab +=_bcce .RowStride ;
|
|
};if _bedc {for _fada =0;_fada < _bcfa ;_fada ++{for _aca =0;_aca < _cegf ;_aca ++{_gedbc .Data [_fdbg +_aca ]=_bcce .Data [_ddg +_aca ]|^(_gedbc .Data [_fdbg +_aca ]);};_fdbg +=_gedbc .RowStride ;_ddg +=_bcce .RowStride ;};};if _gfabf {for _fada =0;_fada < _bcfa ;
|
|
_fada ++{_gedbc .Data [_dgfb ]=_gega (_gedbc .Data [_dgfb ],_bcce .Data [_dfcf ]|^(_gedbc .Data [_dgfb ]),_dgac );_dgfb +=_gedbc .RowStride ;_dfcf +=_bcce .RowStride ;};};case PixSrcAndNotDst :for _fada =0;_fada < _bcfa ;_fada ++{_gedbc .Data [_aeef ]=_gega (_gedbc .Data [_aeef ],_bcce .Data [_ceab ]&^(_gedbc .Data [_aeef ]),_gafdf );
|
|
_aeef +=_gedbc .RowStride ;_ceab +=_bcce .RowStride ;};if _bedc {for _fada =0;_fada < _bcfa ;_fada ++{for _aca =0;_aca < _cegf ;_aca ++{_gedbc .Data [_fdbg +_aca ]=_bcce .Data [_ddg +_aca ]&^(_gedbc .Data [_fdbg +_aca ]);};_fdbg +=_gedbc .RowStride ;_ddg +=_bcce .RowStride ;
|
|
};};if _gfabf {for _fada =0;_fada < _bcfa ;_fada ++{_gedbc .Data [_dgfb ]=_gega (_gedbc .Data [_dgfb ],_bcce .Data [_dfcf ]&^(_gedbc .Data [_dgfb ]),_dgac );_dgfb +=_gedbc .RowStride ;_dfcf +=_bcce .RowStride ;};};case PixNotPixSrcOrDst :for _fada =0;_fada < _bcfa ;
|
|
_fada ++{_gedbc .Data [_aeef ]=_gega (_gedbc .Data [_aeef ],^(_bcce .Data [_ceab ]|_gedbc .Data [_aeef ]),_gafdf );_aeef +=_gedbc .RowStride ;_ceab +=_bcce .RowStride ;};if _bedc {for _fada =0;_fada < _bcfa ;_fada ++{for _aca =0;_aca < _cegf ;_aca ++{_gedbc .Data [_fdbg +_aca ]=^(_bcce .Data [_ddg +_aca ]|_gedbc .Data [_fdbg +_aca ]);
|
|
};_fdbg +=_gedbc .RowStride ;_ddg +=_bcce .RowStride ;};};if _gfabf {for _fada =0;_fada < _bcfa ;_fada ++{_gedbc .Data [_dgfb ]=_gega (_gedbc .Data [_dgfb ],^(_bcce .Data [_dfcf ]|_gedbc .Data [_dgfb ]),_dgac );_dgfb +=_gedbc .RowStride ;_dfcf +=_bcce .RowStride ;
|
|
};};case PixNotPixSrcAndDst :for _fada =0;_fada < _bcfa ;_fada ++{_gedbc .Data [_aeef ]=_gega (_gedbc .Data [_aeef ],^(_bcce .Data [_ceab ]&_gedbc .Data [_aeef ]),_gafdf );_aeef +=_gedbc .RowStride ;_ceab +=_bcce .RowStride ;};if _bedc {for _fada =0;_fada < _bcfa ;
|
|
_fada ++{for _aca =0;_aca < _cegf ;_aca ++{_gedbc .Data [_fdbg +_aca ]=^(_bcce .Data [_ddg +_aca ]&_gedbc .Data [_fdbg +_aca ]);};_fdbg +=_gedbc .RowStride ;_ddg +=_bcce .RowStride ;};};if _gfabf {for _fada =0;_fada < _bcfa ;_fada ++{_gedbc .Data [_dgfb ]=_gega (_gedbc .Data [_dgfb ],^(_bcce .Data [_dfcf ]&_gedbc .Data [_dgfb ]),_dgac );
|
|
_dgfb +=_gedbc .RowStride ;_dfcf +=_bcce .RowStride ;};};case PixNotPixSrcXorDst :for _fada =0;_fada < _bcfa ;_fada ++{_gedbc .Data [_aeef ]=_gega (_gedbc .Data [_aeef ],^(_bcce .Data [_ceab ]^_gedbc .Data [_aeef ]),_gafdf );_aeef +=_gedbc .RowStride ;
|
|
_ceab +=_bcce .RowStride ;};if _bedc {for _fada =0;_fada < _bcfa ;_fada ++{for _aca =0;_aca < _cegf ;_aca ++{_gedbc .Data [_fdbg +_aca ]=^(_bcce .Data [_ddg +_aca ]^_gedbc .Data [_fdbg +_aca ]);};_fdbg +=_gedbc .RowStride ;_ddg +=_bcce .RowStride ;};};
|
|
if _gfabf {for _fada =0;_fada < _bcfa ;_fada ++{_gedbc .Data [_dgfb ]=_gega (_gedbc .Data [_dgfb ],^(_bcce .Data [_dfcf ]^_gedbc .Data [_dgfb ]),_dgac );_dgfb +=_gedbc .RowStride ;_dfcf +=_bcce .RowStride ;};};default:_dd .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",_bece );
|
|
return _f .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 (_gaed *Bitmaps )GroupByWidth ()(*BitmapsArray ,error ){const _bdff ="\u0047\u0072\u006fu\u0070\u0042\u0079\u0057\u0069\u0064\u0074\u0068";if len (_gaed .Values )==0{return nil ,_f .Error (_bdff ,"\u006eo\u0020v\u0061\u006c\u0075\u0065\u0073 \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");
|
|
};_dcag :=&BitmapsArray {};_gaed .SortByWidth ();_bgggf :=-1;_afggc :=-1;for _acbg :=0;_acbg < len (_gaed .Values );_acbg ++{_ccbbc :=_gaed .Values [_acbg ].Width ;if _ccbbc > _bgggf {_bgggf =_ccbbc ;_afggc ++;_dcag .Values =append (_dcag .Values ,&Bitmaps {});
|
|
};_dcag .Values [_afggc ].AddBitmap (_gaed .Values [_acbg ]);};return _dcag ,nil ;};type ClassedPoints struct{*Points ;_dg .IntSlice ;_beeeb func (_ffb ,_eeae int )bool ;};type SizeSelection int ;func (_egf *Bitmap )GetChocolateData ()[]byte {if _egf .Color ==Vanilla {_egf .inverseData ();
|
|
};return _egf .Data ;}; |