mirror of
https://github.com/unidoc/unipdf.git
synced 2025-05-02 22:17:06 +08:00
656 lines
196 KiB
Go
656 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 (_ff "encoding/binary";_df "github.com/stretchr/testify/require";_gb "github.com/unidoc/unipdf/v3/common";_bc "github.com/unidoc/unipdf/v3/internal/bitwise";_gd "github.com/unidoc/unipdf/v3/internal/imageutil";_g "github.com/unidoc/unipdf/v3/internal/jbig2/basic";
|
|
_d "github.com/unidoc/unipdf/v3/internal/jbig2/errors";_ba "image";_gf "math";_b "sort";_c "strings";_e "testing";);const _dgbg =5000;func TstImageBitmap ()*Bitmap {return _cccb .Copy ()};func (_fgaf *Bitmap )nextOnPixelLow (_dffe ,_bab ,_aff ,_cffa ,_gaac int )(_dcef _ba .Point ,_agbd bool ,_fdggd error ){const _gea ="B\u0069\u0074\u006d\u0061p.\u006ee\u0078\u0074\u004f\u006e\u0050i\u0078\u0065\u006c\u004c\u006f\u0077";
|
|
var (_gcag int ;_eegb byte ;);_dbgg :=_gaac *_aff ;_acgd :=_dbgg +(_cffa /8);if _eegb ,_fdggd =_fgaf .GetByte (_acgd );_fdggd !=nil {return _dcef ,false ,_d .Wrap (_fdggd ,_gea ,"\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 _eegb !=0{_acdf :=_cffa -(_cffa %8)+7;for _gcag =_cffa ;_gcag <=_acdf &&_gcag < _dffe ;_gcag ++{if _fgaf .GetPixel (_gcag ,_gaac ){_dcef .X =_gcag ;_dcef .Y =_gaac ;return _dcef ,true ,nil ;};};};_bcbc :=(_cffa /8)+1;_gcag =8*_bcbc ;var _egbe int ;
|
|
for _acgd =_dbgg +_bcbc ;_gcag < _dffe ;_acgd ,_gcag =_acgd +1,_gcag +8{if _eegb ,_fdggd =_fgaf .GetByte (_acgd );_fdggd !=nil {return _dcef ,false ,_d .Wrap (_fdggd ,_gea ,"r\u0065\u0073\u0074\u0020of\u0020t\u0068\u0065\u0020\u006c\u0069n\u0065\u0020\u0062\u0079\u0074\u0065");
|
|
};if _eegb ==0{continue ;};for _egbe =0;_egbe < 8&&_gcag < _dffe ;_egbe ,_gcag =_egbe +1,_gcag +1{if _fgaf .GetPixel (_gcag ,_gaac ){_dcef .X =_gcag ;_dcef .Y =_gaac ;return _dcef ,true ,nil ;};};};for _efef :=_gaac +1;_efef < _bab ;_efef ++{_dbgg =_efef *_aff ;
|
|
for _acgd ,_gcag =_dbgg ,0;_gcag < _dffe ;_acgd ,_gcag =_acgd +1,_gcag +8{if _eegb ,_fdggd =_fgaf .GetByte (_acgd );_fdggd !=nil {return _dcef ,false ,_d .Wrap (_fdggd ,_gea ,"\u0066o\u006cl\u006f\u0077\u0069\u006e\u0067\u0020\u006c\u0069\u006e\u0065\u0073");
|
|
};if _eegb ==0{continue ;};for _egbe =0;_egbe < 8&&_gcag < _dffe ;_egbe ,_gcag =_egbe +1,_gcag +1{if _fgaf .GetPixel (_gcag ,_efef ){_dcef .X =_gcag ;_dcef .Y =_efef ;return _dcef ,true ,nil ;};};};};return _dcef ,false ,nil ;};func (_fddef *Selection )setOrigin (_gcfed ,_cecaa int ){_fddef .Cy ,_fddef .Cx =_gcfed ,_cecaa };
|
|
func (_agb *Bitmap )RemoveBorderGeneral (left ,right ,top ,bot int )(*Bitmap ,error ){return _agb .removeBorderGeneral (left ,right ,top ,bot );};type ClassedPoints struct{*Points ;_g .IntSlice ;_edaag func (_fcga ,_bbcd int )bool ;};func (_daff *Bitmaps )selectByIndexes (_ecff []int )(*Bitmaps ,error ){_afdbb :=&Bitmaps {};
|
|
for _ ,_aedf :=range _ecff {_ggba ,_ddee :=_daff .GetBitmap (_aedf );if _ddee !=nil {return nil ,_d .Wrap (_ddee ,"\u0073e\u006ce\u0063\u0074\u0042\u0079\u0049\u006e\u0064\u0065\u0078\u0065\u0073","");};_afdbb .AddBitmap (_ggba );};return _afdbb ,nil ;
|
|
};func (_facf *Bitmap )ClipRectangle (box *_ba .Rectangle )(_fabb *Bitmap ,_fabe *_ba .Rectangle ,_egbc error ){const _ecbd ="\u0043\u006c\u0069\u0070\u0052\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065";if box ==nil {return nil ,nil ,_d .Error (_ecbd ,"\u0062o\u0078 \u0069\u0073\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};_dd ,_adgb :=_facf .Width ,_facf .Height ;_aeg :=_ba .Rect (0,0,_dd ,_adgb );if !box .Overlaps (_aeg ){return nil ,nil ,_d .Error (_ecbd ,"b\u006f\u0078\u0020\u0064oe\u0073n\u0027\u0074\u0020\u006f\u0076e\u0072\u006c\u0061\u0070\u0020\u0062");};_dcg :=box .Intersect (_aeg );
|
|
_fda ,_baag :=_dcg .Min .X ,_dcg .Min .Y ;_dfca ,_cdg :=_dcg .Dx (),_dcg .Dy ();_fabb =New (_dfca ,_cdg );_fabb .Text =_facf .Text ;if _egbc =_fabb .RasterOperation (0,0,_dfca ,_cdg ,PixSrc ,_facf ,_fda ,_baag );_egbc !=nil {return nil ,nil ,_d .Wrap (_egbc ,_ecbd ,"\u0050\u0069\u0078\u0053\u0072\u0063\u0020\u0074\u006f\u0020\u0063\u006ci\u0070\u0070\u0065\u0064");
|
|
};_fabe =&_dcg ;return _fabb ,_fabe ,nil ;};func (_cadd *ClassedPoints )xSortFunction ()func (_gadc int ,_cegea int )bool {return func (_bfga ,_fbfa int )bool {return _cadd .XAtIndex (_bfga )< _cadd .XAtIndex (_fbfa )};};func TstImageBitmapData ()[]byte {return _cccb .Data };
|
|
func (_gdcc *Bitmaps )HeightSorter ()func (_fcca ,_bbgad int )bool {return func (_bgcgb ,_dddf int )bool {_agfef :=_gdcc .Values [_bgcgb ].Height < _gdcc .Values [_dddf ].Height ;_gb .Log .Debug ("H\u0065i\u0067\u0068\u0074\u003a\u0020\u0025\u0076\u0020<\u0020\u0025\u0076\u0020= \u0025\u0076",_gdcc .Values [_bgcgb ].Height ,_gdcc .Values [_dddf ].Height ,_agfef );
|
|
return _agfef ;};};var (_afce *Bitmap ;_cccb *Bitmap ;);func _gce (_fdea ,_gadd *Bitmap ,_bfd int ,_bcb []byte ,_cac int )(_ada error ){const _gec ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0033";
|
|
var (_cge ,_gdbg ,_acc ,_caf ,_adg ,_bgge ,_eccc ,_eef int ;_cdb ,_eda ,_dga ,_eab uint32 ;_bdf ,_dac byte ;_ffb uint16 ;);_cef :=make ([]byte ,4);_abcc :=make ([]byte ,4);for _acc =0;_acc < _fdea .Height -1;_acc ,_caf =_acc +2,_caf +1{_cge =_acc *_fdea .RowStride ;
|
|
_gdbg =_caf *_gadd .RowStride ;for _adg ,_bgge =0,0;_adg < _cac ;_adg ,_bgge =_adg +4,_bgge +1{for _eccc =0;_eccc < 4;_eccc ++{_eef =_cge +_adg +_eccc ;if _eef <=len (_fdea .Data )-1&&_eef < _cge +_fdea .RowStride {_cef [_eccc ]=_fdea .Data [_eef ];}else {_cef [_eccc ]=0x00;
|
|
};_eef =_cge +_fdea .RowStride +_adg +_eccc ;if _eef <=len (_fdea .Data )-1&&_eef < _cge +(2*_fdea .RowStride ){_abcc [_eccc ]=_fdea .Data [_eef ];}else {_abcc [_eccc ]=0x00;};};_cdb =_ff .BigEndian .Uint32 (_cef );_eda =_ff .BigEndian .Uint32 (_abcc );
|
|
_dga =_cdb &_eda ;_dga |=_dga <<1;_eab =_cdb |_eda ;_eab &=_eab <<1;_eda =_dga &_eab ;_eda &=0xaaaaaaaa;_cdb =_eda |(_eda <<7);_bdf =byte (_cdb >>24);_dac =byte ((_cdb >>8)&0xff);_eef =_gdbg +_bgge ;if _eef +1==len (_gadd .Data )-1||_eef +1>=_gdbg +_gadd .RowStride {if _ada =_gadd .SetByte (_eef ,_bcb [_bdf ]);
|
|
_ada !=nil {return _d .Wrapf (_ada ,_gec ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_eef );};}else {_ffb =(uint16 (_bcb [_bdf ])<<8)|uint16 (_bcb [_dac ]);if _ada =_gadd .setTwoBytes (_eef ,_ffb );_ada !=nil {return _d .Wrapf (_ada ,_gec ,"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",_eef );
|
|
};_bgge ++;};};};return nil ;};type MorphProcess struct{Operation MorphOperation ;Arguments []int ;};func (_beg *Bitmap )addPadBits ()(_agae error ){const _ded ="\u0062\u0069\u0074\u006d\u0061\u0070\u002e\u0061\u0064\u0064\u0050\u0061d\u0042\u0069\u0074\u0073";
|
|
_cdcc :=_beg .Width %8;if _cdcc ==0{return nil ;};_gcab :=_beg .Width /8;_bage :=_bc .NewReader (_beg .Data );_beba :=make ([]byte ,_beg .Height *_beg .RowStride );_bada :=_bc .NewWriterMSB (_beba );_dda :=make ([]byte ,_gcab );var (_dee int ;_acd uint64 ;
|
|
);for _dee =0;_dee < _beg .Height ;_dee ++{if _ ,_agae =_bage .Read (_dda );_agae !=nil {return _d .Wrap (_agae ,_ded ,"\u0066u\u006c\u006c\u0020\u0062\u0079\u0074e");};if _ ,_agae =_bada .Write (_dda );_agae !=nil {return _d .Wrap (_agae ,_ded ,"\u0066\u0075\u006c\u006c\u0020\u0062\u0079\u0074\u0065\u0073");
|
|
};if _acd ,_agae =_bage .ReadBits (byte (_cdcc ));_agae !=nil {return _d .Wrap (_agae ,_ded ,"\u0073\u006b\u0069\u0070\u0070\u0069\u006e\u0067\u0020\u0062\u0069\u0074\u0073");};if _agae =_bada .WriteByte (byte (_acd )<<uint (8-_cdcc ));_agae !=nil {return _d .Wrap (_agae ,_ded ,"\u006ca\u0073\u0074\u0020\u0062\u0079\u0074e");
|
|
};};_beg .Data =_bada .Data ();return nil ;};func _gecbc (_gfacb ...MorphProcess )(_decb error ){const _agaf ="v\u0065r\u0069\u0066\u0079\u004d\u006f\u0072\u0070\u0068P\u0072\u006f\u0063\u0065ss\u0065\u0073";var _ggef ,_edecd int ;for _cbaec ,_fecd :=range _gfacb {if _decb =_fecd .verify (_cbaec ,&_ggef ,&_edecd );
|
|
_decb !=nil {return _d .Wrap (_decb ,_agaf ,"");};};if _edecd !=0&&_ggef !=0{return _d .Error (_agaf ,"\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 _edfd (_dbde *_g .Stack )(_eegf *fillSegment ,_cffb error ){const _fagg ="\u0070\u006f\u0070\u0046\u0069\u006c\u006c\u0053\u0065g\u006d\u0065\u006e\u0074";if _dbde ==nil {return nil ,_d .Error (_fagg ,"\u006ei\u006c \u0073\u0074\u0061\u0063\u006b \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");
|
|
};if _dbde .Aux ==nil {return nil ,_d .Error (_fagg ,"a\u0075x\u0053\u0074\u0061\u0063\u006b\u0020\u006e\u006ft\u0020\u0064\u0065\u0066in\u0065\u0064");};_fabf ,_fdba :=_dbde .Pop ();if !_fdba {return nil ,nil ;};_eceae ,_fdba :=_fabf .(*fillSegment );
|
|
if !_fdba {return nil ,_d .Error (_fagg ,"\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");};_eegf =&fillSegment {_eceae ._bcfd ,_eceae ._addb ,_eceae ._cbfa +_eceae ._ddaf ,_eceae ._ddaf };
|
|
_dbde .Aux .Push (_eceae );return _eegf ,nil ;};func init (){for _agcf :=0;_agcf < 256;_agcf ++{_bgca [_agcf ]=uint8 (_agcf &0x1)+(uint8 (_agcf >>1)&0x1)+(uint8 (_agcf >>2)&0x1)+(uint8 (_agcf >>3)&0x1)+(uint8 (_agcf >>4)&0x1)+(uint8 (_agcf >>5)&0x1)+(uint8 (_agcf >>6)&0x1)+(uint8 (_agcf >>7)&0x1);
|
|
};};func MakePixelSumTab8 ()[]int {return _bfcf ()};func (_dfeed *ClassedPoints )SortByX (){_dfeed ._edaag =_dfeed .xSortFunction ();_b .Sort (_dfeed )};func _afbbf (_dgeg ,_dccg *Bitmap ,_cegg *Selection )(*Bitmap ,error ){const _ceag ="\u0065\u0072\u006fd\u0065";
|
|
var (_efg error ;_aggd *Bitmap ;);_dgeg ,_efg =_dcdfa (_dgeg ,_dccg ,_cegg ,&_aggd );if _efg !=nil {return nil ,_d .Wrap (_efg ,_ceag ,"");};if _efg =_dgeg .setAll ();_efg !=nil {return nil ,_d .Wrap (_efg ,_ceag ,"");};var _edf SelectionValue ;for _cddf :=0;
|
|
_cddf < _cegg .Height ;_cddf ++{for _cfcec :=0;_cfcec < _cegg .Width ;_cfcec ++{_edf =_cegg .Data [_cddf ][_cfcec ];if _edf ==SelHit {_efg =_caee (_dgeg ,_cegg .Cx -_cfcec ,_cegg .Cy -_cddf ,_dccg .Width ,_dccg .Height ,PixSrcAndDst ,_aggd ,0,0);if _efg !=nil {return nil ,_d .Wrap (_efg ,_ceag ,"");
|
|
};};};};if MorphBC ==SymmetricMorphBC {return _dgeg ,nil ;};_eegd ,_dgeb ,_ecfb ,_add :=_cegg .findMaxTranslations ();if _eegd > 0{if _efg =_dgeg .RasterOperation (0,0,_eegd ,_dccg .Height ,PixClr ,nil ,0,0);_efg !=nil {return nil ,_d .Wrap (_efg ,_ceag ,"\u0078\u0070\u0020\u003e\u0020\u0030");
|
|
};};if _ecfb > 0{if _efg =_dgeg .RasterOperation (_dccg .Width -_ecfb ,0,_ecfb ,_dccg .Height ,PixClr ,nil ,0,0);_efg !=nil {return nil ,_d .Wrap (_efg ,_ceag ,"\u0078\u006e\u0020\u003e\u0020\u0030");};};if _dgeb > 0{if _efg =_dgeg .RasterOperation (0,0,_dccg .Width ,_dgeb ,PixClr ,nil ,0,0);
|
|
_efg !=nil {return nil ,_d .Wrap (_efg ,_ceag ,"\u0079\u0070\u0020\u003e\u0020\u0030");};};if _add > 0{if _efg =_dgeg .RasterOperation (0,_dccg .Height -_add ,_dccg .Width ,_add ,PixClr ,nil ,0,0);_efg !=nil {return nil ,_d .Wrap (_efg ,_ceag ,"\u0079\u006e\u0020\u003e\u0020\u0030");
|
|
};};return _dgeg ,nil ;};func _dcdfa (_bcda *Bitmap ,_gdabbg *Bitmap ,_ebfg *Selection ,_dcaee **Bitmap )(*Bitmap ,error ){const _bdec ="\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u004d\u006f\u0072\u0070\u0068A\u0072\u0067\u0073\u0031";if _gdabbg ==nil {return nil ,_d .Error (_bdec ,"\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 _ebfg ==nil {return nil ,_d .Error (_bdec ,"\u004d\u006f\u0072\u0068p\u0041\u0072\u0067\u0073\u0031\u0020\u0027\u0073\u0065\u006c'\u0020n\u006f\u0074\u0020\u0064\u0065\u0066\u0069n\u0065\u0064");};_dgea ,_fgcg :=_ebfg .Height ,_ebfg .Width ;if _dgea ==0||_fgcg ==0{return nil ,_d .Error (_bdec ,"\u0073\u0065\u006c\u0065ct\u0069\u006f\u006e\u0020\u006f\u0066\u0020\u0073\u0069\u007a\u0065\u0020\u0030");
|
|
};if _bcda ==nil {_bcda =_gdabbg .createTemplate ();*_dcaee =_gdabbg ;return _bcda ,nil ;};_bcda .Width =_gdabbg .Width ;_bcda .Height =_gdabbg .Height ;_bcda .RowStride =_gdabbg .RowStride ;_bcda .Color =_gdabbg .Color ;_bcda .Data =make ([]byte ,_gdabbg .RowStride *_gdabbg .Height );
|
|
if _bcda ==_gdabbg {*_dcaee =_gdabbg .Copy ();}else {*_dcaee =_gdabbg ;};return _bcda ,nil ;};func (_bdefb *Boxes )Get (i int )(*_ba .Rectangle ,error ){const _edec ="\u0042o\u0078\u0065\u0073\u002e\u0047\u0065t";if _bdefb ==nil {return nil ,_d .Error (_edec ,"\u0027\u0042\u006f\u0078es\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};if i > len (*_bdefb )-1{return nil ,_d .Errorf (_edec ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return (*_bdefb )[i ],nil ;};func (_cea *Bitmap )ToImage ()_ba .Image {_fgd ,_aacf :=_gd .NewImage (_cea .Width ,_cea .Height ,1,1,_cea .Data ,nil ,nil );
|
|
if _aacf !=nil {_gb .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",_aacf );
|
|
};return _fgd ;};type RasterOperator int ;func (_dagf *ClassedPoints )validateIntSlice ()error {const _gbagb ="\u0076\u0061l\u0069\u0064\u0061t\u0065\u0049\u006e\u0074\u0053\u006c\u0069\u0063\u0065";for _ ,_eddf :=range _dagf .IntSlice {if _eddf >=(_dagf .Points .Size ()){return _d .Errorf (_gbagb ,"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",_eddf ,_dagf .Points .Size ());
|
|
};};return nil ;};func _bcdd (_gafa *Bitmap ,_gbgdg ...MorphProcess )(_bfff *Bitmap ,_gfcd error ){const _gde ="\u006d\u006f\u0072\u0070\u0068\u0053\u0065\u0071\u0075\u0065\u006e\u0063\u0065";if _gafa ==nil {return nil ,_d .Error (_gde ,"\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 (_gbgdg )==0{return nil ,_d .Error (_gde ,"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 _gfcd =_gecbc (_gbgdg ...);
|
|
_gfcd !=nil {return nil ,_d .Wrap (_gfcd ,_gde ,"");};var _bgcd ,_aefc ,_aeca int ;_bfff =_gafa .Copy ();for _ ,_ecgd :=range _gbgdg {switch _ecgd .Operation {case MopDilation :_bgcd ,_aefc =_ecgd .getWidthHeight ();_bfff ,_gfcd =DilateBrick (nil ,_bfff ,_bgcd ,_aefc );
|
|
if _gfcd !=nil {return nil ,_d .Wrap (_gfcd ,_gde ,"");};case MopErosion :_bgcd ,_aefc =_ecgd .getWidthHeight ();_bfff ,_gfcd =_gggc (nil ,_bfff ,_bgcd ,_aefc );if _gfcd !=nil {return nil ,_d .Wrap (_gfcd ,_gde ,"");};case MopOpening :_bgcd ,_aefc =_ecgd .getWidthHeight ();
|
|
_bfff ,_gfcd =_cafa (nil ,_bfff ,_bgcd ,_aefc );if _gfcd !=nil {return nil ,_d .Wrap (_gfcd ,_gde ,"");};case MopClosing :_bgcd ,_aefc =_ecgd .getWidthHeight ();_bfff ,_gfcd =_ffbb (nil ,_bfff ,_bgcd ,_aefc );if _gfcd !=nil {return nil ,_d .Wrap (_gfcd ,_gde ,"");
|
|
};case MopRankBinaryReduction :_bfff ,_gfcd =_fdb (_bfff ,_ecgd .Arguments ...);if _gfcd !=nil {return nil ,_d .Wrap (_gfcd ,_gde ,"");};case MopReplicativeBinaryExpansion :_bfff ,_gfcd =_eccab (_bfff ,_ecgd .Arguments [0]);if _gfcd !=nil {return nil ,_d .Wrap (_gfcd ,_gde ,"");
|
|
};case MopAddBorder :_aeca =_ecgd .Arguments [0];_bfff ,_gfcd =_bfff .AddBorder (_aeca ,0);if _gfcd !=nil {return nil ,_d .Wrap (_gfcd ,_gde ,"");};default:return nil ,_d .Error (_gde ,"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 _aeca > 0{_bfff ,_gfcd =_bfff .RemoveBorder (_aeca );if _gfcd !=nil {return nil ,_d .Wrap (_gfcd ,_gde ,"\u0062\u006f\u0072\u0064\u0065\u0072\u0020\u003e\u0020\u0030");};};return _bfff ,nil ;};func _fcbg (_cbdf ,_cce ,_ffdga *Bitmap )(*Bitmap ,error ){const _dfa ="\u0073\u0075\u0062\u0074\u0072\u0061\u0063\u0074";
|
|
if _cce ==nil {return nil ,_d .Error (_dfa ,"'\u0073\u0031\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _ffdga ==nil {return nil ,_d .Error (_dfa ,"'\u0073\u0032\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};var _ceega error ;switch {case _cbdf ==_cce :if _ceega =_cbdf .RasterOperation (0,0,_cce .Width ,_cce .Height ,PixNotSrcAndDst ,_ffdga ,0,0);
|
|
_ceega !=nil {return nil ,_d .Wrap (_ceega ,_dfa ,"\u0064 \u003d\u003d\u0020\u0073\u0031");};case _cbdf ==_ffdga :if _ceega =_cbdf .RasterOperation (0,0,_cce .Width ,_cce .Height ,PixNotSrcAndDst ,_cce ,0,0);_ceega !=nil {return nil ,_d .Wrap (_ceega ,_dfa ,"\u0064 \u003d\u003d\u0020\u0073\u0032");
|
|
};default:_cbdf ,_ceega =_eebad (_cbdf ,_cce );if _ceega !=nil {return nil ,_d .Wrap (_ceega ,_dfa ,"");};if _ceega =_cbdf .RasterOperation (0,0,_cce .Width ,_cce .Height ,PixNotSrcAndDst ,_ffdga ,0,0);_ceega !=nil {return nil ,_d .Wrap (_ceega ,_dfa ,"\u0064e\u0066\u0061\u0075\u006c\u0074");
|
|
};};return _cbdf ,nil ;};func _gcc (_cf *Bitmap ,_dc *Bitmap ,_gdd int )(_cc error ){const _gdb ="e\u0078\u0070\u0061\u006edB\u0069n\u0061\u0072\u0079\u0050\u006fw\u0065\u0072\u0032\u004c\u006f\u0077";switch _gdd {case 2:_cc =_ee (_cf ,_dc );case 4:_cc =_ffga (_cf ,_dc );
|
|
case 8:_cc =_cgb (_cf ,_dc );default:return _d .Error (_gdb ,"\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 _cc !=nil {_cc =_d .Wrap (_cc ,_gdb ,"");};return _cc ;};func (_fcbgd *Bitmap )connComponentsBitmapsBB (_gaf *Bitmaps ,_gfa int )(_cdccd *Boxes ,_ecg error ){const _afca ="\u0063\u006f\u006enC\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074\u0073\u0042\u0069\u0074\u006d\u0061\u0070\u0073\u0042\u0042";
|
|
if _gfa !=4&&_gfa !=8{return nil ,_d .Error (_afca ,"\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 _gaf ==nil {return nil ,_d .Error (_afca ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0042\u0069\u0074ma\u0070\u0073");
|
|
};if len (_gaf .Values )> 0{return nil ,_d .Error (_afca ,"\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 _fcbgd .Zero (){return &Boxes {},nil ;};
|
|
var (_gbbac ,_edaa ,_dadg ,_ffge *Bitmap ;);_fcbgd .setPadBits (0);if _gbbac ,_ecg =_eebad (nil ,_fcbgd );_ecg !=nil {return nil ,_d .Wrap (_ecg ,_afca ,"\u0062\u006d\u0031");};if _edaa ,_ecg =_eebad (nil ,_fcbgd );_ecg !=nil {return nil ,_d .Wrap (_ecg ,_afca ,"\u0062\u006d\u0032");
|
|
};_dgga :=&_g .Stack {};_dgga .Aux =&_g .Stack {};_cdccd =&Boxes {};var (_bggb ,_ebdf int ;_agde _ba .Point ;_fdde bool ;_fgb *_ba .Rectangle ;);for {if _agde ,_fdde ,_ecg =_gbbac .nextOnPixel (_bggb ,_ebdf );_ecg !=nil {return nil ,_d .Wrap (_ecg ,_afca ,"");
|
|
};if !_fdde {break ;};if _fgb ,_ecg =_egbcb (_gbbac ,_dgga ,_agde .X ,_agde .Y ,_gfa );_ecg !=nil {return nil ,_d .Wrap (_ecg ,_afca ,"");};if _ecg =_cdccd .Add (_fgb );_ecg !=nil {return nil ,_d .Wrap (_ecg ,_afca ,"");};if _dadg ,_ecg =_gbbac .clipRectangle (_fgb ,nil );
|
|
_ecg !=nil {return nil ,_d .Wrap (_ecg ,_afca ,"\u0062\u006d\u0033");};if _ffge ,_ecg =_edaa .clipRectangle (_fgb ,nil );_ecg !=nil {return nil ,_d .Wrap (_ecg ,_afca ,"\u0062\u006d\u0034");};if _ ,_ecg =_aaa (_dadg ,_dadg ,_ffge );_ecg !=nil {return nil ,_d .Wrap (_ecg ,_afca ,"\u0062m\u0033\u0020\u005e\u0020\u0062\u006d4");
|
|
};if _ecg =_edaa .RasterOperation (_fgb .Min .X ,_fgb .Min .Y ,_fgb .Dx (),_fgb .Dy (),PixSrcXorDst ,_dadg ,0,0);_ecg !=nil {return nil ,_d .Wrap (_ecg ,_afca ,"\u0062\u006d\u0032\u0020\u002d\u0058\u004f\u0052\u002d>\u0020\u0062\u006d\u0033");};_gaf .AddBitmap (_dadg );
|
|
_bggb =_agde .X ;_ebdf =_agde .Y ;};_gaf .Boxes =*_cdccd ;return _cdccd ,nil ;};func _gddd (_bdbb *Bitmap ,_fgcb ,_gdgb ,_cdac ,_bdbd int ,_aace RasterOperator ){if _fgcb < 0{_cdac +=_fgcb ;_fgcb =0;};_dgfa :=_fgcb +_cdac -_bdbb .Width ;if _dgfa > 0{_cdac -=_dgfa ;
|
|
};if _gdgb < 0{_bdbd +=_gdgb ;_gdgb =0;};_feeg :=_gdgb +_bdbd -_bdbb .Height ;if _feeg > 0{_bdbd -=_feeg ;};if _cdac <=0||_bdbd <=0{return ;};if (_fgcb &7)==0{_bdefg (_bdbb ,_fgcb ,_gdgb ,_cdac ,_bdbd ,_aace );}else {_dcbc (_bdbb ,_fgcb ,_gdgb ,_cdac ,_bdbd ,_aace );
|
|
};};func _ggabf (_gdec *Bitmap ,_beab ,_bcgc ,_effg ,_ccda int ,_accf RasterOperator ,_gfcb *Bitmap ,_faed ,_aaae int )error {var (_ecbgd byte ;_bfgg int ;_dbbae int ;_acgg ,_bccf int ;_ebabf ,_ceda int ;);_cgaf :=_effg >>3;_cafd :=_effg &7;if _cafd > 0{_ecbgd =_afa [_cafd ];
|
|
};_bfgg =_gfcb .RowStride *_aaae +(_faed >>3);_dbbae =_gdec .RowStride *_bcgc +(_beab >>3);switch _accf {case PixSrc :for _ebabf =0;_ebabf < _ccda ;_ebabf ++{_acgg =_bfgg +_ebabf *_gfcb .RowStride ;_bccf =_dbbae +_ebabf *_gdec .RowStride ;for _ceda =0;
|
|
_ceda < _cgaf ;_ceda ++{_gdec .Data [_bccf ]=_gfcb .Data [_acgg ];_bccf ++;_acgg ++;};if _cafd > 0{_gdec .Data [_bccf ]=_aagd (_gdec .Data [_bccf ],_gfcb .Data [_acgg ],_ecbgd );};};case PixNotSrc :for _ebabf =0;_ebabf < _ccda ;_ebabf ++{_acgg =_bfgg +_ebabf *_gfcb .RowStride ;
|
|
_bccf =_dbbae +_ebabf *_gdec .RowStride ;for _ceda =0;_ceda < _cgaf ;_ceda ++{_gdec .Data [_bccf ]=^(_gfcb .Data [_acgg ]);_bccf ++;_acgg ++;};if _cafd > 0{_gdec .Data [_bccf ]=_aagd (_gdec .Data [_bccf ],^_gfcb .Data [_acgg ],_ecbgd );};};case PixSrcOrDst :for _ebabf =0;
|
|
_ebabf < _ccda ;_ebabf ++{_acgg =_bfgg +_ebabf *_gfcb .RowStride ;_bccf =_dbbae +_ebabf *_gdec .RowStride ;for _ceda =0;_ceda < _cgaf ;_ceda ++{_gdec .Data [_bccf ]|=_gfcb .Data [_acgg ];_bccf ++;_acgg ++;};if _cafd > 0{_gdec .Data [_bccf ]=_aagd (_gdec .Data [_bccf ],_gfcb .Data [_acgg ]|_gdec .Data [_bccf ],_ecbgd );
|
|
};};case PixSrcAndDst :for _ebabf =0;_ebabf < _ccda ;_ebabf ++{_acgg =_bfgg +_ebabf *_gfcb .RowStride ;_bccf =_dbbae +_ebabf *_gdec .RowStride ;for _ceda =0;_ceda < _cgaf ;_ceda ++{_gdec .Data [_bccf ]&=_gfcb .Data [_acgg ];_bccf ++;_acgg ++;};if _cafd > 0{_gdec .Data [_bccf ]=_aagd (_gdec .Data [_bccf ],_gfcb .Data [_acgg ]&_gdec .Data [_bccf ],_ecbgd );
|
|
};};case PixSrcXorDst :for _ebabf =0;_ebabf < _ccda ;_ebabf ++{_acgg =_bfgg +_ebabf *_gfcb .RowStride ;_bccf =_dbbae +_ebabf *_gdec .RowStride ;for _ceda =0;_ceda < _cgaf ;_ceda ++{_gdec .Data [_bccf ]^=_gfcb .Data [_acgg ];_bccf ++;_acgg ++;};if _cafd > 0{_gdec .Data [_bccf ]=_aagd (_gdec .Data [_bccf ],_gfcb .Data [_acgg ]^_gdec .Data [_bccf ],_ecbgd );
|
|
};};case PixNotSrcOrDst :for _ebabf =0;_ebabf < _ccda ;_ebabf ++{_acgg =_bfgg +_ebabf *_gfcb .RowStride ;_bccf =_dbbae +_ebabf *_gdec .RowStride ;for _ceda =0;_ceda < _cgaf ;_ceda ++{_gdec .Data [_bccf ]|=^(_gfcb .Data [_acgg ]);_bccf ++;_acgg ++;};if _cafd > 0{_gdec .Data [_bccf ]=_aagd (_gdec .Data [_bccf ],^(_gfcb .Data [_acgg ])|_gdec .Data [_bccf ],_ecbgd );
|
|
};};case PixNotSrcAndDst :for _ebabf =0;_ebabf < _ccda ;_ebabf ++{_acgg =_bfgg +_ebabf *_gfcb .RowStride ;_bccf =_dbbae +_ebabf *_gdec .RowStride ;for _ceda =0;_ceda < _cgaf ;_ceda ++{_gdec .Data [_bccf ]&=^(_gfcb .Data [_acgg ]);_bccf ++;_acgg ++;};if _cafd > 0{_gdec .Data [_bccf ]=_aagd (_gdec .Data [_bccf ],^(_gfcb .Data [_acgg ])&_gdec .Data [_bccf ],_ecbgd );
|
|
};};case PixSrcOrNotDst :for _ebabf =0;_ebabf < _ccda ;_ebabf ++{_acgg =_bfgg +_ebabf *_gfcb .RowStride ;_bccf =_dbbae +_ebabf *_gdec .RowStride ;for _ceda =0;_ceda < _cgaf ;_ceda ++{_gdec .Data [_bccf ]=_gfcb .Data [_acgg ]|^(_gdec .Data [_bccf ]);_bccf ++;
|
|
_acgg ++;};if _cafd > 0{_gdec .Data [_bccf ]=_aagd (_gdec .Data [_bccf ],_gfcb .Data [_acgg ]|^(_gdec .Data [_bccf ]),_ecbgd );};};case PixSrcAndNotDst :for _ebabf =0;_ebabf < _ccda ;_ebabf ++{_acgg =_bfgg +_ebabf *_gfcb .RowStride ;_bccf =_dbbae +_ebabf *_gdec .RowStride ;
|
|
for _ceda =0;_ceda < _cgaf ;_ceda ++{_gdec .Data [_bccf ]=_gfcb .Data [_acgg ]&^(_gdec .Data [_bccf ]);_bccf ++;_acgg ++;};if _cafd > 0{_gdec .Data [_bccf ]=_aagd (_gdec .Data [_bccf ],_gfcb .Data [_acgg ]&^(_gdec .Data [_bccf ]),_ecbgd );};};case PixNotPixSrcOrDst :for _ebabf =0;
|
|
_ebabf < _ccda ;_ebabf ++{_acgg =_bfgg +_ebabf *_gfcb .RowStride ;_bccf =_dbbae +_ebabf *_gdec .RowStride ;for _ceda =0;_ceda < _cgaf ;_ceda ++{_gdec .Data [_bccf ]=^(_gfcb .Data [_acgg ]|_gdec .Data [_bccf ]);_bccf ++;_acgg ++;};if _cafd > 0{_gdec .Data [_bccf ]=_aagd (_gdec .Data [_bccf ],^(_gfcb .Data [_acgg ]|_gdec .Data [_bccf ]),_ecbgd );
|
|
};};case PixNotPixSrcAndDst :for _ebabf =0;_ebabf < _ccda ;_ebabf ++{_acgg =_bfgg +_ebabf *_gfcb .RowStride ;_bccf =_dbbae +_ebabf *_gdec .RowStride ;for _ceda =0;_ceda < _cgaf ;_ceda ++{_gdec .Data [_bccf ]=^(_gfcb .Data [_acgg ]&_gdec .Data [_bccf ]);
|
|
_bccf ++;_acgg ++;};if _cafd > 0{_gdec .Data [_bccf ]=_aagd (_gdec .Data [_bccf ],^(_gfcb .Data [_acgg ]&_gdec .Data [_bccf ]),_ecbgd );};};case PixNotPixSrcXorDst :for _ebabf =0;_ebabf < _ccda ;_ebabf ++{_acgg =_bfgg +_ebabf *_gfcb .RowStride ;_bccf =_dbbae +_ebabf *_gdec .RowStride ;
|
|
for _ceda =0;_ceda < _cgaf ;_ceda ++{_gdec .Data [_bccf ]=^(_gfcb .Data [_acgg ]^_gdec .Data [_bccf ]);_bccf ++;_acgg ++;};if _cafd > 0{_gdec .Data [_bccf ]=_aagd (_gdec .Data [_bccf ],^(_gfcb .Data [_acgg ]^_gdec .Data [_bccf ]),_ecbgd );};};default:_gb .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",_accf );
|
|
return _d .Error ("\u0072\u0061\u0073\u0074er\u004f\u0070\u0042\u0079\u0074\u0065\u0041\u006c\u0069\u0067\u006e\u0065\u0064\u004co\u0077","\u0069\u006e\u0076al\u0069\u0064\u0020\u0072\u0061\u0073\u0074\u0065\u0072\u0020\u006f\u0070\u0065\u0072\u0061\u0074\u006f\u0072");
|
|
};return nil ;};func (_bebb *Bitmap )connComponentsBB (_gegb int )(_bfdg *Boxes ,_aadg error ){const _ffca ="\u0042\u0069\u0074ma\u0070\u002e\u0063\u006f\u006e\u006e\u0043\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074\u0073\u0042\u0042";if _gegb !=4&&_gegb !=8{return nil ,_d .Error (_ffca ,"\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 _bebb .Zero (){return &Boxes {},nil ;};_bebb .setPadBits (0);_gfc ,_aadg :=_eebad (nil ,_bebb );if _aadg !=nil {return nil ,_d .Wrap (_aadg ,_ffca ,"\u0062\u006d\u0031");};_daef :=&_g .Stack {};_daef .Aux =&_g .Stack {};_bfdg =&Boxes {};var (_bdcd ,_dcdd int ;
|
|
_fbeb _ba .Point ;_agbdc bool ;_agfe *_ba .Rectangle ;);for {if _fbeb ,_agbdc ,_aadg =_gfc .nextOnPixel (_dcdd ,_bdcd );_aadg !=nil {return nil ,_d .Wrap (_aadg ,_ffca ,"");};if !_agbdc {break ;};if _agfe ,_aadg =_egbcb (_gfc ,_daef ,_fbeb .X ,_fbeb .Y ,_gegb );
|
|
_aadg !=nil {return nil ,_d .Wrap (_aadg ,_ffca ,"");};if _aadg =_bfdg .Add (_agfe );_aadg !=nil {return nil ,_d .Wrap (_aadg ,_ffca ,"");};_dcdd =_fbeb .X ;_bdcd =_fbeb .Y ;};return _bfdg ,nil ;};type BoundaryCondition int ;func (_dae *Bitmap )equivalent (_ddae *Bitmap )bool {if _dae ==_ddae {return true ;
|
|
};if !_dae .SizesEqual (_ddae ){return false ;};_gcb :=_bbgg (_dae ,_ddae ,CmbOpXor );_dcd :=_dae .countPixels ();_ebd :=int (0.25*float32 (_dcd ));if _gcb .thresholdPixelSum (_ebd ){return false ;};var (_cafe [9][9]int ;_bea [18][9]int ;_eag [9][18]int ;
|
|
_dfge int ;_eca int ;);_bac :=9;_fafd :=_dae .Height /_bac ;_fca :=_dae .Width /_bac ;_dca ,_dbgf :=_fafd /2,_fca /2;if _fafd < _fca {_dca =_fca /2;_dbgf =_fafd /2;};_dde :=float64 (_dca )*float64 (_dbgf )*_gf .Pi ;_fcb :=int (float64 (_fafd *_fca /2)*0.9);
|
|
_dgad :=int (float64 (_fca *_fafd /2)*0.9);for _bdde :=0;_bdde < _bac ;_bdde ++{_eaba :=_fca *_bdde +_dfge ;var _ced int ;if _bdde ==_bac -1{_dfge =0;_ced =_dae .Width ;}else {_ced =_eaba +_fca ;if ((_dae .Width -_dfge )%_bac )> 0{_dfge ++;_ced ++;};};
|
|
for _ceeb :=0;_ceeb < _bac ;_ceeb ++{_aaea :=_fafd *_ceeb +_eca ;var _cag int ;if _ceeb ==_bac -1{_eca =0;_cag =_dae .Height ;}else {_cag =_aaea +_fafd ;if (_dae .Height -_eca )%_bac > 0{_eca ++;_cag ++;};};var _afgg ,_becg ,_cdab ,_fad int ;_dfea :=(_eaba +_ced )/2;
|
|
_abcd :=(_aaea +_cag )/2;for _afdeb :=_eaba ;_afdeb < _ced ;_afdeb ++{for _ebaf :=_aaea ;_ebaf < _cag ;_ebaf ++{if _gcb .GetPixel (_afdeb ,_ebaf ){if _afdeb < _dfea {_afgg ++;}else {_becg ++;};if _ebaf < _abcd {_fad ++;}else {_cdab ++;};};};};_cafe [_bdde ][_ceeb ]=_afgg +_becg ;
|
|
_bea [_bdde *2][_ceeb ]=_afgg ;_bea [_bdde *2+1][_ceeb ]=_becg ;_eag [_bdde ][_ceeb *2]=_fad ;_eag [_bdde ][_ceeb *2+1]=_cdab ;};};for _cgbf :=0;_cgbf < _bac *2-1;_cgbf ++{for _dcac :=0;_dcac < (_bac -1);_dcac ++{var _cfe int ;for _cfcb :=0;_cfcb < 2;_cfcb ++{for _bcfb :=0;
|
|
_bcfb < 2;_bcfb ++{_cfe +=_bea [_cgbf +_cfcb ][_dcac +_bcfb ];};};if _cfe > _dgad {return false ;};};};for _cdcf :=0;_cdcf < (_bac -1);_cdcf ++{for _fdd :=0;_fdd < ((_bac *2)-1);_fdd ++{var _bce int ;for _cdfcd :=0;_cdfcd < 2;_cdfcd ++{for _agga :=0;_agga < 2;
|
|
_agga ++{_bce +=_eag [_cdcf +_cdfcd ][_fdd +_agga ];};};if _bce > _fcb {return false ;};};};for _gcg :=0;_gcg < (_bac -2);_gcg ++{for _ggaf :=0;_ggaf < (_bac -2);_ggaf ++{var _dbd ,_gbee int ;for _bfb :=0;_bfb < 3;_bfb ++{for _agd :=0;_agd < 3;_agd ++{if _bfb ==_agd {_dbd +=_cafe [_gcg +_bfb ][_ggaf +_agd ];
|
|
};if (2-_bfb )==_agd {_gbee +=_cafe [_gcg +_bfb ][_ggaf +_agd ];};};};if _dbd > _dgad ||_gbee > _dgad {return false ;};};};for _gaec :=0;_gaec < (_bac -1);_gaec ++{for _ceaa :=0;_ceaa < (_bac -1);_ceaa ++{var _fgf int ;for _eagg :=0;_eagg < 2;_eagg ++{for _acaa :=0;
|
|
_acaa < 2;_acaa ++{_fgf +=_cafe [_gaec +_eagg ][_ceaa +_acaa ];};};if float64 (_fgf )> _dde {return false ;};};};return true ;};func (_efd *Bitmap )setFourBytes (_cfcg int ,_bdegg uint32 )error {if _cfcg +3> len (_efd .Data )-1{return _d .Errorf ("\u0073\u0065\u0074F\u006f\u0075\u0072\u0042\u0079\u0074\u0065\u0073","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",_cfcg );
|
|
};_efd .Data [_cfcg ]=byte ((_bdegg &0xff000000)>>24);_efd .Data [_cfcg +1]=byte ((_bdegg &0xff0000)>>16);_efd .Data [_cfcg +2]=byte ((_bdegg &0xff00)>>8);_efd .Data [_cfcg +3]=byte (_bdegg &0xff);return nil ;};func _gdc (_fcae ,_adecc *Bitmap ,_adab *Selection )(*Bitmap ,error ){const _cefcd ="\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u004d\u006f\u0072\u0070\u0068A\u0072\u0067\u0073\u0032";
|
|
var _egfc ,_bbggd int ;if _adecc ==nil {return nil ,_d .Error (_cefcd ,"s\u006fu\u0072\u0063\u0065\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");};if _adab ==nil {return nil ,_d .Error (_cefcd ,"\u0073e\u006c \u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};_egfc =_adab .Width ;_bbggd =_adab .Height ;if _egfc ==0||_bbggd ==0{return nil ,_d .Error (_cefcd ,"\u0073\u0065\u006c\u0020\u006f\u0066\u0020\u0073\u0069\u007a\u0065\u0020\u0030");};if _fcae ==nil {return _adecc .createTemplate (),nil ;};if _abg :=_fcae .resizeImageData (_adecc );
|
|
_abg !=nil {return nil ,_abg ;};return _fcae ,nil ;};func _gace (_dfcc *Bitmap ,_gag *_g .Stack ,_fgge ,_bccfb int )(_ceede *_ba .Rectangle ,_cgcdg error ){const _dbag ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";
|
|
if _dfcc ==nil {return nil ,_d .Error (_dbag ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");};if _gag ==nil {return nil ,_d .Error (_dbag ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");
|
|
};_cfeb ,_abffb :=_dfcc .Width ,_dfcc .Height ;_ceff :=_cfeb -1;_egcd :=_abffb -1;if _fgge < 0||_fgge > _ceff ||_bccfb < 0||_bccfb > _egcd ||!_dfcc .GetPixel (_fgge ,_bccfb ){return nil ,nil ;};_baagb :=_ba .Rect (100000,100000,0,0);if _cgcdg =_bcdcb (_gag ,_fgge ,_fgge ,_bccfb ,1,_egcd ,&_baagb );
|
|
_cgcdg !=nil {return nil ,_d .Wrap (_cgcdg ,_dbag ,"\u0069\u006e\u0069t\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _cgcdg =_bcdcb (_gag ,_fgge ,_fgge ,_bccfb +1,-1,_egcd ,&_baagb );_cgcdg !=nil {return nil ,_d .Wrap (_cgcdg ,_dbag ,"\u0032\u006ed\u0020\u0069\u006ei\u0074\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");
|
|
};_baagb .Min .X ,_baagb .Max .X =_fgge ,_fgge ;_baagb .Min .Y ,_baagb .Max .Y =_bccfb ,_bccfb ;var (_eefg *fillSegment ;_afbe int ;);for _gag .Len ()> 0{if _eefg ,_cgcdg =_edfd (_gag );_cgcdg !=nil {return nil ,_d .Wrap (_cgcdg ,_dbag ,"");};_bccfb =_eefg ._cbfa ;
|
|
for _fgge =_eefg ._bcfd -1;_fgge >=0&&_dfcc .GetPixel (_fgge ,_bccfb );_fgge --{if _cgcdg =_dfcc .SetPixel (_fgge ,_bccfb ,0);_cgcdg !=nil {return nil ,_d .Wrap (_cgcdg ,_dbag ,"\u0031s\u0074\u0020\u0073\u0065\u0074");};};if _fgge >=_eefg ._bcfd -1{for {for _fgge ++;
|
|
_fgge <=_eefg ._addb +1&&_fgge <=_ceff &&!_dfcc .GetPixel (_fgge ,_bccfb );_fgge ++{};_afbe =_fgge ;if !(_fgge <=_eefg ._addb +1&&_fgge <=_ceff ){break ;};for ;_fgge <=_ceff &&_dfcc .GetPixel (_fgge ,_bccfb );_fgge ++{if _cgcdg =_dfcc .SetPixel (_fgge ,_bccfb ,0);
|
|
_cgcdg !=nil {return nil ,_d .Wrap (_cgcdg ,_dbag ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _cgcdg =_bcdcb (_gag ,_afbe ,_fgge -1,_eefg ._cbfa ,_eefg ._ddaf ,_egcd ,&_baagb );_cgcdg !=nil {return nil ,_d .Wrap (_cgcdg ,_dbag ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");
|
|
};if _fgge > _eefg ._addb {if _cgcdg =_bcdcb (_gag ,_eefg ._addb +1,_fgge -1,_eefg ._cbfa ,-_eefg ._ddaf ,_egcd ,&_baagb );_cgcdg !=nil {return nil ,_d .Wrap (_cgcdg ,_dbag ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");
|
|
};};};continue ;};_afbe =_fgge +1;if _afbe < _eefg ._bcfd {if _cgcdg =_bcdcb (_gag ,_afbe ,_eefg ._bcfd -1,_eefg ._cbfa ,-_eefg ._ddaf ,_egcd ,&_baagb );_cgcdg !=nil {return nil ,_d .Wrap (_cgcdg ,_dbag ,"\u006c\u0065\u0061\u006b\u0020\u006f\u006e\u0020\u006c\u0065\u0066\u0074 \u0073\u0069\u0064\u0065");
|
|
};};_fgge =_eefg ._bcfd ;for {for ;_fgge <=_ceff &&_dfcc .GetPixel (_fgge ,_bccfb );_fgge ++{if _cgcdg =_dfcc .SetPixel (_fgge ,_bccfb ,0);_cgcdg !=nil {return nil ,_d .Wrap (_cgcdg ,_dbag ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _cgcdg =_bcdcb (_gag ,_afbe ,_fgge -1,_eefg ._cbfa ,_eefg ._ddaf ,_egcd ,&_baagb );
|
|
_cgcdg !=nil {return nil ,_d .Wrap (_cgcdg ,_dbag ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _fgge > _eefg ._addb {if _cgcdg =_bcdcb (_gag ,_eefg ._addb +1,_fgge -1,_eefg ._cbfa ,-_eefg ._ddaf ,_egcd ,&_baagb );_cgcdg !=nil {return nil ,_d .Wrap (_cgcdg ,_dbag ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");
|
|
};};for _fgge ++;_fgge <=_eefg ._addb +1&&_fgge <=_ceff &&!_dfcc .GetPixel (_fgge ,_bccfb );_fgge ++{};_afbe =_fgge ;if !(_fgge <=_eefg ._addb +1&&_fgge <=_ceff ){break ;};};};_baagb .Max .X ++;_baagb .Max .Y ++;return &_baagb ,nil ;};var _ _b .Interface =&ClassedPoints {};
|
|
const (Vanilla Color =iota ;Chocolate ;);func (_dfae *ClassedPoints )XAtIndex (i int )float32 {return (*_dfae .Points )[_dfae .IntSlice [i ]].X };func _ccbf (_dffb *Bitmap ,_fdcg ,_bebgf int ,_beac ,_bebc int ,_dafa RasterOperator ,_befcb *Bitmap ,_eebf ,_cfgd int )error {var _deb ,_ffagc ,_gefc ,_dccc int ;
|
|
if _fdcg < 0{_eebf -=_fdcg ;_beac +=_fdcg ;_fdcg =0;};if _eebf < 0{_fdcg -=_eebf ;_beac +=_eebf ;_eebf =0;};_deb =_fdcg +_beac -_dffb .Width ;if _deb > 0{_beac -=_deb ;};_ffagc =_eebf +_beac -_befcb .Width ;if _ffagc > 0{_beac -=_ffagc ;};if _bebgf < 0{_cfgd -=_bebgf ;
|
|
_bebc +=_bebgf ;_bebgf =0;};if _cfgd < 0{_bebgf -=_cfgd ;_bebc +=_cfgd ;_cfgd =0;};_gefc =_bebgf +_bebc -_dffb .Height ;if _gefc > 0{_bebc -=_gefc ;};_dccc =_cfgd +_bebc -_befcb .Height ;if _dccc > 0{_bebc -=_dccc ;};if _beac <=0||_bebc <=0{return nil ;
|
|
};var _egbf error ;switch {case _fdcg &7==0&&_eebf &7==0:_egbf =_ggabf (_dffb ,_fdcg ,_bebgf ,_beac ,_bebc ,_dafa ,_befcb ,_eebf ,_cfgd );case _fdcg &7==_eebf &7:_egbf =_adaf (_dffb ,_fdcg ,_bebgf ,_beac ,_bebc ,_dafa ,_befcb ,_eebf ,_cfgd );default:_egbf =_gdg (_dffb ,_fdcg ,_bebgf ,_beac ,_bebc ,_dafa ,_befcb ,_eebf ,_cfgd );
|
|
};if _egbf !=nil {return _d .Wrap (_egbf ,"r\u0061\u0073\u0074\u0065\u0072\u004f\u0070\u004c\u006f\u0077","");};return nil ;};func (_gcf *Bitmap )SetByte (index int ,v byte )error {if index > len (_gcf .Data )-1||index < 0{return _d .Errorf ("\u0053e\u0074\u0042\u0079\u0074\u0065","\u0069\u006e\u0064\u0065x \u006f\u0075\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u003a\u0020%\u0064",index );
|
|
};_gcf .Data [index ]=v ;return nil ;};func (_bfdgg Points )GetIntY (i int )(int ,error ){if i >=len (_bfdgg ){return 0,_d .Errorf ("\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0065t\u0049\u006e\u0074\u0059","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
};return int (_bfdgg [i ].Y ),nil ;};type Getter interface{GetBitmap ()*Bitmap ;};func _cafa (_cdcba ,_gefg *Bitmap ,_defa ,_gaae int )(*Bitmap ,error ){const _cdbbc ="\u006fp\u0065\u006e\u0042\u0072\u0069\u0063k";if _gefg ==nil {return nil ,_d .Error (_cdbbc ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");
|
|
};if _defa < 1&&_gaae < 1{return nil ,_d .Error (_cdbbc ,"\u0068\u0053\u0069\u007ae \u003c\u0020\u0031\u0020\u0026\u0026\u0020\u0076\u0053\u0069\u007a\u0065\u0020\u003c \u0031");};if _defa ==1&&_gaae ==1{return _gefg .Copy (),nil ;};if _defa ==1||_gaae ==1{var _cefb error ;
|
|
_ecce :=SelCreateBrick (_gaae ,_defa ,_gaae /2,_defa /2,SelHit );_cdcba ,_cefb =_abdd (_cdcba ,_gefg ,_ecce );if _cefb !=nil {return nil ,_d .Wrap (_cefb ,_cdbbc ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _cdcba ,nil ;};_bafef :=SelCreateBrick (1,_defa ,0,_defa /2,SelHit );_aaef :=SelCreateBrick (_gaae ,1,_gaae /2,0,SelHit );_bgcb ,_adda :=_afbbf (nil ,_gefg ,_bafef );if _adda !=nil {return nil ,_d .Wrap (_adda ,_cdbbc ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");
|
|
};_cdcba ,_adda =_afbbf (_cdcba ,_bgcb ,_aaef );if _adda !=nil {return nil ,_d .Wrap (_adda ,_cdbbc ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};_ ,_adda =_bced (_bgcb ,_cdcba ,_bafef );if _adda !=nil {return nil ,_d .Wrap (_adda ,_cdbbc ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
};_ ,_adda =_bced (_cdcba ,_bgcb ,_aaef );if _adda !=nil {return nil ,_d .Wrap (_adda ,_cdbbc ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};return _cdcba ,nil ;};func CorrelationScoreThresholded (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab ,downcount []int ,scoreThreshold float32 )(bool ,error ){const _dfgb ="C\u006f\u0072\u0072\u0065\u006c\u0061t\u0069\u006f\u006e\u0053\u0063\u006f\u0072\u0065\u0054h\u0072\u0065\u0073h\u006fl\u0064\u0065\u0064";
|
|
if bm1 ==nil {return false ,_d .Error (_dfgb ,"\u0063\u006f\u0072\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u0053\u0063\u006f\u0072\u0065\u0054\u0068\u0072\u0065\u0073\u0068\u006f\u006cd\u0065\u0064\u0020\u0062\u006d1\u0020\u0069s\u0020\u006e\u0069\u006c");
|
|
};if bm2 ==nil {return false ,_d .Error (_dfgb ,"\u0063\u006f\u0072\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u0053\u0063\u006f\u0072\u0065\u0054\u0068\u0072\u0065\u0073\u0068\u006f\u006cd\u0065\u0064\u0020\u0062\u006d2\u0020\u0069s\u0020\u006e\u0069\u006c");
|
|
};if area1 <=0||area2 <=0{return false ,_d .Error (_dfgb ,"c\u006f\u0072\u0072\u0065\u006c\u0061\u0074\u0069\u006fn\u0053\u0063\u006f\u0072\u0065\u0054\u0068re\u0073\u0068\u006f\u006cd\u0065\u0064\u0020\u002d\u0020\u0061\u0072\u0065\u0061s \u006d\u0075s\u0074\u0020\u0062\u0065\u0020\u003e\u0020\u0030");
|
|
};if downcount ==nil {return false ,_d .Error (_dfgb ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u006f\u0020\u0027\u0064\u006f\u0077\u006e\u0063\u006f\u0075\u006e\u0074\u0027");};if tab ==nil {return false ,_d .Error (_dfgb ,"p\u0072\u006f\u0076\u0069de\u0064 \u006e\u0069\u006c\u0020\u0027s\u0075\u006d\u0074\u0061\u0062\u0027");
|
|
};_facda ,_faab :=bm1 .Width ,bm1 .Height ;_ddab ,_daf :=bm2 .Width ,bm2 .Height ;if _g .Abs (_facda -_ddab )> maxDiffW {return false ,nil ;};if _g .Abs (_faab -_daf )> maxDiffH {return false ,nil ;};_cagb :=int (delX +_g .Sign (delX )*0.5);_agab :=int (delY +_g .Sign (delY )*0.5);
|
|
_eabc :=int (_gf .Ceil (_gf .Sqrt (float64 (scoreThreshold )*float64 (area1 )*float64 (area2 ))));_caed :=bm2 .RowStride ;_cdgb :=_bbb (_agab ,0);_egedc :=_aee (_daf +_agab ,_faab );_babb :=bm1 .RowStride *_cdgb ;_cagg :=bm2 .RowStride *(_cdgb -_agab );
|
|
var _eabd int ;if _egedc <=_faab {_eabd =downcount [_egedc -1];};_eaa :=_bbb (_cagb ,0);_dcbe :=_aee (_ddab +_cagb ,_facda );var _accbf ,_cbbcd int ;if _cagb >=8{_accbf =_cagb >>3;_babb +=_accbf ;_eaa -=_accbf <<3;_dcbe -=_accbf <<3;_cagb &=7;}else if _cagb <=-8{_cbbcd =-((_cagb +7)>>3);
|
|
_cagg +=_cbbcd ;_caed -=_cbbcd ;_cagb +=_cbbcd <<3;};var (_fedf ,_eeedg ,_fgafd int ;_bdea ,_cbg ,_aegc byte ;);if _eaa >=_dcbe ||_cdgb >=_egedc {return false ,nil ;};_fcaf :=(_dcbe +7)>>3;switch {case _cagb ==0:for _eeedg =_cdgb ;_eeedg < _egedc ;_eeedg ,_babb ,_cagg =_eeedg +1,_babb +bm1 .RowStride ,_cagg +bm2 .RowStride {for _fgafd =0;
|
|
_fgafd < _fcaf ;_fgafd ++{_bdea =bm1 .Data [_babb +_fgafd ]&bm2 .Data [_cagg +_fgafd ];_fedf +=tab [_bdea ];};if _fedf >=_eabc {return true ,nil ;};if _acdfc :=_fedf +downcount [_eeedg ]-_eabd ;_acdfc < _eabc {return false ,nil ;};};case _cagb > 0&&_caed < _fcaf :for _eeedg =_cdgb ;
|
|
_eeedg < _egedc ;_eeedg ,_babb ,_cagg =_eeedg +1,_babb +bm1 .RowStride ,_cagg +bm2 .RowStride {_cbg =bm1 .Data [_babb ];_aegc =bm2 .Data [_cagg ]>>uint (_cagb );_bdea =_cbg &_aegc ;_fedf +=tab [_bdea ];for _fgafd =1;_fgafd < _caed ;_fgafd ++{_cbg =bm1 .Data [_babb +_fgafd ];
|
|
_aegc =bm2 .Data [_cagg +_fgafd ]>>uint (_cagb )|bm2 .Data [_cagg +_fgafd -1]<<uint (8-_cagb );_bdea =_cbg &_aegc ;_fedf +=tab [_bdea ];};_cbg =bm1 .Data [_babb +_fgafd ];_aegc =bm2 .Data [_cagg +_fgafd -1]<<uint (8-_cagb );_bdea =_cbg &_aegc ;_fedf +=tab [_bdea ];
|
|
if _fedf >=_eabc {return true ,nil ;}else if _fedf +downcount [_eeedg ]-_eabd < _eabc {return false ,nil ;};};case _cagb > 0&&_caed >=_fcaf :for _eeedg =_cdgb ;_eeedg < _egedc ;_eeedg ,_babb ,_cagg =_eeedg +1,_babb +bm1 .RowStride ,_cagg +bm2 .RowStride {_cbg =bm1 .Data [_babb ];
|
|
_aegc =bm2 .Data [_cagg ]>>uint (_cagb );_bdea =_cbg &_aegc ;_fedf +=tab [_bdea ];for _fgafd =1;_fgafd < _fcaf ;_fgafd ++{_cbg =bm1 .Data [_babb +_fgafd ];_aegc =bm2 .Data [_cagg +_fgafd ]>>uint (_cagb );_aegc |=bm2 .Data [_cagg +_fgafd -1]<<uint (8-_cagb );
|
|
_bdea =_cbg &_aegc ;_fedf +=tab [_bdea ];};if _fedf >=_eabc {return true ,nil ;}else if _fedf +downcount [_eeedg ]-_eabd < _eabc {return false ,nil ;};};case _fcaf < _caed :for _eeedg =_cdgb ;_eeedg < _egedc ;_eeedg ,_babb ,_cagg =_eeedg +1,_babb +bm1 .RowStride ,_cagg +bm2 .RowStride {for _fgafd =0;
|
|
_fgafd < _fcaf ;_fgafd ++{_cbg =bm1 .Data [_babb +_fgafd ];_aegc =bm2 .Data [_cagg +_fgafd ]<<uint (-_cagb );_aegc |=bm2 .Data [_cagg +_fgafd +1]>>uint (8+_cagb );_bdea =_cbg &_aegc ;_fedf +=tab [_bdea ];};if _fedf >=_eabc {return true ,nil ;}else if _agdb :=_fedf +downcount [_eeedg ]-_eabd ;
|
|
_agdb < _eabc {return false ,nil ;};};case _caed >=_fcaf :for _eeedg =_cdgb ;_eeedg < _egedc ;_eeedg ,_babb ,_cagg =_eeedg +1,_babb +bm1 .RowStride ,_cagg +bm2 .RowStride {for _fgafd =0;_fgafd < _fcaf ;_fgafd ++{_cbg =bm1 .Data [_babb +_fgafd ];_aegc =bm2 .Data [_cagg +_fgafd ]<<uint (-_cagb );
|
|
_aegc |=bm2 .Data [_cagg +_fgafd +1]>>uint (8+_cagb );_bdea =_cbg &_aegc ;_fedf +=tab [_bdea ];};_cbg =bm1 .Data [_babb +_fgafd ];_aegc =bm2 .Data [_cagg +_fgafd ]<<uint (-_cagb );_bdea =_cbg &_aegc ;_fedf +=tab [_bdea ];if _fedf >=_eabc {return true ,nil ;
|
|
}else if _fedf +downcount [_eeedg ]-_eabd < _eabc {return false ,nil ;};};};_ggfa :=float32 (_fedf )*float32 (_fedf )/(float32 (area1 )*float32 (area2 ));if _ggfa >=scoreThreshold {_gb .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",_fedf ,_eabc ,_ggfa ,scoreThreshold );
|
|
};return false ,nil ;};func TstWordBitmap (t *_e .T ,scale ...int )*Bitmap {_dgdc :=1;if len (scale )> 0{_dgdc =scale [0];};_edcb :=3;_gbbc :=9+7+15+2*_edcb ;_egad :=5+_edcb +5;_dgfba :=New (_gbbc *_dgdc ,_egad *_dgdc );_gafc :=&Bitmaps {};var _aegb *int ;
|
|
_edcb *=_dgdc ;_cgce :=0;_aegb =&_cgce ;_aedd :=0;_dcccg :=TstDSymbol (t ,scale ...);TstAddSymbol (t ,_gafc ,_dcccg ,_aegb ,_aedd ,1*_dgdc );_dcccg =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_gafc ,_dcccg ,_aegb ,_aedd ,_edcb );_dcccg =TstISymbol (t ,scale ...);
|
|
TstAddSymbol (t ,_gafc ,_dcccg ,_aegb ,_aedd ,1*_dgdc );_dcccg =TstTSymbol (t ,scale ...);TstAddSymbol (t ,_gafc ,_dcccg ,_aegb ,_aedd ,_edcb );_dcccg =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_gafc ,_dcccg ,_aegb ,_aedd ,1*_dgdc );_dcccg =TstOSymbol (t ,scale ...);
|
|
TstAddSymbol (t ,_gafc ,_dcccg ,_aegb ,_aedd ,1*_dgdc );_dcccg =TstWSymbol (t ,scale ...);TstAddSymbol (t ,_gafc ,_dcccg ,_aegb ,_aedd ,0);*_aegb =0;_aedd =5*_dgdc +_edcb ;_dcccg =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_gafc ,_dcccg ,_aegb ,_aedd ,1*_dgdc );
|
|
_dcccg =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_gafc ,_dcccg ,_aegb ,_aedd ,_edcb );_dcccg =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_gafc ,_dcccg ,_aegb ,_aedd ,1*_dgdc );_dcccg =TstESymbol (t ,scale ...);TstAddSymbol (t ,_gafc ,_dcccg ,_aegb ,_aedd ,1*_dgdc );
|
|
_dcccg =TstVSymbol (t ,scale ...);TstAddSymbol (t ,_gafc ,_dcccg ,_aegb ,_aedd ,1*_dgdc );_dcccg =TstESymbol (t ,scale ...);TstAddSymbol (t ,_gafc ,_dcccg ,_aegb ,_aedd ,1*_dgdc );_dcccg =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_gafc ,_dcccg ,_aegb ,_aedd ,0);
|
|
TstWriteSymbols (t ,_gafc ,_dgfba );return _dgfba ;};func (_defae *Bitmap )RasterOperation (dx ,dy ,dw ,dh int ,op RasterOperator ,src *Bitmap ,sx ,sy int )error {return _caee (_defae ,dx ,dy ,dw ,dh ,op ,src ,sx ,sy );};func (_gfdd *Bitmap )GetComponents (components Component ,maxWidth ,maxHeight int )(_fcdg *Bitmaps ,_dcbg *Boxes ,_bdae error ){const _abca ="B\u0069t\u006d\u0061\u0070\u002e\u0047\u0065\u0074\u0043o\u006d\u0070\u006f\u006een\u0074\u0073";
|
|
if _gfdd ==nil {return nil ,nil ,_d .Error (_abca ,"\u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0042\u0069\u0074\u006da\u0070\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069n\u0065\u0064\u002e");};switch components {case ComponentConn ,ComponentCharacters ,ComponentWords :default:return nil ,nil ,_d .Error (_abca ,"\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 _gfdd .Zero (){_dcbg =&Boxes {};_fcdg =&Bitmaps {};return _fcdg ,_dcbg ,nil ;};switch components {case ComponentConn :_fcdg =&Bitmaps {};if _dcbg ,_bdae =_gfdd .ConnComponents (_fcdg ,8);_bdae !=nil {return nil ,nil ,_d .Wrap (_bdae ,_abca ,"\u006e\u006f \u0070\u0072\u0065p\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");
|
|
};case ComponentCharacters :_dbaa ,_dada :=MorphSequence (_gfdd ,MorphProcess {Operation :MopClosing ,Arguments :[]int {1,6}});if _dada !=nil {return nil ,nil ,_d .Wrap (_dada ,_abca ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");
|
|
};if _gb .Log .IsLogLevel (_gb .LogLevelTrace ){_gb .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",_dbaa .String ());
|
|
};_age :=&Bitmaps {};_dcbg ,_dada =_dbaa .ConnComponents (_age ,8);if _dada !=nil {return nil ,nil ,_d .Wrap (_dada ,_abca ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");
|
|
};if _gb .Log .IsLogLevel (_gb .LogLevelTrace ){_gb .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",_age .String ());
|
|
};if _fcdg ,_dada =_age .ClipToBitmap (_gfdd );_dada !=nil {return nil ,nil ,_d .Wrap (_dada ,_abca ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");};case ComponentWords :_cdga :=1;
|
|
var _fgeg *Bitmap ;switch {case _gfdd .XResolution <=200:_fgeg =_gfdd ;case _gfdd .XResolution <=400:_cdga =2;_fgeg ,_bdae =_fdb (_gfdd ,1,0,0,0);if _bdae !=nil {return nil ,nil ,_d .Wrap (_bdae ,_abca ,"w\u006f\u0072\u0064\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0020\u002d \u0078\u0072\u0065s\u003c=\u0034\u0030\u0030");
|
|
};default:_cdga =4;_fgeg ,_bdae =_fdb (_gfdd ,1,1,0,0);if _bdae !=nil {return nil ,nil ,_d .Wrap (_bdae ,_abca ,"\u0077\u006f\u0072\u0064 \u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073 \u002d \u0078\u0072\u0065\u0073\u0020\u003e\u00204\u0030\u0030");
|
|
};};_eeed ,_ ,_afbc :=_edae (_fgeg );if _afbc !=nil {return nil ,nil ,_d .Wrap (_afbc ,_abca ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");};_ebcf ,_afbc :=_eccab (_eeed ,_cdga );if _afbc !=nil {return nil ,nil ,_d .Wrap (_afbc ,_abca ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");
|
|
};_eecf :=&Bitmaps {};if _dcbg ,_afbc =_ebcf .ConnComponents (_eecf ,4);_afbc !=nil {return nil ,nil ,_d .Wrap (_afbc ,_abca ,"\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 _fcdg ,_afbc =_eecf .ClipToBitmap (_gfdd );_afbc !=nil {return nil ,nil ,_d .Wrap (_afbc ,_abca ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");};};_fcdg ,_bdae =_fcdg .SelectBySize (maxWidth ,maxHeight ,LocSelectIfBoth ,SizeSelectIfLTE );
|
|
if _bdae !=nil {return nil ,nil ,_d .Wrap (_bdae ,_abca ,"");};_dcbg ,_bdae =_dcbg .SelectBySize (maxWidth ,maxHeight ,LocSelectIfBoth ,SizeSelectIfLTE );if _bdae !=nil {return nil ,nil ,_d .Wrap (_bdae ,_abca ,"");};return _fcdg ,_dcbg ,nil ;};func (_gfee *Boxes )SelectBySize (width ,height int ,tp LocationFilter ,relation SizeComparison )(_gdaf *Boxes ,_ebg error ){const _dcaf ="\u0042o\u0078e\u0073\u002e\u0053\u0065\u006ce\u0063\u0074B\u0079\u0053\u0069\u007a\u0065";
|
|
if _gfee ==nil {return nil ,_d .Error (_dcaf ,"b\u006f\u0078\u0065\u0073 '\u0062'\u0020\u006e\u006f\u0074\u0020d\u0065\u0066\u0069\u006e\u0065\u0064");};if len (*_gfee )==0{return _gfee ,nil ;};switch tp {case LocSelectWidth ,LocSelectHeight ,LocSelectIfEither ,LocSelectIfBoth :default:return nil ,_d .Errorf (_dcaf ,"\u0069\u006e\u0076al\u0069\u0064\u0020\u0066\u0069\u006c\u0074\u0065\u0072\u0020\u0074\u0079\u0070\u0065\u003a\u0020\u0025\u0064",tp );
|
|
};switch relation {case SizeSelectIfLT ,SizeSelectIfGT ,SizeSelectIfLTE ,SizeSelectIfGTE :default:return nil ,_d .Errorf (_dcaf ,"i\u006e\u0076\u0061\u006c\u0069\u0064 \u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u0020t\u0079\u0070\u0065:\u0020'\u0025\u0064\u0027",tp );
|
|
};_cgge :=_gfee .makeSizeIndicator (width ,height ,tp ,relation );_cfec ,_ebg :=_gfee .selectWithIndicator (_cgge );if _ebg !=nil {return nil ,_d .Wrap (_ebg ,_dcaf ,"");};return _cfec ,nil ;};func (_ddec *Bitmaps )GroupByWidth ()(*BitmapsArray ,error ){const _eaagc ="\u0047\u0072\u006fu\u0070\u0042\u0079\u0057\u0069\u0064\u0074\u0068";
|
|
if len (_ddec .Values )==0{return nil ,_d .Error (_eaagc ,"\u006eo\u0020v\u0061\u006c\u0075\u0065\u0073 \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");};_edef :=&BitmapsArray {};_ddec .SortByWidth ();_cgeece :=-1;_fdbfc :=-1;for _eaadc :=0;_eaadc < len (_ddec .Values );
|
|
_eaadc ++{_bddeeb :=_ddec .Values [_eaadc ].Width ;if _bddeeb > _cgeece {_cgeece =_bddeeb ;_fdbfc ++;_edef .Values =append (_edef .Values ,&Bitmaps {});};_edef .Values [_fdbfc ].AddBitmap (_ddec .Values [_eaadc ]);};return _edef ,nil ;};type Bitmaps struct{Values []*Bitmap ;
|
|
Boxes []*_ba .Rectangle ;};func _gdf ()(_ece [256]uint16 ){for _gfb :=0;_gfb < 256;_gfb ++{if _gfb &0x01!=0{_ece [_gfb ]|=0x3;};if _gfb &0x02!=0{_ece [_gfb ]|=0xc;};if _gfb &0x04!=0{_ece [_gfb ]|=0x30;};if _gfb &0x08!=0{_ece [_gfb ]|=0xc0;};if _gfb &0x10!=0{_ece [_gfb ]|=0x300;
|
|
};if _gfb &0x20!=0{_ece [_gfb ]|=0xc00;};if _gfb &0x40!=0{_ece [_gfb ]|=0x3000;};if _gfb &0x80!=0{_ece [_gfb ]|=0xc000;};};return _ece ;};func Rect (x ,y ,w ,h int )(*_ba .Rectangle ,error ){const _gaed ="b\u0069\u0074\u006d\u0061\u0070\u002e\u0052\u0065\u0063\u0074";
|
|
if x < 0{w +=x ;x =0;if w <=0{return nil ,_d .Errorf (_gaed ,"x\u003a\u0027\u0025\u0064\u0027\u0020<\u0020\u0030\u0020\u0061\u006e\u0064\u0020\u0077\u003a \u0027\u0025\u0064'\u0020<\u003d\u0020\u0030",x ,w );};};if y < 0{h +=y ;y =0;if h <=0{return nil ,_d .Error (_gaed ,"\u0079\u0020\u003c 0\u0020\u0061\u006e\u0064\u0020\u0062\u006f\u0078\u0020\u006f\u0066\u0066\u0020\u002b\u0071\u0075\u0061\u0064");
|
|
};};_bdgd :=_ba .Rect (x ,y ,x +w ,y +h );return &_bdgd ,nil ;};func (_fgeca *byWidth )Less (i ,j int )bool {return _fgeca .Values [i ].Width < _fgeca .Values [j ].Width };type byHeight Bitmaps ;func CombineBytes (oldByte ,newByte byte ,op CombinationOperator )byte {return _ebbd (oldByte ,newByte ,op );
|
|
};func (_fbea *Bitmaps )SelectBySize (width ,height int ,tp LocationFilter ,relation SizeComparison )(_bgbgg *Bitmaps ,_abgg error ){const _aefcc ="B\u0069t\u006d\u0061\u0070\u0073\u002e\u0053\u0065\u006ce\u0063\u0074\u0042\u0079Si\u007a\u0065";if _fbea ==nil {return nil ,_d .Error (_aefcc ,"\u0027\u0062\u0027 B\u0069\u0074\u006d\u0061\u0070\u0073\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};switch tp {case LocSelectWidth ,LocSelectHeight ,LocSelectIfEither ,LocSelectIfBoth :default:return nil ,_d .Errorf (_aefcc ,"\u0070\u0072\u006f\u0076\u0069d\u0065\u0064\u0020\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u006c\u006fc\u0061\u0074\u0069\u006f\u006e\u0020\u0066\u0069\u006c\u0074\u0065\u0072\u0020\u0074\u0079\u0070\u0065\u003a\u0020\u0025\u0064",tp );
|
|
};switch relation {case SizeSelectIfLT ,SizeSelectIfGT ,SizeSelectIfLTE ,SizeSelectIfGTE ,SizeSelectIfEQ :default:return nil ,_d .Errorf (_aefcc ,"\u0069\u006e\u0076\u0061li\u0064\u0020\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0027\u0025d\u0027",relation );
|
|
};_faaa ,_abgg :=_fbea .makeSizeIndicator (width ,height ,tp ,relation );if _abgg !=nil {return nil ,_d .Wrap (_abgg ,_aefcc ,"");};_bgbgg ,_abgg =_fbea .selectByIndicator (_faaa );if _abgg !=nil {return nil ,_d .Wrap (_abgg ,_aefcc ,"");};return _bgbgg ,nil ;
|
|
};type byWidth Bitmaps ;func NewClassedPoints (points *Points ,classes _g .IntSlice )(*ClassedPoints ,error ){const _fbabf ="\u004e\u0065w\u0043\u006c\u0061s\u0073\u0065\u0064\u0050\u006f\u0069\u006e\u0074\u0073";if points ==nil {return nil ,_d .Error (_fbabf ,"\u0070\u0072\u006f\u0076id\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0070\u006f\u0069\u006e\u0074\u0073");
|
|
};if classes ==nil {return nil ,_d .Error (_fbabf ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0063\u006c\u0061ss\u0065\u0073");};_cbed :=&ClassedPoints {Points :points ,IntSlice :classes };if _ccac :=_cbed .validateIntSlice ();_ccac !=nil {return nil ,_d .Wrap (_ccac ,_fbabf ,"");
|
|
};return _cbed ,nil ;};func _bbb (_geeb ,_abe int )int {if _geeb > _abe {return _geeb ;};return _abe ;};func CorrelationScoreSimple (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab []int )(_gdbdb float64 ,_bebgg error ){const _fdbc ="\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 _gdbdb ,_d .Error (_fdbc ,"n\u0069l\u0020\u0062\u0069\u0074\u006d\u0061\u0070\u0073 \u0070\u0072\u006f\u0076id\u0065\u0064");};if tab ==nil {return _gdbdb ,_d .Error (_fdbc ,"\u0074\u0061\u0062\u0020\u0075\u006e\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};if area1 ==0||area2 ==0{return _gdbdb ,_d .Error (_fdbc ,"\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064\u0020\u0061\u0072e\u0061\u0073\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065 \u003e\u0020\u0030");};_cagd ,_bcbe :=bm1 .Width ,bm1 .Height ;_cabf ,_ecec :=bm2 .Width ,bm2 .Height ;
|
|
if _dffa (_cagd -_cabf )> maxDiffW {return 0,nil ;};if _dffa (_bcbe -_ecec )> maxDiffH {return 0,nil ;};var _fdgaa ,_aebb int ;if delX >=0{_fdgaa =int (delX +0.5);}else {_fdgaa =int (delX -0.5);};if delY >=0{_aebb =int (delY +0.5);}else {_aebb =int (delY -0.5);
|
|
};_gcca :=bm1 .createTemplate ();if _bebgg =_gcca .RasterOperation (_fdgaa ,_aebb ,_cabf ,_ecec ,PixSrc ,bm2 ,0,0);_bebgg !=nil {return _gdbdb ,_d .Wrap (_bebgg ,_fdbc ,"\u0062m\u0032 \u0074\u006f\u0020\u0054\u0065\u006d\u0070\u006c\u0061\u0074\u0065");
|
|
};if _bebgg =_gcca .RasterOperation (0,0,_cagd ,_bcbe ,PixSrcAndDst ,bm1 ,0,0);_bebgg !=nil {return _gdbdb ,_d .Wrap (_bebgg ,_fdbc ,"b\u006d\u0031\u0020\u0061\u006e\u0064\u0020\u0062\u006d\u0054");};_effe :=_gcca .countPixels ();_gdbdb =float64 (_effe )*float64 (_effe )/(float64 (area1 )*float64 (area2 ));
|
|
return _gdbdb ,nil ;};func (_cage *Boxes )Add (box *_ba .Rectangle )error {if _cage ==nil {return _d .Error ("\u0042o\u0078\u0065\u0073\u002e\u0041\u0064d","\u0027\u0042\u006f\u0078es\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};*_cage =append (*_cage ,box );return nil ;};func (_fec *Bitmap )setEightFullBytes (_ffgf int ,_cgbe uint64 )error {if _ffgf +7> len (_fec .Data )-1{return _d .Error ("\u0073\u0065\u0074\u0045\u0069\u0067\u0068\u0074\u0042\u0079\u0074\u0065\u0073","\u0069n\u0064e\u0078\u0020\u006f\u0075\u0074 \u006f\u0066 \u0072\u0061\u006e\u0067\u0065");
|
|
};_fec .Data [_ffgf ]=byte ((_cgbe &0xff00000000000000)>>56);_fec .Data [_ffgf +1]=byte ((_cgbe &0xff000000000000)>>48);_fec .Data [_ffgf +2]=byte ((_cgbe &0xff0000000000)>>40);_fec .Data [_ffgf +3]=byte ((_cgbe &0xff00000000)>>32);_fec .Data [_ffgf +4]=byte ((_cgbe &0xff000000)>>24);
|
|
_fec .Data [_ffgf +5]=byte ((_cgbe &0xff0000)>>16);_fec .Data [_ffgf +6]=byte ((_cgbe &0xff00)>>8);_fec .Data [_ffgf +7]=byte (_cgbe &0xff);return nil ;};func _dffa (_cgdb int )int {if _cgdb < 0{return -_cgdb ;};return _cgdb ;};func _ebbd (_egbd ,_bdge byte ,_cbcb CombinationOperator )byte {switch _cbcb {case CmbOpOr :return _bdge |_egbd ;
|
|
case CmbOpAnd :return _bdge &_egbd ;case CmbOpXor :return _bdge ^_egbd ;case CmbOpXNor :return ^(_bdge ^_egbd );case CmbOpNot :return ^(_bdge );default:return _bdge ;};};func SelCreateBrick (h ,w int ,cy ,cx int ,tp SelectionValue )*Selection {_egaa :=_bcbg (h ,w ,"");
|
|
_egaa .setOrigin (cy ,cx );var _ffgga ,_abbc int ;for _ffgga =0;_ffgga < h ;_ffgga ++{for _abbc =0;_abbc < w ;_abbc ++{_egaa .Data [_ffgga ][_abbc ]=tp ;};};return _egaa ;};func (_fdga *Bitmap )InverseData (){_fdga .inverseData ()};func (_edbg *ClassedPoints )YAtIndex (i int )float32 {return (*_edbg .Points )[_edbg .IntSlice [i ]].Y };
|
|
func (_faba *Bitmaps )selectByIndicator (_abdcf *_g .NumSlice )(_bfebd *Bitmaps ,_fgadb error ){const _fcgdg ="\u0042i\u0074\u006d\u0061\u0070s\u002e\u0073\u0065\u006c\u0065c\u0074B\u0079I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";if _faba ==nil {return nil ,_d .Error (_fcgdg ,"\u0027\u0062\u0027 b\u0069\u0074\u006d\u0061\u0070\u0073\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};if _abdcf ==nil {return nil ,_d .Error (_fcgdg ,"'\u006e\u0061\u0027\u0020\u0069\u006ed\u0069\u0063\u0061\u0074\u006f\u0072\u0073\u0020\u006eo\u0074\u0020\u0064e\u0066i\u006e\u0065\u0064");};if len (_faba .Values )==0{return _faba ,nil ;};if len (*_abdcf )!=len (_faba .Values ){return nil ,_d .Errorf (_fcgdg ,"\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 (*_abdcf ),len (_faba .Values ));
|
|
};var _bbee ,_afaa ,_addf int ;for _afaa =0;_afaa < len (*_abdcf );_afaa ++{if _bbee ,_fgadb =_abdcf .GetInt (_afaa );_fgadb !=nil {return nil ,_d .Wrap (_fgadb ,_fcgdg ,"f\u0069\u0072\u0073\u0074\u0020\u0063\u0068\u0065\u0063\u006b");};if _bbee ==1{_addf ++;
|
|
};};if _addf ==len (_faba .Values ){return _faba ,nil ;};_bfebd =&Bitmaps {};_accd :=len (_faba .Values )==len (_faba .Boxes );for _afaa =0;_afaa < len (*_abdcf );_afaa ++{if _bbee =int ((*_abdcf )[_afaa ]);_bbee ==0{continue ;};_bfebd .Values =append (_bfebd .Values ,_faba .Values [_afaa ]);
|
|
if _accd {_bfebd .Boxes =append (_bfebd .Boxes ,_faba .Boxes [_afaa ]);};};return _bfebd ,nil ;};type Component int ;func (_bbab *Bitmap )createTemplate ()*Bitmap {return &Bitmap {Width :_bbab .Width ,Height :_bbab .Height ,RowStride :_bbab .RowStride ,Color :_bbab .Color ,Text :_bbab .Text ,BitmapNumber :_bbab .BitmapNumber ,Special :_bbab .Special ,Data :make ([]byte ,len (_bbab .Data ))};
|
|
};func TstWriteSymbols (t *_e .T ,bms *Bitmaps ,src *Bitmap ){for _cgbab :=0;_cgbab < bms .Size ();_cgbab ++{_cdea :=bms .Values [_cgbab ];_bdaad :=bms .Boxes [_cgbab ];_bcdb :=src .RasterOperation (_bdaad .Min .X ,_bdaad .Min .Y ,_cdea .Width ,_cdea .Height ,PixSrc ,_cdea ,0,0);
|
|
_df .NoError (t ,_bcdb );};};func (_aacff *byHeight )Less (i ,j int )bool {return _aacff .Values [i ].Height < _aacff .Values [j ].Height };var MorphBC BoundaryCondition ;func (_ecadg Points )GetGeometry (i int )(_ddag ,_fgcgg float32 ,_edbd error ){if i > len (_ecadg )-1{return 0,0,_d .Errorf ("\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0065\u0074","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
};_cdeg :=_ecadg [i ];return _cdeg .X ,_cdeg .Y ,nil ;};const (CmbOpOr CombinationOperator =iota ;CmbOpAnd ;CmbOpXor ;CmbOpXNor ;CmbOpReplace ;CmbOpNot ;);func Extract (roi _ba .Rectangle ,src *Bitmap )(*Bitmap ,error ){_fbgg :=New (roi .Dx (),roi .Dy ());
|
|
_gebe :=roi .Min .X &0x07;_fdda :=8-_gebe ;_fea :=uint (8-_fbgg .Width &0x07);_ceac :=src .GetByteIndex (roi .Min .X ,roi .Min .Y );_ccb :=src .GetByteIndex (roi .Max .X -1,roi .Min .Y );_fgecb :=_fbgg .RowStride ==_ccb +1-_ceac ;var _fgeb int ;for _fgfg :=roi .Min .Y ;
|
|
_fgfg < roi .Max .Y ;_fgfg ++{_ceca :=_ceac ;_egc :=_fgeb ;switch {case _ceac ==_ccb :_eefe ,_ebb :=src .GetByte (_ceca );if _ebb !=nil {return nil ,_ebb ;};_eefe <<=uint (_gebe );_ebb =_fbgg .SetByte (_egc ,_aecdc (_fea ,_eefe ));if _ebb !=nil {return nil ,_ebb ;
|
|
};case _gebe ==0:for _fcgf :=_ceac ;_fcgf <=_ccb ;_fcgf ++{_dede ,_fddc :=src .GetByte (_ceca );if _fddc !=nil {return nil ,_fddc ;};_ceca ++;if _fcgf ==_ccb &&_fgecb {_dede =_aecdc (_fea ,_dede );};_fddc =_fbgg .SetByte (_egc ,_dede );if _fddc !=nil {return nil ,_fddc ;
|
|
};_egc ++;};default:_dgd :=_becb (src ,_fbgg ,uint (_gebe ),uint (_fdda ),_fea ,_ceac ,_ccb ,_fgecb ,_ceca ,_egc );if _dgd !=nil {return nil ,_dgd ;};};_ceac +=src .RowStride ;_ccb +=src .RowStride ;_fgeb +=_fbgg .RowStride ;};return _fbgg ,nil ;};func _aac (_cb *Bitmap ,_caa int ,_bfc []byte )(_ae *Bitmap ,_ebf error ){const _fac ="\u0072\u0065\u0064\u0075\u0063\u0065\u0052\u0061\u006e\u006b\u0042\u0069n\u0061\u0072\u0079\u0032";
|
|
if _cb ==nil {return nil ,_d .Error (_fac ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};if _caa < 1||_caa > 4{return nil ,_d .Error (_fac ,"\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 _cb .Height <=1{return nil ,_d .Errorf (_fac ,"\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",_cb .Height );
|
|
};_ae =New (_cb .Width /2,_cb .Height /2);if _bfc ==nil {_bfc =_ged ();};_gae :=_aee (_cb .RowStride ,2*_ae .RowStride );switch _caa {case 1:_ebf =_cbb (_cb ,_ae ,_caa ,_bfc ,_gae );case 2:_ebf =_bdd (_cb ,_ae ,_caa ,_bfc ,_gae );case 3:_ebf =_gce (_cb ,_ae ,_caa ,_bfc ,_gae );
|
|
case 4:_ebf =_bgcf (_cb ,_ae ,_caa ,_bfc ,_gae );};if _ebf !=nil {return nil ,_ebf ;};return _ae ,nil ;};func (_dedg *Bitmap )removeBorderGeneral (_adcf ,_gabe ,_adac ,_degc int )(*Bitmap ,error ){const _edd ="\u0072\u0065\u006d\u006fve\u0042\u006f\u0072\u0064\u0065\u0072\u0047\u0065\u006e\u0065\u0072\u0061\u006c";
|
|
if _adcf < 0||_gabe < 0||_adac < 0||_degc < 0{return nil ,_d .Error (_edd ,"\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");};_cdcg ,_ddaeb :=_dedg .Width ,_dedg .Height ;
|
|
_acgc :=_cdcg -_adcf -_gabe ;_fgafb :=_ddaeb -_adac -_degc ;if _acgc <=0{return nil ,_d .Errorf (_edd ,"w\u0069\u0064\u0074\u0068: \u0025d\u0020\u006d\u0075\u0073\u0074 \u0062\u0065\u0020\u003e\u0020\u0030",_acgc );};if _fgafb <=0{return nil ,_d .Errorf (_edd ,"\u0068\u0065\u0069\u0067ht\u003a\u0020\u0025\u0064\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065\u0020\u003e \u0030",_fgafb );
|
|
};_ceg :=New (_acgc ,_fgafb );_ceg .Color =_dedg .Color ;_cecb :=_ceg .RasterOperation (0,0,_acgc ,_fgafb ,PixSrc ,_dedg ,_adcf ,_adac );if _cecb !=nil {return nil ,_d .Wrap (_cecb ,_edd ,"");};return _ceg ,nil ;};func (_cdff *Bitmap )GetPixel (x ,y int )bool {_aggg :=_cdff .GetByteIndex (x ,y );
|
|
_gbab :=_cdff .GetBitOffset (x );_fgg :=uint (7-_gbab );if _aggg > len (_cdff .Data )-1{_gb .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 ,_cdff );
|
|
return false ;};if (_cdff .Data [_aggg ]>>_fgg )&0x01>=1{return true ;};return false ;};func Blit (src *Bitmap ,dst *Bitmap ,x ,y int ,op CombinationOperator )error {var _gged ,_bdfc int ;_fge :=src .RowStride -1;if x < 0{_bdfc =-x ;x =0;}else if x +src .Width > dst .Width {_fge -=src .Width +x -dst .Width ;
|
|
};if y < 0{_gged =-y ;y =0;_bdfc +=src .RowStride ;_fge +=src .RowStride ;}else if y +src .Height > dst .Height {_gged =src .Height +y -dst .Height ;};var (_dcaea int ;_bbbc error ;);_fgec :=x &0x07;_ffad :=8-_fgec ;_bfeb :=src .Width &0x07;_gcd :=_ffad -_bfeb ;
|
|
_fgdf :=_ffad &0x07!=0;_efcg :=src .Width <=((_fge -_bdfc )<<3)+_ffad ;_ggec :=dst .GetByteIndex (x ,y );_accb :=_gged +dst .Height ;if src .Height > _accb {_dcaea =_accb ;}else {_dcaea =src .Height ;};switch {case !_fgdf :_bbbc =_eefa (src ,dst ,_gged ,_dcaea ,_ggec ,_bdfc ,_fge ,op );
|
|
case _efcg :_bbbc =_bcd (src ,dst ,_gged ,_dcaea ,_ggec ,_bdfc ,_fge ,_gcd ,_fgec ,_ffad ,op );default:_bbbc =_ddf (src ,dst ,_gged ,_dcaea ,_ggec ,_bdfc ,_fge ,_gcd ,_fgec ,_ffad ,op ,_bfeb );};return _bbbc ;};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 (_fggbg *Bitmap )setPadBits (_dcfa int ){_gbac :=8-_fggbg .Width %8;if _gbac ==8{return ;};_ggb :=_fggbg .Width /8;_cabc :=_gefe [_gbac ];if _dcfa ==0{_cabc ^=_cabc ;};var _fbb int ;for _dcbd :=0;_dcbd < _fggbg .Height ;_dcbd ++{_fbb =_dcbd *_fggbg .RowStride +_ggb ;
|
|
if _dcfa ==0{_fggbg .Data [_fbb ]&=_cabc ;}else {_fggbg .Data [_fbb ]|=_cabc ;};};};func (_geec *Bitmap )Equivalent (s *Bitmap )bool {return _geec .equivalent (s )};type SizeSelection int ;func (_effgd *Bitmaps )GroupByHeight ()(*BitmapsArray ,error ){const _gbed ="\u0047\u0072\u006f\u0075\u0070\u0042\u0079\u0048\u0065\u0069\u0067\u0068\u0074";
|
|
if len (_effgd .Values )==0{return nil ,_d .Error (_gbed ,"\u006eo\u0020v\u0061\u006c\u0075\u0065\u0073 \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");};_edcg :=&BitmapsArray {};_effgd .SortByHeight ();_cddb :=-1;_geea :=-1;for _debb :=0;_debb < len (_effgd .Values );
|
|
_debb ++{_egbfg :=_effgd .Values [_debb ].Height ;if _egbfg > _cddb {_cddb =_egbfg ;_geea ++;_edcg .Values =append (_edcg .Values ,&Bitmaps {});};_edcg .Values [_geea ].AddBitmap (_effgd .Values [_debb ]);};return _edcg ,nil ;};func (_dceg Points )Size ()int {return len (_dceg )};
|
|
func _eefa (_gbfg ,_aecd *Bitmap ,_ggab ,_geca ,_ffe ,_dbcf ,_bdag int ,_ffgc CombinationOperator )error {var _ggc int ;_geac :=func (){_ggc ++;_ffe +=_aecd .RowStride ;_dbcf +=_gbfg .RowStride ;_bdag +=_gbfg .RowStride };for _ggc =_ggab ;_ggc < _geca ;
|
|
_geac (){_bgdd :=_ffe ;for _ccea :=_dbcf ;_ccea <=_bdag ;_ccea ++{_bded ,_eeef :=_aecd .GetByte (_bgdd );if _eeef !=nil {return _eeef ;};_dfgd ,_eeef :=_gbfg .GetByte (_ccea );if _eeef !=nil {return _eeef ;};if _eeef =_aecd .SetByte (_bgdd ,_ebbd (_bded ,_dfgd ,_ffgc ));
|
|
_eeef !=nil {return _eeef ;};_bgdd ++;};};return nil ;};type Color int ;func _dcb (_faa *Bitmap ,_da ,_bfa int )(*Bitmap ,error ){const _fbf ="e\u0078\u0070\u0061\u006edB\u0069n\u0061\u0072\u0079\u0052\u0065p\u006c\u0069\u0063\u0061\u0074\u0065";if _faa ==nil {return nil ,_d .Error (_fbf ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if _da <=0||_bfa <=0{return nil ,_d .Error (_fbf ,"\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 _da ==_bfa {if _da ==1{_bba ,_ab :=_eebad (nil ,_faa );
|
|
if _ab !=nil {return nil ,_d .Wrap (_ab ,_fbf ,"\u0078\u0046\u0061\u0063\u0074\u0020\u003d\u003d\u0020y\u0046\u0061\u0063\u0074");};return _bba ,nil ;};if _da ==2||_da ==4||_da ==8{_bcg ,_faf :=_afg (_faa ,_da );if _faf !=nil {return nil ,_d .Wrap (_faf ,_fbf ,"\u0078\u0046a\u0063\u0074\u0020i\u006e\u0020\u007b\u0032\u002c\u0034\u002c\u0038\u007d");
|
|
};return _bcg ,nil ;};};_baec :=_da *_faa .Width ;_afde :=_bfa *_faa .Height ;_bad :=New (_baec ,_afde );_ed :=_bad .RowStride ;var (_ca ,_bgg ,_ccg ,_egb ,_dgb int ;_gca byte ;_bda error ;);for _bgg =0;_bgg < _faa .Height ;_bgg ++{_ca =_bfa *_bgg *_ed ;
|
|
for _ccg =0;_ccg < _faa .Width ;_ccg ++{if _bag :=_faa .GetPixel (_ccg ,_bgg );_bag {_dgb =_da *_ccg ;for _egb =0;_egb < _da ;_egb ++{_bad .setBit (_ca *8+_dgb +_egb );};};};for _egb =1;_egb < _bfa ;_egb ++{_ecf :=_ca +_egb *_ed ;for _ffa :=0;_ffa < _ed ;
|
|
_ffa ++{if _gca ,_bda =_bad .GetByte (_ca +_ffa );_bda !=nil {return nil ,_d .Wrapf (_bda ,_fbf ,"\u0072\u0065\u0070\u006cic\u0061\u0074\u0069\u006e\u0067\u0020\u006c\u0069\u006e\u0065\u003a\u0020\u0027\u0025d\u0027",_egb );};if _bda =_bad .SetByte (_ecf +_ffa ,_gca );
|
|
_bda !=nil {return nil ,_d .Wrap (_bda ,_fbf ,"\u0053\u0065\u0074\u0074in\u0067\u0020\u0062\u0079\u0074\u0065\u0020\u0066\u0061\u0069\u006c\u0065\u0064");};};};};return _bad ,nil ;};func Dilate (d *Bitmap ,s *Bitmap ,sel *Selection )(*Bitmap ,error ){return _bced (d ,s ,sel )};
|
|
func (_caegc *Bitmap )setBit (_afda int ){_caegc .Data [(_afda >>3)]|=0x80>>uint (_afda &7)};func Copy (d ,s *Bitmap )(*Bitmap ,error ){return _eebad (d ,s )};func _ffbb (_abdg ,_cadb *Bitmap ,_gdde ,_accg int )(*Bitmap ,error ){const _gedg ="\u0063\u006c\u006f\u0073\u0065\u0053\u0061\u0066\u0065B\u0072\u0069\u0063\u006b";
|
|
if _cadb ==nil {return nil ,_d .Error (_gedg ,"\u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _gdde < 1||_accg < 1{return nil ,_d .Error (_gedg ,"\u0068s\u0069\u007a\u0065\u0020\u0061\u006e\u0064\u0020\u0076\u0073\u0069z\u0065\u0020\u006e\u006f\u0074\u0020\u003e\u003d\u0020\u0031");
|
|
};if _gdde ==1&&_accg ==1{return _eebad (_abdg ,_cadb );};if MorphBC ==SymmetricMorphBC {_fcc ,_cecd :=_fadc (_abdg ,_cadb ,_gdde ,_accg );if _cecd !=nil {return nil ,_d .Wrap (_cecd ,_gedg ,"\u0053\u0079m\u006d\u0065\u0074r\u0069\u0063\u004d\u006f\u0072\u0070\u0068\u0042\u0043");
|
|
};return _fcc ,nil ;};_ccgb :=_bbb (_gdde /2,_accg /2);_bdgad :=8*((_ccgb +7)/8);_cfbdc ,_bcge :=_cadb .AddBorder (_bdgad ,0);if _bcge !=nil {return nil ,_d .Wrapf (_bcge ,_gedg ,"\u0042\u006f\u0072\u0064\u0065\u0072\u0053\u0069\u007ae\u003a\u0020\u0025\u0064",_bdgad );
|
|
};var _cgcd ,_ccbc *Bitmap ;if _gdde ==1||_accg ==1{_fefb :=SelCreateBrick (_accg ,_gdde ,_accg /2,_gdde /2,SelHit );_cgcd ,_bcge =_acb (nil ,_cfbdc ,_fefb );if _bcge !=nil {return nil ,_d .Wrap (_bcge ,_gedg ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};}else {_ecbb :=SelCreateBrick (1,_gdde ,0,_gdde /2,SelHit );_gedf ,_bgdb :=_bced (nil ,_cfbdc ,_ecbb );if _bgdb !=nil {return nil ,_d .Wrap (_bgdb ,_gedg ,"\u0072\u0065\u0067\u0075la\u0072\u0020\u002d\u0020\u0066\u0069\u0072\u0073\u0074\u0020\u0064\u0069\u006c\u0061t\u0065");
|
|
};_gegg :=SelCreateBrick (_accg ,1,_accg /2,0,SelHit );_cgcd ,_bgdb =_bced (nil ,_gedf ,_gegg );if _bgdb !=nil {return nil ,_d .Wrap (_bgdb ,_gedg ,"\u0072\u0065\u0067ul\u0061\u0072\u0020\u002d\u0020\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
};if _ ,_bgdb =_afbbf (_gedf ,_cgcd ,_ecbb );_bgdb !=nil {return nil ,_d .Wrap (_bgdb ,_gedg ,"r\u0065\u0067\u0075\u006car\u0020-\u0020\u0066\u0069\u0072\u0073t\u0020\u0065\u0072\u006f\u0064\u0065");};if _ ,_bgdb =_afbbf (_cgcd ,_gedf ,_gegg );_bgdb !=nil {return nil ,_d .Wrap (_bgdb ,_gedg ,"\u0072\u0065\u0067\u0075la\u0072\u0020\u002d\u0020\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0065\u0072\u006fd\u0065");
|
|
};};if _ccbc ,_bcge =_cgcd .RemoveBorder (_bdgad );_bcge !=nil {return nil ,_d .Wrap (_bcge ,_gedg ,"\u0072e\u0067\u0075\u006c\u0061\u0072");};if _abdg ==nil {return _ccbc ,nil ;};if _ ,_bcge =_eebad (_abdg ,_ccbc );_bcge !=nil {return nil ,_bcge ;};return _abdg ,nil ;
|
|
};func _fgab (_ccaca ,_acdc *Bitmap ,_gbaf ,_eaag int )(_ddd error ){const _geggf ="\u0073e\u0065d\u0066\u0069\u006c\u006c\u0042i\u006e\u0061r\u0079\u004c\u006f\u0077\u0034";var (_caegd ,_edad ,_dadeg ,_ebge int ;_bfbe ,_cabca ,_bebd ,_fded ,_dfdf ,_caeca ,_bgbba byte ;
|
|
);for _caegd =0;_caegd < _gbaf ;_caegd ++{_dadeg =_caegd *_ccaca .RowStride ;_ebge =_caegd *_acdc .RowStride ;for _edad =0;_edad < _eaag ;_edad ++{_bfbe ,_ddd =_ccaca .GetByte (_dadeg +_edad );if _ddd !=nil {return _d .Wrap (_ddd ,_geggf ,"\u0066i\u0072\u0073\u0074\u0020\u0067\u0065t");
|
|
};_cabca ,_ddd =_acdc .GetByte (_ebge +_edad );if _ddd !=nil {return _d .Wrap (_ddd ,_geggf ,"\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0067\u0065\u0074");};if _caegd > 0{_bebd ,_ddd =_ccaca .GetByte (_dadeg -_ccaca .RowStride +_edad );if _ddd !=nil {return _d .Wrap (_ddd ,_geggf ,"\u0069\u0020\u003e \u0030");
|
|
};_bfbe |=_bebd ;};if _edad > 0{_fded ,_ddd =_ccaca .GetByte (_dadeg +_edad -1);if _ddd !=nil {return _d .Wrap (_ddd ,_geggf ,"\u006a\u0020\u003e \u0030");};_bfbe |=_fded <<7;};_bfbe &=_cabca ;if _bfbe ==0||(^_bfbe )==0{if _ddd =_ccaca .SetByte (_dadeg +_edad ,_bfbe );
|
|
_ddd !=nil {return _d .Wrap (_ddd ,_geggf ,"b\u0074\u0020\u003d\u003d 0\u0020|\u007c\u0020\u0028\u005e\u0062t\u0029\u0020\u003d\u003d\u0020\u0030");};continue ;};for {_bgbba =_bfbe ;_bfbe =(_bfbe |(_bfbe >>1)|(_bfbe <<1))&_cabca ;if (_bfbe ^_bgbba )==0{if _ddd =_ccaca .SetByte (_dadeg +_edad ,_bfbe );
|
|
_ddd !=nil {return _d .Wrap (_ddd ,_geggf ,"\u0073\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u0070\u0072\u0065\u0076 \u0062\u0079\u0074\u0065");};break ;};};};};for _caegd =_gbaf -1;_caegd >=0;_caegd --{_dadeg =_caegd *_ccaca .RowStride ;_ebge =_caegd *_acdc .RowStride ;
|
|
for _edad =_eaag -1;_edad >=0;_edad --{if _bfbe ,_ddd =_ccaca .GetByte (_dadeg +_edad );_ddd !=nil {return _d .Wrap (_ddd ,_geggf ,"\u0072\u0065\u0076\u0065\u0072\u0073\u0065\u0020\u0066\u0069\u0072\u0073t\u0020\u0067\u0065\u0074");};if _cabca ,_ddd =_acdc .GetByte (_ebge +_edad );
|
|
_ddd !=nil {return _d .Wrap (_ddd ,_geggf ,"r\u0065\u0076\u0065\u0072se\u0020g\u0065\u0074\u0020\u006d\u0061s\u006b\u0020\u0062\u0079\u0074\u0065");};if _caegd < _gbaf -1{if _dfdf ,_ddd =_ccaca .GetByte (_dadeg +_ccaca .RowStride +_edad );_ddd !=nil {return _d .Wrap (_ddd ,_geggf ,"\u0072\u0065v\u0065\u0072\u0073e\u0020\u0069\u0020\u003c\u0020\u0068\u0020\u002d\u0031");
|
|
};_bfbe |=_dfdf ;};if _edad < _eaag -1{if _caeca ,_ddd =_ccaca .GetByte (_dadeg +_edad +1);_ddd !=nil {return _d .Wrap (_ddd ,_geggf ,"\u0072\u0065\u0076\u0065rs\u0065\u0020\u006a\u0020\u003c\u0020\u0077\u0070\u006c\u0020\u002d\u0020\u0031");};_bfbe |=_caeca >>7;
|
|
};_bfbe &=_cabca ;if _bfbe ==0||(^_bfbe )==0{if _ddd =_ccaca .SetByte (_dadeg +_edad ,_bfbe );_ddd !=nil {return _d .Wrap (_ddd ,_geggf ,"\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 {_bgbba =_bfbe ;_bfbe =(_bfbe |(_bfbe >>1)|(_bfbe <<1))&_cabca ;if (_bfbe ^_bgbba )==0{if _ddd =_ccaca .SetByte (_dadeg +_edad ,_bfbe );_ddd !=nil {return _d .Wrap (_ddd ,_geggf ,"\u0072e\u0076\u0065\u0072\u0073e\u0020\u0073\u0065\u0074\u0074i\u006eg\u0020p\u0072\u0065\u0076\u0020\u0062\u0079\u0074e");
|
|
};break ;};};};};return nil ;};func (_fecca *Bitmaps )SortByWidth (){_fface :=(*byWidth )(_fecca );_b .Sort (_fface )};func (_gcaf CombinationOperator )String ()string {var _fcdfa string ;switch _gcaf {case CmbOpOr :_fcdfa ="\u004f\u0052";case CmbOpAnd :_fcdfa ="\u0041\u004e\u0044";
|
|
case CmbOpXor :_fcdfa ="\u0058\u004f\u0052";case CmbOpXNor :_fcdfa ="\u0058\u004e\u004f\u0052";case CmbOpReplace :_fcdfa ="\u0052E\u0050\u004c\u0041\u0043\u0045";case CmbOpNot :_fcdfa ="\u004e\u004f\u0054";};return _fcdfa ;};const (_ SizeComparison =iota ;
|
|
SizeSelectIfLT ;SizeSelectIfGT ;SizeSelectIfLTE ;SizeSelectIfGTE ;SizeSelectIfEQ ;);type fillSegment struct{_bcfd int ;_addb int ;_cbfa int ;_ddaf int ;};func RasterOperation (dest *Bitmap ,dx ,dy ,dw ,dh int ,op RasterOperator ,src *Bitmap ,sx ,sy int )error {return _caee (dest ,dx ,dy ,dw ,dh ,op ,src ,sx ,sy );
|
|
};func (_daa MorphProcess )verify (_cbfc int ,_cfce ,_dbedef *int )error {const _eeefd ="\u004d\u006f\u0072\u0070hP\u0072\u006f\u0063\u0065\u0073\u0073\u002e\u0076\u0065\u0072\u0069\u0066\u0079";switch _daa .Operation {case MopDilation ,MopErosion ,MopOpening ,MopClosing :if len (_daa .Arguments )!=2{return _d .Error (_eeefd ,"\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");
|
|
};_fffe ,_fgfb :=_daa .getWidthHeight ();if _fffe <=0||_fgfb <=0{return _d .Error (_eeefd ,"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 :_fada :=len (_daa .Arguments );*_cfce +=_fada ;if _fada < 1||_fada > 4{return _d .Error (_eeefd ,"\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 _bbgd :=0;_bbgd < _fada ;_bbgd ++{if _daa .Arguments [_bbgd ]< 1||_daa .Arguments [_bbgd ]> 4{return _d .Error (_eeefd ,"\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 (_daa .Arguments )==0{return _d .Error (_eeefd ,"\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");
|
|
};_edgad :=_daa .Arguments [0];if _edgad !=2&&_edgad !=4&&_edgad !=8{return _d .Error (_eeefd ,"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");
|
|
};*_cfce -=_fbfga [_edgad /4];case MopAddBorder :if len (_daa .Arguments )==0{return _d .Error (_eeefd ,"\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");
|
|
};_daeff :=_daa .Arguments [0];if _cbfc > 0{return _d .Error (_eeefd ,"\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 _daeff < 1{return _d .Error (_eeefd ,"\u0041\u0064\u0064\u0042o\u0072\u0064\u0065\u0072\u0020\u0076\u0061\u006c\u0075\u0065 \u006co\u0077\u0065\u0072\u0020\u0074\u0068\u0061n\u0020\u0030");};*_dbedef =_daeff ;};return nil ;};func TstGetScaledSymbol (t *_e .T ,sm *Bitmap ,scale ...int )*Bitmap {if len (scale )==0{return sm ;
|
|
};if scale [0]==1{return sm ;};_gddb ,_fdgd :=MorphSequence (sm ,MorphProcess {Operation :MopReplicativeBinaryExpansion ,Arguments :scale });_df .NoError (t ,_fdgd );return _gddb ;};func _adaf (_eaccg *Bitmap ,_eaab ,_dfbd ,_bdgef ,_egfd int ,_cegc RasterOperator ,_fdee *Bitmap ,_agba ,_fgad int )error {var (_bfggb bool ;
|
|
_bfad bool ;_gffb int ;_aeec int ;_egdd int ;_gcafd bool ;_gbad byte ;_caeec int ;_aabc int ;_acgf int ;_fcag ,_efgf int ;);_aded :=8-(_eaab &7);_dfdd :=_gefe [_aded ];_gccg :=_eaccg .RowStride *_dfbd +(_eaab >>3);_afeee :=_fdee .RowStride *_fgad +(_agba >>3);
|
|
if _bdgef < _aded {_bfggb =true ;_dfdd &=_afa [8-_aded +_bdgef ];};if !_bfggb {_gffb =(_bdgef -_aded )>>3;if _gffb > 0{_bfad =true ;_aeec =_gccg +1;_egdd =_afeee +1;};};_caeec =(_eaab +_bdgef )&7;if !(_bfggb ||_caeec ==0){_gcafd =true ;_gbad =_afa [_caeec ];
|
|
_aabc =_gccg +1+_gffb ;_acgf =_afeee +1+_gffb ;};switch _cegc {case PixSrc :for _fcag =0;_fcag < _egfd ;_fcag ++{_eaccg .Data [_gccg ]=_aagd (_eaccg .Data [_gccg ],_fdee .Data [_afeee ],_dfdd );_gccg +=_eaccg .RowStride ;_afeee +=_fdee .RowStride ;};if _bfad {for _fcag =0;
|
|
_fcag < _egfd ;_fcag ++{for _efgf =0;_efgf < _gffb ;_efgf ++{_eaccg .Data [_aeec +_efgf ]=_fdee .Data [_egdd +_efgf ];};_aeec +=_eaccg .RowStride ;_egdd +=_fdee .RowStride ;};};if _gcafd {for _fcag =0;_fcag < _egfd ;_fcag ++{_eaccg .Data [_aabc ]=_aagd (_eaccg .Data [_aabc ],_fdee .Data [_acgf ],_gbad );
|
|
_aabc +=_eaccg .RowStride ;_acgf +=_fdee .RowStride ;};};case PixNotSrc :for _fcag =0;_fcag < _egfd ;_fcag ++{_eaccg .Data [_gccg ]=_aagd (_eaccg .Data [_gccg ],^_fdee .Data [_afeee ],_dfdd );_gccg +=_eaccg .RowStride ;_afeee +=_fdee .RowStride ;};if _bfad {for _fcag =0;
|
|
_fcag < _egfd ;_fcag ++{for _efgf =0;_efgf < _gffb ;_efgf ++{_eaccg .Data [_aeec +_efgf ]=^_fdee .Data [_egdd +_efgf ];};_aeec +=_eaccg .RowStride ;_egdd +=_fdee .RowStride ;};};if _gcafd {for _fcag =0;_fcag < _egfd ;_fcag ++{_eaccg .Data [_aabc ]=_aagd (_eaccg .Data [_aabc ],^_fdee .Data [_acgf ],_gbad );
|
|
_aabc +=_eaccg .RowStride ;_acgf +=_fdee .RowStride ;};};case PixSrcOrDst :for _fcag =0;_fcag < _egfd ;_fcag ++{_eaccg .Data [_gccg ]=_aagd (_eaccg .Data [_gccg ],_fdee .Data [_afeee ]|_eaccg .Data [_gccg ],_dfdd );_gccg +=_eaccg .RowStride ;_afeee +=_fdee .RowStride ;
|
|
};if _bfad {for _fcag =0;_fcag < _egfd ;_fcag ++{for _efgf =0;_efgf < _gffb ;_efgf ++{_eaccg .Data [_aeec +_efgf ]|=_fdee .Data [_egdd +_efgf ];};_aeec +=_eaccg .RowStride ;_egdd +=_fdee .RowStride ;};};if _gcafd {for _fcag =0;_fcag < _egfd ;_fcag ++{_eaccg .Data [_aabc ]=_aagd (_eaccg .Data [_aabc ],_fdee .Data [_acgf ]|_eaccg .Data [_aabc ],_gbad );
|
|
_aabc +=_eaccg .RowStride ;_acgf +=_fdee .RowStride ;};};case PixSrcAndDst :for _fcag =0;_fcag < _egfd ;_fcag ++{_eaccg .Data [_gccg ]=_aagd (_eaccg .Data [_gccg ],_fdee .Data [_afeee ]&_eaccg .Data [_gccg ],_dfdd );_gccg +=_eaccg .RowStride ;_afeee +=_fdee .RowStride ;
|
|
};if _bfad {for _fcag =0;_fcag < _egfd ;_fcag ++{for _efgf =0;_efgf < _gffb ;_efgf ++{_eaccg .Data [_aeec +_efgf ]&=_fdee .Data [_egdd +_efgf ];};_aeec +=_eaccg .RowStride ;_egdd +=_fdee .RowStride ;};};if _gcafd {for _fcag =0;_fcag < _egfd ;_fcag ++{_eaccg .Data [_aabc ]=_aagd (_eaccg .Data [_aabc ],_fdee .Data [_acgf ]&_eaccg .Data [_aabc ],_gbad );
|
|
_aabc +=_eaccg .RowStride ;_acgf +=_fdee .RowStride ;};};case PixSrcXorDst :for _fcag =0;_fcag < _egfd ;_fcag ++{_eaccg .Data [_gccg ]=_aagd (_eaccg .Data [_gccg ],_fdee .Data [_afeee ]^_eaccg .Data [_gccg ],_dfdd );_gccg +=_eaccg .RowStride ;_afeee +=_fdee .RowStride ;
|
|
};if _bfad {for _fcag =0;_fcag < _egfd ;_fcag ++{for _efgf =0;_efgf < _gffb ;_efgf ++{_eaccg .Data [_aeec +_efgf ]^=_fdee .Data [_egdd +_efgf ];};_aeec +=_eaccg .RowStride ;_egdd +=_fdee .RowStride ;};};if _gcafd {for _fcag =0;_fcag < _egfd ;_fcag ++{_eaccg .Data [_aabc ]=_aagd (_eaccg .Data [_aabc ],_fdee .Data [_acgf ]^_eaccg .Data [_aabc ],_gbad );
|
|
_aabc +=_eaccg .RowStride ;_acgf +=_fdee .RowStride ;};};case PixNotSrcOrDst :for _fcag =0;_fcag < _egfd ;_fcag ++{_eaccg .Data [_gccg ]=_aagd (_eaccg .Data [_gccg ],^(_fdee .Data [_afeee ])|_eaccg .Data [_gccg ],_dfdd );_gccg +=_eaccg .RowStride ;_afeee +=_fdee .RowStride ;
|
|
};if _bfad {for _fcag =0;_fcag < _egfd ;_fcag ++{for _efgf =0;_efgf < _gffb ;_efgf ++{_eaccg .Data [_aeec +_efgf ]|=^(_fdee .Data [_egdd +_efgf ]);};_aeec +=_eaccg .RowStride ;_egdd +=_fdee .RowStride ;};};if _gcafd {for _fcag =0;_fcag < _egfd ;_fcag ++{_eaccg .Data [_aabc ]=_aagd (_eaccg .Data [_aabc ],^(_fdee .Data [_acgf ])|_eaccg .Data [_aabc ],_gbad );
|
|
_aabc +=_eaccg .RowStride ;_acgf +=_fdee .RowStride ;};};case PixNotSrcAndDst :for _fcag =0;_fcag < _egfd ;_fcag ++{_eaccg .Data [_gccg ]=_aagd (_eaccg .Data [_gccg ],^(_fdee .Data [_afeee ])&_eaccg .Data [_gccg ],_dfdd );_gccg +=_eaccg .RowStride ;_afeee +=_fdee .RowStride ;
|
|
};if _bfad {for _fcag =0;_fcag < _egfd ;_fcag ++{for _efgf =0;_efgf < _gffb ;_efgf ++{_eaccg .Data [_aeec +_efgf ]&=^_fdee .Data [_egdd +_efgf ];};_aeec +=_eaccg .RowStride ;_egdd +=_fdee .RowStride ;};};if _gcafd {for _fcag =0;_fcag < _egfd ;_fcag ++{_eaccg .Data [_aabc ]=_aagd (_eaccg .Data [_aabc ],^(_fdee .Data [_acgf ])&_eaccg .Data [_aabc ],_gbad );
|
|
_aabc +=_eaccg .RowStride ;_acgf +=_fdee .RowStride ;};};case PixSrcOrNotDst :for _fcag =0;_fcag < _egfd ;_fcag ++{_eaccg .Data [_gccg ]=_aagd (_eaccg .Data [_gccg ],_fdee .Data [_afeee ]|^(_eaccg .Data [_gccg ]),_dfdd );_gccg +=_eaccg .RowStride ;_afeee +=_fdee .RowStride ;
|
|
};if _bfad {for _fcag =0;_fcag < _egfd ;_fcag ++{for _efgf =0;_efgf < _gffb ;_efgf ++{_eaccg .Data [_aeec +_efgf ]=_fdee .Data [_egdd +_efgf ]|^(_eaccg .Data [_aeec +_efgf ]);};_aeec +=_eaccg .RowStride ;_egdd +=_fdee .RowStride ;};};if _gcafd {for _fcag =0;
|
|
_fcag < _egfd ;_fcag ++{_eaccg .Data [_aabc ]=_aagd (_eaccg .Data [_aabc ],_fdee .Data [_acgf ]|^(_eaccg .Data [_aabc ]),_gbad );_aabc +=_eaccg .RowStride ;_acgf +=_fdee .RowStride ;};};case PixSrcAndNotDst :for _fcag =0;_fcag < _egfd ;_fcag ++{_eaccg .Data [_gccg ]=_aagd (_eaccg .Data [_gccg ],_fdee .Data [_afeee ]&^(_eaccg .Data [_gccg ]),_dfdd );
|
|
_gccg +=_eaccg .RowStride ;_afeee +=_fdee .RowStride ;};if _bfad {for _fcag =0;_fcag < _egfd ;_fcag ++{for _efgf =0;_efgf < _gffb ;_efgf ++{_eaccg .Data [_aeec +_efgf ]=_fdee .Data [_egdd +_efgf ]&^(_eaccg .Data [_aeec +_efgf ]);};_aeec +=_eaccg .RowStride ;
|
|
_egdd +=_fdee .RowStride ;};};if _gcafd {for _fcag =0;_fcag < _egfd ;_fcag ++{_eaccg .Data [_aabc ]=_aagd (_eaccg .Data [_aabc ],_fdee .Data [_acgf ]&^(_eaccg .Data [_aabc ]),_gbad );_aabc +=_eaccg .RowStride ;_acgf +=_fdee .RowStride ;};};case PixNotPixSrcOrDst :for _fcag =0;
|
|
_fcag < _egfd ;_fcag ++{_eaccg .Data [_gccg ]=_aagd (_eaccg .Data [_gccg ],^(_fdee .Data [_afeee ]|_eaccg .Data [_gccg ]),_dfdd );_gccg +=_eaccg .RowStride ;_afeee +=_fdee .RowStride ;};if _bfad {for _fcag =0;_fcag < _egfd ;_fcag ++{for _efgf =0;_efgf < _gffb ;
|
|
_efgf ++{_eaccg .Data [_aeec +_efgf ]=^(_fdee .Data [_egdd +_efgf ]|_eaccg .Data [_aeec +_efgf ]);};_aeec +=_eaccg .RowStride ;_egdd +=_fdee .RowStride ;};};if _gcafd {for _fcag =0;_fcag < _egfd ;_fcag ++{_eaccg .Data [_aabc ]=_aagd (_eaccg .Data [_aabc ],^(_fdee .Data [_acgf ]|_eaccg .Data [_aabc ]),_gbad );
|
|
_aabc +=_eaccg .RowStride ;_acgf +=_fdee .RowStride ;};};case PixNotPixSrcAndDst :for _fcag =0;_fcag < _egfd ;_fcag ++{_eaccg .Data [_gccg ]=_aagd (_eaccg .Data [_gccg ],^(_fdee .Data [_afeee ]&_eaccg .Data [_gccg ]),_dfdd );_gccg +=_eaccg .RowStride ;
|
|
_afeee +=_fdee .RowStride ;};if _bfad {for _fcag =0;_fcag < _egfd ;_fcag ++{for _efgf =0;_efgf < _gffb ;_efgf ++{_eaccg .Data [_aeec +_efgf ]=^(_fdee .Data [_egdd +_efgf ]&_eaccg .Data [_aeec +_efgf ]);};_aeec +=_eaccg .RowStride ;_egdd +=_fdee .RowStride ;
|
|
};};if _gcafd {for _fcag =0;_fcag < _egfd ;_fcag ++{_eaccg .Data [_aabc ]=_aagd (_eaccg .Data [_aabc ],^(_fdee .Data [_acgf ]&_eaccg .Data [_aabc ]),_gbad );_aabc +=_eaccg .RowStride ;_acgf +=_fdee .RowStride ;};};case PixNotPixSrcXorDst :for _fcag =0;
|
|
_fcag < _egfd ;_fcag ++{_eaccg .Data [_gccg ]=_aagd (_eaccg .Data [_gccg ],^(_fdee .Data [_afeee ]^_eaccg .Data [_gccg ]),_dfdd );_gccg +=_eaccg .RowStride ;_afeee +=_fdee .RowStride ;};if _bfad {for _fcag =0;_fcag < _egfd ;_fcag ++{for _efgf =0;_efgf < _gffb ;
|
|
_efgf ++{_eaccg .Data [_aeec +_efgf ]=^(_fdee .Data [_egdd +_efgf ]^_eaccg .Data [_aeec +_efgf ]);};_aeec +=_eaccg .RowStride ;_egdd +=_fdee .RowStride ;};};if _gcafd {for _fcag =0;_fcag < _egfd ;_fcag ++{_eaccg .Data [_aabc ]=_aagd (_eaccg .Data [_aabc ],^(_fdee .Data [_acgf ]^_eaccg .Data [_aabc ]),_gbad );
|
|
_aabc +=_eaccg .RowStride ;_acgf +=_fdee .RowStride ;};};default:_gb .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",_cegc );return _d .Error ("\u0072\u0061\u0073\u0074er\u004f\u0070\u0056\u0041\u006c\u0069\u0067\u006e\u0065\u0064\u004c\u006f\u0077","\u0069\u006e\u0076al\u0069\u0064\u0020\u0072\u0061\u0073\u0074\u0065\u0072\u0020\u006f\u0070\u0065\u0072\u0061\u0074\u006f\u0072");
|
|
};return nil ;};func (_fee *Bitmap )setEightPartlyBytes (_ecad ,_gaba int ,_fddb uint64 )(_bdg error ){var (_gcfe byte ;_gceg int ;);const _egf ="\u0073\u0065\u0074\u0045ig\u0068\u0074\u0050\u0061\u0072\u0074\u006c\u0079\u0042\u0079\u0074\u0065\u0073";
|
|
for _eddg :=1;_eddg <=_gaba ;_eddg ++{_gceg =64-_eddg *8;_gcfe =byte (_fddb >>uint (_gceg )&0xff);_gb .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",_gcfe ,_ecad ,_ecad +_eddg -1,_gaba ,_gceg );
|
|
if _bdg =_fee .SetByte (_ecad +_eddg -1,_gcfe );_bdg !=nil {return _d .Wrap (_bdg ,_egf ,"\u0066\u0075\u006c\u006c\u0042\u0079\u0074\u0065");};};_dcae :=_fee .RowStride *8-_fee .Width ;if _dcae ==0{return nil ;};_gceg -=8;_gcfe =byte (_fddb >>uint (_gceg )&0xff)<<uint (_dcae );
|
|
if _bdg =_fee .SetByte (_ecad +_gaba ,_gcfe );_bdg !=nil {return _d .Wrap (_bdg ,_egf ,"\u0070\u0061\u0064\u0064\u0065\u0064");};return nil ;};func (_cfac *ClassedPoints )Len ()int {return _cfac .IntSlice .Size ()};func (_cdbd *Bitmap )clipRectangle (_baaf ,_fff *_ba .Rectangle )(_bde *Bitmap ,_cgbd error ){const _dbg ="\u0063\u006c\u0069\u0070\u0052\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065";
|
|
if _baaf ==nil {return nil ,_d .Error (_dbg ,"\u0070r\u006fv\u0069\u0064\u0065\u0064\u0020n\u0069\u006c \u0027\u0062\u006f\u0078\u0027");};_gfef ,_cbf :=_cdbd .Width ,_cdbd .Height ;_gada ,_cgbd :=ClipBoxToRectangle (_baaf ,_gfef ,_cbf );if _cgbd !=nil {_gb .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",_cgbd );
|
|
return nil ,nil ;};_bbe ,_gbgg :=_gada .Min .X ,_gada .Min .Y ;_edga ,_bdeg :=_gada .Max .X -_gada .Min .X ,_gada .Max .Y -_gada .Min .Y ;_bde =New (_edga ,_bdeg );_bde .Text =_cdbd .Text ;if _cgbd =_bde .RasterOperation (0,0,_edga ,_bdeg ,PixSrc ,_cdbd ,_bbe ,_gbgg );
|
|
_cgbd !=nil {return nil ,_d .Wrap (_cgbd ,_dbg ,"");};if _fff !=nil {*_fff =*_gada ;};return _bde ,nil ;};type Points []Point ;func Centroids (bms []*Bitmap )(*Points ,error ){_dadac :=make ([]Point ,len (bms ));_dbgff :=_afbf ();_bfcg :=_bfcf ();var _cgff error ;
|
|
for _dab ,_bgfa :=range bms {_dadac [_dab ],_cgff =_bgfa .centroid (_dbgff ,_bfcg );if _cgff !=nil {return nil ,_cgff ;};};_fbgd :=Points (_dadac );return &_fbgd ,nil ;};func _egd (_agg ,_agge int )*Bitmap {return &Bitmap {Width :_agg ,Height :_agge ,RowStride :(_agg +7)>>3};
|
|
};func _caee (_acad *Bitmap ,_fegc ,_gded ,_ggfg ,_agee int ,_dead RasterOperator ,_ceab *Bitmap ,_gedbe ,_dbba int )error {const _agea ="\u0072a\u0073t\u0065\u0072\u004f\u0070\u0065\u0072\u0061\u0074\u0069\u006f\u006e";if _acad ==nil {return _d .Error (_agea ,"\u006e\u0069\u006c\u0020\u0027\u0064\u0065\u0073\u0074\u0027\u0020\u0042i\u0074\u006d\u0061\u0070");
|
|
};if _dead ==PixDst {return nil ;};switch _dead {case PixClr ,PixSet ,PixNotDst :_gddd (_acad ,_fegc ,_gded ,_ggfg ,_agee ,_dead );return nil ;};if _ceab ==nil {_gb .Log .Debug ("\u0052a\u0073\u0074e\u0072\u004f\u0070\u0065r\u0061\u0074\u0069o\u006e\u0020\u0073\u006f\u0075\u0072\u0063\u0065\u0020bi\u0074\u006d\u0061p\u0020\u0069s\u0020\u006e\u006f\u0074\u0020\u0064e\u0066\u0069n\u0065\u0064");
|
|
return _d .Error (_agea ,"\u006e\u0069l\u0020\u0027\u0073r\u0063\u0027\u0020\u0062\u0069\u0074\u006d\u0061\u0070");};if _daeb :=_ccbf (_acad ,_fegc ,_gded ,_ggfg ,_agee ,_dead ,_ceab ,_gedbe ,_dbba );_daeb !=nil {return _d .Wrap (_daeb ,_agea ,"");};return nil ;
|
|
};func _abdd (_bbf ,_ggeba *Bitmap ,_fdae *Selection )(*Bitmap ,error ){const _cecdc ="\u006f\u0070\u0065\u006e";var _bfg error ;_bbf ,_bfg =_gdc (_bbf ,_ggeba ,_fdae );if _bfg !=nil {return nil ,_d .Wrap (_bfg ,_cecdc ,"");};_gdfc ,_bfg :=_afbbf (nil ,_ggeba ,_fdae );
|
|
if _bfg !=nil {return nil ,_d .Wrap (_bfg ,_cecdc ,"");};_ ,_bfg =_bced (_bbf ,_gdfc ,_fdae );if _bfg !=nil {return nil ,_d .Wrap (_bfg ,_cecdc ,"");};return _bbf ,nil ;};func _aee (_fdc ,_bebf int )int {if _fdc < _bebf {return _fdc ;};return _bebf ;};
|
|
func TstWordBitmapWithSpaces (t *_e .T ,scale ...int )*Bitmap {_gbbeg :=1;if len (scale )> 0{_gbbeg =scale [0];};_gccd :=3;_dcfd :=9+7+15+2*_gccd +2*_gccd ;_ecga :=5+_gccd +5+2*_gccd ;_efgb :=New (_dcfd *_gbbeg ,_ecga *_gbbeg );_acaaca :=&Bitmaps {};var _addbf *int ;
|
|
_gccd *=_gbbeg ;_cgbc :=_gccd ;_addbf =&_cgbc ;_eagd :=_gccd ;_cggf :=TstDSymbol (t ,scale ...);TstAddSymbol (t ,_acaaca ,_cggf ,_addbf ,_eagd ,1*_gbbeg );_cggf =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_acaaca ,_cggf ,_addbf ,_eagd ,_gccd );_cggf =TstISymbol (t ,scale ...);
|
|
TstAddSymbol (t ,_acaaca ,_cggf ,_addbf ,_eagd ,1*_gbbeg );_cggf =TstTSymbol (t ,scale ...);TstAddSymbol (t ,_acaaca ,_cggf ,_addbf ,_eagd ,_gccd );_cggf =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_acaaca ,_cggf ,_addbf ,_eagd ,1*_gbbeg );_cggf =TstOSymbol (t ,scale ...);
|
|
TstAddSymbol (t ,_acaaca ,_cggf ,_addbf ,_eagd ,1*_gbbeg );_cggf =TstWSymbol (t ,scale ...);TstAddSymbol (t ,_acaaca ,_cggf ,_addbf ,_eagd ,0);*_addbf =_gccd ;_eagd =5*_gbbeg +_gccd ;_cggf =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_acaaca ,_cggf ,_addbf ,_eagd ,1*_gbbeg );
|
|
_cggf =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_acaaca ,_cggf ,_addbf ,_eagd ,_gccd );_cggf =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_acaaca ,_cggf ,_addbf ,_eagd ,1*_gbbeg );_cggf =TstESymbol (t ,scale ...);TstAddSymbol (t ,_acaaca ,_cggf ,_addbf ,_eagd ,1*_gbbeg );
|
|
_cggf =TstVSymbol (t ,scale ...);TstAddSymbol (t ,_acaaca ,_cggf ,_addbf ,_eagd ,1*_gbbeg );_cggf =TstESymbol (t ,scale ...);TstAddSymbol (t ,_acaaca ,_cggf ,_addbf ,_eagd ,1*_gbbeg );_cggf =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_acaaca ,_cggf ,_addbf ,_eagd ,0);
|
|
TstWriteSymbols (t ,_acaaca ,_efgb );return _efgb ;};func _bbgg (_gcbe ,_cbbca *Bitmap ,_dbedb CombinationOperator )*Bitmap {_adec :=New (_gcbe .Width ,_gcbe .Height );for _egcg :=0;_egcg < len (_adec .Data );_egcg ++{_adec .Data [_egcg ]=_ebbd (_gcbe .Data [_egcg ],_cbbca .Data [_egcg ],_dbedb );
|
|
};return _adec ;};var (_caeb =_gdf ();_dffd =_ag ();_egec =_bcf (););func _bcf ()(_eeb [256]uint64 ){for _bcfa :=0;_bcfa < 256;_bcfa ++{if _bcfa &0x01!=0{_eeb [_bcfa ]|=0xff;};if _bcfa &0x02!=0{_eeb [_bcfa ]|=0xff00;};if _bcfa &0x04!=0{_eeb [_bcfa ]|=0xff0000;
|
|
};if _bcfa &0x08!=0{_eeb [_bcfa ]|=0xff000000;};if _bcfa &0x10!=0{_eeb [_bcfa ]|=0xff00000000;};if _bcfa &0x20!=0{_eeb [_bcfa ]|=0xff0000000000;};if _bcfa &0x40!=0{_eeb [_bcfa ]|=0xff000000000000;};if _bcfa &0x80!=0{_eeb [_bcfa ]|=0xff00000000000000;};
|
|
};return _eeb ;};func ClipBoxToRectangle (box *_ba .Rectangle ,wi ,hi int )(_cgcf *_ba .Rectangle ,_bga error ){const _cdcd ="\u0043l\u0069p\u0042\u006f\u0078\u0054\u006fR\u0065\u0063t\u0061\u006e\u0067\u006c\u0065";if box ==nil {return nil ,_d .Error (_cdcd ,"\u0027\u0062\u006f\u0078\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065f\u0069\u006e\u0065\u0064");
|
|
};if box .Min .X >=wi ||box .Min .Y >=hi ||box .Max .X <=0||box .Max .Y <=0{return nil ,_d .Error (_cdcd ,"\u0027\u0062\u006fx'\u0020\u006f\u0075\u0074\u0073\u0069\u0064\u0065\u0020\u0072\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065");};_beae :=*box ;
|
|
_cgcf =&_beae ;if _cgcf .Min .X < 0{_cgcf .Max .X +=_cgcf .Min .X ;_cgcf .Min .X =0;};if _cgcf .Min .Y < 0{_cgcf .Max .Y +=_cgcf .Min .Y ;_cgcf .Min .Y =0;};if _cgcf .Max .X > wi {_cgcf .Max .X =wi ;};if _cgcf .Max .Y > hi {_cgcf .Max .Y =hi ;};return _cgcf ,nil ;
|
|
};func _aeef (_eddff ,_bgfgc ,_edgaa *Bitmap ,_fdfc int )(*Bitmap ,error ){const _abdc ="\u0073\u0065\u0065\u0064\u0046\u0069\u006c\u006c\u0042i\u006e\u0061\u0072\u0079";if _bgfgc ==nil {return nil ,_d .Error (_abdc ,"s\u006fu\u0072\u0063\u0065\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");
|
|
};if _edgaa ==nil {return nil ,_d .Error (_abdc ,"'\u006da\u0073\u006b\u0027\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");};if _fdfc !=4&&_fdfc !=8{return nil ,_d .Error (_abdc ,"\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 _aega error ;_eddff ,_aega =_eebad (_eddff ,_bgfgc );if _aega !=nil {return nil ,_d .Wrap (_aega ,_abdc ,"\u0063o\u0070y\u0020\u0073\u006f\u0075\u0072c\u0065\u0020t\u006f\u0020\u0027\u0064\u0027");};_eddd :=_bgfgc .createTemplate ();_edgaa .setPadBits (0);
|
|
for _eaec :=0;_eaec < _dgbg ;_eaec ++{_eddd ,_aega =_eebad (_eddd ,_eddff );if _aega !=nil {return nil ,_d .Wrapf (_aega ,_abdc ,"\u0069\u0074\u0065\u0072\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0064",_eaec );};if _aega =_bgga (_eddff ,_edgaa ,_fdfc );
|
|
_aega !=nil {return nil ,_d .Wrapf (_aega ,_abdc ,"\u0069\u0074\u0065\u0072\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0064",_eaec );};if _eddd .Equals (_eddff ){break ;};};return _eddff ,nil ;};type LocationFilter int ;func (_dgfdf *ClassedPoints )Less (i ,j int )bool {return _dgfdf ._edaag (i ,j )};
|
|
func (_cda *Bitmap )GetByte (index int )(byte ,error ){if index > len (_cda .Data )-1||index < 0{return 0,_d .Errorf ("\u0047e\u0074\u0042\u0079\u0074\u0065","\u0069\u006e\u0064\u0065x:\u0020\u0025\u0064\u0020\u006f\u0075\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006eg\u0065",index );
|
|
};return _cda .Data [index ],nil ;};func (_cbggb *BitmapsArray )AddBox (box *_ba .Rectangle ){_cbggb .Boxes =append (_cbggb .Boxes ,box )};const (_ggae shift =iota ;_cbaf ;);func CorrelationScore (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab []int )(_gafd float64 ,_bed error ){const _cfbdb ="\u0063\u006fr\u0072\u0065\u006ca\u0074\u0069\u006f\u006e\u0053\u0063\u006f\u0072\u0065";
|
|
if bm1 ==nil ||bm2 ==nil {return 0,_d .Error (_cfbdb ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0062\u0069\u0074ma\u0070\u0073");};if tab ==nil {return 0,_d .Error (_cfbdb ,"\u0027\u0074\u0061\u0062\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065f\u0069\u006e\u0065\u0064");
|
|
};if area1 <=0||area2 <=0{return 0,_d .Error (_cfbdb ,"\u0061\u0072\u0065\u0061s\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065\u0020\u0067r\u0065a\u0074\u0065\u0072\u0020\u0074\u0068\u0061n\u0020\u0030");};_dbgd ,_bfac :=bm1 .Width ,bm1 .Height ;_afcf ,_bgcff :=bm2 .Width ,bm2 .Height ;
|
|
_ddb :=_dffa (_dbgd -_afcf );if _ddb > maxDiffW {return 0,nil ;};_cedg :=_dffa (_bfac -_bgcff );if _cedg > maxDiffH {return 0,nil ;};var _dcgb ,_fbbf int ;if delX >=0{_dcgb =int (delX +0.5);}else {_dcgb =int (delX -0.5);};if delY >=0{_fbbf =int (delY +0.5);
|
|
}else {_fbbf =int (delY -0.5);};_efac :=_bbb (_fbbf ,0);_gcaab :=_aee (_bgcff +_fbbf ,_bfac );_efacf :=bm1 .RowStride *_efac ;_dgbf :=bm2 .RowStride *(_efac -_fbbf );_gfgg :=_bbb (_dcgb ,0);_acef :=_aee (_afcf +_dcgb ,_dbgd );_ccba :=bm2 .RowStride ;var _ggfb ,_gffe int ;
|
|
if _dcgb >=8{_ggfb =_dcgb >>3;_efacf +=_ggfb ;_gfgg -=_ggfb <<3;_acef -=_ggfb <<3;_dcgb &=7;}else if _dcgb <=-8{_gffe =-((_dcgb +7)>>3);_dgbf +=_gffe ;_ccba -=_gffe ;_dcgb +=_gffe <<3;};if _gfgg >=_acef ||_efac >=_gcaab {return 0,nil ;};_ccag :=(_acef +7)>>3;
|
|
var (_ebga ,_dagb ,_dfec byte ;_acac ,_gbgf ,_afdf int ;);switch {case _dcgb ==0:for _afdf =_efac ;_afdf < _gcaab ;_afdf ,_efacf ,_dgbf =_afdf +1,_efacf +bm1 .RowStride ,_dgbf +bm2 .RowStride {for _gbgf =0;_gbgf < _ccag ;_gbgf ++{_dfec =bm1 .Data [_efacf +_gbgf ]&bm2 .Data [_dgbf +_gbgf ];
|
|
_acac +=tab [_dfec ];};};case _dcgb > 0:if _ccba < _ccag {for _afdf =_efac ;_afdf < _gcaab ;_afdf ,_efacf ,_dgbf =_afdf +1,_efacf +bm1 .RowStride ,_dgbf +bm2 .RowStride {_ebga ,_dagb =bm1 .Data [_efacf ],bm2 .Data [_dgbf ]>>uint (_dcgb );_dfec =_ebga &_dagb ;
|
|
_acac +=tab [_dfec ];for _gbgf =1;_gbgf < _ccba ;_gbgf ++{_ebga ,_dagb =bm1 .Data [_efacf +_gbgf ],(bm2 .Data [_dgbf +_gbgf ]>>uint (_dcgb ))|(bm2 .Data [_dgbf +_gbgf -1]<<uint (8-_dcgb ));_dfec =_ebga &_dagb ;_acac +=tab [_dfec ];};_ebga =bm1 .Data [_efacf +_gbgf ];
|
|
_dagb =bm2 .Data [_dgbf +_gbgf -1]<<uint (8-_dcgb );_dfec =_ebga &_dagb ;_acac +=tab [_dfec ];};}else {for _afdf =_efac ;_afdf < _gcaab ;_afdf ,_efacf ,_dgbf =_afdf +1,_efacf +bm1 .RowStride ,_dgbf +bm2 .RowStride {_ebga ,_dagb =bm1 .Data [_efacf ],bm2 .Data [_dgbf ]>>uint (_dcgb );
|
|
_dfec =_ebga &_dagb ;_acac +=tab [_dfec ];for _gbgf =1;_gbgf < _ccag ;_gbgf ++{_ebga =bm1 .Data [_efacf +_gbgf ];_dagb =(bm2 .Data [_dgbf +_gbgf ]>>uint (_dcgb ))|(bm2 .Data [_dgbf +_gbgf -1]<<uint (8-_dcgb ));_dfec =_ebga &_dagb ;_acac +=tab [_dfec ];
|
|
};};};default:if _ccag < _ccba {for _afdf =_efac ;_afdf < _gcaab ;_afdf ,_efacf ,_dgbf =_afdf +1,_efacf +bm1 .RowStride ,_dgbf +bm2 .RowStride {for _gbgf =0;_gbgf < _ccag ;_gbgf ++{_ebga =bm1 .Data [_efacf +_gbgf ];_dagb =bm2 .Data [_dgbf +_gbgf ]<<uint (-_dcgb );
|
|
_dagb |=bm2 .Data [_dgbf +_gbgf +1]>>uint (8+_dcgb );_dfec =_ebga &_dagb ;_acac +=tab [_dfec ];};};}else {for _afdf =_efac ;_afdf < _gcaab ;_afdf ,_efacf ,_dgbf =_afdf +1,_efacf +bm1 .RowStride ,_dgbf +bm2 .RowStride {for _gbgf =0;_gbgf < _ccag -1;_gbgf ++{_ebga =bm1 .Data [_efacf +_gbgf ];
|
|
_dagb =bm2 .Data [_dgbf +_gbgf ]<<uint (-_dcgb );_dagb |=bm2 .Data [_dgbf +_gbgf +1]>>uint (8+_dcgb );_dfec =_ebga &_dagb ;_acac +=tab [_dfec ];};_ebga =bm1 .Data [_efacf +_gbgf ];_dagb =bm2 .Data [_dgbf +_gbgf ]<<uint (-_dcgb );_dfec =_ebga &_dagb ;_acac +=tab [_dfec ];
|
|
};};};_gafd =float64 (_acac )*float64 (_acac )/(float64 (area1 )*float64 (area2 ));return _gafd ,nil ;};func _fdgb (_cadba *Bitmap ,_eaabd *_g .Stack ,_feed ,_ega int )(_beee *_ba .Rectangle ,_gdgf error ){const _febf ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";
|
|
if _cadba ==nil {return nil ,_d .Error (_febf ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");};if _eaabd ==nil {return nil ,_d .Error (_febf ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");
|
|
};_fcea ,_adee :=_cadba .Width ,_cadba .Height ;_agaeb :=_fcea -1;_dabb :=_adee -1;if _feed < 0||_feed > _agaeb ||_ega < 0||_ega > _dabb ||!_cadba .GetPixel (_feed ,_ega ){return nil ,nil ;};var _fdcge *_ba .Rectangle ;_fdcge ,_gdgf =Rect (100000,100000,0,0);
|
|
if _gdgf !=nil {return nil ,_d .Wrap (_gdgf ,_febf ,"");};if _gdgf =_bcdcb (_eaabd ,_feed ,_feed ,_ega ,1,_dabb ,_fdcge );_gdgf !=nil {return nil ,_d .Wrap (_gdgf ,_febf ,"\u0069\u006e\u0069t\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _gdgf =_bcdcb (_eaabd ,_feed ,_feed ,_ega +1,-1,_dabb ,_fdcge );
|
|
_gdgf !=nil {return nil ,_d .Wrap (_gdgf ,_febf ,"\u0032\u006ed\u0020\u0069\u006ei\u0074\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};_fdcge .Min .X ,_fdcge .Max .X =_feed ,_feed ;_fdcge .Min .Y ,_fdcge .Max .Y =_ega ,_ega ;var (_bcedg *fillSegment ;
|
|
_fegb int ;);for _eaabd .Len ()> 0{if _bcedg ,_gdgf =_edfd (_eaabd );_gdgf !=nil {return nil ,_d .Wrap (_gdgf ,_febf ,"");};_ega =_bcedg ._cbfa ;for _feed =_bcedg ._bcfd ;_feed >=0&&_cadba .GetPixel (_feed ,_ega );_feed --{if _gdgf =_cadba .SetPixel (_feed ,_ega ,0);
|
|
_gdgf !=nil {return nil ,_d .Wrap (_gdgf ,_febf ,"");};};if _feed >=_bcedg ._bcfd {for _feed ++;_feed <=_bcedg ._addb &&_feed <=_agaeb &&!_cadba .GetPixel (_feed ,_ega );_feed ++{};_fegb =_feed ;if !(_feed <=_bcedg ._addb &&_feed <=_agaeb ){continue ;};
|
|
}else {_fegb =_feed +1;if _fegb < _bcedg ._bcfd -1{if _gdgf =_bcdcb (_eaabd ,_fegb ,_bcedg ._bcfd -1,_bcedg ._cbfa ,-_bcedg ._ddaf ,_dabb ,_fdcge );_gdgf !=nil {return nil ,_d .Wrap (_gdgf ,_febf ,"\u006c\u0065\u0061\u006b\u0020\u006f\u006e\u0020\u006c\u0065\u0066\u0074 \u0073\u0069\u0064\u0065");
|
|
};};_feed =_bcedg ._bcfd +1;};for {for ;_feed <=_agaeb &&_cadba .GetPixel (_feed ,_ega );_feed ++{if _gdgf =_cadba .SetPixel (_feed ,_ega ,0);_gdgf !=nil {return nil ,_d .Wrap (_gdgf ,_febf ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _gdgf =_bcdcb (_eaabd ,_fegb ,_feed -1,_bcedg ._cbfa ,_bcedg ._ddaf ,_dabb ,_fdcge );
|
|
_gdgf !=nil {return nil ,_d .Wrap (_gdgf ,_febf ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _feed > _bcedg ._addb +1{if _gdgf =_bcdcb (_eaabd ,_bcedg ._addb +1,_feed -1,_bcedg ._cbfa ,-_bcedg ._ddaf ,_dabb ,_fdcge );_gdgf !=nil {return nil ,_d .Wrap (_gdgf ,_febf ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");
|
|
};};for _feed ++;_feed <=_bcedg ._addb &&_feed <=_agaeb &&!_cadba .GetPixel (_feed ,_ega );_feed ++{};_fegb =_feed ;if !(_feed <=_bcedg ._addb &&_feed <=_agaeb ){break ;};};};_fdcge .Max .X ++;_fdcge .Max .Y ++;return _fdcge ,nil ;};type Selection struct{Height ,Width int ;
|
|
Cx ,Cy int ;Name string ;Data [][]SelectionValue ;};const (MopDilation MorphOperation =iota ;MopErosion ;MopOpening ;MopClosing ;MopRankBinaryReduction ;MopReplicativeBinaryExpansion ;MopAddBorder ;);func _bcbg (_bdaa ,_adeda int ,_fbgb string )*Selection {_fgbb :=&Selection {Height :_bdaa ,Width :_adeda ,Name :_fbgb };
|
|
_fgbb .Data =make ([][]SelectionValue ,_bdaa );for _ebcb :=0;_ebcb < _bdaa ;_ebcb ++{_fgbb .Data [_ebcb ]=make ([]SelectionValue ,_adeda );};return _fgbb ;};func _dcbc (_dece *Bitmap ,_aceg ,_ecea int ,_acce ,_fdadd int ,_ffac RasterOperator ){var (_ffbbg bool ;
|
|
_egg bool ;_ffbad int ;_caede int ;_feae int ;_bdbg int ;_gedff bool ;_gdeg byte ;);_cabfgg :=8-(_aceg &7);_addc :=_gefe [_cabfgg ];_eegde :=_dece .RowStride *_ecea +(_aceg >>3);if _acce < _cabfgg {_ffbbg =true ;_addc &=_afa [8-_cabfgg +_acce ];};if !_ffbbg {_ffbad =(_acce -_cabfgg )>>3;
|
|
if _ffbad !=0{_egg =true ;_caede =_eegde +1;};};_feae =(_aceg +_acce )&7;if !(_ffbbg ||_feae ==0){_gedff =true ;_gdeg =_afa [_feae ];_bdbg =_eegde +1+_ffbad ;};var _abeg ,_beag int ;switch _ffac {case PixClr :for _abeg =0;_abeg < _fdadd ;_abeg ++{_dece .Data [_eegde ]=_aagd (_dece .Data [_eegde ],0x0,_addc );
|
|
_eegde +=_dece .RowStride ;};if _egg {for _abeg =0;_abeg < _fdadd ;_abeg ++{for _beag =0;_beag < _ffbad ;_beag ++{_dece .Data [_caede +_beag ]=0x0;};_caede +=_dece .RowStride ;};};if _gedff {for _abeg =0;_abeg < _fdadd ;_abeg ++{_dece .Data [_bdbg ]=_aagd (_dece .Data [_bdbg ],0x0,_gdeg );
|
|
_bdbg +=_dece .RowStride ;};};case PixSet :for _abeg =0;_abeg < _fdadd ;_abeg ++{_dece .Data [_eegde ]=_aagd (_dece .Data [_eegde ],0xff,_addc );_eegde +=_dece .RowStride ;};if _egg {for _abeg =0;_abeg < _fdadd ;_abeg ++{for _beag =0;_beag < _ffbad ;_beag ++{_dece .Data [_caede +_beag ]=0xff;
|
|
};_caede +=_dece .RowStride ;};};if _gedff {for _abeg =0;_abeg < _fdadd ;_abeg ++{_dece .Data [_bdbg ]=_aagd (_dece .Data [_bdbg ],0xff,_gdeg );_bdbg +=_dece .RowStride ;};};case PixNotDst :for _abeg =0;_abeg < _fdadd ;_abeg ++{_dece .Data [_eegde ]=_aagd (_dece .Data [_eegde ],^_dece .Data [_eegde ],_addc );
|
|
_eegde +=_dece .RowStride ;};if _egg {for _abeg =0;_abeg < _fdadd ;_abeg ++{for _beag =0;_beag < _ffbad ;_beag ++{_dece .Data [_caede +_beag ]=^(_dece .Data [_caede +_beag ]);};_caede +=_dece .RowStride ;};};if _gedff {for _abeg =0;_abeg < _fdadd ;_abeg ++{_dece .Data [_bdbg ]=_aagd (_dece .Data [_bdbg ],^_dece .Data [_bdbg ],_gdeg );
|
|
_bdbg +=_dece .RowStride ;};};};};func (_dfd *Bitmap )addBorderGeneral (_aece ,_dgfd ,_bfcb ,_dec int ,_eba int )(*Bitmap ,error ){const _bgd ="\u0061\u0064d\u0042\u006f\u0072d\u0065\u0072\u0047\u0065\u006e\u0065\u0072\u0061\u006c";if _aece < 0||_dgfd < 0||_bfcb < 0||_dec < 0{return nil ,_d .Error (_bgd ,"n\u0065\u0067\u0061\u0074iv\u0065 \u0062\u006f\u0072\u0064\u0065r\u0020\u0061\u0064\u0064\u0065\u0064");
|
|
};_bgdg ,_dggg :=_dfd .Width ,_dfd .Height ;_cdcb :=_bgdg +_aece +_dgfd ;_dce :=_dggg +_bfcb +_dec ;_facd :=New (_cdcb ,_dce );_facd .Color =_dfd .Color ;_gcaa :=PixClr ;if _eba > 0{_gcaa =PixSet ;};_ccgd :=_facd .RasterOperation (0,0,_aece ,_dce ,_gcaa ,nil ,0,0);
|
|
if _ccgd !=nil {return nil ,_d .Wrap (_ccgd ,_bgd ,"\u006c\u0065\u0066\u0074");};_ccgd =_facd .RasterOperation (_cdcb -_dgfd ,0,_dgfd ,_dce ,_gcaa ,nil ,0,0);if _ccgd !=nil {return nil ,_d .Wrap (_ccgd ,_bgd ,"\u0072\u0069\u0067h\u0074");};_ccgd =_facd .RasterOperation (0,0,_cdcb ,_bfcb ,_gcaa ,nil ,0,0);
|
|
if _ccgd !=nil {return nil ,_d .Wrap (_ccgd ,_bgd ,"\u0074\u006f\u0070");};_ccgd =_facd .RasterOperation (0,_dce -_dec ,_cdcb ,_dec ,_gcaa ,nil ,0,0);if _ccgd !=nil {return nil ,_d .Wrap (_ccgd ,_bgd ,"\u0062\u006f\u0074\u0074\u006f\u006d");};_ccgd =_facd .RasterOperation (_aece ,_bfcb ,_bgdg ,_dggg ,PixSrc ,_dfd ,0,0);
|
|
if _ccgd !=nil {return nil ,_d .Wrap (_ccgd ,_bgd ,"\u0063\u006f\u0070\u0079");};return _facd ,nil ;};func (_cgeec *Bitmap )ConnComponents (bms *Bitmaps ,connectivity int )(_ceb *Boxes ,_ebcd error ){const _cgae ="B\u0069\u0074\u006d\u0061p.\u0043o\u006e\u006e\u0043\u006f\u006dp\u006f\u006e\u0065\u006e\u0074\u0073";
|
|
if _cgeec ==nil {return nil ,_d .Error (_cgae ,"\u0070r\u006f\u0076\u0069\u0064e\u0064\u0020\u0065\u006d\u0070t\u0079 \u0027b\u0027\u0020\u0062\u0069\u0074\u006d\u0061p");};if connectivity !=4&&connectivity !=8{return nil ,_d .Error (_cgae ,"\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 _ceb ,_ebcd =_cgeec .connComponentsBB (connectivity );_ebcd !=nil {return nil ,_d .Wrap (_ebcd ,_cgae ,"");};}else {if _ceb ,_ebcd =_cgeec .connComponentsBitmapsBB (bms ,connectivity );_ebcd !=nil {return nil ,_d .Wrap (_ebcd ,_cgae ,"");
|
|
};};return _ceb ,nil ;};func _ffga (_bf ,_cd *Bitmap )(_bg error ){const _ec ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0034";_gbg :=_cd .RowStride ;_dff :=_bf .RowStride ;_af :=_cd .RowStride *4-_bf .RowStride ;
|
|
var (_gc ,_dfg byte ;_ga uint32 ;_bae ,_eeg ,_eg ,_bd ,_fba ,_bb ,_dfc int ;);for _eg =0;_eg < _cd .Height ;_eg ++{_bae =_eg *_gbg ;_eeg =4*_eg *_dff ;for _bd =0;_bd < _gbg ;_bd ++{_gc =_cd .Data [_bae +_bd ];_ga =_dffd [_gc ];_bb =_eeg +_bd *4;if _af !=0&&(_bd +1)*4> _bf .RowStride {for _fba =_af ;
|
|
_fba > 0;_fba --{_dfg =byte ((_ga >>uint (_fba *8))&0xff);_dfc =_bb +(_af -_fba );if _bg =_bf .SetByte (_dfc ,_dfg );_bg !=nil {return _d .Wrapf (_bg ,_ec ,"D\u0069\u0066\u0066\u0065\u0072\u0065n\u0074\u0020\u0072\u006f\u0077\u0073\u0074\u0072\u0069d\u0065\u0073\u002e \u004b:\u0020\u0025\u0064",_fba );
|
|
};};}else if _bg =_bf .setFourBytes (_bb ,_ga );_bg !=nil {return _d .Wrap (_bg ,_ec ,"");};if _bg =_bf .setFourBytes (_eeg +_bd *4,_dffd [_cd .Data [_bae +_bd ]]);_bg !=nil {return _d .Wrap (_bg ,_ec ,"");};};for _fba =1;_fba < 4;_fba ++{for _bd =0;_bd < _dff ;
|
|
_bd ++{if _bg =_bf .SetByte (_eeg +_fba *_dff +_bd ,_bf .Data [_eeg +_bd ]);_bg !=nil {return _d .Wrapf (_bg ,_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",_fba ,_bd );
|
|
};};};};return nil ;};func (_aca *Bitmap )GetVanillaData ()[]byte {if _aca .Color ==Chocolate {_aca .inverseData ();};return _aca .Data ;};func (_faag *Bitmap )RemoveBorder (borderSize int )(*Bitmap ,error ){if borderSize ==0{return _faag .Copy (),nil ;
|
|
};_geg ,_fggb :=_faag .removeBorderGeneral (borderSize ,borderSize ,borderSize ,borderSize );if _fggb !=nil {return nil ,_d .Wrap (_fggb ,"\u0052\u0065\u006do\u0076\u0065\u0042\u006f\u0072\u0064\u0065\u0072","");};return _geg ,nil ;};func (_feg *Boxes )selectWithIndicator (_abb *_g .NumSlice )(_bdcc *Boxes ,_bfbd error ){const _fecc ="\u0042o\u0078\u0065\u0073\u002es\u0065\u006c\u0065\u0063\u0074W\u0069t\u0068I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";
|
|
if _feg ==nil {return nil ,_d .Error (_fecc ,"b\u006f\u0078\u0065\u0073 '\u0062'\u0020\u006e\u006f\u0074\u0020d\u0065\u0066\u0069\u006e\u0065\u0064");};if _abb ==nil {return nil ,_d .Error (_fecc ,"\u0027\u006ea\u0027\u0020\u006eo\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};if len (*_abb )!=len (*_feg ){return nil ,_d .Error (_fecc ,"\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 _gbeed ,_dfcd int ;for _deed :=0;_deed < len (*_abb );_deed ++{if _gbeed ,_bfbd =_abb .GetInt (_deed );_bfbd !=nil {return nil ,_d .Wrap (_bfbd ,_fecc ,"\u0063\u0068\u0065\u0063\u006b\u0069\u006e\u0067\u0020c\u006f\u0075\u006e\u0074");};if _gbeed ==1{_dfcd ++;
|
|
};};if _dfcd ==len (*_feg ){return _feg ,nil ;};_eafe :=Boxes {};for _dbcg :=0;_dbcg < len (*_abb );_dbcg ++{_gbeed =int ((*_abb )[_dbcg ]);if _gbeed ==0{continue ;};_eafe =append (_eafe ,(*_feg )[_dbcg ]);};_bdcc =&_eafe ;return _bdcc ,nil ;};func (_abgf *ClassedPoints )GroupByY ()([]*ClassedPoints ,error ){const _bebfd ="\u0043\u006c\u0061\u0073se\u0064\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0072\u006f\u0075\u0070\u0042y\u0059";
|
|
if _afdd :=_abgf .validateIntSlice ();_afdd !=nil {return nil ,_d .Wrap (_afdd ,_bebfd ,"");};if _abgf .IntSlice .Size ()==0{return nil ,_d .Error (_bebfd ,"\u004e\u006f\u0020\u0063la\u0073\u0073\u0065\u0073\u0020\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064");
|
|
};_abgf .SortByY ();var (_gfde []*ClassedPoints ;_adf int ;);_cefa :=-1;var _cbec *ClassedPoints ;for _cgffc :=0;_cgffc < len (_abgf .IntSlice );_cgffc ++{_adf =int (_abgf .YAtIndex (_cgffc ));if _adf !=_cefa {_cbec =&ClassedPoints {Points :_abgf .Points };
|
|
_cefa =_adf ;_gfde =append (_gfde ,_cbec );};_cbec .IntSlice =append (_cbec .IntSlice ,_abgf .IntSlice [_cgffc ]);};for _ ,_bccbf :=range _gfde {_bccbf .SortByX ();};return _gfde ,nil ;};func (_affd *Points )Add (pt *Points )error {const _abffg ="\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0041\u0064\u0064";
|
|
if _affd ==nil {return _d .Error (_abffg ,"\u0070o\u0069n\u0074\u0073\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if pt ==nil {return _d .Error (_abffg ,"a\u0072\u0067\u0075\u006d\u0065\u006et\u0020\u0070\u006f\u0069\u006e\u0074\u0073\u0020\u006eo\u0074\u0020\u0064e\u0066i\u006e\u0065\u0064");
|
|
};*_affd =append (*_affd ,*pt ...);return nil ;};func _aaa (_bdaff ,_ffdg ,_dcba *Bitmap )(*Bitmap ,error ){const _aagc ="\u0062\u0069\u0074\u006d\u0061\u0070\u002e\u0078\u006f\u0072";if _ffdg ==nil {return nil ,_d .Error (_aagc ,"'\u0062\u0031\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");
|
|
};if _dcba ==nil {return nil ,_d .Error (_aagc ,"'\u0062\u0032\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _bdaff ==_dcba {return nil ,_d .Error (_aagc ,"'\u0064\u0027\u0020\u003d\u003d\u0020\u0027\u0062\u0032\u0027");};if !_ffdg .SizesEqual (_dcba ){_gb .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",_aagc );
|
|
};var _gcff error ;if _bdaff ,_gcff =_eebad (_bdaff ,_ffdg );_gcff !=nil {return nil ,_d .Wrap (_gcff ,_aagc ,"\u0063\u0061n\u0027\u0074\u0020c\u0072\u0065\u0061\u0074\u0065\u0020\u0027\u0064\u0027");};if _gcff =_bdaff .RasterOperation (0,0,_bdaff .Width ,_bdaff .Height ,PixSrcXorDst ,_dcba ,0,0);
|
|
_gcff !=nil {return nil ,_d .Wrap (_gcff ,_aagc ,"");};return _bdaff ,nil ;};func _aecdc (_aad uint ,_bcdf byte )byte {return _bcdf >>_aad <<_aad };func (_edg *Bitmap )Equals (s *Bitmap )bool {if len (_edg .Data )!=len (s .Data )||_edg .Width !=s .Width ||_edg .Height !=s .Height {return false ;
|
|
};for _cbbc :=0;_cbbc < _edg .Height ;_cbbc ++{_aae :=_cbbc *_edg .RowStride ;for _cdc :=0;_cdc < _edg .RowStride ;_cdc ++{if _edg .Data [_aae +_cdc ]!=s .Data [_aae +_cdc ]{return false ;};};};return true ;};func _egbcb (_cgfd *Bitmap ,_abgc *_g .Stack ,_fede ,_bfbbb ,_fbga int )(_ecdg *_ba .Rectangle ,_ffbbd error ){const _fgedd ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";
|
|
if _cgfd ==nil {return nil ,_d .Error (_fgedd ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");};if _abgc ==nil {return nil ,_d .Error (_fgedd ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");
|
|
};switch _fbga {case 4:if _ecdg ,_ffbbd =_fdgb (_cgfd ,_abgc ,_fede ,_bfbbb );_ffbbd !=nil {return nil ,_d .Wrap (_ffbbd ,_fgedd ,"");};return _ecdg ,nil ;case 8:if _ecdg ,_ffbbd =_gace (_cgfd ,_abgc ,_fede ,_bfbbb );_ffbbd !=nil {return nil ,_d .Wrap (_ffbbd ,_fgedd ,"");
|
|
};return _ecdg ,nil ;default:return nil ,_d .Errorf (_fgedd ,"\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",_fbga );
|
|
};};func (_dcag *Bitmap )inverseData (){if _edea :=_dcag .RasterOperation (0,0,_dcag .Width ,_dcag .Height ,PixNotDst ,nil ,0,0);_edea !=nil {_gb .Log .Debug ("\u0049n\u0076\u0065\u0072\u0073e\u0020\u0064\u0061\u0074\u0061 \u0066a\u0069l\u0065\u0064\u003a\u0020\u0027\u0025\u0076'",_edea );
|
|
};if _dcag .Color ==Chocolate {_dcag .Color =Vanilla ;}else {_dcag .Color =Chocolate ;};};const (_ LocationFilter =iota ;LocSelectWidth ;LocSelectHeight ;LocSelectXVal ;LocSelectYVal ;LocSelectIfEither ;LocSelectIfBoth ;);func _ag ()(_gfd [256]uint32 ){for _fg :=0;
|
|
_fg < 256;_fg ++{if _fg &0x01!=0{_gfd [_fg ]|=0xf;};if _fg &0x02!=0{_gfd [_fg ]|=0xf0;};if _fg &0x04!=0{_gfd [_fg ]|=0xf00;};if _fg &0x08!=0{_gfd [_fg ]|=0xf000;};if _fg &0x10!=0{_gfd [_fg ]|=0xf0000;};if _fg &0x20!=0{_gfd [_fg ]|=0xf00000;};if _fg &0x40!=0{_gfd [_fg ]|=0xf000000;
|
|
};if _fg &0x80!=0{_gfd [_fg ]|=0xf0000000;};};return _gfd ;};func TstTSymbol (t *_e .T ,scale ...int )*Bitmap {_cacc ,_bfbge :=NewWithData (5,5,[]byte {0xF8,0x20,0x20,0x20,0x20});_df .NoError (t ,_bfbge );return TstGetScaledSymbol (t ,_cacc ,scale ...);
|
|
};func (_fdfg *Bitmap )GetChocolateData ()[]byte {if _fdfg .Color ==Vanilla {_fdfg .inverseData ();};return _fdfg .Data ;};func (_bgcab *BitmapsArray )GetBitmaps (i int )(*Bitmaps ,error ){const _dcgd ="\u0042\u0069\u0074ma\u0070\u0073\u0041\u0072\u0072\u0061\u0079\u002e\u0047\u0065\u0074\u0042\u0069\u0074\u006d\u0061\u0070\u0073";
|
|
if _bgcab ==nil {return nil ,_d .Error (_dcgd ,"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 (_bgcab .Values )-1{return nil ,_d .Errorf (_dcgd ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
};return _bgcab .Values [i ],nil ;};func TstAddSymbol (t *_e .T ,bms *Bitmaps ,sym *Bitmap ,x *int ,y int ,space int ){bms .AddBitmap (sym );_fgag :=_ba .Rect (*x ,y ,*x +sym .Width ,y +sym .Height );bms .AddBox (&_fgag );*x +=sym .Width +space ;};type Bitmap struct{Width ,Height int ;
|
|
BitmapNumber int ;RowStride int ;Data []byte ;Color Color ;Special int ;Text string ;XResolution ,YResolution int ;};func RankHausTest (p1 ,p2 ,p3 ,p4 *Bitmap ,delX ,delY float32 ,maxDiffW ,maxDiffH ,area1 ,area3 int ,rank float32 ,tab8 []int )(_bagb bool ,_efca error ){const _ddeb ="\u0052\u0061\u006ek\u0048\u0061\u0075\u0073\u0054\u0065\u0073\u0074";
|
|
_gdabb ,_bbcb :=p1 .Width ,p1 .Height ;_cegb ,_dcfad :=p3 .Width ,p3 .Height ;if _g .Abs (_gdabb -_cegb )> maxDiffW {return false ,nil ;};if _g .Abs (_bbcb -_dcfad )> maxDiffH {return false ,nil ;};_agfg :=int (float32 (area1 )*(1.0-rank )+0.5);_gegf :=int (float32 (area3 )*(1.0-rank )+0.5);
|
|
var _cdddb ,_ebba int ;if delX >=0{_cdddb =int (delX +0.5);}else {_cdddb =int (delX -0.5);};if delY >=0{_ebba =int (delY +0.5);}else {_ebba =int (delY -0.5);};_dbgc :=p1 .CreateTemplate ();if _efca =_dbgc .RasterOperation (0,0,_gdabb ,_bbcb ,PixSrc ,p1 ,0,0);
|
|
_efca !=nil {return false ,_d .Wrap (_efca ,_ddeb ,"p\u0031\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _efca =_dbgc .RasterOperation (_cdddb ,_ebba ,_gdabb ,_bbcb ,PixNotSrcAndDst ,p4 ,0,0);_efca !=nil {return false ,_d .Wrap (_efca ,_ddeb ,"\u0074 \u0026\u0020\u0021\u0070\u0034");
|
|
};_bagb ,_efca =_dbgc .ThresholdPixelSum (_agfg ,tab8 );if _efca !=nil {return false ,_d .Wrap (_efca ,_ddeb ,"\u0074\u002d\u003e\u0074\u0068\u0072\u0065\u0073\u0068\u0031");};if _bagb {return false ,nil ;};if _efca =_dbgc .RasterOperation (_cdddb ,_ebba ,_cegb ,_dcfad ,PixSrc ,p3 ,0,0);
|
|
_efca !=nil {return false ,_d .Wrap (_efca ,_ddeb ,"p\u0033\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _efca =_dbgc .RasterOperation (0,0,_cegb ,_dcfad ,PixNotSrcAndDst ,p2 ,0,0);_efca !=nil {return false ,_d .Wrap (_efca ,_ddeb ,"\u0074 \u0026\u0020\u0021\u0070\u0032");
|
|
};_bagb ,_efca =_dbgc .ThresholdPixelSum (_gegf ,tab8 );if _efca !=nil {return false ,_d .Wrap (_efca ,_ddeb ,"\u0074\u002d\u003e\u0074\u0068\u0072\u0065\u0073\u0068\u0033");};return !_bagb ,nil ;};func TstRSymbol (t *_e .T ,scale ...int )*Bitmap {_agdc ,_caece :=NewWithData (4,5,[]byte {0xF0,0x90,0xF0,0xA0,0x90});
|
|
_df .NoError (t ,_caece );return TstGetScaledSymbol (t ,_agdc ,scale ...);};func TstESymbol (t *_e .T ,scale ...int )*Bitmap {_abfb ,_gfge :=NewWithData (4,5,[]byte {0xF0,0x80,0xE0,0x80,0xF0});_df .NoError (t ,_gfge );return TstGetScaledSymbol (t ,_abfb ,scale ...);
|
|
};func (_eebe *byHeight )Swap (i ,j int ){_eebe .Values [i ],_eebe .Values [j ]=_eebe .Values [j ],_eebe .Values [i ];if _eebe .Boxes !=nil {_eebe .Boxes [i ],_eebe .Boxes [j ]=_eebe .Boxes [j ],_eebe .Boxes [i ];};};func (_cffc *Bitmaps )AddBox (box *_ba .Rectangle ){_cffc .Boxes =append (_cffc .Boxes ,box )};
|
|
func (_edb *Bitmap )countPixels ()int {var (_gaca int ;_afc uint8 ;_fbge byte ;_gccc int ;);_agf :=_edb .RowStride ;_gbf :=uint (_edb .Width &0x07);if _gbf !=0{_afc =uint8 ((0xff<<(8-_gbf ))&0xff);_agf --;};for _caec :=0;_caec < _edb .Height ;_caec ++{for _gccc =0;
|
|
_gccc < _agf ;_gccc ++{_fbge =_edb .Data [_caec *_edb .RowStride +_gccc ];_gaca +=int (_bgca [_fbge ]);};if _gbf !=0{_gaca +=int (_bgca [_edb .Data [_caec *_edb .RowStride +_gccc ]&_afc ]);};};return _gaca ;};const (SelDontCare SelectionValue =iota ;SelHit ;
|
|
SelMiss ;);func MakePixelCentroidTab8 ()[]int {return _afbf ()};func (_eced *ClassedPoints )SortByY (){_eced ._edaag =_eced .ySortFunction ();_b .Sort (_eced )};func _eccab (_dccgc *Bitmap ,_cdbba int )(*Bitmap ,error ){const _fcda ="\u0065x\u0070a\u006e\u0064\u0052\u0065\u0070\u006c\u0069\u0063\u0061\u0074\u0065";
|
|
if _dccgc ==nil {return nil ,_d .Error (_fcda ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _cdbba <=0{return nil ,_d .Error (_fcda ,"i\u006e\u0076\u0061\u006cid\u0020f\u0061\u0063\u0074\u006f\u0072 \u002d\u0020\u003c\u003d\u0020\u0030");
|
|
};if _cdbba ==1{_edeaa ,_geff :=_eebad (nil ,_dccgc );if _geff !=nil {return nil ,_d .Wrap (_geff ,_fcda ,"\u0066\u0061\u0063\u0074\u006f\u0072\u0020\u003d\u0020\u0031");};return _edeaa ,nil ;};_egfac ,_eacc :=_dcb (_dccgc ,_cdbba ,_cdbba );if _eacc !=nil {return nil ,_d .Wrap (_eacc ,_fcda ,"");
|
|
};return _egfac ,nil ;};type SizeComparison int ;func (_edgb *Bitmap )SetDefaultPixel (){for _cgf :=range _edgb .Data {_edgb .Data [_cgf ]=byte (0xff);};};func _bdefg (_ebag *Bitmap ,_gebea ,_dbad int ,_abcag ,_bebac int ,_ggefd RasterOperator ){var (_bcfg int ;
|
|
_babeb byte ;_ceee ,_gcfaf int ;_cecf int ;);_bdbf :=_abcag >>3;_decf :=_abcag &7;if _decf > 0{_babeb =_afa [_decf ];};_bcfg =_ebag .RowStride *_dbad +(_gebea >>3);switch _ggefd {case PixClr :for _ceee =0;_ceee < _bebac ;_ceee ++{_cecf =_bcfg +_ceee *_ebag .RowStride ;
|
|
for _gcfaf =0;_gcfaf < _bdbf ;_gcfaf ++{_ebag .Data [_cecf ]=0x0;_cecf ++;};if _decf > 0{_ebag .Data [_cecf ]=_aagd (_ebag .Data [_cecf ],0x0,_babeb );};};case PixSet :for _ceee =0;_ceee < _bebac ;_ceee ++{_cecf =_bcfg +_ceee *_ebag .RowStride ;for _gcfaf =0;
|
|
_gcfaf < _bdbf ;_gcfaf ++{_ebag .Data [_cecf ]=0xff;_cecf ++;};if _decf > 0{_ebag .Data [_cecf ]=_aagd (_ebag .Data [_cecf ],0xff,_babeb );};};case PixNotDst :for _ceee =0;_ceee < _bebac ;_ceee ++{_cecf =_bcfg +_ceee *_ebag .RowStride ;for _gcfaf =0;_gcfaf < _bdbf ;
|
|
_gcfaf ++{_ebag .Data [_cecf ]=^_ebag .Data [_cecf ];_cecf ++;};if _decf > 0{_ebag .Data [_cecf ]=_aagd (_ebag .Data [_cecf ],^_ebag .Data [_cecf ],_babeb );};};};};func (_bfef *Bitmap )Zero ()bool {_gbcd :=_bfef .Width /8;_cfc :=_bfef .Width &7;var _cbe byte ;
|
|
if _cfc !=0{_cbe =byte (0xff<<uint (8-_cfc ));};var _bdaf ,_cgea ,_bfdb int ;for _cgea =0;_cgea < _bfef .Height ;_cgea ++{_bdaf =_bfef .RowStride *_cgea ;for _bfdb =0;_bfdb < _gbcd ;_bfdb ,_bdaf =_bfdb +1,_bdaf +1{if _bfef .Data [_bdaf ]!=0{return false ;
|
|
};};if _cfc > 0{if _bfef .Data [_bdaf ]&_cbe !=0{return false ;};};};return true ;};func Centroid (bm *Bitmap ,centTab ,sumTab []int )(Point ,error ){return bm .centroid (centTab ,sumTab )};var _fbfga =[5]int {1,2,3,0,4};func (_deg *Bitmap )Copy ()*Bitmap {_cdbb :=make ([]byte ,len (_deg .Data ));
|
|
copy (_cdbb ,_deg .Data );return &Bitmap {Width :_deg .Width ,Height :_deg .Height ,RowStride :_deg .RowStride ,Data :_cdbb ,Color :_deg .Color ,Text :_deg .Text ,BitmapNumber :_deg .BitmapNumber ,Special :_deg .Special };};func _acb (_feb ,_bagad *Bitmap ,_egde *Selection )(*Bitmap ,error ){const _ffed ="c\u006c\u006f\u0073\u0065\u0042\u0069\u0074\u006d\u0061\u0070";
|
|
var _bddee error ;if _feb ,_bddee =_gdc (_feb ,_bagad ,_egde );_bddee !=nil {return nil ,_bddee ;};_fgee ,_bddee :=_bced (nil ,_bagad ,_egde );if _bddee !=nil {return nil ,_d .Wrap (_bddee ,_ffed ,"");};if _ ,_bddee =_afbbf (_feb ,_fgee ,_egde );_bddee !=nil {return nil ,_d .Wrap (_bddee ,_ffed ,"");
|
|
};return _feb ,nil ;};func TstPSymbol (t *_e .T )*Bitmap {t .Helper ();_acf :=New (5,8);_df .NoError (t ,_acf .SetPixel (0,0,1));_df .NoError (t ,_acf .SetPixel (1,0,1));_df .NoError (t ,_acf .SetPixel (2,0,1));_df .NoError (t ,_acf .SetPixel (3,0,1));
|
|
_df .NoError (t ,_acf .SetPixel (4,1,1));_df .NoError (t ,_acf .SetPixel (0,1,1));_df .NoError (t ,_acf .SetPixel (4,2,1));_df .NoError (t ,_acf .SetPixel (0,2,1));_df .NoError (t ,_acf .SetPixel (4,3,1));_df .NoError (t ,_acf .SetPixel (0,3,1));_df .NoError (t ,_acf .SetPixel (0,4,1));
|
|
_df .NoError (t ,_acf .SetPixel (1,4,1));_df .NoError (t ,_acf .SetPixel (2,4,1));_df .NoError (t ,_acf .SetPixel (3,4,1));_df .NoError (t ,_acf .SetPixel (0,5,1));_df .NoError (t ,_acf .SetPixel (0,6,1));_df .NoError (t ,_acf .SetPixel (0,7,1));return _acf ;
|
|
};func (_cdcbg *Points )AddPoint (x ,y float32 ){*_cdcbg =append (*_cdcbg ,Point {x ,y })};func _afbf ()[]int {_edag :=make ([]int ,256);_edag [0]=0;_edag [1]=7;var _daea int ;for _daea =2;_daea < 4;_daea ++{_edag [_daea ]=_edag [_daea -2]+6;};for _daea =4;
|
|
_daea < 8;_daea ++{_edag [_daea ]=_edag [_daea -4]+5;};for _daea =8;_daea < 16;_daea ++{_edag [_daea ]=_edag [_daea -8]+4;};for _daea =16;_daea < 32;_daea ++{_edag [_daea ]=_edag [_daea -16]+3;};for _daea =32;_daea < 64;_daea ++{_edag [_daea ]=_edag [_daea -32]+2;
|
|
};for _daea =64;_daea < 128;_daea ++{_edag [_daea ]=_edag [_daea -64]+1;};for _daea =128;_daea < 256;_daea ++{_edag [_daea ]=_edag [_daea -128];};return _edag ;};func (_dbf *Bitmap )resizeImageData (_aafc *Bitmap )error {if _aafc ==nil {return _d .Error ("\u0072e\u0073i\u007a\u0065\u0049\u006d\u0061\u0067\u0065\u0044\u0061\u0074\u0061","\u0073r\u0063 \u0069\u0073\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if _dbf .SizesEqual (_aafc ){return nil ;};_dbf .Data =make ([]byte ,len (_aafc .Data ));_dbf .Width =_aafc .Width ;_dbf .Height =_aafc .Height ;_dbf .RowStride =_aafc .RowStride ;return nil ;};func (_afggf *ClassedPoints )ySortFunction ()func (_bgbb int ,_bbbef int )bool {return func (_dade ,_fffb int )bool {return _afggf .YAtIndex (_dade )< _afggf .YAtIndex (_fffb )};
|
|
};func (_dceb *Boxes )makeSizeIndicator (_dace ,_degd int ,_bdcb LocationFilter ,_bcgg SizeComparison )*_g .NumSlice {_adca :=&_g .NumSlice {};var _acca ,_afbb ,_cfa int ;for _ ,_aefg :=range *_dceb {_acca =0;_afbb ,_cfa =_aefg .Dx (),_aefg .Dy ();switch _bdcb {case LocSelectWidth :if (_bcgg ==SizeSelectIfLT &&_afbb < _dace )||(_bcgg ==SizeSelectIfGT &&_afbb > _dace )||(_bcgg ==SizeSelectIfLTE &&_afbb <=_dace )||(_bcgg ==SizeSelectIfGTE &&_afbb >=_dace ){_acca =1;
|
|
};case LocSelectHeight :if (_bcgg ==SizeSelectIfLT &&_cfa < _degd )||(_bcgg ==SizeSelectIfGT &&_cfa > _degd )||(_bcgg ==SizeSelectIfLTE &&_cfa <=_degd )||(_bcgg ==SizeSelectIfGTE &&_cfa >=_degd ){_acca =1;};case LocSelectIfEither :if (_bcgg ==SizeSelectIfLT &&(_cfa < _degd ||_afbb < _dace ))||(_bcgg ==SizeSelectIfGT &&(_cfa > _degd ||_afbb > _dace ))||(_bcgg ==SizeSelectIfLTE &&(_cfa <=_degd ||_afbb <=_dace ))||(_bcgg ==SizeSelectIfGTE &&(_cfa >=_degd ||_afbb >=_dace )){_acca =1;
|
|
};case LocSelectIfBoth :if (_bcgg ==SizeSelectIfLT &&(_cfa < _degd &&_afbb < _dace ))||(_bcgg ==SizeSelectIfGT &&(_cfa > _degd &&_afbb > _dace ))||(_bcgg ==SizeSelectIfLTE &&(_cfa <=_degd &&_afbb <=_dace ))||(_bcgg ==SizeSelectIfGTE &&(_cfa >=_degd &&_afbb >=_dace )){_acca =1;
|
|
};};_adca .AddInt (_acca );};return _adca ;};var (_afa =[]byte {0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF};_gefe =[]byte {0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};);func (_ffbaf *Selection )findMaxTranslations ()(_bdbbb ,_accba ,_gbga ,_daad int ){for _gdaga :=0;
|
|
_gdaga < _ffbaf .Height ;_gdaga ++{for _gbcb :=0;_gbcb < _ffbaf .Width ;_gbcb ++{if _ffbaf .Data [_gdaga ][_gbcb ]==SelHit {_bdbbb =_bbb (_bdbbb ,_ffbaf .Cx -_gbcb );_accba =_bbb (_accba ,_ffbaf .Cy -_gdaga );_gbga =_bbb (_gbga ,_gbcb -_ffbaf .Cx );_daad =_bbb (_daad ,_gdaga -_ffbaf .Cy );
|
|
};};};return _bdbbb ,_accba ,_gbga ,_daad ;};func (_feaec *Bitmaps )AddBitmap (bm *Bitmap ){_feaec .Values =append (_feaec .Values ,bm )};func (_agcc *Bitmaps )Size ()int {return len (_agcc .Values )};func (_gfg *Bitmap )String ()string {var _gaag ="\u000a";
|
|
for _cbd :=0;_cbd < _gfg .Height ;_cbd ++{var _cba string ;for _ffd :=0;_ffd < _gfg .Width ;_ffd ++{_cfb :=_gfg .GetPixel (_ffd ,_cbd );if _cfb {_cba +="\u0031";}else {_cba +="\u0030";};};_gaag +=_cba +"\u000a";};return _gaag ;};func (_ebbc *byWidth )Len ()int {return len (_ebbc .Values )};
|
|
func (_adgg *byHeight )Len ()int {return len (_adgg .Values )};func _fggc (_cgcg ,_fgeeb *Bitmap ,_fged ,_fbd int )(_agca error ){const _afcc ="\u0073e\u0065d\u0066\u0069\u006c\u006c\u0042i\u006e\u0061r\u0079\u004c\u006f\u0077\u0038";var (_gcbee ,_bcgf ,_gdac ,_effd int ;
|
|
_fag ,_bgbg ,_fbgc ,_abddb ,_gefb ,_fbcg ,_bfbb ,_abcfd byte ;);for _gcbee =0;_gcbee < _fged ;_gcbee ++{_gdac =_gcbee *_cgcg .RowStride ;_effd =_gcbee *_fgeeb .RowStride ;for _bcgf =0;_bcgf < _fbd ;_bcgf ++{if _fag ,_agca =_cgcg .GetByte (_gdac +_bcgf );
|
|
_agca !=nil {return _d .Wrap (_agca ,_afcc ,"\u0067e\u0074 \u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0062\u0079\u0074\u0065");};if _bgbg ,_agca =_fgeeb .GetByte (_effd +_bcgf );_agca !=nil {return _d .Wrap (_agca ,_afcc ,"\u0067\u0065\u0074\u0020\u006d\u0061\u0073\u006b\u0020\u0062\u0079\u0074\u0065");
|
|
};if _gcbee > 0{if _fbgc ,_agca =_cgcg .GetByte (_gdac -_cgcg .RowStride +_bcgf );_agca !=nil {return _d .Wrap (_agca ,_afcc ,"\u0069\u0020\u003e\u0020\u0030\u0020\u0062\u0079\u0074\u0065");};_fag |=_fbgc |(_fbgc <<1)|(_fbgc >>1);if _bcgf > 0{if _abcfd ,_agca =_cgcg .GetByte (_gdac -_cgcg .RowStride +_bcgf -1);
|
|
_agca !=nil {return _d .Wrap (_agca ,_afcc ,"\u0069\u0020\u003e\u00200 \u0026\u0026\u0020\u006a\u0020\u003e\u0020\u0030\u0020\u0062\u0079\u0074\u0065");};_fag |=_abcfd <<7;};if _bcgf < _fbd -1{if _abcfd ,_agca =_cgcg .GetByte (_gdac -_cgcg .RowStride +_bcgf +1);
|
|
_agca !=nil {return _d .Wrap (_agca ,_afcc ,"\u006a\u0020<\u0020\u0077\u0070l\u0020\u002d\u0020\u0031\u0020\u0062\u0079\u0074\u0065");};_fag |=_abcfd >>7;};};if _bcgf > 0{if _abddb ,_agca =_cgcg .GetByte (_gdac +_bcgf -1);_agca !=nil {return _d .Wrap (_agca ,_afcc ,"\u006a\u0020\u003e \u0030");
|
|
};_fag |=_abddb <<7;};_fag &=_bgbg ;if _fag ==0||^_fag ==0{if _agca =_cgcg .SetByte (_gdac +_bcgf ,_fag );_agca !=nil {return _d .Wrap (_agca ,_afcc ,"\u0073e\u0074t\u0069\u006e\u0067\u0020\u0065m\u0070\u0074y\u0020\u0062\u0079\u0074\u0065");};};for {_bfbb =_fag ;
|
|
_fag =(_fag |(_fag >>1)|(_fag <<1))&_bgbg ;if (_fag ^_bfbb )==0{if _agca =_cgcg .SetByte (_gdac +_bcgf ,_fag );_agca !=nil {return _d .Wrap (_agca ,_afcc ,"\u0073\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u0070\u0072\u0065\u0076 \u0062\u0079\u0074\u0065");
|
|
};break ;};};};};for _gcbee =_fged -1;_gcbee >=0;_gcbee --{_gdac =_gcbee *_cgcg .RowStride ;_effd =_gcbee *_fgeeb .RowStride ;for _bcgf =_fbd -1;_bcgf >=0;_bcgf --{if _fag ,_agca =_cgcg .GetByte (_gdac +_bcgf );_agca !=nil {return _d .Wrap (_agca ,_afcc ,"\u0072\u0065\u0076er\u0073\u0065\u0020\u0067\u0065\u0074\u0020\u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0062\u0079\u0074\u0065");
|
|
};if _bgbg ,_agca =_fgeeb .GetByte (_effd +_bcgf );_agca !=nil {return _d .Wrap (_agca ,_afcc ,"r\u0065\u0076\u0065\u0072se\u0020g\u0065\u0074\u0020\u006d\u0061s\u006b\u0020\u0062\u0079\u0074\u0065");};if _gcbee < _fged -1{if _gefb ,_agca =_cgcg .GetByte (_gdac +_cgcg .RowStride +_bcgf );
|
|
_agca !=nil {return _d .Wrap (_agca ,_afcc ,"\u0069\u0020\u003c\u0020h\u0020\u002d\u0020\u0031\u0020\u002d\u003e\u0020\u0067\u0065t\u0020s\u006f\u0075\u0072\u0063\u0065\u0020\u0062y\u0074\u0065");};_fag |=_gefb |(_gefb <<1)|_gefb >>1;if _bcgf > 0{if _abcfd ,_agca =_cgcg .GetByte (_gdac +_cgcg .RowStride +_bcgf -1);
|
|
_agca !=nil {return _d .Wrap (_agca ,_afcc ,"\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");};_fag |=_abcfd <<7;};if _bcgf < _fbd -1{if _abcfd ,_agca =_cgcg .GetByte (_gdac +_cgcg .RowStride +_bcgf +1);
|
|
_agca !=nil {return _d .Wrap (_agca ,_afcc ,"\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");
|
|
};_fag |=_abcfd >>7;};};if _bcgf < _fbd -1{if _fbcg ,_agca =_cgcg .GetByte (_gdac +_bcgf +1);_agca !=nil {return _d .Wrap (_agca ,_afcc ,"\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");
|
|
};_fag |=_fbcg >>7;};_fag &=_bgbg ;if _fag ==0||(^_fag )==0{if _agca =_cgcg .SetByte (_gdac +_bcgf ,_fag );_agca !=nil {return _d .Wrap (_agca ,_afcc ,"\u0073e\u0074 \u006d\u0061\u0073\u006b\u0065\u0064\u0020\u0062\u0079\u0074\u0065");};};for {_bfbb =_fag ;
|
|
_fag =(_fag |(_fag >>1)|(_fag <<1))&_bgbg ;if (_fag ^_bfbb )==0{if _agca =_cgcg .SetByte (_gdac +_bcgf ,_fag );_agca !=nil {return _d .Wrap (_agca ,_afcc ,"r\u0065\u0076\u0065\u0072se\u0020s\u0065\u0074\u0020\u0070\u0072e\u0076\u0020\u0062\u0079\u0074\u0065");
|
|
};break ;};};};};return nil ;};func (_ggeb *Bitmap )SetPadBits (value int ){_ggeb .setPadBits (value )};type shift int ;func (_dgc *Bitmaps )GetBitmap (i int )(*Bitmap ,error ){const _cfcgg ="\u0047e\u0074\u0042\u0069\u0074\u006d\u0061p";if _dgc ==nil {return nil ,_d .Error (_cfcgg ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0042\u0069\u0074ma\u0070\u0073");
|
|
};if i > len (_dgc .Values )-1{return nil ,_d .Errorf (_cfcgg ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return _dgc .Values [i ],nil ;};func _ddf (_ecac ,_dacg *Bitmap ,_ecbg ,_cgde ,_gccce ,_gddf ,_begd ,_edaf ,_dag ,_edab int ,_dcc CombinationOperator ,_gacb int )error {var _bffd int ;
|
|
_eeeg :=func (){_bffd ++;_gccce +=_dacg .RowStride ;_gddf +=_ecac .RowStride ;_begd +=_ecac .RowStride };for _bffd =_ecbg ;_bffd < _cgde ;_eeeg (){var _fcd uint16 ;_bafe :=_gccce ;for _bdef :=_gddf ;_bdef <=_begd ;_bdef ++{_dbede ,_beeb :=_dacg .GetByte (_bafe );
|
|
if _beeb !=nil {return _beeb ;};_eeaa ,_beeb :=_ecac .GetByte (_bdef );if _beeb !=nil {return _beeb ;};_fcd =(_fcd |(uint16 (_eeaa )&0xff))<<uint (_edab );_eeaa =byte (_fcd >>8);if _beeb =_dacg .SetByte (_bafe ,_ebbd (_dbede ,_eeaa ,_dcc ));_beeb !=nil {return _beeb ;
|
|
};_bafe ++;_fcd <<=uint (_dag );if _bdef ==_begd {_eeaa =byte (_fcd >>(8-uint8 (_edab )));if _gacb !=0{_eeaa =_aecdc (uint (8+_edaf ),_eeaa );};_dbede ,_beeb =_dacg .GetByte (_bafe );if _beeb !=nil {return _beeb ;};if _beeb =_dacg .SetByte (_bafe ,_ebbd (_dbede ,_eeaa ,_dcc ));
|
|
_beeb !=nil {return _beeb ;};};};};return nil ;};func (_ace *Bitmap )AddBorderGeneral (left ,right ,top ,bot int ,val int )(*Bitmap ,error ){return _ace .addBorderGeneral (left ,right ,top ,bot ,val );};func (_bddf *Bitmap )ThresholdPixelSum (thresh int ,tab8 []int )(_dgg bool ,_bcce error ){const _badc ="\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 =_bfcf ();};_cbda :=_bddf .Width >>3;_aec :=_bddf .Width &7;_eega :=byte (0xff<<uint (8-_aec ));var (_aggc ,_acg ,_cfbc ,_cfbd int ;_dad byte ;);for _aggc =0;_aggc < _bddf .Height ;_aggc ++{_cfbc =_bddf .RowStride *_aggc ;for _acg =0;
|
|
_acg < _cbda ;_acg ++{_dad ,_bcce =_bddf .GetByte (_cfbc +_acg );if _bcce !=nil {return false ,_d .Wrap (_bcce ,_badc ,"\u0066\u0075\u006c\u006c\u0042\u0079\u0074\u0065");};_cfbd +=tab8 [_dad ];};if _aec !=0{_dad ,_bcce =_bddf .GetByte (_cfbc +_acg );if _bcce !=nil {return false ,_d .Wrap (_bcce ,_badc ,"p\u0061\u0072\u0074\u0069\u0061\u006c\u0042\u0079\u0074\u0065");
|
|
};_dad &=_eega ;_cfbd +=tab8 [_dad ];};if _cfbd > thresh {return true ,nil ;};};return _dgg ,nil ;};func _bgga (_aabab *Bitmap ,_daba *Bitmap ,_bfbg int )(_fbaf error ){const _bcfbg ="\u0073\u0065\u0065\u0064\u0066\u0069\u006c\u006c\u0042\u0069\u006e\u0061r\u0079\u004c\u006f\u0077";
|
|
_eagga :=_aee (_aabab .Height ,_daba .Height );_bcee :=_aee (_aabab .RowStride ,_daba .RowStride );switch _bfbg {case 4:_fbaf =_fgab (_aabab ,_daba ,_eagga ,_bcee );case 8:_fbaf =_fggc (_aabab ,_daba ,_eagga ,_bcee );default:return _d .Errorf (_bcfbg ,"\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",_bfbg );
|
|
};if _fbaf !=nil {return _d .Wrap (_fbaf ,_bcfbg ,"");};return nil ;};func TstISymbol (t *_e .T ,scale ...int )*Bitmap {_ecafd ,_caba :=NewWithData (1,5,[]byte {0x80,0x80,0x80,0x80,0x80});_df .NoError (t ,_caba );return TstGetScaledSymbol (t ,_ecafd ,scale ...);
|
|
};func _cbb (_ac ,_gee *Bitmap ,_gad int ,_ef []byte ,_eeba int )(_fe error ){const _adc ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0031";var (_bdc ,_gg ,_baa ,_gff ,_cff ,_gaa ,_fbe ,_ade int ;
|
|
_eec ,_cee uint32 ;_eecd ,_gab byte ;_cdf uint16 ;);_dcf :=make ([]byte ,4);_baga :=make ([]byte ,4);for _baa =0;_baa < _ac .Height -1;_baa ,_gff =_baa +2,_gff +1{_bdc =_baa *_ac .RowStride ;_gg =_gff *_gee .RowStride ;for _cff ,_gaa =0,0;_cff < _eeba ;
|
|
_cff ,_gaa =_cff +4,_gaa +1{for _fbe =0;_fbe < 4;_fbe ++{_ade =_bdc +_cff +_fbe ;if _ade <=len (_ac .Data )-1&&_ade < _bdc +_ac .RowStride {_dcf [_fbe ]=_ac .Data [_ade ];}else {_dcf [_fbe ]=0x00;};_ade =_bdc +_ac .RowStride +_cff +_fbe ;if _ade <=len (_ac .Data )-1&&_ade < _bdc +(2*_ac .RowStride ){_baga [_fbe ]=_ac .Data [_ade ];
|
|
}else {_baga [_fbe ]=0x00;};};_eec =_ff .BigEndian .Uint32 (_dcf );_cee =_ff .BigEndian .Uint32 (_baga );_cee |=_eec ;_cee |=_cee <<1;_cee &=0xaaaaaaaa;_eec =_cee |(_cee <<7);_eecd =byte (_eec >>24);_gab =byte ((_eec >>8)&0xff);_ade =_gg +_gaa ;if _ade +1==len (_gee .Data )-1||_ade +1>=_gg +_gee .RowStride {_gee .Data [_ade ]=_ef [_eecd ];
|
|
}else {_cdf =(uint16 (_ef [_eecd ])<<8)|uint16 (_ef [_gab ]);if _fe =_gee .setTwoBytes (_ade ,_cdf );_fe !=nil {return _d .Wrapf (_fe ,_adc ,"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",_ade );
|
|
};_gaa ++;};};};return nil ;};func (_dbbc *Bitmap )setEightBytes (_bebg int ,_gbcf uint64 )error {_dfcb :=_dbbc .RowStride -(_bebg %_dbbc .RowStride );if _dbbc .RowStride !=_dbbc .Width >>3{_dfcb --;};if _dfcb >=8{return _dbbc .setEightFullBytes (_bebg ,_gbcf );
|
|
};return _dbbc .setEightPartlyBytes (_bebg ,_dfcb ,_gbcf );};func TstFrameBitmapData ()[]byte {return _afce .Data };func New (width ,height int )*Bitmap {_gdaa :=_egd (width ,height );_gdaa .Data =make ([]byte ,height *_gdaa .RowStride );return _gdaa ;
|
|
};type Point struct{X ,Y float32 ;};func (_dggd Points )YSorter ()func (_bdac ,_ggd int )bool {return func (_ffcf ,_afdee int )bool {return _dggd [_ffcf ].Y < _dggd [_afdee ].Y };};var _ddad =[]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 _geebe (_efde ,_dcdf *Bitmap ,_babe ,_faac int )(*Bitmap ,error ){const _bceb ="d\u0069\u006c\u0061\u0074\u0065\u0042\u0072\u0069\u0063\u006b";if _dcdf ==nil {_gb .Log .Debug ("\u0064\u0069\u006c\u0061\u0074\u0065\u0042\u0072\u0069\u0063k\u0020\u0073\u006f\u0075\u0072\u0063\u0065 \u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
return nil ,_d .Error (_bceb ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};if _babe < 1||_faac < 1{return nil ,_d .Error (_bceb ,"\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 _babe ==1&&_faac ==1{_cffg ,_bcec :=_eebad (_efde ,_dcdf );if _bcec !=nil {return nil ,_d .Wrap (_bcec ,_bceb ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u0026\u0026 \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _cffg ,nil ;};if _babe ==1||_faac ==1{_fcdf :=SelCreateBrick (_faac ,_babe ,_faac /2,_babe /2,SelHit );_gedb ,_gcba :=_bced (_efde ,_dcdf ,_fcdf );if _gcba !=nil {return nil ,_d .Wrap (_gcba ,_bceb ,"\u0068s\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _gedb ,nil ;};_dfcbf :=SelCreateBrick (1,_babe ,0,_babe /2,SelHit );_aedg :=SelCreateBrick (_faac ,1,_faac /2,0,SelHit );_bdfcc ,_ddef :=_bced (nil ,_dcdf ,_dfcbf );if _ddef !=nil {return nil ,_d .Wrap (_ddef ,_bceb ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
};_efde ,_ddef =_bced (_efde ,_bdfcc ,_aedg );if _ddef !=nil {return nil ,_d .Wrap (_ddef ,_bceb ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};return _efde ,nil ;};func (_gdbgf *Bitmap )SizesEqual (s *Bitmap )bool {if _gdbgf ==s {return true ;
|
|
};if _gdbgf .Width !=s .Width ||_gdbgf .Height !=s .Height {return false ;};return true ;};func _bgcf (_fce ,_adea *Bitmap ,_bagag int ,_bee []byte ,_bdce int )(_bagc error ){const _gecb ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0034";
|
|
var (_aea ,_gba ,_afb ,_cdd ,_fcg ,_cdfc ,_fdf ,_abcf int ;_gbag ,_gbc uint32 ;_egba ,_dbed byte ;_ccd uint16 ;);_dacf :=make ([]byte ,4);_cca :=make ([]byte ,4);for _afb =0;_afb < _fce .Height -1;_afb ,_cdd =_afb +2,_cdd +1{_aea =_afb *_fce .RowStride ;
|
|
_gba =_cdd *_adea .RowStride ;for _fcg ,_cdfc =0,0;_fcg < _bdce ;_fcg ,_cdfc =_fcg +4,_cdfc +1{for _fdf =0;_fdf < 4;_fdf ++{_abcf =_aea +_fcg +_fdf ;if _abcf <=len (_fce .Data )-1&&_abcf < _aea +_fce .RowStride {_dacf [_fdf ]=_fce .Data [_abcf ];}else {_dacf [_fdf ]=0x00;
|
|
};_abcf =_aea +_fce .RowStride +_fcg +_fdf ;if _abcf <=len (_fce .Data )-1&&_abcf < _aea +(2*_fce .RowStride ){_cca [_fdf ]=_fce .Data [_abcf ];}else {_cca [_fdf ]=0x00;};};_gbag =_ff .BigEndian .Uint32 (_dacf );_gbc =_ff .BigEndian .Uint32 (_cca );_gbc &=_gbag ;
|
|
_gbc &=_gbc <<1;_gbc &=0xaaaaaaaa;_gbag =_gbc |(_gbc <<7);_egba =byte (_gbag >>24);_dbed =byte ((_gbag >>8)&0xff);_abcf =_gba +_cdfc ;if _abcf +1==len (_adea .Data )-1||_abcf +1>=_gba +_adea .RowStride {_adea .Data [_abcf ]=_bee [_egba ];if _bagc =_adea .SetByte (_abcf ,_bee [_egba ]);
|
|
_bagc !=nil {return _d .Wrapf (_bagc ,_gecb ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_abcf );};}else {_ccd =(uint16 (_bee [_egba ])<<8)|uint16 (_bee [_dbed ]);if _bagc =_adea .setTwoBytes (_abcf ,_ccd );_bagc !=nil {return _d .Wrapf (_bagc ,_gecb ,"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",_abcf );
|
|
};_cdfc ++;};};};return nil ;};func (_gbbe *Bitmap )thresholdPixelSum (_eabe int )bool {var (_fcf int ;_dbc uint8 ;_fggbb byte ;_egfa int ;);_ebc :=_gbbe .RowStride ;_abd :=uint (_gbbe .Width &0x07);if _abd !=0{_dbc =uint8 ((0xff<<(8-_abd ))&0xff);_ebc --;
|
|
};for _gfeg :=0;_gfeg < _gbbe .Height ;_gfeg ++{for _egfa =0;_egfa < _ebc ;_egfa ++{_fggbb =_gbbe .Data [_gfeg *_gbbe .RowStride +_egfa ];_fcf +=int (_bgca [_fggbb ]);};if _abd !=0{_fggbb =_gbbe .Data [_gfeg *_gbbe .RowStride +_egfa ]&_dbc ;_fcf +=int (_bgca [_fggbb ]);
|
|
};if _fcf > _eabe {return true ;};};return false ;};func (_eac *Bitmap )And (s *Bitmap )(_aag *Bitmap ,_bccb error ){const _ede ="\u0042\u0069\u0074\u006d\u0061\u0070\u002e\u0041\u006e\u0064";if _eac ==nil {return nil ,_d .Error (_ede ,"\u0027b\u0069t\u006d\u0061\u0070\u0020\u0027b\u0027\u0020i\u0073\u0020\u006e\u0069\u006c");
|
|
};if s ==nil {return nil ,_d .Error (_ede ,"\u0062\u0069\u0074\u006d\u0061\u0070\u0020\u0027\u0073\u0027\u0020\u0069s\u0020\u006e\u0069\u006c");};if !_eac .SizesEqual (s ){_gb .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",_ede );
|
|
};if _aag ,_bccb =_eebad (_aag ,_eac );_bccb !=nil {return nil ,_d .Wrap (_bccb ,_ede ,"\u0063\u0061\u006e't\u0020\u0063\u0072\u0065\u0061\u0074\u0065\u0020\u0027\u0064\u0027\u0020\u0062\u0069\u0074\u006d\u0061\u0070");};if _bccb =_aag .RasterOperation (0,0,_aag .Width ,_aag .Height ,PixSrcAndDst ,s ,0,0);
|
|
_bccb !=nil {return nil ,_d .Wrap (_bccb ,_ede ,"");};return _aag ,nil ;};func _aagd (_baca ,_dcgf ,_cbgc byte )byte {return (_baca &^(_cbgc ))|(_dcgf &_cbgc )};type CombinationOperator int ;func (_edda *Bitmap )centroid (_cbbd ,_bgb []int )(Point ,error ){_fgdb :=Point {};
|
|
_edda .setPadBits (0);if len (_cbbd )==0{_cbbd =_afbf ();};if len (_bgb )==0{_bgb =_bfcf ();};var _ggbb ,_bbef ,_cega ,_gcda ,_aggcg ,_dfcab int ;var _bdga byte ;for _aggcg =0;_aggcg < _edda .Height ;_aggcg ++{_cgac :=_edda .RowStride *_aggcg ;_gcda =0;
|
|
for _dfcab =0;_dfcab < _edda .RowStride ;_dfcab ++{_bdga =_edda .Data [_cgac +_dfcab ];if _bdga !=0{_gcda +=_bgb [_bdga ];_ggbb +=_cbbd [_bdga ]+_dfcab *8*_bgb [_bdga ];};};_cega +=_gcda ;_bbef +=_gcda *_aggcg ;};if _cega !=0{_fgdb .X =float32 (_ggbb )/float32 (_cega );
|
|
_fgdb .Y =float32 (_bbef )/float32 (_cega );};return _fgdb ,nil ;};func (_ddagb *Bitmaps )SelectByIndexes (idx []int )(*Bitmaps ,error ){const _ddda ="B\u0069\u0074\u006d\u0061\u0070\u0073.\u0053\u006f\u0072\u0074\u0049\u006e\u0064\u0065\u0078e\u0073\u0042\u0079H\u0065i\u0067\u0068\u0074";
|
|
_cfebb ,_ggfc :=_ddagb .selectByIndexes (idx );if _ggfc !=nil {return nil ,_d .Wrap (_ggfc ,_ddda ,"");};return _cfebb ,nil ;};func NewWithUnpaddedData (width ,height int ,data []byte )(*Bitmap ,error ){const _dfee ="\u004e\u0065\u0077\u0057it\u0068\u0055\u006e\u0070\u0061\u0064\u0064\u0065\u0064\u0044\u0061\u0074\u0061";
|
|
_cddd :=_egd (width ,height );_cddd .Data =data ;if _caeg :=((width *height )+7)>>3;len (data )< _caeg {return nil ,_d .Errorf (_dfee ,"\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 ),_caeg );
|
|
};if _fga :=_cddd .addPadBits ();_fga !=nil {return nil ,_d .Wrap (_fga ,_dfee ,"");};return _cddd ,nil ;};func _edae (_dcea *Bitmap )(_cccc *Bitmap ,_cfg int ,_aege error ){const _dffaf ="\u0042i\u0074\u006d\u0061\u0070.\u0077\u006f\u0072\u0064\u004da\u0073k\u0042y\u0044\u0069\u006c\u0061\u0074\u0069\u006fn";
|
|
if _dcea ==nil {return nil ,0,_d .Errorf (_dffaf ,"\u0027\u0073\u0027\u0020bi\u0074\u006d\u0061\u0070\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006ee\u0064");};var _cede ,_cgba *Bitmap ;if _cede ,_aege =_eebad (nil ,_dcea );_aege !=nil {return nil ,0,_d .Wrap (_aege ,_dffaf ,"\u0063\u006f\u0070\u0079\u0020\u0027\u0073\u0027");
|
|
};var (_gef [13]int ;_bged ,_badaf int ;);_gcdb :=12;_ffba :=_g .NewNumSlice (_gcdb +1);_afe :=_g .NewNumSlice (_gcdb +1);var _abff *Boxes ;for _acaac :=0;_acaac <=_gcdb ;_acaac ++{if _acaac ==0{if _cgba ,_aege =_eebad (nil ,_cede );_aege !=nil {return nil ,0,_d .Wrap (_aege ,_dffaf ,"\u0066i\u0072\u0073\u0074\u0020\u0062\u006d2");
|
|
};}else {if _cgba ,_aege =_bcdd (_cede ,MorphProcess {Operation :MopDilation ,Arguments :[]int {2,1}});_aege !=nil {return nil ,0,_d .Wrap (_aege ,_dffaf ,"\u0064\u0069\u006ca\u0074\u0069\u006f\u006e\u0020\u0062\u006d\u0032");};};if _abff ,_aege =_cgba .connComponentsBB (4);
|
|
_aege !=nil {return nil ,0,_d .Wrap (_aege ,_dffaf ,"");};_gef [_acaac ]=len (*_abff );_ffba .AddInt (_gef [_acaac ]);switch _acaac {case 0:_bged =_gef [0];default:_badaf =_gef [_acaac -1]-_gef [_acaac ];_afe .AddInt (_badaf );};_cede =_cgba ;};_def :=true ;
|
|
_fgc :=2;var _gbgd ,_bbbe int ;for _ggf :=1;_ggf < len (*_afe );_ggf ++{if _gbgd ,_aege =_ffba .GetInt (_ggf );_aege !=nil {return nil ,0,_d .Wrap (_aege ,_dffaf ,"\u0043\u0068\u0065\u0063ki\u006e\u0067\u0020\u0062\u0065\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0069o\u006e");
|
|
};if _def &&_gbgd < int (0.3*float32 (_bged )){_fgc =_ggf +1;_def =false ;};if _badaf ,_aege =_afe .GetInt (_ggf );_aege !=nil {return nil ,0,_d .Wrap (_aege ,_dffaf ,"\u0067\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u006ea\u0044\u0069\u0066\u0066");};
|
|
if _badaf > _bbbe {_bbbe =_badaf ;};};_beebc :=_dcea .XResolution ;if _beebc ==0{_beebc =150;};if _beebc > 110{_fgc ++;};if _fgc < 2{_gb .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");
|
|
_fgc =2;};_cfg =_fgc +1;if _cccc ,_aege =_fadc (nil ,_dcea ,_fgc +1,1);_aege !=nil {return nil ,0,_d .Wrap (_aege ,_dffaf ,"\u0067\u0065\u0074\u0074in\u0067\u0020\u006d\u0061\u0073\u006b\u0020\u0066\u0061\u0069\u006c\u0065\u0064");};return _cccc ,_cfg ,nil ;
|
|
};func _becb (_cdcfg ,_gdbd *Bitmap ,_ffdb ,_egcb ,_ggg uint ,_dbbe ,_aacd int ,_aaga bool ,_dba ,_cege int )error {for _cbae :=_dbbe ;_cbae < _aacd ;_cbae ++{if _dba +1< len (_cdcfg .Data ){_ebab :=_cbae +1==_aacd ;_afcb ,_bagaf :=_cdcfg .GetByte (_dba );
|
|
if _bagaf !=nil {return _bagaf ;};_dba ++;_afcb <<=_ffdb ;_ggaa ,_bagaf :=_cdcfg .GetByte (_dba );if _bagaf !=nil {return _bagaf ;};_ggaa >>=_egcb ;_fbc :=_afcb |_ggaa ;if _ebab &&!_aaga {_fbc =_aecdc (_ggg ,_fbc );};_bagaf =_gdbd .SetByte (_cege ,_fbc );
|
|
if _bagaf !=nil {return _bagaf ;};_cege ++;if _ebab &&_aaga {_ffgg ,_bdb :=_cdcfg .GetByte (_dba );if _bdb !=nil {return _bdb ;};_ffgg <<=_ffdb ;_fbc =_aecdc (_ggg ,_ffgg );if _bdb =_gdbd .SetByte (_cege ,_fbc );_bdb !=nil {return _bdb ;};};continue ;};
|
|
_cgee ,_cada :=_cdcfg .GetByte (_dba );if _cada !=nil {_gb .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",_dba ,_cada );
|
|
return _cada ;};_cgee <<=_ffdb ;_dba ++;_cada =_gdbd .SetByte (_cege ,_cgee );if _cada !=nil {return _cada ;};_cege ++;};return nil ;};func TstVSymbol (t *_e .T ,scale ...int )*Bitmap {_cabcc ,_aegg :=NewWithData (5,5,[]byte {0x88,0x88,0x88,0x50,0x20});
|
|
_df .NoError (t ,_aegg );return TstGetScaledSymbol (t ,_cabcc ,scale ...);};func (_abeb *Bitmaps )makeSizeIndicator (_geed ,_feea int ,_gfca LocationFilter ,_cbcbe SizeComparison )(_egbce *_g .NumSlice ,_dabd error ){const _bdbge ="\u0042i\u0074\u006d\u0061\u0070s\u002e\u006d\u0061\u006b\u0065S\u0069z\u0065I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";
|
|
if _abeb ==nil {return nil ,_d .Error (_bdbge ,"\u0062\u0069\u0074ma\u0070\u0073\u0020\u0027\u0062\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};switch _gfca {case LocSelectWidth ,LocSelectHeight ,LocSelectIfEither ,LocSelectIfBoth :default:return nil ,_d .Errorf (_bdbge ,"\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",_gfca );
|
|
};switch _cbcbe {case SizeSelectIfLT ,SizeSelectIfGT ,SizeSelectIfLTE ,SizeSelectIfGTE ,SizeSelectIfEQ :default:return nil ,_d .Errorf (_bdbge ,"\u0069\u006e\u0076\u0061li\u0064\u0020\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0027\u0025d\u0027",_cbcbe );
|
|
};_egbce =&_g .NumSlice {};var (_dfdg ,_gaaf ,_abba int ;_eafa *Bitmap ;);for _ ,_eafa =range _abeb .Values {_dfdg =0;_gaaf ,_abba =_eafa .Width ,_eafa .Height ;switch _gfca {case LocSelectWidth :if (_cbcbe ==SizeSelectIfLT &&_gaaf < _geed )||(_cbcbe ==SizeSelectIfGT &&_gaaf > _geed )||(_cbcbe ==SizeSelectIfLTE &&_gaaf <=_geed )||(_cbcbe ==SizeSelectIfGTE &&_gaaf >=_geed )||(_cbcbe ==SizeSelectIfEQ &&_gaaf ==_geed ){_dfdg =1;
|
|
};case LocSelectHeight :if (_cbcbe ==SizeSelectIfLT &&_abba < _feea )||(_cbcbe ==SizeSelectIfGT &&_abba > _feea )||(_cbcbe ==SizeSelectIfLTE &&_abba <=_feea )||(_cbcbe ==SizeSelectIfGTE &&_abba >=_feea )||(_cbcbe ==SizeSelectIfEQ &&_abba ==_feea ){_dfdg =1;
|
|
};case LocSelectIfEither :if (_cbcbe ==SizeSelectIfLT &&(_gaaf < _geed ||_abba < _feea ))||(_cbcbe ==SizeSelectIfGT &&(_gaaf > _geed ||_abba > _feea ))||(_cbcbe ==SizeSelectIfLTE &&(_gaaf <=_geed ||_abba <=_feea ))||(_cbcbe ==SizeSelectIfGTE &&(_gaaf >=_geed ||_abba >=_feea ))||(_cbcbe ==SizeSelectIfEQ &&(_gaaf ==_geed ||_abba ==_feea )){_dfdg =1;
|
|
};case LocSelectIfBoth :if (_cbcbe ==SizeSelectIfLT &&(_gaaf < _geed &&_abba < _feea ))||(_cbcbe ==SizeSelectIfGT &&(_gaaf > _geed &&_abba > _feea ))||(_cbcbe ==SizeSelectIfLTE &&(_gaaf <=_geed &&_abba <=_feea ))||(_cbcbe ==SizeSelectIfGTE &&(_gaaf >=_geed &&_abba >=_feea ))||(_cbcbe ==SizeSelectIfEQ &&(_gaaf ==_geed &&_abba ==_feea )){_dfdg =1;
|
|
};};_egbce .AddInt (_dfdg );};return _egbce ,nil ;};func (_dgaf Points )GetIntX (i int )(int ,error ){if i >=len (_dgaf ){return 0,_d .Errorf ("\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0065t\u0049\u006e\u0074\u0058","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
};return int (_dgaf [i ].X ),nil ;};func (_dfb *Bitmap )GetUnpaddedData ()([]byte ,error ){_efc :=uint (_dfb .Width &0x07);if _efc ==0{return _dfb .Data ,nil ;};_efa :=_dfb .Width *_dfb .Height ;if _efa %8!=0{_efa >>=3;_efa ++;}else {_efa >>=3;};_bge :=make ([]byte ,_efa );
|
|
_fbab :=_bc .NewWriterMSB (_bge );const _bef ="\u0047e\u0074U\u006e\u0070\u0061\u0064\u0064\u0065\u0064\u0044\u0061\u0074\u0061";for _beb :=0;_beb < _dfb .Height ;_beb ++{for _cgc :=0;_cgc < _dfb .RowStride ;_cgc ++{_eff :=_dfb .Data [_beb *_dfb .RowStride +_cgc ];
|
|
if _cgc !=_dfb .RowStride -1{_dgf :=_fbab .WriteByte (_eff );if _dgf !=nil {return nil ,_d .Wrap (_dgf ,_bef ,"");};continue ;};for _eacd :=uint (0);_eacd < _efc ;_eacd ++{_fdad :=_fbab .WriteBit (int (_eff >>(7-_eacd )&0x01));if _fdad !=nil {return nil ,_d .Wrap (_fdad ,_bef ,"");
|
|
};};};};return _bge ,nil ;};func _fadc (_gbgfd ,_bbga *Bitmap ,_ebfd ,_ecca int )(*Bitmap ,error ){const _cbag ="\u0063\u006c\u006f\u0073\u0065\u0042\u0072\u0069\u0063\u006b";if _bbga ==nil {return nil ,_d .Error (_cbag ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if _ebfd < 1||_ecca < 1{return nil ,_d .Error (_cbag ,"\u0068S\u0069\u007a\u0065\u0020\u0061\u006e\u0064\u0020\u0076\u0053\u0069z\u0065\u0020\u006e\u006f\u0074\u0020\u003e\u003d\u0020\u0031");};if _ebfd ==1&&_ecca ==1{return _bbga .Copy (),nil ;};if _ebfd ==1||_ecca ==1{_bgdc :=SelCreateBrick (_ecca ,_ebfd ,_ecca /2,_ebfd /2,SelHit );
|
|
var _dgfg error ;_gbgfd ,_dgfg =_acb (_gbgfd ,_bbga ,_bgdc );if _dgfg !=nil {return nil ,_d .Wrap (_dgfg ,_cbag ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");};
|
|
return _gbgfd ,nil ;};_agac :=SelCreateBrick (1,_ebfd ,0,_ebfd /2,SelHit );_ecaf :=SelCreateBrick (_ecca ,1,_ecca /2,0,SelHit );_fgfc ,_gbfb :=_bced (nil ,_bbga ,_agac );if _gbfb !=nil {return nil ,_d .Wrap (_gbfb ,_cbag ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
};if _gbgfd ,_gbfb =_bced (_gbgfd ,_fgfc ,_ecaf );_gbfb !=nil {return nil ,_d .Wrap (_gbfb ,_cbag ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};if _ ,_gbfb =_afbbf (_fgfc ,_gbgfd ,_agac );_gbfb !=nil {return nil ,_d .Wrap (_gbfb ,_cbag ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");
|
|
};if _ ,_gbfb =_afbbf (_gbgfd ,_fgfc ,_ecaf );_gbfb !=nil {return nil ,_d .Wrap (_gbfb ,_cbag ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};return _gbgfd ,nil ;};func TstWSymbol (t *_e .T ,scale ...int )*Bitmap {_feegg ,_bcfe :=NewWithData (5,5,[]byte {0x88,0x88,0xA8,0xD8,0x88});
|
|
_df .NoError (t ,_bcfe );return TstGetScaledSymbol (t ,_feegg ,scale ...);};func (_ceeg *Bitmap )CreateTemplate ()*Bitmap {return _ceeg .createTemplate ()};func _bdd (_bbae ,_bfe *Bitmap ,_bgfe int ,_fbg []byte ,_abc int )(_eceb error ){const _baf ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0032";
|
|
var (_bcgd ,_bff ,_db ,_abf ,_gda ,_gfe ,_gbb ,_gga int ;_dfe ,_eee ,_agc ,_dbe uint32 ;_cae ,_gge byte ;_bgfed uint16 ;);_aga :=make ([]byte ,4);_bcc :=make ([]byte ,4);for _db =0;_db < _bbae .Height -1;_db ,_abf =_db +2,_abf +1{_bcgd =_db *_bbae .RowStride ;
|
|
_bff =_abf *_bfe .RowStride ;for _gda ,_gfe =0,0;_gda < _abc ;_gda ,_gfe =_gda +4,_gfe +1{for _gbb =0;_gbb < 4;_gbb ++{_gga =_bcgd +_gda +_gbb ;if _gga <=len (_bbae .Data )-1&&_gga < _bcgd +_bbae .RowStride {_aga [_gbb ]=_bbae .Data [_gga ];}else {_aga [_gbb ]=0x00;
|
|
};_gga =_bcgd +_bbae .RowStride +_gda +_gbb ;if _gga <=len (_bbae .Data )-1&&_gga < _bcgd +(2*_bbae .RowStride ){_bcc [_gbb ]=_bbae .Data [_gga ];}else {_bcc [_gbb ]=0x00;};};_dfe =_ff .BigEndian .Uint32 (_aga );_eee =_ff .BigEndian .Uint32 (_bcc );_agc =_dfe &_eee ;
|
|
_agc |=_agc <<1;_dbe =_dfe |_eee ;_dbe &=_dbe <<1;_eee =_agc |_dbe ;_eee &=0xaaaaaaaa;_dfe =_eee |(_eee <<7);_cae =byte (_dfe >>24);_gge =byte ((_dfe >>8)&0xff);_gga =_bff +_gfe ;if _gga +1==len (_bfe .Data )-1||_gga +1>=_bff +_bfe .RowStride {if _eceb =_bfe .SetByte (_gga ,_fbg [_cae ]);
|
|
_eceb !=nil {return _d .Wrapf (_eceb ,_baf ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_gga );};}else {_bgfed =(uint16 (_fbg [_cae ])<<8)|uint16 (_fbg [_gge ]);if _eceb =_bfe .setTwoBytes (_gga ,_bgfed );_eceb !=nil {return _d .Wrapf (_eceb ,_baf ,"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",_gga );
|
|
};_gfe ++;};};};return nil ;};func _gggc (_baea ,_fdegg *Bitmap ,_fgbe ,_fccf int )(*Bitmap ,error ){const _cefc ="\u0065\u0072\u006f\u0064\u0065\u0042\u0072\u0069\u0063\u006b";if _fdegg ==nil {return nil ,_d .Error (_cefc ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if _fgbe < 1||_fccf < 1{return nil ,_d .Error (_cefc ,"\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 _fgbe ==1&&_fccf ==1{_cgga ,_fdac :=_eebad (_baea ,_fdegg );if _fdac !=nil {return nil ,_d .Wrap (_fdac ,_cefc ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u0026\u0026 \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _cgga ,nil ;};if _fgbe ==1||_fccf ==1{_fdbf :=SelCreateBrick (_fccf ,_fgbe ,_fccf /2,_fgbe /2,SelHit );_fdca ,_befc :=_afbbf (_baea ,_fdegg ,_fdbf );if _befc !=nil {return nil ,_d .Wrap (_befc ,_cefc ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _fdca ,nil ;};_fdce :=SelCreateBrick (1,_fgbe ,0,_fgbe /2,SelHit );_ffaa :=SelCreateBrick (_fccf ,1,_fccf /2,0,SelHit );_gbbd ,_aaca :=_afbbf (nil ,_fdegg ,_fdce );if _aaca !=nil {return nil ,_d .Wrap (_aaca ,_cefc ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");
|
|
};_baea ,_aaca =_afbbf (_baea ,_gbbd ,_ffaa );if _aaca !=nil {return nil ,_d .Wrap (_aaca ,_cefc ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};return _baea ,nil ;};type MorphOperation int ;func _bcdcb (_cfed *_g .Stack ,_ffbg ,_dedf ,_bdfbf ,_fcdc ,_ecgc int ,_dbee *_ba .Rectangle )(_gdcb error ){const _gdfa ="\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 _cfed ==nil {return _d .Error (_gdfa ,"\u006ei\u006c \u0073\u0074\u0061\u0063\u006b \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");};if _dbee ==nil {return _d .Error (_gdfa ,"\u0070\u0072\u006f\u0076i\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0069\u006da\u0067e\u002e\u0052\u0065\u0063\u0074\u0061\u006eg\u006c\u0065");
|
|
};_dbee .Min .X =_g .Min (_dbee .Min .X ,_ffbg );_dbee .Max .X =_g .Max (_dbee .Max .X ,_dedf );_dbee .Min .Y =_g .Min (_dbee .Min .Y ,_bdfbf );_dbee .Max .Y =_g .Max (_dbee .Max .Y ,_bdfbf );if !(_bdfbf +_fcdc >=0&&_bdfbf +_fcdc <=_ecgc ){return nil ;
|
|
};if _cfed .Aux ==nil {return _d .Error (_gdfa ,"a\u0075x\u0053\u0074\u0061\u0063\u006b\u0020\u006e\u006ft\u0020\u0064\u0065\u0066in\u0065\u0064");};var _ebae *fillSegment ;_fadf ,_bggbe :=_cfed .Aux .Pop ();if _bggbe {if _ebae ,_bggbe =_fadf .(*fillSegment );
|
|
!_bggbe {return _d .Error (_gdfa ,"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 {_ebae =&fillSegment {};
|
|
};_ebae ._bcfd =_ffbg ;_ebae ._addb =_dedf ;_ebae ._cbfa =_bdfbf ;_ebae ._ddaf =_fcdc ;_cfed .Push (_ebae );return nil ;};func (_cfda *BitmapsArray )AddBitmaps (bm *Bitmaps ){_cfda .Values =append (_cfda .Values ,bm )};func (_agbb *Bitmap )setAll ()error {_dfga :=_caee (_agbb ,0,0,_agbb .Width ,_agbb .Height ,PixSet ,nil ,0,0);
|
|
if _dfga !=nil {return _d .Wrap (_dfga ,"\u0073\u0065\u0074\u0041\u006c\u006c","");};return nil ;};func TstCSymbol (t *_e .T )*Bitmap {t .Helper ();_dcbcc :=New (6,6);_df .NoError (t ,_dcbcc .SetPixel (1,0,1));_df .NoError (t ,_dcbcc .SetPixel (2,0,1));
|
|
_df .NoError (t ,_dcbcc .SetPixel (3,0,1));_df .NoError (t ,_dcbcc .SetPixel (4,0,1));_df .NoError (t ,_dcbcc .SetPixel (0,1,1));_df .NoError (t ,_dcbcc .SetPixel (5,1,1));_df .NoError (t ,_dcbcc .SetPixel (0,2,1));_df .NoError (t ,_dcbcc .SetPixel (0,3,1));
|
|
_df .NoError (t ,_dcbcc .SetPixel (0,4,1));_df .NoError (t ,_dcbcc .SetPixel (5,4,1));_df .NoError (t ,_dcbcc .SetPixel (1,5,1));_df .NoError (t ,_dcbcc .SetPixel (2,5,1));_df .NoError (t ,_dcbcc .SetPixel (3,5,1));_df .NoError (t ,_dcbcc .SetPixel (4,5,1));
|
|
return _dcbcc ;};func TstFrameBitmap ()*Bitmap {return _afce .Copy ()};func (_cbad Points )XSorter ()func (_gbgc ,_aafa int )bool {return func (_ggea ,_cfd int )bool {return _cbad [_ggea ].X < _cbad [_cfd ].X };};const (_ SizeSelection =iota ;SizeSelectByWidth ;
|
|
SizeSelectByHeight ;SizeSelectByMaxDimension ;SizeSelectByArea ;SizeSelectByPerimeter ;);func DilateBrick (d ,s *Bitmap ,hSize ,vSize int )(*Bitmap ,error ){return _geebe (d ,s ,hSize ,vSize )};func (_aed MorphProcess )getWidthHeight ()(_afed ,_eabb int ){return _aed .Arguments [0],_aed .Arguments [1];
|
|
};func (_fbfb *ClassedPoints )GetIntXByClass (i int )(int ,error ){const _cdef ="\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 >=_fbfb .IntSlice .Size (){return 0,_d .Errorf (_cdef ,"\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 (_fbfb .XAtIndex (i )),nil ;};type BitmapsArray struct{Values []*Bitmaps ;Boxes []*_ba .Rectangle ;};func TstNSymbol (t *_e .T ,scale ...int )*Bitmap {_gffa ,_fefg :=NewWithData (4,5,[]byte {0x90,0xD0,0xB0,0x90,0x90});_df .NoError (t ,_fefg );
|
|
return TstGetScaledSymbol (t ,_gffa ,scale ...);};func (_geb *Bitmap )CountPixels ()int {return _geb .countPixels ()};func (_ddc *Bitmap )clearAll ()error {return _ddc .RasterOperation (0,0,_ddc .Width ,_ddc .Height ,PixClr ,nil ,0,0);};func (_bece *Bitmap )setTwoBytes (_eefd int ,_eecb uint16 )error {if _eefd +1> len (_bece .Data )-1{return _d .Errorf ("s\u0065\u0074\u0054\u0077\u006f\u0042\u0079\u0074\u0065\u0073","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",_eefd );
|
|
};_bece .Data [_eefd ]=byte ((_eecb &0xff00)>>8);_bece .Data [_eefd +1]=byte (_eecb &0xff);return nil ;};func TstOSymbol (t *_e .T ,scale ...int )*Bitmap {_fgbaa ,_afba :=NewWithData (4,5,[]byte {0xF0,0x90,0x90,0x90,0xF0});_df .NoError (t ,_afba );return TstGetScaledSymbol (t ,_fgbaa ,scale ...);
|
|
};func (_bfffa *BitmapsArray )GetBox (i int )(*_ba .Rectangle ,error ){const _ddg ="\u0042\u0069\u0074\u006dap\u0073\u0041\u0072\u0072\u0061\u0079\u002e\u0047\u0065\u0074\u0042\u006f\u0078";if _bfffa ==nil {return nil ,_d .Error (_ddg ,"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 (_bfffa .Boxes )-1{return nil ,_d .Errorf (_ddg ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return _bfffa .Boxes [i ],nil ;};func TstImageBitmapInverseData ()[]byte {_ffeb :=_cccb .Copy ();
|
|
_ffeb .InverseData ();return _ffeb .Data ;};func _afg (_gbe *Bitmap ,_gac int )(*Bitmap ,error ){const _ecb ="\u0065x\u0070a\u006e\u0064\u0042\u0069\u006ea\u0072\u0079P\u006f\u0077\u0065\u0072\u0032";if _gbe ==nil {return nil ,_d .Error (_ecb ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if _gac ==1{return _eebad (nil ,_gbe );};if _gac !=2&&_gac !=4&&_gac !=8{return nil ,_d .Error (_ecb ,"\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");
|
|
};_afd :=_gac *_gbe .Width ;_fa :=_gac *_gbe .Height ;_eb :=New (_afd ,_fa );var _ad error ;switch _gac {case 2:_ad =_ee (_eb ,_gbe );case 4:_ad =_ffga (_eb ,_gbe );case 8:_ad =_cgb (_eb ,_gbe );};if _ad !=nil {return nil ,_d .Wrap (_ad ,_ecb ,"");};return _eb ,nil ;
|
|
};func (_fbafa *Bitmaps )String ()string {_acae :=_c .Builder {};for _ ,_fdaf :=range _fbafa .Values {_acae .WriteString (_fdaf .String ());_acae .WriteRune ('\n');};return _acae .String ();};var _bgca [256]uint8 ;type Boxes []*_ba .Rectangle ;func (_agce *Bitmaps )GetBox (i int )(*_ba .Rectangle ,error ){const _gdafg ="\u0047\u0065\u0074\u0042\u006f\u0078";
|
|
if _agce ==nil {return nil ,_d .Error (_gdafg ,"\u0070\u0072\u006f\u0076id\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0042\u0069\u0074\u006d\u0061\u0070s\u0027");};if i > len (_agce .Boxes )-1{return nil ,_d .Errorf (_gdafg ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
};return _agce .Boxes [i ],nil ;};func _gdg (_edc *Bitmap ,_fgafbd ,_gecc ,_fddd ,_baae int ,_fgbf RasterOperator ,_ccgdf *Bitmap ,_bbaf ,_adeg int )error {var (_bbaba bool ;_ffde bool ;_abcg byte ;_fgac int ;_gbabc int ;_bcbf int ;_cabfg int ;_gbef bool ;
|
|
_ageg int ;_gcfa int ;_bfbc int ;_abcfb bool ;_caecd byte ;_cfbf int ;_dcbf int ;_dcfb int ;_fccg byte ;_bgbe int ;_aacc int ;_afbbe uint ;_gdag uint ;_bccc byte ;_gaaa shift ;_bbbcf bool ;_bbaa bool ;_eaad ,_gceaa int ;);if _bbaf &7!=0{_aacc =8-(_bbaf &7);
|
|
};if _fgafbd &7!=0{_gbabc =8-(_fgafbd &7);};if _aacc ==0&&_gbabc ==0{_bccc =_gefe [0];}else {if _gbabc > _aacc {_afbbe =uint (_gbabc -_aacc );}else {_afbbe =uint (8-(_aacc -_gbabc ));};_gdag =8-_afbbe ;_bccc =_gefe [_afbbe ];};if (_fgafbd &7)!=0{_bbaba =true ;
|
|
_fgac =8-(_fgafbd &7);_abcg =_gefe [_fgac ];_bcbf =_edc .RowStride *_gecc +(_fgafbd >>3);_cabfg =_ccgdf .RowStride *_adeg +(_bbaf >>3);_bgbe =8-(_bbaf &7);if _fgac > _bgbe {_gaaa =_ggae ;if _fddd >=_aacc {_bbbcf =true ;};}else {_gaaa =_cbaf ;};};if _fddd < _fgac {_ffde =true ;
|
|
_abcg &=_afa [8-_fgac +_fddd ];};if !_ffde {_ageg =(_fddd -_fgac )>>3;if _ageg !=0{_gbef =true ;_gcfa =_edc .RowStride *_gecc +((_fgafbd +_gbabc )>>3);_bfbc =_ccgdf .RowStride *_adeg +((_bbaf +_gbabc )>>3);};};_cfbf =(_fgafbd +_fddd )&7;if !(_ffde ||_cfbf ==0){_abcfb =true ;
|
|
_caecd =_afa [_cfbf ];_dcbf =_edc .RowStride *_gecc +((_fgafbd +_gbabc )>>3)+_ageg ;_dcfb =_ccgdf .RowStride *_adeg +((_bbaf +_gbabc )>>3)+_ageg ;if _cfbf > int (_gdag ){_bbaa =true ;};};switch _fgbf {case PixSrc :if _bbaba {for _eaad =0;_eaad < _baae ;
|
|
_eaad ++{if _gaaa ==_ggae {_fccg =_ccgdf .Data [_cabfg ]<<_afbbe ;if _bbbcf {_fccg =_aagd (_fccg ,_ccgdf .Data [_cabfg +1]>>_gdag ,_bccc );};}else {_fccg =_ccgdf .Data [_cabfg ]>>_gdag ;};_edc .Data [_bcbf ]=_aagd (_edc .Data [_bcbf ],_fccg ,_abcg );_bcbf +=_edc .RowStride ;
|
|
_cabfg +=_ccgdf .RowStride ;};};if _gbef {for _eaad =0;_eaad < _baae ;_eaad ++{for _gceaa =0;_gceaa < _ageg ;_gceaa ++{_fccg =_aagd (_ccgdf .Data [_bfbc +_gceaa ]<<_afbbe ,_ccgdf .Data [_bfbc +_gceaa +1]>>_gdag ,_bccc );_edc .Data [_gcfa +_gceaa ]=_fccg ;
|
|
};_gcfa +=_edc .RowStride ;_bfbc +=_ccgdf .RowStride ;};};if _abcfb {for _eaad =0;_eaad < _baae ;_eaad ++{_fccg =_ccgdf .Data [_dcfb ]<<_afbbe ;if _bbaa {_fccg =_aagd (_fccg ,_ccgdf .Data [_dcfb +1]>>_gdag ,_bccc );};_edc .Data [_dcbf ]=_aagd (_edc .Data [_dcbf ],_fccg ,_caecd );
|
|
_dcbf +=_edc .RowStride ;_dcfb +=_ccgdf .RowStride ;};};case PixNotSrc :if _bbaba {for _eaad =0;_eaad < _baae ;_eaad ++{if _gaaa ==_ggae {_fccg =_ccgdf .Data [_cabfg ]<<_afbbe ;if _bbbcf {_fccg =_aagd (_fccg ,_ccgdf .Data [_cabfg +1]>>_gdag ,_bccc );};
|
|
}else {_fccg =_ccgdf .Data [_cabfg ]>>_gdag ;};_edc .Data [_bcbf ]=_aagd (_edc .Data [_bcbf ],^_fccg ,_abcg );_bcbf +=_edc .RowStride ;_cabfg +=_ccgdf .RowStride ;};};if _gbef {for _eaad =0;_eaad < _baae ;_eaad ++{for _gceaa =0;_gceaa < _ageg ;_gceaa ++{_fccg =_aagd (_ccgdf .Data [_bfbc +_gceaa ]<<_afbbe ,_ccgdf .Data [_bfbc +_gceaa +1]>>_gdag ,_bccc );
|
|
_edc .Data [_gcfa +_gceaa ]=^_fccg ;};_gcfa +=_edc .RowStride ;_bfbc +=_ccgdf .RowStride ;};};if _abcfb {for _eaad =0;_eaad < _baae ;_eaad ++{_fccg =_ccgdf .Data [_dcfb ]<<_afbbe ;if _bbaa {_fccg =_aagd (_fccg ,_ccgdf .Data [_dcfb +1]>>_gdag ,_bccc );};
|
|
_edc .Data [_dcbf ]=_aagd (_edc .Data [_dcbf ],^_fccg ,_caecd );_dcbf +=_edc .RowStride ;_dcfb +=_ccgdf .RowStride ;};};case PixSrcOrDst :if _bbaba {for _eaad =0;_eaad < _baae ;_eaad ++{if _gaaa ==_ggae {_fccg =_ccgdf .Data [_cabfg ]<<_afbbe ;if _bbbcf {_fccg =_aagd (_fccg ,_ccgdf .Data [_cabfg +1]>>_gdag ,_bccc );
|
|
};}else {_fccg =_ccgdf .Data [_cabfg ]>>_gdag ;};_edc .Data [_bcbf ]=_aagd (_edc .Data [_bcbf ],_fccg |_edc .Data [_bcbf ],_abcg );_bcbf +=_edc .RowStride ;_cabfg +=_ccgdf .RowStride ;};};if _gbef {for _eaad =0;_eaad < _baae ;_eaad ++{for _gceaa =0;_gceaa < _ageg ;
|
|
_gceaa ++{_fccg =_aagd (_ccgdf .Data [_bfbc +_gceaa ]<<_afbbe ,_ccgdf .Data [_bfbc +_gceaa +1]>>_gdag ,_bccc );_edc .Data [_gcfa +_gceaa ]|=_fccg ;};_gcfa +=_edc .RowStride ;_bfbc +=_ccgdf .RowStride ;};};if _abcfb {for _eaad =0;_eaad < _baae ;_eaad ++{_fccg =_ccgdf .Data [_dcfb ]<<_afbbe ;
|
|
if _bbaa {_fccg =_aagd (_fccg ,_ccgdf .Data [_dcfb +1]>>_gdag ,_bccc );};_edc .Data [_dcbf ]=_aagd (_edc .Data [_dcbf ],_fccg |_edc .Data [_dcbf ],_caecd );_dcbf +=_edc .RowStride ;_dcfb +=_ccgdf .RowStride ;};};case PixSrcAndDst :if _bbaba {for _eaad =0;
|
|
_eaad < _baae ;_eaad ++{if _gaaa ==_ggae {_fccg =_ccgdf .Data [_cabfg ]<<_afbbe ;if _bbbcf {_fccg =_aagd (_fccg ,_ccgdf .Data [_cabfg +1]>>_gdag ,_bccc );};}else {_fccg =_ccgdf .Data [_cabfg ]>>_gdag ;};_edc .Data [_bcbf ]=_aagd (_edc .Data [_bcbf ],_fccg &_edc .Data [_bcbf ],_abcg );
|
|
_bcbf +=_edc .RowStride ;_cabfg +=_ccgdf .RowStride ;};};if _gbef {for _eaad =0;_eaad < _baae ;_eaad ++{for _gceaa =0;_gceaa < _ageg ;_gceaa ++{_fccg =_aagd (_ccgdf .Data [_bfbc +_gceaa ]<<_afbbe ,_ccgdf .Data [_bfbc +_gceaa +1]>>_gdag ,_bccc );_edc .Data [_gcfa +_gceaa ]&=_fccg ;
|
|
};_gcfa +=_edc .RowStride ;_bfbc +=_ccgdf .RowStride ;};};if _abcfb {for _eaad =0;_eaad < _baae ;_eaad ++{_fccg =_ccgdf .Data [_dcfb ]<<_afbbe ;if _bbaa {_fccg =_aagd (_fccg ,_ccgdf .Data [_dcfb +1]>>_gdag ,_bccc );};_edc .Data [_dcbf ]=_aagd (_edc .Data [_dcbf ],_fccg &_edc .Data [_dcbf ],_caecd );
|
|
_dcbf +=_edc .RowStride ;_dcfb +=_ccgdf .RowStride ;};};case PixSrcXorDst :if _bbaba {for _eaad =0;_eaad < _baae ;_eaad ++{if _gaaa ==_ggae {_fccg =_ccgdf .Data [_cabfg ]<<_afbbe ;if _bbbcf {_fccg =_aagd (_fccg ,_ccgdf .Data [_cabfg +1]>>_gdag ,_bccc );
|
|
};}else {_fccg =_ccgdf .Data [_cabfg ]>>_gdag ;};_edc .Data [_bcbf ]=_aagd (_edc .Data [_bcbf ],_fccg ^_edc .Data [_bcbf ],_abcg );_bcbf +=_edc .RowStride ;_cabfg +=_ccgdf .RowStride ;};};if _gbef {for _eaad =0;_eaad < _baae ;_eaad ++{for _gceaa =0;_gceaa < _ageg ;
|
|
_gceaa ++{_fccg =_aagd (_ccgdf .Data [_bfbc +_gceaa ]<<_afbbe ,_ccgdf .Data [_bfbc +_gceaa +1]>>_gdag ,_bccc );_edc .Data [_gcfa +_gceaa ]^=_fccg ;};_gcfa +=_edc .RowStride ;_bfbc +=_ccgdf .RowStride ;};};if _abcfb {for _eaad =0;_eaad < _baae ;_eaad ++{_fccg =_ccgdf .Data [_dcfb ]<<_afbbe ;
|
|
if _bbaa {_fccg =_aagd (_fccg ,_ccgdf .Data [_dcfb +1]>>_gdag ,_bccc );};_edc .Data [_dcbf ]=_aagd (_edc .Data [_dcbf ],_fccg ^_edc .Data [_dcbf ],_caecd );_dcbf +=_edc .RowStride ;_dcfb +=_ccgdf .RowStride ;};};case PixNotSrcOrDst :if _bbaba {for _eaad =0;
|
|
_eaad < _baae ;_eaad ++{if _gaaa ==_ggae {_fccg =_ccgdf .Data [_cabfg ]<<_afbbe ;if _bbbcf {_fccg =_aagd (_fccg ,_ccgdf .Data [_cabfg +1]>>_gdag ,_bccc );};}else {_fccg =_ccgdf .Data [_cabfg ]>>_gdag ;};_edc .Data [_bcbf ]=_aagd (_edc .Data [_bcbf ],^_fccg |_edc .Data [_bcbf ],_abcg );
|
|
_bcbf +=_edc .RowStride ;_cabfg +=_ccgdf .RowStride ;};};if _gbef {for _eaad =0;_eaad < _baae ;_eaad ++{for _gceaa =0;_gceaa < _ageg ;_gceaa ++{_fccg =_aagd (_ccgdf .Data [_bfbc +_gceaa ]<<_afbbe ,_ccgdf .Data [_bfbc +_gceaa +1]>>_gdag ,_bccc );_edc .Data [_gcfa +_gceaa ]|=^_fccg ;
|
|
};_gcfa +=_edc .RowStride ;_bfbc +=_ccgdf .RowStride ;};};if _abcfb {for _eaad =0;_eaad < _baae ;_eaad ++{_fccg =_ccgdf .Data [_dcfb ]<<_afbbe ;if _bbaa {_fccg =_aagd (_fccg ,_ccgdf .Data [_dcfb +1]>>_gdag ,_bccc );};_edc .Data [_dcbf ]=_aagd (_edc .Data [_dcbf ],^_fccg |_edc .Data [_dcbf ],_caecd );
|
|
_dcbf +=_edc .RowStride ;_dcfb +=_ccgdf .RowStride ;};};case PixNotSrcAndDst :if _bbaba {for _eaad =0;_eaad < _baae ;_eaad ++{if _gaaa ==_ggae {_fccg =_ccgdf .Data [_cabfg ]<<_afbbe ;if _bbbcf {_fccg =_aagd (_fccg ,_ccgdf .Data [_cabfg +1]>>_gdag ,_bccc );
|
|
};}else {_fccg =_ccgdf .Data [_cabfg ]>>_gdag ;};_edc .Data [_bcbf ]=_aagd (_edc .Data [_bcbf ],^_fccg &_edc .Data [_bcbf ],_abcg );_bcbf +=_edc .RowStride ;_cabfg +=_ccgdf .RowStride ;};};if _gbef {for _eaad =0;_eaad < _baae ;_eaad ++{for _gceaa =0;_gceaa < _ageg ;
|
|
_gceaa ++{_fccg =_aagd (_ccgdf .Data [_bfbc +_gceaa ]<<_afbbe ,_ccgdf .Data [_bfbc +_gceaa +1]>>_gdag ,_bccc );_edc .Data [_gcfa +_gceaa ]&=^_fccg ;};_gcfa +=_edc .RowStride ;_bfbc +=_ccgdf .RowStride ;};};if _abcfb {for _eaad =0;_eaad < _baae ;_eaad ++{_fccg =_ccgdf .Data [_dcfb ]<<_afbbe ;
|
|
if _bbaa {_fccg =_aagd (_fccg ,_ccgdf .Data [_dcfb +1]>>_gdag ,_bccc );};_edc .Data [_dcbf ]=_aagd (_edc .Data [_dcbf ],^_fccg &_edc .Data [_dcbf ],_caecd );_dcbf +=_edc .RowStride ;_dcfb +=_ccgdf .RowStride ;};};case PixSrcOrNotDst :if _bbaba {for _eaad =0;
|
|
_eaad < _baae ;_eaad ++{if _gaaa ==_ggae {_fccg =_ccgdf .Data [_cabfg ]<<_afbbe ;if _bbbcf {_fccg =_aagd (_fccg ,_ccgdf .Data [_cabfg +1]>>_gdag ,_bccc );};}else {_fccg =_ccgdf .Data [_cabfg ]>>_gdag ;};_edc .Data [_bcbf ]=_aagd (_edc .Data [_bcbf ],_fccg |^_edc .Data [_bcbf ],_abcg );
|
|
_bcbf +=_edc .RowStride ;_cabfg +=_ccgdf .RowStride ;};};if _gbef {for _eaad =0;_eaad < _baae ;_eaad ++{for _gceaa =0;_gceaa < _ageg ;_gceaa ++{_fccg =_aagd (_ccgdf .Data [_bfbc +_gceaa ]<<_afbbe ,_ccgdf .Data [_bfbc +_gceaa +1]>>_gdag ,_bccc );_edc .Data [_gcfa +_gceaa ]=_fccg |^_edc .Data [_gcfa +_gceaa ];
|
|
};_gcfa +=_edc .RowStride ;_bfbc +=_ccgdf .RowStride ;};};if _abcfb {for _eaad =0;_eaad < _baae ;_eaad ++{_fccg =_ccgdf .Data [_dcfb ]<<_afbbe ;if _bbaa {_fccg =_aagd (_fccg ,_ccgdf .Data [_dcfb +1]>>_gdag ,_bccc );};_edc .Data [_dcbf ]=_aagd (_edc .Data [_dcbf ],_fccg |^_edc .Data [_dcbf ],_caecd );
|
|
_dcbf +=_edc .RowStride ;_dcfb +=_ccgdf .RowStride ;};};case PixSrcAndNotDst :if _bbaba {for _eaad =0;_eaad < _baae ;_eaad ++{if _gaaa ==_ggae {_fccg =_ccgdf .Data [_cabfg ]<<_afbbe ;if _bbbcf {_fccg =_aagd (_fccg ,_ccgdf .Data [_cabfg +1]>>_gdag ,_bccc );
|
|
};}else {_fccg =_ccgdf .Data [_cabfg ]>>_gdag ;};_edc .Data [_bcbf ]=_aagd (_edc .Data [_bcbf ],_fccg &^_edc .Data [_bcbf ],_abcg );_bcbf +=_edc .RowStride ;_cabfg +=_ccgdf .RowStride ;};};if _gbef {for _eaad =0;_eaad < _baae ;_eaad ++{for _gceaa =0;_gceaa < _ageg ;
|
|
_gceaa ++{_fccg =_aagd (_ccgdf .Data [_bfbc +_gceaa ]<<_afbbe ,_ccgdf .Data [_bfbc +_gceaa +1]>>_gdag ,_bccc );_edc .Data [_gcfa +_gceaa ]=_fccg &^_edc .Data [_gcfa +_gceaa ];};_gcfa +=_edc .RowStride ;_bfbc +=_ccgdf .RowStride ;};};if _abcfb {for _eaad =0;
|
|
_eaad < _baae ;_eaad ++{_fccg =_ccgdf .Data [_dcfb ]<<_afbbe ;if _bbaa {_fccg =_aagd (_fccg ,_ccgdf .Data [_dcfb +1]>>_gdag ,_bccc );};_edc .Data [_dcbf ]=_aagd (_edc .Data [_dcbf ],_fccg &^_edc .Data [_dcbf ],_caecd );_dcbf +=_edc .RowStride ;_dcfb +=_ccgdf .RowStride ;
|
|
};};case PixNotPixSrcOrDst :if _bbaba {for _eaad =0;_eaad < _baae ;_eaad ++{if _gaaa ==_ggae {_fccg =_ccgdf .Data [_cabfg ]<<_afbbe ;if _bbbcf {_fccg =_aagd (_fccg ,_ccgdf .Data [_cabfg +1]>>_gdag ,_bccc );};}else {_fccg =_ccgdf .Data [_cabfg ]>>_gdag ;
|
|
};_edc .Data [_bcbf ]=_aagd (_edc .Data [_bcbf ],^(_fccg |_edc .Data [_bcbf ]),_abcg );_bcbf +=_edc .RowStride ;_cabfg +=_ccgdf .RowStride ;};};if _gbef {for _eaad =0;_eaad < _baae ;_eaad ++{for _gceaa =0;_gceaa < _ageg ;_gceaa ++{_fccg =_aagd (_ccgdf .Data [_bfbc +_gceaa ]<<_afbbe ,_ccgdf .Data [_bfbc +_gceaa +1]>>_gdag ,_bccc );
|
|
_edc .Data [_gcfa +_gceaa ]=^(_fccg |_edc .Data [_gcfa +_gceaa ]);};_gcfa +=_edc .RowStride ;_bfbc +=_ccgdf .RowStride ;};};if _abcfb {for _eaad =0;_eaad < _baae ;_eaad ++{_fccg =_ccgdf .Data [_dcfb ]<<_afbbe ;if _bbaa {_fccg =_aagd (_fccg ,_ccgdf .Data [_dcfb +1]>>_gdag ,_bccc );
|
|
};_edc .Data [_dcbf ]=_aagd (_edc .Data [_dcbf ],^(_fccg |_edc .Data [_dcbf ]),_caecd );_dcbf +=_edc .RowStride ;_dcfb +=_ccgdf .RowStride ;};};case PixNotPixSrcAndDst :if _bbaba {for _eaad =0;_eaad < _baae ;_eaad ++{if _gaaa ==_ggae {_fccg =_ccgdf .Data [_cabfg ]<<_afbbe ;
|
|
if _bbbcf {_fccg =_aagd (_fccg ,_ccgdf .Data [_cabfg +1]>>_gdag ,_bccc );};}else {_fccg =_ccgdf .Data [_cabfg ]>>_gdag ;};_edc .Data [_bcbf ]=_aagd (_edc .Data [_bcbf ],^(_fccg &_edc .Data [_bcbf ]),_abcg );_bcbf +=_edc .RowStride ;_cabfg +=_ccgdf .RowStride ;
|
|
};};if _gbef {for _eaad =0;_eaad < _baae ;_eaad ++{for _gceaa =0;_gceaa < _ageg ;_gceaa ++{_fccg =_aagd (_ccgdf .Data [_bfbc +_gceaa ]<<_afbbe ,_ccgdf .Data [_bfbc +_gceaa +1]>>_gdag ,_bccc );_edc .Data [_gcfa +_gceaa ]=^(_fccg &_edc .Data [_gcfa +_gceaa ]);
|
|
};_gcfa +=_edc .RowStride ;_bfbc +=_ccgdf .RowStride ;};};if _abcfb {for _eaad =0;_eaad < _baae ;_eaad ++{_fccg =_ccgdf .Data [_dcfb ]<<_afbbe ;if _bbaa {_fccg =_aagd (_fccg ,_ccgdf .Data [_dcfb +1]>>_gdag ,_bccc );};_edc .Data [_dcbf ]=_aagd (_edc .Data [_dcbf ],^(_fccg &_edc .Data [_dcbf ]),_caecd );
|
|
_dcbf +=_edc .RowStride ;_dcfb +=_ccgdf .RowStride ;};};case PixNotPixSrcXorDst :if _bbaba {for _eaad =0;_eaad < _baae ;_eaad ++{if _gaaa ==_ggae {_fccg =_ccgdf .Data [_cabfg ]<<_afbbe ;if _bbbcf {_fccg =_aagd (_fccg ,_ccgdf .Data [_cabfg +1]>>_gdag ,_bccc );
|
|
};}else {_fccg =_ccgdf .Data [_cabfg ]>>_gdag ;};_edc .Data [_bcbf ]=_aagd (_edc .Data [_bcbf ],^(_fccg ^_edc .Data [_bcbf ]),_abcg );_bcbf +=_edc .RowStride ;_cabfg +=_ccgdf .RowStride ;};};if _gbef {for _eaad =0;_eaad < _baae ;_eaad ++{for _gceaa =0;
|
|
_gceaa < _ageg ;_gceaa ++{_fccg =_aagd (_ccgdf .Data [_bfbc +_gceaa ]<<_afbbe ,_ccgdf .Data [_bfbc +_gceaa +1]>>_gdag ,_bccc );_edc .Data [_gcfa +_gceaa ]=^(_fccg ^_edc .Data [_gcfa +_gceaa ]);};_gcfa +=_edc .RowStride ;_bfbc +=_ccgdf .RowStride ;};};if _abcfb {for _eaad =0;
|
|
_eaad < _baae ;_eaad ++{_fccg =_ccgdf .Data [_dcfb ]<<_afbbe ;if _bbaa {_fccg =_aagd (_fccg ,_ccgdf .Data [_dcfb +1]>>_gdag ,_bccc );};_edc .Data [_dcbf ]=_aagd (_edc .Data [_dcbf ],^(_fccg ^_edc .Data [_dcbf ]),_caecd );_dcbf +=_edc .RowStride ;_dcfb +=_ccgdf .RowStride ;
|
|
};};default:_gb .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",_fgbf );return _d .Error ("\u0072a\u0073t\u0065\u0072\u004f\u0070\u0047e\u006e\u0065r\u0061\u006c\u004c\u006f\u0077","\u0072\u0061\u0073\u0074\u0065\u0072\u0020\u006f\u0070\u0065r\u0061\u0074\u0069\u006f\u006e\u0020\u006eo\u0074\u0020\u0070\u0065\u0072\u006d\u0069\u0074\u0074\u0065\u0064");
|
|
};return nil ;};func _cgb (_aa ,_cde *Bitmap )(_bgf error ){const _fd ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0038";_eege :=_cde .RowStride ;_de :=_aa .RowStride ;var _aab ,_ge ,_cgag ,_fdg ,_ege int ;
|
|
for _cgag =0;_cgag < _cde .Height ;_cgag ++{_aab =_cgag *_eege ;_ge =8*_cgag *_de ;for _fdg =0;_fdg < _eege ;_fdg ++{if _bgf =_aa .setEightBytes (_ge +_fdg *8,_egec [_cde .Data [_aab +_fdg ]]);_bgf !=nil {return _d .Wrap (_bgf ,_fd ,"");};};for _ege =1;
|
|
_ege < 8;_ege ++{for _fdg =0;_fdg < _de ;_fdg ++{if _bgf =_aa .SetByte (_ge +_ege *_de +_fdg ,_aa .Data [_ge +_fdg ]);_bgf !=nil {return _d .Wrap (_bgf ,_fd ,"");};};};};return nil ;};func _ged ()(_dgab []byte ){_dgab =make ([]byte ,256);for _aef :=0;_aef < 256;
|
|
_aef ++{_cbc :=byte (_aef );_dgab [_cbc ]=(_cbc &0x01)|((_cbc &0x04)>>1)|((_cbc &0x10)>>2)|((_cbc &0x40)>>3)|((_cbc &0x02)<<3)|((_cbc &0x08)<<2)|((_cbc &0x20)<<1)|(_cbc &0x80);};return _dgab ;};func (_bgdgf *ClassedPoints )Swap (i ,j int ){_bgdgf .IntSlice [i ],_bgdgf .IntSlice [j ]=_bgdgf .IntSlice [j ],_bgdgf .IntSlice [i ];
|
|
};func NewWithData (width ,height int ,data []byte )(*Bitmap ,error ){const _bca ="N\u0065\u0077\u0057\u0069\u0074\u0068\u0044\u0061\u0074\u0061";_facg :=_egd (width ,height );_facg .Data =data ;if len (data )< height *_facg .RowStride {return nil ,_d .Errorf (_bca ,"\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 *_facg .RowStride );
|
|
};return _facg ,nil ;};func (_gaef *Bitmap )AddBorder (borderSize ,val int )(*Bitmap ,error ){if borderSize ==0{return _gaef .Copy (),nil ;};_eaf ,_fab :=_gaef .addBorderGeneral (borderSize ,borderSize ,borderSize ,borderSize ,val );if _fab !=nil {return nil ,_d .Wrap (_fab ,"\u0041d\u0064\u0042\u006f\u0072\u0064\u0065r","");
|
|
};return _eaf ,nil ;};func _bced (_aada *Bitmap ,_ceed *Bitmap ,_aaab *Selection )(*Bitmap ,error ){var (_feac *Bitmap ;_dcdb error ;);_aada ,_dcdb =_dcdfa (_aada ,_ceed ,_aaab ,&_feac );if _dcdb !=nil {return nil ,_dcdb ;};if _dcdb =_aada .clearAll ();
|
|
_dcdb !=nil {return nil ,_dcdb ;};var _ecgg SelectionValue ;for _cagc :=0;_cagc < _aaab .Height ;_cagc ++{for _afdb :=0;_afdb < _aaab .Width ;_afdb ++{_ecgg =_aaab .Data [_cagc ][_afdb ];if _ecgg ==SelHit {if _dcdb =_aada .RasterOperation (_afdb -_aaab .Cx ,_cagc -_aaab .Cy ,_ceed .Width ,_ceed .Height ,PixSrcOrDst ,_feac ,0,0);
|
|
_dcdb !=nil {return nil ,_dcdb ;};};};};return _aada ,nil ;};func (_dbb *Bitmap )SetPixel (x ,y int ,pixel byte )error {_fbfg :=_dbb .GetByteIndex (x ,y );if _fbfg > len (_dbb .Data )-1{return _d .Errorf ("\u0053\u0065\u0074\u0050\u0069\u0078\u0065\u006c","\u0069\u006e\u0064\u0065x \u006f\u0075\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u003a\u0020%\u0064",_fbfg );
|
|
};_fdgg :=_dbb .GetBitOffset (x );_bdfb :=uint (7-_fdgg );_gbd :=_dbb .Data [_fbfg ];var _efe byte ;if pixel ==1{_efe =_gbd |(pixel &0x01<<_bdfb );}else {_efe =_gbd &^(1<<_bdfb );};_dbb .Data [_fbfg ]=_efe ;return nil ;};func init (){const _aeda ="\u0062\u0069\u0074\u006dap\u0073\u002e\u0069\u006e\u0069\u0074\u0069\u0061\u006c\u0069\u007a\u0061\u0074\u0069o\u006e";
|
|
_afce =New (50,40);var _geba error ;_afce ,_geba =_afce .AddBorder (2,1);if _geba !=nil {panic (_d .Wrap (_geba ,_aeda ,"f\u0072\u0061\u006d\u0065\u0042\u0069\u0074\u006d\u0061\u0070"));};_cccb ,_geba =NewWithData (50,22,_ddad );if _geba !=nil {panic (_d .Wrap (_geba ,_aeda ,"i\u006d\u0061\u0067\u0065\u0042\u0069\u0074\u006d\u0061\u0070"));
|
|
};};func _fdb (_fde *Bitmap ,_cad ...int )(_eae *Bitmap ,_eged error ){const _ecc ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0043\u0061\u0073\u0063\u0061\u0064\u0065";if _fde ==nil {return nil ,_d .Error (_ecc ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");
|
|
};if len (_cad )==0||len (_cad )> 4{return nil ,_d .Error (_ecc ,"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 _cad [0]<=0{_gb .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");_eae ,_eged =_eebad (nil ,_fde );if _eged !=nil {return nil ,_d .Wrap (_eged ,_ecc ,"l\u0065\u0076\u0065\u006c\u0031\u0020\u003c\u003d\u0020\u0030");
|
|
};return _eae ,nil ;};_ecd :=_ged ();_eae =_fde ;for _bgc ,_bbc :=range _cad {if _bbc <=0{break ;};_eae ,_eged =_aac (_eae ,_bbc ,_ecd );if _eged !=nil {return nil ,_d .Wrapf (_eged ,_ecc ,"\u006c\u0065\u0076\u0065\u006c\u0025\u0064\u0020\u0072\u0065\u0064\u0075c\u0074\u0069\u006f\u006e",_bgc );
|
|
};};return _eae ,nil ;};func TstASymbol (t *_e .T )*Bitmap {t .Helper ();_fbag :=New (6,6);_df .NoError (t ,_fbag .SetPixel (1,0,1));_df .NoError (t ,_fbag .SetPixel (2,0,1));_df .NoError (t ,_fbag .SetPixel (3,0,1));_df .NoError (t ,_fbag .SetPixel (4,0,1));
|
|
_df .NoError (t ,_fbag .SetPixel (5,1,1));_df .NoError (t ,_fbag .SetPixel (1,2,1));_df .NoError (t ,_fbag .SetPixel (2,2,1));_df .NoError (t ,_fbag .SetPixel (3,2,1));_df .NoError (t ,_fbag .SetPixel (4,2,1));_df .NoError (t ,_fbag .SetPixel (5,2,1));
|
|
_df .NoError (t ,_fbag .SetPixel (0,3,1));_df .NoError (t ,_fbag .SetPixel (5,3,1));_df .NoError (t ,_fbag .SetPixel (0,4,1));_df .NoError (t ,_fbag .SetPixel (5,4,1));_df .NoError (t ,_fbag .SetPixel (1,5,1));_df .NoError (t ,_fbag .SetPixel (2,5,1));
|
|
_df .NoError (t ,_fbag .SetPixel (3,5,1));_df .NoError (t ,_fbag .SetPixel (4,5,1));_df .NoError (t ,_fbag .SetPixel (5,5,1));return _fbag ;};func (_bdbfc *Bitmaps )WidthSorter ()func (_afcg ,_cbgg int )bool {return func (_gbdb ,_gggcc int )bool {return _bdbfc .Values [_gbdb ].Width < _bdbfc .Values [_gggcc ].Width };
|
|
};func HausTest (p1 ,p2 ,p3 ,p4 *Bitmap ,delX ,delY float32 ,maxDiffW ,maxDiffH int )(bool ,error ){const _fcgd ="\u0048\u0061\u0075\u0073\u0054\u0065\u0073\u0074";_geef ,_cacg :=p1 .Width ,p1 .Height ;_cdbe ,_caaa :=p3 .Width ,p3 .Height ;if _g .Abs (_geef -_cdbe )> maxDiffW {return false ,nil ;
|
|
};if _g .Abs (_cacg -_caaa )> maxDiffH {return false ,nil ;};_aeac :=int (delX +_g .Sign (delX )*0.5);_dfcf :=int (delY +_g .Sign (delY )*0.5);var _gcea error ;_cdaf :=p1 .CreateTemplate ();if _gcea =_cdaf .RasterOperation (0,0,_geef ,_cacg ,PixSrc ,p1 ,0,0);
|
|
_gcea !=nil {return false ,_d .Wrap (_gcea ,_fcgd ,"p\u0031\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _gcea =_cdaf .RasterOperation (_aeac ,_dfcf ,_geef ,_cacg ,PixNotSrcAndDst ,p4 ,0,0);_gcea !=nil {return false ,_d .Wrap (_gcea ,_fcgd ,"\u0021p\u0034\u0020\u0026\u0020\u0074");
|
|
};if _cdaf .Zero (){return false ,nil ;};if _gcea =_cdaf .RasterOperation (_aeac ,_dfcf ,_cdbe ,_caaa ,PixSrc ,p3 ,0,0);_gcea !=nil {return false ,_d .Wrap (_gcea ,_fcgd ,"p\u0033\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _gcea =_cdaf .RasterOperation (0,0,_cdbe ,_caaa ,PixNotSrcAndDst ,p2 ,0,0);
|
|
_gcea !=nil {return false ,_d .Wrap (_gcea ,_fcgd ,"\u0021p\u0032\u0020\u0026\u0020\u0074");};return _cdaf .Zero (),nil ;};func _eebad (_dge ,_fed *Bitmap )(*Bitmap ,error ){if _fed ==nil {return nil ,_d .Error ("\u0063\u006f\u0070\u0079\u0042\u0069\u0074\u006d\u0061\u0070","\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if _fed ==_dge {return _dge ,nil ;};if _dge ==nil {_dge =_fed .createTemplate ();copy (_dge .Data ,_fed .Data );return _dge ,nil ;};_dgae :=_dge .resizeImageData (_fed );if _dgae !=nil {return nil ,_d .Wrap (_dgae ,"\u0063\u006f\u0070\u0079\u0042\u0069\u0074\u006d\u0061\u0070","");
|
|
};_dge .Text =_fed .Text ;copy (_dge .Data ,_fed .Data );return _dge ,nil ;};func (_gege *Bitmaps )ClipToBitmap (s *Bitmap )(*Bitmaps ,error ){const _decbb ="B\u0069t\u006d\u0061\u0070\u0073\u002e\u0043\u006c\u0069p\u0054\u006f\u0042\u0069tm\u0061\u0070";
|
|
if _gege ==nil {return nil ,_d .Error (_decbb ,"\u0042\u0069\u0074\u006dap\u0073\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};if s ==nil {return nil ,_d .Error (_decbb ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");
|
|
};_bagee :=len (_gege .Values );_bgcg :=&Bitmaps {Values :make ([]*Bitmap ,_bagee ),Boxes :make ([]*_ba .Rectangle ,_bagee )};var (_fccge ,_ggbe *Bitmap ;_bbgf *_ba .Rectangle ;_fbfd error ;);for _degcf :=0;_degcf < _bagee ;_degcf ++{if _fccge ,_fbfd =_gege .GetBitmap (_degcf );
|
|
_fbfd !=nil {return nil ,_d .Wrap (_fbfd ,_decbb ,"");};if _bbgf ,_fbfd =_gege .GetBox (_degcf );_fbfd !=nil {return nil ,_d .Wrap (_fbfd ,_decbb ,"");};if _ggbe ,_fbfd =s .clipRectangle (_bbgf ,nil );_fbfd !=nil {return nil ,_d .Wrap (_fbfd ,_decbb ,"");
|
|
};if _ggbe ,_fbfd =_ggbe .And (_fccge );_fbfd !=nil {return nil ,_d .Wrap (_fbfd ,_decbb ,"");};_bgcg .Values [_degcf ]=_ggbe ;_bgcg .Boxes [_degcf ]=_bbgf ;};return _bgcg ,nil ;};func (_cab *Bitmap )GetBitOffset (x int )int {return x &0x07};func (_cfbe Points )Get (i int )(Point ,error ){if i > len (_cfbe )-1{return Point {},_d .Errorf ("\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0065\u0074","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
};return _cfbe [i ],nil ;};func (_feab *byWidth )Swap (i ,j int ){_feab .Values [i ],_feab .Values [j ]=_feab .Values [j ],_feab .Values [i ];if _feab .Boxes !=nil {_feab .Boxes [i ],_feab .Boxes [j ]=_feab .Boxes [j ],_feab .Boxes [i ];};};func _bcd (_dfaa ,_dbea *Bitmap ,_fdeg ,_gdbf ,_ffag ,_efaf ,_ebda ,_ccc ,_gcfc ,_aeb int ,_abcfg CombinationOperator )error {var _bcdc int ;
|
|
_bcba :=func (){_bcdc ++;_ffag +=_dbea .RowStride ;_efaf +=_dfaa .RowStride ;_ebda +=_dfaa .RowStride };for _bcdc =_fdeg ;_bcdc < _gdbf ;_bcba (){var _befe uint16 ;_adgd :=_ffag ;for _ebdc :=_efaf ;_ebdc <=_ebda ;_ebdc ++{_ffage ,_fae :=_dbea .GetByte (_adgd );
|
|
if _fae !=nil {return _fae ;};_bbgc ,_fae :=_dfaa .GetByte (_ebdc );if _fae !=nil {return _fae ;};_befe =(_befe |uint16 (_bbgc ))<<uint (_aeb );_bbgc =byte (_befe >>8);if _ebdc ==_ebda {_bbgc =_aecdc (uint (_ccc ),_bbgc );};if _fae =_dbea .SetByte (_adgd ,_ebbd (_ffage ,_bbgc ,_abcfg ));
|
|
_fae !=nil {return _fae ;};_adgd ++;_befe <<=uint (_gcfc );};};return nil ;};const (ComponentConn Component =iota ;ComponentCharacters ;ComponentWords ;);func MorphSequence (src *Bitmap ,sequence ...MorphProcess )(*Bitmap ,error ){return _bcdd (src ,sequence ...);
|
|
};func TstDSymbol (t *_e .T ,scale ...int )*Bitmap {_cdbbg ,_bdgf :=NewWithData (4,5,[]byte {0xf0,0x90,0x90,0x90,0xE0});_df .NoError (t ,_bdgf );return TstGetScaledSymbol (t ,_cdbbg ,scale ...);};func _bfcf ()[]int {_aaff :=make ([]int ,256);for _ffda :=0;
|
|
_ffda <=0xff;_ffda ++{_cfee :=byte (_ffda );_aaff [_cfee ]=int (_cfee &0x1)+(int (_cfee >>1)&0x1)+(int (_cfee >>2)&0x1)+(int (_cfee >>3)&0x1)+(int (_cfee >>4)&0x1)+(int (_cfee >>5)&0x1)+(int (_cfee >>6)&0x1)+(int (_cfee >>7)&0x1);};return _aaff ;};func (_dedc *Bitmaps )CountPixels ()*_g .NumSlice {_afcd :=&_g .NumSlice {};
|
|
for _ ,_bdcf :=range _dedc .Values {_afcd .AddInt (_bdcf .CountPixels ());};return _afcd ;};func (_bafg *Bitmaps )SortByHeight (){_bdccd :=(*byHeight )(_bafg );_b .Sort (_bdccd )};func _ee (_fb ,_ea *Bitmap )(_ffg error ){const _dg ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0032";
|
|
_fc :=_ea .RowStride ;_cg :=_fb .RowStride ;var (_a byte ;_cgd uint16 ;_eea ,_cga ,_be ,_cgab ,_ce int ;);for _be =0;_be < _ea .Height ;_be ++{_eea =_be *_fc ;_cga =2*_be *_cg ;for _cgab =0;_cgab < _fc ;_cgab ++{_a =_ea .Data [_eea +_cgab ];_cgd =_caeb [_a ];
|
|
_ce =_cga +_cgab *2;if _fb .RowStride !=_ea .RowStride *2&&(_cgab +1)*2> _fb .RowStride {_ffg =_fb .SetByte (_ce ,byte (_cgd >>8));}else {_ffg =_fb .setTwoBytes (_ce ,_cgd );};if _ffg !=nil {return _d .Wrap (_ffg ,_dg ,"");};};for _cgab =0;_cgab < _cg ;
|
|
_cgab ++{_ce =_cga +_cg +_cgab ;_a =_fb .Data [_cga +_cgab ];if _ffg =_fb .SetByte (_ce ,_a );_ffg !=nil {return _d .Wrapf (_ffg ,_dg ,"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",_cga +_cgab ,_cga +_cg +_cgab );
|
|
};};};return nil ;};func (_bec *Bitmap )GetByteIndex (x ,y int )int {return y *_bec .RowStride +(x >>3)};const (AsymmetricMorphBC BoundaryCondition =iota ;SymmetricMorphBC ;);func (_fef *Bitmap )nextOnPixel (_gdab ,_eeee int )(_bggf _ba .Point ,_gbba bool ,_bbg error ){const _dea ="n\u0065\u0078\u0074\u004f\u006e\u0050\u0069\u0078\u0065\u006c";
|
|
_bggf ,_gbba ,_bbg =_fef .nextOnPixelLow (_fef .Width ,_fef .Height ,_fef .RowStride ,_gdab ,_eeee );if _bbg !=nil {return _bggf ,false ,_d .Wrap (_bbg ,_dea ,"");};return _bggf ,_gbba ,nil ;};type SelectionValue int ;func (_fgba *ClassedPoints )GetIntYByClass (i int )(int ,error ){const _adce ="\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 >=_fgba .IntSlice .Size (){return 0,_d .Errorf (_adce ,"\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 (_fgba .YAtIndex (i )),nil ;}; |