2020-08-27 21:45:09 +00:00
|
|
|
//
|
|
|
|
// 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/
|
|
|
|
|
2023-03-01 18:45:57 +00:00
|
|
|
package bitmap ;import (_d "encoding/binary";_g "github.com/stretchr/testify/require";_fd "github.com/unidoc/unipdf/v3/common";_b "github.com/unidoc/unipdf/v3/internal/bitwise";_f "github.com/unidoc/unipdf/v3/internal/imageutil";_ed "github.com/unidoc/unipdf/v3/internal/jbig2/basic";
|
|
|
|
_a "github.com/unidoc/unipdf/v3/internal/jbig2/errors";_cc "image";_ba "math";_ge "sort";_e "strings";_ag "testing";);const (_ SizeSelection =iota ;SizeSelectByWidth ;SizeSelectByHeight ;SizeSelectByMaxDimension ;SizeSelectByArea ;SizeSelectByPerimeter ;
|
|
|
|
);func (_fdb *Bitmap )thresholdPixelSum (_daba int )bool {var (_eafa int ;_bcaf uint8 ;_fff byte ;_efcc int ;);_cadb :=_fdb .RowStride ;_fee :=uint (_fdb .Width &0x07);if _fee !=0{_bcaf =uint8 ((0xff<<(8-_fee ))&0xff);_cadb --;};for _gffa :=0;_gffa < _fdb .Height ;
|
|
|
|
_gffa ++{for _efcc =0;_efcc < _cadb ;_efcc ++{_fff =_fdb .Data [_gffa *_fdb .RowStride +_efcc ];_eafa +=int (_bgb [_fff ]);};if _fee !=0{_fff =_fdb .Data [_gffa *_fdb .RowStride +_efcc ]&_bcaf ;_eafa +=int (_bgb [_fff ]);};if _eafa > _daba {return true ;
|
|
|
|
};};return false ;};func (_dcfd *Bitmap )setAll ()error {_ggcf :=_cafd (_dcfd ,0,0,_dcfd .Width ,_dcfd .Height ,PixSet ,nil ,0,0);if _ggcf !=nil {return _a .Wrap (_ggcf ,"\u0073\u0065\u0074\u0041\u006c\u006c","");};return nil ;};func (_ggfe *ClassedPoints )SortByY (){_ggfe ._dagg =_ggfe .ySortFunction ();
|
|
|
|
_ge .Sort (_ggfe )};func (_ddb *Bitmap )clearAll ()error {return _ddb .RasterOperation (0,0,_ddb .Width ,_ddb .Height ,PixClr ,nil ,0,0);};func (_gggd *Bitmaps )HeightSorter ()func (_gegcd ,_cbfc int )bool {return func (_dfgb ,_gdgc int )bool {_adca :=_gggd .Values [_dfgb ].Height < _gggd .Values [_gdgc ].Height ;
|
|
|
|
_fd .Log .Debug ("H\u0065i\u0067\u0068\u0074\u003a\u0020\u0025\u0076\u0020<\u0020\u0025\u0076\u0020= \u0025\u0076",_gggd .Values [_dfgb ].Height ,_gggd .Values [_gdgc ].Height ,_adca );return _adca ;};};func _gg (_cac ,_cce *Bitmap ,_ecc int ,_ccdf []byte ,_gcf int )(_bd error ){const _aae ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0033";
|
|
|
|
var (_ccbc ,_fcgf ,_eagd ,_ffb ,_daf ,_ege ,_dbg ,_adda int ;_cef ,_ggd ,_gef ,_age uint32 ;_gbg ,_gcc byte ;_eccc uint16 ;);_bfg :=make ([]byte ,4);_fed :=make ([]byte ,4);for _eagd =0;_eagd < _cac .Height -1;_eagd ,_ffb =_eagd +2,_ffb +1{_ccbc =_eagd *_cac .RowStride ;
|
|
|
|
_fcgf =_ffb *_cce .RowStride ;for _daf ,_ege =0,0;_daf < _gcf ;_daf ,_ege =_daf +4,_ege +1{for _dbg =0;_dbg < 4;_dbg ++{_adda =_ccbc +_daf +_dbg ;if _adda <=len (_cac .Data )-1&&_adda < _ccbc +_cac .RowStride {_bfg [_dbg ]=_cac .Data [_adda ];}else {_bfg [_dbg ]=0x00;
|
|
|
|
};_adda =_ccbc +_cac .RowStride +_daf +_dbg ;if _adda <=len (_cac .Data )-1&&_adda < _ccbc +(2*_cac .RowStride ){_fed [_dbg ]=_cac .Data [_adda ];}else {_fed [_dbg ]=0x00;};};_cef =_d .BigEndian .Uint32 (_bfg );_ggd =_d .BigEndian .Uint32 (_fed );_gef =_cef &_ggd ;
|
|
|
|
_gef |=_gef <<1;_age =_cef |_ggd ;_age &=_age <<1;_ggd =_gef &_age ;_ggd &=0xaaaaaaaa;_cef =_ggd |(_ggd <<7);_gbg =byte (_cef >>24);_gcc =byte ((_cef >>8)&0xff);_adda =_fcgf +_ege ;if _adda +1==len (_cce .Data )-1||_adda +1>=_fcgf +_cce .RowStride {if _bd =_cce .SetByte (_adda ,_ccdf [_gbg ]);
|
|
|
|
_bd !=nil {return _a .Wrapf (_bd ,_aae ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_adda );};}else {_eccc =(uint16 (_ccdf [_gbg ])<<8)|uint16 (_ccdf [_gcc ]);if _bd =_cce .setTwoBytes (_adda ,_eccc );_bd !=nil {return _a .Wrapf (_bd ,_aae ,"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",_adda );
|
|
|
|
};_ege ++;};};};return nil ;};func (_gbdde *Selection )setOrigin (_cfeb ,_cagf int ){_gbdde .Cy ,_gbdde .Cx =_cfeb ,_cagf };func (_afea *Bitmap )SetPadBits (value int ){_afea .setPadBits (value )};func _bfcc (_cgcg ,_bdec *Bitmap ,_ddc ,_efef ,_ggef ,_efga ,_fege ,_edfge ,_adff ,_fgga int ,_bbg CombinationOperator )error {var _geag int ;
|
|
|
|
_aebb :=func (){_geag ++;_ggef +=_bdec .RowStride ;_efga +=_cgcg .RowStride ;_fege +=_cgcg .RowStride };for _geag =_ddc ;_geag < _efef ;_aebb (){var _aff uint16 ;_cbgbc :=_ggef ;for _cfb :=_efga ;_cfb <=_fege ;_cfb ++{_cbga ,_adeb :=_bdec .GetByte (_cbgbc );
|
|
|
|
if _adeb !=nil {return _adeb ;};_efcg ,_adeb :=_cgcg .GetByte (_cfb );if _adeb !=nil {return _adeb ;};_aff =(_aff |uint16 (_efcg ))<<uint (_fgga );_efcg =byte (_aff >>8);if _cfb ==_fege {_efcg =_bgg (uint (_edfge ),_efcg );};if _adeb =_bdec .SetByte (_cbgbc ,_eefa (_cbga ,_efcg ,_bbg ));
|
|
|
|
_adeb !=nil {return _adeb ;};_cbgbc ++;_aff <<=uint (_adff );};};return nil ;};func (_cea *Bitmap )countPixels ()int {var (_agb int ;_dgb uint8 ;_aadc byte ;_bfga int ;);_dge :=_cea .RowStride ;_caf :=uint (_cea .Width &0x07);if _caf !=0{_dgb =uint8 ((0xff<<(8-_caf ))&0xff);
|
|
|
|
_dge --;};for _cgfb :=0;_cgfb < _cea .Height ;_cgfb ++{for _bfga =0;_bfga < _dge ;_bfga ++{_aadc =_cea .Data [_cgfb *_cea .RowStride +_bfga ];_agb +=int (_bgb [_aadc ]);};if _caf !=0{_agb +=int (_bgb [_cea .Data [_cgfb *_cea .RowStride +_bfga ]&_dgb ]);
|
|
|
|
};};return _agb ;};func (_ace *Bitmap )resizeImageData (_fedd *Bitmap )error {if _fedd ==nil {return _a .Error ("\u0072e\u0073i\u007a\u0065\u0049\u006d\u0061\u0067\u0065\u0044\u0061\u0074\u0061","\u0073r\u0063 \u0069\u0073\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
|
|
};if _ace .SizesEqual (_fedd ){return nil ;};_ace .Data =make ([]byte ,len (_fedd .Data ));_ace .Width =_fedd .Width ;_ace .Height =_fedd .Height ;_ace .RowStride =_fedd .RowStride ;return nil ;};func (_cfga *ClassedPoints )SortByX (){_cfga ._dagg =_cfga .xSortFunction ();
|
|
|
|
_ge .Sort (_cfga )};func (_bbcc *Bitmap )CreateTemplate ()*Bitmap {return _bbcc .createTemplate ()};func (_ebb *Bitmap )setEightPartlyBytes (_gfeff ,_gcg int ,_bafa uint64 )(_gaa error ){var (_eaea byte ;_ccaf int ;);const _ggdg ="\u0073\u0065\u0074\u0045ig\u0068\u0074\u0050\u0061\u0072\u0074\u006c\u0079\u0042\u0079\u0074\u0065\u0073";
|
|
|
|
for _aefg :=1;_aefg <=_gcg ;_aefg ++{_ccaf =64-_aefg *8;_eaea =byte (_bafa >>uint (_ccaf )&0xff);_fd .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",_eaea ,_gfeff ,_gfeff +_aefg -1,_gcg ,_ccaf );
|
|
|
|
if _gaa =_ebb .SetByte (_gfeff +_aefg -1,_eaea );_gaa !=nil {return _a .Wrap (_gaa ,_ggdg ,"\u0066\u0075\u006c\u006c\u0042\u0079\u0074\u0065");};};_bbcb :=_ebb .RowStride *8-_ebb .Width ;if _bbcb ==0{return nil ;};_ccaf -=8;_eaea =byte (_bafa >>uint (_ccaf )&0xff)<<uint (_bbcb );
|
|
|
|
if _gaa =_ebb .SetByte (_gfeff +_gcg ,_eaea );_gaa !=nil {return _a .Wrap (_gaa ,_ggdg ,"\u0070\u0061\u0064\u0064\u0065\u0064");};return nil ;};type fillSegment struct{_cbbb int ;_bcdc int ;_adfa int ;_fgdd int ;};func _aaaa (_dfcg *Bitmap ,_cadg *_ed .Stack ,_gabg ,_ffac int )(_gaefb *_cc .Rectangle ,_bege error ){const _bbce ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";
|
|
|
|
if _dfcg ==nil {return nil ,_a .Error (_bbce ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");};if _cadg ==nil {return nil ,_a .Error (_bbce ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");
|
|
|
|
};_cdcc ,_egegd :=_dfcg .Width ,_dfcg .Height ;_ddbg :=_cdcc -1;_dbaa :=_egegd -1;if _gabg < 0||_gabg > _ddbg ||_ffac < 0||_ffac > _dbaa ||!_dfcg .GetPixel (_gabg ,_ffac ){return nil ,nil ;};_ddag :=_cc .Rect (100000,100000,0,0);if _bege =_ccad (_cadg ,_gabg ,_gabg ,_ffac ,1,_dbaa ,&_ddag );
|
|
|
|
_bege !=nil {return nil ,_a .Wrap (_bege ,_bbce ,"\u0069\u006e\u0069t\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _bege =_ccad (_cadg ,_gabg ,_gabg ,_ffac +1,-1,_dbaa ,&_ddag );_bege !=nil {return nil ,_a .Wrap (_bege ,_bbce ,"\u0032\u006ed\u0020\u0069\u006ei\u0074\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");
|
|
|
|
};_ddag .Min .X ,_ddag .Max .X =_gabg ,_gabg ;_ddag .Min .Y ,_ddag .Max .Y =_ffac ,_ffac ;var (_bedab *fillSegment ;_feaff int ;);for _cadg .Len ()> 0{if _bedab ,_bege =_ffgb (_cadg );_bege !=nil {return nil ,_a .Wrap (_bege ,_bbce ,"");};_ffac =_bedab ._adfa ;
|
|
|
|
for _gabg =_bedab ._cbbb -1;_gabg >=0&&_dfcg .GetPixel (_gabg ,_ffac );_gabg --{if _bege =_dfcg .SetPixel (_gabg ,_ffac ,0);_bege !=nil {return nil ,_a .Wrap (_bege ,_bbce ,"\u0031s\u0074\u0020\u0073\u0065\u0074");};};if _gabg >=_bedab ._cbbb -1{for {for _gabg ++;
|
|
|
|
_gabg <=_bedab ._bcdc +1&&_gabg <=_ddbg &&!_dfcg .GetPixel (_gabg ,_ffac );_gabg ++{};_feaff =_gabg ;if !(_gabg <=_bedab ._bcdc +1&&_gabg <=_ddbg ){break ;};for ;_gabg <=_ddbg &&_dfcg .GetPixel (_gabg ,_ffac );_gabg ++{if _bege =_dfcg .SetPixel (_gabg ,_ffac ,0);
|
|
|
|
_bege !=nil {return nil ,_a .Wrap (_bege ,_bbce ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _bege =_ccad (_cadg ,_feaff ,_gabg -1,_bedab ._adfa ,_bedab ._fgdd ,_dbaa ,&_ddag );_bege !=nil {return nil ,_a .Wrap (_bege ,_bbce ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");
|
|
|
|
};if _gabg > _bedab ._bcdc {if _bege =_ccad (_cadg ,_bedab ._bcdc +1,_gabg -1,_bedab ._adfa ,-_bedab ._fgdd ,_dbaa ,&_ddag );_bege !=nil {return nil ,_a .Wrap (_bege ,_bbce ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");
|
|
|
|
};};};continue ;};_feaff =_gabg +1;if _feaff < _bedab ._cbbb {if _bege =_ccad (_cadg ,_feaff ,_bedab ._cbbb -1,_bedab ._adfa ,-_bedab ._fgdd ,_dbaa ,&_ddag );_bege !=nil {return nil ,_a .Wrap (_bege ,_bbce ,"\u006c\u0065\u0061\u006b\u0020\u006f\u006e\u0020\u006c\u0065\u0066\u0074 \u0073\u0069\u0064\u0065");
|
|
|
|
};};_gabg =_bedab ._cbbb ;for {for ;_gabg <=_ddbg &&_dfcg .GetPixel (_gabg ,_ffac );_gabg ++{if _bege =_dfcg .SetPixel (_gabg ,_ffac ,0);_bege !=nil {return nil ,_a .Wrap (_bege ,_bbce ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _bege =_ccad (_cadg ,_feaff ,_gabg -1,_bedab ._adfa ,_bedab ._fgdd ,_dbaa ,&_ddag );
|
|
|
|
_bege !=nil {return nil ,_a .Wrap (_bege ,_bbce ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _gabg > _bedab ._bcdc {if _bege =_ccad (_cadg ,_bedab ._bcdc +1,_gabg -1,_bedab ._adfa ,-_bedab ._fgdd ,_dbaa ,&_ddag );_bege !=nil {return nil ,_a .Wrap (_bege ,_bbce ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");
|
|
|
|
};};for _gabg ++;_gabg <=_bedab ._bcdc +1&&_gabg <=_ddbg &&!_dfcg .GetPixel (_gabg ,_ffac );_gabg ++{};_feaff =_gabg ;if !(_gabg <=_bedab ._bcdc +1&&_gabg <=_ddbg ){break ;};};};_ddag .Max .X ++;_ddag .Max .Y ++;return &_ddag ,nil ;};func init (){for _ggc :=0;
|
|
|
|
_ggc < 256;_ggc ++{_bgb [_ggc ]=uint8 (_ggc &0x1)+(uint8 (_ggc >>1)&0x1)+(uint8 (_ggc >>2)&0x1)+(uint8 (_ggc >>3)&0x1)+(uint8 (_ggc >>4)&0x1)+(uint8 (_ggc >>5)&0x1)+(uint8 (_ggc >>6)&0x1)+(uint8 (_ggc >>7)&0x1);};};func (_bccb *Bitmap )SetDefaultPixel (){for _aafb :=range _bccb .Data {_bccb .Data [_aafb ]=byte (0xff);
|
|
|
|
};};func _dbe (_gga ,_fcba *Bitmap ,_bec int ,_eda []byte ,_daa int )(_ecg error ){const _fga ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0034";var (_aaed ,_dafb ,_gfa ,_bg ,_gbb ,_afb ,_ded ,_dfgf int ;
|
|
|
|
_gdg ,_febg uint32 ;_gbd ,_cag byte ;_dagd uint16 ;);_cbb :=make ([]byte ,4);_geg :=make ([]byte ,4);for _gfa =0;_gfa < _gga .Height -1;_gfa ,_bg =_gfa +2,_bg +1{_aaed =_gfa *_gga .RowStride ;_dafb =_bg *_fcba .RowStride ;for _gbb ,_afb =0,0;_gbb < _daa ;
|
|
|
|
_gbb ,_afb =_gbb +4,_afb +1{for _ded =0;_ded < 4;_ded ++{_dfgf =_aaed +_gbb +_ded ;if _dfgf <=len (_gga .Data )-1&&_dfgf < _aaed +_gga .RowStride {_cbb [_ded ]=_gga .Data [_dfgf ];}else {_cbb [_ded ]=0x00;};_dfgf =_aaed +_gga .RowStride +_gbb +_ded ;if _dfgf <=len (_gga .Data )-1&&_dfgf < _aaed +(2*_gga .RowStride ){_geg [_ded ]=_gga .Data [_dfgf ];
|
|
|
|
}else {_geg [_ded ]=0x00;};};_gdg =_d .BigEndian .Uint32 (_cbb );_febg =_d .BigEndian .Uint32 (_geg );_febg &=_gdg ;_febg &=_febg <<1;_febg &=0xaaaaaaaa;_gdg =_febg |(_febg <<7);_gbd =byte (_gdg >>24);_cag =byte ((_gdg >>8)&0xff);_dfgf =_dafb +_afb ;if _dfgf +1==len (_fcba .Data )-1||_dfgf +1>=_dafb +_fcba .RowStride {_fcba .Data [_dfgf ]=_eda [_gbd ];
|
|
|
|
if _ecg =_fcba .SetByte (_dfgf ,_eda [_gbd ]);_ecg !=nil {return _a .Wrapf (_ecg ,_fga ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_dfgf );};}else {_dagd =(uint16 (_eda [_gbd ])<<8)|uint16 (_eda [_cag ]);if _ecg =_fcba .setTwoBytes (_dfgf ,_dagd );
|
|
|
|
_ecg !=nil {return _a .Wrapf (_ecg ,_fga ,"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",_dfgf );};_afb ++;};};
|
|
|
|
};return nil ;};func (_aaba *Bitmap )SetByte (index int ,v byte )error {if index > len (_aaba .Data )-1||index < 0{return _a .Errorf ("\u0053e\u0074\u0042\u0079\u0074\u0065","\u0069\u006e\u0064\u0065x \u006f\u0075\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u003a\u0020%\u0064",index );
|
|
|
|
};_aaba .Data [index ]=v ;return nil ;};func (_dfbe *Bitmap )setEightFullBytes (_eab int ,_gac uint64 )error {if _eab +7> len (_dfbe .Data )-1{return _a .Error ("\u0073\u0065\u0074\u0045\u0069\u0067\u0068\u0074\u0042\u0079\u0074\u0065\u0073","\u0069n\u0064e\u0078\u0020\u006f\u0075\u0074 \u006f\u0066 \u0072\u0061\u006e\u0067\u0065");
|
|
|
|
};_dfbe .Data [_eab ]=byte ((_gac &0xff00000000000000)>>56);_dfbe .Data [_eab +1]=byte ((_gac &0xff000000000000)>>48);_dfbe .Data [_eab +2]=byte ((_gac &0xff0000000000)>>40);_dfbe .Data [_eab +3]=byte ((_gac &0xff00000000)>>32);_dfbe .Data [_eab +4]=byte ((_gac &0xff000000)>>24);
|
|
|
|
_dfbe .Data [_eab +5]=byte ((_gac &0xff0000)>>16);_dfbe .Data [_eab +6]=byte ((_gac &0xff00)>>8);_dfbe .Data [_eab +7]=byte (_gac &0xff);return nil ;};func (_eb *Bitmap )GetBitOffset (x int )int {return x &0x07};func (_ageb *Bitmap )inverseData (){if _ccga :=_ageb .RasterOperation (0,0,_ageb .Width ,_ageb .Height ,PixNotDst ,nil ,0,0);
|
|
|
|
_ccga !=nil {_fd .Log .Debug ("\u0049n\u0076\u0065\u0072\u0073e\u0020\u0064\u0061\u0074\u0061 \u0066a\u0069l\u0065\u0064\u003a\u0020\u0027\u0025\u0076'",_ccga );};if _ageb .Color ==Chocolate {_ageb .Color =Vanilla ;}else {_ageb .Color =Chocolate ;};};type ClassedPoints struct{*Points ;
|
|
|
|
_ed .IntSlice ;_dagg func (_ccca ,_gfgb int )bool ;};func (_afec *Bitmap )connComponentsBitmapsBB (_afd *Bitmaps ,_afaaa int )(_gab *Boxes ,_bfee error ){const _eabf ="\u0063\u006f\u006enC\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074\u0073\u0042\u0069\u0074\u006d\u0061\u0070\u0073\u0042\u0042";
|
|
|
|
if _afaaa !=4&&_afaaa !=8{return nil ,_a .Error (_eabf ,"\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 _afd ==nil {return nil ,_a .Error (_eabf ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0042\u0069\u0074ma\u0070\u0073");
|
|
|
|
};if len (_afd .Values )> 0{return nil ,_a .Error (_eabf ,"\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 _afec .Zero (){return &Boxes {},nil ;};
|
|
|
|
var (_eeee ,_dcce ,_bcac ,_fgba *Bitmap ;);_afec .setPadBits (0);if _eeee ,_bfee =_gddf (nil ,_afec );_bfee !=nil {return nil ,_a .Wrap (_bfee ,_eabf ,"\u0062\u006d\u0031");};if _dcce ,_bfee =_gddf (nil ,_afec );_bfee !=nil {return nil ,_a .Wrap (_bfee ,_eabf ,"\u0062\u006d\u0032");
|
|
|
|
};_gfgf :=&_ed .Stack {};_gfgf .Aux =&_ed .Stack {};_gab =&Boxes {};var (_fafd ,_ebdg int ;_aagd _cc .Point ;_gccd bool ;_fef *_cc .Rectangle ;);for {if _aagd ,_gccd ,_bfee =_eeee .nextOnPixel (_fafd ,_ebdg );_bfee !=nil {return nil ,_a .Wrap (_bfee ,_eabf ,"");
|
|
|
|
};if !_gccd {break ;};if _fef ,_bfee =_bcfb (_eeee ,_gfgf ,_aagd .X ,_aagd .Y ,_afaaa );_bfee !=nil {return nil ,_a .Wrap (_bfee ,_eabf ,"");};if _bfee =_gab .Add (_fef );_bfee !=nil {return nil ,_a .Wrap (_bfee ,_eabf ,"");};if _bcac ,_bfee =_eeee .clipRectangle (_fef ,nil );
|
|
|
|
_bfee !=nil {return nil ,_a .Wrap (_bfee ,_eabf ,"\u0062\u006d\u0033");};if _fgba ,_bfee =_dcce .clipRectangle (_fef ,nil );_bfee !=nil {return nil ,_a .Wrap (_bfee ,_eabf ,"\u0062\u006d\u0034");};if _ ,_bfee =_aecbf (_bcac ,_bcac ,_fgba );_bfee !=nil {return nil ,_a .Wrap (_bfee ,_eabf ,"\u0062m\u0033\u0020\u005e\u0020\u0062\u006d4");
|
|
|
|
};if _bfee =_dcce .RasterOperation (_fef .Min .X ,_fef .Min .Y ,_fef .Dx (),_fef .Dy (),PixSrcXorDst ,_bcac ,0,0);_bfee !=nil {return nil ,_a .Wrap (_bfee ,_eabf ,"\u0062\u006d\u0032\u0020\u002d\u0058\u004f\u0052\u002d>\u0020\u0062\u006d\u0033");};_afd .AddBitmap (_bcac );
|
|
|
|
_fafd =_aagd .X ;_ebdg =_aagd .Y ;};_afd .Boxes =*_gab ;return _gab ,nil ;};func (_eagf *BitmapsArray )AddBox (box *_cc .Rectangle ){_eagf .Boxes =append (_eagf .Boxes ,box )};func _ffga (_ecfe ,_dfff int )int {if _ecfe > _dfff {return _ecfe ;};return _dfff ;
|
|
|
|
};func (_dad *Bitmap )And (s *Bitmap )(_acg *Bitmap ,_eeb error ){const _fedf ="\u0042\u0069\u0074\u006d\u0061\u0070\u002e\u0041\u006e\u0064";if _dad ==nil {return nil ,_a .Error (_fedf ,"\u0027b\u0069t\u006d\u0061\u0070\u0020\u0027b\u0027\u0020i\u0073\u0020\u006e\u0069\u006c");
|
|
|
|
};if s ==nil {return nil ,_a .Error (_fedf ,"\u0062\u0069\u0074\u006d\u0061\u0070\u0020\u0027\u0073\u0027\u0020\u0069s\u0020\u006e\u0069\u006c");};if !_dad .SizesEqual (s ){_fd .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",_fedf );
|
|
|
|
};if _acg ,_eeb =_gddf (_acg ,_dad );_eeb !=nil {return nil ,_a .Wrap (_eeb ,_fedf ,"\u0063\u0061\u006e't\u0020\u0063\u0072\u0065\u0061\u0074\u0065\u0020\u0027\u0064\u0027\u0020\u0062\u0069\u0074\u006d\u0061\u0070");};if _eeb =_acg .RasterOperation (0,0,_acg .Width ,_acg .Height ,PixSrcAndDst ,s ,0,0);
|
|
|
|
_eeb !=nil {return nil ,_a .Wrap (_eeb ,_fedf ,"");};return _acg ,nil ;};func HausTest (p1 ,p2 ,p3 ,p4 *Bitmap ,delX ,delY float32 ,maxDiffW ,maxDiffH int )(bool ,error ){const _fbc ="\u0048\u0061\u0075\u0073\u0054\u0065\u0073\u0074";_gdff ,_geagb :=p1 .Width ,p1 .Height ;
|
|
|
|
_bbeb ,_cfgb :=p3 .Width ,p3 .Height ;if _ed .Abs (_gdff -_bbeb )> maxDiffW {return false ,nil ;};if _ed .Abs (_geagb -_cfgb )> maxDiffH {return false ,nil ;};_gbf :=int (delX +_ed .Sign (delX )*0.5);_acbee :=int (delY +_ed .Sign (delY )*0.5);var _bedd error ;
|
|
|
|
_dbda :=p1 .CreateTemplate ();if _bedd =_dbda .RasterOperation (0,0,_gdff ,_geagb ,PixSrc ,p1 ,0,0);_bedd !=nil {return false ,_a .Wrap (_bedd ,_fbc ,"p\u0031\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _bedd =_dbda .RasterOperation (_gbf ,_acbee ,_gdff ,_geagb ,PixNotSrcAndDst ,p4 ,0,0);
|
|
|
|
_bedd !=nil {return false ,_a .Wrap (_bedd ,_fbc ,"\u0021p\u0034\u0020\u0026\u0020\u0074");};if _dbda .Zero (){return false ,nil ;};if _bedd =_dbda .RasterOperation (_gbf ,_acbee ,_bbeb ,_cfgb ,PixSrc ,p3 ,0,0);_bedd !=nil {return false ,_a .Wrap (_bedd ,_fbc ,"p\u0033\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");
|
|
|
|
};if _bedd =_dbda .RasterOperation (0,0,_bbeb ,_cfgb ,PixNotSrcAndDst ,p2 ,0,0);_bedd !=nil {return false ,_a .Wrap (_bedd ,_fbc ,"\u0021p\u0032\u0020\u0026\u0020\u0074");};return _dbda .Zero (),nil ;};const (AsymmetricMorphBC BoundaryCondition =iota ;
|
|
|
|
SymmetricMorphBC ;);func (_ddgf *Bitmaps )GetBox (i int )(*_cc .Rectangle ,error ){const _cfcd ="\u0047\u0065\u0074\u0042\u006f\u0078";if _ddgf ==nil {return nil ,_a .Error (_cfcd ,"\u0070\u0072\u006f\u0076id\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0042\u0069\u0074\u006d\u0061\u0070s\u0027");
|
|
|
|
};if i > len (_ddgf .Boxes )-1{return nil ,_a .Errorf (_cfcd ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return _ddgf .Boxes [i ],nil ;};var (_egeaa *Bitmap ;
|
|
|
|
_cacbf *Bitmap ;);type Bitmap struct{Width ,Height int ;BitmapNumber int ;RowStride int ;Data []byte ;Color Color ;Special int ;Text string ;XResolution ,YResolution int ;};func _efaf (_gbada *Bitmap )(_bccg *Bitmap ,_dedb int ,_cbgc error ){const _dbb ="\u0042i\u0074\u006d\u0061\u0070.\u0077\u006f\u0072\u0064\u004da\u0073k\u0042y\u0044\u0069\u006c\u0061\u0074\u0069\u006fn";
|
|
|
|
if _gbada ==nil {return nil ,0,_a .Errorf (_dbb ,"\u0027\u0073\u0027\u0020bi\u0074\u006d\u0061\u0070\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006ee\u0064");};var _gdec ,_degd *Bitmap ;if _gdec ,_cbgc =_gddf (nil ,_gbada );_cbgc !=nil {return nil ,0,_a .Wrap (_cbgc ,_dbb ,"\u0063\u006f\u0070\u0079\u0020\u0027\u0073\u0027");
|
|
|
|
};var (_bfeb [13]int ;_gfgd ,_agag int ;);_dcff :=12;_becff :=_ed .NewNumSlice (_dcff +1);_fagg :=_ed .NewNumSlice (_dcff +1);var _gcgd *Boxes ;for _dabc :=0;_dabc <=_dcff ;_dabc ++{if _dabc ==0{if _degd ,_cbgc =_gddf (nil ,_gdec );_cbgc !=nil {return nil ,0,_a .Wrap (_cbgc ,_dbb ,"\u0066i\u0072\u0073\u0074\u0020\u0062\u006d2");
|
|
|
|
};}else {if _degd ,_cbgc =_accg (_gdec ,MorphProcess {Operation :MopDilation ,Arguments :[]int {2,1}});_cbgc !=nil {return nil ,0,_a .Wrap (_cbgc ,_dbb ,"\u0064\u0069\u006ca\u0074\u0069\u006f\u006e\u0020\u0062\u006d\u0032");};};if _gcgd ,_cbgc =_degd .connComponentsBB (4);
|
|
|
|
_cbgc !=nil {return nil ,0,_a .Wrap (_cbgc ,_dbb ,"");};_bfeb [_dabc ]=len (*_gcgd );_becff .AddInt (_bfeb [_dabc ]);switch _dabc {case 0:_gfgd =_bfeb [0];default:_agag =_bfeb [_dabc -1]-_bfeb [_dabc ];_fagg .AddInt (_agag );};_gdec =_degd ;};_ddda :=true ;
|
|
|
|
_bbe :=2;var _beeb ,_egd int ;for _acbe :=1;_acbe < len (*_fagg );_acbe ++{if _beeb ,_cbgc =_becff .GetInt (_acbe );_cbgc !=nil {return nil ,0,_a .Wrap (_cbgc ,_dbb ,"\u0043\u0068\u0065\u0063ki\u006e\u0067\u0020\u0062\u0065\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0069o\u006e");
|
|
|
|
};if _ddda &&_beeb < int (0.3*float32 (_gfgd )){_bbe =_acbe +1;_ddda =false ;};if _agag ,_cbgc =_fagg .GetInt (_acbe );_cbgc !=nil {return nil ,0,_a .Wrap (_cbgc ,_dbb ,"\u0067\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u006ea\u0044\u0069\u0066\u0066");
|
|
|
|
};if _agag > _egd {_egd =_agag ;};};_dcca :=_gbada .XResolution ;if _dcca ==0{_dcca =150;};if _dcca > 110{_bbe ++;};if _bbe < 2{_fd .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");
|
|
|
|
_bbe =2;};_dedb =_bbe +1;if _bccg ,_cbgc =_efce (nil ,_gbada ,_bbe +1,1);_cbgc !=nil {return nil ,0,_a .Wrap (_cbgc ,_dbb ,"\u0067\u0065\u0074\u0074in\u0067\u0020\u006d\u0061\u0073\u006b\u0020\u0066\u0061\u0069\u006c\u0065\u0064");};return _bccg ,_dedb ,nil ;
|
|
|
|
};const (SelDontCare SelectionValue =iota ;SelHit ;SelMiss ;);func TstPSymbol (t *_ag .T )*Bitmap {t .Helper ();_aead :=New (5,8);_g .NoError (t ,_aead .SetPixel (0,0,1));_g .NoError (t ,_aead .SetPixel (1,0,1));_g .NoError (t ,_aead .SetPixel (2,0,1));
|
|
|
|
_g .NoError (t ,_aead .SetPixel (3,0,1));_g .NoError (t ,_aead .SetPixel (4,1,1));_g .NoError (t ,_aead .SetPixel (0,1,1));_g .NoError (t ,_aead .SetPixel (4,2,1));_g .NoError (t ,_aead .SetPixel (0,2,1));_g .NoError (t ,_aead .SetPixel (4,3,1));_g .NoError (t ,_aead .SetPixel (0,3,1));
|
|
|
|
_g .NoError (t ,_aead .SetPixel (0,4,1));_g .NoError (t ,_aead .SetPixel (1,4,1));_g .NoError (t ,_aead .SetPixel (2,4,1));_g .NoError (t ,_aead .SetPixel (3,4,1));_g .NoError (t ,_aead .SetPixel (0,5,1));_g .NoError (t ,_aead .SetPixel (0,6,1));_g .NoError (t ,_aead .SetPixel (0,7,1));
|
|
|
|
return _aead ;};func (_abgd *Bitmap )createTemplate ()*Bitmap {return &Bitmap {Width :_abgd .Width ,Height :_abgd .Height ,RowStride :_abgd .RowStride ,Color :_abgd .Color ,Text :_abgd .Text ,BitmapNumber :_abgd .BitmapNumber ,Special :_abgd .Special ,Data :make ([]byte ,len (_abgd .Data ))};
|
|
|
|
};func (_aac *Bitmap )setFourBytes (_befc int ,_eggf uint32 )error {if _befc +3> len (_aac .Data )-1{return _a .Errorf ("\u0073\u0065\u0074F\u006f\u0075\u0072\u0042\u0079\u0074\u0065\u0073","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",_befc );
|
|
|
|
};_aac .Data [_befc ]=byte ((_eggf &0xff000000)>>24);_aac .Data [_befc +1]=byte ((_eggf &0xff0000)>>16);_aac .Data [_befc +2]=byte ((_eggf &0xff00)>>8);_aac .Data [_befc +3]=byte (_eggf &0xff);return nil ;};const (_feaa shift =iota ;_bcbba ;);func _gegaeb (_cffde ,_gcfc *Bitmap ,_fceaa ,_dfgc int )(*Bitmap ,error ){const _ebbf ="\u0065\u0072\u006f\u0064\u0065\u0042\u0072\u0069\u0063\u006b";
|
|
|
|
if _gcfc ==nil {return nil ,_a .Error (_ebbf ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _fceaa < 1||_dfgc < 1{return nil ,_a .Error (_ebbf ,"\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 _fceaa ==1&&_dfgc ==1{_fafa ,_cddd :=_gddf (_cffde ,_gcfc );if _cddd !=nil {return nil ,_a .Wrap (_cddd ,_ebbf ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u0026\u0026 \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
|
|
};return _fafa ,nil ;};if _fceaa ==1||_dfgc ==1{_ggba :=SelCreateBrick (_dfgc ,_fceaa ,_dfgc /2,_fceaa /2,SelHit );_abgf ,_fffb :=_gbfg (_cffde ,_gcfc ,_ggba );if _fffb !=nil {return nil ,_a .Wrap (_fffb ,_ebbf ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
|
|
};return _abgf ,nil ;};_bdcfa :=SelCreateBrick (1,_fceaa ,0,_fceaa /2,SelHit );_gfce :=SelCreateBrick (_dfgc ,1,_dfgc /2,0,SelHit );_gbac ,_ffcg :=_gbfg (nil ,_gcfc ,_bdcfa );if _ffcg !=nil {return nil ,_a .Wrap (_ffcg ,_ebbf ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");
|
|
|
|
};_cffde ,_ffcg =_gbfg (_cffde ,_gbac ,_gfce );if _ffcg !=nil {return nil ,_a .Wrap (_ffcg ,_ebbf ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};return _cffde ,nil ;};func (_egb *Bitmap )SizesEqual (s *Bitmap )bool {if _egb ==s {return true ;};if _egb .Width !=s .Width ||_egb .Height !=s .Height {return false ;
|
|
|
|
};return true ;};func (_bgbd *Bitmaps )GroupByHeight ()(*BitmapsArray ,error ){const _eegb ="\u0047\u0072\u006f\u0075\u0070\u0042\u0079\u0048\u0065\u0069\u0067\u0068\u0074";if len (_bgbd .Values )==0{return nil ,_a .Error (_eegb ,"\u006eo\u0020v\u0061\u006c\u0075\u0065\u0073 \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");
|
|
|
|
};_ecbd :=&BitmapsArray {};_bgbd .SortByHeight ();_bgdae :=-1;_becdc :=-1;for _fgfe :=0;_fgfe < len (_bgbd .Values );_fgfe ++{_aaeg :=_bgbd .Values [_fgfe ].Height ;if _aaeg > _bgdae {_bgdae =_aaeg ;_becdc ++;_ecbd .Values =append (_ecbd .Values ,&Bitmaps {});
|
|
|
|
};_ecbd .Values [_becdc ].AddBitmap (_bgbd .Values [_fgfe ]);};return _ecbd ,nil ;};func _ebf (_babf *Bitmap ,_cedg ,_fgfc ,_dbfc ,_efbdb int ,_gbae RasterOperator ){if _cedg < 0{_dbfc +=_cedg ;_cedg =0;};_baae :=_cedg +_dbfc -_babf .Width ;if _baae > 0{_dbfc -=_baae ;
|
|
|
|
};if _fgfc < 0{_efbdb +=_fgfc ;_fgfc =0;};_fdfe :=_fgfc +_efbdb -_babf .Height ;if _fdfe > 0{_efbdb -=_fdfe ;};if _dbfc <=0||_efbdb <=0{return ;};if (_cedg &7)==0{_feaf (_babf ,_cedg ,_fgfc ,_dbfc ,_efbdb ,_gbae );}else {_efgg (_babf ,_cedg ,_fgfc ,_dbfc ,_efbdb ,_gbae );
|
|
|
|
};};func TstAddSymbol (t *_ag .T ,bms *Bitmaps ,sym *Bitmap ,x *int ,y int ,space int ){bms .AddBitmap (sym );_cbadb :=_cc .Rect (*x ,y ,*x +sym .Width ,y +sym .Height );bms .AddBox (&_cbadb );*x +=sym .Width +space ;};func (_aaf *Bitmap )AddBorder (borderSize ,val int )(*Bitmap ,error ){if borderSize ==0{return _aaf .Copy (),nil ;
|
|
|
|
};_dcb ,_dfce :=_aaf .addBorderGeneral (borderSize ,borderSize ,borderSize ,borderSize ,val );if _dfce !=nil {return nil ,_a .Wrap (_dfce ,"\u0041d\u0064\u0042\u006f\u0072\u0064\u0065r","");};return _dcb ,nil ;};func _ecged (_gcac ,_bbcg *Bitmap ,_beea ,_ebda int )(_fbgg error ){const _dbfe ="\u0073e\u0065d\u0066\u0069\u006c\u006c\u0042i\u006e\u0061r\u0079\u004c\u006f\u0077\u0034";
|
|
|
|
var (_dgcf ,_bdbd ,_gbfb ,_efgaa int ;_dfbge ,_efff ,_agfd ,_fcf ,_cfcc ,_edg ,_bcce byte ;);for _dgcf =0;_dgcf < _beea ;_dgcf ++{_gbfb =_dgcf *_gcac .RowStride ;_efgaa =_dgcf *_bbcg .RowStride ;for _bdbd =0;_bdbd < _ebda ;_bdbd ++{_dfbge ,_fbgg =_gcac .GetByte (_gbfb +_bdbd );
|
|
|
|
if _fbgg !=nil {return _a .Wrap (_fbgg ,_dbfe ,"\u0066i\u0072\u0073\u0074\u0020\u0067\u0065t");};_efff ,_fbgg =_bbcg .GetByte (_efgaa +_bdbd );if _fbgg !=nil {return _a .Wrap (_fbgg ,_dbfe ,"\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0067\u0065\u0074");
|
|
|
|
};if _dgcf > 0{_agfd ,_fbgg =_gcac .GetByte (_gbfb -_gcac .RowStride +_bdbd );if _fbgg !=nil {return _a .Wrap (_fbgg ,_dbfe ,"\u0069\u0020\u003e \u0030");};_dfbge |=_agfd ;};if _bdbd > 0{_fcf ,_fbgg =_gcac .GetByte (_gbfb +_bdbd -1);if _fbgg !=nil {return _a .Wrap (_fbgg ,_dbfe ,"\u006a\u0020\u003e \u0030");
|
|
|
|
};_dfbge |=_fcf <<7;};_dfbge &=_efff ;if _dfbge ==0||(^_dfbge )==0{if _fbgg =_gcac .SetByte (_gbfb +_bdbd ,_dfbge );_fbgg !=nil {return _a .Wrap (_fbgg ,_dbfe ,"b\u0074\u0020\u003d\u003d 0\u0020|\u007c\u0020\u0028\u005e\u0062t\u0029\u0020\u003d\u003d\u0020\u0030");
|
|
|
|
};continue ;};for {_bcce =_dfbge ;_dfbge =(_dfbge |(_dfbge >>1)|(_dfbge <<1))&_efff ;if (_dfbge ^_bcce )==0{if _fbgg =_gcac .SetByte (_gbfb +_bdbd ,_dfbge );_fbgg !=nil {return _a .Wrap (_fbgg ,_dbfe ,"\u0073\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u0070\u0072\u0065\u0076 \u0062\u0079\u0074\u0065");
|
|
|
|
};break ;};};};};for _dgcf =_beea -1;_dgcf >=0;_dgcf --{_gbfb =_dgcf *_gcac .RowStride ;_efgaa =_dgcf *_bbcg .RowStride ;for _bdbd =_ebda -1;_bdbd >=0;_bdbd --{if _dfbge ,_fbgg =_gcac .GetByte (_gbfb +_bdbd );_fbgg !=nil {return _a .Wrap (_fbgg ,_dbfe ,"\u0072\u0065\u0076\u0065\u0072\u0073\u0065\u0020\u0066\u0069\u0072\u0073t\u0020\u0067\u0065\u0074");
|
|
|
|
};if _efff ,_fbgg =_bbcg .GetByte (_efgaa +_bdbd );_fbgg !=nil {return _a .Wrap (_fbgg ,_dbfe ,"r\u0065\u0076\u0065\u0072se\u0020g\u0065\u0074\u0020\u006d\u0061s\u006b\u0020\u0062\u0079\u0074\u0065");};if _dgcf < _beea -1{if _cfcc ,_fbgg =_gcac .GetByte (_gbfb +_gcac .RowStride +_bdbd );
|
|
|
|
_fbgg !=nil {return _a .Wrap (_fbgg ,_dbfe ,"\u0072\u0065v\u0065\u0072\u0073e\u0020\u0069\u0020\u003c\u0020\u0068\u0020\u002d\u0031");};_dfbge |=_cfcc ;};if _bdbd < _ebda -1{if _edg ,_fbgg =_gcac .GetByte (_gbfb +_bdbd +1);_fbgg !=nil {return _a .Wrap (_fbgg ,_dbfe ,"\u0072\u0065\u0076\u0065rs\u0065\u0020\u006a\u0020\u003c\u0020\u0077\u0070\u006c\u0020\u002d\u0020\u0031");
|
|
|
|
};_dfbge |=_edg >>7;};_dfbge &=_efff ;if _dfbge ==0||(^_dfbge )==0{if _fbgg =_gcac .SetByte (_gbfb +_bdbd ,_dfbge );_fbgg !=nil {return _a .Wrap (_fbgg ,_dbfe ,"\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 {_bcce =_dfbge ;_dfbge =(_dfbge |(_dfbge >>1)|(_dfbge <<1))&_efff ;if (_dfbge ^_bcce )==0{if _fbgg =_gcac .SetByte (_gbfb +_bdbd ,_dfbge );_fbgg !=nil {return _a .Wrap (_fbgg ,_dbfe ,"\u0072e\u0076\u0065\u0072\u0073e\u0020\u0073\u0065\u0074\u0074i\u006eg\u0020p\u0072\u0065\u0076\u0020\u0062\u0079\u0074e");
|
|
|
|
};break ;};};};};return nil ;};func TstOSymbol (t *_ag .T ,scale ...int )*Bitmap {_agfe ,_fgdda :=NewWithData (4,5,[]byte {0xF0,0x90,0x90,0x90,0xF0});_g .NoError (t ,_fgdda );return TstGetScaledSymbol (t ,_agfe ,scale ...);};func (_efe *Bitmap )ToImage ()_cc .Image {_cfa ,_cff :=_f .NewImage (_efe .Width ,_efe .Height ,1,1,_efe .Data ,nil ,nil );
|
|
|
|
if _cff !=nil {_fd .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",_cff );
|
|
|
|
};return _cfa ;};func _adg (_aab ,_acb *Bitmap )(_fa error ){const _adf ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0034";_de :=_acb .RowStride ;_def :=_aab .RowStride ;_gc :=_acb .RowStride *4-_aab .RowStride ;
|
|
|
|
var (_fe ,_fce byte ;_df uint32 ;_dfg ,_edd ,_ae ,_fdg ,_fac ,_fcb ,_baa int ;);for _ae =0;_ae < _acb .Height ;_ae ++{_dfg =_ae *_de ;_edd =4*_ae *_def ;for _fdg =0;_fdg < _de ;_fdg ++{_fe =_acb .Data [_dfg +_fdg ];_df =_bbaa [_fe ];_fcb =_edd +_fdg *4;
|
|
|
|
if _gc !=0&&(_fdg +1)*4> _aab .RowStride {for _fac =_gc ;_fac > 0;_fac --{_fce =byte ((_df >>uint (_fac *8))&0xff);_baa =_fcb +(_gc -_fac );if _fa =_aab .SetByte (_baa ,_fce );_fa !=nil {return _a .Wrapf (_fa ,_adf ,"D\u0069\u0066\u0066\u0065\u0072\u0065n\u0074\u0020\u0072\u006f\u0077\u0073\u0074\u0072\u0069d\u0065\u0073\u002e \u004b:\u0020\u0025\u0064",_fac );
|
|
|
|
};};}else if _fa =_aab .setFourBytes (_fcb ,_df );_fa !=nil {return _a .Wrap (_fa ,_adf ,"");};if _fa =_aab .setFourBytes (_edd +_fdg *4,_bbaa [_acb .Data [_dfg +_fdg ]]);_fa !=nil {return _a .Wrap (_fa ,_adf ,"");};};for _fac =1;_fac < 4;_fac ++{for _fdg =0;
|
|
|
|
_fdg < _def ;_fdg ++{if _fa =_aab .SetByte (_edd +_fac *_def +_fdg ,_aab .Data [_edd +_fdg ]);_fa !=nil {return _a .Wrapf (_fa ,_adf ,"\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",_fac ,_fdg );
|
|
|
|
};};};};return nil ;};func _ggce (_bdf ,_debc *Bitmap ,_dcgbc *Selection )(*Bitmap ,error ){const _accc ="c\u006c\u006f\u0073\u0065\u0042\u0069\u0074\u006d\u0061\u0070";var _gfda error ;if _bdf ,_gfda =_fffa (_bdf ,_debc ,_dcgbc );_gfda !=nil {return nil ,_gfda ;
|
|
|
|
};_bdcf ,_gfda :=_egfg (nil ,_debc ,_dcgbc );if _gfda !=nil {return nil ,_a .Wrap (_gfda ,_accc ,"");};if _ ,_gfda =_gbfg (_bdf ,_bdcf ,_dcgbc );_gfda !=nil {return nil ,_a .Wrap (_gfda ,_accc ,"");};return _bdf ,nil ;};func (_ccbf *Bitmap )GetByte (index int )(byte ,error ){if index > len (_ccbf .Data )-1||index < 0{return 0,_a .Errorf ("\u0047e\u0074\u0042\u0079\u0074\u0065","\u0069\u006e\u0064\u0065x:\u0020\u0025\u0064\u0020\u006f\u0075\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006eg\u0065",index );
|
|
|
|
};return _ccbf .Data [index ],nil ;};func (_bad *Bitmap )removeBorderGeneral (_ddfd ,_ggfc ,_deab ,_cefc int )(*Bitmap ,error ){const _ggbg ="\u0072\u0065\u006d\u006fve\u0042\u006f\u0072\u0064\u0065\u0072\u0047\u0065\u006e\u0065\u0072\u0061\u006c";if _ddfd < 0||_ggfc < 0||_deab < 0||_cefc < 0{return nil ,_a .Error (_ggbg ,"\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");
|
|
|
|
};_fgg ,_cafb :=_bad .Width ,_bad .Height ;_fcec :=_fgg -_ddfd -_ggfc ;_bba :=_cafb -_deab -_cefc ;if _fcec <=0{return nil ,_a .Errorf (_ggbg ,"w\u0069\u0064\u0074\u0068: \u0025d\u0020\u006d\u0075\u0073\u0074 \u0062\u0065\u0020\u003e\u0020\u0030",_fcec );
|
|
|
|
};if _bba <=0{return nil ,_a .Errorf (_ggbg ,"\u0068\u0065\u0069\u0067ht\u003a\u0020\u0025\u0064\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065\u0020\u003e \u0030",_bba );};_gdga :=New (_fcec ,_bba );_gdga .Color =_bad .Color ;_efae :=_gdga .RasterOperation (0,0,_fcec ,_bba ,PixSrc ,_bad ,_ddfd ,_deab );
|
|
|
|
if _efae !=nil {return nil ,_a .Wrap (_efae ,_ggbg ,"");};return _gdga ,nil ;};func (_bgf *Bitmap )Copy ()*Bitmap {_afae :=make ([]byte ,len (_bgf .Data ));copy (_afae ,_bgf .Data );return &Bitmap {Width :_bgf .Width ,Height :_bgf .Height ,RowStride :_bgf .RowStride ,Data :_afae ,Color :_bgf .Color ,Text :_bgf .Text ,BitmapNumber :_bgf .BitmapNumber ,Special :_bgf .Special };
|
|
|
|
};func (_bae MorphProcess )getWidthHeight ()(_gfga ,_gcgg int ){return _bae .Arguments [0],_bae .Arguments [1];};func (_abgb *Bitmap )InverseData (){_abgb .inverseData ()};func _bded (_dbfb ,_eee int )int {if _dbfb < _eee {return _dbfb ;};return _eee ;
|
|
|
|
};var _ _ge .Interface =&ClassedPoints {};func (_bbgf *Bitmaps )GroupByWidth ()(*BitmapsArray ,error ){const _fcbg ="\u0047\u0072\u006fu\u0070\u0042\u0079\u0057\u0069\u0064\u0074\u0068";if len (_bbgf .Values )==0{return nil ,_a .Error (_fcbg ,"\u006eo\u0020v\u0061\u006c\u0075\u0065\u0073 \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");
|
|
|
|
};_fddb :=&BitmapsArray {};_bbgf .SortByWidth ();_bfaag :=-1;_eabd :=-1;for _cadf :=0;_cadf < len (_bbgf .Values );_cadf ++{_becee :=_bbgf .Values [_cadf ].Width ;if _becee > _bfaag {_bfaag =_becee ;_eabd ++;_fddb .Values =append (_fddb .Values ,&Bitmaps {});
|
|
|
|
};_fddb .Values [_eabd ].AddBitmap (_bbgf .Values [_cadf ]);};return _fddb ,nil ;};type Getter interface{GetBitmap ()*Bitmap ;};func (_dcbg *Bitmap )SetPixel (x ,y int ,pixel byte )error {_gdb :=_dcbg .GetByteIndex (x ,y );if _gdb > len (_dcbg .Data )-1{return _a .Errorf ("\u0053\u0065\u0074\u0050\u0069\u0078\u0065\u006c","\u0069\u006e\u0064\u0065x \u006f\u0075\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u003a\u0020%\u0064",_gdb );
|
|
|
|
};_bgad :=_dcbg .GetBitOffset (x );_gdeb :=uint (7-_bgad );_cdf :=_dcbg .Data [_gdb ];var _efdc byte ;if pixel ==1{_efdc =_cdf |(pixel &0x01<<_gdeb );}else {_efdc =_cdf &^(1<<_gdeb );};_dcbg .Data [_gdb ]=_efdc ;return nil ;};func _da (_fae ,_dag *Bitmap ,_ec int ,_gee []byte ,_efg int )(_fcg error ){const _ce ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0031";
|
|
|
|
var (_efc ,_abg ,_ade ,_cdd ,_ddf ,_fba ,_acbf ,_eaf int ;_fde ,_agd uint32 ;_fega ,_dea byte ;_abf uint16 ;);_aec :=make ([]byte ,4);_agg :=make ([]byte ,4);for _ade =0;_ade < _fae .Height -1;_ade ,_cdd =_ade +2,_cdd +1{_efc =_ade *_fae .RowStride ;_abg =_cdd *_dag .RowStride ;
|
|
|
|
for _ddf ,_fba =0,0;_ddf < _efg ;_ddf ,_fba =_ddf +4,_fba +1{for _acbf =0;_acbf < 4;_acbf ++{_eaf =_efc +_ddf +_acbf ;if _eaf <=len (_fae .Data )-1&&_eaf < _efc +_fae .RowStride {_aec [_acbf ]=_fae .Data [_eaf ];}else {_aec [_acbf ]=0x00;};_eaf =_efc +_fae .RowStride +_ddf +_acbf ;
|
|
|
|
if _eaf <=len (_fae .Data )-1&&_eaf < _efc +(2*_fae .RowStride ){_agg [_acbf ]=_fae .Data [_eaf ];}else {_agg [_acbf ]=0x00;};};_fde =_d .BigEndian .Uint32 (_aec );_agd =_d .BigEndian .Uint32 (_agg );_agd |=_fde ;_agd |=_agd <<1;_agd &=0xaaaaaaaa;_fde =_agd |(_agd <<7);
|
|
|
|
_fega =byte (_fde >>24);_dea =byte ((_fde >>8)&0xff);_eaf =_abg +_fba ;if _eaf +1==len (_dag .Data )-1||_eaf +1>=_abg +_dag .RowStride {_dag .Data [_eaf ]=_gee [_fega ];}else {_abf =(uint16 (_gee [_fega ])<<8)|uint16 (_gee [_dea ]);if _fcg =_dag .setTwoBytes (_eaf ,_abf );
|
|
|
|
_fcg !=nil {return _a .Wrapf (_fcg ,_ce ,"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",_eaf );};_fba ++;};};};
|
|
|
|
return nil ;};func (_befcf *Boxes )Add (box *_cc .Rectangle )error {if _befcf ==nil {return _a .Error ("\u0042o\u0078\u0065\u0073\u002e\u0041\u0064d","\u0027\u0042\u006f\u0078es\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
|
|
};*_befcf =append (*_befcf ,box );return nil ;};func TstImageBitmap ()*Bitmap {return _cacbf .Copy ()};func _gddf (_eged ,_bfda *Bitmap )(*Bitmap ,error ){if _bfda ==nil {return nil ,_a .Error ("\u0063\u006f\u0070\u0079\u0042\u0069\u0074\u006d\u0061\u0070","\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
|
|
};if _bfda ==_eged {return _eged ,nil ;};if _eged ==nil {_eged =_bfda .createTemplate ();copy (_eged .Data ,_bfda .Data );return _eged ,nil ;};_dbgc :=_eged .resizeImageData (_bfda );if _dbgc !=nil {return nil ,_a .Wrap (_dbgc ,"\u0063\u006f\u0070\u0079\u0042\u0069\u0074\u006d\u0061\u0070","");
|
|
|
|
};_eged .Text =_bfda .Text ;copy (_eged .Data ,_bfda .Data );return _eged ,nil ;};func (_egc *Bitmap )addBorderGeneral (_cgd ,_ffcd ,_ecgg ,_cbgf int ,_ggg int )(*Bitmap ,error ){const _fbg ="\u0061\u0064d\u0042\u006f\u0072d\u0065\u0072\u0047\u0065\u006e\u0065\u0072\u0061\u006c";
|
|
|
|
if _cgd < 0||_ffcd < 0||_ecgg < 0||_cbgf < 0{return nil ,_a .Error (_fbg ,"n\u0065\u0067\u0061\u0074iv\u0065 \u0062\u006f\u0072\u0064\u0065r\u0020\u0061\u0064\u0064\u0065\u0064");};_aabg ,_eaef :=_egc .Width ,_egc .Height ;_ddfg :=_aabg +_cgd +_ffcd ;_edff :=_eaef +_ecgg +_cbgf ;
|
|
|
|
_dfgd :=New (_ddfg ,_edff );_dfgd .Color =_egc .Color ;_gegf :=PixClr ;if _ggg > 0{_gegf =PixSet ;};_gfe :=_dfgd .RasterOperation (0,0,_cgd ,_edff ,_gegf ,nil ,0,0);if _gfe !=nil {return nil ,_a .Wrap (_gfe ,_fbg ,"\u006c\u0065\u0066\u0074");};_gfe =_dfgd .RasterOperation (_ddfg -_ffcd ,0,_ffcd ,_edff ,_gegf ,nil ,0,0);
|
|
|
|
if _gfe !=nil {return nil ,_a .Wrap (_gfe ,_fbg ,"\u0072\u0069\u0067h\u0074");};_gfe =_dfgd .RasterOperation (0,0,_ddfg ,_ecgg ,_gegf ,nil ,0,0);if _gfe !=nil {return nil ,_a .Wrap (_gfe ,_fbg ,"\u0074\u006f\u0070");};_gfe =_dfgd .RasterOperation (0,_edff -_cbgf ,_ddfg ,_cbgf ,_gegf ,nil ,0,0);
|
|
|
|
if _gfe !=nil {return nil ,_a .Wrap (_gfe ,_fbg ,"\u0062\u006f\u0074\u0074\u006f\u006d");};_gfe =_dfgd .RasterOperation (_cgd ,_ecgg ,_aabg ,_eaef ,PixSrc ,_egc ,0,0);if _gfe !=nil {return nil ,_a .Wrap (_gfe ,_fbg ,"\u0063\u006f\u0070\u0079");};return _dfgd ,nil ;
|
|
|
|
};const (ComponentConn Component =iota ;ComponentCharacters ;ComponentWords ;);func (_caga *ClassedPoints )XAtIndex (i int )float32 {return (*_caga .Points )[_caga .IntSlice [i ]].X };const (Vanilla Color =iota ;Chocolate ;);func TstDSymbol (t *_ag .T ,scale ...int )*Bitmap {_adec ,_adbc :=NewWithData (4,5,[]byte {0xf0,0x90,0x90,0x90,0xE0});
|
|
|
|
_g .NoError (t ,_adbc );return TstGetScaledSymbol (t ,_adec ,scale ...);};func (_cabgf *Bitmaps )Size ()int {return len (_cabgf .Values )};func (_bffd *Bitmaps )String ()string {_eebda :=_e .Builder {};for _ ,_bdgb :=range _bffd .Values {_eebda .WriteString (_bdgb .String ());
|
|
|
|
_eebda .WriteRune ('\n');};return _eebda .String ();};type Point struct{X ,Y float32 ;};func (_dbgf Points )XSorter ()func (_cgbd ,_ddfc int )bool {return func (_ggcd ,_ffeg int )bool {return _dbgf [_ggcd ].X < _dbgf [_ffeg ].X };};func (_febad *Points )Add (pt *Points )error {const _feccg ="\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0041\u0064\u0064";
|
|
|
|
if _febad ==nil {return _a .Error (_feccg ,"\u0070o\u0069n\u0074\u0073\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if pt ==nil {return _a .Error (_feccg ,"a\u0072\u0067\u0075\u006d\u0065\u006et\u0020\u0070\u006f\u0069\u006e\u0074\u0073\u0020\u006eo\u0074\u0020\u0064e\u0066i\u006e\u0065\u0064");
|
|
|
|
};*_febad =append (*_febad ,*pt ...);return nil ;};func (_ddg *Bitmap )ClipRectangle (box *_cc .Rectangle )(_faa *Bitmap ,_gbc *_cc .Rectangle ,_acbd error ){const _aabe ="\u0043\u006c\u0069\u0070\u0052\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065";
|
|
|
|
if box ==nil {return nil ,nil ,_a .Error (_aabe ,"\u0062o\u0078 \u0069\u0073\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};_eed ,_gfd :=_ddg .Width ,_ddg .Height ;_edfc :=_cc .Rect (0,0,_eed ,_gfd );if !box .Overlaps (_edfc ){return nil ,nil ,_a .Error (_aabe ,"b\u006f\u0078\u0020\u0064oe\u0073n\u0027\u0074\u0020\u006f\u0076e\u0072\u006c\u0061\u0070\u0020\u0062");
|
|
|
|
};_fab :=box .Intersect (_edfc );_gcd ,_gfdf :=_fab .Min .X ,_fab .Min .Y ;_eafc ,_ede :=_fab .Dx (),_fab .Dy ();_faa =New (_eafc ,_ede );_faa .Text =_ddg .Text ;if _acbd =_faa .RasterOperation (0,0,_eafc ,_ede ,PixSrc ,_ddg ,_gcd ,_gfdf );_acbd !=nil {return nil ,nil ,_a .Wrap (_acbd ,_aabe ,"\u0050\u0069\u0078\u0053\u0072\u0063\u0020\u0074\u006f\u0020\u0063\u006ci\u0070\u0070\u0065\u0064");
|
|
|
|
};_gbc =&_fab ;return _faa ,_gbc ,nil ;};func (_abba CombinationOperator )String ()string {var _agbbd string ;switch _abba {case CmbOpOr :_agbbd ="\u004f\u0052";case CmbOpAnd :_agbbd ="\u0041\u004e\u0044";case CmbOpXor :_agbbd ="\u0058\u004f\u0052";case CmbOpXNor :_agbbd ="\u0058\u004e\u004f\u0052";
|
|
|
|
case CmbOpReplace :_agbbd ="\u0052E\u0050\u004c\u0041\u0043\u0045";case CmbOpNot :_agbbd ="\u004e\u004f\u0054";};return _agbbd ;};func Centroids (bms []*Bitmap )(*Points ,error ){_fbba :=make ([]Point ,len (bms ));_cfdg :=_fcca ();_dccc :=_fbab ();var _gcfd error ;
|
|
|
|
for _beebb ,_fdf :=range bms {_fbba [_beebb ],_gcfd =_fdf .centroid (_cfdg ,_dccc );if _gcfd !=nil {return nil ,_gcfd ;};};_bcgd :=Points (_fbba );return &_bcgd ,nil ;};func (_eggg *Bitmaps )ClipToBitmap (s *Bitmap )(*Bitmaps ,error ){const _cbbd ="B\u0069t\u006d\u0061\u0070\u0073\u002e\u0043\u006c\u0069p\u0054\u006f\u0042\u0069tm\u0061\u0070";
|
|
|
|
if _eggg ==nil {return nil ,_a .Error (_cbbd ,"\u0042\u0069\u0074\u006dap\u0073\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};if s ==nil {return nil ,_a .Error (_cbbd ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");
|
|
|
|
};_aebfa :=len (_eggg .Values );_eccb :=&Bitmaps {Values :make ([]*Bitmap ,_aebfa ),Boxes :make ([]*_cc .Rectangle ,_aebfa )};var (_cgddc ,_gbgd *Bitmap ;_fdfd *_cc .Rectangle ;_cfea error ;);for _deac :=0;_deac < _aebfa ;_deac ++{if _cgddc ,_cfea =_eggg .GetBitmap (_deac );
|
|
|
|
_cfea !=nil {return nil ,_a .Wrap (_cfea ,_cbbd ,"");};if _fdfd ,_cfea =_eggg .GetBox (_deac );_cfea !=nil {return nil ,_a .Wrap (_cfea ,_cbbd ,"");};if _gbgd ,_cfea =s .clipRectangle (_fdfd ,nil );_cfea !=nil {return nil ,_a .Wrap (_cfea ,_cbbd ,"");};
|
|
|
|
if _gbgd ,_cfea =_gbgd .And (_cgddc );_cfea !=nil {return nil ,_a .Wrap (_cfea ,_cbbd ,"");};_eccb .Values [_deac ]=_gbgd ;_eccb .Boxes [_deac ]=_fdfd ;};return _eccb ,nil ;};func Blit (src *Bitmap ,dst *Bitmap ,x ,y int ,op CombinationOperator )error {var _cfc ,_bafc int ;
|
|
|
|
_feef :=src .RowStride -1;if x < 0{_bafc =-x ;x =0;}else if x +src .Width > dst .Width {_feef -=src .Width +x -dst .Width ;};if y < 0{_cfc =-y ;y =0;_bafc +=src .RowStride ;_feef +=src .RowStride ;}else if y +src .Height > dst .Height {_cfc =src .Height +y -dst .Height ;
|
|
|
|
};var (_ffgd int ;_gcdd error ;);_acfa :=x &0x07;_fgd :=8-_acfa ;_eddf :=src .Width &0x07;_fcece :=_fgd -_eddf ;_dfbc :=_fgd &0x07!=0;_gagd :=src .Width <=((_feef -_bafc )<<3)+_fgd ;_bcg :=dst .GetByteIndex (x ,y );_bcbb :=_cfc +dst .Height ;if src .Height > _bcbb {_ffgd =_bcbb ;
|
|
|
|
}else {_ffgd =src .Height ;};switch {case !_dfbc :_gcdd =_ccff (src ,dst ,_cfc ,_ffgd ,_bcg ,_bafc ,_feef ,op );case _gagd :_gcdd =_bfcc (src ,dst ,_cfc ,_ffgd ,_bcg ,_bafc ,_feef ,_fcece ,_acfa ,_fgd ,op );default:_gcdd =_gfab (src ,dst ,_cfc ,_ffgd ,_bcg ,_bafc ,_feef ,_fcece ,_acfa ,_fgd ,op ,_eddf );
|
|
|
|
};return _gcdd ;};func _gf (_deb *Bitmap ,_gag ,_aed int )(*Bitmap ,error ){const _gcb ="e\u0078\u0070\u0061\u006edB\u0069n\u0061\u0072\u0079\u0052\u0065p\u006c\u0069\u0063\u0061\u0074\u0065";if _deb ==nil {return nil ,_a .Error (_gcb ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
|
|
};if _gag <=0||_aed <=0{return nil ,_a .Error (_gcb ,"\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 _gag ==_aed {if _gag ==1{_add ,_bea :=_gddf (nil ,_deb );
|
|
|
|
if _bea !=nil {return nil ,_a .Wrap (_bea ,_gcb ,"\u0078\u0046\u0061\u0063\u0074\u0020\u003d\u003d\u0020y\u0046\u0061\u0063\u0074");};return _add ,nil ;};if _gag ==2||_gag ==4||_gag ==8{_cgg ,_bbc :=_gec (_deb ,_gag );if _bbc !=nil {return nil ,_a .Wrap (_bbc ,_gcb ,"\u0078\u0046a\u0063\u0074\u0020i\u006e\u0020\u007b\u0032\u002c\u0034\u002c\u0038\u007d");
|
|
|
|
};return _cgg ,nil ;};};_cbd :=_gag *_deb .Width ;_cgcb :=_aed *_deb .Height ;_ee :=New (_cbd ,_cgcb );_gafb :=_ee .RowStride ;var (_cd ,_dfb ,_feb ,_ccb ,_bc int ;_aeb byte ;_fge error ;);for _dfb =0;_dfb < _deb .Height ;_dfb ++{_cd =_aed *_dfb *_gafb ;
|
|
|
|
for _feb =0;_feb < _deb .Width ;_feb ++{if _baad :=_deb .GetPixel (_feb ,_dfb );_baad {_bc =_gag *_feb ;for _ccb =0;_ccb < _gag ;_ccb ++{_ee .setBit (_cd *8+_bc +_ccb );};};};for _ccb =1;_ccb < _aed ;_ccb ++{_cgf :=_cd +_ccb *_gafb ;for _ddd :=0;_ddd < _gafb ;
|
|
|
|
_ddd ++{if _aeb ,_fge =_ee .GetByte (_cd +_ddd );_fge !=nil {return nil ,_a .Wrapf (_fge ,_gcb ,"\u0072\u0065\u0070\u006cic\u0061\u0074\u0069\u006e\u0067\u0020\u006c\u0069\u006e\u0065\u003a\u0020\u0027\u0025d\u0027",_ccb );};if _fge =_ee .SetByte (_cgf +_ddd ,_aeb );
|
|
|
|
_fge !=nil {return nil ,_a .Wrap (_fge ,_gcb ,"\u0053\u0065\u0074\u0074in\u0067\u0020\u0062\u0079\u0074\u0065\u0020\u0066\u0061\u0069\u006c\u0065\u0064");};};};};return _ee ,nil ;};func _fbab ()[]int {_gcgf :=make ([]int ,256);for _fgeb :=0;_fgeb <=0xff;
|
|
|
|
_fgeb ++{_afdd :=byte (_fgeb );_gcgf [_afdd ]=int (_afdd &0x1)+(int (_afdd >>1)&0x1)+(int (_afdd >>2)&0x1)+(int (_afdd >>3)&0x1)+(int (_afdd >>4)&0x1)+(int (_afdd >>5)&0x1)+(int (_afdd >>6)&0x1)+(int (_afdd >>7)&0x1);};return _gcgf ;};func (_faed Points )Size ()int {return len (_faed )};
|
|
|
|
func CorrelationScoreSimple (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab []int )(_gbbd float64 ,_efgd error ){const _gecc ="\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 _gbbd ,_a .Error (_gecc ,"n\u0069l\u0020\u0062\u0069\u0074\u006d\u0061\u0070\u0073 \u0070\u0072\u006f\u0076id\u0065\u0064");};if tab ==nil {return _gbbd ,_a .Error (_gecc ,"\u0074\u0061\u0062\u0020\u0075\u006e\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
|
|
};if area1 ==0||area2 ==0{return _gbbd ,_a .Error (_gecc ,"\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064\u0020\u0061\u0072e\u0061\u0073\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065 \u003e\u0020\u0030");};_fbgf ,_bced :=bm1 .Width ,bm1 .Height ;_ffed ,_fcea :=bm2 .Width ,bm2 .Height ;
|
|
|
|
if _cbge (_fbgf -_ffed )> maxDiffW {return 0,nil ;};if _cbge (_bced -_fcea )> maxDiffH {return 0,nil ;};var _dead ,_decga int ;if delX >=0{_dead =int (delX +0.5);}else {_dead =int (delX -0.5);};if delY >=0{_decga =int (delY +0.5);}else {_decga =int (delY -0.5);
|
|
|
|
};_fffc :=bm1 .createTemplate ();if _efgd =_fffc .RasterOperation (_dead ,_decga ,_ffed ,_fcea ,PixSrc ,bm2 ,0,0);_efgd !=nil {return _gbbd ,_a .Wrap (_efgd ,_gecc ,"\u0062m\u0032 \u0074\u006f\u0020\u0054\u0065\u006d\u0070\u006c\u0061\u0074\u0065");};if _efgd =_fffc .RasterOperation (0,0,_fbgf ,_bced ,PixSrcAndDst ,bm1 ,0,0);
|
|
|
|
_efgd !=nil {return _gbbd ,_a .Wrap (_efgd ,_gecc ,"b\u006d\u0031\u0020\u0061\u006e\u0064\u0020\u0062\u006d\u0054");};_beff :=_fffc .countPixels ();_gbbd =float64 (_beff )*float64 (_beff )/(float64 (area1 )*float64 (area2 ));return _gbbd ,nil ;};func _bcfb (_aade *Bitmap ,_adacb *_ed .Stack ,_gdcg ,_ddfca ,_edb int )(_bfec *_cc .Rectangle ,_feag error ){const _dfeed ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";
|
|
|
|
if _aade ==nil {return nil ,_a .Error (_dfeed ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");};if _adacb ==nil {return nil ,_a .Error (_dfeed ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");
|
|
|
|
};switch _edb {case 4:if _bfec ,_feag =_beca (_aade ,_adacb ,_gdcg ,_ddfca );_feag !=nil {return nil ,_a .Wrap (_feag ,_dfeed ,"");};return _bfec ,nil ;case 8:if _bfec ,_feag =_aaaa (_aade ,_adacb ,_gdcg ,_ddfca );_feag !=nil {return nil ,_a .Wrap (_feag ,_dfeed ,"");
|
|
|
|
};return _bfec ,nil ;default:return nil ,_a .Errorf (_dfeed ,"\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",_edb );
|
|
|
|
};};func _dfc ()(_bcc [256]uint64 ){for _efbb :=0;_efbb < 256;_efbb ++{if _efbb &0x01!=0{_bcc [_efbb ]|=0xff;};if _efbb &0x02!=0{_bcc [_efbb ]|=0xff00;};if _efbb &0x04!=0{_bcc [_efbb ]|=0xff0000;};if _efbb &0x08!=0{_bcc [_efbb ]|=0xff000000;};if _efbb &0x10!=0{_bcc [_efbb ]|=0xff00000000;
|
|
|
|
};if _efbb &0x20!=0{_bcc [_efbb ]|=0xff0000000000;};if _efbb &0x40!=0{_bcc [_efbb ]|=0xff000000000000;};if _efbb &0x80!=0{_bcc [_efbb ]|=0xff00000000000000;};};return _bcc ;};func (_fbag *Bitmap )GetVanillaData ()[]byte {if _fbag .Color ==Chocolate {_fbag .inverseData ();
|
|
|
|
};return _fbag .Data ;};func _cafd (_acgd *Bitmap ,_gedfg ,_dgfc ,_egeb ,_geef int ,_fbegd RasterOperator ,_cdcbd *Bitmap ,_eedce ,_dbba int )error {const _badc ="\u0072a\u0073t\u0065\u0072\u004f\u0070\u0065\u0072\u0061\u0074\u0069\u006f\u006e";if _acgd ==nil {return _a .Error (_badc ,"\u006e\u0069\u006c\u0020\u0027\u0064\u0065\u0073\u0074\u0027\u0020\u0042i\u0074\u006d\u0061\u0070");
|
|
|
|
};if _fbegd ==PixDst {return nil ;};switch _fbegd {case PixClr ,PixSet ,PixNotDst :_ebf (_acgd ,_gedfg ,_dgfc ,_egeb ,_geef ,_fbegd );return nil ;};if _cdcbd ==nil {_fd .Log .Debug ("\u0052a\u0073\u0074e\u0072\u004f\u0070\u0065r\u0061\u0074\u0069o\u006e\u0020\u0073\u006f\u0075\u0072\u0063\u0065\u0020bi\u0074\u006d\u0061p\u0020\u0069s\u0020\u006e\u006f\u0074\u0020\u0064e\u0066\u0069n\u0065\u0064");
|
|
|
|
return _a .Error (_badc ,"\u006e\u0069l\u0020\u0027\u0073r\u0063\u0027\u0020\u0062\u0069\u0074\u006d\u0061\u0070");};if _ccdfd :=_ecadf (_acgd ,_gedfg ,_dgfc ,_egeb ,_geef ,_fbegd ,_cdcbd ,_eedce ,_dbba );_ccdfd !=nil {return _a .Wrap (_ccdfd ,_badc ,"");
|
|
|
|
};return nil ;};func _bgdg (_efad *Bitmap ,_becd int )(*Bitmap ,error ){const _ebdd ="\u0065x\u0070a\u006e\u0064\u0052\u0065\u0070\u006c\u0069\u0063\u0061\u0074\u0065";if _efad ==nil {return nil ,_a .Error (_ebdd ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
|
|
};if _becd <=0{return nil ,_a .Error (_ebdd ,"i\u006e\u0076\u0061\u006cid\u0020f\u0061\u0063\u0074\u006f\u0072 \u002d\u0020\u003c\u003d\u0020\u0030");};if _becd ==1{_efccd ,_gcddd :=_gddf (nil ,_efad );if _gcddd !=nil {return nil ,_a .Wrap (_gcddd ,_ebdd ,"\u0066\u0061\u0063\u0074\u006f\u0072\u0020\u003d\u0020\u0031");
|
|
|
|
};return _efccd ,nil ;};_ggdd ,_egbb :=_gf (_efad ,_becd ,_becd );if _egbb !=nil {return nil ,_a .Wrap (_egbb ,_ebdd ,"");};return _ggdd ,nil ;};type Color int ;func (_geafc *byWidth )Swap (i ,j int ){_geafc .Values [i ],_geafc .Values [j ]=_geafc .Values [j ],_geafc .Values [i ];
|
|
|
|
if _geafc .Boxes !=nil {_geafc .Boxes [i ],_geafc .Boxes [j ]=_geafc .Boxes [j ],_geafc .Boxes [i ];};};func _efgg (_efed *Bitmap ,_bccbd ,_febcab int ,_faca ,_eeac int ,_bbgb RasterOperator ){var (_abggd bool ;_bdaab bool ;_egbf int ;_feeb int ;_cgcga int ;
|
|
|
|
_fbad int ;_bace bool ;_ecdfa byte ;);_geda :=8-(_bccbd &7);_cdda :=_gdba [_geda ];_cdff :=_efed .RowStride *_febcab +(_bccbd >>3);if _faca < _geda {_abggd =true ;_cdda &=_dafg [8-_geda +_faca ];};if !_abggd {_egbf =(_faca -_geda )>>3;if _egbf !=0{_bdaab =true ;
|
|
|
|
_feeb =_cdff +1;};};_cgcga =(_bccbd +_faca )&7;if !(_abggd ||_cgcga ==0){_bace =true ;_ecdfa =_dafg [_cgcga ];_fbad =_cdff +1+_egbf ;};var _bcgaa ,_dbec int ;switch _bbgb {case PixClr :for _bcgaa =0;_bcgaa < _eeac ;_bcgaa ++{_efed .Data [_cdff ]=_cdbf (_efed .Data [_cdff ],0x0,_cdda );
|
|
|
|
_cdff +=_efed .RowStride ;};if _bdaab {for _bcgaa =0;_bcgaa < _eeac ;_bcgaa ++{for _dbec =0;_dbec < _egbf ;_dbec ++{_efed .Data [_feeb +_dbec ]=0x0;};_feeb +=_efed .RowStride ;};};if _bace {for _bcgaa =0;_bcgaa < _eeac ;_bcgaa ++{_efed .Data [_fbad ]=_cdbf (_efed .Data [_fbad ],0x0,_ecdfa );
|
|
|
|
_fbad +=_efed .RowStride ;};};case PixSet :for _bcgaa =0;_bcgaa < _eeac ;_bcgaa ++{_efed .Data [_cdff ]=_cdbf (_efed .Data [_cdff ],0xff,_cdda );_cdff +=_efed .RowStride ;};if _bdaab {for _bcgaa =0;_bcgaa < _eeac ;_bcgaa ++{for _dbec =0;_dbec < _egbf ;
|
|
|
|
_dbec ++{_efed .Data [_feeb +_dbec ]=0xff;};_feeb +=_efed .RowStride ;};};if _bace {for _bcgaa =0;_bcgaa < _eeac ;_bcgaa ++{_efed .Data [_fbad ]=_cdbf (_efed .Data [_fbad ],0xff,_ecdfa );_fbad +=_efed .RowStride ;};};case PixNotDst :for _bcgaa =0;_bcgaa < _eeac ;
|
|
|
|
_bcgaa ++{_efed .Data [_cdff ]=_cdbf (_efed .Data [_cdff ],^_efed .Data [_cdff ],_cdda );_cdff +=_efed .RowStride ;};if _bdaab {for _bcgaa =0;_bcgaa < _eeac ;_bcgaa ++{for _dbec =0;_dbec < _egbf ;_dbec ++{_efed .Data [_feeb +_dbec ]=^(_efed .Data [_feeb +_dbec ]);
|
|
|
|
};_feeb +=_efed .RowStride ;};};if _bace {for _bcgaa =0;_bcgaa < _eeac ;_bcgaa ++{_efed .Data [_fbad ]=_cdbf (_efed .Data [_fbad ],^_efed .Data [_fbad ],_ecdfa );_fbad +=_efed .RowStride ;};};};};func MakePixelCentroidTab8 ()[]int {return _fcca ()};var (_fgdf =_bee ();
|
|
|
|
_bbaa =_dc ();_fdc =_dfc (););func (_beee *Points )AddPoint (x ,y float32 ){*_beee =append (*_beee ,Point {x ,y })};func NewWithData (width ,height int ,data []byte )(*Bitmap ,error ){const _ggac ="N\u0065\u0077\u0057\u0069\u0074\u0068\u0044\u0061\u0074\u0061";
|
|
|
|
_cgfd :=_gcbc (width ,height );_cgfd .Data =data ;if len (data )< height *_cgfd .RowStride {return nil ,_a .Errorf (_ggac ,"\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 *_cgfd .RowStride );
|
|
|
|
};return _cgfd ,nil ;};func (_bfa *Bitmap )GetPixel (x ,y int )bool {_dffa :=_bfa .GetByteIndex (x ,y );_ggb :=_bfa .GetBitOffset (x );_fad :=uint (7-_ggb );if _dffa > len (_bfa .Data )-1{_fd .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 ,_bfa );
|
|
|
|
return false ;};if (_bfa .Data [_dffa ]>>_fad )&0x01>=1{return true ;};return false ;};func CorrelationScore (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab []int )(_bgaf float64 ,_geeb error ){const _afcg ="\u0063\u006fr\u0072\u0065\u006ca\u0074\u0069\u006f\u006e\u0053\u0063\u006f\u0072\u0065";
|
|
|
|
if bm1 ==nil ||bm2 ==nil {return 0,_a .Error (_afcg ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0062\u0069\u0074ma\u0070\u0073");};if tab ==nil {return 0,_a .Error (_afcg ,"\u0027\u0074\u0061\u0062\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065f\u0069\u006e\u0065\u0064");
|
|
|
|
};if area1 <=0||area2 <=0{return 0,_a .Error (_afcg ,"\u0061\u0072\u0065\u0061s\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065\u0020\u0067r\u0065a\u0074\u0065\u0072\u0020\u0074\u0068\u0061n\u0020\u0030");};_bcda ,_gcfg :=bm1 .Width ,bm1 .Height ;_gccdb ,_geeg :=bm2 .Width ,bm2 .Height ;
|
|
|
|
_dgc :=_cbge (_bcda -_gccdb );if _dgc > maxDiffW {return 0,nil ;};_ggff :=_cbge (_gcfg -_geeg );if _ggff > maxDiffH {return 0,nil ;};var _eeeg ,_gfad int ;if delX >=0{_eeeg =int (delX +0.5);}else {_eeeg =int (delX -0.5);};if delY >=0{_gfad =int (delY +0.5);
|
|
|
|
}else {_gfad =int (delY -0.5);};_bgag :=_ffga (_gfad ,0);_geaf :=_bded (_geeg +_gfad ,_gcfg );_ffgdg :=bm1 .RowStride *_bgag ;_dgef :=bm2 .RowStride *(_bgag -_gfad );_fgc :=_ffga (_eeeg ,0);_acea :=_bded (_gccdb +_eeeg ,_bcda );_agfa :=bm2 .RowStride ;
|
|
|
|
var _gbgb ,_bgcc int ;if _eeeg >=8{_gbgb =_eeeg >>3;_ffgdg +=_gbgb ;_fgc -=_gbgb <<3;_acea -=_gbgb <<3;_eeeg &=7;}else if _eeeg <=-8{_bgcc =-((_eeeg +7)>>3);_dgef +=_bgcc ;_agfa -=_bgcc ;_eeeg +=_bgcc <<3;};if _fgc >=_acea ||_bgag >=_geaf {return 0,nil ;
|
|
|
|
};_fbbe :=(_acea +7)>>3;var (_aded ,_bed ,_edde byte ;_cfcb ,_edafd ,_fgbbd int ;);switch {case _eeeg ==0:for _fgbbd =_bgag ;_fgbbd < _geaf ;_fgbbd ,_ffgdg ,_dgef =_fgbbd +1,_ffgdg +bm1 .RowStride ,_dgef +bm2 .RowStride {for _edafd =0;_edafd < _fbbe ;_edafd ++{_edde =bm1 .Data [_ffgdg +_edafd ]&bm2 .Data [_dgef +_edafd ];
|
|
|
|
_cfcb +=tab [_edde ];};};case _eeeg > 0:if _agfa < _fbbe {for _fgbbd =_bgag ;_fgbbd < _geaf ;_fgbbd ,_ffgdg ,_dgef =_fgbbd +1,_ffgdg +bm1 .RowStride ,_dgef +bm2 .RowStride {_aded ,_bed =bm1 .Data [_ffgdg ],bm2 .Data [_dgef ]>>uint (_eeeg );_edde =_aded &_bed ;
|
|
|
|
_cfcb +=tab [_edde ];for _edafd =1;_edafd < _agfa ;_edafd ++{_aded ,_bed =bm1 .Data [_ffgdg +_edafd ],(bm2 .Data [_dgef +_edafd ]>>uint (_eeeg ))|(bm2 .Data [_dgef +_edafd -1]<<uint (8-_eeeg ));_edde =_aded &_bed ;_cfcb +=tab [_edde ];};_aded =bm1 .Data [_ffgdg +_edafd ];
|
|
|
|
_bed =bm2 .Data [_dgef +_edafd -1]<<uint (8-_eeeg );_edde =_aded &_bed ;_cfcb +=tab [_edde ];};}else {for _fgbbd =_bgag ;_fgbbd < _geaf ;_fgbbd ,_ffgdg ,_dgef =_fgbbd +1,_ffgdg +bm1 .RowStride ,_dgef +bm2 .RowStride {_aded ,_bed =bm1 .Data [_ffgdg ],bm2 .Data [_dgef ]>>uint (_eeeg );
|
|
|
|
_edde =_aded &_bed ;_cfcb +=tab [_edde ];for _edafd =1;_edafd < _fbbe ;_edafd ++{_aded =bm1 .Data [_ffgdg +_edafd ];_bed =(bm2 .Data [_dgef +_edafd ]>>uint (_eeeg ))|(bm2 .Data [_dgef +_edafd -1]<<uint (8-_eeeg ));_edde =_aded &_bed ;_cfcb +=tab [_edde ];
|
|
|
|
};};};default:if _fbbe < _agfa {for _fgbbd =_bgag ;_fgbbd < _geaf ;_fgbbd ,_ffgdg ,_dgef =_fgbbd +1,_ffgdg +bm1 .RowStride ,_dgef +bm2 .RowStride {for _edafd =0;_edafd < _fbbe ;_edafd ++{_aded =bm1 .Data [_ffgdg +_edafd ];_bed =bm2 .Data [_dgef +_edafd ]<<uint (-_eeeg );
|
|
|
|
_bed |=bm2 .Data [_dgef +_edafd +1]>>uint (8+_eeeg );_edde =_aded &_bed ;_cfcb +=tab [_edde ];};};}else {for _fgbbd =_bgag ;_fgbbd < _geaf ;_fgbbd ,_ffgdg ,_dgef =_fgbbd +1,_ffgdg +bm1 .RowStride ,_dgef +bm2 .RowStride {for _edafd =0;_edafd < _fbbe -1;
|
|
|
|
_edafd ++{_aded =bm1 .Data [_ffgdg +_edafd ];_bed =bm2 .Data [_dgef +_edafd ]<<uint (-_eeeg );_bed |=bm2 .Data [_dgef +_edafd +1]>>uint (8+_eeeg );_edde =_aded &_bed ;_cfcb +=tab [_edde ];};_aded =bm1 .Data [_ffgdg +_edafd ];_bed =bm2 .Data [_dgef +_edafd ]<<uint (-_eeeg );
|
|
|
|
_edde =_aded &_bed ;_cfcb +=tab [_edde ];};};};_bgaf =float64 (_cfcb )*float64 (_cfcb )/(float64 (area1 )*float64 (area2 ));return _bgaf ,nil ;};func TstGetScaledSymbol (t *_ag .T ,sm *Bitmap ,scale ...int )*Bitmap {if len (scale )==0{return sm ;};if scale [0]==1{return sm ;
|
|
|
|
};_addb ,_eeag :=MorphSequence (sm ,MorphProcess {Operation :MopReplicativeBinaryExpansion ,Arguments :scale });_g .NoError (t ,_eeag );return _addb ;};func _abfe (_bbeg ,_fgce *Bitmap ,_fead ,_dddg int )(_bfcec error ){const _ggfg ="\u0073e\u0065d\u0066\u0069\u006c\u006c\u0042i\u006e\u0061r\u0079\u004c\u006f\u0077\u0038";
|
|
|
|
var (_cagc ,_eceb ,_gcdab ,_fbga int ;_agfbca ,_effe ,_beaee ,_dgbg ,_gfdc ,_gafd ,_gdeba ,_ecdff byte ;);for _cagc =0;_cagc < _fead ;_cagc ++{_gcdab =_cagc *_bbeg .RowStride ;_fbga =_cagc *_fgce .RowStride ;for _eceb =0;_eceb < _dddg ;_eceb ++{if _agfbca ,_bfcec =_bbeg .GetByte (_gcdab +_eceb );
|
|
|
|
_bfcec !=nil {return _a .Wrap (_bfcec ,_ggfg ,"\u0067e\u0074 \u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0062\u0079\u0074\u0065");};if _effe ,_bfcec =_fgce .GetByte (_fbga +_eceb );_bfcec !=nil {return _a .Wrap (_bfcec ,_ggfg ,"\u0067\u0065\u0074\u0020\u006d\u0061\u0073\u006b\u0020\u0062\u0079\u0074\u0065");
|
|
|
|
};if _cagc > 0{if _beaee ,_bfcec =_bbeg .GetByte (_gcdab -_bbeg .RowStride +_eceb );_bfcec !=nil {return _a .Wrap (_bfcec ,_ggfg ,"\u0069\u0020\u003e\u0020\u0030\u0020\u0062\u0079\u0074\u0065");};_agfbca |=_beaee |(_beaee <<1)|(_beaee >>1);if _eceb > 0{if _ecdff ,_bfcec =_bbeg .GetByte (_gcdab -_bbeg .RowStride +_eceb -1);
|
|
|
|
_bfcec !=nil {return _a .Wrap (_bfcec ,_ggfg ,"\u0069\u0020\u003e\u00200 \u0026\u0026\u0020\u006a\u0020\u003e\u0020\u0030\u0020\u0062\u0079\u0074\u0065");};_agfbca |=_ecdff <<7;};if _eceb < _dddg -1{if _ecdff ,_bfcec =_bbeg .GetByte (_gcdab -_bbeg .RowStride +_eceb +1);
|
|
|
|
_bfcec !=nil {return _a .Wrap (_bfcec ,_ggfg ,"\u006a\u0020<\u0020\u0077\u0070l\u0020\u002d\u0020\u0031\u0020\u0062\u0079\u0074\u0065");};_agfbca |=_ecdff >>7;};};if _eceb > 0{if _dgbg ,_bfcec =_bbeg .GetByte (_gcdab +_eceb -1);_bfcec !=nil {return _a .Wrap (_bfcec ,_ggfg ,"\u006a\u0020\u003e \u0030");
|
|
|
|
};_agfbca |=_dgbg <<7;};_agfbca &=_effe ;if _agfbca ==0||^_agfbca ==0{if _bfcec =_bbeg .SetByte (_gcdab +_eceb ,_agfbca );_bfcec !=nil {return _a .Wrap (_bfcec ,_ggfg ,"\u0073e\u0074t\u0069\u006e\u0067\u0020\u0065m\u0070\u0074y\u0020\u0062\u0079\u0074\u0065");
|
|
|
|
};};for {_gdeba =_agfbca ;_agfbca =(_agfbca |(_agfbca >>1)|(_agfbca <<1))&_effe ;if (_agfbca ^_gdeba )==0{if _bfcec =_bbeg .SetByte (_gcdab +_eceb ,_agfbca );_bfcec !=nil {return _a .Wrap (_bfcec ,_ggfg ,"\u0073\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u0070\u0072\u0065\u0076 \u0062\u0079\u0074\u0065");
|
|
|
|
};break ;};};};};for _cagc =_fead -1;_cagc >=0;_cagc --{_gcdab =_cagc *_bbeg .RowStride ;_fbga =_cagc *_fgce .RowStride ;for _eceb =_dddg -1;_eceb >=0;_eceb --{if _agfbca ,_bfcec =_bbeg .GetByte (_gcdab +_eceb );_bfcec !=nil {return _a .Wrap (_bfcec ,_ggfg ,"\u0072\u0065\u0076er\u0073\u0065\u0020\u0067\u0065\u0074\u0020\u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0062\u0079\u0074\u0065");
|
|
|
|
};if _effe ,_bfcec =_fgce .GetByte (_fbga +_eceb );_bfcec !=nil {return _a .Wrap (_bfcec ,_ggfg ,"r\u0065\u0076\u0065\u0072se\u0020g\u0065\u0074\u0020\u006d\u0061s\u006b\u0020\u0062\u0079\u0074\u0065");};if _cagc < _fead -1{if _gfdc ,_bfcec =_bbeg .GetByte (_gcdab +_bbeg .RowStride +_eceb );
|
|
|
|
_bfcec !=nil {return _a .Wrap (_bfcec ,_ggfg ,"\u0069\u0020\u003c\u0020h\u0020\u002d\u0020\u0031\u0020\u002d\u003e\u0020\u0067\u0065t\u0020s\u006f\u0075\u0072\u0063\u0065\u0020\u0062y\u0074\u0065");};_agfbca |=_gfdc |(_gfdc <<1)|_gfdc >>1;if _eceb > 0{if _ecdff ,_bfcec =_bbeg .GetByte (_gcdab +_bbeg .RowStride +_eceb -1);
|
|
|
|
_bfcec !=nil {return _a .Wrap (_bfcec ,_ggfg ,"\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");};_agfbca |=_ecdff <<7;};if _eceb < _dddg -1{if _ecdff ,_bfcec =_bbeg .GetByte (_gcdab +_bbeg .RowStride +_eceb +1);
|
|
|
|
_bfcec !=nil {return _a .Wrap (_bfcec ,_ggfg ,"\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");
|
|
|
|
};_agfbca |=_ecdff >>7;};};if _eceb < _dddg -1{if _gafd ,_bfcec =_bbeg .GetByte (_gcdab +_eceb +1);_bfcec !=nil {return _a .Wrap (_bfcec ,_ggfg ,"\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");
|
|
|
|
};_agfbca |=_gafd >>7;};_agfbca &=_effe ;if _agfbca ==0||(^_agfbca )==0{if _bfcec =_bbeg .SetByte (_gcdab +_eceb ,_agfbca );_bfcec !=nil {return _a .Wrap (_bfcec ,_ggfg ,"\u0073e\u0074 \u006d\u0061\u0073\u006b\u0065\u0064\u0020\u0062\u0079\u0074\u0065");
|
|
|
|
};};for {_gdeba =_agfbca ;_agfbca =(_agfbca |(_agfbca >>1)|(_agfbca <<1))&_effe ;if (_agfbca ^_gdeba )==0{if _bfcec =_bbeg .SetByte (_gcdab +_eceb ,_agfbca );_bfcec !=nil {return _a .Wrap (_bfcec ,_ggfg ,"r\u0065\u0076\u0065\u0072se\u0020s\u0065\u0074\u0020\u0070\u0072e\u0076\u0020\u0062\u0079\u0074\u0065");
|
|
|
|
};break ;};};};};return nil ;};func (_acdg *Bitmap )setPadBits (_edfe int ){_bdd :=8-_acdg .Width %8;if _bdd ==8{return ;};_gge :=_acdg .Width /8;_gaed :=_gdba [_bdd ];if _edfe ==0{_gaed ^=_gaed ;};var _gba int ;for _bdc :=0;_bdc < _acdg .Height ;_bdc ++{_gba =_bdc *_acdg .RowStride +_gge ;
|
|
|
|
if _edfe ==0{_acdg .Data [_gba ]&=_gaed ;}else {_acdg .Data [_gba ]|=_gaed ;};};};func _feaf (_gfec *Bitmap ,_ccbe ,_ggbc int ,_dbee ,_cfgbg int ,_cdgf RasterOperator ){var (_ggaea int ;_fcdd byte ;_dfae ,_dbaf int ;_geaga int ;);_febca :=_dbee >>3;_dgce :=_dbee &7;
|
|
|
|
if _dgce > 0{_fcdd =_dafg [_dgce ];};_ggaea =_gfec .RowStride *_ggbc +(_ccbe >>3);switch _cdgf {case PixClr :for _dfae =0;_dfae < _cfgbg ;_dfae ++{_geaga =_ggaea +_dfae *_gfec .RowStride ;for _dbaf =0;_dbaf < _febca ;_dbaf ++{_gfec .Data [_geaga ]=0x0;
|
|
|
|
_geaga ++;};if _dgce > 0{_gfec .Data [_geaga ]=_cdbf (_gfec .Data [_geaga ],0x0,_fcdd );};};case PixSet :for _dfae =0;_dfae < _cfgbg ;_dfae ++{_geaga =_ggaea +_dfae *_gfec .RowStride ;for _dbaf =0;_dbaf < _febca ;_dbaf ++{_gfec .Data [_geaga ]=0xff;_geaga ++;
|
|
|
|
};if _dgce > 0{_gfec .Data [_geaga ]=_cdbf (_gfec .Data [_geaga ],0xff,_fcdd );};};case PixNotDst :for _dfae =0;_dfae < _cfgbg ;_dfae ++{_geaga =_ggaea +_dfae *_gfec .RowStride ;for _dbaf =0;_dbaf < _febca ;_dbaf ++{_gfec .Data [_geaga ]=^_gfec .Data [_geaga ];
|
|
|
|
_geaga ++;};if _dgce > 0{_gfec .Data [_geaga ]=_cdbf (_gfec .Data [_geaga ],^_gfec .Data [_geaga ],_fcdd );};};};};func (_caef *byHeight )Len ()int {return len (_caef .Values )};func (_cggc *Bitmap )String ()string {var _dfd ="\u000a";for _ddgd :=0;_ddgd < _cggc .Height ;
|
|
|
|
_ddgd ++{var _ccdc string ;for _bgd :=0;_bgd < _cggc .Width ;_bgd ++{_cee :=_cggc .GetPixel (_bgd ,_ddgd );if _cee {_ccdc +="\u0031";}else {_ccdc +="\u0030";};};_dfd +=_ccdc +"\u000a";};return _dfd ;};func (_efagd *BitmapsArray )AddBitmaps (bm *Bitmaps ){_efagd .Values =append (_efagd .Values ,bm )};
|
|
|
|
func _cbge (_cbfd int )int {if _cbfd < 0{return -_cbfd ;};return _cbfd ;};func RankHausTest (p1 ,p2 ,p3 ,p4 *Bitmap ,delX ,delY float32 ,maxDiffW ,maxDiffH ,area1 ,area3 int ,rank float32 ,tab8 []int )(_abab bool ,_fgbd error ){const _dfed ="\u0052\u0061\u006ek\u0048\u0061\u0075\u0073\u0054\u0065\u0073\u0074";
|
|
|
|
_bffc ,_gdbe :=p1 .Width ,p1 .Height ;_defa ,_dfaa :=p3 .Width ,p3 .Height ;if _ed .Abs (_bffc -_defa )> maxDiffW {return false ,nil ;};if _ed .Abs (_gdbe -_dfaa )> maxDiffH {return false ,nil ;};_efeg :=int (float32 (area1 )*(1.0-rank )+0.5);_cgba :=int (float32 (area3 )*(1.0-rank )+0.5);
|
|
|
|
var _bgec ,_fegc int ;if delX >=0{_bgec =int (delX +0.5);}else {_bgec =int (delX -0.5);};if delY >=0{_fegc =int (delY +0.5);}else {_fegc =int (delY -0.5);};_abbd :=p1 .CreateTemplate ();if _fgbd =_abbd .RasterOperation (0,0,_bffc ,_gdbe ,PixSrc ,p1 ,0,0);
|
|
|
|
_fgbd !=nil {return false ,_a .Wrap (_fgbd ,_dfed ,"p\u0031\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _fgbd =_abbd .RasterOperation (_bgec ,_fegc ,_bffc ,_gdbe ,PixNotSrcAndDst ,p4 ,0,0);_fgbd !=nil {return false ,_a .Wrap (_fgbd ,_dfed ,"\u0074 \u0026\u0020\u0021\u0070\u0034");
|
|
|
|
};_abab ,_fgbd =_abbd .ThresholdPixelSum (_efeg ,tab8 );if _fgbd !=nil {return false ,_a .Wrap (_fgbd ,_dfed ,"\u0074\u002d\u003e\u0074\u0068\u0072\u0065\u0073\u0068\u0031");};if _abab {return false ,nil ;};if _fgbd =_abbd .RasterOperation (_bgec ,_fegc ,_defa ,_dfaa ,PixSrc ,p3 ,0,0);
|
|
|
|
_fgbd !=nil {return false ,_a .Wrap (_fgbd ,_dfed ,"p\u0033\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _fgbd =_abbd .RasterOperation (0,0,_defa ,_dfaa ,PixNotSrcAndDst ,p2 ,0,0);_fgbd !=nil {return false ,_a .Wrap (_fgbd ,_dfed ,"\u0074 \u0026\u0020\u0021\u0070\u0032");
|
|
|
|
};_abab ,_fgbd =_abbd .ThresholdPixelSum (_cgba ,tab8 );if _fgbd !=nil {return false ,_a .Wrap (_fgbd ,_dfed ,"\u0074\u002d\u003e\u0074\u0068\u0072\u0065\u0073\u0068\u0033");};return !_abab ,nil ;};const _cade =5000;type MorphOperation int ;func (_cffe Points )GetIntY (i int )(int ,error ){if i >=len (_cffe ){return 0,_a .Errorf ("\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0065t\u0049\u006e\u0074\u0059","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
|
|
};return int (_cffe [i ].Y ),nil ;};type LocationFilter int ;func Copy (d ,s *Bitmap )(*Bitmap ,error ){return _gddf (d ,s )};func (_cgec *Bitmap )GetComponents (components Component ,maxWidth ,maxHeight int )(_baaa *Bitmaps ,_edfb *Boxes ,_cagg error ){const _cgeca ="B\u0069t\u006d\u0061\u0070\u002e\u0047\u0065\u0074\u0043o\u006d\u0070\u006f\u006een\u0074\u0073";
|
|
|
|
if _cgec ==nil {return nil ,nil ,_a .Error (_cgeca ,"\u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0042\u0069\u0074\u006da\u0070\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069n\u0065\u0064\u002e");};switch components {case ComponentConn ,ComponentCharacters ,ComponentWords :default:return nil ,nil ,_a .Error (_cgeca ,"\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 _cgec .Zero (){_edfb =&Boxes {};_baaa =&Bitmaps {};return _baaa ,_edfb ,nil ;};switch components {case ComponentConn :_baaa =&Bitmaps {};if _edfb ,_cagg =_cgec .ConnComponents (_baaa ,8);_cagg !=nil {return nil ,nil ,_a .Wrap (_cagg ,_cgeca ,"\u006e\u006f \u0070\u0072\u0065p\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");
|
|
|
|
};case ComponentCharacters :_adcg ,_dbd :=MorphSequence (_cgec ,MorphProcess {Operation :MopClosing ,Arguments :[]int {1,6}});if _dbd !=nil {return nil ,nil ,_a .Wrap (_dbd ,_cgeca ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");
|
|
|
|
};if _fd .Log .IsLogLevel (_fd .LogLevelTrace ){_fd .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",_adcg .String ());
|
|
|
|
};_agec :=&Bitmaps {};_edfb ,_dbd =_adcg .ConnComponents (_agec ,8);if _dbd !=nil {return nil ,nil ,_a .Wrap (_dbd ,_cgeca ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");
|
|
|
|
};if _fd .Log .IsLogLevel (_fd .LogLevelTrace ){_fd .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",_agec .String ());
|
|
|
|
};if _baaa ,_dbd =_agec .ClipToBitmap (_cgec );_dbd !=nil {return nil ,nil ,_a .Wrap (_dbd ,_cgeca ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");};case ComponentWords :_eaed :=1;
|
|
|
|
var _ecgd *Bitmap ;switch {case _cgec .XResolution <=200:_ecgd =_cgec ;case _cgec .XResolution <=400:_eaed =2;_ecgd ,_cagg =_cad (_cgec ,1,0,0,0);if _cagg !=nil {return nil ,nil ,_a .Wrap (_cagg ,_cgeca ,"w\u006f\u0072\u0064\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0020\u002d \u0078\u0072\u0065s\u003c=\u0034\u0030\u0030");
|
|
|
|
};default:_eaed =4;_ecgd ,_cagg =_cad (_cgec ,1,1,0,0);if _cagg !=nil {return nil ,nil ,_a .Wrap (_cagg ,_cgeca ,"\u0077\u006f\u0072\u0064 \u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073 \u002d \u0078\u0072\u0065\u0073\u0020\u003e\u00204\u0030\u0030");
|
|
|
|
};};_gefbg ,_ ,_facf :=_efaf (_ecgd );if _facf !=nil {return nil ,nil ,_a .Wrap (_facf ,_cgeca ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");};_aefc ,_facf :=_bgdg (_gefbg ,_eaed );if _facf !=nil {return nil ,nil ,_a .Wrap (_facf ,_cgeca ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");
|
|
|
|
};_faec :=&Bitmaps {};if _edfb ,_facf =_aefc .ConnComponents (_faec ,4);_facf !=nil {return nil ,nil ,_a .Wrap (_facf ,_cgeca ,"\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 _baaa ,_facf =_faec .ClipToBitmap (_cgec );_facf !=nil {return nil ,nil ,_a .Wrap (_facf ,_cgeca ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");};};_baaa ,_cagg =_baaa .SelectBySize (maxWidth ,maxHeight ,LocSelectIfBoth ,SizeSelectIfLTE );
|
|
|
|
if _cagg !=nil {return nil ,nil ,_a .Wrap (_cagg ,_cgeca ,"");};_edfb ,_cagg =_edfb .SelectBySize (maxWidth ,maxHeight ,LocSelectIfBoth ,SizeSelectIfLTE );if _cagg !=nil {return nil ,nil ,_a .Wrap (_cagg ,_cgeca ,"");};return _baaa ,_edfb ,nil ;};type Boxes []*_cc .Rectangle ;
|
|
|
|
func SelCreateBrick (h ,w int ,cy ,cx int ,tp SelectionValue )*Selection {_defdd :=_gedae (h ,w ,"");_defdd .setOrigin (cy ,cx );var _daed ,_eaec int ;for _daed =0;_daed < h ;_daed ++{for _eaec =0;_eaec < w ;_eaec ++{_defdd .Data [_daed ][_eaec ]=tp ;};
|
|
|
|
};return _defdd ;};type MorphProcess struct{Operation MorphOperation ;Arguments []int ;};func (_gcdfe *ClassedPoints )xSortFunction ()func (_bdaa int ,_bcge int )bool {return func (_cdaf ,_ebcb int )bool {return _gcdfe .XAtIndex (_cdaf )< _gcdfe .XAtIndex (_ebcb )};
|
|
|
|
};func _cbdc (_beda ,_efdcc ,_egaa *Bitmap ,_gdca int )(*Bitmap ,error ){const _accf ="\u0073\u0065\u0065\u0064\u0046\u0069\u006c\u006c\u0042i\u006e\u0061\u0072\u0079";if _efdcc ==nil {return nil ,_a .Error (_accf ,"s\u006fu\u0072\u0063\u0065\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");
|
|
|
|
};if _egaa ==nil {return nil ,_a .Error (_accf ,"'\u006da\u0073\u006b\u0027\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");};if _gdca !=4&&_gdca !=8{return nil ,_a .Error (_accf ,"\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 _gace error ;_beda ,_gace =_gddf (_beda ,_efdcc );if _gace !=nil {return nil ,_a .Wrap (_gace ,_accf ,"\u0063o\u0070y\u0020\u0073\u006f\u0075\u0072c\u0065\u0020t\u006f\u0020\u0027\u0064\u0027");};_fbcfc :=_efdcc .createTemplate ();_egaa .setPadBits (0);
|
|
|
|
for _fgge :=0;_fgge < _cade ;_fgge ++{_fbcfc ,_gace =_gddf (_fbcfc ,_beda );if _gace !=nil {return nil ,_a .Wrapf (_gace ,_accf ,"\u0069\u0074\u0065\u0072\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0064",_fgge );};if _gace =_gfgdf (_beda ,_egaa ,_gdca );
|
|
|
|
_gace !=nil {return nil ,_a .Wrapf (_gace ,_accf ,"\u0069\u0074\u0065\u0072\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0064",_fgge );};if _fbcfc .Equals (_beda ){break ;};};return _beda ,nil ;};func (_gbdd *Bitmap )CountPixels ()int {return _gbdd .countPixels ()};
|
|
|
|
func ClipBoxToRectangle (box *_cc .Rectangle ,wi ,hi int )(_ccef *_cc .Rectangle ,_gca error ){const _gege ="\u0043l\u0069p\u0042\u006f\u0078\u0054\u006fR\u0065\u0063t\u0061\u006e\u0067\u006c\u0065";if box ==nil {return nil ,_a .Error (_gege ,"\u0027\u0062\u006f\u0078\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065f\u0069\u006e\u0065\u0064");
|
|
|
|
};if box .Min .X >=wi ||box .Min .Y >=hi ||box .Max .X <=0||box .Max .Y <=0{return nil ,_a .Error (_gege ,"\u0027\u0062\u006fx'\u0020\u006f\u0075\u0074\u0073\u0069\u0064\u0065\u0020\u0072\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065");};_ggfcd :=*box ;
|
|
|
|
_ccef =&_ggfcd ;if _ccef .Min .X < 0{_ccef .Max .X +=_ccef .Min .X ;_ccef .Min .X =0;};if _ccef .Min .Y < 0{_ccef .Max .Y +=_ccef .Min .Y ;_ccef .Min .Y =0;};if _ccef .Max .X > wi {_ccef .Max .X =wi ;};if _ccef .Max .Y > hi {_ccef .Max .Y =hi ;};return _ccef ,nil ;
|
|
|
|
};type Bitmaps struct{Values []*Bitmap ;Boxes []*_cc .Rectangle ;};func (_badb *Bitmap )ConnComponents (bms *Bitmaps ,connectivity int )(_fagb *Boxes ,_gda error ){const _bbfb ="B\u0069\u0074\u006d\u0061p.\u0043o\u006e\u006e\u0043\u006f\u006dp\u006f\u006e\u0065\u006e\u0074\u0073";
|
|
|
|
if _badb ==nil {return nil ,_a .Error (_bbfb ,"\u0070r\u006f\u0076\u0069\u0064e\u0064\u0020\u0065\u006d\u0070t\u0079 \u0027b\u0027\u0020\u0062\u0069\u0074\u006d\u0061p");};if connectivity !=4&&connectivity !=8{return nil ,_a .Error (_bbfb ,"\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 _fagb ,_gda =_badb .connComponentsBB (connectivity );_gda !=nil {return nil ,_a .Wrap (_gda ,_bbfb ,"");};}else {if _fagb ,_gda =_badb .connComponentsBitmapsBB (bms ,connectivity );_gda !=nil {return nil ,_a .Wrap (_gda ,_bbfb ,"");};
|
|
|
|
};return _fagb ,nil ;};func _bee ()(_cbe [256]uint16 ){for _abb :=0;_abb < 256;_abb ++{if _abb &0x01!=0{_cbe [_abb ]|=0x3;};if _abb &0x02!=0{_cbe [_abb ]|=0xc;};if _abb &0x04!=0{_cbe [_abb ]|=0x30;};if _abb &0x08!=0{_cbe [_abb ]|=0xc0;};if _abb &0x10!=0{_cbe [_abb ]|=0x300;
|
|
|
|
};if _abb &0x20!=0{_cbe [_abb ]|=0xc00;};if _abb &0x40!=0{_cbe [_abb ]|=0x3000;};if _abb &0x80!=0{_cbe [_abb ]|=0xc000;};};return _cbe ;};type Points []Point ;func _eefa (_cda ,_cbde byte ,_ecdf CombinationOperator )byte {switch _ecdf {case CmbOpOr :return _cbde |_cda ;
|
|
|
|
case CmbOpAnd :return _cbde &_cda ;case CmbOpXor :return _cbde ^_cda ;case CmbOpXNor :return ^(_cbde ^_cda );case CmbOpNot :return ^(_cbde );default:return _cbde ;};};func _dc ()(_bff [256]uint32 ){for _egg :=0;_egg < 256;_egg ++{if _egg &0x01!=0{_bff [_egg ]|=0xf;
|
|
|
|
};if _egg &0x02!=0{_bff [_egg ]|=0xf0;};if _egg &0x04!=0{_bff [_egg ]|=0xf00;};if _egg &0x08!=0{_bff [_egg ]|=0xf000;};if _egg &0x10!=0{_bff [_egg ]|=0xf0000;};if _egg &0x20!=0{_bff [_egg ]|=0xf00000;};if _egg &0x40!=0{_bff [_egg ]|=0xf000000;};if _egg &0x80!=0{_bff [_egg ]|=0xf0000000;
|
|
|
|
};};return _bff ;};type Selection struct{Height ,Width int ;Cx ,Cy int ;Name string ;Data [][]SelectionValue ;};func (_afddg *byHeight )Swap (i ,j int ){_afddg .Values [i ],_afddg .Values [j ]=_afddg .Values [j ],_afddg .Values [i ];if _afddg .Boxes !=nil {_afddg .Boxes [i ],_afddg .Boxes [j ]=_afddg .Boxes [j ],_afddg .Boxes [i ];
|
|
|
|
};};func _egfg (_acbdc *Bitmap ,_ddbe *Bitmap ,_dgdbe *Selection )(*Bitmap ,error ){var (_gabb *Bitmap ;_fbca error ;);_acbdc ,_fbca =_cbdfe (_acbdc ,_ddbe ,_dgdbe ,&_gabb );if _fbca !=nil {return nil ,_fbca ;};if _fbca =_acbdc .clearAll ();_fbca !=nil {return nil ,_fbca ;
|
|
|
|
};var _bfac SelectionValue ;for _dbcf :=0;_dbcf < _dgdbe .Height ;_dbcf ++{for _deddb :=0;_deddb < _dgdbe .Width ;_deddb ++{_bfac =_dgdbe .Data [_dbcf ][_deddb ];if _bfac ==SelHit {if _fbca =_acbdc .RasterOperation (_deddb -_dgdbe .Cx ,_dbcf -_dgdbe .Cy ,_ddbe .Width ,_ddbe .Height ,PixSrcOrDst ,_gabb ,0,0);
|
|
|
|
_fbca !=nil {return nil ,_fbca ;};};};};return _acbdc ,nil ;};func _bdcg (_effb *Bitmap ,_beccb ,_gdad ,_ecca ,_ecgf int ,_bbbdd RasterOperator ,_dfab *Bitmap ,_fefd ,_geac int )error {var (_cefb bool ;_eaeec bool ;_gedg int ;_bbbg int ;_cae int ;_dcccc bool ;
|
|
|
|
_gbcf byte ;_cgae int ;_dbcb int ;_egae int ;_gfgbg ,_afbc int ;);_bade :=8-(_beccb &7);_cafa :=_gdba [_bade ];_babb :=_effb .RowStride *_gdad +(_beccb >>3);_cbgbcg :=_dfab .RowStride *_geac +(_fefd >>3);if _ecca < _bade {_cefb =true ;_cafa &=_dafg [8-_bade +_ecca ];
|
|
|
|
};if !_cefb {_gedg =(_ecca -_bade )>>3;if _gedg > 0{_eaeec =true ;_bbbg =_babb +1;_cae =_cbgbcg +1;};};_cgae =(_beccb +_ecca )&7;if !(_cefb ||_cgae ==0){_dcccc =true ;_gbcf =_dafg [_cgae ];_dbcb =_babb +1+_gedg ;_egae =_cbgbcg +1+_gedg ;};switch _bbbdd {case PixSrc :for _gfgbg =0;
|
|
|
|
_gfgbg < _ecgf ;_gfgbg ++{_effb .Data [_babb ]=_cdbf (_effb .Data [_babb ],_dfab .Data [_cbgbcg ],_cafa );_babb +=_effb .RowStride ;_cbgbcg +=_dfab .RowStride ;};if _eaeec {for _gfgbg =0;_gfgbg < _ecgf ;_gfgbg ++{for _afbc =0;_afbc < _gedg ;_afbc ++{_effb .Data [_bbbg +_afbc ]=_dfab .Data [_cae +_afbc ];
|
|
|
|
};_bbbg +=_effb .RowStride ;_cae +=_dfab .RowStride ;};};if _dcccc {for _gfgbg =0;_gfgbg < _ecgf ;_gfgbg ++{_effb .Data [_dbcb ]=_cdbf (_effb .Data [_dbcb ],_dfab .Data [_egae ],_gbcf );_dbcb +=_effb .RowStride ;_egae +=_dfab .RowStride ;};};case PixNotSrc :for _gfgbg =0;
|
|
|
|
_gfgbg < _ecgf ;_gfgbg ++{_effb .Data [_babb ]=_cdbf (_effb .Data [_babb ],^_dfab .Data [_cbgbcg ],_cafa );_babb +=_effb .RowStride ;_cbgbcg +=_dfab .RowStride ;};if _eaeec {for _gfgbg =0;_gfgbg < _ecgf ;_gfgbg ++{for _afbc =0;_afbc < _gedg ;_afbc ++{_effb .Data [_bbbg +_afbc ]=^_dfab .Data [_cae +_afbc ];
|
|
|
|
};_bbbg +=_effb .RowStride ;_cae +=_dfab .RowStride ;};};if _dcccc {for _gfgbg =0;_gfgbg < _ecgf ;_gfgbg ++{_effb .Data [_dbcb ]=_cdbf (_effb .Data [_dbcb ],^_dfab .Data [_egae ],_gbcf );_dbcb +=_effb .RowStride ;_egae +=_dfab .RowStride ;};};case PixSrcOrDst :for _gfgbg =0;
|
|
|
|
_gfgbg < _ecgf ;_gfgbg ++{_effb .Data [_babb ]=_cdbf (_effb .Data [_babb ],_dfab .Data [_cbgbcg ]|_effb .Data [_babb ],_cafa );_babb +=_effb .RowStride ;_cbgbcg +=_dfab .RowStride ;};if _eaeec {for _gfgbg =0;_gfgbg < _ecgf ;_gfgbg ++{for _afbc =0;_afbc < _gedg ;
|
|
|
|
_afbc ++{_effb .Data [_bbbg +_afbc ]|=_dfab .Data [_cae +_afbc ];};_bbbg +=_effb .RowStride ;_cae +=_dfab .RowStride ;};};if _dcccc {for _gfgbg =0;_gfgbg < _ecgf ;_gfgbg ++{_effb .Data [_dbcb ]=_cdbf (_effb .Data [_dbcb ],_dfab .Data [_egae ]|_effb .Data [_dbcb ],_gbcf );
|
|
|
|
_dbcb +=_effb .RowStride ;_egae +=_dfab .RowStride ;};};case PixSrcAndDst :for _gfgbg =0;_gfgbg < _ecgf ;_gfgbg ++{_effb .Data [_babb ]=_cdbf (_effb .Data [_babb ],_dfab .Data [_cbgbcg ]&_effb .Data [_babb ],_cafa );_babb +=_effb .RowStride ;_cbgbcg +=_dfab .RowStride ;
|
|
|
|
};if _eaeec {for _gfgbg =0;_gfgbg < _ecgf ;_gfgbg ++{for _afbc =0;_afbc < _gedg ;_afbc ++{_effb .Data [_bbbg +_afbc ]&=_dfab .Data [_cae +_afbc ];};_bbbg +=_effb .RowStride ;_cae +=_dfab .RowStride ;};};if _dcccc {for _gfgbg =0;_gfgbg < _ecgf ;_gfgbg ++{_effb .Data [_dbcb ]=_cdbf (_effb .Data [_dbcb ],_dfab .Data [_egae ]&_effb .Data [_dbcb ],_gbcf );
|
|
|
|
_dbcb +=_effb .RowStride ;_egae +=_dfab .RowStride ;};};case PixSrcXorDst :for _gfgbg =0;_gfgbg < _ecgf ;_gfgbg ++{_effb .Data [_babb ]=_cdbf (_effb .Data [_babb ],_dfab .Data [_cbgbcg ]^_effb .Data [_babb ],_cafa );_babb +=_effb .RowStride ;_cbgbcg +=_dfab .RowStride ;
|
|
|
|
};if _eaeec {for _gfgbg =0;_gfgbg < _ecgf ;_gfgbg ++{for _afbc =0;_afbc < _gedg ;_afbc ++{_effb .Data [_bbbg +_afbc ]^=_dfab .Data [_cae +_afbc ];};_bbbg +=_effb .RowStride ;_cae +=_dfab .RowStride ;};};if _dcccc {for _gfgbg =0;_gfgbg < _ecgf ;_gfgbg ++{_effb .Data [_dbcb ]=_cdbf (_effb .Data [_dbcb ],_dfab .Data [_egae ]^_effb .Data [_dbcb ],_gbcf );
|
|
|
|
_dbcb +=_effb .RowStride ;_egae +=_dfab .RowStride ;};};case PixNotSrcOrDst :for _gfgbg =0;_gfgbg < _ecgf ;_gfgbg ++{_effb .Data [_babb ]=_cdbf (_effb .Data [_babb ],^(_dfab .Data [_cbgbcg ])|_effb .Data [_babb ],_cafa );_babb +=_effb .RowStride ;_cbgbcg +=_dfab .RowStride ;
|
|
|
|
};if _eaeec {for _gfgbg =0;_gfgbg < _ecgf ;_gfgbg ++{for _afbc =0;_afbc < _gedg ;_afbc ++{_effb .Data [_bbbg +_afbc ]|=^(_dfab .Data [_cae +_afbc ]);};_bbbg +=_effb .RowStride ;_cae +=_dfab .RowStride ;};};if _dcccc {for _gfgbg =0;_gfgbg < _ecgf ;_gfgbg ++{_effb .Data [_dbcb ]=_cdbf (_effb .Data [_dbcb ],^(_dfab .Data [_egae ])|_effb .Data [_dbcb ],_gbcf );
|
|
|
|
_dbcb +=_effb .RowStride ;_egae +=_dfab .RowStride ;};};case PixNotSrcAndDst :for _gfgbg =0;_gfgbg < _ecgf ;_gfgbg ++{_effb .Data [_babb ]=_cdbf (_effb .Data [_babb ],^(_dfab .Data [_cbgbcg ])&_effb .Data [_babb ],_cafa );_babb +=_effb .RowStride ;_cbgbcg +=_dfab .RowStride ;
|
|
|
|
};if _eaeec {for _gfgbg =0;_gfgbg < _ecgf ;_gfgbg ++{for _afbc =0;_afbc < _gedg ;_afbc ++{_effb .Data [_bbbg +_afbc ]&=^_dfab .Data [_cae +_afbc ];};_bbbg +=_effb .RowStride ;_cae +=_dfab .RowStride ;};};if _dcccc {for _gfgbg =0;_gfgbg < _ecgf ;_gfgbg ++{_effb .Data [_dbcb ]=_cdbf (_effb .Data [_dbcb ],^(_dfab .Data [_egae ])&_effb .Data [_dbcb ],_gbcf );
|
|
|
|
_dbcb +=_effb .RowStride ;_egae +=_dfab .RowStride ;};};case PixSrcOrNotDst :for _gfgbg =0;_gfgbg < _ecgf ;_gfgbg ++{_effb .Data [_babb ]=_cdbf (_effb .Data [_babb ],_dfab .Data [_cbgbcg ]|^(_effb .Data [_babb ]),_cafa );_babb +=_effb .RowStride ;_cbgbcg +=_dfab .RowStride ;
|
|
|
|
};if _eaeec {for _gfgbg =0;_gfgbg < _ecgf ;_gfgbg ++{for _afbc =0;_afbc < _gedg ;_afbc ++{_effb .Data [_bbbg +_afbc ]=_dfab .Data [_cae +_afbc ]|^(_effb .Data [_bbbg +_afbc ]);};_bbbg +=_effb .RowStride ;_cae +=_dfab .RowStride ;};};if _dcccc {for _gfgbg =0;
|
|
|
|
_gfgbg < _ecgf ;_gfgbg ++{_effb .Data [_dbcb ]=_cdbf (_effb .Data [_dbcb ],_dfab .Data [_egae ]|^(_effb .Data [_dbcb ]),_gbcf );_dbcb +=_effb .RowStride ;_egae +=_dfab .RowStride ;};};case PixSrcAndNotDst :for _gfgbg =0;_gfgbg < _ecgf ;_gfgbg ++{_effb .Data [_babb ]=_cdbf (_effb .Data [_babb ],_dfab .Data [_cbgbcg ]&^(_effb .Data [_babb ]),_cafa );
|
|
|
|
_babb +=_effb .RowStride ;_cbgbcg +=_dfab .RowStride ;};if _eaeec {for _gfgbg =0;_gfgbg < _ecgf ;_gfgbg ++{for _afbc =0;_afbc < _gedg ;_afbc ++{_effb .Data [_bbbg +_afbc ]=_dfab .Data [_cae +_afbc ]&^(_effb .Data [_bbbg +_afbc ]);};_bbbg +=_effb .RowStride ;
|
|
|
|
_cae +=_dfab .RowStride ;};};if _dcccc {for _gfgbg =0;_gfgbg < _ecgf ;_gfgbg ++{_effb .Data [_dbcb ]=_cdbf (_effb .Data [_dbcb ],_dfab .Data [_egae ]&^(_effb .Data [_dbcb ]),_gbcf );_dbcb +=_effb .RowStride ;_egae +=_dfab .RowStride ;};};case PixNotPixSrcOrDst :for _gfgbg =0;
|
|
|
|
_gfgbg < _ecgf ;_gfgbg ++{_effb .Data [_babb ]=_cdbf (_effb .Data [_babb ],^(_dfab .Data [_cbgbcg ]|_effb .Data [_babb ]),_cafa );_babb +=_effb .RowStride ;_cbgbcg +=_dfab .RowStride ;};if _eaeec {for _gfgbg =0;_gfgbg < _ecgf ;_gfgbg ++{for _afbc =0;_afbc < _gedg ;
|
|
|
|
_afbc ++{_effb .Data [_bbbg +_afbc ]=^(_dfab .Data [_cae +_afbc ]|_effb .Data [_bbbg +_afbc ]);};_bbbg +=_effb .RowStride ;_cae +=_dfab .RowStride ;};};if _dcccc {for _gfgbg =0;_gfgbg < _ecgf ;_gfgbg ++{_effb .Data [_dbcb ]=_cdbf (_effb .Data [_dbcb ],^(_dfab .Data [_egae ]|_effb .Data [_dbcb ]),_gbcf );
|
|
|
|
_dbcb +=_effb .RowStride ;_egae +=_dfab .RowStride ;};};case PixNotPixSrcAndDst :for _gfgbg =0;_gfgbg < _ecgf ;_gfgbg ++{_effb .Data [_babb ]=_cdbf (_effb .Data [_babb ],^(_dfab .Data [_cbgbcg ]&_effb .Data [_babb ]),_cafa );_babb +=_effb .RowStride ;_cbgbcg +=_dfab .RowStride ;
|
|
|
|
};if _eaeec {for _gfgbg =0;_gfgbg < _ecgf ;_gfgbg ++{for _afbc =0;_afbc < _gedg ;_afbc ++{_effb .Data [_bbbg +_afbc ]=^(_dfab .Data [_cae +_afbc ]&_effb .Data [_bbbg +_afbc ]);};_bbbg +=_effb .RowStride ;_cae +=_dfab .RowStride ;};};if _dcccc {for _gfgbg =0;
|
|
|
|
_gfgbg < _ecgf ;_gfgbg ++{_effb .Data [_dbcb ]=_cdbf (_effb .Data [_dbcb ],^(_dfab .Data [_egae ]&_effb .Data [_dbcb ]),_gbcf );_dbcb +=_effb .RowStride ;_egae +=_dfab .RowStride ;};};case PixNotPixSrcXorDst :for _gfgbg =0;_gfgbg < _ecgf ;_gfgbg ++{_effb .Data [_babb ]=_cdbf (_effb .Data [_babb ],^(_dfab .Data [_cbgbcg ]^_effb .Data [_babb ]),_cafa );
|
|
|
|
_babb +=_effb .RowStride ;_cbgbcg +=_dfab .RowStride ;};if _eaeec {for _gfgbg =0;_gfgbg < _ecgf ;_gfgbg ++{for _afbc =0;_afbc < _gedg ;_afbc ++{_effb .Data [_bbbg +_afbc ]=^(_dfab .Data [_cae +_afbc ]^_effb .Data [_bbbg +_afbc ]);};_bbbg +=_effb .RowStride ;
|
|
|
|
_cae +=_dfab .RowStride ;};};if _dcccc {for _gfgbg =0;_gfgbg < _ecgf ;_gfgbg ++{_effb .Data [_dbcb ]=_cdbf (_effb .Data [_dbcb ],^(_dfab .Data [_egae ]^_effb .Data [_dbcb ]),_gbcf );_dbcb +=_effb .RowStride ;_egae +=_dfab .RowStride ;};};default:_fd .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",_bbbdd );
|
|
|
|
return _a .Error ("\u0072\u0061\u0073\u0074er\u004f\u0070\u0056\u0041\u006c\u0069\u0067\u006e\u0065\u0064\u004c\u006f\u0077","\u0069\u006e\u0076al\u0069\u0064\u0020\u0072\u0061\u0073\u0074\u0065\u0072\u0020\u006f\u0070\u0065\u0072\u0061\u0074\u006f\u0072");
|
|
|
|
};return nil ;};func (_fcgb *Bitmap )GetChocolateData ()[]byte {if _fcgb .Color ==Vanilla {_fcgb .inverseData ();};return _fcgb .Data ;};func (_acee *ClassedPoints )Swap (i ,j int ){_acee .IntSlice [i ],_acee .IntSlice [j ]=_acee .IntSlice [j ],_acee .IntSlice [i ];
|
|
|
|
};func _ecdfd (_gbdf *Bitmap ,_fdfc ,_cfef ,_eedcd ,_acda int ,_badaa RasterOperator ,_bac *Bitmap ,_caae ,_dddc int )error {var (_dcgag bool ;_adgdd bool ;_geff byte ;_fgfa int ;_afed int ;_ffae int ;_acfec int ;_cdfd bool ;_aacgf int ;_ggag int ;_cggf int ;
|
|
|
|
_gcdgf bool ;_beae byte ;_dgdee int ;_aacbg int ;_agfbc int ;_edaa byte ;_bcae int ;_dbdaf int ;_dbeg uint ;_ecbf uint ;_beg byte ;_cfgbe shift ;_gfbe bool ;_fbaba bool ;_debb ,_dccaa int ;);if _caae &7!=0{_dbdaf =8-(_caae &7);};if _fdfc &7!=0{_afed =8-(_fdfc &7);
|
|
|
|
};if _dbdaf ==0&&_afed ==0{_beg =_gdba [0];}else {if _afed > _dbdaf {_dbeg =uint (_afed -_dbdaf );}else {_dbeg =uint (8-(_dbdaf -_afed ));};_ecbf =8-_dbeg ;_beg =_gdba [_dbeg ];};if (_fdfc &7)!=0{_dcgag =true ;_fgfa =8-(_fdfc &7);_geff =_gdba [_fgfa ];
|
|
|
|
_ffae =_gbdf .RowStride *_cfef +(_fdfc >>3);_acfec =_bac .RowStride *_dddc +(_caae >>3);_bcae =8-(_caae &7);if _fgfa > _bcae {_cfgbe =_feaa ;if _eedcd >=_dbdaf {_gfbe =true ;};}else {_cfgbe =_bcbba ;};};if _eedcd < _fgfa {_adgdd =true ;_geff &=_dafg [8-_fgfa +_eedcd ];
|
|
|
|
};if !_adgdd {_aacgf =(_eedcd -_fgfa )>>3;if _aacgf !=0{_cdfd =true ;_ggag =_gbdf .RowStride *_cfef +((_fdfc +_afed )>>3);_cggf =_bac .RowStride *_dddc +((_caae +_afed )>>3);};};_dgdee =(_fdfc +_eedcd )&7;if !(_adgdd ||_dgdee ==0){_gcdgf =true ;_beae =_dafg [_dgdee ];
|
|
|
|
_aacbg =_gbdf .RowStride *_cfef +((_fdfc +_afed )>>3)+_aacgf ;_agfbc =_bac .RowStride *_dddc +((_caae +_afed )>>3)+_aacgf ;if _dgdee > int (_ecbf ){_fbaba =true ;};};switch _badaa {case PixSrc :if _dcgag {for _debb =0;_debb < _acda ;_debb ++{if _cfgbe ==_feaa {_edaa =_bac .Data [_acfec ]<<_dbeg ;
|
|
|
|
if _gfbe {_edaa =_cdbf (_edaa ,_bac .Data [_acfec +1]>>_ecbf ,_beg );};}else {_edaa =_bac .Data [_acfec ]>>_ecbf ;};_gbdf .Data [_ffae ]=_cdbf (_gbdf .Data [_ffae ],_edaa ,_geff );_ffae +=_gbdf .RowStride ;_acfec +=_bac .RowStride ;};};if _cdfd {for _debb =0;
|
|
|
|
_debb < _acda ;_debb ++{for _dccaa =0;_dccaa < _aacgf ;_dccaa ++{_edaa =_cdbf (_bac .Data [_cggf +_dccaa ]<<_dbeg ,_bac .Data [_cggf +_dccaa +1]>>_ecbf ,_beg );_gbdf .Data [_ggag +_dccaa ]=_edaa ;};_ggag +=_gbdf .RowStride ;_cggf +=_bac .RowStride ;};};
|
|
|
|
if _gcdgf {for _debb =0;_debb < _acda ;_debb ++{_edaa =_bac .Data [_agfbc ]<<_dbeg ;if _fbaba {_edaa =_cdbf (_edaa ,_bac .Data [_agfbc +1]>>_ecbf ,_beg );};_gbdf .Data [_aacbg ]=_cdbf (_gbdf .Data [_aacbg ],_edaa ,_beae );_aacbg +=_gbdf .RowStride ;_agfbc +=_bac .RowStride ;
|
|
|
|
};};case PixNotSrc :if _dcgag {for _debb =0;_debb < _acda ;_debb ++{if _cfgbe ==_feaa {_edaa =_bac .Data [_acfec ]<<_dbeg ;if _gfbe {_edaa =_cdbf (_edaa ,_bac .Data [_acfec +1]>>_ecbf ,_beg );};}else {_edaa =_bac .Data [_acfec ]>>_ecbf ;};_gbdf .Data [_ffae ]=_cdbf (_gbdf .Data [_ffae ],^_edaa ,_geff );
|
|
|
|
_ffae +=_gbdf .RowStride ;_acfec +=_bac .RowStride ;};};if _cdfd {for _debb =0;_debb < _acda ;_debb ++{for _dccaa =0;_dccaa < _aacgf ;_dccaa ++{_edaa =_cdbf (_bac .Data [_cggf +_dccaa ]<<_dbeg ,_bac .Data [_cggf +_dccaa +1]>>_ecbf ,_beg );_gbdf .Data [_ggag +_dccaa ]=^_edaa ;
|
|
|
|
};_ggag +=_gbdf .RowStride ;_cggf +=_bac .RowStride ;};};if _gcdgf {for _debb =0;_debb < _acda ;_debb ++{_edaa =_bac .Data [_agfbc ]<<_dbeg ;if _fbaba {_edaa =_cdbf (_edaa ,_bac .Data [_agfbc +1]>>_ecbf ,_beg );};_gbdf .Data [_aacbg ]=_cdbf (_gbdf .Data [_aacbg ],^_edaa ,_beae );
|
|
|
|
_aacbg +=_gbdf .RowStride ;_agfbc +=_bac .RowStride ;};};case PixSrcOrDst :if _dcgag {for _debb =0;_debb < _acda ;_debb ++{if _cfgbe ==_feaa {_edaa =_bac .Data [_acfec ]<<_dbeg ;if _gfbe {_edaa =_cdbf (_edaa ,_bac .Data [_acfec +1]>>_ecbf ,_beg );};}else {_edaa =_bac .Data [_acfec ]>>_ecbf ;
|
|
|
|
};_gbdf .Data [_ffae ]=_cdbf (_gbdf .Data [_ffae ],_edaa |_gbdf .Data [_ffae ],_geff );_ffae +=_gbdf .RowStride ;_acfec +=_bac .RowStride ;};};if _cdfd {for _debb =0;_debb < _acda ;_debb ++{for _dccaa =0;_dccaa < _aacgf ;_dccaa ++{_edaa =_cdbf (_bac .Data [_cggf +_dccaa ]<<_dbeg ,_bac .Data [_cggf +_dccaa +1]>>_ecbf ,_beg );
|
|
|
|
_gbdf .Data [_ggag +_dccaa ]|=_edaa ;};_ggag +=_gbdf .RowStride ;_cggf +=_bac .RowStride ;};};if _gcdgf {for _debb =0;_debb < _acda ;_debb ++{_edaa =_bac .Data [_agfbc ]<<_dbeg ;if _fbaba {_edaa =_cdbf (_edaa ,_bac .Data [_agfbc +1]>>_ecbf ,_beg );};_gbdf .Data [_aacbg ]=_cdbf (_gbdf .Data [_aacbg ],_edaa |_gbdf .Data [_aacbg ],_beae );
|
|
|
|
_aacbg +=_gbdf .RowStride ;_agfbc +=_bac .RowStride ;};};case PixSrcAndDst :if _dcgag {for _debb =0;_debb < _acda ;_debb ++{if _cfgbe ==_feaa {_edaa =_bac .Data [_acfec ]<<_dbeg ;if _gfbe {_edaa =_cdbf (_edaa ,_bac .Data [_acfec +1]>>_ecbf ,_beg );};}else {_edaa =_bac .Data [_acfec ]>>_ecbf ;
|
|
|
|
};_gbdf .Data [_ffae ]=_cdbf (_gbdf .Data [_ffae ],_edaa &_gbdf .Data [_ffae ],_geff );_ffae +=_gbdf .RowStride ;_acfec +=_bac .RowStride ;};};if _cdfd {for _debb =0;_debb < _acda ;_debb ++{for _dccaa =0;_dccaa < _aacgf ;_dccaa ++{_edaa =_cdbf (_bac .Data [_cggf +_dccaa ]<<_dbeg ,_bac .Data [_cggf +_dccaa +1]>>_ecbf ,_beg );
|
|
|
|
_gbdf .Data [_ggag +_dccaa ]&=_edaa ;};_ggag +=_gbdf .RowStride ;_cggf +=_bac .RowStride ;};};if _gcdgf {for _debb =0;_debb < _acda ;_debb ++{_edaa =_bac .Data [_agfbc ]<<_dbeg ;if _fbaba {_edaa =_cdbf (_edaa ,_bac .Data [_agfbc +1]>>_ecbf ,_beg );};_gbdf .Data [_aacbg ]=_cdbf (_gbdf .Data [_aacbg ],_edaa &_gbdf .Data [_aacbg ],_beae );
|
|
|
|
_aacbg +=_gbdf .RowStride ;_agfbc +=_bac .RowStride ;};};case PixSrcXorDst :if _dcgag {for _debb =0;_debb < _acda ;_debb ++{if _cfgbe ==_feaa {_edaa =_bac .Data [_acfec ]<<_dbeg ;if _gfbe {_edaa =_cdbf (_edaa ,_bac .Data [_acfec +1]>>_ecbf ,_beg );};}else {_edaa =_bac .Data [_acfec ]>>_ecbf ;
|
|
|
|
};_gbdf .Data [_ffae ]=_cdbf (_gbdf .Data [_ffae ],_edaa ^_gbdf .Data [_ffae ],_geff );_ffae +=_gbdf .RowStride ;_acfec +=_bac .RowStride ;};};if _cdfd {for _debb =0;_debb < _acda ;_debb ++{for _dccaa =0;_dccaa < _aacgf ;_dccaa ++{_edaa =_cdbf (_bac .Data [_cggf +_dccaa ]<<_dbeg ,_bac .Data [_cggf +_dccaa +1]>>_ecbf ,_beg );
|
|
|
|
_gbdf .Data [_ggag +_dccaa ]^=_edaa ;};_ggag +=_gbdf .RowStride ;_cggf +=_bac .RowStride ;};};if _gcdgf {for _debb =0;_debb < _acda ;_debb ++{_edaa =_bac .Data [_agfbc ]<<_dbeg ;if _fbaba {_edaa =_cdbf (_edaa ,_bac .Data [_agfbc +1]>>_ecbf ,_beg );};_gbdf .Data [_aacbg ]=_cdbf (_gbdf .Data [_aacbg ],_edaa ^_gbdf .Data [_aacbg ],_beae );
|
|
|
|
_aacbg +=_gbdf .RowStride ;_agfbc +=_bac .RowStride ;};};case PixNotSrcOrDst :if _dcgag {for _debb =0;_debb < _acda ;_debb ++{if _cfgbe ==_feaa {_edaa =_bac .Data [_acfec ]<<_dbeg ;if _gfbe {_edaa =_cdbf (_edaa ,_bac .Data [_acfec +1]>>_ecbf ,_beg );};
|
|
|
|
}else {_edaa =_bac .Data [_acfec ]>>_ecbf ;};_gbdf .Data [_ffae ]=_cdbf (_gbdf .Data [_ffae ],^_edaa |_gbdf .Data [_ffae ],_geff );_ffae +=_gbdf .RowStride ;_acfec +=_bac .RowStride ;};};if _cdfd {for _debb =0;_debb < _acda ;_debb ++{for _dccaa =0;_dccaa < _aacgf ;
|
|
|
|
_dccaa ++{_edaa =_cdbf (_bac .Data [_cggf +_dccaa ]<<_dbeg ,_bac .Data [_cggf +_dccaa +1]>>_ecbf ,_beg );_gbdf .Data [_ggag +_dccaa ]|=^_edaa ;};_ggag +=_gbdf .RowStride ;_cggf +=_bac .RowStride ;};};if _gcdgf {for _debb =0;_debb < _acda ;_debb ++{_edaa =_bac .Data [_agfbc ]<<_dbeg ;
|
|
|
|
if _fbaba {_edaa =_cdbf (_edaa ,_bac .Data [_agfbc +1]>>_ecbf ,_beg );};_gbdf .Data [_aacbg ]=_cdbf (_gbdf .Data [_aacbg ],^_edaa |_gbdf .Data [_aacbg ],_beae );_aacbg +=_gbdf .RowStride ;_agfbc +=_bac .RowStride ;};};case PixNotSrcAndDst :if _dcgag {for _debb =0;
|
|
|
|
_debb < _acda ;_debb ++{if _cfgbe ==_feaa {_edaa =_bac .Data [_acfec ]<<_dbeg ;if _gfbe {_edaa =_cdbf (_edaa ,_bac .Data [_acfec +1]>>_ecbf ,_beg );};}else {_edaa =_bac .Data [_acfec ]>>_ecbf ;};_gbdf .Data [_ffae ]=_cdbf (_gbdf .Data [_ffae ],^_edaa &_gbdf .Data [_ffae ],_geff );
|
|
|
|
_ffae +=_gbdf .RowStride ;_acfec +=_bac .RowStride ;};};if _cdfd {for _debb =0;_debb < _acda ;_debb ++{for _dccaa =0;_dccaa < _aacgf ;_dccaa ++{_edaa =_cdbf (_bac .Data [_cggf +_dccaa ]<<_dbeg ,_bac .Data [_cggf +_dccaa +1]>>_ecbf ,_beg );_gbdf .Data [_ggag +_dccaa ]&=^_edaa ;
|
|
|
|
};_ggag +=_gbdf .RowStride ;_cggf +=_bac .RowStride ;};};if _gcdgf {for _debb =0;_debb < _acda ;_debb ++{_edaa =_bac .Data [_agfbc ]<<_dbeg ;if _fbaba {_edaa =_cdbf (_edaa ,_bac .Data [_agfbc +1]>>_ecbf ,_beg );};_gbdf .Data [_aacbg ]=_cdbf (_gbdf .Data [_aacbg ],^_edaa &_gbdf .Data [_aacbg ],_beae );
|
|
|
|
_aacbg +=_gbdf .RowStride ;_agfbc +=_bac .RowStride ;};};case PixSrcOrNotDst :if _dcgag {for _debb =0;_debb < _acda ;_debb ++{if _cfgbe ==_feaa {_edaa =_bac .Data [_acfec ]<<_dbeg ;if _gfbe {_edaa =_cdbf (_edaa ,_bac .Data [_acfec +1]>>_ecbf ,_beg );};
|
|
|
|
}else {_edaa =_bac .Data [_acfec ]>>_ecbf ;};_gbdf .Data [_ffae ]=_cdbf (_gbdf .Data [_ffae ],_edaa |^_gbdf .Data [_ffae ],_geff );_ffae +=_gbdf .RowStride ;_acfec +=_bac .RowStride ;};};if _cdfd {for _debb =0;_debb < _acda ;_debb ++{for _dccaa =0;_dccaa < _aacgf ;
|
|
|
|
_dccaa ++{_edaa =_cdbf (_bac .Data [_cggf +_dccaa ]<<_dbeg ,_bac .Data [_cggf +_dccaa +1]>>_ecbf ,_beg );_gbdf .Data [_ggag +_dccaa ]=_edaa |^_gbdf .Data [_ggag +_dccaa ];};_ggag +=_gbdf .RowStride ;_cggf +=_bac .RowStride ;};};if _gcdgf {for _debb =0;
|
|
|
|
_debb < _acda ;_debb ++{_edaa =_bac .Data [_agfbc ]<<_dbeg ;if _fbaba {_edaa =_cdbf (_edaa ,_bac .Data [_agfbc +1]>>_ecbf ,_beg );};_gbdf .Data [_aacbg ]=_cdbf (_gbdf .Data [_aacbg ],_edaa |^_gbdf .Data [_aacbg ],_beae );_aacbg +=_gbdf .RowStride ;_agfbc +=_bac .RowStride ;
|
|
|
|
};};case PixSrcAndNotDst :if _dcgag {for _debb =0;_debb < _acda ;_debb ++{if _cfgbe ==_feaa {_edaa =_bac .Data [_acfec ]<<_dbeg ;if _gfbe {_edaa =_cdbf (_edaa ,_bac .Data [_acfec +1]>>_ecbf ,_beg );};}else {_edaa =_bac .Data [_acfec ]>>_ecbf ;};_gbdf .Data [_ffae ]=_cdbf (_gbdf .Data [_ffae ],_edaa &^_gbdf .Data [_ffae ],_geff );
|
|
|
|
_ffae +=_gbdf .RowStride ;_acfec +=_bac .RowStride ;};};if _cdfd {for _debb =0;_debb < _acda ;_debb ++{for _dccaa =0;_dccaa < _aacgf ;_dccaa ++{_edaa =_cdbf (_bac .Data [_cggf +_dccaa ]<<_dbeg ,_bac .Data [_cggf +_dccaa +1]>>_ecbf ,_beg );_gbdf .Data [_ggag +_dccaa ]=_edaa &^_gbdf .Data [_ggag +_dccaa ];
|
|
|
|
};_ggag +=_gbdf .RowStride ;_cggf +=_bac .RowStride ;};};if _gcdgf {for _debb =0;_debb < _acda ;_debb ++{_edaa =_bac .Data [_agfbc ]<<_dbeg ;if _fbaba {_edaa =_cdbf (_edaa ,_bac .Data [_agfbc +1]>>_ecbf ,_beg );};_gbdf .Data [_aacbg ]=_cdbf (_gbdf .Data [_aacbg ],_edaa &^_gbdf .Data [_aacbg ],_beae );
|
|
|
|
_aacbg +=_gbdf .RowStride ;_agfbc +=_bac .RowStride ;};};case PixNotPixSrcOrDst :if _dcgag {for _debb =0;_debb < _acda ;_debb ++{if _cfgbe ==_feaa {_edaa =_bac .Data [_acfec ]<<_dbeg ;if _gfbe {_edaa =_cdbf (_edaa ,_bac .Data [_acfec +1]>>_ecbf ,_beg );
|
|
|
|
};}else {_edaa =_bac .Data [_acfec ]>>_ecbf ;};_gbdf .Data [_ffae ]=_cdbf (_gbdf .Data [_ffae ],^(_edaa |_gbdf .Data [_ffae ]),_geff );_ffae +=_gbdf .RowStride ;_acfec +=_bac .RowStride ;};};if _cdfd {for _debb =0;_debb < _acda ;_debb ++{for _dccaa =0;
|
|
|
|
_dccaa < _aacgf ;_dccaa ++{_edaa =_cdbf (_bac .Data [_cggf +_dccaa ]<<_dbeg ,_bac .Data [_cggf +_dccaa +1]>>_ecbf ,_beg );_gbdf .Data [_ggag +_dccaa ]=^(_edaa |_gbdf .Data [_ggag +_dccaa ]);};_ggag +=_gbdf .RowStride ;_cggf +=_bac .RowStride ;};};if _gcdgf {for _debb =0;
|
|
|
|
_debb < _acda ;_debb ++{_edaa =_bac .Data [_agfbc ]<<_dbeg ;if _fbaba {_edaa =_cdbf (_edaa ,_bac .Data [_agfbc +1]>>_ecbf ,_beg );};_gbdf .Data [_aacbg ]=_cdbf (_gbdf .Data [_aacbg ],^(_edaa |_gbdf .Data [_aacbg ]),_beae );_aacbg +=_gbdf .RowStride ;_agfbc +=_bac .RowStride ;
|
|
|
|
};};case PixNotPixSrcAndDst :if _dcgag {for _debb =0;_debb < _acda ;_debb ++{if _cfgbe ==_feaa {_edaa =_bac .Data [_acfec ]<<_dbeg ;if _gfbe {_edaa =_cdbf (_edaa ,_bac .Data [_acfec +1]>>_ecbf ,_beg );};}else {_edaa =_bac .Data [_acfec ]>>_ecbf ;};_gbdf .Data [_ffae ]=_cdbf (_gbdf .Data [_ffae ],^(_edaa &_gbdf .Data [_ffae ]),_geff );
|
|
|
|
_ffae +=_gbdf .RowStride ;_acfec +=_bac .RowStride ;};};if _cdfd {for _debb =0;_debb < _acda ;_debb ++{for _dccaa =0;_dccaa < _aacgf ;_dccaa ++{_edaa =_cdbf (_bac .Data [_cggf +_dccaa ]<<_dbeg ,_bac .Data [_cggf +_dccaa +1]>>_ecbf ,_beg );_gbdf .Data [_ggag +_dccaa ]=^(_edaa &_gbdf .Data [_ggag +_dccaa ]);
|
|
|
|
};_ggag +=_gbdf .RowStride ;_cggf +=_bac .RowStride ;};};if _gcdgf {for _debb =0;_debb < _acda ;_debb ++{_edaa =_bac .Data [_agfbc ]<<_dbeg ;if _fbaba {_edaa =_cdbf (_edaa ,_bac .Data [_agfbc +1]>>_ecbf ,_beg );};_gbdf .Data [_aacbg ]=_cdbf (_gbdf .Data [_aacbg ],^(_edaa &_gbdf .Data [_aacbg ]),_beae );
|
|
|
|
_aacbg +=_gbdf .RowStride ;_agfbc +=_bac .RowStride ;};};case PixNotPixSrcXorDst :if _dcgag {for _debb =0;_debb < _acda ;_debb ++{if _cfgbe ==_feaa {_edaa =_bac .Data [_acfec ]<<_dbeg ;if _gfbe {_edaa =_cdbf (_edaa ,_bac .Data [_acfec +1]>>_ecbf ,_beg );
|
|
|
|
};}else {_edaa =_bac .Data [_acfec ]>>_ecbf ;};_gbdf .Data [_ffae ]=_cdbf (_gbdf .Data [_ffae ],^(_edaa ^_gbdf .Data [_ffae ]),_geff );_ffae +=_gbdf .RowStride ;_acfec +=_bac .RowStride ;};};if _cdfd {for _debb =0;_debb < _acda ;_debb ++{for _dccaa =0;
|
|
|
|
_dccaa < _aacgf ;_dccaa ++{_edaa =_cdbf (_bac .Data [_cggf +_dccaa ]<<_dbeg ,_bac .Data [_cggf +_dccaa +1]>>_ecbf ,_beg );_gbdf .Data [_ggag +_dccaa ]=^(_edaa ^_gbdf .Data [_ggag +_dccaa ]);};_ggag +=_gbdf .RowStride ;_cggf +=_bac .RowStride ;};};if _gcdgf {for _debb =0;
|
|
|
|
_debb < _acda ;_debb ++{_edaa =_bac .Data [_agfbc ]<<_dbeg ;if _fbaba {_edaa =_cdbf (_edaa ,_bac .Data [_agfbc +1]>>_ecbf ,_beg );};_gbdf .Data [_aacbg ]=_cdbf (_gbdf .Data [_aacbg ],^(_edaa ^_gbdf .Data [_aacbg ]),_beae );_aacbg +=_gbdf .RowStride ;_agfbc +=_bac .RowStride ;
|
|
|
|
};};default:_fd .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",_badaa );return _a .Error ("\u0072a\u0073t\u0065\u0072\u004f\u0070\u0047e\u006e\u0065r\u0061\u006c\u004c\u006f\u0077","\u0072\u0061\u0073\u0074\u0065\u0072\u0020\u006f\u0070\u0065r\u0061\u0074\u0069\u006f\u006e\u0020\u006eo\u0074\u0020\u0070\u0065\u0072\u006d\u0069\u0074\u0074\u0065\u0064");
|
|
|
|
};return nil ;};func _gfgdf (_efge *Bitmap ,_gadg *Bitmap ,_eaca int )(_fabad error ){const _bcbe ="\u0073\u0065\u0065\u0064\u0066\u0069\u006c\u006c\u0042\u0069\u006e\u0061r\u0079\u004c\u006f\u0077";_fadd :=_bded (_efge .Height ,_gadg .Height );_aaac :=_bded (_efge .RowStride ,_gadg .RowStride );
|
|
|
|
switch _eaca {case 4:_fabad =_ecged (_efge ,_gadg ,_fadd ,_aaac );case 8:_fabad =_abfe (_efge ,_gadg ,_fadd ,_aaac );default:return _a .Errorf (_bcbe ,"\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",_eaca );
|
|
|
|
};if _fabad !=nil {return _a .Wrap (_fabad ,_bcbe ,"");};return nil ;};type byWidth Bitmaps ;func _gfab (_bece ,_agdg *Bitmap ,_dbef ,_cfg ,_aaa ,_gbad ,_edeb ,_cgfe ,_cfd ,_cdc int ,_agbd CombinationOperator ,_dfag int )error {var _aaae int ;_defec :=func (){_aaae ++;
|
|
|
|
_aaa +=_agdg .RowStride ;_gbad +=_bece .RowStride ;_edeb +=_bece .RowStride };for _aaae =_dbef ;_aaae < _cfg ;_defec (){var _gcde uint16 ;_cgab :=_aaa ;for _cgdd :=_gbad ;_cgdd <=_edeb ;_cgdd ++{_fgfb ,_fecc :=_agdg .GetByte (_cgab );if _fecc !=nil {return _fecc ;
|
|
|
|
};_ceb ,_fecc :=_bece .GetByte (_cgdd );if _fecc !=nil {return _fecc ;};_gcde =(_gcde |(uint16 (_ceb )&0xff))<<uint (_cdc );_ceb =byte (_gcde >>8);if _fecc =_agdg .SetByte (_cgab ,_eefa (_fgfb ,_ceb ,_agbd ));_fecc !=nil {return _fecc ;};_cgab ++;_gcde <<=uint (_cfd );
|
|
|
|
if _cgdd ==_edeb {_ceb =byte (_gcde >>(8-uint8 (_cdc )));if _dfag !=0{_ceb =_bgg (uint (8+_cgfe ),_ceb );};_fgfb ,_fecc =_agdg .GetByte (_cgab );if _fecc !=nil {return _fecc ;};if _fecc =_agdg .SetByte (_cgab ,_eefa (_fgfb ,_ceb ,_agbd ));_fecc !=nil {return _fecc ;
|
|
|
|
};};};};return nil ;};func TstImageBitmapInverseData ()[]byte {_dccaf :=_cacbf .Copy ();_dccaf .InverseData ();return _dccaf .Data ;};func RasterOperation (dest *Bitmap ,dx ,dy ,dw ,dh int ,op RasterOperator ,src *Bitmap ,sx ,sy int )error {return _cafd (dest ,dx ,dy ,dw ,dh ,op ,src ,sx ,sy );
|
|
|
|
};func _gedae (_bfcad ,_acac int ,_ffgbd string )*Selection {_gcea :=&Selection {Height :_bfcad ,Width :_acac ,Name :_ffgbd };_gcea .Data =make ([][]SelectionValue ,_bfcad );for _aabgc :=0;_aabgc < _bfcad ;_aabgc ++{_gcea .Data [_aabgc ]=make ([]SelectionValue ,_acac );
|
|
|
|
};return _gcea ;};func _ecadf (_dcag *Bitmap ,_bdba ,_ffde int ,_cgdf ,_gfcc int ,_gegd RasterOperator ,_dgdf *Bitmap ,_baaf ,_ebbe int )error {var _cefcd ,_abcc ,_fgebb ,_fecf int ;if _bdba < 0{_baaf -=_bdba ;_cgdf +=_bdba ;_bdba =0;};if _baaf < 0{_bdba -=_baaf ;
|
|
|
|
_cgdf +=_baaf ;_baaf =0;};_cefcd =_bdba +_cgdf -_dcag .Width ;if _cefcd > 0{_cgdf -=_cefcd ;};_abcc =_baaf +_cgdf -_dgdf .Width ;if _abcc > 0{_cgdf -=_abcc ;};if _ffde < 0{_ebbe -=_ffde ;_gfcc +=_ffde ;_ffde =0;};if _ebbe < 0{_ffde -=_ebbe ;_gfcc +=_ebbe ;
|
|
|
|
_ebbe =0;};_fgebb =_ffde +_gfcc -_dcag .Height ;if _fgebb > 0{_gfcc -=_fgebb ;};_fecf =_ebbe +_gfcc -_dgdf .Height ;if _fecf > 0{_gfcc -=_fecf ;};if _cgdf <=0||_gfcc <=0{return nil ;};var _fegg error ;switch {case _bdba &7==0&&_baaf &7==0:_fegg =_aacb (_dcag ,_bdba ,_ffde ,_cgdf ,_gfcc ,_gegd ,_dgdf ,_baaf ,_ebbe );
|
|
|
|
case _bdba &7==_baaf &7:_fegg =_bdcg (_dcag ,_bdba ,_ffde ,_cgdf ,_gfcc ,_gegd ,_dgdf ,_baaf ,_ebbe );default:_fegg =_ecdfd (_dcag ,_bdba ,_ffde ,_cgdf ,_gfcc ,_gegd ,_dgdf ,_baaf ,_ebbe );};if _fegg !=nil {return _a .Wrap (_fegg ,"r\u0061\u0073\u0074\u0065\u0072\u004f\u0070\u004c\u006f\u0077","");
|
|
|
|
};return nil ;};func (_aee *Bitmaps )makeSizeIndicator (_fgcg ,_dbag int ,_gcdfd LocationFilter ,_abdf SizeComparison )(_ecaf *_ed .NumSlice ,_cgge error ){const _aagfb ="\u0042i\u0074\u006d\u0061\u0070s\u002e\u006d\u0061\u006b\u0065S\u0069z\u0065I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";
|
|
|
|
if _aee ==nil {return nil ,_a .Error (_aagfb ,"\u0062\u0069\u0074ma\u0070\u0073\u0020\u0027\u0062\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};switch _gcdfd {case LocSelectWidth ,LocSelectHeight ,LocSelectIfEither ,LocSelectIfBoth :default:return nil ,_a .Errorf (_aagfb ,"\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",_gcdfd );
|
|
|
|
};switch _abdf {case SizeSelectIfLT ,SizeSelectIfGT ,SizeSelectIfLTE ,SizeSelectIfGTE ,SizeSelectIfEQ :default:return nil ,_a .Errorf (_aagfb ,"\u0069\u006e\u0076\u0061li\u0064\u0020\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0027\u0025d\u0027",_abdf );
|
|
|
|
};_ecaf =&_ed .NumSlice {};var (_bfacb ,_febe ,_cfbdf int ;_aagg *Bitmap ;);for _ ,_aagg =range _aee .Values {_bfacb =0;_febe ,_cfbdf =_aagg .Width ,_aagg .Height ;switch _gcdfd {case LocSelectWidth :if (_abdf ==SizeSelectIfLT &&_febe < _fgcg )||(_abdf ==SizeSelectIfGT &&_febe > _fgcg )||(_abdf ==SizeSelectIfLTE &&_febe <=_fgcg )||(_abdf ==SizeSelectIfGTE &&_febe >=_fgcg )||(_abdf ==SizeSelectIfEQ &&_febe ==_fgcg ){_bfacb =1;
|
|
|
|
};case LocSelectHeight :if (_abdf ==SizeSelectIfLT &&_cfbdf < _dbag )||(_abdf ==SizeSelectIfGT &&_cfbdf > _dbag )||(_abdf ==SizeSelectIfLTE &&_cfbdf <=_dbag )||(_abdf ==SizeSelectIfGTE &&_cfbdf >=_dbag )||(_abdf ==SizeSelectIfEQ &&_cfbdf ==_dbag ){_bfacb =1;
|
|
|
|
};case LocSelectIfEither :if (_abdf ==SizeSelectIfLT &&(_febe < _fgcg ||_cfbdf < _dbag ))||(_abdf ==SizeSelectIfGT &&(_febe > _fgcg ||_cfbdf > _dbag ))||(_abdf ==SizeSelectIfLTE &&(_febe <=_fgcg ||_cfbdf <=_dbag ))||(_abdf ==SizeSelectIfGTE &&(_febe >=_fgcg ||_cfbdf >=_dbag ))||(_abdf ==SizeSelectIfEQ &&(_febe ==_fgcg ||_cfbdf ==_dbag )){_bfacb =1;
|
|
|
|
};case LocSelectIfBoth :if (_abdf ==SizeSelectIfLT &&(_febe < _fgcg &&_cfbdf < _dbag ))||(_abdf ==SizeSelectIfGT &&(_febe > _fgcg &&_cfbdf > _dbag ))||(_abdf ==SizeSelectIfLTE &&(_febe <=_fgcg &&_cfbdf <=_dbag ))||(_abdf ==SizeSelectIfGTE &&(_febe >=_fgcg &&_cfbdf >=_dbag ))||(_abdf ==SizeSelectIfEQ &&(_febe ==_fgcg &&_cfbdf ==_dbag )){_bfacb =1;
|
|
|
|
};};_ecaf .AddInt (_bfacb );};return _ecaf ,nil ;};func (_gefb *Bitmap )clipRectangle (_cab ,_fbe *_cc .Rectangle )(_dfa *Bitmap ,_bfc error ){const _bcaa ="\u0063\u006c\u0069\u0070\u0052\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065";if _cab ==nil {return nil ,_a .Error (_bcaa ,"\u0070r\u006fv\u0069\u0064\u0065\u0064\u0020n\u0069\u006c \u0027\u0062\u006f\u0078\u0027");
|
|
|
|
};_eage ,_bbcd :=_gefb .Width ,_gefb .Height ;_dde ,_bfc :=ClipBoxToRectangle (_cab ,_eage ,_bbcd );if _bfc !=nil {_fd .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",_bfc );
|
|
|
|
return nil ,nil ;};_fec ,_bde :=_dde .Min .X ,_dde .Min .Y ;_ada ,_dcbc :=_dde .Max .X -_dde .Min .X ,_dde .Max .Y -_dde .Min .Y ;_dfa =New (_ada ,_dcbc );_dfa .Text =_gefb .Text ;if _bfc =_dfa .RasterOperation (0,0,_ada ,_dcbc ,PixSrc ,_gefb ,_fec ,_bde );
|
|
|
|
_bfc !=nil {return nil ,_a .Wrap (_bfc ,_bcaa ,"");};if _fbe !=nil {*_fbe =*_dde ;};return _dfa ,nil ;};func _eaaf (_cfbe ...MorphProcess )(_gedd error ){const _abgfb ="v\u0065r\u0069\u0066\u0079\u004d\u006f\u0072\u0070\u0068P\u0072\u006f\u0063\u0065ss\u0065\u0073";
|
|
|
|
var _adgd ,_dbgec int ;for _ecadb ,_ccfb :=range _cfbe {if _gedd =_ccfb .verify (_ecadb ,&_adgd ,&_dbgec );_gedd !=nil {return _a .Wrap (_gedd ,_abgfb ,"");};};if _dbgec !=0&&_adgd !=0{return _a .Error (_abgfb ,"\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 (_bdecg *Bitmaps )AddBox (box *_cc .Rectangle ){_bdecg .Boxes =append (_bdecg .Boxes ,box )};func _aacb (_ffea *Bitmap ,_adac ,_egbbf ,_cbcf ,_cadc int ,_dae RasterOperator ,_abddb *Bitmap ,_bcaag ,_beef int )error {var (_gcdaa byte ;
|
|
|
|
_agcg int ;_accb int ;_aacg ,_gfea int ;_gbaf ,_abbab int ;);_fdce :=_cbcf >>3;_fdbb :=_cbcf &7;if _fdbb > 0{_gcdaa =_dafg [_fdbb ];};_agcg =_abddb .RowStride *_beef +(_bcaag >>3);_accb =_ffea .RowStride *_egbbf +(_adac >>3);switch _dae {case PixSrc :for _gbaf =0;
|
|
|
|
_gbaf < _cadc ;_gbaf ++{_aacg =_agcg +_gbaf *_abddb .RowStride ;_gfea =_accb +_gbaf *_ffea .RowStride ;for _abbab =0;_abbab < _fdce ;_abbab ++{_ffea .Data [_gfea ]=_abddb .Data [_aacg ];_gfea ++;_aacg ++;};if _fdbb > 0{_ffea .Data [_gfea ]=_cdbf (_ffea .Data [_gfea ],_abddb .Data [_aacg ],_gcdaa );
|
|
|
|
};};case PixNotSrc :for _gbaf =0;_gbaf < _cadc ;_gbaf ++{_aacg =_agcg +_gbaf *_abddb .RowStride ;_gfea =_accb +_gbaf *_ffea .RowStride ;for _abbab =0;_abbab < _fdce ;_abbab ++{_ffea .Data [_gfea ]=^(_abddb .Data [_aacg ]);_gfea ++;_aacg ++;};if _fdbb > 0{_ffea .Data [_gfea ]=_cdbf (_ffea .Data [_gfea ],^_abddb .Data [_aacg ],_gcdaa );
|
|
|
|
};};case PixSrcOrDst :for _gbaf =0;_gbaf < _cadc ;_gbaf ++{_aacg =_agcg +_gbaf *_abddb .RowStride ;_gfea =_accb +_gbaf *_ffea .RowStride ;for _abbab =0;_abbab < _fdce ;_abbab ++{_ffea .Data [_gfea ]|=_abddb .Data [_aacg ];_gfea ++;_aacg ++;};if _fdbb > 0{_ffea .Data [_gfea ]=_cdbf (_ffea .Data [_gfea ],_abddb .Data [_aacg ]|_ffea .Data [_gfea ],_gcdaa );
|
|
|
|
};};case PixSrcAndDst :for _gbaf =0;_gbaf < _cadc ;_gbaf ++{_aacg =_agcg +_gbaf *_abddb .RowStride ;_gfea =_accb +_gbaf *_ffea .RowStride ;for _abbab =0;_abbab < _fdce ;_abbab ++{_ffea .Data [_gfea ]&=_abddb .Data [_aacg ];_gfea ++;_aacg ++;};if _fdbb > 0{_ffea .Data [_gfea ]=_cdbf (_ffea .Data [_gfea ],_abddb .Data [_aacg ]&_ffea .Data [_gfea ],_gcdaa );
|
|
|
|
};};case PixSrcXorDst :for _gbaf =0;_gbaf < _cadc ;_gbaf ++{_aacg =_agcg +_gbaf *_abddb .RowStride ;_gfea =_accb +_gbaf *_ffea .RowStride ;for _abbab =0;_abbab < _fdce ;_abbab ++{_ffea .Data [_gfea ]^=_abddb .Data [_aacg ];_gfea ++;_aacg ++;};if _fdbb > 0{_ffea .Data [_gfea ]=_cdbf (_ffea .Data [_gfea ],_abddb .Data [_aacg ]^_ffea .Data [_gfea ],_gcdaa );
|
|
|
|
};};case PixNotSrcOrDst :for _gbaf =0;_gbaf < _cadc ;_gbaf ++{_aacg =_agcg +_gbaf *_abddb .RowStride ;_gfea =_accb +_gbaf *_ffea .RowStride ;for _abbab =0;_abbab < _fdce ;_abbab ++{_ffea .Data [_gfea ]|=^(_abddb .Data [_aacg ]);_gfea ++;_aacg ++;};if _fdbb > 0{_ffea .Data [_gfea ]=_cdbf (_ffea .Data [_gfea ],^(_abddb .Data [_aacg ])|_ffea .Data [_gfea ],_gcdaa );
|
|
|
|
};};case PixNotSrcAndDst :for _gbaf =0;_gbaf < _cadc ;_gbaf ++{_aacg =_agcg +_gbaf *_abddb .RowStride ;_gfea =_accb +_gbaf *_ffea .RowStride ;for _abbab =0;_abbab < _fdce ;_abbab ++{_ffea .Data [_gfea ]&=^(_abddb .Data [_aacg ]);_gfea ++;_aacg ++;};if _fdbb > 0{_ffea .Data [_gfea ]=_cdbf (_ffea .Data [_gfea ],^(_abddb .Data [_aacg ])&_ffea .Data [_gfea ],_gcdaa );
|
|
|
|
};};case PixSrcOrNotDst :for _gbaf =0;_gbaf < _cadc ;_gbaf ++{_aacg =_agcg +_gbaf *_abddb .RowStride ;_gfea =_accb +_gbaf *_ffea .RowStride ;for _abbab =0;_abbab < _fdce ;_abbab ++{_ffea .Data [_gfea ]=_abddb .Data [_aacg ]|^(_ffea .Data [_gfea ]);_gfea ++;
|
|
|
|
_aacg ++;};if _fdbb > 0{_ffea .Data [_gfea ]=_cdbf (_ffea .Data [_gfea ],_abddb .Data [_aacg ]|^(_ffea .Data [_gfea ]),_gcdaa );};};case PixSrcAndNotDst :for _gbaf =0;_gbaf < _cadc ;_gbaf ++{_aacg =_agcg +_gbaf *_abddb .RowStride ;_gfea =_accb +_gbaf *_ffea .RowStride ;
|
|
|
|
for _abbab =0;_abbab < _fdce ;_abbab ++{_ffea .Data [_gfea ]=_abddb .Data [_aacg ]&^(_ffea .Data [_gfea ]);_gfea ++;_aacg ++;};if _fdbb > 0{_ffea .Data [_gfea ]=_cdbf (_ffea .Data [_gfea ],_abddb .Data [_aacg ]&^(_ffea .Data [_gfea ]),_gcdaa );};};case PixNotPixSrcOrDst :for _gbaf =0;
|
|
|
|
_gbaf < _cadc ;_gbaf ++{_aacg =_agcg +_gbaf *_abddb .RowStride ;_gfea =_accb +_gbaf *_ffea .RowStride ;for _abbab =0;_abbab < _fdce ;_abbab ++{_ffea .Data [_gfea ]=^(_abddb .Data [_aacg ]|_ffea .Data [_gfea ]);_gfea ++;_aacg ++;};if _fdbb > 0{_ffea .Data [_gfea ]=_cdbf (_ffea .Data [_gfea ],^(_abddb .Data [_aacg ]|_ffea .Data [_gfea ]),_gcdaa );
|
|
|
|
};};case PixNotPixSrcAndDst :for _gbaf =0;_gbaf < _cadc ;_gbaf ++{_aacg =_agcg +_gbaf *_abddb .RowStride ;_gfea =_accb +_gbaf *_ffea .RowStride ;for _abbab =0;_abbab < _fdce ;_abbab ++{_ffea .Data [_gfea ]=^(_abddb .Data [_aacg ]&_ffea .Data [_gfea ]);
|
|
|
|
_gfea ++;_aacg ++;};if _fdbb > 0{_ffea .Data [_gfea ]=_cdbf (_ffea .Data [_gfea ],^(_abddb .Data [_aacg ]&_ffea .Data [_gfea ]),_gcdaa );};};case PixNotPixSrcXorDst :for _gbaf =0;_gbaf < _cadc ;_gbaf ++{_aacg =_agcg +_gbaf *_abddb .RowStride ;_gfea =_accb +_gbaf *_ffea .RowStride ;
|
|
|
|
for _abbab =0;_abbab < _fdce ;_abbab ++{_ffea .Data [_gfea ]=^(_abddb .Data [_aacg ]^_ffea .Data [_gfea ]);_gfea ++;_aacg ++;};if _fdbb > 0{_ffea .Data [_gfea ]=_cdbf (_ffea .Data [_gfea ],^(_abddb .Data [_aacg ]^_ffea .Data [_gfea ]),_gcdaa );};};default:_fd .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",_dae );
|
|
|
|
return _a .Error ("\u0072\u0061\u0073\u0074er\u004f\u0070\u0042\u0079\u0074\u0065\u0041\u006c\u0069\u0067\u006e\u0065\u0064\u004co\u0077","\u0069\u006e\u0076al\u0069\u0064\u0020\u0072\u0061\u0073\u0074\u0065\u0072\u0020\u006f\u0070\u0065\u0072\u0061\u0074\u006f\u0072");
|
|
|
|
};return nil ;};func (_cbdfg *Boxes )SelectBySize (width ,height int ,tp LocationFilter ,relation SizeComparison )(_dgbb *Boxes ,_eff error ){const _gegfg ="\u0042o\u0078e\u0073\u002e\u0053\u0065\u006ce\u0063\u0074B\u0079\u0053\u0069\u007a\u0065";if _cbdfg ==nil {return nil ,_a .Error (_gegfg ,"b\u006f\u0078\u0065\u0073 '\u0062'\u0020\u006e\u006f\u0074\u0020d\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
|
|
};if len (*_cbdfg )==0{return _cbdfg ,nil ;};switch tp {case LocSelectWidth ,LocSelectHeight ,LocSelectIfEither ,LocSelectIfBoth :default:return nil ,_a .Errorf (_gegfg ,"\u0069\u006e\u0076al\u0069\u0064\u0020\u0066\u0069\u006c\u0074\u0065\u0072\u0020\u0074\u0079\u0070\u0065\u003a\u0020\u0025\u0064",tp );
|
|
|
|
};switch relation {case SizeSelectIfLT ,SizeSelectIfGT ,SizeSelectIfLTE ,SizeSelectIfGTE :default:return nil ,_a .Errorf (_gegfg ,"i\u006e\u0076\u0061\u006c\u0069\u0064 \u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u0020t\u0079\u0070\u0065:\u0020'\u0025\u0064\u0027",tp );
|
|
|
|
};_bgeg :=_cbdfg .makeSizeIndicator (width ,height ,tp ,relation );_gad ,_eff :=_cbdfg .selectWithIndicator (_bgeg );if _eff !=nil {return nil ,_a .Wrap (_eff ,_gegfg ,"");};return _gad ,nil ;};func (_fgfba MorphProcess )verify (_cgbe int ,_bfaab ,_dcba *int )error {const _fbcf ="\u004d\u006f\u0072\u0070hP\u0072\u006f\u0063\u0065\u0073\u0073\u002e\u0076\u0065\u0072\u0069\u0066\u0079";
|
|
|
|
switch _fgfba .Operation {case MopDilation ,MopErosion ,MopOpening ,MopClosing :if len (_fgfba .Arguments )!=2{return _a .Error (_fbcf ,"\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");
|
|
|
|
};_fca ,_gcaf :=_fgfba .getWidthHeight ();if _fca <=0||_gcaf <=0{return _a .Error (_fbcf ,"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 :_bag :=len (_fgfba .Arguments );*_bfaab +=_bag ;if _bag < 1||_bag > 4{return _a .Error (_fbcf ,"\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 _agc :=0;_agc < _bag ;_agc ++{if _fgfba .Arguments [_agc ]< 1||_fgfba .Arguments [_agc ]> 4{return _a .Error (_fbcf ,"\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 (_fgfba .Arguments )==0{return _a .Error (_fbcf ,"\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");
|
|
|
|
};_agfb :=_fgfba .Arguments [0];if _agfb !=2&&_agfb !=4&&_agfb !=8{return _a .Error (_fbcf ,"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");
|
|
|
|
};*_bfaab -=_bedc [_agfb /4];case MopAddBorder :if len (_fgfba .Arguments )==0{return _a .Error (_fbcf ,"\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");
|
|
|
|
};_fbgfd :=_fgfba .Arguments [0];if _cgbe > 0{return _a .Error (_fbcf ,"\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 _fbgfd < 1{return _a .Error (_fbcf ,"\u0041\u0064\u0064\u0042o\u0072\u0064\u0065\u0072\u0020\u0076\u0061\u006c\u0075\u0065 \u006co\u0077\u0065\u0072\u0020\u0074\u0068\u0061n\u0020\u0030");};*_dcba =_fbgfd ;};return nil ;};func (_ceec *Bitmaps )GetBitmap (i int )(*Bitmap ,error ){const _bdcab ="\u0047e\u0074\u0042\u0069\u0074\u006d\u0061p";
|
|
|
|
if _ceec ==nil {return nil ,_a .Error (_bdcab ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0042\u0069\u0074ma\u0070\u0073");};if i > len (_ceec .Values )-1{return nil ,_a .Errorf (_bdcab ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
|
|
};return _ceec .Values [i ],nil ;};type byHeight Bitmaps ;const (_ SizeComparison =iota ;SizeSelectIfLT ;SizeSelectIfGT ;SizeSelectIfLTE ;SizeSelectIfGTE ;SizeSelectIfEQ ;);func _ffgb (_efdgc *_ed .Stack )(_geae *fillSegment ,_gbbdd error ){const _ecdffc ="\u0070\u006f\u0070\u0046\u0069\u006c\u006c\u0053\u0065g\u006d\u0065\u006e\u0074";
|
|
|
|
if _efdgc ==nil {return nil ,_a .Error (_ecdffc ,"\u006ei\u006c \u0073\u0074\u0061\u0063\u006b \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");};if _efdgc .Aux ==nil {return nil ,_a .Error (_ecdffc ,"a\u0075x\u0053\u0074\u0061\u0063\u006b\u0020\u006e\u006ft\u0020\u0064\u0065\u0066in\u0065\u0064");
|
|
|
|
};_adaf ,_gcfa :=_efdgc .Pop ();if !_gcfa {return nil ,nil ;};_cfge ,_gcfa :=_adaf .(*fillSegment );if !_gcfa {return nil ,_a .Error (_ecdffc ,"\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");
|
|
|
|
};_geae =&fillSegment {_cfge ._cbbb ,_cfge ._bcdc ,_cfge ._adfa +_cfge ._fgdd ,_cfge ._fgdd };_efdgc .Aux .Push (_cfge );return _geae ,nil ;};func (_bfddb *BitmapsArray )GetBitmaps (i int )(*Bitmaps ,error ){const _dgfb ="\u0042\u0069\u0074ma\u0070\u0073\u0041\u0072\u0072\u0061\u0079\u002e\u0047\u0065\u0074\u0042\u0069\u0074\u006d\u0061\u0070\u0073";
|
|
|
|
if _bfddb ==nil {return nil ,_a .Error (_dgfb ,"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 (_bfddb .Values )-1{return nil ,_a .Errorf (_dgfb ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
|
|
};return _bfddb .Values [i ],nil ;};func _gbfg (_acgea ,_cbgd *Bitmap ,_beab *Selection )(*Bitmap ,error ){const _bcga ="\u0065\u0072\u006fd\u0065";var (_ggec error ;_bbdf *Bitmap ;);_acgea ,_ggec =_cbdfe (_acgea ,_cbgd ,_beab ,&_bbdf );if _ggec !=nil {return nil ,_a .Wrap (_ggec ,_bcga ,"");
|
|
|
|
};if _ggec =_acgea .setAll ();_ggec !=nil {return nil ,_a .Wrap (_ggec ,_bcga ,"");};var _gfbd SelectionValue ;for _dfea :=0;_dfea < _beab .Height ;_dfea ++{for _beed :=0;_beed < _beab .Width ;_beed ++{_gfbd =_beab .Data [_dfea ][_beed ];if _gfbd ==SelHit {_ggec =_cafd (_acgea ,_beab .Cx -_beed ,_beab .Cy -_dfea ,_cbgd .Width ,_cbgd .Height ,PixSrcAndDst ,_bbdf ,0,0);
|
|
|
|
if _ggec !=nil {return nil ,_a .Wrap (_ggec ,_bcga ,"");};};};};if MorphBC ==SymmetricMorphBC {return _acgea ,nil ;};_cagga ,_gaab ,_cgbc ,_addc :=_beab .findMaxTranslations ();if _cagga > 0{if _ggec =_acgea .RasterOperation (0,0,_cagga ,_cbgd .Height ,PixClr ,nil ,0,0);
|
|
|
|
_ggec !=nil {return nil ,_a .Wrap (_ggec ,_bcga ,"\u0078\u0070\u0020\u003e\u0020\u0030");};};if _cgbc > 0{if _ggec =_acgea .RasterOperation (_cbgd .Width -_cgbc ,0,_cgbc ,_cbgd .Height ,PixClr ,nil ,0,0);_ggec !=nil {return nil ,_a .Wrap (_ggec ,_bcga ,"\u0078\u006e\u0020\u003e\u0020\u0030");
|
|
|
|
};};if _gaab > 0{if _ggec =_acgea .RasterOperation (0,0,_cbgd .Width ,_gaab ,PixClr ,nil ,0,0);_ggec !=nil {return nil ,_a .Wrap (_ggec ,_bcga ,"\u0079\u0070\u0020\u003e\u0020\u0030");};};if _addc > 0{if _ggec =_acgea .RasterOperation (0,_cbgd .Height -_addc ,_cbgd .Width ,_addc ,PixClr ,nil ,0,0);
|
|
|
|
_ggec !=nil {return nil ,_a .Wrap (_ggec ,_bcga ,"\u0079\u006e\u0020\u003e\u0020\u0030");};};return _acgea ,nil ;};type shift int ;func MorphSequence (src *Bitmap ,sequence ...MorphProcess )(*Bitmap ,error ){return _accg (src ,sequence ...);};func DilateBrick (d ,s *Bitmap ,hSize ,vSize int )(*Bitmap ,error ){return _eafb (d ,s ,hSize ,vSize )};
|
|
|
|
func _ccad (_cdddd *_ed .Stack ,_bgeb ,_gadf ,_ccdg ,_ffab ,_aaad int ,_gegfgc *_cc .Rectangle )(_fffe error ){const _edegb ="\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 _cdddd ==nil {return _a .Error (_edegb ,"\u006ei\u006c \u0073\u0074\u0061\u0063\u006b \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");};if _gegfgc ==nil {return _a .Error (_edegb ,"\u0070\u0072\u006f\u0076i\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0069\u006da\u0067e\u002e\u0052\u0065\u0063\u0074\u0061\u006eg\u006c\u0065");
|
|
|
|
};_gegfgc .Min .X =_ed .Min (_gegfgc .Min .X ,_bgeb );_gegfgc .Max .X =_ed .Max (_gegfgc .Max .X ,_gadf );_gegfgc .Min .Y =_ed .Min (_gegfgc .Min .Y ,_ccdg );_gegfgc .Max .Y =_ed .Max (_gegfgc .Max .Y ,_ccdg );if !(_ccdg +_ffab >=0&&_ccdg +_ffab <=_aaad ){return nil ;
|
|
|
|
};if _cdddd .Aux ==nil {return _a .Error (_edegb ,"a\u0075x\u0053\u0074\u0061\u0063\u006b\u0020\u006e\u006ft\u0020\u0064\u0065\u0066in\u0065\u0064");};var _afefb *fillSegment ;_ebec ,_fgdb :=_cdddd .Aux .Pop ();if _fgdb {if _afefb ,_fgdb =_ebec .(*fillSegment );
|
|
|
|
!_fgdb {return _a .Error (_edegb ,"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 {_afefb =&fillSegment {};
|
|
|
|
};_afefb ._cbbb =_bgeb ;_afefb ._bcdc =_gadf ;_afefb ._adfa =_ccdg ;_afefb ._fgdd =_ffab ;_cdddd .Push (_afefb );return nil ;};func (_becf *Boxes )makeSizeIndicator (_dfda ,_gegc int ,_fbeg LocationFilter ,_efdg SizeComparison )*_ed .NumSlice {_gegg :=&_ed .NumSlice {};
|
|
|
|
var _cafc ,_cdcb ,_abee int ;for _ ,_ddcb :=range *_becf {_cafc =0;_cdcb ,_abee =_ddcb .Dx (),_ddcb .Dy ();switch _fbeg {case LocSelectWidth :if (_efdg ==SizeSelectIfLT &&_cdcb < _dfda )||(_efdg ==SizeSelectIfGT &&_cdcb > _dfda )||(_efdg ==SizeSelectIfLTE &&_cdcb <=_dfda )||(_efdg ==SizeSelectIfGTE &&_cdcb >=_dfda ){_cafc =1;
|
|
|
|
};case LocSelectHeight :if (_efdg ==SizeSelectIfLT &&_abee < _gegc )||(_efdg ==SizeSelectIfGT &&_abee > _gegc )||(_efdg ==SizeSelectIfLTE &&_abee <=_gegc )||(_efdg ==SizeSelectIfGTE &&_abee >=_gegc ){_cafc =1;};case LocSelectIfEither :if (_efdg ==SizeSelectIfLT &&(_abee < _gegc ||_cdcb < _dfda ))||(_efdg ==SizeSelectIfGT &&(_abee > _gegc ||_cdcb > _dfda ))||(_efdg ==SizeSelectIfLTE &&(_abee <=_gegc ||_cdcb <=_dfda ))||(_efdg ==SizeSelectIfGTE &&(_abee >=_gegc ||_cdcb >=_dfda )){_cafc =1;
|
|
|
|
};case LocSelectIfBoth :if (_efdg ==SizeSelectIfLT &&(_abee < _gegc &&_cdcb < _dfda ))||(_efdg ==SizeSelectIfGT &&(_abee > _gegc &&_cdcb > _dfda ))||(_efdg ==SizeSelectIfLTE &&(_abee <=_gegc &&_cdcb <=_dfda ))||(_efdg ==SizeSelectIfGTE &&(_abee >=_gegc &&_cdcb >=_dfda )){_cafc =1;
|
|
|
|
};};_gegg .AddInt (_cafc );};return _gegg ;};func (_dcga *ClassedPoints )YAtIndex (i int )float32 {return (*_dcga .Points )[_dcga .IntSlice [i ]].Y };func Extract (roi _cc .Rectangle ,src *Bitmap )(*Bitmap ,error ){_decg :=New (roi .Dx (),roi .Dy ());_dedg :=roi .Min .X &0x07;
|
|
|
|
_dda :=8-_dedg ;_ddae :=uint (8-_decg .Width &0x07);_dddb :=src .GetByteIndex (roi .Min .X ,roi .Min .Y );_fabc :=src .GetByteIndex (roi .Max .X -1,roi .Min .Y );_agbc :=_decg .RowStride ==_fabc +1-_dddb ;var _egeg int ;for _dcc :=roi .Min .Y ;_dcc < roi .Max .Y ;
|
|
|
|
_dcc ++{_gdgf :=_dddb ;_cabe :=_egeg ;switch {case _dddb ==_fabc :_addgd ,_gebe :=src .GetByte (_gdgf );if _gebe !=nil {return nil ,_gebe ;};_addgd <<=uint (_dedg );_gebe =_decg .SetByte (_cabe ,_bgg (_ddae ,_addgd ));if _gebe !=nil {return nil ,_gebe ;
|
|
|
|
};case _dedg ==0:for _acfc :=_dddb ;_acfc <=_fabc ;_acfc ++{_gade ,_fdd :=src .GetByte (_gdgf );if _fdd !=nil {return nil ,_fdd ;};_gdgf ++;if _acfc ==_fabc &&_agbc {_gade =_bgg (_ddae ,_gade );};_fdd =_decg .SetByte (_cabe ,_gade );if _fdd !=nil {return nil ,_fdd ;
|
|
|
|
};_cabe ++;};default:_gedf :=_ggfb (src ,_decg ,uint (_dedg ),uint (_dda ),_ddae ,_dddb ,_fabc ,_agbc ,_gdgf ,_cabe );if _gedf !=nil {return nil ,_gedf ;};};_dddb +=src .RowStride ;_fabc +=src .RowStride ;_egeg +=_decg .RowStride ;};return _decg ,nil ;
|
|
|
|
};func New (width ,height int )*Bitmap {_fdef :=_gcbc (width ,height );_fdef .Data =make ([]byte ,height *_fdef .RowStride );return _fdef ;};func CombineBytes (oldByte ,newByte byte ,op CombinationOperator )byte {return _eefa (oldByte ,newByte ,op );};
|
|
|
|
const (MopDilation MorphOperation =iota ;MopErosion ;MopOpening ;MopClosing ;MopRankBinaryReduction ;MopReplicativeBinaryExpansion ;MopAddBorder ;);func (_defc *Bitmap )Equivalent (s *Bitmap )bool {return _defc .equivalent (s )};func (_cbc *Bitmap )setEightBytes (_aeg int ,_ecaa uint64 )error {_dbge :=_cbc .RowStride -(_aeg %_cbc .RowStride );
|
|
|
|
if _cbc .RowStride !=_cbc .Width >>3{_dbge --;};if _dbge >=8{return _cbc .setEightFullBytes (_aeg ,_ecaa );};return _cbc .setEightPartlyBytes (_aeg ,_dbge ,_ecaa );};func TstRSymbol (t *_ag .T ,scale ...int )*Bitmap {_cgegd ,_dgbe :=NewWithData (4,5,[]byte {0xF0,0x90,0xF0,0xA0,0x90});
|
|
|
|
_g .NoError (t ,_dgbe );return TstGetScaledSymbol (t ,_cgegd ,scale ...);};func _efce (_ceg ,_ddac *Bitmap ,_cde ,_ceeg int )(*Bitmap ,error ){const _bbff ="\u0063\u006c\u006f\u0073\u0065\u0042\u0072\u0069\u0063\u006b";if _ddac ==nil {return nil ,_a .Error (_bbff ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
|
|
};if _cde < 1||_ceeg < 1{return nil ,_a .Error (_bbff ,"\u0068S\u0069\u007a\u0065\u0020\u0061\u006e\u0064\u0020\u0076\u0053\u0069z\u0065\u0020\u006e\u006f\u0074\u0020\u003e\u003d\u0020\u0031");};if _cde ==1&&_ceeg ==1{return _ddac .Copy (),nil ;};if _cde ==1||_ceeg ==1{_ceed :=SelCreateBrick (_ceeg ,_cde ,_ceeg /2,_cde /2,SelHit );
|
|
|
|
var _aeag error ;_ceg ,_aeag =_ggce (_ceg ,_ddac ,_ceed );if _aeag !=nil {return nil ,_a .Wrap (_aeag ,_bbff ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");};return _ceg ,nil ;
|
|
|
|
};_ceab :=SelCreateBrick (1,_cde ,0,_cde /2,SelHit );_ggacd :=SelCreateBrick (_ceeg ,1,_ceeg /2,0,SelHit );_bddd ,_ffa :=_egfg (nil ,_ddac ,_ceab );if _ffa !=nil {return nil ,_a .Wrap (_ffa ,_bbff ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
|
|
};if _ceg ,_ffa =_egfg (_ceg ,_bddd ,_ggacd );_ffa !=nil {return nil ,_a .Wrap (_ffa ,_bbff ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};if _ ,_ffa =_gbfg (_bddd ,_ceg ,_ceab );_ffa !=nil {return nil ,_a .Wrap (_ffa ,_bbff ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");
|
|
|
|
};if _ ,_ffa =_gbfg (_ceg ,_bddd ,_ggacd );_ffa !=nil {return nil ,_a .Wrap (_ffa ,_bbff ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};return _ceg ,nil ;};func (_dfac *ClassedPoints )GroupByY ()([]*ClassedPoints ,error ){const _agbe ="\u0043\u006c\u0061\u0073se\u0064\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0072\u006f\u0075\u0070\u0042y\u0059";
|
|
|
|
if _ebdda :=_dfac .validateIntSlice ();_ebdda !=nil {return nil ,_a .Wrap (_ebdda ,_agbe ,"");};if _dfac .IntSlice .Size ()==0{return nil ,_a .Error (_agbe ,"\u004e\u006f\u0020\u0063la\u0073\u0073\u0065\u0073\u0020\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064");
|
|
|
|
};_dfac .SortByY ();var (_dagf []*ClassedPoints ;_cfae int ;);_gdbb :=-1;var _ecggb *ClassedPoints ;for _efec :=0;_efec < len (_dfac .IntSlice );_efec ++{_cfae =int (_dfac .YAtIndex (_efec ));if _cfae !=_gdbb {_ecggb =&ClassedPoints {Points :_dfac .Points };
|
|
|
|
_gdbb =_cfae ;_dagf =append (_dagf ,_ecggb );};_ecggb .IntSlice =append (_ecggb .IntSlice ,_dfac .IntSlice [_efec ]);};for _ ,_gcdg :=range _dagf {_gcdg .SortByX ();};return _dagf ,nil ;};func (_afcf *Bitmap )Zero ()bool {_ddgc :=_afcf .Width /8;_efbbb :=_afcf .Width &7;
|
|
|
|
var _gcda byte ;if _efbbb !=0{_gcda =byte (0xff<<uint (8-_efbbb ));};var _ega ,_gce ,_ddgb int ;for _gce =0;_gce < _afcf .Height ;_gce ++{_ega =_afcf .RowStride *_gce ;for _ddgb =0;_ddgb < _ddgc ;_ddgb ,_ega =_ddgb +1,_ega +1{if _afcf .Data [_ega ]!=0{return false ;
|
|
|
|
};};if _efbbb > 0{if _afcf .Data [_ega ]&_gcda !=0{return false ;};};};return true ;};func TstWSymbol (t *_ag .T ,scale ...int )*Bitmap {_egde ,_fbdg :=NewWithData (5,5,[]byte {0x88,0x88,0xA8,0xD8,0x88});_g .NoError (t ,_fbdg );return TstGetScaledSymbol (t ,_egde ,scale ...);
|
|
|
|
};func TstWordBitmap (t *_ag .T ,scale ...int )*Bitmap {_dabe :=1;if len (scale )> 0{_dabe =scale [0];};_bbbf :=3;_gcbg :=9+7+15+2*_bbbf ;_dfca :=5+_bbbf +5;_affc :=New (_gcbg *_dabe ,_dfca *_dabe );_baba :=&Bitmaps {};var _adaff *int ;_bbbf *=_dabe ;_gfefa :=0;
|
|
|
|
_adaff =&_gfefa ;_gaac :=0;_fgfad :=TstDSymbol (t ,scale ...);TstAddSymbol (t ,_baba ,_fgfad ,_adaff ,_gaac ,1*_dabe );_fgfad =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_baba ,_fgfad ,_adaff ,_gaac ,_bbbf );_fgfad =TstISymbol (t ,scale ...);TstAddSymbol (t ,_baba ,_fgfad ,_adaff ,_gaac ,1*_dabe );
|
|
|
|
_fgfad =TstTSymbol (t ,scale ...);TstAddSymbol (t ,_baba ,_fgfad ,_adaff ,_gaac ,_bbbf );_fgfad =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_baba ,_fgfad ,_adaff ,_gaac ,1*_dabe );_fgfad =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_baba ,_fgfad ,_adaff ,_gaac ,1*_dabe );
|
|
|
|
_fgfad =TstWSymbol (t ,scale ...);TstAddSymbol (t ,_baba ,_fgfad ,_adaff ,_gaac ,0);*_adaff =0;_gaac =5*_dabe +_bbbf ;_fgfad =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_baba ,_fgfad ,_adaff ,_gaac ,1*_dabe );_fgfad =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_baba ,_fgfad ,_adaff ,_gaac ,_bbbf );
|
|
|
|
_fgfad =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_baba ,_fgfad ,_adaff ,_gaac ,1*_dabe );_fgfad =TstESymbol (t ,scale ...);TstAddSymbol (t ,_baba ,_fgfad ,_adaff ,_gaac ,1*_dabe );_fgfad =TstVSymbol (t ,scale ...);TstAddSymbol (t ,_baba ,_fgfad ,_adaff ,_gaac ,1*_dabe );
|
|
|
|
_fgfad =TstESymbol (t ,scale ...);TstAddSymbol (t ,_baba ,_fgfad ,_adaff ,_gaac ,1*_dabe );_fgfad =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_baba ,_fgfad ,_adaff ,_gaac ,0);TstWriteSymbols (t ,_baba ,_affc );return _affc ;};var _bgb [256]uint8 ;func _ceaa (_bgda ,_acge ,_fbee *Bitmap )(*Bitmap ,error ){const _cbgb ="\u0073\u0075\u0062\u0074\u0072\u0061\u0063\u0074";
|
|
|
|
if _acge ==nil {return nil ,_a .Error (_cbgb ,"'\u0073\u0031\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _fbee ==nil {return nil ,_a .Error (_cbgb ,"'\u0073\u0032\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};var _afcfd error ;switch {case _bgda ==_acge :if _afcfd =_bgda .RasterOperation (0,0,_acge .Width ,_acge .Height ,PixNotSrcAndDst ,_fbee ,0,0);
|
|
|
|
_afcfd !=nil {return nil ,_a .Wrap (_afcfd ,_cbgb ,"\u0064 \u003d\u003d\u0020\u0073\u0031");};case _bgda ==_fbee :if _afcfd =_bgda .RasterOperation (0,0,_acge .Width ,_acge .Height ,PixNotSrcAndDst ,_acge ,0,0);_afcfd !=nil {return nil ,_a .Wrap (_afcfd ,_cbgb ,"\u0064 \u003d\u003d\u0020\u0073\u0032");
|
|
|
|
};default:_bgda ,_afcfd =_gddf (_bgda ,_acge );if _afcfd !=nil {return nil ,_a .Wrap (_afcfd ,_cbgb ,"");};if _afcfd =_bgda .RasterOperation (0,0,_acge .Width ,_acge .Height ,PixNotSrcAndDst ,_fbee ,0,0);_afcfd !=nil {return nil ,_a .Wrap (_afcfd ,_cbgb ,"\u0064e\u0066\u0061\u0075\u006c\u0074");
|
|
|
|
};};return _bgda ,nil ;};type RasterOperator int ;func Centroid (bm *Bitmap ,centTab ,sumTab []int )(Point ,error ){return bm .centroid (centTab ,sumTab )};func _ccff (_ccag ,_gfgc *Bitmap ,_dgec ,_ccc ,_cbebe ,_abgg ,_bfea int ,_dffe CombinationOperator )error {var _ebd int ;
|
|
|
|
_ffe :=func (){_ebd ++;_cbebe +=_gfgc .RowStride ;_abgg +=_ccag .RowStride ;_bfea +=_ccag .RowStride };for _ebd =_dgec ;_ebd < _ccc ;_ffe (){_dgd :=_cbebe ;for _bfaa :=_abgg ;_bfaa <=_bfea ;_bfaa ++{_dba ,_aea :=_gfgc .GetByte (_dgd );if _aea !=nil {return _aea ;
|
|
|
|
};_bcd ,_aea :=_ccag .GetByte (_bfaa );if _aea !=nil {return _aea ;};if _aea =_gfgc .SetByte (_dgd ,_eefa (_dba ,_bcd ,_dffe ));_aea !=nil {return _aea ;};_dgd ++;};};return nil ;};func _edf (_bcbc ,_cbdf *Bitmap ,_ecf int ,_cca []byte ,_aecb int )(_deaf error ){const _bfdd ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0032";
|
|
|
|
var (_gae ,_faf ,_aefd ,_ff ,_dcf ,_gde ,_dbf ,_gffb int ;_gcbb ,_ccd ,_eagc ,_baf uint32 ;_defe ,_fgf byte ;_dga uint16 ;);_befa :=make ([]byte ,4);_ffc :=make ([]byte ,4);for _aefd =0;_aefd < _bcbc .Height -1;_aefd ,_ff =_aefd +2,_ff +1{_gae =_aefd *_bcbc .RowStride ;
|
|
|
|
_faf =_ff *_cbdf .RowStride ;for _dcf ,_gde =0,0;_dcf < _aecb ;_dcf ,_gde =_dcf +4,_gde +1{for _dbf =0;_dbf < 4;_dbf ++{_gffb =_gae +_dcf +_dbf ;if _gffb <=len (_bcbc .Data )-1&&_gffb < _gae +_bcbc .RowStride {_befa [_dbf ]=_bcbc .Data [_gffb ];}else {_befa [_dbf ]=0x00;
|
|
|
|
};_gffb =_gae +_bcbc .RowStride +_dcf +_dbf ;if _gffb <=len (_bcbc .Data )-1&&_gffb < _gae +(2*_bcbc .RowStride ){_ffc [_dbf ]=_bcbc .Data [_gffb ];}else {_ffc [_dbf ]=0x00;};};_gcbb =_d .BigEndian .Uint32 (_befa );_ccd =_d .BigEndian .Uint32 (_ffc );_eagc =_gcbb &_ccd ;
|
|
|
|
_eagc |=_eagc <<1;_baf =_gcbb |_ccd ;_baf &=_baf <<1;_ccd =_eagc |_baf ;_ccd &=0xaaaaaaaa;_gcbb =_ccd |(_ccd <<7);_defe =byte (_gcbb >>24);_fgf =byte ((_gcbb >>8)&0xff);_gffb =_faf +_gde ;if _gffb +1==len (_cbdf .Data )-1||_gffb +1>=_faf +_cbdf .RowStride {if _deaf =_cbdf .SetByte (_gffb ,_cca [_defe ]);
|
|
|
|
_deaf !=nil {return _a .Wrapf (_deaf ,_bfdd ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_gffb );};}else {_dga =(uint16 (_cca [_defe ])<<8)|uint16 (_cca [_fgf ]);if _deaf =_cbdf .setTwoBytes (_gffb ,_dga );_deaf !=nil {return _a .Wrapf (_deaf ,_bfdd ,"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",_gffb );
|
|
|
|
};_gde ++;};};};return nil ;};func (_becc Points )Get (i int )(Point ,error ){if i > len (_becc )-1{return Point {},_a .Errorf ("\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0065\u0074","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
|
|
};return _becc [i ],nil ;};func (_dbab *Boxes )selectWithIndicator (_dfee *_ed .NumSlice )(_gecf *Boxes ,_dgad error ){const _cdca ="\u0042o\u0078\u0065\u0073\u002es\u0065\u006c\u0065\u0063\u0074W\u0069t\u0068I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";
|
|
|
|
if _dbab ==nil {return nil ,_a .Error (_cdca ,"b\u006f\u0078\u0065\u0073 '\u0062'\u0020\u006e\u006f\u0074\u0020d\u0065\u0066\u0069\u006e\u0065\u0064");};if _dfee ==nil {return nil ,_a .Error (_cdca ,"\u0027\u006ea\u0027\u0020\u006eo\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
|
|
};if len (*_dfee )!=len (*_dbab ){return nil ,_a .Error (_cdca ,"\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 _dafc ,_cbab int ;for _gega :=0;_gega < len (*_dfee );_gega ++{if _dafc ,_dgad =_dfee .GetInt (_gega );_dgad !=nil {return nil ,_a .Wrap (_dgad ,_cdca ,"\u0063\u0068\u0065\u0063\u006b\u0069\u006e\u0067\u0020c\u006f\u0075\u006e\u0074");};if _dafc ==1{_cbab ++;
|
|
|
|
};};if _cbab ==len (*_dbab ){return _dbab ,nil ;};_dcgb :=Boxes {};for _gdc :=0;_gdc < len (*_dfee );_gdc ++{_dafc =int ((*_dfee )[_gdc ]);if _dafc ==0{continue ;};_dcgb =append (_dcgb ,(*_dbab )[_gdc ]);};_gecf =&_dcgb ;return _gecf ,nil ;};func (_gfdda *byWidth )Len ()int {return len (_gfdda .Values )};
|
|
|
|
func _beca (_fbfg *Bitmap ,_fgea *_ed .Stack ,_bbec ,_dccb int )(_cbdg *_cc .Rectangle ,_ecfa error ){const _afef ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";if _fbfg ==nil {return nil ,_a .Error (_afef ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");
|
|
|
|
};if _fgea ==nil {return nil ,_a .Error (_afef ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");};_aega ,_fbfd :=_fbfg .Width ,_fbfg .Height ;_bedf :=_aega -1;_egfdb :=_fbfd -1;if _bbec < 0||_bbec > _bedf ||_dccb < 0||_dccb > _egfdb ||!_fbfg .GetPixel (_bbec ,_dccb ){return nil ,nil ;
|
|
|
|
};var _cfgd *_cc .Rectangle ;_cfgd ,_ecfa =Rect (100000,100000,0,0);if _ecfa !=nil {return nil ,_a .Wrap (_ecfa ,_afef ,"");};if _ecfa =_ccad (_fgea ,_bbec ,_bbec ,_dccb ,1,_egfdb ,_cfgd );_ecfa !=nil {return nil ,_a .Wrap (_ecfa ,_afef ,"\u0069\u006e\u0069t\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");
|
|
|
|
};if _ecfa =_ccad (_fgea ,_bbec ,_bbec ,_dccb +1,-1,_egfdb ,_cfgd );_ecfa !=nil {return nil ,_a .Wrap (_ecfa ,_afef ,"\u0032\u006ed\u0020\u0069\u006ei\u0074\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};_cfgd .Min .X ,_cfgd .Max .X =_bbec ,_bbec ;
|
|
|
|
_cfgd .Min .Y ,_cfgd .Max .Y =_dccb ,_dccb ;var (_agdd *fillSegment ;_efegc int ;);for _fgea .Len ()> 0{if _agdd ,_ecfa =_ffgb (_fgea );_ecfa !=nil {return nil ,_a .Wrap (_ecfa ,_afef ,"");};_dccb =_agdd ._adfa ;for _bbec =_agdd ._cbbb ;_bbec >=0&&_fbfg .GetPixel (_bbec ,_dccb );
|
|
|
|
_bbec --{if _ecfa =_fbfg .SetPixel (_bbec ,_dccb ,0);_ecfa !=nil {return nil ,_a .Wrap (_ecfa ,_afef ,"");};};if _bbec >=_agdd ._cbbb {for _bbec ++;_bbec <=_agdd ._bcdc &&_bbec <=_bedf &&!_fbfg .GetPixel (_bbec ,_dccb );_bbec ++{};_efegc =_bbec ;if !(_bbec <=_agdd ._bcdc &&_bbec <=_bedf ){continue ;
|
|
|
|
};}else {_efegc =_bbec +1;if _efegc < _agdd ._cbbb -1{if _ecfa =_ccad (_fgea ,_efegc ,_agdd ._cbbb -1,_agdd ._adfa ,-_agdd ._fgdd ,_egfdb ,_cfgd );_ecfa !=nil {return nil ,_a .Wrap (_ecfa ,_afef ,"\u006c\u0065\u0061\u006b\u0020\u006f\u006e\u0020\u006c\u0065\u0066\u0074 \u0073\u0069\u0064\u0065");
|
|
|
|
};};_bbec =_agdd ._cbbb +1;};for {for ;_bbec <=_bedf &&_fbfg .GetPixel (_bbec ,_dccb );_bbec ++{if _ecfa =_fbfg .SetPixel (_bbec ,_dccb ,0);_ecfa !=nil {return nil ,_a .Wrap (_ecfa ,_afef ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _ecfa =_ccad (_fgea ,_efegc ,_bbec -1,_agdd ._adfa ,_agdd ._fgdd ,_egfdb ,_cfgd );
|
|
|
|
_ecfa !=nil {return nil ,_a .Wrap (_ecfa ,_afef ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _bbec > _agdd ._bcdc +1{if _ecfa =_ccad (_fgea ,_agdd ._bcdc +1,_bbec -1,_agdd ._adfa ,-_agdd ._fgdd ,_egfdb ,_cfgd );_ecfa !=nil {return nil ,_a .Wrap (_ecfa ,_afef ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");
|
|
|
|
};};for _bbec ++;_bbec <=_agdd ._bcdc &&_bbec <=_bedf &&!_fbfg .GetPixel (_bbec ,_dccb );_bbec ++{};_efegc =_bbec ;if !(_bbec <=_agdd ._bcdc &&_bbec <=_bedf ){break ;};};};_cfgd .Max .X ++;_cfgd .Max .Y ++;return _cfgd ,nil ;};func NewWithUnpaddedData (width ,height int ,data []byte )(*Bitmap ,error ){const _adfg ="\u004e\u0065\u0077\u0057it\u0068\u0055\u006e\u0070\u0061\u0064\u0064\u0065\u0064\u0044\u0061\u0074\u0061";
|
|
|
|
_efa :=_gcbc (width ,height );_efa .Data =data ;if _facg :=((width *height )+7)>>3;len (data )< _facg {return nil ,_a .Errorf (_adfg ,"\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 ),_facg );
|
|
|
|
};if _eae :=_efa .addPadBits ();_eae !=nil {return nil ,_a .Wrap (_eae ,_adfg ,"");};return _efa ,nil ;};func (_abeb *byHeight )Less (i ,j int )bool {return _abeb .Values [i ].Height < _abeb .Values [j ].Height };type BitmapsArray struct{Values []*Bitmaps ;
|
|
|
|
Boxes []*_cc .Rectangle ;};func _gcfb (_gbaa ,_dgcd *Bitmap ,_cebf *Selection )(*Bitmap ,error ){const _gbdg ="\u006f\u0070\u0065\u006e";var _aebf error ;_gbaa ,_aebf =_fffa (_gbaa ,_dgcd ,_cebf );if _aebf !=nil {return nil ,_a .Wrap (_aebf ,_gbdg ,"");
|
|
|
|
};_bccgb ,_aebf :=_gbfg (nil ,_dgcd ,_cebf );if _aebf !=nil {return nil ,_a .Wrap (_aebf ,_gbdg ,"");};_ ,_aebf =_egfg (_gbaa ,_bccgb ,_cebf );if _aebf !=nil {return nil ,_a .Wrap (_aebf ,_gbdg ,"");};return _gbaa ,nil ;};func _bef (_afe *Bitmap ,_bfe int ,_aca []byte )(_feg *Bitmap ,_gaff error ){const _gdf ="\u0072\u0065\u0064\u0075\u0063\u0065\u0052\u0061\u006e\u006b\u0042\u0069n\u0061\u0072\u0079\u0032";
|
|
|
|
if _afe ==nil {return nil ,_a .Error (_gdf ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};if _bfe < 1||_bfe > 4{return nil ,_a .Error (_gdf ,"\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 _afe .Height <=1{return nil ,_a .Errorf (_gdf ,"\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",_afe .Height );
|
|
|
|
};_feg =New (_afe .Width /2,_afe .Height /2);if _aca ==nil {_aca =_fedg ();};_cbg :=_bded (_afe .RowStride ,2*_feg .RowStride );switch _bfe {case 1:_gaff =_da (_afe ,_feg ,_bfe ,_aca ,_cbg );case 2:_gaff =_edf (_afe ,_feg ,_bfe ,_aca ,_cbg );case 3:_gaff =_gg (_afe ,_feg ,_bfe ,_aca ,_cbg );
|
|
|
|
case 4:_gaff =_dbe (_afe ,_feg ,_bfe ,_aca ,_cbg );};if _gaff !=nil {return nil ,_gaff ;};return _feg ,nil ;};func (_eggfa *ClassedPoints )ySortFunction ()func (_bada int ,_eaff int )bool {return func (_dfdc ,_gggg int )bool {return _eggfa .YAtIndex (_dfdc )< _eggfa .YAtIndex (_gggg )};
|
|
|
|
};type BoundaryCondition int ;func TstImageBitmapData ()[]byte {return _cacbf .Data };func Rect (x ,y ,w ,h int )(*_cc .Rectangle ,error ){const _efbdf ="b\u0069\u0074\u006d\u0061\u0070\u002e\u0052\u0065\u0063\u0074";if x < 0{w +=x ;x =0;if w <=0{return nil ,_a .Errorf (_efbdf ,"x\u003a\u0027\u0025\u0064\u0027\u0020<\u0020\u0030\u0020\u0061\u006e\u0064\u0020\u0077\u003a \u0027\u0025\u0064'\u0020<\u003d\u0020\u0030",x ,w );
|
|
|
|
};};if y < 0{h +=y ;y =0;if h <=0{return nil ,_a .Error (_efbdf ,"\u0079\u0020\u003c 0\u0020\u0061\u006e\u0064\u0020\u0062\u006f\u0078\u0020\u006f\u0066\u0066\u0020\u002b\u0071\u0075\u0061\u0064");};};_dagde :=_cc .Rect (x ,y ,x +w ,y +h );return &_dagde ,nil ;
|
|
|
|
};func _efb (_cgb *Bitmap ,_gb *Bitmap ,_afc int )(_bfd error ){const _fg ="e\u0078\u0070\u0061\u006edB\u0069n\u0061\u0072\u0079\u0050\u006fw\u0065\u0072\u0032\u004c\u006f\u0077";switch _afc {case 2:_bfd =_ef (_cgb ,_gb );case 4:_bfd =_adg (_cgb ,_gb );
|
|
|
|
case 8:_bfd =_ga (_cgb ,_gb );default:return _a .Error (_fg ,"\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 _bfd !=nil {_bfd =_a .Wrap (_bfd ,_fg ,"");};return _bfd ;};func (_dca *Bitmap )Equals (s *Bitmap )bool {if len (_dca .Data )!=len (s .Data )||_dca .Width !=s .Width ||_dca .Height !=s .Height {return false ;};for _efd :=0;_efd < _dca .Height ;_efd ++{_dadb :=_efd *_dca .RowStride ;
|
|
|
|
for _dfe :=0;_dfe < _dca .RowStride ;_dfe ++{if _dca .Data [_dadb +_dfe ]!=s .Data [_dadb +_dfe ]{return false ;};};};return true ;};type SizeSelection int ;func (_bda *Bitmap )GetByteIndex (x ,y int )int {return y *_bda .RowStride +(x >>3)};func (_ccgg Points )GetGeometry (i int )(_dfgg ,_fbgc float32 ,_ggae error ){if i > len (_ccgg )-1{return 0,0,_a .Errorf ("\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0065\u0074","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
|
|
};_faea :=_ccgg [i ];return _faea .X ,_faea .Y ,nil ;};func (_ceae *Boxes )Get (i int )(*_cc .Rectangle ,error ){const _bgca ="\u0042o\u0078\u0065\u0073\u002e\u0047\u0065t";if _ceae ==nil {return nil ,_a .Error (_bgca ,"\u0027\u0042\u006f\u0078es\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
|
|
};if i > len (*_ceae )-1{return nil ,_a .Errorf (_bgca ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return (*_ceae )[i ],nil ;};func (_abeg *Bitmap )setTwoBytes (_ecga int ,_ffg uint16 )error {if _ecga +1> len (_abeg .Data )-1{return _a .Errorf ("s\u0065\u0074\u0054\u0077\u006f\u0042\u0079\u0074\u0065\u0073","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",_ecga );
|
|
|
|
};_abeg .Data [_ecga ]=byte ((_ffg &0xff00)>>8);_abeg .Data [_ecga +1]=byte (_ffg &0xff);return nil ;};func (_ged *Bitmap )nextOnPixelLow (_bbbd ,_ccf ,_abdd ,_egfd ,_ccdcg int )(_cffd _cc .Point ,_gagc bool ,_ccgc error ){const _fgfg ="B\u0069\u0074\u006d\u0061p.\u006ee\u0078\u0074\u004f\u006e\u0050i\u0078\u0065\u006c\u004c\u006f\u0077";
|
|
|
|
var (_bce int ;_aabb byte ;);_befae :=_ccdcg *_abdd ;_gea :=_befae +(_egfd /8);if _aabb ,_ccgc =_ged .GetByte (_gea );_ccgc !=nil {return _cffd ,false ,_a .Wrap (_ccgc ,_fgfg ,"\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 _aabb !=0{_ecff :=_egfd -(_egfd %8)+7;for _bce =_egfd ;_bce <=_ecff &&_bce < _bbbd ;_bce ++{if _ged .GetPixel (_bce ,_ccdcg ){_cffd .X =_bce ;_cffd .Y =_ccdcg ;return _cffd ,true ,nil ;};};};_aadca :=(_egfd /8)+1;_bce =8*_aadca ;var _dac int ;for _gea =_befae +_aadca ;
|
|
|
|
_bce < _bbbd ;_gea ,_bce =_gea +1,_bce +8{if _aabb ,_ccgc =_ged .GetByte (_gea );_ccgc !=nil {return _cffd ,false ,_a .Wrap (_ccgc ,_fgfg ,"r\u0065\u0073\u0074\u0020of\u0020t\u0068\u0065\u0020\u006c\u0069n\u0065\u0020\u0062\u0079\u0074\u0065");};if _aabb ==0{continue ;
|
|
|
|
};for _dac =0;_dac < 8&&_bce < _bbbd ;_dac ,_bce =_dac +1,_bce +1{if _ged .GetPixel (_bce ,_ccdcg ){_cffd .X =_bce ;_cffd .Y =_ccdcg ;return _cffd ,true ,nil ;};};};for _abbc :=_ccdcg +1;_abbc < _ccf ;_abbc ++{_befae =_abbc *_abdd ;for _gea ,_bce =_befae ,0;
|
|
|
|
_bce < _bbbd ;_gea ,_bce =_gea +1,_bce +8{if _aabb ,_ccgc =_ged .GetByte (_gea );_ccgc !=nil {return _cffd ,false ,_a .Wrap (_ccgc ,_fgfg ,"\u0066o\u006cl\u006f\u0077\u0069\u006e\u0067\u0020\u006c\u0069\u006e\u0065\u0073");};if _aabb ==0{continue ;};for _dac =0;
|
|
|
|
_dac < 8&&_bce < _bbbd ;_dac ,_bce =_dac +1,_bce +1{if _ged .GetPixel (_bce ,_abbc ){_cffd .X =_bce ;_cffd .Y =_abbc ;return _cffd ,true ,nil ;};};};};return _cffd ,false ,nil ;};func (_agdea *Bitmap )RasterOperation (dx ,dy ,dw ,dh int ,op RasterOperator ,src *Bitmap ,sx ,sy int )error {return _cafd (_agdea ,dx ,dy ,dw ,dh ,op ,src ,sx ,sy );
|
|
|
|
};func (_fgbb *Bitmap )setBit (_edfg int ){_fgbb .Data [(_edfg >>3)]|=0x80>>uint (_edfg &7)};func (_efbd *Bitmap )RemoveBorder (borderSize int )(*Bitmap ,error ){if borderSize ==0{return _efbd .Copy (),nil ;};_fgac ,_fbb :=_efbd .removeBorderGeneral (borderSize ,borderSize ,borderSize ,borderSize );
|
|
|
|
if _fbb !=nil {return nil ,_a .Wrap (_fbb ,"\u0052\u0065\u006do\u0076\u0065\u0042\u006f\u0072\u0064\u0065\u0072","");};return _fgac ,nil ;};var MorphBC BoundaryCondition ;func (_ccefa Points )GetIntX (i int )(int ,error ){if i >=len (_ccefa ){return 0,_a .Errorf ("\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0065t\u0049\u006e\u0074\u0058","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
|
|
};return int (_ccefa [i ].X ),nil ;};func (_gdac *Selection )findMaxTranslations ()(_cddg ,_adfec ,_gdab ,_feddb int ){for _gbafc :=0;_gbafc < _gdac .Height ;_gbafc ++{for _cgfeg :=0;_cgfeg < _gdac .Width ;_cgfeg ++{if _gdac .Data [_gbafc ][_cgfeg ]==SelHit {_cddg =_ffga (_cddg ,_gdac .Cx -_cgfeg );
|
|
|
|
_adfec =_ffga (_adfec ,_gdac .Cy -_gbafc );_gdab =_ffga (_gdab ,_cgfeg -_gdac .Cx );_feddb =_ffga (_feddb ,_gbafc -_gdac .Cy );};};};return _cddg ,_adfec ,_gdab ,_feddb ;};func (_bbba *Bitmaps )SelectBySize (width ,height int ,tp LocationFilter ,relation SizeComparison )(_cagd *Bitmaps ,_bdfd error ){const _aceb ="B\u0069t\u006d\u0061\u0070\u0073\u002e\u0053\u0065\u006ce\u0063\u0074\u0042\u0079Si\u007a\u0065";
|
|
|
|
if _bbba ==nil {return nil ,_a .Error (_aceb ,"\u0027\u0062\u0027 B\u0069\u0074\u006d\u0061\u0070\u0073\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};switch tp {case LocSelectWidth ,LocSelectHeight ,LocSelectIfEither ,LocSelectIfBoth :default:return nil ,_a .Errorf (_aceb ,"\u0070\u0072\u006f\u0076\u0069d\u0065\u0064\u0020\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u006c\u006fc\u0061\u0074\u0069\u006f\u006e\u0020\u0066\u0069\u006c\u0074\u0065\u0072\u0020\u0074\u0079\u0070\u0065\u003a\u0020\u0025\u0064",tp );
|
|
|
|
};switch relation {case SizeSelectIfLT ,SizeSelectIfGT ,SizeSelectIfLTE ,SizeSelectIfGTE ,SizeSelectIfEQ :default:return nil ,_a .Errorf (_aceb ,"\u0069\u006e\u0076\u0061li\u0064\u0020\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0027\u0025d\u0027",relation );
|
|
|
|
};_bfcf ,_bdfd :=_bbba .makeSizeIndicator (width ,height ,tp ,relation );if _bdfd !=nil {return nil ,_a .Wrap (_bdfd ,_aceb ,"");};_cagd ,_bdfd =_bbba .selectByIndicator (_bfcf );if _bdfd !=nil {return nil ,_a .Wrap (_bdfd ,_aceb ,"");};return _cagd ,nil ;
|
|
|
|
};func _ga (_be ,_dee *Bitmap )(_aef error ){const _geb ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0038";_db :=_dee .RowStride ;_cg :=_be .RowStride ;var _dg ,_cba ,_abc ,_gaf ,_dec int ;for _abc =0;
|
|
|
|
_abc < _dee .Height ;_abc ++{_dg =_abc *_db ;_cba =8*_abc *_cg ;for _gaf =0;_gaf < _db ;_gaf ++{if _aef =_be .setEightBytes (_cba +_gaf *8,_fdc [_dee .Data [_dg +_gaf ]]);_aef !=nil {return _a .Wrap (_aef ,_geb ,"");};};for _dec =1;_dec < 8;_dec ++{for _gaf =0;
|
|
|
|
_gaf < _cg ;_gaf ++{if _aef =_be .SetByte (_cba +_dec *_cg +_gaf ,_be .Data [_cba +_gaf ]);_aef !=nil {return _a .Wrap (_aef ,_geb ,"");};};};};return nil ;};func _dbff (_bcgab ,_ffcgc *Bitmap ,_fabbd ,_ecad int )(*Bitmap ,error ){const _afaec ="\u006fp\u0065\u006e\u0042\u0072\u0069\u0063k";
|
|
|
|
if _ffcgc ==nil {return nil ,_a .Error (_afaec ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};if _fabbd < 1&&_ecad < 1{return nil ,_a .Error (_afaec ,"\u0068\u0053\u0069\u007ae \u003c\u0020\u0031\u0020\u0026\u0026\u0020\u0076\u0053\u0069\u007a\u0065\u0020\u003c \u0031");
|
|
|
|
};if _fabbd ==1&&_ecad ==1{return _ffcgc .Copy (),nil ;};if _fabbd ==1||_ecad ==1{var _egfe error ;_bfddf :=SelCreateBrick (_ecad ,_fabbd ,_ecad /2,_fabbd /2,SelHit );_bcgab ,_egfe =_gcfb (_bcgab ,_ffcgc ,_bfddf );if _egfe !=nil {return nil ,_a .Wrap (_egfe ,_afaec ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
|
|
};return _bcgab ,nil ;};_dgde :=SelCreateBrick (1,_fabbd ,0,_fabbd /2,SelHit );_ddgg :=SelCreateBrick (_ecad ,1,_ecad /2,0,SelHit );_afdc ,_ffda :=_gbfg (nil ,_ffcgc ,_dgde );if _ffda !=nil {return nil ,_a .Wrap (_ffda ,_afaec ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");
|
|
|
|
};_bcgab ,_ffda =_gbfg (_bcgab ,_afdc ,_ddgg );if _ffda !=nil {return nil ,_a .Wrap (_ffda ,_afaec ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};_ ,_ffda =_egfg (_afdc ,_bcgab ,_dgde );if _ffda !=nil {return nil ,_a .Wrap (_ffda ,_afaec ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
|
|
};_ ,_ffda =_egfg (_bcgab ,_afdc ,_ddgg );if _ffda !=nil {return nil ,_a .Wrap (_ffda ,_afaec ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};return _bcgab ,nil ;};func (_aggde *ClassedPoints )GetIntXByClass (i int )(int ,error ){const _cabd ="\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 >=_aggde .IntSlice .Size (){return 0,_a .Errorf (_cabd ,"\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 (_aggde .XAtIndex (i )),nil ;};func CorrelationScoreThresholded (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab ,downcount []int ,scoreThreshold float32 )(bool ,error ){const _egac ="C\u006f\u0072\u0072\u0065\u006c\u0061t\u0069\u006f\u006e\u0053\u0063\u006f\u0072\u0065\u0054h\u0072\u0065\u0073h\u006fl\u0064\u0065\u0064";
|
|
|
|
if bm1 ==nil {return false ,_a .Error (_egac ,"\u0063\u006f\u0072\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u0053\u0063\u006f\u0072\u0065\u0054\u0068\u0072\u0065\u0073\u0068\u006f\u006cd\u0065\u0064\u0020\u0062\u006d1\u0020\u0069s\u0020\u006e\u0069\u006c");
|
|
|
|
};if bm2 ==nil {return false ,_a .Error (_egac ,"\u0063\u006f\u0072\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u0053\u0063\u006f\u0072\u0065\u0054\u0068\u0072\u0065\u0073\u0068\u006f\u006cd\u0065\u0064\u0020\u0062\u006d2\u0020\u0069s\u0020\u006e\u0069\u006c");
|
|
|
|
};if area1 <=0||area2 <=0{return false ,_a .Error (_egac ,"c\u006f\u0072\u0072\u0065\u006c\u0061\u0074\u0069\u006fn\u0053\u0063\u006f\u0072\u0065\u0054\u0068re\u0073\u0068\u006f\u006cd\u0065\u0064\u0020\u002d\u0020\u0061\u0072\u0065\u0061s \u006d\u0075s\u0074\u0020\u0062\u0065\u0020\u003e\u0020\u0030");
|
|
|
|
};if downcount ==nil {return false ,_a .Error (_egac ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u006f\u0020\u0027\u0064\u006f\u0077\u006e\u0063\u006f\u0075\u006e\u0074\u0027");};if tab ==nil {return false ,_a .Error (_egac ,"p\u0072\u006f\u0076\u0069de\u0064 \u006e\u0069\u006c\u0020\u0027s\u0075\u006d\u0074\u0061\u0062\u0027");
|
|
|
|
};_caa ,_cgbg :=bm1 .Width ,bm1 .Height ;_ecge ,_bdcd :=bm2 .Width ,bm2 .Height ;if _ed .Abs (_caa -_ecge )> maxDiffW {return false ,nil ;};if _ed .Abs (_cgbg -_bdcd )> maxDiffH {return false ,nil ;};_dcd :=int (delX +_ed .Sign (delX )*0.5);_gegfc :=int (delY +_ed .Sign (delY )*0.5);
|
|
|
|
_gbee :=int (_ba .Ceil (_ba .Sqrt (float64 (scoreThreshold )*float64 (area1 )*float64 (area2 ))));_fgaa :=bm2 .RowStride ;_acfdb :=_ffga (_gegfc ,0);_fdea :=_bded (_bdcd +_gegfc ,_cgbg );_ccea :=bm1 .RowStride *_acfdb ;_adfe :=bm2 .RowStride *(_acfdb -_gegfc );
|
|
|
|
var _gfgfc int ;if _fdea <=_cgbg {_gfgfc =downcount [_fdea -1];};_bgfe :=_ffga (_dcd ,0);_cbad :=_bded (_ecge +_dcd ,_caa );var _cbaf ,_cabg int ;if _dcd >=8{_cbaf =_dcd >>3;_ccea +=_cbaf ;_bgfe -=_cbaf <<3;_cbad -=_cbaf <<3;_dcd &=7;}else if _dcd <=-8{_cabg =-((_dcd +7)>>3);
|
|
|
|
_adfe +=_cabg ;_fgaa -=_cabg ;_dcd +=_cabg <<3;};var (_bdg ,_gced ,_dcgc int ;_deaa ,_fcc ,_cggd byte ;);if _bgfe >=_cbad ||_acfdb >=_fdea {return false ,nil ;};_cfbd :=(_cbad +7)>>3;switch {case _dcd ==0:for _gced =_acfdb ;_gced < _fdea ;_gced ,_ccea ,_adfe =_gced +1,_ccea +bm1 .RowStride ,_adfe +bm2 .RowStride {for _dcgc =0;
|
|
|
|
_dcgc < _cfbd ;_dcgc ++{_deaa =bm1 .Data [_ccea +_dcgc ]&bm2 .Data [_adfe +_dcgc ];_bdg +=tab [_deaa ];};if _bdg >=_gbee {return true ,nil ;};if _cggg :=_bdg +downcount [_gced ]-_gfgfc ;_cggg < _gbee {return false ,nil ;};};case _dcd > 0&&_fgaa < _cfbd :for _gced =_acfdb ;
|
|
|
|
_gced < _fdea ;_gced ,_ccea ,_adfe =_gced +1,_ccea +bm1 .RowStride ,_adfe +bm2 .RowStride {_fcc =bm1 .Data [_ccea ];_cggd =bm2 .Data [_adfe ]>>uint (_dcd );_deaa =_fcc &_cggd ;_bdg +=tab [_deaa ];for _dcgc =1;_dcgc < _fgaa ;_dcgc ++{_fcc =bm1 .Data [_ccea +_dcgc ];
|
|
|
|
_cggd =bm2 .Data [_adfe +_dcgc ]>>uint (_dcd )|bm2 .Data [_adfe +_dcgc -1]<<uint (8-_dcd );_deaa =_fcc &_cggd ;_bdg +=tab [_deaa ];};_fcc =bm1 .Data [_ccea +_dcgc ];_cggd =bm2 .Data [_adfe +_dcgc -1]<<uint (8-_dcd );_deaa =_fcc &_cggd ;_bdg +=tab [_deaa ];
|
|
|
|
if _bdg >=_gbee {return true ,nil ;}else if _bdg +downcount [_gced ]-_gfgfc < _gbee {return false ,nil ;};};case _dcd > 0&&_fgaa >=_cfbd :for _gced =_acfdb ;_gced < _fdea ;_gced ,_ccea ,_adfe =_gced +1,_ccea +bm1 .RowStride ,_adfe +bm2 .RowStride {_fcc =bm1 .Data [_ccea ];
|
|
|
|
_cggd =bm2 .Data [_adfe ]>>uint (_dcd );_deaa =_fcc &_cggd ;_bdg +=tab [_deaa ];for _dcgc =1;_dcgc < _cfbd ;_dcgc ++{_fcc =bm1 .Data [_ccea +_dcgc ];_cggd =bm2 .Data [_adfe +_dcgc ]>>uint (_dcd );_cggd |=bm2 .Data [_adfe +_dcgc -1]<<uint (8-_dcd );_deaa =_fcc &_cggd ;
|
|
|
|
_bdg +=tab [_deaa ];};if _bdg >=_gbee {return true ,nil ;}else if _bdg +downcount [_gced ]-_gfgfc < _gbee {return false ,nil ;};};case _cfbd < _fgaa :for _gced =_acfdb ;_gced < _fdea ;_gced ,_ccea ,_adfe =_gced +1,_ccea +bm1 .RowStride ,_adfe +bm2 .RowStride {for _dcgc =0;
|
|
|
|
_dcgc < _cfbd ;_dcgc ++{_fcc =bm1 .Data [_ccea +_dcgc ];_cggd =bm2 .Data [_adfe +_dcgc ]<<uint (-_dcd );_cggd |=bm2 .Data [_adfe +_dcgc +1]>>uint (8+_dcd );_deaa =_fcc &_cggd ;_bdg +=tab [_deaa ];};if _bdg >=_gbee {return true ,nil ;}else if _dacc :=_bdg +downcount [_gced ]-_gfgfc ;
|
|
|
|
_dacc < _gbee {return false ,nil ;};};case _fgaa >=_cfbd :for _gced =_acfdb ;_gced < _fdea ;_gced ,_ccea ,_adfe =_gced +1,_ccea +bm1 .RowStride ,_adfe +bm2 .RowStride {for _dcgc =0;_dcgc < _cfbd ;_dcgc ++{_fcc =bm1 .Data [_ccea +_dcgc ];_cggd =bm2 .Data [_adfe +_dcgc ]<<uint (-_dcd );
|
|
|
|
_cggd |=bm2 .Data [_adfe +_dcgc +1]>>uint (8+_dcd );_deaa =_fcc &_cggd ;_bdg +=tab [_deaa ];};_fcc =bm1 .Data [_ccea +_dcgc ];_cggd =bm2 .Data [_adfe +_dcgc ]<<uint (-_dcd );_deaa =_fcc &_cggd ;_bdg +=tab [_deaa ];if _bdg >=_gbee {return true ,nil ;}else if _bdg +downcount [_gced ]-_gfgfc < _gbee {return false ,nil ;
|
|
|
|
};};};_gegae :=float32 (_bdg )*float32 (_bdg )/(float32 (area1 )*float32 (area2 ));if _gegae >=scoreThreshold {_fd .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",_bdg ,_gbee ,_gegae ,scoreThreshold );
|
|
|
|
};return false ,nil ;};func (_gbdgf *byWidth )Less (i ,j int )bool {return _gbdgf .Values [i ].Width < _gbdgf .Values [j ].Width };func (_ggaef *BitmapsArray )GetBox (i int )(*_cc .Rectangle ,error ){const _egec ="\u0042\u0069\u0074\u006dap\u0073\u0041\u0072\u0072\u0061\u0079\u002e\u0047\u0065\u0074\u0042\u006f\u0078";
|
|
|
|
if _ggaef ==nil {return nil ,_a .Error (_egec ,"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 (_ggaef .Boxes )-1{return nil ,_a .Errorf (_egec ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
|
|
};return _ggaef .Boxes [i ],nil ;};func (_fdgf *Bitmap )nextOnPixel (_ece ,_fade int )(_fea _cc .Point ,_fdgb bool ,_gfbf error ){const _ecdd ="n\u0065\u0078\u0074\u004f\u006e\u0050\u0069\u0078\u0065\u006c";_fea ,_fdgb ,_gfbf =_fdgf .nextOnPixelLow (_fdgf .Width ,_fdgf .Height ,_fdgf .RowStride ,_ece ,_fade );
|
|
|
|
if _gfbf !=nil {return _fea ,false ,_a .Wrap (_gfbf ,_ecdd ,"");};return _fea ,_fdgb ,nil ;};var _bedc =[5]int {1,2,3,0,4};type SelectionValue int ;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 (_gbcc *Bitmaps )AddBitmap (bm *Bitmap ){_gbcc .Values =append (_gbcc .Values ,bm )};
|
|
|
|
type CombinationOperator int ;func TstVSymbol (t *_ag .T ,scale ...int )*Bitmap {_cffa ,_acdb :=NewWithData (5,5,[]byte {0x88,0x88,0x88,0x50,0x20});_g .NoError (t ,_acdb );return TstGetScaledSymbol (t ,_cffa ,scale ...);};type SizeComparison int ;func Dilate (d *Bitmap ,s *Bitmap ,sel *Selection )(*Bitmap ,error ){return _egfg (d ,s ,sel )};
|
|
|
|
func (_begf *Bitmaps )SortByHeight (){_afee :=(*byHeight )(_begf );_ge .Sort (_afee )};func TstISymbol (t *_ag .T ,scale ...int )*Bitmap {_cfec ,_agbeg :=NewWithData (1,5,[]byte {0x80,0x80,0x80,0x80,0x80});_g .NoError (t ,_agbeg );return TstGetScaledSymbol (t ,_cfec ,scale ...);
|
|
|
|
};func (_dbc *Bitmap )connComponentsBB (_gcbbf int )(_egea *Boxes ,_agf error ){const _ggfbe ="\u0042\u0069\u0074ma\u0070\u002e\u0063\u006f\u006e\u006e\u0043\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074\u0073\u0042\u0042";if _gcbbf !=4&&_gcbbf !=8{return nil ,_a .Error (_ggfbe ,"\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 _dbc .Zero (){return &Boxes {},nil ;};_dbc .setPadBits (0);_cecc ,_agf :=_gddf (nil ,_dbc );if _agf !=nil {return nil ,_a .Wrap (_agf ,_ggfbe ,"\u0062\u006d\u0031");};_bfce :=&_ed .Stack {};_bfce .Aux =&_ed .Stack {};_egea =&Boxes {};var (_daac ,_fcbc int ;
|
|
|
|
_bgbe _cc .Point ;_adae bool ;_aba *_cc .Rectangle ;);for {if _bgbe ,_adae ,_agf =_cecc .nextOnPixel (_fcbc ,_daac );_agf !=nil {return nil ,_a .Wrap (_agf ,_ggfbe ,"");};if !_adae {break ;};if _aba ,_agf =_bcfb (_cecc ,_bfce ,_bgbe .X ,_bgbe .Y ,_gcbbf );
|
|
|
|
_agf !=nil {return nil ,_a .Wrap (_agf ,_ggfbe ,"");};if _agf =_egea .Add (_aba );_agf !=nil {return nil ,_a .Wrap (_agf ,_ggfbe ,"");};_fcbc =_bgbe .X ;_daac =_bgbe .Y ;};return _egea ,nil ;};func (_facc *Bitmap )AddBorderGeneral (left ,right ,top ,bot int ,val int )(*Bitmap ,error ){return _facc .addBorderGeneral (left ,right ,top ,bot ,val );
|
|
|
|
};func (_eedg *Bitmap )equivalent (_gfg *Bitmap )bool {if _eedg ==_gfg {return true ;};if !_eedg .SizesEqual (_gfg ){return false ;};_ggga :=_bdca (_eedg ,_gfg ,CmbOpXor );_ecfb :=_eedg .countPixels ();_bdacf :=int (0.25*float32 (_ecfb ));if _ggga .thresholdPixelSum (_bdacf ){return false ;
|
|
|
|
};var (_gfdd [9][9]int ;_bdeg [18][9]int ;_gbe [9][18]int ;_bgbb int ;_ggf int ;);_gaee :=9;_agde :=_eedg .Height /_gaee ;_edeg :=_eedg .Width /_gaee ;_ebac ,_ccg :=_agde /2,_edeg /2;if _agde < _edeg {_ebac =_edeg /2;_ccg =_agde /2;};_acd :=float64 (_ebac )*float64 (_ccg )*_ba .Pi ;
|
|
|
|
_faba :=int (float64 (_agde *_edeg /2)*0.9);_acfd :=int (float64 (_edeg *_agde /2)*0.9);for _dfbg :=0;_dfbg < _gaee ;_dfbg ++{_cbag :=_edeg *_dfbg +_bgbb ;var _befb int ;if _dfbg ==_gaee -1{_bgbb =0;_befb =_eedg .Width ;}else {_befb =_cbag +_edeg ;if ((_eedg .Width -_bgbb )%_gaee )> 0{_bgbb ++;
|
|
|
|
_befb ++;};};for _eea :=0;_eea < _gaee ;_eea ++{_gceb :=_agde *_eea +_ggf ;var _efca int ;if _eea ==_gaee -1{_ggf =0;_efca =_eedg .Height ;}else {_efca =_gceb +_agde ;if (_eedg .Height -_ggf )%_gaee > 0{_ggf ++;_efca ++;};};var _fbf ,_gdd ,_fbfc ,_ecb int ;
|
|
|
|
_cacb :=(_cbag +_befb )/2;_aggb :=(_gceb +_efca )/2;for _aggdd :=_cbag ;_aggdd < _befb ;_aggdd ++{for _aafe :=_gceb ;_aafe < _efca ;_aafe ++{if _ggga .GetPixel (_aggdd ,_aafe ){if _aggdd < _cacb {_fbf ++;}else {_gdd ++;};if _aafe < _aggb {_ecb ++;}else {_fbfc ++;
|
|
|
|
};};};};_gfdd [_dfbg ][_eea ]=_fbf +_gdd ;_bdeg [_dfbg *2][_eea ]=_fbf ;_bdeg [_dfbg *2+1][_eea ]=_gdd ;_gbe [_dfbg ][_eea *2]=_ecb ;_gbe [_dfbg ][_eea *2+1]=_fbfc ;};};for _eebf :=0;_eebf < _gaee *2-1;_eebf ++{for _abdb :=0;_abdb < (_gaee -1);_abdb ++{var _cgbf int ;
|
|
|
|
for _eaa :=0;_eaa < 2;_eaa ++{for _eeaa :=0;_eeaa < 2;_eeaa ++{_cgbf +=_bdeg [_eebf +_eaa ][_abdb +_eeaa ];};};if _cgbf > _acfd {return false ;};};};for _eadc :=0;_eadc < (_gaee -1);_eadc ++{for _fgb :=0;_fgb < ((_gaee *2)-1);_fgb ++{var _aggda int ;for _dcg :=0;
|
|
|
|
_dcg < 2;_dcg ++{for _gfb :=0;_gfb < 2;_gfb ++{_aggda +=_gbe [_eadc +_dcg ][_fgb +_gfb ];};};if _aggda > _faba {return false ;};};};for _bfgg :=0;_bfgg < (_gaee -2);_bfgg ++{for _bbb :=0;_bbb < (_gaee -2);_bbb ++{var _egca ,_abe int ;for _gcdf :=0;_gcdf < 3;
|
|
|
|
_gcdf ++{for _cacbd :=0;_cacbd < 3;_cacbd ++{if _gcdf ==_cacbd {_egca +=_gfdd [_bfgg +_gcdf ][_bbb +_cacbd ];};if (2-_gcdf )==_cacbd {_abe +=_gfdd [_bfgg +_gcdf ][_bbb +_cacbd ];};};};if _egca > _acfd ||_abe > _acfd {return false ;};};};for _aga :=0;_aga < (_gaee -1);
|
|
|
|
_aga ++{for _bbf :=0;_bbf < (_gaee -1);_bbf ++{var _eac int ;for _ccbg :=0;_ccbg < 2;_ccbg ++{for _ggbe :=0;_ggbe < 2;_ggbe ++{_eac +=_gfdd [_aga +_ccbg ][_bbf +_ggbe ];};};if float64 (_eac )> _acd {return false ;};};};return true ;};func (_cgga *ClassedPoints )Less (i ,j int )bool {return _cgga ._dagg (i ,j )};
|
|
|
|
func TstASymbol (t *_ag .T )*Bitmap {t .Helper ();_fdec :=New (6,6);_g .NoError (t ,_fdec .SetPixel (1,0,1));_g .NoError (t ,_fdec .SetPixel (2,0,1));_g .NoError (t ,_fdec .SetPixel (3,0,1));_g .NoError (t ,_fdec .SetPixel (4,0,1));_g .NoError (t ,_fdec .SetPixel (5,1,1));
|
|
|
|
_g .NoError (t ,_fdec .SetPixel (1,2,1));_g .NoError (t ,_fdec .SetPixel (2,2,1));_g .NoError (t ,_fdec .SetPixel (3,2,1));_g .NoError (t ,_fdec .SetPixel (4,2,1));_g .NoError (t ,_fdec .SetPixel (5,2,1));_g .NoError (t ,_fdec .SetPixel (0,3,1));_g .NoError (t ,_fdec .SetPixel (5,3,1));
|
|
|
|
_g .NoError (t ,_fdec .SetPixel (0,4,1));_g .NoError (t ,_fdec .SetPixel (5,4,1));_g .NoError (t ,_fdec .SetPixel (1,5,1));_g .NoError (t ,_fdec .SetPixel (2,5,1));_g .NoError (t ,_fdec .SetPixel (3,5,1));_g .NoError (t ,_fdec .SetPixel (4,5,1));_g .NoError (t ,_fdec .SetPixel (5,5,1));
|
|
|
|
return _fdec ;};func (_ebbb Points )YSorter ()func (_aaff ,_dace int )bool {return func (_abbdb ,_fded int )bool {return _ebbb [_abbdb ].Y < _ebbb [_fded ].Y };};func (_cdffc *Bitmaps )SelectByIndexes (idx []int )(*Bitmaps ,error ){const _ffgba ="B\u0069\u0074\u006d\u0061\u0070\u0073.\u0053\u006f\u0072\u0074\u0049\u006e\u0064\u0065\u0078e\u0073\u0042\u0079H\u0065i\u0067\u0068\u0074";
|
|
|
|
_fbaf ,_efee :=_cdffc .selectByIndexes (idx );if _efee !=nil {return nil ,_a .Wrap (_efee ,_ffgba ,"");};return _fbaf ,nil ;};func TstWordBitmapWithSpaces (t *_ag .T ,scale ...int )*Bitmap {_cbcb :=1;if len (scale )> 0{_cbcb =scale [0];};_facad :=3;_baeca :=9+7+15+2*_facad +2*_facad ;
|
|
|
|
_aegda :=5+_facad +5+2*_facad ;_beag :=New (_baeca *_cbcb ,_aegda *_cbcb );_bedcg :=&Bitmaps {};var _edag *int ;_facad *=_cbcb ;_ebbbe :=_facad ;_edag =&_ebbbe ;_eddd :=_facad ;_bbgfe :=TstDSymbol (t ,scale ...);TstAddSymbol (t ,_bedcg ,_bbgfe ,_edag ,_eddd ,1*_cbcb );
|
|
|
|
_bbgfe =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_bedcg ,_bbgfe ,_edag ,_eddd ,_facad );_bbgfe =TstISymbol (t ,scale ...);TstAddSymbol (t ,_bedcg ,_bbgfe ,_edag ,_eddd ,1*_cbcb );_bbgfe =TstTSymbol (t ,scale ...);TstAddSymbol (t ,_bedcg ,_bbgfe ,_edag ,_eddd ,_facad );
|
|
|
|
_bbgfe =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_bedcg ,_bbgfe ,_edag ,_eddd ,1*_cbcb );_bbgfe =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_bedcg ,_bbgfe ,_edag ,_eddd ,1*_cbcb );_bbgfe =TstWSymbol (t ,scale ...);TstAddSymbol (t ,_bedcg ,_bbgfe ,_edag ,_eddd ,0);
|
|
|
|
*_edag =_facad ;_eddd =5*_cbcb +_facad ;_bbgfe =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_bedcg ,_bbgfe ,_edag ,_eddd ,1*_cbcb );_bbgfe =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_bedcg ,_bbgfe ,_edag ,_eddd ,_facad );_bbgfe =TstNSymbol (t ,scale ...);
|
|
|
|
TstAddSymbol (t ,_bedcg ,_bbgfe ,_edag ,_eddd ,1*_cbcb );_bbgfe =TstESymbol (t ,scale ...);TstAddSymbol (t ,_bedcg ,_bbgfe ,_edag ,_eddd ,1*_cbcb );_bbgfe =TstVSymbol (t ,scale ...);TstAddSymbol (t ,_bedcg ,_bbgfe ,_edag ,_eddd ,1*_cbcb );_bbgfe =TstESymbol (t ,scale ...);
|
|
|
|
TstAddSymbol (t ,_bedcg ,_bbgfe ,_edag ,_eddd ,1*_cbcb );_bbgfe =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_bedcg ,_bbgfe ,_edag ,_eddd ,0);TstWriteSymbols (t ,_bedcg ,_beag );return _beag ;};func TstTSymbol (t *_ag .T ,scale ...int )*Bitmap {_bgeab ,_cdfe :=NewWithData (5,5,[]byte {0xF8,0x20,0x20,0x20,0x20});
|
|
|
|
_g .NoError (t ,_cdfe );return TstGetScaledSymbol (t ,_bgeab ,scale ...);};func TstFrameBitmap ()*Bitmap {return _egeaa .Copy ()};func TstNSymbol (t *_ag .T ,scale ...int )*Bitmap {_fbcd ,_bface :=NewWithData (4,5,[]byte {0x90,0xD0,0xB0,0x90,0x90});_g .NoError (t ,_bface );
|
|
|
|
return TstGetScaledSymbol (t ,_fbcd ,scale ...);};func _cad (_eggc *Bitmap ,_cge ...int )(_gff *Bitmap ,_bcb error ){const _eag ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0043\u0061\u0073\u0063\u0061\u0064\u0065";
|
|
|
|
if _eggc ==nil {return nil ,_a .Error (_eag ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};if len (_cge )==0||len (_cge )> 4{return nil ,_a .Error (_eag ,"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 _cge [0]<=0{_fd .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");_gff ,_bcb =_gddf (nil ,_eggc );if _bcb !=nil {return nil ,_a .Wrap (_bcb ,_eag ,"l\u0065\u0076\u0065\u006c\u0031\u0020\u003c\u003d\u0020\u0030");
|
|
|
|
};return _gff ,nil ;};_deg :=_fedg ();_gff =_eggc ;for _afa ,_gd :=range _cge {if _gd <=0{break ;};_gff ,_bcb =_bef (_gff ,_gd ,_deg );if _bcb !=nil {return nil ,_a .Wrapf (_bcb ,_eag ,"\u006c\u0065\u0076\u0065\u006c\u0025\u0064\u0020\u0072\u0065\u0064\u0075c\u0074\u0069\u006f\u006e",_afa );
|
|
|
|
};};return _gff ,nil ;};func _bgg (_eaee uint ,_edad byte )byte {return _edad >>_eaee <<_eaee };var _ffcf =[]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 (_bgc *Bitmap )ThresholdPixelSum (thresh int ,tab8 []int )(_fabb bool ,_dcae error ){const _acfe ="\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 =_fbab ();
|
|
|
|
};_bgdb :=_bgc .Width >>3;_ccda :=_bgc .Width &7;_ead :=byte (0xff<<uint (8-_ccda ));var (_fbbb ,_bfge ,_eca ,_ecgb int ;_aag byte ;);for _fbbb =0;_fbbb < _bgc .Height ;_fbbb ++{_eca =_bgc .RowStride *_fbbb ;for _bfge =0;_bfge < _bgdb ;_bfge ++{_aag ,_dcae =_bgc .GetByte (_eca +_bfge );
|
|
|
|
if _dcae !=nil {return false ,_a .Wrap (_dcae ,_acfe ,"\u0066\u0075\u006c\u006c\u0042\u0079\u0074\u0065");};_ecgb +=tab8 [_aag ];};if _ccda !=0{_aag ,_dcae =_bgc .GetByte (_eca +_bfge );if _dcae !=nil {return false ,_a .Wrap (_dcae ,_acfe ,"p\u0061\u0072\u0074\u0069\u0061\u006c\u0042\u0079\u0074\u0065");
|
|
|
|
};_aag &=_ead ;_ecgb +=tab8 [_aag ];};if _ecgb > thresh {return true ,nil ;};};return _fabb ,nil ;};func (_bcba *Bitmaps )SortByWidth (){_egfgd :=(*byWidth )(_bcba );_ge .Sort (_egfgd )};var (_dafg =[]byte {0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF};
|
|
|
|
_gdba =[]byte {0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};);func _ggfb (_gffg ,_efag *Bitmap ,_cdg ,_dgf ,_caca uint ,_aggc ,_ced int ,_fadc bool ,_bgea ,_aagf int )error {for _eabc :=_aggc ;_eabc < _ced ;_eabc ++{if _bgea +1< len (_gffg .Data ){_bcf :=_eabc +1==_ced ;
|
|
|
|
_fadf ,_eabg :=_gffg .GetByte (_bgea );if _eabg !=nil {return _eabg ;};_bgea ++;_fadf <<=_cdg ;_afaa ,_eabg :=_gffg .GetByte (_bgea );if _eabg !=nil {return _eabg ;};_afaa >>=_dgf ;_bgfc :=_fadf |_afaa ;if _bcf &&!_fadc {_bgfc =_bgg (_caca ,_bgfc );};_eabg =_efag .SetByte (_aagf ,_bgfc );
|
|
|
|
if _eabg !=nil {return _eabg ;};_aagf ++;if _bcf &&_fadc {_febc ,_eceg :=_gffg .GetByte (_bgea );if _eceg !=nil {return _eceg ;};_febc <<=_cdg ;_bgfc =_bgg (_caca ,_febc );if _eceg =_efag .SetByte (_aagf ,_bgfc );_eceg !=nil {return _eceg ;};};continue ;
|
|
|
|
};_ggbgg ,_dacb :=_gffg .GetByte (_bgea );if _dacb !=nil {_fd .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",_bgea ,_dacb );
|
|
|
|
return _dacb ;};_ggbgg <<=_cdg ;_bgea ++;_dacb =_efag .SetByte (_aagf ,_ggbgg );if _dacb !=nil {return _dacb ;};_aagf ++;};return nil ;};func (_eageg *Bitmap )centroid (_dagb ,_egcd []int )(Point ,error ){_gfbg :=Point {};_eageg .setPadBits (0);if len (_dagb )==0{_dagb =_fcca ();
|
|
|
|
};if len (_egcd )==0{_egcd =_fbab ();};var _bafd ,_ggaf ,_caac ,_baec ,_affe ,_gaef int ;var _gfcb byte ;for _affe =0;_affe < _eageg .Height ;_affe ++{_ggfa :=_eageg .RowStride *_affe ;_baec =0;for _gaef =0;_gaef < _eageg .RowStride ;_gaef ++{_gfcb =_eageg .Data [_ggfa +_gaef ];
|
|
|
|
if _gfcb !=0{_baec +=_egcd [_gfcb ];_bafd +=_dagb [_gfcb ]+_gaef *8*_egcd [_gfcb ];};};_caac +=_baec ;_ggaf +=_baec *_affe ;};if _caac !=0{_gfbg .X =float32 (_bafd )/float32 (_caac );_gfbg .Y =float32 (_ggaf )/float32 (_caac );};return _gfbg ,nil ;};func _cdbf (_cfdb ,_afff ,_cfcf byte )byte {return (_cfdb &^(_cfcf ))|(_afff &_cfcf )};
|
|
|
|
func _fffa (_ebc ,_gdbd *Bitmap ,_aaca *Selection )(*Bitmap ,error ){const _badg ="\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u004d\u006f\u0072\u0070\u0068A\u0072\u0067\u0073\u0032";var _ecba ,_feba int ;if _gdbd ==nil {return nil ,_a .Error (_badg ,"s\u006fu\u0072\u0063\u0065\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");
|
|
|
|
};if _aaca ==nil {return nil ,_a .Error (_badg ,"\u0073e\u006c \u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};_ecba =_aaca .Width ;_feba =_aaca .Height ;if _ecba ==0||_feba ==0{return nil ,_a .Error (_badg ,"\u0073\u0065\u006c\u0020\u006f\u0066\u0020\u0073\u0069\u007a\u0065\u0020\u0030");
|
|
|
|
};if _ebc ==nil {return _gdbd .createTemplate (),nil ;};if _fedfb :=_ebc .resizeImageData (_gdbd );_fedfb !=nil {return nil ,_fedfb ;};return _ebc ,nil ;};func MakePixelSumTab8 ()[]int {return _fbab ()};func NewClassedPoints (points *Points ,classes _ed .IntSlice )(*ClassedPoints ,error ){const _dgg ="\u004e\u0065w\u0043\u006c\u0061s\u0073\u0065\u0064\u0050\u006f\u0069\u006e\u0074\u0073";
|
|
|
|
if points ==nil {return nil ,_a .Error (_dgg ,"\u0070\u0072\u006f\u0076id\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0070\u006f\u0069\u006e\u0074\u0073");};if classes ==nil {return nil ,_a .Error (_dgg ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0063\u006c\u0061ss\u0065\u0073");
|
|
|
|
};_eaeff :=&ClassedPoints {Points :points ,IntSlice :classes };if _bfca :=_eaeff .validateIntSlice ();_bfca !=nil {return nil ,_a .Wrap (_bfca ,_dgg ,"");};return _eaeff ,nil ;};const (_ LocationFilter =iota ;LocSelectWidth ;LocSelectHeight ;LocSelectXVal ;
|
|
|
|
LocSelectYVal ;LocSelectIfEither ;LocSelectIfBoth ;);func TstWriteSymbols (t *_ag .T ,bms *Bitmaps ,src *Bitmap ){for _efaa :=0;_efaa < bms .Size ();_efaa ++{_ddde :=bms .Values [_efaa ];_cgca :=bms .Boxes [_efaa ];_adga :=src .RasterOperation (_cgca .Min .X ,_cgca .Min .Y ,_ddde .Width ,_ddde .Height ,PixSrc ,_ddde ,0,0);
|
|
|
|
_g .NoError (t ,_adga );};};func (_ceea *ClassedPoints )Len ()int {return _ceea .IntSlice .Size ()};func _bdca (_cec ,_deag *Bitmap ,_edaf CombinationOperator )*Bitmap {_ddgdc :=New (_cec .Width ,_cec .Height );for _geba :=0;_geba < len (_ddgdc .Data );
|
|
|
|
_geba ++{_ddgdc .Data [_geba ]=_eefa (_cec .Data [_geba ],_deag .Data [_geba ],_edaf );};return _ddgdc ;};func (_bdad *Bitmaps )selectByIndexes (_bbcec []int )(*Bitmaps ,error ){_ddge :=&Bitmaps {};for _ ,_bccd :=range _bbcec {_efcb ,_cacad :=_bdad .GetBitmap (_bccd );
|
|
|
|
if _cacad !=nil {return nil ,_a .Wrap (_cacad ,"\u0073e\u006ce\u0063\u0074\u0042\u0079\u0049\u006e\u0064\u0065\u0078\u0065\u0073","");};_ddge .AddBitmap (_efcb );};return _ddge ,nil ;};func TstCSymbol (t *_ag .T )*Bitmap {t .Helper ();_aafg :=New (6,6);
|
|
|
|
_g .NoError (t ,_aafg .SetPixel (1,0,1));_g .NoError (t ,_aafg .SetPixel (2,0,1));_g .NoError (t ,_aafg .SetPixel (3,0,1));_g .NoError (t ,_aafg .SetPixel (4,0,1));_g .NoError (t ,_aafg .SetPixel (0,1,1));_g .NoError (t ,_aafg .SetPixel (5,1,1));_g .NoError (t ,_aafg .SetPixel (0,2,1));
|
|
|
|
_g .NoError (t ,_aafg .SetPixel (0,3,1));_g .NoError (t ,_aafg .SetPixel (0,4,1));_g .NoError (t ,_aafg .SetPixel (5,4,1));_g .NoError (t ,_aafg .SetPixel (1,5,1));_g .NoError (t ,_aafg .SetPixel (2,5,1));_g .NoError (t ,_aafg .SetPixel (3,5,1));_g .NoError (t ,_aafg .SetPixel (4,5,1));
|
|
|
|
return _aafg ;};func init (){const _efbbf ="\u0062\u0069\u0074\u006dap\u0073\u002e\u0069\u006e\u0069\u0074\u0069\u0061\u006c\u0069\u007a\u0061\u0074\u0069o\u006e";_egeaa =New (50,40);var _adcc error ;_egeaa ,_adcc =_egeaa .AddBorder (2,1);if _adcc !=nil {panic (_a .Wrap (_adcc ,_efbbf ,"f\u0072\u0061\u006d\u0065\u0042\u0069\u0074\u006d\u0061\u0070"));
|
|
|
|
};_cacbf ,_adcc =NewWithData (50,22,_ffcf );if _adcc !=nil {panic (_a .Wrap (_adcc ,_efbbf ,"i\u006d\u0061\u0067\u0065\u0042\u0069\u0074\u006d\u0061\u0070"));};};const (CmbOpOr CombinationOperator =iota ;CmbOpAnd ;CmbOpXor ;CmbOpXNor ;CmbOpReplace ;CmbOpNot ;
|
|
|
|
);func (_ceaaa *ClassedPoints )GetIntYByClass (i int )(int ,error ){const _defb ="\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 >=_ceaaa .IntSlice .Size (){return 0,_a .Errorf (_defb ,"\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 (_ceaaa .YAtIndex (i )),nil ;};func (_dab *Bitmap )GetUnpaddedData ()([]byte ,error ){_cga :=uint (_dab .Width &0x07);if _cga ==0{return _dab .Data ,nil ;};_deafc :=_dab .Width *_dab .Height ;if _deafc %8!=0{_deafc >>=3;_deafc ++;}else {_deafc >>=3;
|
|
|
|
};_fag :=make ([]byte ,_deafc );_abd :=_b .NewWriterMSB (_fag );const _egf ="\u0047e\u0074U\u006e\u0070\u0061\u0064\u0064\u0065\u0064\u0044\u0061\u0074\u0061";for _cfe :=0;_cfe < _dab .Height ;_cfe ++{for _bga :=0;_bga < _dab .RowStride ;_bga ++{_beaf :=_dab .Data [_cfe *_dab .RowStride +_bga ];
|
|
|
|
if _bga !=_dab .RowStride -1{_dafe :=_abd .WriteByte (_beaf );if _dafe !=nil {return nil ,_a .Wrap (_dafe ,_egf ,"");};continue ;};for _cbeb :=uint (0);_cbeb < _cga ;_cbeb ++{_bge :=_abd .WriteBit (int (_beaf >>(7-_cbeb )&0x01));if _bge !=nil {return nil ,_a .Wrap (_bge ,_egf ,"");
|
|
|
|
};};};};return _fag ,nil ;};func _gcbc (_eafd ,_dff int )*Bitmap {return &Bitmap {Width :_eafd ,Height :_dff ,RowStride :(_eafd +7)>>3};};func _aecbf (_ecfbc ,_bafg ,_cbf *Bitmap )(*Bitmap ,error ){const _acc ="\u0062\u0069\u0074\u006d\u0061\u0070\u002e\u0078\u006f\u0072";
|
|
|
|
if _bafg ==nil {return nil ,_a .Error (_acc ,"'\u0062\u0031\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _cbf ==nil {return nil ,_a .Error (_acc ,"'\u0062\u0032\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _ecfbc ==_cbf {return nil ,_a .Error (_acc ,"'\u0064\u0027\u0020\u003d\u003d\u0020\u0027\u0062\u0032\u0027");
|
|
|
|
};if !_bafg .SizesEqual (_cbf ){_fd .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",_acc );
|
|
|
|
};var _agbb error ;if _ecfbc ,_agbb =_gddf (_ecfbc ,_bafg );_agbb !=nil {return nil ,_a .Wrap (_agbb ,_acc ,"\u0063\u0061n\u0027\u0074\u0020c\u0072\u0065\u0061\u0074\u0065\u0020\u0027\u0064\u0027");};if _agbb =_ecfbc .RasterOperation (0,0,_ecfbc .Width ,_ecfbc .Height ,PixSrcXorDst ,_cbf ,0,0);
|
|
|
|
_agbb !=nil {return nil ,_a .Wrap (_agbb ,_acc ,"");};return _ecfbc ,nil ;};func _eafb (_deef ,_cgfc *Bitmap ,_fdbf ,_dabca int )(*Bitmap ,error ){const _cdeb ="d\u0069\u006c\u0061\u0074\u0065\u0042\u0072\u0069\u0063\u006b";if _cgfc ==nil {_fd .Log .Debug ("\u0064\u0069\u006c\u0061\u0074\u0065\u0042\u0072\u0069\u0063k\u0020\u0073\u006f\u0075\u0072\u0063\u0065 \u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
|
|
return nil ,_a .Error (_cdeb ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};if _fdbf < 1||_dabca < 1{return nil ,_a .Error (_cdeb ,"\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 _fdbf ==1&&_dabca ==1{_eebd ,_cadd :=_gddf (_deef ,_cgfc );if _cadd !=nil {return nil ,_a .Wrap (_cadd ,_cdeb ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u0026\u0026 \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
|
|
};return _eebd ,nil ;};if _fdbf ==1||_dabca ==1{_fdbd :=SelCreateBrick (_dabca ,_fdbf ,_dabca /2,_fdbf /2,SelHit );_ffd ,_agaa :=_egfg (_deef ,_cgfc ,_fdbd );if _agaa !=nil {return nil ,_a .Wrap (_agaa ,_cdeb ,"\u0068s\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
|
|
};return _ffd ,nil ;};_fgfbf :=SelCreateBrick (1,_fdbf ,0,_fdbf /2,SelHit );_fbd :=SelCreateBrick (_dabca ,1,_dabca /2,0,SelHit );_ffgaa ,_acfb :=_egfg (nil ,_cgfc ,_fgfbf );if _acfb !=nil {return nil ,_a .Wrap (_acfb ,_cdeb ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
|
|
};_deef ,_acfb =_egfg (_deef ,_ffgaa ,_fbd );if _acfb !=nil {return nil ,_a .Wrap (_acfb ,_cdeb ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};return _deef ,nil ;};func TstFrameBitmapData ()[]byte {return _egeaa .Data };func (_gggdb *Bitmaps )WidthSorter ()func (_cdcaf ,_fbegc int )bool {return func (_dgdfb ,_afbcb int )bool {return _gggdb .Values [_dgdfb ].Width < _gggdb .Values [_afbcb ].Width };
|
|
|
|
};func _ef (_ad ,_bb *Bitmap )(_ac error ){const _cb ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0032";_fc :=_bb .RowStride ;_aa :=_ad .RowStride ;var (_bbd byte ;_cf uint16 ;_ea ,_eg ,_af ,_bf ,_ab int ;
|
|
|
|
);for _af =0;_af < _bb .Height ;_af ++{_ea =_af *_fc ;_eg =2*_af *_aa ;for _bf =0;_bf < _fc ;_bf ++{_bbd =_bb .Data [_ea +_bf ];_cf =_fgdf [_bbd ];_ab =_eg +_bf *2;if _ad .RowStride !=_bb .RowStride *2&&(_bf +1)*2> _ad .RowStride {_ac =_ad .SetByte (_ab ,byte (_cf >>8));
|
|
|
|
}else {_ac =_ad .setTwoBytes (_ab ,_cf );};if _ac !=nil {return _a .Wrap (_ac ,_cb ,"");};};for _bf =0;_bf < _aa ;_bf ++{_ab =_eg +_aa +_bf ;_bbd =_ad .Data [_eg +_bf ];if _ac =_ad .SetByte (_ab ,_bbd );_ac !=nil {return _a .Wrapf (_ac ,_cb ,"c\u006f\u0070\u0079\u0020\u0064\u006fu\u0062\u006c\u0065\u0064\u0020\u006ci\u006e\u0065\u003a\u0020\u0027\u0025\u0064'\u002c\u0020\u0042\u0079\u0074\u0065\u003a\u0020\u0027\u0025d\u0027",_eg +_bf ,_eg +_aa +_bf );
|
|
|
|
};};};return nil ;};func _accg (_afbg *Bitmap ,_deabc ...MorphProcess )(_fagd *Bitmap ,_adfea error ){const _fcd ="\u006d\u006f\u0072\u0070\u0068\u0053\u0065\u0071\u0075\u0065\u006e\u0063\u0065";if _afbg ==nil {return nil ,_a .Error (_fcd ,"\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 (_deabc )==0{return nil ,_a .Error (_fcd ,"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 _adfea =_eaaf (_deabc ...);
|
|
|
|
_adfea !=nil {return nil ,_a .Wrap (_adfea ,_fcd ,"");};var _ccgag ,_bcbf ,_cgce int ;_fagd =_afbg .Copy ();for _ ,_caggae :=range _deabc {switch _caggae .Operation {case MopDilation :_ccgag ,_bcbf =_caggae .getWidthHeight ();_fagd ,_adfea =DilateBrick (nil ,_fagd ,_ccgag ,_bcbf );
|
|
|
|
if _adfea !=nil {return nil ,_a .Wrap (_adfea ,_fcd ,"");};case MopErosion :_ccgag ,_bcbf =_caggae .getWidthHeight ();_fagd ,_adfea =_gegaeb (nil ,_fagd ,_ccgag ,_bcbf );if _adfea !=nil {return nil ,_a .Wrap (_adfea ,_fcd ,"");};case MopOpening :_ccgag ,_bcbf =_caggae .getWidthHeight ();
|
|
|
|
_fagd ,_adfea =_dbff (nil ,_fagd ,_ccgag ,_bcbf );if _adfea !=nil {return nil ,_a .Wrap (_adfea ,_fcd ,"");};case MopClosing :_ccgag ,_bcbf =_caggae .getWidthHeight ();_fagd ,_adfea =_cbcd (nil ,_fagd ,_ccgag ,_bcbf );if _adfea !=nil {return nil ,_a .Wrap (_adfea ,_fcd ,"");
|
|
|
|
};case MopRankBinaryReduction :_fagd ,_adfea =_cad (_fagd ,_caggae .Arguments ...);if _adfea !=nil {return nil ,_a .Wrap (_adfea ,_fcd ,"");};case MopReplicativeBinaryExpansion :_fagd ,_adfea =_bgdg (_fagd ,_caggae .Arguments [0]);if _adfea !=nil {return nil ,_a .Wrap (_adfea ,_fcd ,"");
|
|
|
|
};case MopAddBorder :_cgce =_caggae .Arguments [0];_fagd ,_adfea =_fagd .AddBorder (_cgce ,0);if _adfea !=nil {return nil ,_a .Wrap (_adfea ,_fcd ,"");};default:return nil ,_a .Error (_fcd ,"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 _cgce > 0{_fagd ,_adfea =_fagd .RemoveBorder (_cgce );if _adfea !=nil {return nil ,_a .Wrap (_adfea ,_fcd ,"\u0062\u006f\u0072\u0064\u0065\u0072\u0020\u003e\u0020\u0030");};};return _fagd ,nil ;};func (_eabff *Bitmaps )selectByIndicator (_dcgd *_ed .NumSlice )(_cgda *Bitmaps ,_cagad error ){const _beefe ="\u0042i\u0074\u006d\u0061\u0070s\u002e\u0073\u0065\u006c\u0065c\u0074B\u0079I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";
|
|
|
|
if _eabff ==nil {return nil ,_a .Error (_beefe ,"\u0027\u0062\u0027 b\u0069\u0074\u006d\u0061\u0070\u0073\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};if _dcgd ==nil {return nil ,_a .Error (_beefe ,"'\u006e\u0061\u0027\u0020\u0069\u006ed\u0069\u0063\u0061\u0074\u006f\u0072\u0073\u0020\u006eo\u0074\u0020\u0064e\u0066i\u006e\u0065\u0064");
|
|
|
|
};if len (_eabff .Values )==0{return _eabff ,nil ;};if len (*_dcgd )!=len (_eabff .Values ){return nil ,_a .Errorf (_beefe ,"\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 (*_dcgd ),len (_eabff .Values ));
|
|
|
|
};var _dbfg ,_gfae ,_ggfgg int ;for _gfae =0;_gfae < len (*_dcgd );_gfae ++{if _dbfg ,_cagad =_dcgd .GetInt (_gfae );_cagad !=nil {return nil ,_a .Wrap (_cagad ,_beefe ,"f\u0069\u0072\u0073\u0074\u0020\u0063\u0068\u0065\u0063\u006b");};if _dbfg ==1{_ggfgg ++;
|
|
|
|
};};if _ggfgg ==len (_eabff .Values ){return _eabff ,nil ;};_cgda =&Bitmaps {};_ecfaf :=len (_eabff .Values )==len (_eabff .Boxes );for _gfae =0;_gfae < len (*_dcgd );_gfae ++{if _dbfg =int ((*_dcgd )[_gfae ]);_dbfg ==0{continue ;};_cgda .Values =append (_cgda .Values ,_eabff .Values [_gfae ]);
|
|
|
|
if _ecfaf {_cgda .Boxes =append (_cgda .Boxes ,_eabff .Boxes [_gfae ]);};};return _cgda ,nil ;};func _cbcd (_bbae ,_bbee *Bitmap ,_ddgdf ,_bab int )(*Bitmap ,error ){const _eccg ="\u0063\u006c\u006f\u0073\u0065\u0053\u0061\u0066\u0065B\u0072\u0069\u0063\u006b";
|
|
|
|
if _bbee ==nil {return nil ,_a .Error (_eccg ,"\u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _ddgdf < 1||_bab < 1{return nil ,_a .Error (_eccg ,"\u0068s\u0069\u007a\u0065\u0020\u0061\u006e\u0064\u0020\u0076\u0073\u0069z\u0065\u0020\u006e\u006f\u0074\u0020\u003e\u003d\u0020\u0031");
|
|
|
|
};if _ddgdf ==1&&_bab ==1{return _gddf (_bbae ,_bbee );};if MorphBC ==SymmetricMorphBC {_cdce ,_aegd :=_efce (_bbae ,_bbee ,_ddgdf ,_bab );if _aegd !=nil {return nil ,_a .Wrap (_aegd ,_eccg ,"\u0053\u0079m\u006d\u0065\u0074r\u0069\u0063\u004d\u006f\u0072\u0070\u0068\u0042\u0043");
|
|
|
|
};return _cdce ,nil ;};_eeba :=_ffga (_ddgdf /2,_bab /2);_gfee :=8*((_eeba +7)/8);_dfba ,_ecgde :=_bbee .AddBorder (_gfee ,0);if _ecgde !=nil {return nil ,_a .Wrapf (_ecgde ,_eccg ,"\u0042\u006f\u0072\u0064\u0065\u0072\u0053\u0069\u007ae\u003a\u0020\u0025\u0064",_gfee );
|
|
|
|
};var _bfcb ,_eacd *Bitmap ;if _ddgdf ==1||_bab ==1{_dbfa :=SelCreateBrick (_bab ,_ddgdf ,_bab /2,_ddgdf /2,SelHit );_bfcb ,_ecgde =_ggce (nil ,_dfba ,_dbfa );if _ecgde !=nil {return nil ,_a .Wrap (_ecgde ,_eccg ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
|
|
};}else {_bbbe :=SelCreateBrick (1,_ddgdf ,0,_ddgdf /2,SelHit );_cgeg ,_eebae :=_egfg (nil ,_dfba ,_bbbe );if _eebae !=nil {return nil ,_a .Wrap (_eebae ,_eccg ,"\u0072\u0065\u0067\u0075la\u0072\u0020\u002d\u0020\u0066\u0069\u0072\u0073\u0074\u0020\u0064\u0069\u006c\u0061t\u0065");
|
|
|
|
};_eagcf :=SelCreateBrick (_bab ,1,_bab /2,0,SelHit );_bfcb ,_eebae =_egfg (nil ,_cgeg ,_eagcf );if _eebae !=nil {return nil ,_a .Wrap (_eebae ,_eccg ,"\u0072\u0065\u0067ul\u0061\u0072\u0020\u002d\u0020\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
|
|
};if _ ,_eebae =_gbfg (_cgeg ,_bfcb ,_bbbe );_eebae !=nil {return nil ,_a .Wrap (_eebae ,_eccg ,"r\u0065\u0067\u0075\u006car\u0020-\u0020\u0066\u0069\u0072\u0073t\u0020\u0065\u0072\u006f\u0064\u0065");};if _ ,_eebae =_gbfg (_bfcb ,_cgeg ,_eagcf );_eebae !=nil {return nil ,_a .Wrap (_eebae ,_eccg ,"\u0072\u0065\u0067\u0075la\u0072\u0020\u002d\u0020\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0065\u0072\u006fd\u0065");
|
|
|
|
};};if _eacd ,_ecgde =_bfcb .RemoveBorder (_gfee );_ecgde !=nil {return nil ,_a .Wrap (_ecgde ,_eccg ,"\u0072e\u0067\u0075\u006c\u0061\u0072");};if _bbae ==nil {return _eacd ,nil ;};if _ ,_ecgde =_gddf (_bbae ,_eacd );_ecgde !=nil {return nil ,_ecgde ;
|
|
|
|
};return _bbae ,nil ;};func (_aad *Bitmap )RemoveBorderGeneral (left ,right ,top ,bot int )(*Bitmap ,error ){return _aad .removeBorderGeneral (left ,right ,top ,bot );};func (_gdda *ClassedPoints )validateIntSlice ()error {const _dfbgg ="\u0076\u0061l\u0069\u0064\u0061t\u0065\u0049\u006e\u0074\u0053\u006c\u0069\u0063\u0065";
|
|
|
|
for _ ,_abfg :=range _gdda .IntSlice {if _abfg >=(_gdda .Points .Size ()){return _a .Errorf (_dfbgg ,"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",_abfg ,_gdda .Points .Size ());
|
|
|
|
};};return nil ;};func _cbdfe (_gdea *Bitmap ,_fegce *Bitmap ,_efeff *Selection ,_afcgc **Bitmap )(*Bitmap ,error ){const _eedc ="\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u004d\u006f\u0072\u0070\u0068A\u0072\u0067\u0073\u0031";if _fegce ==nil {return nil ,_a .Error (_eedc ,"\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 _efeff ==nil {return nil ,_a .Error (_eedc ,"\u004d\u006f\u0072\u0068p\u0041\u0072\u0067\u0073\u0031\u0020\u0027\u0073\u0065\u006c'\u0020n\u006f\u0074\u0020\u0064\u0065\u0066\u0069n\u0065\u0064");};_aace ,_bddg :=_efeff .Height ,_efeff .Width ;if _aace ==0||_bddg ==0{return nil ,_a .Error (_eedc ,"\u0073\u0065\u006c\u0065ct\u0069\u006f\u006e\u0020\u006f\u0066\u0020\u0073\u0069\u007a\u0065\u0020\u0030");
|
|
|
|
};if _gdea ==nil {_gdea =_fegce .createTemplate ();*_afcgc =_fegce ;return _gdea ,nil ;};_gdea .Width =_fegce .Width ;_gdea .Height =_fegce .Height ;_gdea .RowStride =_fegce .RowStride ;_gdea .Color =_fegce .Color ;_gdea .Data =make ([]byte ,_fegce .RowStride *_fegce .Height );
|
|
|
|
if _gdea ==_fegce {*_afcgc =_fegce .Copy ();}else {*_afcgc =_fegce ;};return _gdea ,nil ;};func _fcca ()[]int {_gcfgf :=make ([]int ,256);_gcfgf [0]=0;_gcfgf [1]=7;var _dcbd int ;for _dcbd =2;_dcbd < 4;_dcbd ++{_gcfgf [_dcbd ]=_gcfgf [_dcbd -2]+6;};for _dcbd =4;
|
|
|
|
_dcbd < 8;_dcbd ++{_gcfgf [_dcbd ]=_gcfgf [_dcbd -4]+5;};for _dcbd =8;_dcbd < 16;_dcbd ++{_gcfgf [_dcbd ]=_gcfgf [_dcbd -8]+4;};for _dcbd =16;_dcbd < 32;_dcbd ++{_gcfgf [_dcbd ]=_gcfgf [_dcbd -16]+3;};for _dcbd =32;_dcbd < 64;_dcbd ++{_gcfgf [_dcbd ]=_gcfgf [_dcbd -32]+2;
|
|
|
|
};for _dcbd =64;_dcbd < 128;_dcbd ++{_gcfgf [_dcbd ]=_gcfgf [_dcbd -64]+1;};for _dcbd =128;_dcbd < 256;_dcbd ++{_gcfgf [_dcbd ]=_gcfgf [_dcbd -128];};return _gcfgf ;};func _gec (_adc *Bitmap ,_defd int )(*Bitmap ,error ){const _acf ="\u0065x\u0070a\u006e\u0064\u0042\u0069\u006ea\u0072\u0079P\u006f\u0077\u0065\u0072\u0032";
|
|
|
|
if _adc ==nil {return nil ,_a .Error (_acf ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _defd ==1{return _gddf (nil ,_adc );};if _defd !=2&&_defd !=4&&_defd !=8{return nil ,_a .Error (_acf ,"\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");
|
|
|
|
};_dd :=_defd *_adc .Width ;_ca :=_defd *_adc .Height ;_cgc :=New (_dd ,_ca );var _fb error ;switch _defd {case 2:_fb =_ef (_cgc ,_adc );case 4:_fb =_adg (_cgc ,_adc );case 8:_fb =_ga (_cgc ,_adc );};if _fb !=nil {return nil ,_a .Wrap (_fb ,_acf ,"");};
|
|
|
|
return _cgc ,nil ;};func (_fbabad *Bitmaps )CountPixels ()*_ed .NumSlice {_aeaa :=&_ed .NumSlice {};for _ ,_egcg :=range _fbabad .Values {_aeaa .AddInt (_egcg .CountPixels ());};return _aeaa ;};func _fedg ()(_dedd []byte ){_dedd =make ([]byte ,256);for _ecd :=0;
|
|
|
|
_ecd < 256;_ecd ++{_eef :=byte (_ecd );_dedd [_eef ]=(_eef &0x01)|((_eef &0x04)>>1)|((_eef &0x10)>>2)|((_eef &0x40)>>3)|((_eef &0x02)<<3)|((_eef &0x08)<<2)|((_eef &0x20)<<1)|(_eef &0x80);};return _dedd ;};func TstESymbol (t *_ag .T ,scale ...int )*Bitmap {_acdf ,_abegb :=NewWithData (4,5,[]byte {0xF0,0x80,0xE0,0x80,0xF0});
|
|
|
|
_g .NoError (t ,_abegb );return TstGetScaledSymbol (t ,_acdf ,scale ...);};type Component int ;func (_eddg *Bitmap )addPadBits ()(_ceef error ){const _dfdf ="\u0062\u0069\u0074\u006d\u0061\u0070\u002e\u0061\u0064\u0064\u0050\u0061d\u0042\u0069\u0074\u0073";
|
|
|
|
_bca :=_eddg .Width %8;if _bca ==0{return nil ;};_ebe :=_eddg .Width /8;_aedc :=_b .NewReader (_eddg .Data );_eba :=make ([]byte ,_eddg .Height *_eddg .RowStride );_gfef :=_b .NewWriterMSB (_eba );_bdac :=make ([]byte ,_ebe );var (_cgfa int ;_cdb uint64 ;
|
|
|
|
);for _cgfa =0;_cgfa < _eddg .Height ;_cgfa ++{if _ ,_ceef =_aedc .Read (_bdac );_ceef !=nil {return _a .Wrap (_ceef ,_dfdf ,"\u0066u\u006c\u006c\u0020\u0062\u0079\u0074e");};if _ ,_ceef =_gfef .Write (_bdac );_ceef !=nil {return _a .Wrap (_ceef ,_dfdf ,"\u0066\u0075\u006c\u006c\u0020\u0062\u0079\u0074\u0065\u0073");
|
|
|
|
};if _cdb ,_ceef =_aedc .ReadBits (byte (_bca ));_ceef !=nil {return _a .Wrap (_ceef ,_dfdf ,"\u0073\u006b\u0069\u0070\u0070\u0069\u006e\u0067\u0020\u0062\u0069\u0074\u0073");};if _ceef =_gfef .WriteByte (byte (_cdb )<<uint (8-_bca ));_ceef !=nil {return _a .Wrap (_ceef ,_dfdf ,"\u006ca\u0073\u0074\u0020\u0062\u0079\u0074e");
|
|
|
|
};};_eddg .Data =_gfef .Data ();return nil ;};
|