mirror of
https://github.com/unidoc/unipdf.git
synced 2025-05-01 22:17:29 +08:00
660 lines
196 KiB
Go
660 lines
196 KiB
Go
//
|
|
// Copyright 2020 FoxyUtils ehf. All rights reserved.
|
|
//
|
|
// This is a commercial product and requires a license to operate.
|
|
// A trial license can be obtained at https://unidoc.io
|
|
//
|
|
// DO NOT EDIT: generated by unitwist Go source code obfuscator.
|
|
//
|
|
// Use of this source code is governed by the UniDoc End User License Agreement
|
|
// terms that can be accessed at https://unidoc.io/eula/
|
|
|
|
package bitmap ;import (_egc "encoding/binary";_b "github.com/stretchr/testify/require";_ea "github.com/unidoc/unipdf/v3/common";_de "github.com/unidoc/unipdf/v3/internal/bitwise";_dff "github.com/unidoc/unipdf/v3/internal/imageutil";_df "github.com/unidoc/unipdf/v3/internal/jbig2/basic";
|
|
_e "github.com/unidoc/unipdf/v3/internal/jbig2/errors";_eb "image";_eg "math";_f "sort";_d "strings";_ca "testing";);func _dbcc (_gfea *Bitmap ,_caed int )(*Bitmap ,error ){const _fbed ="\u0065x\u0070a\u006e\u0064\u0052\u0065\u0070\u006c\u0069\u0063\u0061\u0074\u0065";
|
|
if _gfea ==nil {return nil ,_e .Error (_fbed ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _caed <=0{return nil ,_e .Error (_fbed ,"i\u006e\u0076\u0061\u006cid\u0020f\u0061\u0063\u0074\u006f\u0072 \u002d\u0020\u003c\u003d\u0020\u0030");
|
|
};if _caed ==1{_bceb ,_caddg :=_fgca (nil ,_gfea );if _caddg !=nil {return nil ,_e .Wrap (_caddg ,_fbed ,"\u0066\u0061\u0063\u0074\u006f\u0072\u0020\u003d\u0020\u0031");};return _bceb ,nil ;};_dfdgb ,_agbae :=_fdd (_gfea ,_caed ,_caed );if _agbae !=nil {return nil ,_e .Wrap (_agbae ,_fbed ,"");
|
|
};return _dfdgb ,nil ;};func _adcgd (_dbac ,_ecc *Bitmap ,_cgde *Selection )(*Bitmap ,error ){const _bgge ="\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u004d\u006f\u0072\u0070\u0068A\u0072\u0067\u0073\u0032";var _fabc ,_fdfc int ;if _ecc ==nil {return nil ,_e .Error (_bgge ,"s\u006fu\u0072\u0063\u0065\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");
|
|
};if _cgde ==nil {return nil ,_e .Error (_bgge ,"\u0073e\u006c \u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};_fabc =_cgde .Width ;_fdfc =_cgde .Height ;if _fabc ==0||_fdfc ==0{return nil ,_e .Error (_bgge ,"\u0073\u0065\u006c\u0020\u006f\u0066\u0020\u0073\u0069\u007a\u0065\u0020\u0030");
|
|
};if _dbac ==nil {return _ecc .createTemplate (),nil ;};if _eafb :=_dbac .resizeImageData (_ecc );_eafb !=nil {return nil ,_eafb ;};return _dbac ,nil ;};func TstFrameBitmapData ()[]byte {return _bbea .Data };func _egga (_dcfad ,_cbbd *Bitmap ,_fbbe ,_acba int )(*Bitmap ,error ){const _ffggg ="\u0063\u006c\u006f\u0073\u0065\u0042\u0072\u0069\u0063\u006b";
|
|
if _cbbd ==nil {return nil ,_e .Error (_ffggg ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _fbbe < 1||_acba < 1{return nil ,_e .Error (_ffggg ,"\u0068S\u0069\u007a\u0065\u0020\u0061\u006e\u0064\u0020\u0076\u0053\u0069z\u0065\u0020\u006e\u006f\u0074\u0020\u003e\u003d\u0020\u0031");
|
|
};if _fbbe ==1&&_acba ==1{return _cbbd .Copy (),nil ;};if _fbbe ==1||_acba ==1{_cbab :=SelCreateBrick (_acba ,_fbbe ,_acba /2,_fbbe /2,SelHit );var _ageg error ;_dcfad ,_ageg =_agecg (_dcfad ,_cbbd ,_cbab );if _ageg !=nil {return nil ,_e .Wrap (_ageg ,_ffggg ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _dcfad ,nil ;};_bbgbc :=SelCreateBrick (1,_fbbe ,0,_fbbe /2,SelHit );_facg :=SelCreateBrick (_acba ,1,_acba /2,0,SelHit );_gcfd ,_gdag :=_ebgfa (nil ,_cbbd ,_bbgbc );if _gdag !=nil {return nil ,_e .Wrap (_gdag ,_ffggg ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
};if _dcfad ,_gdag =_ebgfa (_dcfad ,_gcfd ,_facg );_gdag !=nil {return nil ,_e .Wrap (_gdag ,_ffggg ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};if _ ,_gdag =_ebgfb (_gcfd ,_dcfad ,_bbgbc );_gdag !=nil {return nil ,_e .Wrap (_gdag ,_ffggg ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");
|
|
};if _ ,_gdag =_ebgfb (_dcfad ,_gcfd ,_facg );_gdag !=nil {return nil ,_e .Wrap (_gdag ,_ffggg ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};return _dcfad ,nil ;};func (_cbaea *ClassedPoints )ySortFunction ()func (_adbfb int ,_dagc int )bool {return func (_bgfe ,_dbcff int )bool {return _cbaea .YAtIndex (_bgfe )< _cbaea .YAtIndex (_dbcff )};
|
|
};type shift int ;var MorphBC BoundaryCondition ;func _fcd (_ddfe ,_cff *Bitmap ,_cef int ,_fbfd []byte ,_afec int )(_gdgg error ){const _efgg ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0033";
|
|
var (_fdb ,_agd ,_cdea ,_daec ,_gcf ,_egg ,_daa ,_cae int ;_ega ,_bdgg ,_dfa ,_gfd uint32 ;_cdg ,_eeg byte ;_egb uint16 ;);_dda :=make ([]byte ,4);_gggd :=make ([]byte ,4);for _cdea =0;_cdea < _ddfe .Height -1;_cdea ,_daec =_cdea +2,_daec +1{_fdb =_cdea *_ddfe .RowStride ;
|
|
_agd =_daec *_cff .RowStride ;for _gcf ,_egg =0,0;_gcf < _afec ;_gcf ,_egg =_gcf +4,_egg +1{for _daa =0;_daa < 4;_daa ++{_cae =_fdb +_gcf +_daa ;if _cae <=len (_ddfe .Data )-1&&_cae < _fdb +_ddfe .RowStride {_dda [_daa ]=_ddfe .Data [_cae ];}else {_dda [_daa ]=0x00;
|
|
};_cae =_fdb +_ddfe .RowStride +_gcf +_daa ;if _cae <=len (_ddfe .Data )-1&&_cae < _fdb +(2*_ddfe .RowStride ){_gggd [_daa ]=_ddfe .Data [_cae ];}else {_gggd [_daa ]=0x00;};};_ega =_egc .BigEndian .Uint32 (_dda );_bdgg =_egc .BigEndian .Uint32 (_gggd );
|
|
_dfa =_ega &_bdgg ;_dfa |=_dfa <<1;_gfd =_ega |_bdgg ;_gfd &=_gfd <<1;_bdgg =_dfa &_gfd ;_bdgg &=0xaaaaaaaa;_ega =_bdgg |(_bdgg <<7);_cdg =byte (_ega >>24);_eeg =byte ((_ega >>8)&0xff);_cae =_agd +_egg ;if _cae +1==len (_cff .Data )-1||_cae +1>=_agd +_cff .RowStride {if _gdgg =_cff .SetByte (_cae ,_fbfd [_cdg ]);
|
|
_gdgg !=nil {return _e .Wrapf (_gdgg ,_efgg ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_cae );};}else {_egb =(uint16 (_fbfd [_cdg ])<<8)|uint16 (_fbfd [_eeg ]);if _gdgg =_cff .setTwoBytes (_cae ,_egb );_gdgg !=nil {return _e .Wrapf (_gdgg ,_efgg ,"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",_cae );
|
|
};_egg ++;};};};return nil ;};func (_bedf *ClassedPoints )SortByY (){_bedf ._dcgeg =_bedf .ySortFunction ();_f .Sort (_bedf )};func _ff (_bgb ,_fca *Bitmap ,_fge int ,_bdb []byte ,_dcg int )(_ggb error ){const _adf ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0031";
|
|
var (_bcb ,_bbg ,_ddfb ,_gdg ,_ffd ,_fga ,_aff ,_gad int ;_aca ,_gag uint32 ;_cfb ,_ccf byte ;_abc uint16 ;);_ded :=make ([]byte ,4);_afe :=make ([]byte ,4);for _ddfb =0;_ddfb < _bgb .Height -1;_ddfb ,_gdg =_ddfb +2,_gdg +1{_bcb =_ddfb *_bgb .RowStride ;
|
|
_bbg =_gdg *_fca .RowStride ;for _ffd ,_fga =0,0;_ffd < _dcg ;_ffd ,_fga =_ffd +4,_fga +1{for _aff =0;_aff < 4;_aff ++{_gad =_bcb +_ffd +_aff ;if _gad <=len (_bgb .Data )-1&&_gad < _bcb +_bgb .RowStride {_ded [_aff ]=_bgb .Data [_gad ];}else {_ded [_aff ]=0x00;
|
|
};_gad =_bcb +_bgb .RowStride +_ffd +_aff ;if _gad <=len (_bgb .Data )-1&&_gad < _bcb +(2*_bgb .RowStride ){_afe [_aff ]=_bgb .Data [_gad ];}else {_afe [_aff ]=0x00;};};_aca =_egc .BigEndian .Uint32 (_ded );_gag =_egc .BigEndian .Uint32 (_afe );_gag |=_aca ;
|
|
_gag |=_gag <<1;_gag &=0xaaaaaaaa;_aca =_gag |(_gag <<7);_cfb =byte (_aca >>24);_ccf =byte ((_aca >>8)&0xff);_gad =_bbg +_fga ;if _gad +1==len (_fca .Data )-1||_gad +1>=_bbg +_fca .RowStride {_fca .Data [_gad ]=_bdb [_cfb ];}else {_abc =(uint16 (_bdb [_cfb ])<<8)|uint16 (_bdb [_ccf ]);
|
|
if _ggb =_fca .setTwoBytes (_gad ,_abc );_ggb !=nil {return _e .Wrapf (_ggb ,_adf ,"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",_gad );
|
|
};_fga ++;};};};return nil ;};func Centroids (bms []*Bitmap )(*Points ,error ){_fbea :=make ([]Point ,len (bms ));_ebgf :=_efag ();_cccb :=_aede ();var _dbeb error ;for _eggec ,_accf :=range bms {_fbea [_eggec ],_dbeb =_accf .centroid (_ebgf ,_cccb );if _dbeb !=nil {return nil ,_dbeb ;
|
|
};};_ecff :=Points (_fbea );return &_ecff ,nil ;};func (_bedd *Bitmap )clearAll ()error {return _bedd .RasterOperation (0,0,_bedd .Width ,_bedd .Height ,PixClr ,nil ,0,0);};func _bdfd (_acd *Bitmap ,_ebaeg *_df .Stack ,_dcdd ,_cccf int )(_egca *_eb .Rectangle ,_ffcf error ){const _cdca ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";
|
|
if _acd ==nil {return nil ,_e .Error (_cdca ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");};if _ebaeg ==nil {return nil ,_e .Error (_cdca ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");
|
|
};_abcd ,_fafaa :=_acd .Width ,_acd .Height ;_eacfb :=_abcd -1;_effg :=_fafaa -1;if _dcdd < 0||_dcdd > _eacfb ||_cccf < 0||_cccf > _effg ||!_acd .GetPixel (_dcdd ,_cccf ){return nil ,nil ;};var _bedc *_eb .Rectangle ;_bedc ,_ffcf =Rect (100000,100000,0,0);
|
|
if _ffcf !=nil {return nil ,_e .Wrap (_ffcf ,_cdca ,"");};if _ffcf =_bdbg (_ebaeg ,_dcdd ,_dcdd ,_cccf ,1,_effg ,_bedc );_ffcf !=nil {return nil ,_e .Wrap (_ffcf ,_cdca ,"\u0069\u006e\u0069t\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _ffcf =_bdbg (_ebaeg ,_dcdd ,_dcdd ,_cccf +1,-1,_effg ,_bedc );
|
|
_ffcf !=nil {return nil ,_e .Wrap (_ffcf ,_cdca ,"\u0032\u006ed\u0020\u0069\u006ei\u0074\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};_bedc .Min .X ,_bedc .Max .X =_dcdd ,_dcdd ;_bedc .Min .Y ,_bedc .Max .Y =_cccf ,_cccf ;var (_cdbad *fillSegment ;
|
|
_eebc int ;);for _ebaeg .Len ()> 0{if _cdbad ,_ffcf =_gceb (_ebaeg );_ffcf !=nil {return nil ,_e .Wrap (_ffcf ,_cdca ,"");};_cccf =_cdbad ._cbaab ;for _dcdd =_cdbad ._dabcf ;_dcdd >=0&&_acd .GetPixel (_dcdd ,_cccf );_dcdd --{if _ffcf =_acd .SetPixel (_dcdd ,_cccf ,0);
|
|
_ffcf !=nil {return nil ,_e .Wrap (_ffcf ,_cdca ,"");};};if _dcdd >=_cdbad ._dabcf {for _dcdd ++;_dcdd <=_cdbad ._baebc &&_dcdd <=_eacfb &&!_acd .GetPixel (_dcdd ,_cccf );_dcdd ++{};_eebc =_dcdd ;if !(_dcdd <=_cdbad ._baebc &&_dcdd <=_eacfb ){continue ;
|
|
};}else {_eebc =_dcdd +1;if _eebc < _cdbad ._dabcf -1{if _ffcf =_bdbg (_ebaeg ,_eebc ,_cdbad ._dabcf -1,_cdbad ._cbaab ,-_cdbad ._gaba ,_effg ,_bedc );_ffcf !=nil {return nil ,_e .Wrap (_ffcf ,_cdca ,"\u006c\u0065\u0061\u006b\u0020\u006f\u006e\u0020\u006c\u0065\u0066\u0074 \u0073\u0069\u0064\u0065");
|
|
};};_dcdd =_cdbad ._dabcf +1;};for {for ;_dcdd <=_eacfb &&_acd .GetPixel (_dcdd ,_cccf );_dcdd ++{if _ffcf =_acd .SetPixel (_dcdd ,_cccf ,0);_ffcf !=nil {return nil ,_e .Wrap (_ffcf ,_cdca ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _ffcf =_bdbg (_ebaeg ,_eebc ,_dcdd -1,_cdbad ._cbaab ,_cdbad ._gaba ,_effg ,_bedc );
|
|
_ffcf !=nil {return nil ,_e .Wrap (_ffcf ,_cdca ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _dcdd > _cdbad ._baebc +1{if _ffcf =_bdbg (_ebaeg ,_cdbad ._baebc +1,_dcdd -1,_cdbad ._cbaab ,-_cdbad ._gaba ,_effg ,_bedc );_ffcf !=nil {return nil ,_e .Wrap (_ffcf ,_cdca ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");
|
|
};};for _dcdd ++;_dcdd <=_cdbad ._baebc &&_dcdd <=_eacfb &&!_acd .GetPixel (_dcdd ,_cccf );_dcdd ++{};_eebc =_dcdd ;if !(_dcdd <=_cdbad ._baebc &&_dcdd <=_eacfb ){break ;};};};_bedc .Max .X ++;_bedc .Max .Y ++;return _bedc ,nil ;};func TstTSymbol (t *_ca .T ,scale ...int )*Bitmap {_bfce ,_bgccab :=NewWithData (5,5,[]byte {0xF8,0x20,0x20,0x20,0x20});
|
|
_b .NoError (t ,_bgccab );return TstGetScaledSymbol (t ,_bfce ,scale ...);};func _eba ()(_cde [256]uint32 ){for _feg :=0;_feg < 256;_feg ++{if _feg &0x01!=0{_cde [_feg ]|=0xf;};if _feg &0x02!=0{_cde [_feg ]|=0xf0;};if _feg &0x04!=0{_cde [_feg ]|=0xf00;
|
|
};if _feg &0x08!=0{_cde [_feg ]|=0xf000;};if _feg &0x10!=0{_cde [_feg ]|=0xf0000;};if _feg &0x20!=0{_cde [_feg ]|=0xf00000;};if _feg &0x40!=0{_cde [_feg ]|=0xf000000;};if _feg &0x80!=0{_cde [_feg ]|=0xf0000000;};};return _cde ;};func (_aaeb *Boxes )Get (i int )(*_eb .Rectangle ,error ){const _ddd ="\u0042o\u0078\u0065\u0073\u002e\u0047\u0065t";
|
|
if _aaeb ==nil {return nil ,_e .Error (_ddd ,"\u0027\u0042\u006f\u0078es\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};if i > len (*_aaeb )-1{return nil ,_e .Errorf (_ddd ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
};return (*_aaeb )[i ],nil ;};func (_dbg *Bitmap )InverseData (){_dbg .inverseData ()};func init (){for _fabd :=0;_fabd < 256;_fabd ++{_agf [_fabd ]=uint8 (_fabd &0x1)+(uint8 (_fabd >>1)&0x1)+(uint8 (_fabd >>2)&0x1)+(uint8 (_fabd >>3)&0x1)+(uint8 (_fabd >>4)&0x1)+(uint8 (_fabd >>5)&0x1)+(uint8 (_fabd >>6)&0x1)+(uint8 (_fabd >>7)&0x1);
|
|
};};func _fcda (_aed ,_cfe ,_ggd *Bitmap )(*Bitmap ,error ){const _eefba ="\u0062\u0069\u0074\u006d\u0061\u0070\u002e\u0078\u006f\u0072";if _cfe ==nil {return nil ,_e .Error (_eefba ,"'\u0062\u0031\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _ggd ==nil {return nil ,_e .Error (_eefba ,"'\u0062\u0032\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");
|
|
};if _aed ==_ggd {return nil ,_e .Error (_eefba ,"'\u0064\u0027\u0020\u003d\u003d\u0020\u0027\u0062\u0032\u0027");};if !_cfe .SizesEqual (_ggd ){_ea .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",_eefba );
|
|
};var _fegf error ;if _aed ,_fegf =_fgca (_aed ,_cfe );_fegf !=nil {return nil ,_e .Wrap (_fegf ,_eefba ,"\u0063\u0061n\u0027\u0074\u0020c\u0072\u0065\u0061\u0074\u0065\u0020\u0027\u0064\u0027");};if _fegf =_aed .RasterOperation (0,0,_aed .Width ,_aed .Height ,PixSrcXorDst ,_ggd ,0,0);
|
|
_fegf !=nil {return nil ,_e .Wrap (_fegf ,_eefba ,"");};return _aed ,nil ;};var (_gbdb =[]byte {0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF};_bgga =[]byte {0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};);func _gbae (_gcece ,_fabg int )int {if _gcece > _fabg {return _gcece ;
|
|
};return _fabg ;};func TstImageBitmapInverseData ()[]byte {_dbfb :=_ebgg .Copy ();_dbfb .InverseData ();return _dbfb .Data ;};func _ddf (_ac ,_gfg *Bitmap )(_dg error ){const _cad ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0034";
|
|
_afg :=_gfg .RowStride ;_ddg :=_ac .RowStride ;_gb :=_gfg .RowStride *4-_ac .RowStride ;var (_dgg ,_fa byte ;_gc uint32 ;_egcc ,_db ,_ed ,_bb ,_afb ,_bd ,_edg int ;);for _ed =0;_ed < _gfg .Height ;_ed ++{_egcc =_ed *_afg ;_db =4*_ed *_ddg ;for _bb =0;_bb < _afg ;
|
|
_bb ++{_dgg =_gfg .Data [_egcc +_bb ];_gc =_bgdfe [_dgg ];_bd =_db +_bb *4;if _gb !=0&&(_bb +1)*4> _ac .RowStride {for _afb =_gb ;_afb > 0;_afb --{_fa =byte ((_gc >>uint (_afb *8))&0xff);_edg =_bd +(_gb -_afb );if _dg =_ac .SetByte (_edg ,_fa );_dg !=nil {return _e .Wrapf (_dg ,_cad ,"D\u0069\u0066\u0066\u0065\u0072\u0065n\u0074\u0020\u0072\u006f\u0077\u0073\u0074\u0072\u0069d\u0065\u0073\u002e \u004b:\u0020\u0025\u0064",_afb );
|
|
};};}else if _dg =_ac .setFourBytes (_bd ,_gc );_dg !=nil {return _e .Wrap (_dg ,_cad ,"");};if _dg =_ac .setFourBytes (_db +_bb *4,_bgdfe [_gfg .Data [_egcc +_bb ]]);_dg !=nil {return _e .Wrap (_dg ,_cad ,"");};};for _afb =1;_afb < 4;_afb ++{for _bb =0;
|
|
_bb < _ddg ;_bb ++{if _dg =_ac .SetByte (_db +_afb *_ddg +_bb ,_ac .Data [_db +_bb ]);_dg !=nil {return _e .Wrapf (_dg ,_cad ,"\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",_afb ,_bb );
|
|
};};};};return nil ;};var _dbcf =[5]int {1,2,3,0,4};func _bggg (_fdbd ,_dada *Bitmap ,_gggcb ,_cfba ,_cead ,_fgcgc ,_gdab ,_cdbc ,_bacf ,_daab int ,_dgcb CombinationOperator )error {var _bfac int ;_fecc :=func (){_bfac ++;_cead +=_dada .RowStride ;_fgcgc +=_fdbd .RowStride ;
|
|
_gdab +=_fdbd .RowStride };for _bfac =_gggcb ;_bfac < _cfba ;_fecc (){var _gdbd uint16 ;_dbdd :=_cead ;for _aaa :=_fgcgc ;_aaa <=_gdab ;_aaa ++{_eagc ,_cgfd :=_dada .GetByte (_dbdd );if _cgfd !=nil {return _cgfd ;};_adfe ,_cgfd :=_fdbd .GetByte (_aaa );
|
|
if _cgfd !=nil {return _cgfd ;};_gdbd =(_gdbd |uint16 (_adfe ))<<uint (_daab );_adfe =byte (_gdbd >>8);if _aaa ==_gdab {_adfe =_dbe (uint (_cdbc ),_adfe );};if _cgfd =_dada .SetByte (_dbdd ,_gbf (_eagc ,_adfe ,_dgcb ));_cgfd !=nil {return _cgfd ;};_dbdd ++;
|
|
_gdbd <<=uint (_bacf );};};return nil ;};func (_acee *Bitmap )centroid (_fgaf ,_egaf []int )(Point ,error ){_deed :=Point {};_acee .setPadBits (0);if len (_fgaf )==0{_fgaf =_efag ();};if len (_egaf )==0{_egaf =_aede ();};var _ddgd ,_bcf ,_bcge ,_dbad ,_cbae ,_bcefa int ;
|
|
var _ecdd byte ;for _cbae =0;_cbae < _acee .Height ;_cbae ++{_egac :=_acee .RowStride *_cbae ;_dbad =0;for _bcefa =0;_bcefa < _acee .RowStride ;_bcefa ++{_ecdd =_acee .Data [_egac +_bcefa ];if _ecdd !=0{_dbad +=_egaf [_ecdd ];_ddgd +=_fgaf [_ecdd ]+_bcefa *8*_egaf [_ecdd ];
|
|
};};_bcge +=_dbad ;_bcf +=_dbad *_cbae ;};if _bcge !=0{_deed .X =float32 (_ddgd )/float32 (_bcge );_deed .Y =float32 (_bcf )/float32 (_bcge );};return _deed ,nil ;};func Extract (roi _eb .Rectangle ,src *Bitmap )(*Bitmap ,error ){_ffbb :=New (roi .Dx (),roi .Dy ());
|
|
_dgb :=roi .Min .X &0x07;_gbdc :=8-_dgb ;_gbge :=uint (8-_ffbb .Width &0x07);_adb :=src .GetByteIndex (roi .Min .X ,roi .Min .Y );_dbgf :=src .GetByteIndex (roi .Max .X -1,roi .Min .Y );_cadb :=_ffbb .RowStride ==_dbgf +1-_adb ;var _fgd int ;for _faag :=roi .Min .Y ;
|
|
_faag < roi .Max .Y ;_faag ++{_edfa :=_adb ;_eebf :=_fgd ;switch {case _adb ==_dbgf :_daea ,_fdag :=src .GetByte (_edfa );if _fdag !=nil {return nil ,_fdag ;};_daea <<=uint (_dgb );_fdag =_ffbb .SetByte (_eebf ,_dbe (_gbge ,_daea ));if _fdag !=nil {return nil ,_fdag ;
|
|
};case _dgb ==0:for _cdd :=_adb ;_cdd <=_dbgf ;_cdd ++{_cdge ,_aada :=src .GetByte (_edfa );if _aada !=nil {return nil ,_aada ;};_edfa ++;if _cdd ==_dbgf &&_cadb {_cdge =_dbe (_gbge ,_cdge );};_aada =_ffbb .SetByte (_eebf ,_cdge );if _aada !=nil {return nil ,_aada ;
|
|
};_eebf ++;};default:_bab :=_cfbd (src ,_ffbb ,uint (_dgb ),uint (_gbdc ),_gbge ,_adb ,_dbgf ,_cadb ,_edfa ,_eebf );if _bab !=nil {return nil ,_bab ;};};_adb +=src .RowStride ;_dbgf +=src .RowStride ;_fgd +=_ffbb .RowStride ;};return _ffbb ,nil ;};func _cfcd (_fgc *Bitmap ,_ag *Bitmap ,_cfca int )(_eac error ){const _bg ="e\u0078\u0070\u0061\u006edB\u0069n\u0061\u0072\u0079\u0050\u006fw\u0065\u0072\u0032\u004c\u006f\u0077";
|
|
switch _cfca {case 2:_eac =_def (_fgc ,_ag );case 4:_eac =_ddf (_fgc ,_ag );case 8:_eac =_ec (_fgc ,_ag );default:return _e .Error (_bg ,"\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 _eac !=nil {_eac =_e .Wrap (_eac ,_bg ,"");};return _eac ;};func (_dege *Bitmap )nextOnPixel (_gecg ,_bdd int )(_fccf _eb .Point ,_fec bool ,_ggcf error ){const _dfg ="n\u0065\u0078\u0074\u004f\u006e\u0050\u0069\u0078\u0065\u006c";_fccf ,_fec ,_ggcf =_dege .nextOnPixelLow (_dege .Width ,_dege .Height ,_dege .RowStride ,_gecg ,_bdd );
|
|
if _ggcf !=nil {return _fccf ,false ,_e .Wrap (_ggcf ,_dfg ,"");};return _fccf ,_fec ,nil ;};type Color int ;var (_bbea *Bitmap ;_ebgg *Bitmap ;);func _abda (_beec *Bitmap ,_cffd ,_aba int ,_gaecc ,_bbbg int ,_cdcc RasterOperator ){var (_befd int ;_fced byte ;
|
|
_bff ,_ddff int ;_faga int ;);_egfa :=_gaecc >>3;_aedb :=_gaecc &7;if _aedb > 0{_fced =_gbdb [_aedb ];};_befd =_beec .RowStride *_aba +(_cffd >>3);switch _cdcc {case PixClr :for _bff =0;_bff < _bbbg ;_bff ++{_faga =_befd +_bff *_beec .RowStride ;for _ddff =0;
|
|
_ddff < _egfa ;_ddff ++{_beec .Data [_faga ]=0x0;_faga ++;};if _aedb > 0{_beec .Data [_faga ]=_gbfa (_beec .Data [_faga ],0x0,_fced );};};case PixSet :for _bff =0;_bff < _bbbg ;_bff ++{_faga =_befd +_bff *_beec .RowStride ;for _ddff =0;_ddff < _egfa ;_ddff ++{_beec .Data [_faga ]=0xff;
|
|
_faga ++;};if _aedb > 0{_beec .Data [_faga ]=_gbfa (_beec .Data [_faga ],0xff,_fced );};};case PixNotDst :for _bff =0;_bff < _bbbg ;_bff ++{_faga =_befd +_bff *_beec .RowStride ;for _ddff =0;_ddff < _egfa ;_ddff ++{_beec .Data [_faga ]=^_beec .Data [_faga ];
|
|
_faga ++;};if _aedb > 0{_beec .Data [_faga ]=_gbfa (_beec .Data [_faga ],^_beec .Data [_faga ],_fced );};};};};func (_deda *Bitmap )nextOnPixelLow (_aae ,_fgb ,_fba ,_cgbb ,_bddg int )(_cfcc _eb .Point ,_cged bool ,_degb error ){const _dba ="B\u0069\u0074\u006d\u0061p.\u006ee\u0078\u0074\u004f\u006e\u0050i\u0078\u0065\u006c\u004c\u006f\u0077";
|
|
var (_gea int ;_gecf byte ;);_cadd :=_bddg *_fba ;_ddaa :=_cadd +(_cgbb /8);if _gecf ,_degb =_deda .GetByte (_ddaa );_degb !=nil {return _cfcc ,false ,_e .Wrap (_degb ,_dba ,"\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 _gecf !=0{_ecgc :=_cgbb -(_cgbb %8)+7;for _gea =_cgbb ;_gea <=_ecgc &&_gea < _aae ;_gea ++{if _deda .GetPixel (_gea ,_bddg ){_cfcc .X =_gea ;_cfcc .Y =_bddg ;return _cfcc ,true ,nil ;};};};_fbe :=(_cgbb /8)+1;_gea =8*_fbe ;var _bgbg int ;for _ddaa =_cadd +_fbe ;
|
|
_gea < _aae ;_ddaa ,_gea =_ddaa +1,_gea +8{if _gecf ,_degb =_deda .GetByte (_ddaa );_degb !=nil {return _cfcc ,false ,_e .Wrap (_degb ,_dba ,"r\u0065\u0073\u0074\u0020of\u0020t\u0068\u0065\u0020\u006c\u0069n\u0065\u0020\u0062\u0079\u0074\u0065");};if _gecf ==0{continue ;
|
|
};for _bgbg =0;_bgbg < 8&&_gea < _aae ;_bgbg ,_gea =_bgbg +1,_gea +1{if _deda .GetPixel (_gea ,_bddg ){_cfcc .X =_gea ;_cfcc .Y =_bddg ;return _cfcc ,true ,nil ;};};};for _gbc :=_bddg +1;_gbc < _fgb ;_gbc ++{_cadd =_gbc *_fba ;for _ddaa ,_gea =_cadd ,0;
|
|
_gea < _aae ;_ddaa ,_gea =_ddaa +1,_gea +8{if _gecf ,_degb =_deda .GetByte (_ddaa );_degb !=nil {return _cfcc ,false ,_e .Wrap (_degb ,_dba ,"\u0066o\u006cl\u006f\u0077\u0069\u006e\u0067\u0020\u006c\u0069\u006e\u0065\u0073");};if _gecf ==0{continue ;};
|
|
for _bgbg =0;_bgbg < 8&&_gea < _aae ;_bgbg ,_gea =_bgbg +1,_gea +1{if _deda .GetPixel (_gea ,_gbc ){_cfcc .X =_gea ;_cfcc .Y =_gbc ;return _cfcc ,true ,nil ;};};};};return _cfcc ,false ,nil ;};func (_gbbd *Bitmaps )selectByIndicator (_abfef *_df .NumSlice )(_gceg *Bitmaps ,_gbded error ){const _adff ="\u0042i\u0074\u006d\u0061\u0070s\u002e\u0073\u0065\u006c\u0065c\u0074B\u0079I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";
|
|
if _gbbd ==nil {return nil ,_e .Error (_adff ,"\u0027\u0062\u0027 b\u0069\u0074\u006d\u0061\u0070\u0073\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};if _abfef ==nil {return nil ,_e .Error (_adff ,"'\u006e\u0061\u0027\u0020\u0069\u006ed\u0069\u0063\u0061\u0074\u006f\u0072\u0073\u0020\u006eo\u0074\u0020\u0064e\u0066i\u006e\u0065\u0064");
|
|
};if len (_gbbd .Values )==0{return _gbbd ,nil ;};if len (*_abfef )!=len (_gbbd .Values ){return nil ,_e .Errorf (_adff ,"\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 (*_abfef ),len (_gbbd .Values ));
|
|
};var _bgcag ,_dfgc ,_dfbdg int ;for _dfgc =0;_dfgc < len (*_abfef );_dfgc ++{if _bgcag ,_gbded =_abfef .GetInt (_dfgc );_gbded !=nil {return nil ,_e .Wrap (_gbded ,_adff ,"f\u0069\u0072\u0073\u0074\u0020\u0063\u0068\u0065\u0063\u006b");};if _bgcag ==1{_dfbdg ++;
|
|
};};if _dfbdg ==len (_gbbd .Values ){return _gbbd ,nil ;};_gceg =&Bitmaps {};_ddegc :=len (_gbbd .Values )==len (_gbbd .Boxes );for _dfgc =0;_dfgc < len (*_abfef );_dfgc ++{if _bgcag =int ((*_abfef )[_dfgc ]);_bgcag ==0{continue ;};_gceg .Values =append (_gceg .Values ,_gbbd .Values [_dfgc ]);
|
|
if _ddegc {_gceg .Boxes =append (_gceg .Boxes ,_gbbd .Boxes [_dfgc ]);};};return _gceg ,nil ;};func _cddc (_gdde *Bitmap ,_fgeg *Bitmap ,_gdgfa int )(_bfaae error ){const _bfdf ="\u0073\u0065\u0065\u0064\u0066\u0069\u006c\u006c\u0042\u0069\u006e\u0061r\u0079\u004c\u006f\u0077";
|
|
_agae :=_dcae (_gdde .Height ,_fgeg .Height );_beab :=_dcae (_gdde .RowStride ,_fgeg .RowStride );switch _gdgfa {case 4:_bfaae =_cgaa (_gdde ,_fgeg ,_agae ,_beab );case 8:_bfaae =_abfa (_gdde ,_fgeg ,_agae ,_beab );default:return _e .Errorf (_bfdf ,"\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",_gdgfa );
|
|
};if _bfaae !=nil {return _e .Wrap (_bfaae ,_bfdf ,"");};return nil ;};func (_ceaf *Bitmaps )GroupByHeight ()(*BitmapsArray ,error ){const _ebaa ="\u0047\u0072\u006f\u0075\u0070\u0042\u0079\u0048\u0065\u0069\u0067\u0068\u0074";if len (_ceaf .Values )==0{return nil ,_e .Error (_ebaa ,"\u006eo\u0020v\u0061\u006c\u0075\u0065\u0073 \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");
|
|
};_bebf :=&BitmapsArray {};_ceaf .SortByHeight ();_cgag :=-1;_fggf :=-1;for _cfdae :=0;_cfdae < len (_ceaf .Values );_cfdae ++{_bfcf :=_ceaf .Values [_cfdae ].Height ;if _bfcf > _cgag {_cgag =_bfcf ;_fggf ++;_bebf .Values =append (_bebf .Values ,&Bitmaps {});
|
|
};_bebf .Values [_fggf ].AddBitmap (_ceaf .Values [_cfdae ]);};return _bebf ,nil ;};const (MopDilation MorphOperation =iota ;MopErosion ;MopOpening ;MopClosing ;MopRankBinaryReduction ;MopReplicativeBinaryExpansion ;MopAddBorder ;);func (_abg *Bitmap )CountPixels ()int {return _abg .countPixels ()};
|
|
func _ebdce (_ddcb ,_fdaec *Bitmap ,_fbddb ,_bcbg int )(*Bitmap ,error ){const _acbf ="\u006fp\u0065\u006e\u0042\u0072\u0069\u0063k";if _fdaec ==nil {return nil ,_e .Error (_acbf ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");
|
|
};if _fbddb < 1&&_bcbg < 1{return nil ,_e .Error (_acbf ,"\u0068\u0053\u0069\u007ae \u003c\u0020\u0031\u0020\u0026\u0026\u0020\u0076\u0053\u0069\u007a\u0065\u0020\u003c \u0031");};if _fbddb ==1&&_bcbg ==1{return _fdaec .Copy (),nil ;};if _fbddb ==1||_bcbg ==1{var _gede error ;
|
|
_bafb :=SelCreateBrick (_bcbg ,_fbddb ,_bcbg /2,_fbddb /2,SelHit );_ddcb ,_gede =_agceg (_ddcb ,_fdaec ,_bafb );if _gede !=nil {return nil ,_e .Wrap (_gede ,_acbf ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _ddcb ,nil ;};_ceaa :=SelCreateBrick (1,_fbddb ,0,_fbddb /2,SelHit );_decf :=SelCreateBrick (_bcbg ,1,_bcbg /2,0,SelHit );_fdbc ,_dggf :=_ebgfb (nil ,_fdaec ,_ceaa );if _dggf !=nil {return nil ,_e .Wrap (_dggf ,_acbf ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");
|
|
};_ddcb ,_dggf =_ebgfb (_ddcb ,_fdbc ,_decf );if _dggf !=nil {return nil ,_e .Wrap (_dggf ,_acbf ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};_ ,_dggf =_ebgfa (_fdbc ,_ddcb ,_ceaa );if _dggf !=nil {return nil ,_e .Wrap (_dggf ,_acbf ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
};_ ,_dggf =_ebgfa (_ddcb ,_fdbc ,_decf );if _dggf !=nil {return nil ,_e .Wrap (_dggf ,_acbf ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};return _ddcb ,nil ;};func _ae ()(_ada []byte ){_ada =make ([]byte ,256);for _eca :=0;_eca < 256;
|
|
_eca ++{_cda :=byte (_eca );_ada [_cda ]=(_cda &0x01)|((_cda &0x04)>>1)|((_cda &0x10)>>2)|((_cda &0x40)>>3)|((_cda &0x02)<<3)|((_cda &0x08)<<2)|((_cda &0x20)<<1)|(_cda &0x80);};return _ada ;};func (_egdde *Selection )setOrigin (_dgge ,_dgcba int ){_egdde .Cy ,_egdde .Cx =_dgge ,_dgcba };
|
|
func _eddb (_gfgde *Bitmap ,_acgc ,_acbc ,_befce ,_eecf int ,_eacg RasterOperator ,_cbefg *Bitmap ,_fgaca ,_agge int )error {var (_dedg byte ;_gbag int ;_fgda int ;_efgaa ,_fagb int ;_adfa ,_agcbd int ;);_ddfbc :=_befce >>3;_ecfce :=_befce &7;if _ecfce > 0{_dedg =_gbdb [_ecfce ];
|
|
};_gbag =_cbefg .RowStride *_agge +(_fgaca >>3);_fgda =_gfgde .RowStride *_acbc +(_acgc >>3);switch _eacg {case PixSrc :for _adfa =0;_adfa < _eecf ;_adfa ++{_efgaa =_gbag +_adfa *_cbefg .RowStride ;_fagb =_fgda +_adfa *_gfgde .RowStride ;for _agcbd =0;
|
|
_agcbd < _ddfbc ;_agcbd ++{_gfgde .Data [_fagb ]=_cbefg .Data [_efgaa ];_fagb ++;_efgaa ++;};if _ecfce > 0{_gfgde .Data [_fagb ]=_gbfa (_gfgde .Data [_fagb ],_cbefg .Data [_efgaa ],_dedg );};};case PixNotSrc :for _adfa =0;_adfa < _eecf ;_adfa ++{_efgaa =_gbag +_adfa *_cbefg .RowStride ;
|
|
_fagb =_fgda +_adfa *_gfgde .RowStride ;for _agcbd =0;_agcbd < _ddfbc ;_agcbd ++{_gfgde .Data [_fagb ]=^(_cbefg .Data [_efgaa ]);_fagb ++;_efgaa ++;};if _ecfce > 0{_gfgde .Data [_fagb ]=_gbfa (_gfgde .Data [_fagb ],^_cbefg .Data [_efgaa ],_dedg );};};case PixSrcOrDst :for _adfa =0;
|
|
_adfa < _eecf ;_adfa ++{_efgaa =_gbag +_adfa *_cbefg .RowStride ;_fagb =_fgda +_adfa *_gfgde .RowStride ;for _agcbd =0;_agcbd < _ddfbc ;_agcbd ++{_gfgde .Data [_fagb ]|=_cbefg .Data [_efgaa ];_fagb ++;_efgaa ++;};if _ecfce > 0{_gfgde .Data [_fagb ]=_gbfa (_gfgde .Data [_fagb ],_cbefg .Data [_efgaa ]|_gfgde .Data [_fagb ],_dedg );
|
|
};};case PixSrcAndDst :for _adfa =0;_adfa < _eecf ;_adfa ++{_efgaa =_gbag +_adfa *_cbefg .RowStride ;_fagb =_fgda +_adfa *_gfgde .RowStride ;for _agcbd =0;_agcbd < _ddfbc ;_agcbd ++{_gfgde .Data [_fagb ]&=_cbefg .Data [_efgaa ];_fagb ++;_efgaa ++;};if _ecfce > 0{_gfgde .Data [_fagb ]=_gbfa (_gfgde .Data [_fagb ],_cbefg .Data [_efgaa ]&_gfgde .Data [_fagb ],_dedg );
|
|
};};case PixSrcXorDst :for _adfa =0;_adfa < _eecf ;_adfa ++{_efgaa =_gbag +_adfa *_cbefg .RowStride ;_fagb =_fgda +_adfa *_gfgde .RowStride ;for _agcbd =0;_agcbd < _ddfbc ;_agcbd ++{_gfgde .Data [_fagb ]^=_cbefg .Data [_efgaa ];_fagb ++;_efgaa ++;};if _ecfce > 0{_gfgde .Data [_fagb ]=_gbfa (_gfgde .Data [_fagb ],_cbefg .Data [_efgaa ]^_gfgde .Data [_fagb ],_dedg );
|
|
};};case PixNotSrcOrDst :for _adfa =0;_adfa < _eecf ;_adfa ++{_efgaa =_gbag +_adfa *_cbefg .RowStride ;_fagb =_fgda +_adfa *_gfgde .RowStride ;for _agcbd =0;_agcbd < _ddfbc ;_agcbd ++{_gfgde .Data [_fagb ]|=^(_cbefg .Data [_efgaa ]);_fagb ++;_efgaa ++;
|
|
};if _ecfce > 0{_gfgde .Data [_fagb ]=_gbfa (_gfgde .Data [_fagb ],^(_cbefg .Data [_efgaa ])|_gfgde .Data [_fagb ],_dedg );};};case PixNotSrcAndDst :for _adfa =0;_adfa < _eecf ;_adfa ++{_efgaa =_gbag +_adfa *_cbefg .RowStride ;_fagb =_fgda +_adfa *_gfgde .RowStride ;
|
|
for _agcbd =0;_agcbd < _ddfbc ;_agcbd ++{_gfgde .Data [_fagb ]&=^(_cbefg .Data [_efgaa ]);_fagb ++;_efgaa ++;};if _ecfce > 0{_gfgde .Data [_fagb ]=_gbfa (_gfgde .Data [_fagb ],^(_cbefg .Data [_efgaa ])&_gfgde .Data [_fagb ],_dedg );};};case PixSrcOrNotDst :for _adfa =0;
|
|
_adfa < _eecf ;_adfa ++{_efgaa =_gbag +_adfa *_cbefg .RowStride ;_fagb =_fgda +_adfa *_gfgde .RowStride ;for _agcbd =0;_agcbd < _ddfbc ;_agcbd ++{_gfgde .Data [_fagb ]=_cbefg .Data [_efgaa ]|^(_gfgde .Data [_fagb ]);_fagb ++;_efgaa ++;};if _ecfce > 0{_gfgde .Data [_fagb ]=_gbfa (_gfgde .Data [_fagb ],_cbefg .Data [_efgaa ]|^(_gfgde .Data [_fagb ]),_dedg );
|
|
};};case PixSrcAndNotDst :for _adfa =0;_adfa < _eecf ;_adfa ++{_efgaa =_gbag +_adfa *_cbefg .RowStride ;_fagb =_fgda +_adfa *_gfgde .RowStride ;for _agcbd =0;_agcbd < _ddfbc ;_agcbd ++{_gfgde .Data [_fagb ]=_cbefg .Data [_efgaa ]&^(_gfgde .Data [_fagb ]);
|
|
_fagb ++;_efgaa ++;};if _ecfce > 0{_gfgde .Data [_fagb ]=_gbfa (_gfgde .Data [_fagb ],_cbefg .Data [_efgaa ]&^(_gfgde .Data [_fagb ]),_dedg );};};case PixNotPixSrcOrDst :for _adfa =0;_adfa < _eecf ;_adfa ++{_efgaa =_gbag +_adfa *_cbefg .RowStride ;_fagb =_fgda +_adfa *_gfgde .RowStride ;
|
|
for _agcbd =0;_agcbd < _ddfbc ;_agcbd ++{_gfgde .Data [_fagb ]=^(_cbefg .Data [_efgaa ]|_gfgde .Data [_fagb ]);_fagb ++;_efgaa ++;};if _ecfce > 0{_gfgde .Data [_fagb ]=_gbfa (_gfgde .Data [_fagb ],^(_cbefg .Data [_efgaa ]|_gfgde .Data [_fagb ]),_dedg );
|
|
};};case PixNotPixSrcAndDst :for _adfa =0;_adfa < _eecf ;_adfa ++{_efgaa =_gbag +_adfa *_cbefg .RowStride ;_fagb =_fgda +_adfa *_gfgde .RowStride ;for _agcbd =0;_agcbd < _ddfbc ;_agcbd ++{_gfgde .Data [_fagb ]=^(_cbefg .Data [_efgaa ]&_gfgde .Data [_fagb ]);
|
|
_fagb ++;_efgaa ++;};if _ecfce > 0{_gfgde .Data [_fagb ]=_gbfa (_gfgde .Data [_fagb ],^(_cbefg .Data [_efgaa ]&_gfgde .Data [_fagb ]),_dedg );};};case PixNotPixSrcXorDst :for _adfa =0;_adfa < _eecf ;_adfa ++{_efgaa =_gbag +_adfa *_cbefg .RowStride ;_fagb =_fgda +_adfa *_gfgde .RowStride ;
|
|
for _agcbd =0;_agcbd < _ddfbc ;_agcbd ++{_gfgde .Data [_fagb ]=^(_cbefg .Data [_efgaa ]^_gfgde .Data [_fagb ]);_fagb ++;_efgaa ++;};if _ecfce > 0{_gfgde .Data [_fagb ]=_gbfa (_gfgde .Data [_fagb ],^(_cbefg .Data [_efgaa ]^_gfgde .Data [_fagb ]),_dedg );
|
|
};};default:_ea .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",_eacg );return _e .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 _agbb (_acabc *Bitmap ,_eafd ,_bcee int ,_gbgb ,_agfb int ,_abbe RasterOperator ,_ddfa *Bitmap ,_cgbd ,_geca int )error {var _bcfe ,_egaa ,_aafbf ,_ebbf int ;if _eafd < 0{_cgbd -=_eafd ;_gbgb +=_eafd ;_eafd =0;};if _cgbd < 0{_eafd -=_cgbd ;
|
|
_gbgb +=_cgbd ;_cgbd =0;};_bcfe =_eafd +_gbgb -_acabc .Width ;if _bcfe > 0{_gbgb -=_bcfe ;};_egaa =_cgbd +_gbgb -_ddfa .Width ;if _egaa > 0{_gbgb -=_egaa ;};if _bcee < 0{_geca -=_bcee ;_agfb +=_bcee ;_bcee =0;};if _geca < 0{_bcee -=_geca ;_agfb +=_geca ;
|
|
_geca =0;};_aafbf =_bcee +_agfb -_acabc .Height ;if _aafbf > 0{_agfb -=_aafbf ;};_ebbf =_geca +_agfb -_ddfa .Height ;if _ebbf > 0{_agfb -=_ebbf ;};if _gbgb <=0||_agfb <=0{return nil ;};var _fccd error ;switch {case _eafd &7==0&&_cgbd &7==0:_fccd =_eddb (_acabc ,_eafd ,_bcee ,_gbgb ,_agfb ,_abbe ,_ddfa ,_cgbd ,_geca );
|
|
case _eafd &7==_cgbd &7:_fccd =_cbggf (_acabc ,_eafd ,_bcee ,_gbgb ,_agfb ,_abbe ,_ddfa ,_cgbd ,_geca );default:_fccd =_eecd (_acabc ,_eafd ,_bcee ,_gbgb ,_agfb ,_abbe ,_ddfa ,_cgbd ,_geca );};if _fccd !=nil {return _e .Wrap (_fccd ,"r\u0061\u0073\u0074\u0065\u0072\u004f\u0070\u004c\u006f\u0077","");
|
|
};return nil ;};func _efag ()[]int {_bgbba :=make ([]int ,256);_bgbba [0]=0;_bgbba [1]=7;var _dgea int ;for _dgea =2;_dgea < 4;_dgea ++{_bgbba [_dgea ]=_bgbba [_dgea -2]+6;};for _dgea =4;_dgea < 8;_dgea ++{_bgbba [_dgea ]=_bgbba [_dgea -4]+5;};for _dgea =8;
|
|
_dgea < 16;_dgea ++{_bgbba [_dgea ]=_bgbba [_dgea -8]+4;};for _dgea =16;_dgea < 32;_dgea ++{_bgbba [_dgea ]=_bgbba [_dgea -16]+3;};for _dgea =32;_dgea < 64;_dgea ++{_bgbba [_dgea ]=_bgbba [_dgea -32]+2;};for _dgea =64;_dgea < 128;_dgea ++{_bgbba [_dgea ]=_bgbba [_dgea -64]+1;
|
|
};for _dgea =128;_dgea < 256;_dgea ++{_bgbba [_dgea ]=_bgbba [_dgea -128];};return _bgbba ;};func (_aga *Bitmap )equivalent (_aafdc *Bitmap )bool {if _aga ==_aafdc {return true ;};if !_aga .SizesEqual (_aafdc ){return false ;};_faf :=_geb (_aga ,_aafdc ,CmbOpXor );
|
|
_bbbd :=_aga .countPixels ();_gfgg :=int (0.25*float32 (_bbbd ));if _faf .thresholdPixelSum (_gfgg ){return false ;};var (_cagg [9][9]int ;_gbbf [18][9]int ;_beddd [9][18]int ;_fdaa int ;_fbd int ;);_gcd :=9;_gfbc :=_aga .Height /_gcd ;_eee :=_aga .Width /_gcd ;
|
|
_gggf ,_fbfc :=_gfbc /2,_eee /2;if _gfbc < _eee {_gggf =_eee /2;_fbfc =_gfbc /2;};_fdgb :=float64 (_gggf )*float64 (_fbfc )*_eg .Pi ;_ebf :=int (float64 (_gfbc *_eee /2)*0.9);_gga :=int (float64 (_eee *_gfbc /2)*0.9);for _gegd :=0;_gegd < _gcd ;_gegd ++{_fae :=_eee *_gegd +_fdaa ;
|
|
var _fcdg int ;if _gegd ==_gcd -1{_fdaa =0;_fcdg =_aga .Width ;}else {_fcdg =_fae +_eee ;if ((_aga .Width -_fdaa )%_gcd )> 0{_fdaa ++;_fcdg ++;};};for _adee :=0;_adee < _gcd ;_adee ++{_gaf :=_gfbc *_adee +_fbd ;var _egf int ;if _adee ==_gcd -1{_fbd =0;
|
|
_egf =_aga .Height ;}else {_egf =_gaf +_gfbc ;if (_aga .Height -_fbd )%_gcd > 0{_fbd ++;_egf ++;};};var _bfaa ,_gggc ,_ffb ,_ecg int ;_efd :=(_fae +_fcdg )/2;_gbg :=(_gaf +_egf )/2;for _dgc :=_fae ;_dgc < _fcdg ;_dgc ++{for _ecdg :=_gaf ;_ecdg < _egf ;
|
|
_ecdg ++{if _faf .GetPixel (_dgc ,_ecdg ){if _dgc < _efd {_bfaa ++;}else {_gggc ++;};if _ecdg < _gbg {_ecg ++;}else {_ffb ++;};};};};_cagg [_gegd ][_adee ]=_bfaa +_gggc ;_gbbf [_gegd *2][_adee ]=_bfaa ;_gbbf [_gegd *2+1][_adee ]=_gggc ;_beddd [_gegd ][_adee *2]=_ecg ;
|
|
_beddd [_gegd ][_adee *2+1]=_ffb ;};};for _bfg :=0;_bfg < _gcd *2-1;_bfg ++{for _gff :=0;_gff < (_gcd -1);_gff ++{var _gcfc int ;for _bcg :=0;_bcg < 2;_bcg ++{for _afaf :=0;_afaf < 2;_afaf ++{_gcfc +=_gbbf [_bfg +_bcg ][_gff +_afaf ];};};if _gcfc > _gga {return false ;
|
|
};};};for _cbge :=0;_cbge < (_gcd -1);_cbge ++{for _ccac :=0;_ccac < ((_gcd *2)-1);_ccac ++{var _ecea int ;for _gfae :=0;_gfae < 2;_gfae ++{for _gfag :=0;_gfag < 2;_gfag ++{_ecea +=_beddd [_cbge +_gfae ][_ccac +_gfag ];};};if _ecea > _ebf {return false ;
|
|
};};};for _fcaed :=0;_fcaed < (_gcd -2);_fcaed ++{for _dbf :=0;_dbf < (_gcd -2);_dbf ++{var _edef ,_bdgde int ;for _abba :=0;_abba < 3;_abba ++{for _cdeaa :=0;_cdeaa < 3;_cdeaa ++{if _abba ==_cdeaa {_edef +=_cagg [_fcaed +_abba ][_dbf +_cdeaa ];};if (2-_abba )==_cdeaa {_bdgde +=_cagg [_fcaed +_abba ][_dbf +_cdeaa ];
|
|
};};};if _edef > _gga ||_bdgde > _gga {return false ;};};};for _dcff :=0;_dcff < (_gcd -1);_dcff ++{for _bagc :=0;_bagc < (_gcd -1);_bagc ++{var _cdgd int ;for _fdga :=0;_fdga < 2;_fdga ++{for _ggga :=0;_ggga < 2;_ggga ++{_cdgd +=_cagg [_dcff +_fdga ][_bagc +_ggga ];
|
|
};};if float64 (_cdgd )> _fdgb {return false ;};};};return true ;};type BitmapsArray struct{Values []*Bitmaps ;Boxes []*_eb .Rectangle ;};func _agbf (_bgdf ,_ddgg *Bitmap ,_fef ,_geaf ,_defdc ,_deggf ,_dgca int ,_gfcb CombinationOperator )error {var _bbgbg int ;
|
|
_agda :=func (){_bbgbg ++;_defdc +=_ddgg .RowStride ;_deggf +=_bgdf .RowStride ;_dgca +=_bgdf .RowStride };for _bbgbg =_fef ;_bbgbg < _geaf ;_agda (){_bda :=_defdc ;for _bac :=_deggf ;_bac <=_dgca ;_bac ++{_caba ,_eedf :=_ddgg .GetByte (_bda );if _eedf !=nil {return _eedf ;
|
|
};_cfeg ,_eedf :=_bgdf .GetByte (_bac );if _eedf !=nil {return _eedf ;};if _eedf =_ddgg .SetByte (_bda ,_gbf (_caba ,_cfeg ,_gfcb ));_eedf !=nil {return _eedf ;};_bda ++;};};return nil ;};const (_ddfc shift =iota ;_cdbg ;);type MorphOperation int ;func (_bee *Bitmap )ThresholdPixelSum (thresh int ,tab8 []int )(_faa bool ,_bbfa error ){const _dbgd ="\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 =_aede ();};_fdf :=_bee .Width >>3;_dcfd :=_bee .Width &7;_eecb :=byte (0xff<<uint (8-_dcfd ));var (_cdec ,_fad ,_adc ,_eefb int ;_cagd byte ;);for _cdec =0;_cdec < _bee .Height ;_cdec ++{_adc =_bee .RowStride *_cdec ;for _fad =0;_fad < _fdf ;
|
|
_fad ++{_cagd ,_bbfa =_bee .GetByte (_adc +_fad );if _bbfa !=nil {return false ,_e .Wrap (_bbfa ,_dbgd ,"\u0066\u0075\u006c\u006c\u0042\u0079\u0074\u0065");};_eefb +=tab8 [_cagd ];};if _dcfd !=0{_cagd ,_bbfa =_bee .GetByte (_adc +_fad );if _bbfa !=nil {return false ,_e .Wrap (_bbfa ,_dbgd ,"p\u0061\u0072\u0074\u0069\u0061\u006c\u0042\u0079\u0074\u0065");
|
|
};_cagd &=_eecb ;_eefb +=tab8 [_cagd ];};if _eefb > thresh {return true ,nil ;};};return _faa ,nil ;};func NewWithUnpaddedData (width ,height int ,data []byte )(*Bitmap ,error ){const _cdef ="\u004e\u0065\u0077\u0057it\u0068\u0055\u006e\u0070\u0061\u0064\u0064\u0065\u0064\u0044\u0061\u0074\u0061";
|
|
_bfe :=_bef (width ,height );_bfe .Data =data ;if _abe :=((width *height )+7)>>3;len (data )< _abe {return nil ,_e .Errorf (_cdef ,"\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 ),_abe );
|
|
};if _dfc :=_bfe .addPadBits ();_dfc !=nil {return nil ,_e .Wrap (_dfc ,_cdef ,"");};return _bfe ,nil ;};type byHeight Bitmaps ;func (_badd Points )YSorter ()func (_gaad ,_ecfd int )bool {return func (_aeb ,_gdbf int )bool {return _badd [_aeb ].Y < _badd [_gdbf ].Y };
|
|
};func (_fbde *Boxes )selectWithIndicator (_efcc *_df .NumSlice )(_bdge *Boxes ,_acab error ){const _gefa ="\u0042o\u0078\u0065\u0073\u002es\u0065\u006c\u0065\u0063\u0074W\u0069t\u0068I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";if _fbde ==nil {return nil ,_e .Error (_gefa ,"b\u006f\u0078\u0065\u0073 '\u0062'\u0020\u006e\u006f\u0074\u0020d\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};if _efcc ==nil {return nil ,_e .Error (_gefa ,"\u0027\u006ea\u0027\u0020\u006eo\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};if len (*_efcc )!=len (*_fbde ){return nil ,_e .Error (_gefa ,"\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 _agfe ,_dde int ;for _egge :=0;_egge < len (*_efcc );_egge ++{if _agfe ,_acab =_efcc .GetInt (_egge );_acab !=nil {return nil ,_e .Wrap (_acab ,_gefa ,"\u0063\u0068\u0065\u0063\u006b\u0069\u006e\u0067\u0020c\u006f\u0075\u006e\u0074");};if _agfe ==1{_dde ++;
|
|
};};if _dde ==len (*_fbde ){return _fbde ,nil ;};_cced :=Boxes {};for _febe :=0;_febe < len (*_efcc );_febe ++{_agfe =int ((*_efcc )[_febe ]);if _agfe ==0{continue ;};_cced =append (_cced ,(*_fbde )[_febe ]);};_bdge =&_cced ;return _bdge ,nil ;};const (_ SizeComparison =iota ;
|
|
SizeSelectIfLT ;SizeSelectIfGT ;SizeSelectIfLTE ;SizeSelectIfGTE ;SizeSelectIfEQ ;);func Dilate (d *Bitmap ,s *Bitmap ,sel *Selection )(*Bitmap ,error ){return _ebgfa (d ,s ,sel )};func (_acbg *ClassedPoints )Less (i ,j int )bool {return _acbg ._dcgeg (i ,j )};
|
|
func (_dbge *Bitmaps )SortByHeight (){_ccfd :=(*byHeight )(_dbge );_f .Sort (_ccfd )};func (_agba *Bitmap )setEightBytes (_bec int ,_bbgd uint64 )error {_cefe :=_agba .RowStride -(_bec %_agba .RowStride );if _agba .RowStride !=_agba .Width >>3{_cefe --;
|
|
};if _cefe >=8{return _agba .setEightFullBytes (_bec ,_bbgd );};return _agba .setEightPartlyBytes (_bec ,_cefe ,_bbgd );};func _cgaa (_edcf ,_cdcg *Bitmap ,_dcfc ,_abgf int )(_dbca error ){const _fcaa ="\u0073e\u0065d\u0066\u0069\u006c\u006c\u0042i\u006e\u0061r\u0079\u004c\u006f\u0077\u0034";
|
|
var (_fbad ,_dfeb ,_fdaf ,_fcaef int ;_cefec ,_afba ,_afbf ,_cafg ,_dadf ,_bbae ,_ebcf byte ;);for _fbad =0;_fbad < _dcfc ;_fbad ++{_fdaf =_fbad *_edcf .RowStride ;_fcaef =_fbad *_cdcg .RowStride ;for _dfeb =0;_dfeb < _abgf ;_dfeb ++{_cefec ,_dbca =_edcf .GetByte (_fdaf +_dfeb );
|
|
if _dbca !=nil {return _e .Wrap (_dbca ,_fcaa ,"\u0066i\u0072\u0073\u0074\u0020\u0067\u0065t");};_afba ,_dbca =_cdcg .GetByte (_fcaef +_dfeb );if _dbca !=nil {return _e .Wrap (_dbca ,_fcaa ,"\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0067\u0065\u0074");
|
|
};if _fbad > 0{_afbf ,_dbca =_edcf .GetByte (_fdaf -_edcf .RowStride +_dfeb );if _dbca !=nil {return _e .Wrap (_dbca ,_fcaa ,"\u0069\u0020\u003e \u0030");};_cefec |=_afbf ;};if _dfeb > 0{_cafg ,_dbca =_edcf .GetByte (_fdaf +_dfeb -1);if _dbca !=nil {return _e .Wrap (_dbca ,_fcaa ,"\u006a\u0020\u003e \u0030");
|
|
};_cefec |=_cafg <<7;};_cefec &=_afba ;if _cefec ==0||(^_cefec )==0{if _dbca =_edcf .SetByte (_fdaf +_dfeb ,_cefec );_dbca !=nil {return _e .Wrap (_dbca ,_fcaa ,"b\u0074\u0020\u003d\u003d 0\u0020|\u007c\u0020\u0028\u005e\u0062t\u0029\u0020\u003d\u003d\u0020\u0030");
|
|
};continue ;};for {_ebcf =_cefec ;_cefec =(_cefec |(_cefec >>1)|(_cefec <<1))&_afba ;if (_cefec ^_ebcf )==0{if _dbca =_edcf .SetByte (_fdaf +_dfeb ,_cefec );_dbca !=nil {return _e .Wrap (_dbca ,_fcaa ,"\u0073\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u0070\u0072\u0065\u0076 \u0062\u0079\u0074\u0065");
|
|
};break ;};};};};for _fbad =_dcfc -1;_fbad >=0;_fbad --{_fdaf =_fbad *_edcf .RowStride ;_fcaef =_fbad *_cdcg .RowStride ;for _dfeb =_abgf -1;_dfeb >=0;_dfeb --{if _cefec ,_dbca =_edcf .GetByte (_fdaf +_dfeb );_dbca !=nil {return _e .Wrap (_dbca ,_fcaa ,"\u0072\u0065\u0076\u0065\u0072\u0073\u0065\u0020\u0066\u0069\u0072\u0073t\u0020\u0067\u0065\u0074");
|
|
};if _afba ,_dbca =_cdcg .GetByte (_fcaef +_dfeb );_dbca !=nil {return _e .Wrap (_dbca ,_fcaa ,"r\u0065\u0076\u0065\u0072se\u0020g\u0065\u0074\u0020\u006d\u0061s\u006b\u0020\u0062\u0079\u0074\u0065");};if _fbad < _dcfc -1{if _dadf ,_dbca =_edcf .GetByte (_fdaf +_edcf .RowStride +_dfeb );
|
|
_dbca !=nil {return _e .Wrap (_dbca ,_fcaa ,"\u0072\u0065v\u0065\u0072\u0073e\u0020\u0069\u0020\u003c\u0020\u0068\u0020\u002d\u0031");};_cefec |=_dadf ;};if _dfeb < _abgf -1{if _bbae ,_dbca =_edcf .GetByte (_fdaf +_dfeb +1);_dbca !=nil {return _e .Wrap (_dbca ,_fcaa ,"\u0072\u0065\u0076\u0065rs\u0065\u0020\u006a\u0020\u003c\u0020\u0077\u0070\u006c\u0020\u002d\u0020\u0031");
|
|
};_cefec |=_bbae >>7;};_cefec &=_afba ;if _cefec ==0||(^_cefec )==0{if _dbca =_edcf .SetByte (_fdaf +_dfeb ,_cefec );_dbca !=nil {return _e .Wrap (_dbca ,_fcaa ,"\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 {_ebcf =_cefec ;_cefec =(_cefec |(_cefec >>1)|(_cefec <<1))&_afba ;if (_cefec ^_ebcf )==0{if _dbca =_edcf .SetByte (_fdaf +_dfeb ,_cefec );_dbca !=nil {return _e .Wrap (_dbca ,_fcaa ,"\u0072e\u0076\u0065\u0072\u0073e\u0020\u0073\u0065\u0074\u0074i\u006eg\u0020p\u0072\u0065\u0076\u0020\u0062\u0079\u0074e");
|
|
};break ;};};};};return nil ;};func (_gcg *Bitmap )ClipRectangle (box *_eb .Rectangle )(_dgfd *Bitmap ,_baf *_eb .Rectangle ,_cdab error ){const _gbb ="\u0043\u006c\u0069\u0070\u0052\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065";if box ==nil {return nil ,nil ,_e .Error (_gbb ,"\u0062o\u0078 \u0069\u0073\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};_bga ,_cbg :=_gcg .Width ,_gcg .Height ;_eeb :=_eb .Rect (0,0,_bga ,_cbg );if !box .Overlaps (_eeb ){return nil ,nil ,_e .Error (_gbb ,"b\u006f\u0078\u0020\u0064oe\u0073n\u0027\u0074\u0020\u006f\u0076e\u0072\u006c\u0061\u0070\u0020\u0062");};_cdb :=box .Intersect (_eeb );
|
|
_bgca ,_bge :=_cdb .Min .X ,_cdb .Min .Y ;_gfc ,_deae :=_cdb .Dx (),_cdb .Dy ();_dgfd =New (_gfc ,_deae );_dgfd .Text =_gcg .Text ;if _cdab =_dgfd .RasterOperation (0,0,_gfc ,_deae ,PixSrc ,_gcg ,_bgca ,_bge );_cdab !=nil {return nil ,nil ,_e .Wrap (_cdab ,_gbb ,"\u0050\u0069\u0078\u0053\u0072\u0063\u0020\u0074\u006f\u0020\u0063\u006ci\u0070\u0070\u0065\u0064");
|
|
};_baf =&_cdb ;return _dgfd ,_baf ,nil ;};func (_gdca *ClassedPoints )GetIntXByClass (i int )(int ,error ){const _geff ="\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 >=_gdca .IntSlice .Size (){return 0,_e .Errorf (_geff ,"\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 (_gdca .XAtIndex (i )),nil ;};func (_gega *Bitmap )ConnComponents (bms *Bitmaps ,connectivity int )(_agdae *Boxes ,_cbad error ){const _acb ="B\u0069\u0074\u006d\u0061p.\u0043o\u006e\u006e\u0043\u006f\u006dp\u006f\u006e\u0065\u006e\u0074\u0073";
|
|
if _gega ==nil {return nil ,_e .Error (_acb ,"\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 ,_e .Error (_acb ,"\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 _agdae ,_cbad =_gega .connComponentsBB (connectivity );_cbad !=nil {return nil ,_e .Wrap (_cbad ,_acb ,"");};}else {if _agdae ,_cbad =_gega .connComponentsBitmapsBB (bms ,connectivity );_cbad !=nil {return nil ,_e .Wrap (_cbad ,_acb ,"");
|
|
};};return _agdae ,nil ;};func _gegb (_gggffe int )int {if _gggffe < 0{return -_gggffe ;};return _gggffe ;};func (_fgcab *Bitmaps )HeightSorter ()func (_efabg ,_dbcd int )bool {return func (_dafc ,_deca int )bool {_fgge :=_fgcab .Values [_dafc ].Height < _fgcab .Values [_deca ].Height ;
|
|
_ea .Log .Debug ("H\u0065i\u0067\u0068\u0074\u003a\u0020\u0025\u0076\u0020<\u0020\u0025\u0076\u0020= \u0025\u0076",_fgcab .Values [_dafc ].Height ,_fgcab .Values [_deca ].Height ,_fgge );return _fgge ;};};func (_eacc *Bitmap )SetPixel (x ,y int ,pixel byte )error {_aafd :=_eacc .GetByteIndex (x ,y );
|
|
if _aafd > len (_eacc .Data )-1{return _e .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",_aafd );};_eef :=_eacc .GetBitOffset (x );
|
|
_ffce :=uint (7-_eef );_ddce :=_eacc .Data [_aafd ];var _ggge byte ;if pixel ==1{_ggge =_ddce |(pixel &0x01<<_ffce );}else {_ggge =_ddce &^(1<<_ffce );};_eacc .Data [_aafd ]=_ggge ;return nil ;};func (_gecd *Bitmap )setTwoBytes (_bfag int ,_bdfb uint16 )error {if _bfag +1> len (_gecd .Data )-1{return _e .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",_bfag );
|
|
};_gecd .Data [_bfag ]=byte ((_bdfb &0xff00)>>8);_gecd .Data [_bfag +1]=byte (_bdfb &0xff);return nil ;};func RasterOperation (dest *Bitmap ,dx ,dy ,dw ,dh int ,op RasterOperator ,src *Bitmap ,sx ,sy int )error {return _ceabg (dest ,dx ,dy ,dw ,dh ,op ,src ,sx ,sy );
|
|
};func (_dgfe *ClassedPoints )validateIntSlice ()error {const _eeaf ="\u0076\u0061l\u0069\u0064\u0061t\u0065\u0049\u006e\u0074\u0053\u006c\u0069\u0063\u0065";for _ ,_febf :=range _dgfe .IntSlice {if _febf >=(_dgfe .Points .Size ()){return _e .Errorf (_eeaf ,"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",_febf ,_dgfe .Points .Size ());
|
|
};};return nil ;};func (_egff *Bitmaps )Size ()int {return len (_egff .Values )};func TstRSymbol (t *_ca .T ,scale ...int )*Bitmap {_cddb ,_agggc :=NewWithData (4,5,[]byte {0xF0,0x90,0xF0,0xA0,0x90});_b .NoError (t ,_agggc );return TstGetScaledSymbol (t ,_cddb ,scale ...);
|
|
};func _fedd (_cgafa ,_becg *Bitmap ,_eegb ,_fbga ,_cdba ,_bfd ,_ecfe ,_dbb ,_bbdf ,_dfbd int ,_ggac CombinationOperator ,_adagb int )error {var _gdga int ;_ebcg :=func (){_gdga ++;_cdba +=_becg .RowStride ;_bfd +=_cgafa .RowStride ;_ecfe +=_cgafa .RowStride };
|
|
for _gdga =_eegb ;_gdga < _fbga ;_ebcg (){var _baae uint16 ;_gfbe :=_cdba ;for _ebff :=_bfd ;_ebff <=_ecfe ;_ebff ++{_ffaba ,_aedg :=_becg .GetByte (_gfbe );if _aedg !=nil {return _aedg ;};_eae ,_aedg :=_cgafa .GetByte (_ebff );if _aedg !=nil {return _aedg ;
|
|
};_baae =(_baae |(uint16 (_eae )&0xff))<<uint (_dfbd );_eae =byte (_baae >>8);if _aedg =_becg .SetByte (_gfbe ,_gbf (_ffaba ,_eae ,_ggac ));_aedg !=nil {return _aedg ;};_gfbe ++;_baae <<=uint (_bbdf );if _ebff ==_ecfe {_eae =byte (_baae >>(8-uint8 (_dfbd )));
|
|
if _adagb !=0{_eae =_dbe (uint (8+_dbb ),_eae );};_ffaba ,_aedg =_becg .GetByte (_gfbe );if _aedg !=nil {return _aedg ;};if _aedg =_becg .SetByte (_gfbe ,_gbf (_ffaba ,_eae ,_ggac ));_aedg !=nil {return _aedg ;};};};};return nil ;};func _cbggf (_dcea *Bitmap ,_bbaf ,_accd ,_ebed ,_ddae int ,_gabg RasterOperator ,_cgfc *Bitmap ,_ecbd ,_debc int )error {var (_dgda bool ;
|
|
_gaag bool ;_cgcf int ;_gfdb int ;_acbfb int ;_dagcc bool ;_ceda byte ;_ggea int ;_ebae int ;_bbeb int ;_cfda ,_efdg int ;);_gace :=8-(_bbaf &7);_gcba :=_bgga [_gace ];_gggec :=_dcea .RowStride *_accd +(_bbaf >>3);_fffd :=_cgfc .RowStride *_debc +(_ecbd >>3);
|
|
if _ebed < _gace {_dgda =true ;_gcba &=_gbdb [8-_gace +_ebed ];};if !_dgda {_cgcf =(_ebed -_gace )>>3;if _cgcf > 0{_gaag =true ;_gfdb =_gggec +1;_acbfb =_fffd +1;};};_ggea =(_bbaf +_ebed )&7;if !(_dgda ||_ggea ==0){_dagcc =true ;_ceda =_gbdb [_ggea ];_ebae =_gggec +1+_cgcf ;
|
|
_bbeb =_fffd +1+_cgcf ;};switch _gabg {case PixSrc :for _cfda =0;_cfda < _ddae ;_cfda ++{_dcea .Data [_gggec ]=_gbfa (_dcea .Data [_gggec ],_cgfc .Data [_fffd ],_gcba );_gggec +=_dcea .RowStride ;_fffd +=_cgfc .RowStride ;};if _gaag {for _cfda =0;_cfda < _ddae ;
|
|
_cfda ++{for _efdg =0;_efdg < _cgcf ;_efdg ++{_dcea .Data [_gfdb +_efdg ]=_cgfc .Data [_acbfb +_efdg ];};_gfdb +=_dcea .RowStride ;_acbfb +=_cgfc .RowStride ;};};if _dagcc {for _cfda =0;_cfda < _ddae ;_cfda ++{_dcea .Data [_ebae ]=_gbfa (_dcea .Data [_ebae ],_cgfc .Data [_bbeb ],_ceda );
|
|
_ebae +=_dcea .RowStride ;_bbeb +=_cgfc .RowStride ;};};case PixNotSrc :for _cfda =0;_cfda < _ddae ;_cfda ++{_dcea .Data [_gggec ]=_gbfa (_dcea .Data [_gggec ],^_cgfc .Data [_fffd ],_gcba );_gggec +=_dcea .RowStride ;_fffd +=_cgfc .RowStride ;};if _gaag {for _cfda =0;
|
|
_cfda < _ddae ;_cfda ++{for _efdg =0;_efdg < _cgcf ;_efdg ++{_dcea .Data [_gfdb +_efdg ]=^_cgfc .Data [_acbfb +_efdg ];};_gfdb +=_dcea .RowStride ;_acbfb +=_cgfc .RowStride ;};};if _dagcc {for _cfda =0;_cfda < _ddae ;_cfda ++{_dcea .Data [_ebae ]=_gbfa (_dcea .Data [_ebae ],^_cgfc .Data [_bbeb ],_ceda );
|
|
_ebae +=_dcea .RowStride ;_bbeb +=_cgfc .RowStride ;};};case PixSrcOrDst :for _cfda =0;_cfda < _ddae ;_cfda ++{_dcea .Data [_gggec ]=_gbfa (_dcea .Data [_gggec ],_cgfc .Data [_fffd ]|_dcea .Data [_gggec ],_gcba );_gggec +=_dcea .RowStride ;_fffd +=_cgfc .RowStride ;
|
|
};if _gaag {for _cfda =0;_cfda < _ddae ;_cfda ++{for _efdg =0;_efdg < _cgcf ;_efdg ++{_dcea .Data [_gfdb +_efdg ]|=_cgfc .Data [_acbfb +_efdg ];};_gfdb +=_dcea .RowStride ;_acbfb +=_cgfc .RowStride ;};};if _dagcc {for _cfda =0;_cfda < _ddae ;_cfda ++{_dcea .Data [_ebae ]=_gbfa (_dcea .Data [_ebae ],_cgfc .Data [_bbeb ]|_dcea .Data [_ebae ],_ceda );
|
|
_ebae +=_dcea .RowStride ;_bbeb +=_cgfc .RowStride ;};};case PixSrcAndDst :for _cfda =0;_cfda < _ddae ;_cfda ++{_dcea .Data [_gggec ]=_gbfa (_dcea .Data [_gggec ],_cgfc .Data [_fffd ]&_dcea .Data [_gggec ],_gcba );_gggec +=_dcea .RowStride ;_fffd +=_cgfc .RowStride ;
|
|
};if _gaag {for _cfda =0;_cfda < _ddae ;_cfda ++{for _efdg =0;_efdg < _cgcf ;_efdg ++{_dcea .Data [_gfdb +_efdg ]&=_cgfc .Data [_acbfb +_efdg ];};_gfdb +=_dcea .RowStride ;_acbfb +=_cgfc .RowStride ;};};if _dagcc {for _cfda =0;_cfda < _ddae ;_cfda ++{_dcea .Data [_ebae ]=_gbfa (_dcea .Data [_ebae ],_cgfc .Data [_bbeb ]&_dcea .Data [_ebae ],_ceda );
|
|
_ebae +=_dcea .RowStride ;_bbeb +=_cgfc .RowStride ;};};case PixSrcXorDst :for _cfda =0;_cfda < _ddae ;_cfda ++{_dcea .Data [_gggec ]=_gbfa (_dcea .Data [_gggec ],_cgfc .Data [_fffd ]^_dcea .Data [_gggec ],_gcba );_gggec +=_dcea .RowStride ;_fffd +=_cgfc .RowStride ;
|
|
};if _gaag {for _cfda =0;_cfda < _ddae ;_cfda ++{for _efdg =0;_efdg < _cgcf ;_efdg ++{_dcea .Data [_gfdb +_efdg ]^=_cgfc .Data [_acbfb +_efdg ];};_gfdb +=_dcea .RowStride ;_acbfb +=_cgfc .RowStride ;};};if _dagcc {for _cfda =0;_cfda < _ddae ;_cfda ++{_dcea .Data [_ebae ]=_gbfa (_dcea .Data [_ebae ],_cgfc .Data [_bbeb ]^_dcea .Data [_ebae ],_ceda );
|
|
_ebae +=_dcea .RowStride ;_bbeb +=_cgfc .RowStride ;};};case PixNotSrcOrDst :for _cfda =0;_cfda < _ddae ;_cfda ++{_dcea .Data [_gggec ]=_gbfa (_dcea .Data [_gggec ],^(_cgfc .Data [_fffd ])|_dcea .Data [_gggec ],_gcba );_gggec +=_dcea .RowStride ;_fffd +=_cgfc .RowStride ;
|
|
};if _gaag {for _cfda =0;_cfda < _ddae ;_cfda ++{for _efdg =0;_efdg < _cgcf ;_efdg ++{_dcea .Data [_gfdb +_efdg ]|=^(_cgfc .Data [_acbfb +_efdg ]);};_gfdb +=_dcea .RowStride ;_acbfb +=_cgfc .RowStride ;};};if _dagcc {for _cfda =0;_cfda < _ddae ;_cfda ++{_dcea .Data [_ebae ]=_gbfa (_dcea .Data [_ebae ],^(_cgfc .Data [_bbeb ])|_dcea .Data [_ebae ],_ceda );
|
|
_ebae +=_dcea .RowStride ;_bbeb +=_cgfc .RowStride ;};};case PixNotSrcAndDst :for _cfda =0;_cfda < _ddae ;_cfda ++{_dcea .Data [_gggec ]=_gbfa (_dcea .Data [_gggec ],^(_cgfc .Data [_fffd ])&_dcea .Data [_gggec ],_gcba );_gggec +=_dcea .RowStride ;_fffd +=_cgfc .RowStride ;
|
|
};if _gaag {for _cfda =0;_cfda < _ddae ;_cfda ++{for _efdg =0;_efdg < _cgcf ;_efdg ++{_dcea .Data [_gfdb +_efdg ]&=^_cgfc .Data [_acbfb +_efdg ];};_gfdb +=_dcea .RowStride ;_acbfb +=_cgfc .RowStride ;};};if _dagcc {for _cfda =0;_cfda < _ddae ;_cfda ++{_dcea .Data [_ebae ]=_gbfa (_dcea .Data [_ebae ],^(_cgfc .Data [_bbeb ])&_dcea .Data [_ebae ],_ceda );
|
|
_ebae +=_dcea .RowStride ;_bbeb +=_cgfc .RowStride ;};};case PixSrcOrNotDst :for _cfda =0;_cfda < _ddae ;_cfda ++{_dcea .Data [_gggec ]=_gbfa (_dcea .Data [_gggec ],_cgfc .Data [_fffd ]|^(_dcea .Data [_gggec ]),_gcba );_gggec +=_dcea .RowStride ;_fffd +=_cgfc .RowStride ;
|
|
};if _gaag {for _cfda =0;_cfda < _ddae ;_cfda ++{for _efdg =0;_efdg < _cgcf ;_efdg ++{_dcea .Data [_gfdb +_efdg ]=_cgfc .Data [_acbfb +_efdg ]|^(_dcea .Data [_gfdb +_efdg ]);};_gfdb +=_dcea .RowStride ;_acbfb +=_cgfc .RowStride ;};};if _dagcc {for _cfda =0;
|
|
_cfda < _ddae ;_cfda ++{_dcea .Data [_ebae ]=_gbfa (_dcea .Data [_ebae ],_cgfc .Data [_bbeb ]|^(_dcea .Data [_ebae ]),_ceda );_ebae +=_dcea .RowStride ;_bbeb +=_cgfc .RowStride ;};};case PixSrcAndNotDst :for _cfda =0;_cfda < _ddae ;_cfda ++{_dcea .Data [_gggec ]=_gbfa (_dcea .Data [_gggec ],_cgfc .Data [_fffd ]&^(_dcea .Data [_gggec ]),_gcba );
|
|
_gggec +=_dcea .RowStride ;_fffd +=_cgfc .RowStride ;};if _gaag {for _cfda =0;_cfda < _ddae ;_cfda ++{for _efdg =0;_efdg < _cgcf ;_efdg ++{_dcea .Data [_gfdb +_efdg ]=_cgfc .Data [_acbfb +_efdg ]&^(_dcea .Data [_gfdb +_efdg ]);};_gfdb +=_dcea .RowStride ;
|
|
_acbfb +=_cgfc .RowStride ;};};if _dagcc {for _cfda =0;_cfda < _ddae ;_cfda ++{_dcea .Data [_ebae ]=_gbfa (_dcea .Data [_ebae ],_cgfc .Data [_bbeb ]&^(_dcea .Data [_ebae ]),_ceda );_ebae +=_dcea .RowStride ;_bbeb +=_cgfc .RowStride ;};};case PixNotPixSrcOrDst :for _cfda =0;
|
|
_cfda < _ddae ;_cfda ++{_dcea .Data [_gggec ]=_gbfa (_dcea .Data [_gggec ],^(_cgfc .Data [_fffd ]|_dcea .Data [_gggec ]),_gcba );_gggec +=_dcea .RowStride ;_fffd +=_cgfc .RowStride ;};if _gaag {for _cfda =0;_cfda < _ddae ;_cfda ++{for _efdg =0;_efdg < _cgcf ;
|
|
_efdg ++{_dcea .Data [_gfdb +_efdg ]=^(_cgfc .Data [_acbfb +_efdg ]|_dcea .Data [_gfdb +_efdg ]);};_gfdb +=_dcea .RowStride ;_acbfb +=_cgfc .RowStride ;};};if _dagcc {for _cfda =0;_cfda < _ddae ;_cfda ++{_dcea .Data [_ebae ]=_gbfa (_dcea .Data [_ebae ],^(_cgfc .Data [_bbeb ]|_dcea .Data [_ebae ]),_ceda );
|
|
_ebae +=_dcea .RowStride ;_bbeb +=_cgfc .RowStride ;};};case PixNotPixSrcAndDst :for _cfda =0;_cfda < _ddae ;_cfda ++{_dcea .Data [_gggec ]=_gbfa (_dcea .Data [_gggec ],^(_cgfc .Data [_fffd ]&_dcea .Data [_gggec ]),_gcba );_gggec +=_dcea .RowStride ;_fffd +=_cgfc .RowStride ;
|
|
};if _gaag {for _cfda =0;_cfda < _ddae ;_cfda ++{for _efdg =0;_efdg < _cgcf ;_efdg ++{_dcea .Data [_gfdb +_efdg ]=^(_cgfc .Data [_acbfb +_efdg ]&_dcea .Data [_gfdb +_efdg ]);};_gfdb +=_dcea .RowStride ;_acbfb +=_cgfc .RowStride ;};};if _dagcc {for _cfda =0;
|
|
_cfda < _ddae ;_cfda ++{_dcea .Data [_ebae ]=_gbfa (_dcea .Data [_ebae ],^(_cgfc .Data [_bbeb ]&_dcea .Data [_ebae ]),_ceda );_ebae +=_dcea .RowStride ;_bbeb +=_cgfc .RowStride ;};};case PixNotPixSrcXorDst :for _cfda =0;_cfda < _ddae ;_cfda ++{_dcea .Data [_gggec ]=_gbfa (_dcea .Data [_gggec ],^(_cgfc .Data [_fffd ]^_dcea .Data [_gggec ]),_gcba );
|
|
_gggec +=_dcea .RowStride ;_fffd +=_cgfc .RowStride ;};if _gaag {for _cfda =0;_cfda < _ddae ;_cfda ++{for _efdg =0;_efdg < _cgcf ;_efdg ++{_dcea .Data [_gfdb +_efdg ]=^(_cgfc .Data [_acbfb +_efdg ]^_dcea .Data [_gfdb +_efdg ]);};_gfdb +=_dcea .RowStride ;
|
|
_acbfb +=_cgfc .RowStride ;};};if _dagcc {for _cfda =0;_cfda < _ddae ;_cfda ++{_dcea .Data [_ebae ]=_gbfa (_dcea .Data [_ebae ],^(_cgfc .Data [_bbeb ]^_dcea .Data [_ebae ]),_ceda );_ebae +=_dcea .RowStride ;_bbeb +=_cgfc .RowStride ;};};default:_ea .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",_gabg );
|
|
return _e .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 TstCSymbol (t *_ca .T )*Bitmap {t .Helper ();_gefd :=New (6,6);_b .NoError (t ,_gefd .SetPixel (1,0,1));_b .NoError (t ,_gefd .SetPixel (2,0,1));_b .NoError (t ,_gefd .SetPixel (3,0,1));_b .NoError (t ,_gefd .SetPixel (4,0,1));_b .NoError (t ,_gefd .SetPixel (0,1,1));
|
|
_b .NoError (t ,_gefd .SetPixel (5,1,1));_b .NoError (t ,_gefd .SetPixel (0,2,1));_b .NoError (t ,_gefd .SetPixel (0,3,1));_b .NoError (t ,_gefd .SetPixel (0,4,1));_b .NoError (t ,_gefd .SetPixel (5,4,1));_b .NoError (t ,_gefd .SetPixel (1,5,1));_b .NoError (t ,_gefd .SetPixel (2,5,1));
|
|
_b .NoError (t ,_gefd .SetPixel (3,5,1));_b .NoError (t ,_gefd .SetPixel (4,5,1));return _gefd ;};func Copy (d ,s *Bitmap )(*Bitmap ,error ){return _fgca (d ,s )};func (_ffc *Bitmap )GetByte (index int )(byte ,error ){if index > len (_ffc .Data )-1||index < 0{return 0,_e .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 _ffc .Data [index ],nil ;};func ClipBoxToRectangle (box *_eb .Rectangle ,wi ,hi int )(_cfgg *_eb .Rectangle ,_cgg error ){const _efbf ="\u0043l\u0069p\u0042\u006f\u0078\u0054\u006fR\u0065\u0063t\u0061\u006e\u0067\u006c\u0065";if box ==nil {return nil ,_e .Error (_efbf ,"\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 ,_e .Error (_efbf ,"\u0027\u0062\u006fx'\u0020\u006f\u0075\u0074\u0073\u0069\u0064\u0065\u0020\u0072\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065");};_aacc :=*box ;
|
|
_cfgg =&_aacc ;if _cfgg .Min .X < 0{_cfgg .Max .X +=_cfgg .Min .X ;_cfgg .Min .X =0;};if _cfgg .Min .Y < 0{_cfgg .Max .Y +=_cfgg .Min .Y ;_cfgg .Min .Y =0;};if _cfgg .Max .X > wi {_cfgg .Max .X =wi ;};if _cfgg .Max .Y > hi {_cfgg .Max .Y =hi ;};return _cfgg ,nil ;
|
|
};func MorphSequence (src *Bitmap ,sequence ...MorphProcess )(*Bitmap ,error ){return _gdeb (src ,sequence ...);};const (CmbOpOr CombinationOperator =iota ;CmbOpAnd ;CmbOpXor ;CmbOpXNor ;CmbOpReplace ;CmbOpNot ;);func Rect (x ,y ,w ,h int )(*_eb .Rectangle ,error ){const _fddce ="b\u0069\u0074\u006d\u0061\u0070\u002e\u0052\u0065\u0063\u0074";
|
|
if x < 0{w +=x ;x =0;if w <=0{return nil ,_e .Errorf (_fddce ,"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 ,_e .Error (_fddce ,"\u0079\u0020\u003c 0\u0020\u0061\u006e\u0064\u0020\u0062\u006f\u0078\u0020\u006f\u0066\u0066\u0020\u002b\u0071\u0075\u0061\u0064");
|
|
};};_ccede :=_eb .Rect (x ,y ,x +w ,y +h );return &_ccede ,nil ;};func (_ebfa *Bitmap )setEightPartlyBytes (_eeeg ,_cee int ,_gggae uint64 )(_efcf error ){var (_fcdc byte ;_agc int ;);const _dcge ="\u0073\u0065\u0074\u0045ig\u0068\u0074\u0050\u0061\u0072\u0074\u006c\u0079\u0042\u0079\u0074\u0065\u0073";
|
|
for _ead :=1;_ead <=_cee ;_ead ++{_agc =64-_ead *8;_fcdc =byte (_gggae >>uint (_agc )&0xff);_ea .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",_fcdc ,_eeeg ,_eeeg +_ead -1,_cee ,_agc );
|
|
if _efcf =_ebfa .SetByte (_eeeg +_ead -1,_fcdc );_efcf !=nil {return _e .Wrap (_efcf ,_dcge ,"\u0066\u0075\u006c\u006c\u0042\u0079\u0074\u0065");};};_gafa :=_ebfa .RowStride *8-_ebfa .Width ;if _gafa ==0{return nil ;};_agc -=8;_fcdc =byte (_gggae >>uint (_agc )&0xff)<<uint (_gafa );
|
|
if _efcf =_ebfa .SetByte (_eeeg +_cee ,_fcdc );_efcf !=nil {return _e .Wrap (_efcf ,_dcge ,"\u0070\u0061\u0064\u0064\u0065\u0064");};return nil ;};func _edad (_cgfg ,_eaa ,_ccad *Bitmap )(*Bitmap ,error ){const _gcecf ="\u0073\u0075\u0062\u0074\u0072\u0061\u0063\u0074";
|
|
if _eaa ==nil {return nil ,_e .Error (_gcecf ,"'\u0073\u0031\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _ccad ==nil {return nil ,_e .Error (_gcecf ,"'\u0073\u0032\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};var _eea error ;switch {case _cgfg ==_eaa :if _eea =_cgfg .RasterOperation (0,0,_eaa .Width ,_eaa .Height ,PixNotSrcAndDst ,_ccad ,0,0);
|
|
_eea !=nil {return nil ,_e .Wrap (_eea ,_gcecf ,"\u0064 \u003d\u003d\u0020\u0073\u0031");};case _cgfg ==_ccad :if _eea =_cgfg .RasterOperation (0,0,_eaa .Width ,_eaa .Height ,PixNotSrcAndDst ,_eaa ,0,0);_eea !=nil {return nil ,_e .Wrap (_eea ,_gcecf ,"\u0064 \u003d\u003d\u0020\u0073\u0032");
|
|
};default:_cgfg ,_eea =_fgca (_cgfg ,_eaa );if _eea !=nil {return nil ,_e .Wrap (_eea ,_gcecf ,"");};if _eea =_cgfg .RasterOperation (0,0,_eaa .Width ,_eaa .Height ,PixNotSrcAndDst ,_ccad ,0,0);_eea !=nil {return nil ,_e .Wrap (_eea ,_gcecf ,"\u0064e\u0066\u0061\u0075\u006c\u0074");
|
|
};};return _cgfg ,nil ;};func (_fdeg *Bitmap )countPixels ()int {var (_gdbc int ;_bfb uint8 ;_facb byte ;_gef int ;);_baac :=_fdeg .RowStride ;_bgba :=uint (_fdeg .Width &0x07);if _bgba !=0{_bfb =uint8 ((0xff<<(8-_bgba ))&0xff);_baac --;};for _agb :=0;
|
|
_agb < _fdeg .Height ;_agb ++{for _gef =0;_gef < _baac ;_gef ++{_facb =_fdeg .Data [_agb *_fdeg .RowStride +_gef ];_gdbc +=int (_agf [_facb ]);};if _bgba !=0{_gdbc +=int (_agf [_fdeg .Data [_agb *_fdeg .RowStride +_gef ]&_bfb ]);};};return _gdbc ;};func (_aaga *Bitmaps )selectByIndexes (_aebb []int )(*Bitmaps ,error ){_gddd :=&Bitmaps {};
|
|
for _ ,_fgdc :=range _aebb {_acbff ,_fcgd :=_aaga .GetBitmap (_fgdc );if _fcgd !=nil {return nil ,_e .Wrap (_fcgd ,"\u0073e\u006ce\u0063\u0074\u0042\u0079\u0049\u006e\u0064\u0065\u0078\u0065\u0073","");};_gddd .AddBitmap (_acbff );};return _gddd ,nil ;
|
|
};func _bdbg (_ccde *_df .Stack ,_dccab ,_ddgge ,_fccc ,_acda ,_adbc int ,_efdc *_eb .Rectangle )(_egfca error ){const _ddba ="\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 _ccde ==nil {return _e .Error (_ddba ,"\u006ei\u006c \u0073\u0074\u0061\u0063\u006b \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");};if _efdc ==nil {return _e .Error (_ddba ,"\u0070\u0072\u006f\u0076i\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0069\u006da\u0067e\u002e\u0052\u0065\u0063\u0074\u0061\u006eg\u006c\u0065");
|
|
};_efdc .Min .X =_df .Min (_efdc .Min .X ,_dccab );_efdc .Max .X =_df .Max (_efdc .Max .X ,_ddgge );_efdc .Min .Y =_df .Min (_efdc .Min .Y ,_fccc );_efdc .Max .Y =_df .Max (_efdc .Max .Y ,_fccc );if !(_fccc +_acda >=0&&_fccc +_acda <=_adbc ){return nil ;
|
|
};if _ccde .Aux ==nil {return _e .Error (_ddba ,"a\u0075x\u0053\u0074\u0061\u0063\u006b\u0020\u006e\u006ft\u0020\u0064\u0065\u0066in\u0065\u0064");};var _ddeg *fillSegment ;_dbeg ,_cace :=_ccde .Aux .Pop ();if _cace {if _ddeg ,_cace =_dbeg .(*fillSegment );
|
|
!_cace {return _e .Error (_ddba ,"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 {_ddeg =&fillSegment {};
|
|
};_ddeg ._dabcf =_dccab ;_ddeg ._baebc =_ddgge ;_ddeg ._cbaab =_fccc ;_ddeg ._gaba =_acda ;_ccde .Push (_ddeg );return nil ;};func (_aeac *ClassedPoints )SortByX (){_aeac ._dcgeg =_aeac .xSortFunction ();_f .Sort (_aeac )};func (_eec *Bitmap )Copy ()*Bitmap {_ceb :=make ([]byte ,len (_eec .Data ));
|
|
copy (_ceb ,_eec .Data );return &Bitmap {Width :_eec .Width ,Height :_eec .Height ,RowStride :_eec .RowStride ,Data :_ceb ,Color :_eec .Color ,Text :_eec .Text ,BitmapNumber :_eec .BitmapNumber ,Special :_eec .Special };};func _gdeb (_cdda *Bitmap ,_afcb ...MorphProcess )(_adcfb *Bitmap ,_bcdg error ){const _fgafd ="\u006d\u006f\u0072\u0070\u0068\u0053\u0065\u0071\u0075\u0065\u006e\u0063\u0065";
|
|
if _cdda ==nil {return nil ,_e .Error (_fgafd ,"\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 (_afcb )==0{return nil ,_e .Error (_fgafd ,"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 _bcdg =_gfge (_afcb ...);
|
|
_bcdg !=nil {return nil ,_e .Wrap (_bcdg ,_fgafd ,"");};var _bfda ,_caeb ,_caf int ;_adcfb =_cdda .Copy ();for _ ,_bagca :=range _afcb {switch _bagca .Operation {case MopDilation :_bfda ,_caeb =_bagca .getWidthHeight ();_adcfb ,_bcdg =DilateBrick (nil ,_adcfb ,_bfda ,_caeb );
|
|
if _bcdg !=nil {return nil ,_e .Wrap (_bcdg ,_fgafd ,"");};case MopErosion :_bfda ,_caeb =_bagca .getWidthHeight ();_adcfb ,_bcdg =_fcb (nil ,_adcfb ,_bfda ,_caeb );if _bcdg !=nil {return nil ,_e .Wrap (_bcdg ,_fgafd ,"");};case MopOpening :_bfda ,_caeb =_bagca .getWidthHeight ();
|
|
_adcfb ,_bcdg =_ebdce (nil ,_adcfb ,_bfda ,_caeb );if _bcdg !=nil {return nil ,_e .Wrap (_bcdg ,_fgafd ,"");};case MopClosing :_bfda ,_caeb =_bagca .getWidthHeight ();_adcfb ,_bcdg =_effbb (nil ,_adcfb ,_bfda ,_caeb );if _bcdg !=nil {return nil ,_e .Wrap (_bcdg ,_fgafd ,"");
|
|
};case MopRankBinaryReduction :_adcfb ,_bcdg =_fb (_adcfb ,_bagca .Arguments ...);if _bcdg !=nil {return nil ,_e .Wrap (_bcdg ,_fgafd ,"");};case MopReplicativeBinaryExpansion :_adcfb ,_bcdg =_dbcc (_adcfb ,_bagca .Arguments [0]);if _bcdg !=nil {return nil ,_e .Wrap (_bcdg ,_fgafd ,"");
|
|
};case MopAddBorder :_caf =_bagca .Arguments [0];_adcfb ,_bcdg =_adcfb .AddBorder (_caf ,0);if _bcdg !=nil {return nil ,_e .Wrap (_bcdg ,_fgafd ,"");};default:return nil ,_e .Error (_fgafd ,"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 _caf > 0{_adcfb ,_bcdg =_adcfb .RemoveBorder (_caf );if _bcdg !=nil {return nil ,_e .Wrap (_bcdg ,_fgafd ,"\u0062\u006f\u0072\u0064\u0065\u0072\u0020\u003e\u0020\u0030");};};return _adcfb ,nil ;};func TstDSymbol (t *_ca .T ,scale ...int )*Bitmap {_eab ,_cffgd :=NewWithData (4,5,[]byte {0xf0,0x90,0x90,0x90,0xE0});
|
|
_b .NoError (t ,_cffgd );return TstGetScaledSymbol (t ,_eab ,scale ...);};func (_ebc *Bitmap )GetChocolateData ()[]byte {if _ebc .Color ==Vanilla {_ebc .inverseData ();};return _ebc .Data ;};func (_dadg *BitmapsArray )AddBox (box *_eb .Rectangle ){_dadg .Boxes =append (_dadg .Boxes ,box )};
|
|
func (_gdc *Bitmap )CreateTemplate ()*Bitmap {return _gdc .createTemplate ()};func _ec (_cg ,_dea *Bitmap )(_fg error ){const _bf ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0038";_ebb :=_dea .RowStride ;
|
|
_ba :=_cg .RowStride ;var _dfe ,_cc ,_dbd ,_bde ,_fea int ;for _dbd =0;_dbd < _dea .Height ;_dbd ++{_dfe =_dbd *_ebb ;_cc =8*_dbd *_ba ;for _bde =0;_bde < _ebb ;_bde ++{if _fg =_cg .setEightBytes (_cc +_bde *8,_cbaf [_dea .Data [_dfe +_bde ]]);_fg !=nil {return _e .Wrap (_fg ,_bf ,"");
|
|
};};for _fea =1;_fea < 8;_fea ++{for _bde =0;_bde < _ba ;_bde ++{if _fg =_cg .SetByte (_cc +_fea *_ba +_bde ,_cg .Data [_cc +_bde ]);_fg !=nil {return _e .Wrap (_fg ,_bf ,"");};};};};return nil ;};func (_aegb *Bitmap )connComponentsBB (_bgfa int )(_dag *Boxes ,_cfea error ){const _faff ="\u0042\u0069\u0074ma\u0070\u002e\u0063\u006f\u006e\u006e\u0043\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074\u0073\u0042\u0042";
|
|
if _bgfa !=4&&_bgfa !=8{return nil ,_e .Error (_faff ,"\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 _aegb .Zero (){return &Boxes {},nil ;
|
|
};_aegb .setPadBits (0);_gac ,_cfea :=_fgca (nil ,_aegb );if _cfea !=nil {return nil ,_e .Wrap (_cfea ,_faff ,"\u0062\u006d\u0031");};_eaag :=&_df .Stack {};_eaag .Aux =&_df .Stack {};_dag =&Boxes {};var (_cdcf ,_gdgb int ;_abgg _eb .Point ;_fbgc bool ;
|
|
_gbda *_eb .Rectangle ;);for {if _abgg ,_fbgc ,_cfea =_gac .nextOnPixel (_gdgb ,_cdcf );_cfea !=nil {return nil ,_e .Wrap (_cfea ,_faff ,"");};if !_fbgc {break ;};if _gbda ,_cfea =_dbce (_gac ,_eaag ,_abgg .X ,_abgg .Y ,_bgfa );_cfea !=nil {return nil ,_e .Wrap (_cfea ,_faff ,"");
|
|
};if _cfea =_dag .Add (_gbda );_cfea !=nil {return nil ,_e .Wrap (_cfea ,_faff ,"");};_gdgb =_abgg .X ;_cdcf =_abgg .Y ;};return _dag ,nil ;};func _fdd (_cgf *Bitmap ,_fdg ,_ad int )(*Bitmap ,error ){const _dc ="e\u0078\u0070\u0061\u006edB\u0069n\u0061\u0072\u0079\u0052\u0065p\u006c\u0069\u0063\u0061\u0074\u0065";
|
|
if _cgf ==nil {return nil ,_e .Error (_dc ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _fdg <=0||_ad <=0{return nil ,_e .Error (_dc ,"\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 _fdg ==_ad {if _fdg ==1{_cd ,_fab :=_fgca (nil ,_cgf );if _fab !=nil {return nil ,_e .Wrap (_fab ,_dc ,"\u0078\u0046\u0061\u0063\u0074\u0020\u003d\u003d\u0020y\u0046\u0061\u0063\u0074");};return _cd ,nil ;};if _fdg ==2||_fdg ==4||_fdg ==8{_bgf ,_dgfb :=_aa (_cgf ,_fdg );
|
|
if _dgfb !=nil {return nil ,_e .Wrap (_dgfb ,_dc ,"\u0078\u0046a\u0063\u0074\u0020i\u006e\u0020\u007b\u0032\u002c\u0034\u002c\u0038\u007d");};return _bgf ,nil ;};};_efb :=_fdg *_cgf .Width ;_gd :=_ad *_cgf .Height ;_gg :=New (_efb ,_gd );_cge :=_gg .RowStride ;
|
|
var (_be ,_caa ,_gae ,_efbg ,_bba int ;_deb byte ;_caad error ;);for _caa =0;_caa < _cgf .Height ;_caa ++{_be =_ad *_caa *_cge ;for _gae =0;_gae < _cgf .Width ;_gae ++{if _gbd :=_cgf .GetPixel (_gae ,_caa );_gbd {_bba =_fdg *_gae ;for _efbg =0;_efbg < _fdg ;
|
|
_efbg ++{_gg .setBit (_be *8+_bba +_efbg );};};};for _efbg =1;_efbg < _ad ;_efbg ++{_aad :=_be +_efbg *_cge ;for _efg :=0;_efg < _cge ;_efg ++{if _deb ,_caad =_gg .GetByte (_be +_efg );_caad !=nil {return nil ,_e .Wrapf (_caad ,_dc ,"\u0072\u0065\u0070\u006cic\u0061\u0074\u0069\u006e\u0067\u0020\u006c\u0069\u006e\u0065\u003a\u0020\u0027\u0025d\u0027",_efbg );
|
|
};if _caad =_gg .SetByte (_aad +_efg ,_deb );_caad !=nil {return nil ,_e .Wrap (_caad ,_dc ,"\u0053\u0065\u0074\u0074in\u0067\u0020\u0062\u0079\u0074\u0065\u0020\u0066\u0061\u0069\u006c\u0065\u0064");};};};};return _gg ,nil ;};func _aede ()[]int {_dfge :=make ([]int ,256);
|
|
for _fdagc :=0;_fdagc <=0xff;_fdagc ++{_ccfc :=byte (_fdagc );_dfge [_ccfc ]=int (_ccfc &0x1)+(int (_ccfc >>1)&0x1)+(int (_ccfc >>2)&0x1)+(int (_ccfc >>3)&0x1)+(int (_ccfc >>4)&0x1)+(int (_ccfc >>5)&0x1)+(int (_ccfc >>6)&0x1)+(int (_ccfc >>7)&0x1);};return _dfge ;
|
|
};type Getter interface{GetBitmap ()*Bitmap ;};func DilateBrick (d ,s *Bitmap ,hSize ,vSize int )(*Bitmap ,error ){return _cface (d ,s ,hSize ,vSize )};func (_cdag Points )Get (i int )(Point ,error ){if i > len (_cdag )-1{return Point {},_e .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 _cdag [i ],nil ;};type SizeComparison int ;func CorrelationScore (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab []int )(_fgbc float64 ,_ccaa error ){const _eagb ="\u0063\u006fr\u0072\u0065\u006ca\u0074\u0069\u006f\u006e\u0053\u0063\u006f\u0072\u0065";
|
|
if bm1 ==nil ||bm2 ==nil {return 0,_e .Error (_eagb ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0062\u0069\u0074ma\u0070\u0073");};if tab ==nil {return 0,_e .Error (_eagb ,"\u0027\u0074\u0061\u0062\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065f\u0069\u006e\u0065\u0064");
|
|
};if area1 <=0||area2 <=0{return 0,_e .Error (_eagb ,"\u0061\u0072\u0065\u0061s\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065\u0020\u0067r\u0065a\u0074\u0065\u0072\u0020\u0074\u0068\u0061n\u0020\u0030");};_ffac ,_degc :=bm1 .Width ,bm1 .Height ;_aeda ,_ccada :=bm2 .Width ,bm2 .Height ;
|
|
_dbfg :=_gegb (_ffac -_aeda );if _dbfg > maxDiffW {return 0,nil ;};_adcf :=_gegb (_degc -_ccada );if _adcf > maxDiffH {return 0,nil ;};var _cbf ,_cgfbe int ;if delX >=0{_cbf =int (delX +0.5);}else {_cbf =int (delX -0.5);};if delY >=0{_cgfbe =int (delY +0.5);
|
|
}else {_cgfbe =int (delY -0.5);};_fdce :=_gbae (_cgfbe ,0);_eff :=_dcae (_ccada +_cgfbe ,_degc );_egfe :=bm1 .RowStride *_fdce ;_fee :=bm2 .RowStride *(_fdce -_cgfbe );_dabc :=_gbae (_cbf ,0);_geba :=_dcae (_aeda +_cbf ,_ffac );_bad :=bm2 .RowStride ;var _ecad ,_cbbg int ;
|
|
if _cbf >=8{_ecad =_cbf >>3;_egfe +=_ecad ;_dabc -=_ecad <<3;_geba -=_ecad <<3;_cbf &=7;}else if _cbf <=-8{_cbbg =-((_cbf +7)>>3);_fee +=_cbbg ;_bad -=_cbbg ;_cbf +=_cbbg <<3;};if _dabc >=_geba ||_fdce >=_eff {return 0,nil ;};_gafe :=(_geba +7)>>3;var (_bcef ,_bded ,_agac byte ;
|
|
_ecfbe ,_dacf ,_ggbe int ;);switch {case _cbf ==0:for _ggbe =_fdce ;_ggbe < _eff ;_ggbe ,_egfe ,_fee =_ggbe +1,_egfe +bm1 .RowStride ,_fee +bm2 .RowStride {for _dacf =0;_dacf < _gafe ;_dacf ++{_agac =bm1 .Data [_egfe +_dacf ]&bm2 .Data [_fee +_dacf ];_ecfbe +=tab [_agac ];
|
|
};};case _cbf > 0:if _bad < _gafe {for _ggbe =_fdce ;_ggbe < _eff ;_ggbe ,_egfe ,_fee =_ggbe +1,_egfe +bm1 .RowStride ,_fee +bm2 .RowStride {_bcef ,_bded =bm1 .Data [_egfe ],bm2 .Data [_fee ]>>uint (_cbf );_agac =_bcef &_bded ;_ecfbe +=tab [_agac ];for _dacf =1;
|
|
_dacf < _bad ;_dacf ++{_bcef ,_bded =bm1 .Data [_egfe +_dacf ],(bm2 .Data [_fee +_dacf ]>>uint (_cbf ))|(bm2 .Data [_fee +_dacf -1]<<uint (8-_cbf ));_agac =_bcef &_bded ;_ecfbe +=tab [_agac ];};_bcef =bm1 .Data [_egfe +_dacf ];_bded =bm2 .Data [_fee +_dacf -1]<<uint (8-_cbf );
|
|
_agac =_bcef &_bded ;_ecfbe +=tab [_agac ];};}else {for _ggbe =_fdce ;_ggbe < _eff ;_ggbe ,_egfe ,_fee =_ggbe +1,_egfe +bm1 .RowStride ,_fee +bm2 .RowStride {_bcef ,_bded =bm1 .Data [_egfe ],bm2 .Data [_fee ]>>uint (_cbf );_agac =_bcef &_bded ;_ecfbe +=tab [_agac ];
|
|
for _dacf =1;_dacf < _gafe ;_dacf ++{_bcef =bm1 .Data [_egfe +_dacf ];_bded =(bm2 .Data [_fee +_dacf ]>>uint (_cbf ))|(bm2 .Data [_fee +_dacf -1]<<uint (8-_cbf ));_agac =_bcef &_bded ;_ecfbe +=tab [_agac ];};};};default:if _gafe < _bad {for _ggbe =_fdce ;
|
|
_ggbe < _eff ;_ggbe ,_egfe ,_fee =_ggbe +1,_egfe +bm1 .RowStride ,_fee +bm2 .RowStride {for _dacf =0;_dacf < _gafe ;_dacf ++{_bcef =bm1 .Data [_egfe +_dacf ];_bded =bm2 .Data [_fee +_dacf ]<<uint (-_cbf );_bded |=bm2 .Data [_fee +_dacf +1]>>uint (8+_cbf );
|
|
_agac =_bcef &_bded ;_ecfbe +=tab [_agac ];};};}else {for _ggbe =_fdce ;_ggbe < _eff ;_ggbe ,_egfe ,_fee =_ggbe +1,_egfe +bm1 .RowStride ,_fee +bm2 .RowStride {for _dacf =0;_dacf < _gafe -1;_dacf ++{_bcef =bm1 .Data [_egfe +_dacf ];_bded =bm2 .Data [_fee +_dacf ]<<uint (-_cbf );
|
|
_bded |=bm2 .Data [_fee +_dacf +1]>>uint (8+_cbf );_agac =_bcef &_bded ;_ecfbe +=tab [_agac ];};_bcef =bm1 .Data [_egfe +_dacf ];_bded =bm2 .Data [_fee +_dacf ]<<uint (-_cbf );_agac =_bcef &_bded ;_ecfbe +=tab [_agac ];};};};_fgbc =float64 (_ecfbe )*float64 (_ecfbe )/(float64 (area1 )*float64 (area2 ));
|
|
return _fgbc ,nil ;};type Bitmap struct{Width ,Height int ;BitmapNumber int ;RowStride int ;Data []byte ;Color Color ;Special int ;Text string ;XResolution ,YResolution int ;};var _afaa =[]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 _bbaa (_agg *Bitmap ,_bdc int ,_bc []byte )(_fc *Bitmap ,_feb error ){const _gce ="\u0072\u0065\u0064\u0075\u0063\u0065\u0052\u0061\u006e\u006b\u0042\u0069n\u0061\u0072\u0079\u0032";if _agg ==nil {return nil ,_e .Error (_gce ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");
|
|
};if _bdc < 1||_bdc > 4{return nil ,_e .Error (_gce ,"\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 _agg .Height <=1{return nil ,_e .Errorf (_gce ,"\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",_agg .Height );
|
|
};_fc =New (_agg .Width /2,_agg .Height /2);if _bc ==nil {_bc =_ae ();};_cfg :=_dcae (_agg .RowStride ,2*_fc .RowStride );switch _bdc {case 1:_feb =_ff (_agg ,_fc ,_bdc ,_bc ,_cfg );case 2:_feb =_fac (_agg ,_fc ,_bdc ,_bc ,_cfg );case 3:_feb =_fcd (_agg ,_fc ,_bdc ,_bc ,_cfg );
|
|
case 4:_feb =_aggb (_agg ,_fc ,_bdc ,_bc ,_cfg );};if _feb !=nil {return nil ,_feb ;};return _fc ,nil ;};func _fcb (_egag ,_bdbc *Bitmap ,_cfeb ,_ged int )(*Bitmap ,error ){const _adeb ="\u0065\u0072\u006f\u0064\u0065\u0042\u0072\u0069\u0063\u006b";if _bdbc ==nil {return nil ,_e .Error (_adeb ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if _cfeb < 1||_ged < 1{return nil ,_e .Error (_adeb ,"\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 _cfeb ==1&&_ged ==1{_bebc ,_dffd :=_fgca (_egag ,_bdbc );if _dffd !=nil {return nil ,_e .Wrap (_dffd ,_adeb ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u0026\u0026 \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _bebc ,nil ;};if _cfeb ==1||_ged ==1{_eaef :=SelCreateBrick (_ged ,_cfeb ,_ged /2,_cfeb /2,SelHit );_gcca ,_aef :=_ebgfb (_egag ,_bdbc ,_eaef );if _aef !=nil {return nil ,_e .Wrap (_aef ,_adeb ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _gcca ,nil ;};_bbac :=SelCreateBrick (1,_cfeb ,0,_cfeb /2,SelHit );_aabf :=SelCreateBrick (_ged ,1,_ged /2,0,SelHit );_bgcg ,_bgda :=_ebgfb (nil ,_bdbc ,_bbac );if _bgda !=nil {return nil ,_e .Wrap (_bgda ,_adeb ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");
|
|
};_egag ,_bgda =_ebgfb (_egag ,_bgcg ,_aabf );if _bgda !=nil {return nil ,_e .Wrap (_bgda ,_adeb ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};return _egag ,nil ;};type BoundaryCondition int ;func (_gcge *byHeight )Len ()int {return len (_gcge .Values )};
|
|
func (_eda *Bitmap )setBit (_ebfd int ){_eda .Data [(_ebfd >>3)]|=0x80>>uint (_ebfd &7)};func (_debae *BitmapsArray )GetBitmaps (i int )(*Bitmaps ,error ){const _adbe ="\u0042\u0069\u0074ma\u0070\u0073\u0041\u0072\u0072\u0061\u0079\u002e\u0047\u0065\u0074\u0042\u0069\u0074\u006d\u0061\u0070\u0073";
|
|
if _debae ==nil {return nil ,_e .Error (_adbe ,"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 (_debae .Values )-1{return nil ,_e .Errorf (_adbe ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
};return _debae .Values [i ],nil ;};func (_gcbc *Points )Add (pt *Points )error {const _ccdd ="\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0041\u0064\u0064";if _gcbc ==nil {return _e .Error (_ccdd ,"\u0070o\u0069n\u0074\u0073\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if pt ==nil {return _e .Error (_ccdd ,"a\u0072\u0067\u0075\u006d\u0065\u006et\u0020\u0070\u006f\u0069\u006e\u0074\u0073\u0020\u006eo\u0074\u0020\u0064e\u0066i\u006e\u0065\u0064");};*_gcbc =append (*_gcbc ,*pt ...);return nil ;};var (_cgcb =_cag ();_bgdfe =_eba ();
|
|
_cbaf =_ab (););func _gacb (_gfef ,_fdeb ,_abdf *Bitmap ,_dfgb int )(*Bitmap ,error ){const _fccad ="\u0073\u0065\u0065\u0064\u0046\u0069\u006c\u006c\u0042i\u006e\u0061\u0072\u0079";if _fdeb ==nil {return nil ,_e .Error (_fccad ,"s\u006fu\u0072\u0063\u0065\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");
|
|
};if _abdf ==nil {return nil ,_e .Error (_fccad ,"'\u006da\u0073\u006b\u0027\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");};if _dfgb !=4&&_dfgb !=8{return nil ,_e .Error (_fccad ,"\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 _cfegg error ;_gfef ,_cfegg =_fgca (_gfef ,_fdeb );if _cfegg !=nil {return nil ,_e .Wrap (_cfegg ,_fccad ,"\u0063o\u0070y\u0020\u0073\u006f\u0075\u0072c\u0065\u0020t\u006f\u0020\u0027\u0064\u0027");};_ggce :=_fdeb .createTemplate ();_abdf .setPadBits (0);
|
|
for _begf :=0;_begf < _aded ;_begf ++{_ggce ,_cfegg =_fgca (_ggce ,_gfef );if _cfegg !=nil {return nil ,_e .Wrapf (_cfegg ,_fccad ,"\u0069\u0074\u0065\u0072\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0064",_begf );};if _cfegg =_cddc (_gfef ,_abdf ,_dfgb );
|
|
_cfegg !=nil {return nil ,_e .Wrapf (_cfegg ,_fccad ,"\u0069\u0074\u0065\u0072\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0064",_begf );};if _ggce .Equals (_gfef ){break ;};};return _gfef ,nil ;};func (_aaba *Bitmap )And (s *Bitmap )(_deg *Bitmap ,_abd error ){const _ddgc ="\u0042\u0069\u0074\u006d\u0061\u0070\u002e\u0041\u006e\u0064";
|
|
if _aaba ==nil {return nil ,_e .Error (_ddgc ,"\u0027b\u0069t\u006d\u0061\u0070\u0020\u0027b\u0027\u0020i\u0073\u0020\u006e\u0069\u006c");};if s ==nil {return nil ,_e .Error (_ddgc ,"\u0062\u0069\u0074\u006d\u0061\u0070\u0020\u0027\u0073\u0027\u0020\u0069s\u0020\u006e\u0069\u006c");
|
|
};if !_aaba .SizesEqual (s ){_ea .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",_ddgc );
|
|
};if _deg ,_abd =_fgca (_deg ,_aaba );_abd !=nil {return nil ,_e .Wrap (_abd ,_ddgc ,"\u0063\u0061\u006e't\u0020\u0063\u0072\u0065\u0061\u0074\u0065\u0020\u0027\u0064\u0027\u0020\u0062\u0069\u0074\u006d\u0061\u0070");};if _abd =_deg .RasterOperation (0,0,_deg .Width ,_deg .Height ,PixSrcAndDst ,s ,0,0);
|
|
_abd !=nil {return nil ,_e .Wrap (_abd ,_ddgc ,"");};return _deg ,nil ;};func (_defg *Bitmap )removeBorderGeneral (_ebga ,_egbc ,_bgfd ,_ebe int )(*Bitmap ,error ){const _gegdf ="\u0072\u0065\u006d\u006fve\u0042\u006f\u0072\u0064\u0065\u0072\u0047\u0065\u006e\u0065\u0072\u0061\u006c";
|
|
if _ebga < 0||_egbc < 0||_bgfd < 0||_ebe < 0{return nil ,_e .Error (_gegdf ,"\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");};_bbgf ,_bgcc :=_defg .Width ,_defg .Height ;
|
|
_befc :=_bbgf -_ebga -_egbc ;_fcg :=_bgcc -_bgfd -_ebe ;if _befc <=0{return nil ,_e .Errorf (_gegdf ,"w\u0069\u0064\u0074\u0068: \u0025d\u0020\u006d\u0075\u0073\u0074 \u0062\u0065\u0020\u003e\u0020\u0030",_befc );};if _fcg <=0{return nil ,_e .Errorf (_gegdf ,"\u0068\u0065\u0069\u0067ht\u003a\u0020\u0025\u0064\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065\u0020\u003e \u0030",_fcg );
|
|
};_bfaf :=New (_befc ,_fcg );_bfaf .Color =_defg .Color ;_bfgg :=_bfaf .RasterOperation (0,0,_befc ,_fcg ,PixSrc ,_defg ,_ebga ,_bgfd );if _bfgg !=nil {return nil ,_e .Wrap (_bfgg ,_gegdf ,"");};return _bfaf ,nil ;};func (_gcec *Bitmap )RemoveBorder (borderSize int )(*Bitmap ,error ){if borderSize ==0{return _gcec .Copy (),nil ;
|
|
};_ece ,_eceb :=_gcec .removeBorderGeneral (borderSize ,borderSize ,borderSize ,borderSize );if _eceb !=nil {return nil ,_e .Wrap (_eceb ,"\u0052\u0065\u006do\u0076\u0065\u0042\u006f\u0072\u0064\u0065\u0072","");};return _ece ,nil ;};func (_aegg *ClassedPoints )xSortFunction ()func (_acf int ,_dfef int )bool {return func (_ggacf ,_cbafd int )bool {return _aegg .XAtIndex (_ggacf )< _aegg .XAtIndex (_cbafd )};
|
|
};func _fgdf (_abff *Bitmap )(_fgebb *Bitmap ,_eaac int ,_eada error ){const _adda ="\u0042i\u0074\u006d\u0061\u0070.\u0077\u006f\u0072\u0064\u004da\u0073k\u0042y\u0044\u0069\u006c\u0061\u0074\u0069\u006fn";if _abff ==nil {return nil ,0,_e .Errorf (_adda ,"\u0027\u0073\u0027\u0020bi\u0074\u006d\u0061\u0070\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006ee\u0064");
|
|
};var _ccd ,_adgb *Bitmap ;if _ccd ,_eada =_fgca (nil ,_abff );_eada !=nil {return nil ,0,_e .Wrap (_eada ,_adda ,"\u0063\u006f\u0070\u0079\u0020\u0027\u0073\u0027");};var (_bdfa [13]int ;_edd ,_cgfdf int ;);_abdb :=12;_ccff :=_df .NewNumSlice (_abdb +1);
|
|
_gdd :=_df .NewNumSlice (_abdb +1);var _agce *Boxes ;for _dfad :=0;_dfad <=_abdb ;_dfad ++{if _dfad ==0{if _adgb ,_eada =_fgca (nil ,_ccd );_eada !=nil {return nil ,0,_e .Wrap (_eada ,_adda ,"\u0066i\u0072\u0073\u0074\u0020\u0062\u006d2");};}else {if _adgb ,_eada =_gdeb (_ccd ,MorphProcess {Operation :MopDilation ,Arguments :[]int {2,1}});
|
|
_eada !=nil {return nil ,0,_e .Wrap (_eada ,_adda ,"\u0064\u0069\u006ca\u0074\u0069\u006f\u006e\u0020\u0062\u006d\u0032");};};if _agce ,_eada =_adgb .connComponentsBB (4);_eada !=nil {return nil ,0,_e .Wrap (_eada ,_adda ,"");};_bdfa [_dfad ]=len (*_agce );
|
|
_ccff .AddInt (_bdfa [_dfad ]);switch _dfad {case 0:_edd =_bdfa [0];default:_cgfdf =_bdfa [_dfad -1]-_bdfa [_dfad ];_gdd .AddInt (_cgfdf );};_ccd =_adgb ;};_gdf :=true ;_bdgf :=2;var _cacf ,_beeb int ;for _bage :=1;_bage < len (*_gdd );_bage ++{if _cacf ,_eada =_ccff .GetInt (_bage );
|
|
_eada !=nil {return nil ,0,_e .Wrap (_eada ,_adda ,"\u0043\u0068\u0065\u0063ki\u006e\u0067\u0020\u0062\u0065\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0069o\u006e");};if _gdf &&_cacf < int (0.3*float32 (_edd )){_bdgf =_bage +1;_gdf =false ;};if _cgfdf ,_eada =_gdd .GetInt (_bage );
|
|
_eada !=nil {return nil ,0,_e .Wrap (_eada ,_adda ,"\u0067\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u006ea\u0044\u0069\u0066\u0066");};if _cgfdf > _beeb {_beeb =_cgfdf ;};};_bcab :=_abff .XResolution ;if _bcab ==0{_bcab =150;};if _bcab > 110{_bdgf ++;
|
|
};if _bdgf < 2{_ea .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");_bdgf =2;
|
|
};_eaac =_bdgf +1;if _fgebb ,_eada =_egga (nil ,_abff ,_bdgf +1,1);_eada !=nil {return nil ,0,_e .Wrap (_eada ,_adda ,"\u0067\u0065\u0074\u0074in\u0067\u0020\u006d\u0061\u0073\u006b\u0020\u0066\u0061\u0069\u006c\u0065\u0064");};return _fgebb ,_eaac ,nil ;
|
|
};func (_faef *Bitmap )GetComponents (components Component ,maxWidth ,maxHeight int )(_ecfb *Bitmaps ,_gdcf *Boxes ,_gfdc error ){const _ebabc ="B\u0069t\u006d\u0061\u0070\u002e\u0047\u0065\u0074\u0043o\u006d\u0070\u006f\u006een\u0074\u0073";if _faef ==nil {return nil ,nil ,_e .Error (_ebabc ,"\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 ,_e .Error (_ebabc ,"\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 _faef .Zero (){_gdcf =&Boxes {};_ecfb =&Bitmaps {};return _ecfb ,_gdcf ,nil ;};switch components {case ComponentConn :_ecfb =&Bitmaps {};if _gdcf ,_gfdc =_faef .ConnComponents (_ecfb ,8);_gfdc !=nil {return nil ,nil ,_e .Wrap (_gfdc ,_ebabc ,"\u006e\u006f \u0070\u0072\u0065p\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");
|
|
};case ComponentCharacters :_acc ,_afca :=MorphSequence (_faef ,MorphProcess {Operation :MopClosing ,Arguments :[]int {1,6}});if _afca !=nil {return nil ,nil ,_e .Wrap (_afca ,_ebabc ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");
|
|
};if _ea .Log .IsLogLevel (_ea .LogLevelTrace ){_ea .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",_acc .String ());
|
|
};_aeg :=&Bitmaps {};_gdcf ,_afca =_acc .ConnComponents (_aeg ,8);if _afca !=nil {return nil ,nil ,_e .Wrap (_afca ,_ebabc ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");
|
|
};if _ea .Log .IsLogLevel (_ea .LogLevelTrace ){_ea .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",_aeg .String ());
|
|
};if _ecfb ,_afca =_aeg .ClipToBitmap (_faef );_afca !=nil {return nil ,nil ,_e .Wrap (_afca ,_ebabc ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");};case ComponentWords :_fgfd :=1;
|
|
var _bebg *Bitmap ;switch {case _faef .XResolution <=200:_bebg =_faef ;case _faef .XResolution <=400:_fgfd =2;_bebg ,_gfdc =_fb (_faef ,1,0,0,0);if _gfdc !=nil {return nil ,nil ,_e .Wrap (_gfdc ,_ebabc ,"w\u006f\u0072\u0064\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0020\u002d \u0078\u0072\u0065s\u003c=\u0034\u0030\u0030");
|
|
};default:_fgfd =4;_bebg ,_gfdc =_fb (_faef ,1,1,0,0);if _gfdc !=nil {return nil ,nil ,_e .Wrap (_gfdc ,_ebabc ,"\u0077\u006f\u0072\u0064 \u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073 \u002d \u0078\u0072\u0065\u0073\u0020\u003e\u00204\u0030\u0030");
|
|
};};_dab ,_ ,_beg :=_fgdf (_bebg );if _beg !=nil {return nil ,nil ,_e .Wrap (_beg ,_ebabc ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");};_cabc ,_beg :=_dbcc (_dab ,_fgfd );if _beg !=nil {return nil ,nil ,_e .Wrap (_beg ,_ebabc ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");
|
|
};_eggc :=&Bitmaps {};if _gdcf ,_beg =_cabc .ConnComponents (_eggc ,4);_beg !=nil {return nil ,nil ,_e .Wrap (_beg ,_ebabc ,"\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 _ecfb ,_beg =_eggc .ClipToBitmap (_faef );_beg !=nil {return nil ,nil ,_e .Wrap (_beg ,_ebabc ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");};};_ecfb ,_gfdc =_ecfb .SelectBySize (maxWidth ,maxHeight ,LocSelectIfBoth ,SizeSelectIfLTE );
|
|
if _gfdc !=nil {return nil ,nil ,_e .Wrap (_gfdc ,_ebabc ,"");};_gdcf ,_gfdc =_gdcf .SelectBySize (maxWidth ,maxHeight ,LocSelectIfBoth ,SizeSelectIfLTE );if _gfdc !=nil {return nil ,nil ,_e .Wrap (_gfdc ,_ebabc ,"");};return _ecfb ,_gdcf ,nil ;};type LocationFilter int ;
|
|
func _ffde (_bface *Bitmap ,_efgb *Bitmap ,_bbfg *Selection ,_dcd **Bitmap )(*Bitmap ,error ){const _fcef ="\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u004d\u006f\u0072\u0070\u0068A\u0072\u0067\u0073\u0031";if _efgb ==nil {return nil ,_e .Error (_fcef ,"\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 _bbfg ==nil {return nil ,_e .Error (_fcef ,"\u004d\u006f\u0072\u0068p\u0041\u0072\u0067\u0073\u0031\u0020\u0027\u0073\u0065\u006c'\u0020n\u006f\u0074\u0020\u0064\u0065\u0066\u0069n\u0065\u0064");};_edae ,_cdeab :=_bbfg .Height ,_bbfg .Width ;if _edae ==0||_cdeab ==0{return nil ,_e .Error (_fcef ,"\u0073\u0065\u006c\u0065ct\u0069\u006f\u006e\u0020\u006f\u0066\u0020\u0073\u0069\u007a\u0065\u0020\u0030");
|
|
};if _bface ==nil {_bface =_efgb .createTemplate ();*_dcd =_efgb ;return _bface ,nil ;};_bface .Width =_efgb .Width ;_bface .Height =_efgb .Height ;_bface .RowStride =_efgb .RowStride ;_bface .Color =_efgb .Color ;_bface .Data =make ([]byte ,_efgb .RowStride *_efgb .Height );
|
|
if _bface ==_efgb {*_dcd =_efgb .Copy ();}else {*_dcd =_efgb ;};return _bface ,nil ;};const (ComponentConn Component =iota ;ComponentCharacters ;ComponentWords ;);func (_daaf *Bitmap )resizeImageData (_gggff *Bitmap )error {if _gggff ==nil {return _e .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 _daaf .SizesEqual (_gggff ){return nil ;};_daaf .Data =make ([]byte ,len (_gggff .Data ));_daaf .Width =_gggff .Width ;_daaf .Height =_gggff .Height ;_daaf .RowStride =_gggff .RowStride ;return nil ;};func _gceb (_becgda *_df .Stack )(_edddd *fillSegment ,_cfgdg error ){const _abfbf ="\u0070\u006f\u0070\u0046\u0069\u006c\u006c\u0053\u0065g\u006d\u0065\u006e\u0074";
|
|
if _becgda ==nil {return nil ,_e .Error (_abfbf ,"\u006ei\u006c \u0073\u0074\u0061\u0063\u006b \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");};if _becgda .Aux ==nil {return nil ,_e .Error (_abfbf ,"a\u0075x\u0053\u0074\u0061\u0063\u006b\u0020\u006e\u006ft\u0020\u0064\u0065\u0066in\u0065\u0064");
|
|
};_ddcc ,_fbc :=_becgda .Pop ();if !_fbc {return nil ,nil ;};_aacb ,_fbc :=_ddcc .(*fillSegment );if !_fbc {return nil ,_e .Error (_abfbf ,"\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");
|
|
};_edddd =&fillSegment {_aacb ._dabcf ,_aacb ._baebc ,_aacb ._cbaab +_aacb ._gaba ,_aacb ._gaba };_becgda .Aux .Push (_aacb );return _edddd ,nil ;};func Blit (src *Bitmap ,dst *Bitmap ,x ,y int ,op CombinationOperator )error {var _fce ,_dcfdg int ;_cbb :=src .RowStride -1;
|
|
if x < 0{_dcfdg =-x ;x =0;}else if x +src .Width > dst .Width {_cbb -=src .Width +x -dst .Width ;};if y < 0{_fce =-y ;y =0;_dcfdg +=src .RowStride ;_cbb +=src .RowStride ;}else if y +src .Height > dst .Height {_fce =src .Height +y -dst .Height ;};var (_gccb int ;
|
|
_fbg error ;);_edgf :=x &0x07;_ffgg :=8-_edgf ;_dgae :=src .Width &0x07;_befb :=_ffgg -_dgae ;_ggf :=_ffgg &0x07!=0;_deba :=src .Width <=((_cbb -_dcfdg )<<3)+_ffgg ;_fdc :=dst .GetByteIndex (x ,y );_ebfe :=_fce +dst .Height ;if src .Height > _ebfe {_gccb =_ebfe ;
|
|
}else {_gccb =src .Height ;};switch {case !_ggf :_fbg =_agbf (src ,dst ,_fce ,_gccb ,_fdc ,_dcfdg ,_cbb ,op );case _deba :_fbg =_bggg (src ,dst ,_fce ,_gccb ,_fdc ,_dcfdg ,_cbb ,_befb ,_edgf ,_ffgg ,op );default:_fbg =_fedd (src ,dst ,_fce ,_gccb ,_fdc ,_dcfdg ,_cbb ,_befb ,_edgf ,_ffgg ,op ,_dgae );
|
|
};return _fbg ;};func (_cefc *Bitmap )Zero ()bool {_ffab :=_cefc .Width /8;_gccd :=_cefc .Width &7;var _fcca byte ;if _gccd !=0{_fcca =byte (0xff<<uint (8-_gccd ));};var _bdgd ,_fed ,_dac int ;for _fed =0;_fed < _cefc .Height ;_fed ++{_bdgd =_cefc .RowStride *_fed ;
|
|
for _dac =0;_dac < _ffab ;_dac ,_bdgd =_dac +1,_bdgd +1{if _cefc .Data [_bdgd ]!=0{return false ;};};if _gccd > 0{if _cefc .Data [_bdgd ]&_fcca !=0{return false ;};};};return true ;};func (_acgg *ClassedPoints )GroupByY ()([]*ClassedPoints ,error ){const _faeg ="\u0043\u006c\u0061\u0073se\u0064\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0072\u006f\u0075\u0070\u0042y\u0059";
|
|
if _fbac :=_acgg .validateIntSlice ();_fbac !=nil {return nil ,_e .Wrap (_fbac ,_faeg ,"");};if _acgg .IntSlice .Size ()==0{return nil ,_e .Error (_faeg ,"\u004e\u006f\u0020\u0063la\u0073\u0073\u0065\u0073\u0020\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064");
|
|
};_acgg .SortByY ();var (_fcf []*ClassedPoints ;_bfgd int ;);_cgad :=-1;var _bade *ClassedPoints ;for _fffe :=0;_fffe < len (_acgg .IntSlice );_fffe ++{_bfgd =int (_acgg .YAtIndex (_fffe ));if _bfgd !=_cgad {_bade =&ClassedPoints {Points :_acgg .Points };
|
|
_cgad =_bfgd ;_fcf =append (_fcf ,_bade );};_bade .IntSlice =append (_bade .IntSlice ,_acgg .IntSlice [_fffe ]);};for _ ,_cfef :=range _fcf {_cfef .SortByX ();};return _fcf ,nil ;};func (_aabaa *Bitmap )GetByteIndex (x ,y int )int {return y *_aabaa .RowStride +(x >>3)};
|
|
func (_bgd *Bitmap )GetBitOffset (x int )int {return x &0x07};var _ _f .Interface =&ClassedPoints {};func (_deef *byWidth )Len ()int {return len (_deef .Values )};func CorrelationScoreThresholded (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab ,downcount []int ,scoreThreshold float32 )(bool ,error ){const _cfae ="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 ,_e .Error (_cfae ,"\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 ,_e .Error (_cfae ,"\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 ,_e .Error (_cfae ,"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 ,_e .Error (_cfae ,"\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 ,_e .Error (_cfae ,"p\u0072\u006f\u0076\u0069de\u0064 \u006e\u0069\u006c\u0020\u0027s\u0075\u006d\u0074\u0061\u0062\u0027");
|
|
};_cfgb ,_fbdc :=bm1 .Width ,bm1 .Height ;_agdab ,_fff :=bm2 .Width ,bm2 .Height ;if _df .Abs (_cfgb -_agdab )> maxDiffW {return false ,nil ;};if _df .Abs (_fbdc -_fff )> maxDiffH {return false ,nil ;};_fgag :=int (delX +_df .Sign (delX )*0.5);_ecfa :=int (delY +_df .Sign (delY )*0.5);
|
|
_adae :=int (_eg .Ceil (_eg .Sqrt (float64 (scoreThreshold )*float64 (area1 )*float64 (area2 ))));_gfcbc :=bm2 .RowStride ;_bdcd :=_gbae (_ecfa ,0);_efgf :=_dcae (_fff +_ecfa ,_fbdc );_fede :=bm1 .RowStride *_bdcd ;_gbeed :=bm2 .RowStride *(_bdcd -_ecfa );
|
|
var _eddd int ;if _efgf <=_fbdc {_eddd =downcount [_efgf -1];};_debd :=_gbae (_fgag ,0);_bdgc :=_dcae (_agdab +_fgag ,_cfgb );var _edfd ,_ffbd int ;if _fgag >=8{_edfd =_fgag >>3;_fede +=_edfd ;_debd -=_edfd <<3;_bdgc -=_edfd <<3;_fgag &=7;}else if _fgag <=-8{_ffbd =-((_fgag +7)>>3);
|
|
_gbeed +=_ffbd ;_gfcbc -=_ffbd ;_fgag +=_ffbd <<3;};var (_dbbg ,_bgeg ,_cfac int ;_debg ,_dfbf ,_ccb byte ;);if _debd >=_bdgc ||_bdcd >=_efgf {return false ,nil ;};_aeec :=(_bdgc +7)>>3;switch {case _fgag ==0:for _bgeg =_bdcd ;_bgeg < _efgf ;_bgeg ,_fede ,_gbeed =_bgeg +1,_fede +bm1 .RowStride ,_gbeed +bm2 .RowStride {for _cfac =0;
|
|
_cfac < _aeec ;_cfac ++{_debg =bm1 .Data [_fede +_cfac ]&bm2 .Data [_gbeed +_cfac ];_dbbg +=tab [_debg ];};if _dbbg >=_adae {return true ,nil ;};if _adef :=_dbbg +downcount [_bgeg ]-_eddd ;_adef < _adae {return false ,nil ;};};case _fgag > 0&&_gfcbc < _aeec :for _bgeg =_bdcd ;
|
|
_bgeg < _efgf ;_bgeg ,_fede ,_gbeed =_bgeg +1,_fede +bm1 .RowStride ,_gbeed +bm2 .RowStride {_dfbf =bm1 .Data [_fede ];_ccb =bm2 .Data [_gbeed ]>>uint (_fgag );_debg =_dfbf &_ccb ;_dbbg +=tab [_debg ];for _cfac =1;_cfac < _gfcbc ;_cfac ++{_dfbf =bm1 .Data [_fede +_cfac ];
|
|
_ccb =bm2 .Data [_gbeed +_cfac ]>>uint (_fgag )|bm2 .Data [_gbeed +_cfac -1]<<uint (8-_fgag );_debg =_dfbf &_ccb ;_dbbg +=tab [_debg ];};_dfbf =bm1 .Data [_fede +_cfac ];_ccb =bm2 .Data [_gbeed +_cfac -1]<<uint (8-_fgag );_debg =_dfbf &_ccb ;_dbbg +=tab [_debg ];
|
|
if _dbbg >=_adae {return true ,nil ;}else if _dbbg +downcount [_bgeg ]-_eddd < _adae {return false ,nil ;};};case _fgag > 0&&_gfcbc >=_aeec :for _bgeg =_bdcd ;_bgeg < _efgf ;_bgeg ,_fede ,_gbeed =_bgeg +1,_fede +bm1 .RowStride ,_gbeed +bm2 .RowStride {_dfbf =bm1 .Data [_fede ];
|
|
_ccb =bm2 .Data [_gbeed ]>>uint (_fgag );_debg =_dfbf &_ccb ;_dbbg +=tab [_debg ];for _cfac =1;_cfac < _aeec ;_cfac ++{_dfbf =bm1 .Data [_fede +_cfac ];_ccb =bm2 .Data [_gbeed +_cfac ]>>uint (_fgag );_ccb |=bm2 .Data [_gbeed +_cfac -1]<<uint (8-_fgag );
|
|
_debg =_dfbf &_ccb ;_dbbg +=tab [_debg ];};if _dbbg >=_adae {return true ,nil ;}else if _dbbg +downcount [_bgeg ]-_eddd < _adae {return false ,nil ;};};case _aeec < _gfcbc :for _bgeg =_bdcd ;_bgeg < _efgf ;_bgeg ,_fede ,_gbeed =_bgeg +1,_fede +bm1 .RowStride ,_gbeed +bm2 .RowStride {for _cfac =0;
|
|
_cfac < _aeec ;_cfac ++{_dfbf =bm1 .Data [_fede +_cfac ];_ccb =bm2 .Data [_gbeed +_cfac ]<<uint (-_fgag );_ccb |=bm2 .Data [_gbeed +_cfac +1]>>uint (8+_fgag );_debg =_dfbf &_ccb ;_dbbg +=tab [_debg ];};if _dbbg >=_adae {return true ,nil ;}else if _agcb :=_dbbg +downcount [_bgeg ]-_eddd ;
|
|
_agcb < _adae {return false ,nil ;};};case _gfcbc >=_aeec :for _bgeg =_bdcd ;_bgeg < _efgf ;_bgeg ,_fede ,_gbeed =_bgeg +1,_fede +bm1 .RowStride ,_gbeed +bm2 .RowStride {for _cfac =0;_cfac < _aeec ;_cfac ++{_dfbf =bm1 .Data [_fede +_cfac ];_ccb =bm2 .Data [_gbeed +_cfac ]<<uint (-_fgag );
|
|
_ccb |=bm2 .Data [_gbeed +_cfac +1]>>uint (8+_fgag );_debg =_dfbf &_ccb ;_dbbg +=tab [_debg ];};_dfbf =bm1 .Data [_fede +_cfac ];_ccb =bm2 .Data [_gbeed +_cfac ]<<uint (-_fgag );_debg =_dfbf &_ccb ;_dbbg +=tab [_debg ];if _dbbg >=_adae {return true ,nil ;
|
|
}else if _dbbg +downcount [_bgeg ]-_eddd < _adae {return false ,nil ;};};};_faed :=float32 (_dbbg )*float32 (_dbbg )/(float32 (area1 )*float32 (area2 ));if _faed >=scoreThreshold {_ea .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",_dbbg ,_adae ,_faed ,scoreThreshold );
|
|
};return false ,nil ;};func (_fddc *Boxes )SelectBySize (width ,height int ,tp LocationFilter ,relation SizeComparison )(_edefc *Boxes ,_ebeg error ){const _acg ="\u0042o\u0078e\u0073\u002e\u0053\u0065\u006ce\u0063\u0074B\u0079\u0053\u0069\u007a\u0065";
|
|
if _fddc ==nil {return nil ,_e .Error (_acg ,"b\u006f\u0078\u0065\u0073 '\u0062'\u0020\u006e\u006f\u0074\u0020d\u0065\u0066\u0069\u006e\u0065\u0064");};if len (*_fddc )==0{return _fddc ,nil ;};switch tp {case LocSelectWidth ,LocSelectHeight ,LocSelectIfEither ,LocSelectIfBoth :default:return nil ,_e .Errorf (_acg ,"\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 ,_e .Errorf (_acg ,"i\u006e\u0076\u0061\u006c\u0069\u0064 \u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u0020t\u0079\u0070\u0065:\u0020'\u0025\u0064\u0027",tp );
|
|
};_fbge :=_fddc .makeSizeIndicator (width ,height ,tp ,relation );_efeg ,_ebeg :=_fddc .selectWithIndicator (_fbge );if _ebeg !=nil {return nil ,_e .Wrap (_ebeg ,_acg ,"");};return _efeg ,nil ;};func _effbb (_fdac ,_cbabg *Bitmap ,_gcb ,_fegb int )(*Bitmap ,error ){const _fdbb ="\u0063\u006c\u006f\u0073\u0065\u0053\u0061\u0066\u0065B\u0072\u0069\u0063\u006b";
|
|
if _cbabg ==nil {return nil ,_e .Error (_fdbb ,"\u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _gcb < 1||_fegb < 1{return nil ,_e .Error (_fdbb ,"\u0068s\u0069\u007a\u0065\u0020\u0061\u006e\u0064\u0020\u0076\u0073\u0069z\u0065\u0020\u006e\u006f\u0074\u0020\u003e\u003d\u0020\u0031");
|
|
};if _gcb ==1&&_fegb ==1{return _fgca (_fdac ,_cbabg );};if MorphBC ==SymmetricMorphBC {_fbfdg ,_ccg :=_egga (_fdac ,_cbabg ,_gcb ,_fegb );if _ccg !=nil {return nil ,_e .Wrap (_ccg ,_fdbb ,"\u0053\u0079m\u006d\u0065\u0074r\u0069\u0063\u004d\u006f\u0072\u0070\u0068\u0042\u0043");
|
|
};return _fbfdg ,nil ;};_fagg :=_gbae (_gcb /2,_fegb /2);_dbgdd :=8*((_fagg +7)/8);_beaf ,_adbb :=_cbabg .AddBorder (_dbgdd ,0);if _adbb !=nil {return nil ,_e .Wrapf (_adbb ,_fdbb ,"\u0042\u006f\u0072\u0064\u0065\u0072\u0053\u0069\u007ae\u003a\u0020\u0025\u0064",_dbgdd );
|
|
};var _cbde ,_cgeb *Bitmap ;if _gcb ==1||_fegb ==1{_cec :=SelCreateBrick (_fegb ,_gcb ,_fegb /2,_gcb /2,SelHit );_cbde ,_adbb =_agecg (nil ,_beaf ,_cec );if _adbb !=nil {return nil ,_e .Wrap (_adbb ,_fdbb ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};}else {_gegf :=SelCreateBrick (1,_gcb ,0,_gcb /2,SelHit );_faee ,_gdge :=_ebgfa (nil ,_beaf ,_gegf );if _gdge !=nil {return nil ,_e .Wrap (_gdge ,_fdbb ,"\u0072\u0065\u0067\u0075la\u0072\u0020\u002d\u0020\u0066\u0069\u0072\u0073\u0074\u0020\u0064\u0069\u006c\u0061t\u0065");
|
|
};_efea :=SelCreateBrick (_fegb ,1,_fegb /2,0,SelHit );_cbde ,_gdge =_ebgfa (nil ,_faee ,_efea );if _gdge !=nil {return nil ,_e .Wrap (_gdge ,_fdbb ,"\u0072\u0065\u0067ul\u0061\u0072\u0020\u002d\u0020\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
};if _ ,_gdge =_ebgfb (_faee ,_cbde ,_gegf );_gdge !=nil {return nil ,_e .Wrap (_gdge ,_fdbb ,"r\u0065\u0067\u0075\u006car\u0020-\u0020\u0066\u0069\u0072\u0073t\u0020\u0065\u0072\u006f\u0064\u0065");};if _ ,_gdge =_ebgfb (_cbde ,_faee ,_efea );_gdge !=nil {return nil ,_e .Wrap (_gdge ,_fdbb ,"\u0072\u0065\u0067\u0075la\u0072\u0020\u002d\u0020\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0065\u0072\u006fd\u0065");
|
|
};};if _cgeb ,_adbb =_cbde .RemoveBorder (_dbgdd );_adbb !=nil {return nil ,_e .Wrap (_adbb ,_fdbb ,"\u0072e\u0067\u0075\u006c\u0061\u0072");};if _fdac ==nil {return _cgeb ,nil ;};if _ ,_adbb =_fgca (_fdac ,_cgeb );_adbb !=nil {return nil ,_adbb ;};return _fdac ,nil ;
|
|
};func _cfbd (_ecee ,_dge *Bitmap ,_fdae ,_eeag ,_gdcc uint ,_adcg ,_add int ,_beed bool ,_ggcd ,_dfaa int )error {for _efab :=_adcg ;_efab < _add ;_efab ++{if _ggcd +1< len (_ecee .Data ){_ecfc :=_efab +1==_add ;_eaee ,_ebfde :=_ecee .GetByte (_ggcd );
|
|
if _ebfde !=nil {return _ebfde ;};_ggcd ++;_eaee <<=_fdae ;_eacf ,_ebfde :=_ecee .GetByte (_ggcd );if _ebfde !=nil {return _ebfde ;};_eacf >>=_eeag ;_dbc :=_eaee |_eacf ;if _ecfc &&!_beed {_dbc =_dbe (_gdcc ,_dbc );};_ebfde =_dge .SetByte (_dfaa ,_dbc );
|
|
if _ebfde !=nil {return _ebfde ;};_dfaa ++;if _ecfc &&_beed {_cfge ,_fddd :=_ecee .GetByte (_ggcd );if _fddd !=nil {return _fddd ;};_cfge <<=_fdae ;_dbc =_dbe (_gdcc ,_cfge );if _fddd =_dge .SetByte (_dfaa ,_dbc );_fddd !=nil {return _fddd ;};};continue ;
|
|
};_acag ,_ggcfd :=_ecee .GetByte (_ggcd );if _ggcfd !=nil {_ea .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",_ggcd ,_ggcfd );
|
|
return _ggcfd ;};_acag <<=_fdae ;_ggcd ++;_ggcfd =_dge .SetByte (_dfaa ,_acag );if _ggcfd !=nil {return _ggcfd ;};_dfaa ++;};return nil ;};func (_egd Points )GetIntY (i int )(int ,error ){if i >=len (_egd ){return 0,_e .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 (_egd [i ].Y ),nil ;};type SizeSelection int ;func NewWithData (width ,height int ,data []byte )(*Bitmap ,error ){const _dga ="N\u0065\u0077\u0057\u0069\u0074\u0068\u0044\u0061\u0074\u0061";_cac :=_bef (width ,height );_cac .Data =data ;if len (data )< height *_cac .RowStride {return nil ,_e .Errorf (_dga ,"\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 *_cac .RowStride );
|
|
};return _cac ,nil ;};type CombinationOperator int ;func TstPSymbol (t *_ca .T )*Bitmap {t .Helper ();_abed :=New (5,8);_b .NoError (t ,_abed .SetPixel (0,0,1));_b .NoError (t ,_abed .SetPixel (1,0,1));_b .NoError (t ,_abed .SetPixel (2,0,1));_b .NoError (t ,_abed .SetPixel (3,0,1));
|
|
_b .NoError (t ,_abed .SetPixel (4,1,1));_b .NoError (t ,_abed .SetPixel (0,1,1));_b .NoError (t ,_abed .SetPixel (4,2,1));_b .NoError (t ,_abed .SetPixel (0,2,1));_b .NoError (t ,_abed .SetPixel (4,3,1));_b .NoError (t ,_abed .SetPixel (0,3,1));_b .NoError (t ,_abed .SetPixel (0,4,1));
|
|
_b .NoError (t ,_abed .SetPixel (1,4,1));_b .NoError (t ,_abed .SetPixel (2,4,1));_b .NoError (t ,_abed .SetPixel (3,4,1));_b .NoError (t ,_abed .SetPixel (0,5,1));_b .NoError (t ,_abed .SetPixel (0,6,1));_b .NoError (t ,_abed .SetPixel (0,7,1));return _abed ;
|
|
};const (_ LocationFilter =iota ;LocSelectWidth ;LocSelectHeight ;LocSelectXVal ;LocSelectYVal ;LocSelectIfEither ;LocSelectIfBoth ;);func (_afd Points )GetIntX (i int )(int ,error ){if i >=len (_afd ){return 0,_e .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 (_afd [i ].X ),nil ;};func (_ccdg *Bitmaps )AddBitmap (bm *Bitmap ){_ccdg .Values =append (_ccdg .Values ,bm )};func _dbe (_geeb uint ,_edc byte )byte {return _edc >>_geeb <<_geeb };func CombineBytes (oldByte ,newByte byte ,op CombinationOperator )byte {return _gbf (oldByte ,newByte ,op );
|
|
};func TstOSymbol (t *_ca .T ,scale ...int )*Bitmap {_bdggb ,_fdegb :=NewWithData (4,5,[]byte {0xF0,0x90,0x90,0x90,0xF0});_b .NoError (t ,_fdegb );return TstGetScaledSymbol (t ,_bdggb ,scale ...);};func (_daag *ClassedPoints )YAtIndex (i int )float32 {return (*_daag .Points )[_daag .IntSlice [i ]].Y };
|
|
func TstWordBitmap (t *_ca .T ,scale ...int )*Bitmap {_afcg :=1;if len (scale )> 0{_afcg =scale [0];};_gfbea :=3;_agab :=9+7+15+2*_gfbea ;_efbb :=5+_gfbea +5;_cdbd :=New (_agab *_afcg ,_efbb *_afcg );_cedd :=&Bitmaps {};var _edcg *int ;_gfbea *=_afcg ;
|
|
_faabb :=0;_edcg =&_faabb ;_ebfeb :=0;_geec :=TstDSymbol (t ,scale ...);TstAddSymbol (t ,_cedd ,_geec ,_edcg ,_ebfeb ,1*_afcg );_geec =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_cedd ,_geec ,_edcg ,_ebfeb ,_gfbea );_geec =TstISymbol (t ,scale ...);TstAddSymbol (t ,_cedd ,_geec ,_edcg ,_ebfeb ,1*_afcg );
|
|
_geec =TstTSymbol (t ,scale ...);TstAddSymbol (t ,_cedd ,_geec ,_edcg ,_ebfeb ,_gfbea );_geec =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_cedd ,_geec ,_edcg ,_ebfeb ,1*_afcg );_geec =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_cedd ,_geec ,_edcg ,_ebfeb ,1*_afcg );
|
|
_geec =TstWSymbol (t ,scale ...);TstAddSymbol (t ,_cedd ,_geec ,_edcg ,_ebfeb ,0);*_edcg =0;_ebfeb =5*_afcg +_gfbea ;_geec =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_cedd ,_geec ,_edcg ,_ebfeb ,1*_afcg );_geec =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_cedd ,_geec ,_edcg ,_ebfeb ,_gfbea );
|
|
_geec =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_cedd ,_geec ,_edcg ,_ebfeb ,1*_afcg );_geec =TstESymbol (t ,scale ...);TstAddSymbol (t ,_cedd ,_geec ,_edcg ,_ebfeb ,1*_afcg );_geec =TstVSymbol (t ,scale ...);TstAddSymbol (t ,_cedd ,_geec ,_edcg ,_ebfeb ,1*_afcg );
|
|
_geec =TstESymbol (t ,scale ...);TstAddSymbol (t ,_cedd ,_geec ,_edcg ,_ebfeb ,1*_afcg );_geec =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_cedd ,_geec ,_edcg ,_ebfeb ,0);TstWriteSymbols (t ,_cedd ,_cdbd );return _cdbd ;};func (_egace *byWidth )Swap (i ,j int ){_egace .Values [i ],_egace .Values [j ]=_egace .Values [j ],_egace .Values [i ];
|
|
if _egace .Boxes !=nil {_egace .Boxes [i ],_egace .Boxes [j ]=_egace .Boxes [j ],_egace .Boxes [i ];};};func NewClassedPoints (points *Points ,classes _df .IntSlice )(*ClassedPoints ,error ){const _gbdad ="\u004e\u0065w\u0043\u006c\u0061s\u0073\u0065\u0064\u0050\u006f\u0069\u006e\u0074\u0073";
|
|
if points ==nil {return nil ,_e .Error (_gbdad ,"\u0070\u0072\u006f\u0076id\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0070\u006f\u0069\u006e\u0074\u0073");};if classes ==nil {return nil ,_e .Error (_gbdad ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0063\u006c\u0061ss\u0065\u0073");
|
|
};_eedfb :=&ClassedPoints {Points :points ,IntSlice :classes };if _eebfc :=_eedfb .validateIntSlice ();_eebfc !=nil {return nil ,_e .Wrap (_eebfc ,_gbdad ,"");};return _eedfb ,nil ;};func TstWriteSymbols (t *_ca .T ,bms *Bitmaps ,src *Bitmap ){for _adbeg :=0;
|
|
_adbeg < bms .Size ();_adbeg ++{_gaadc :=bms .Values [_adbeg ];_gcbg :=bms .Boxes [_adbeg ];_adba :=src .RasterOperation (_gcbg .Min .X ,_gcbg .Min .Y ,_gaadc .Width ,_gaadc .Height ,PixSrc ,_gaadc ,0,0);_b .NoError (t ,_adba );};};func (_cbgd *Selection )findMaxTranslations ()(_cfefg ,_dafd ,_bgbe ,_ccgb int ){for _aefg :=0;
|
|
_aefg < _cbgd .Height ;_aefg ++{for _daeb :=0;_daeb < _cbgd .Width ;_daeb ++{if _cbgd .Data [_aefg ][_daeb ]==SelHit {_cfefg =_gbae (_cfefg ,_cbgd .Cx -_daeb );_dafd =_gbae (_dafd ,_cbgd .Cy -_aefg );_bgbe =_gbae (_bgbe ,_daeb -_cbgd .Cx );_ccgb =_gbae (_ccgb ,_aefg -_cbgd .Cy );
|
|
};};};return _cfefg ,_dafd ,_bgbe ,_ccgb ;};func (_gcadg *Bitmaps )SelectBySize (width ,height int ,tp LocationFilter ,relation SizeComparison )(_gbde *Bitmaps ,_ecab error ){const _dfbb ="B\u0069t\u006d\u0061\u0070\u0073\u002e\u0053\u0065\u006ce\u0063\u0074\u0042\u0079Si\u007a\u0065";
|
|
if _gcadg ==nil {return nil ,_e .Error (_dfbb ,"\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 ,_e .Errorf (_dfbb ,"\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 ,_e .Errorf (_dfbb ,"\u0069\u006e\u0076\u0061li\u0064\u0020\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0027\u0025d\u0027",relation );
|
|
};_dbgc ,_ecab :=_gcadg .makeSizeIndicator (width ,height ,tp ,relation );if _ecab !=nil {return nil ,_e .Wrap (_ecab ,_dfbb ,"");};_gbde ,_ecab =_gcadg .selectByIndicator (_dbgc );if _ecab !=nil {return nil ,_e .Wrap (_ecab ,_dfbb ,"");};return _gbde ,nil ;
|
|
};func (_fdda *Bitmap )SetDefaultPixel (){for _gdbg :=range _fdda .Data {_fdda .Data [_gdbg ]=byte (0xff);};};func _cag ()(_bdg [256]uint16 ){for _dca :=0;_dca < 256;_dca ++{if _dca &0x01!=0{_bdg [_dca ]|=0x3;};if _dca &0x02!=0{_bdg [_dca ]|=0xc;};if _dca &0x04!=0{_bdg [_dca ]|=0x30;
|
|
};if _dca &0x08!=0{_bdg [_dca ]|=0xc0;};if _dca &0x10!=0{_bdg [_dca ]|=0x300;};if _dca &0x20!=0{_bdg [_dca ]|=0xc00;};if _dca &0x40!=0{_bdg [_dca ]|=0x3000;};if _dca &0x80!=0{_bdg [_dca ]|=0xc000;};};return _bdg ;};func TstWordBitmapWithSpaces (t *_ca .T ,scale ...int )*Bitmap {_agfc :=1;
|
|
if len (scale )> 0{_agfc =scale [0];};_dffab :=3;_gefc :=9+7+15+2*_dffab +2*_dffab ;_fade :=5+_dffab +5+2*_dffab ;_dffg :=New (_gefc *_agfc ,_fade *_agfc );_geef :=&Bitmaps {};var _dbcg *int ;_dffab *=_agfc ;_dfbbc :=_dffab ;_dbcg =&_dfbbc ;_gfac :=_dffab ;
|
|
_gaac :=TstDSymbol (t ,scale ...);TstAddSymbol (t ,_geef ,_gaac ,_dbcg ,_gfac ,1*_agfc );_gaac =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_geef ,_gaac ,_dbcg ,_gfac ,_dffab );_gaac =TstISymbol (t ,scale ...);TstAddSymbol (t ,_geef ,_gaac ,_dbcg ,_gfac ,1*_agfc );
|
|
_gaac =TstTSymbol (t ,scale ...);TstAddSymbol (t ,_geef ,_gaac ,_dbcg ,_gfac ,_dffab );_gaac =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_geef ,_gaac ,_dbcg ,_gfac ,1*_agfc );_gaac =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_geef ,_gaac ,_dbcg ,_gfac ,1*_agfc );
|
|
_gaac =TstWSymbol (t ,scale ...);TstAddSymbol (t ,_geef ,_gaac ,_dbcg ,_gfac ,0);*_dbcg =_dffab ;_gfac =5*_agfc +_dffab ;_gaac =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_geef ,_gaac ,_dbcg ,_gfac ,1*_agfc );_gaac =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_geef ,_gaac ,_dbcg ,_gfac ,_dffab );
|
|
_gaac =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_geef ,_gaac ,_dbcg ,_gfac ,1*_agfc );_gaac =TstESymbol (t ,scale ...);TstAddSymbol (t ,_geef ,_gaac ,_dbcg ,_gfac ,1*_agfc );_gaac =TstVSymbol (t ,scale ...);TstAddSymbol (t ,_geef ,_gaac ,_dbcg ,_gfac ,1*_agfc );
|
|
_gaac =TstESymbol (t ,scale ...);TstAddSymbol (t ,_geef ,_gaac ,_dbcg ,_gfac ,1*_agfc );_gaac =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_geef ,_gaac ,_dbcg ,_gfac ,0);TstWriteSymbols (t ,_geef ,_dffg );return _dffg ;};func (_bgfc Points )Size ()int {return len (_bgfc )};
|
|
func (_degbc *Bitmaps )ClipToBitmap (s *Bitmap )(*Bitmaps ,error ){const _bebd ="B\u0069t\u006d\u0061\u0070\u0073\u002e\u0043\u006c\u0069p\u0054\u006f\u0042\u0069tm\u0061\u0070";if _degbc ==nil {return nil ,_e .Error (_bebd ,"\u0042\u0069\u0074\u006dap\u0073\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};if s ==nil {return nil ,_e .Error (_bebd ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};_dcde :=len (_degbc .Values );_bedg :=&Bitmaps {Values :make ([]*Bitmap ,_dcde ),Boxes :make ([]*_eb .Rectangle ,_dcde )};
|
|
var (_gfgdg ,_ecef *Bitmap ;_afff *_eb .Rectangle ;_dgacg error ;);for _afbb :=0;_afbb < _dcde ;_afbb ++{if _gfgdg ,_dgacg =_degbc .GetBitmap (_afbb );_dgacg !=nil {return nil ,_e .Wrap (_dgacg ,_bebd ,"");};if _afff ,_dgacg =_degbc .GetBox (_afbb );_dgacg !=nil {return nil ,_e .Wrap (_dgacg ,_bebd ,"");
|
|
};if _ecef ,_dgacg =s .clipRectangle (_afff ,nil );_dgacg !=nil {return nil ,_e .Wrap (_dgacg ,_bebd ,"");};if _ecef ,_dgacg =_ecef .And (_gfgdg );_dgacg !=nil {return nil ,_e .Wrap (_dgacg ,_bebd ,"");};_bedg .Values [_afbb ]=_ecef ;_bedg .Boxes [_afbb ]=_afff ;
|
|
};return _bedg ,nil ;};func (_bdgeg *Bitmap )connComponentsBitmapsBB (_bfbf *Bitmaps ,_fbdd int )(_baaa *Boxes ,_fcea error ){const _aea ="\u0063\u006f\u006enC\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074\u0073\u0042\u0069\u0074\u006d\u0061\u0070\u0073\u0042\u0042";
|
|
if _fbdd !=4&&_fbdd !=8{return nil ,_e .Error (_aea ,"\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 _bfbf ==nil {return nil ,_e .Error (_aea ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0042\u0069\u0074ma\u0070\u0073");
|
|
};if len (_bfbf .Values )> 0{return nil ,_e .Error (_aea ,"\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 _bdgeg .Zero (){return &Boxes {},nil ;};
|
|
var (_eaf ,_dbgg ,_gced ,_ddgf *Bitmap ;);_bdgeg .setPadBits (0);if _eaf ,_fcea =_fgca (nil ,_bdgeg );_fcea !=nil {return nil ,_e .Wrap (_fcea ,_aea ,"\u0062\u006d\u0031");};if _dbgg ,_fcea =_fgca (nil ,_bdgeg );_fcea !=nil {return nil ,_e .Wrap (_fcea ,_aea ,"\u0062\u006d\u0032");
|
|
};_agga :=&_df .Stack {};_agga .Aux =&_df .Stack {};_baaa =&Boxes {};var (_dbed ,_ebaba int ;_ebce _eb .Point ;_aeaa bool ;_ebdc *_eb .Rectangle ;);for {if _ebce ,_aeaa ,_fcea =_eaf .nextOnPixel (_dbed ,_ebaba );_fcea !=nil {return nil ,_e .Wrap (_fcea ,_aea ,"");
|
|
};if !_aeaa {break ;};if _ebdc ,_fcea =_dbce (_eaf ,_agga ,_ebce .X ,_ebce .Y ,_fbdd );_fcea !=nil {return nil ,_e .Wrap (_fcea ,_aea ,"");};if _fcea =_baaa .Add (_ebdc );_fcea !=nil {return nil ,_e .Wrap (_fcea ,_aea ,"");};if _gced ,_fcea =_eaf .clipRectangle (_ebdc ,nil );
|
|
_fcea !=nil {return nil ,_e .Wrap (_fcea ,_aea ,"\u0062\u006d\u0033");};if _ddgf ,_fcea =_dbgg .clipRectangle (_ebdc ,nil );_fcea !=nil {return nil ,_e .Wrap (_fcea ,_aea ,"\u0062\u006d\u0034");};if _ ,_fcea =_fcda (_gced ,_gced ,_ddgf );_fcea !=nil {return nil ,_e .Wrap (_fcea ,_aea ,"\u0062m\u0033\u0020\u005e\u0020\u0062\u006d4");
|
|
};if _fcea =_dbgg .RasterOperation (_ebdc .Min .X ,_ebdc .Min .Y ,_ebdc .Dx (),_ebdc .Dy (),PixSrcXorDst ,_gced ,0,0);_fcea !=nil {return nil ,_e .Wrap (_fcea ,_aea ,"\u0062\u006d\u0032\u0020\u002d\u0058\u004f\u0052\u002d>\u0020\u0062\u006d\u0033");};_bfbf .AddBitmap (_gced );
|
|
_dbed =_ebce .X ;_ebaba =_ebce .Y ;};_bfbf .Boxes =*_baaa ;return _baaa ,nil ;};func (_gee *Bitmap )AddBorderGeneral (left ,right ,top ,bot int ,val int )(*Bitmap ,error ){return _gee .addBorderGeneral (left ,right ,top ,bot ,val );};type ClassedPoints struct{*Points ;
|
|
_df .IntSlice ;_dcgeg func (_fggd ,_dfaff int )bool ;};func _agceg (_ccca ,_accg *Bitmap ,_aead *Selection )(*Bitmap ,error ){const _ccaae ="\u006f\u0070\u0065\u006e";var _fgdb error ;_ccca ,_fgdb =_adcgd (_ccca ,_accg ,_aead );if _fgdb !=nil {return nil ,_e .Wrap (_fgdb ,_ccaae ,"");
|
|
};_acbb ,_fgdb :=_ebgfb (nil ,_accg ,_aead );if _fgdb !=nil {return nil ,_e .Wrap (_fgdb ,_ccaae ,"");};_ ,_fgdb =_ebgfa (_ccca ,_acbb ,_aead );if _fgdb !=nil {return nil ,_e .Wrap (_fgdb ,_ccaae ,"");};return _ccca ,nil ;};func (_edca *Bitmap )RasterOperation (dx ,dy ,dw ,dh int ,op RasterOperator ,src *Bitmap ,sx ,sy int )error {return _ceabg (_edca ,dx ,dy ,dw ,dh ,op ,src ,sx ,sy );
|
|
};func MakePixelSumTab8 ()[]int {return _aede ()};type fillSegment struct{_dabcf int ;_baebc int ;_cbaab int ;_gaba int ;};func TstNSymbol (t *_ca .T ,scale ...int )*Bitmap {_agcd ,_gceced :=NewWithData (4,5,[]byte {0x90,0xD0,0xB0,0x90,0x90});_b .NoError (t ,_gceced );
|
|
return TstGetScaledSymbol (t ,_agcd ,scale ...);};func TstAddSymbol (t *_ca .T ,bms *Bitmaps ,sym *Bitmap ,x *int ,y int ,space int ){bms .AddBitmap (sym );_egad :=_eb .Rect (*x ,y ,*x +sym .Width ,y +sym .Height );bms .AddBox (&_egad );*x +=sym .Width +space ;
|
|
};func _ebgfb (_fffg ,_fafc *Bitmap ,_dcca *Selection )(*Bitmap ,error ){const _dafe ="\u0065\u0072\u006fd\u0065";var (_adga error ;_ebbb *Bitmap ;);_fffg ,_adga =_ffde (_fffg ,_fafc ,_dcca ,&_ebbb );if _adga !=nil {return nil ,_e .Wrap (_adga ,_dafe ,"");
|
|
};if _adga =_fffg .setAll ();_adga !=nil {return nil ,_e .Wrap (_adga ,_dafe ,"");};var _cece SelectionValue ;for _adfec :=0;_adfec < _dcca .Height ;_adfec ++{for _adbd :=0;_adbd < _dcca .Width ;_adbd ++{_cece =_dcca .Data [_adfec ][_adbd ];if _cece ==SelHit {_adga =_ceabg (_fffg ,_dcca .Cx -_adbd ,_dcca .Cy -_adfec ,_fafc .Width ,_fafc .Height ,PixSrcAndDst ,_ebbb ,0,0);
|
|
if _adga !=nil {return nil ,_e .Wrap (_adga ,_dafe ,"");};};};};if MorphBC ==SymmetricMorphBC {return _fffg ,nil ;};_gdfc ,_cgd ,_aagf ,_baef :=_dcca .findMaxTranslations ();if _gdfc > 0{if _adga =_fffg .RasterOperation (0,0,_gdfc ,_fafc .Height ,PixClr ,nil ,0,0);
|
|
_adga !=nil {return nil ,_e .Wrap (_adga ,_dafe ,"\u0078\u0070\u0020\u003e\u0020\u0030");};};if _aagf > 0{if _adga =_fffg .RasterOperation (_fafc .Width -_aagf ,0,_aagf ,_fafc .Height ,PixClr ,nil ,0,0);_adga !=nil {return nil ,_e .Wrap (_adga ,_dafe ,"\u0078\u006e\u0020\u003e\u0020\u0030");
|
|
};};if _cgd > 0{if _adga =_fffg .RasterOperation (0,0,_fafc .Width ,_cgd ,PixClr ,nil ,0,0);_adga !=nil {return nil ,_e .Wrap (_adga ,_dafe ,"\u0079\u0070\u0020\u003e\u0020\u0030");};};if _baef > 0{if _adga =_fffg .RasterOperation (0,_fafc .Height -_baef ,_fafc .Width ,_baef ,PixClr ,nil ,0,0);
|
|
_adga !=nil {return nil ,_e .Wrap (_adga ,_dafe ,"\u0079\u006e\u0020\u003e\u0020\u0030");};};return _fffg ,nil ;};func (_bbe *Bitmap )SetPadBits (value int ){_bbe .setPadBits (value )};func (_addc *ClassedPoints )Swap (i ,j int ){_addc .IntSlice [i ],_addc .IntSlice [j ]=_addc .IntSlice [j ],_addc .IntSlice [i ];
|
|
};type Selection struct{Height ,Width int ;Cx ,Cy int ;Name string ;Data [][]SelectionValue ;};func (_dgce *Bitmaps )makeSizeIndicator (_bagf ,_ffca int ,_bcbdf LocationFilter ,_bgae SizeComparison )(_dbade *_df .NumSlice ,_fgea error ){const _cffg ="\u0042i\u0074\u006d\u0061\u0070s\u002e\u006d\u0061\u006b\u0065S\u0069z\u0065I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";
|
|
if _dgce ==nil {return nil ,_e .Error (_cffg ,"\u0062\u0069\u0074ma\u0070\u0073\u0020\u0027\u0062\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};switch _bcbdf {case LocSelectWidth ,LocSelectHeight ,LocSelectIfEither ,LocSelectIfBoth :default:return nil ,_e .Errorf (_cffg ,"\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",_bcbdf );
|
|
};switch _bgae {case SizeSelectIfLT ,SizeSelectIfGT ,SizeSelectIfLTE ,SizeSelectIfGTE ,SizeSelectIfEQ :default:return nil ,_e .Errorf (_cffg ,"\u0069\u006e\u0076\u0061li\u0064\u0020\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0027\u0025d\u0027",_bgae );
|
|
};_dbade =&_df .NumSlice {};var (_dgdb ,_aeeb ,_edaeb int ;_fegfb *Bitmap ;);for _ ,_fegfb =range _dgce .Values {_dgdb =0;_aeeb ,_edaeb =_fegfb .Width ,_fegfb .Height ;switch _bcbdf {case LocSelectWidth :if (_bgae ==SizeSelectIfLT &&_aeeb < _bagf )||(_bgae ==SizeSelectIfGT &&_aeeb > _bagf )||(_bgae ==SizeSelectIfLTE &&_aeeb <=_bagf )||(_bgae ==SizeSelectIfGTE &&_aeeb >=_bagf )||(_bgae ==SizeSelectIfEQ &&_aeeb ==_bagf ){_dgdb =1;
|
|
};case LocSelectHeight :if (_bgae ==SizeSelectIfLT &&_edaeb < _ffca )||(_bgae ==SizeSelectIfGT &&_edaeb > _ffca )||(_bgae ==SizeSelectIfLTE &&_edaeb <=_ffca )||(_bgae ==SizeSelectIfGTE &&_edaeb >=_ffca )||(_bgae ==SizeSelectIfEQ &&_edaeb ==_ffca ){_dgdb =1;
|
|
};case LocSelectIfEither :if (_bgae ==SizeSelectIfLT &&(_aeeb < _bagf ||_edaeb < _ffca ))||(_bgae ==SizeSelectIfGT &&(_aeeb > _bagf ||_edaeb > _ffca ))||(_bgae ==SizeSelectIfLTE &&(_aeeb <=_bagf ||_edaeb <=_ffca ))||(_bgae ==SizeSelectIfGTE &&(_aeeb >=_bagf ||_edaeb >=_ffca ))||(_bgae ==SizeSelectIfEQ &&(_aeeb ==_bagf ||_edaeb ==_ffca )){_dgdb =1;
|
|
};case LocSelectIfBoth :if (_bgae ==SizeSelectIfLT &&(_aeeb < _bagf &&_edaeb < _ffca ))||(_bgae ==SizeSelectIfGT &&(_aeeb > _bagf &&_edaeb > _ffca ))||(_bgae ==SizeSelectIfLTE &&(_aeeb <=_bagf &&_edaeb <=_ffca ))||(_bgae ==SizeSelectIfGTE &&(_aeeb >=_bagf &&_edaeb >=_ffca ))||(_bgae ==SizeSelectIfEQ &&(_aeeb ==_bagf &&_edaeb ==_ffca )){_dgdb =1;
|
|
};};_dbade .AddInt (_dgdb );};return _dbade ,nil ;};const (_ SizeSelection =iota ;SizeSelectByWidth ;SizeSelectByHeight ;SizeSelectByMaxDimension ;SizeSelectByArea ;SizeSelectByPerimeter ;);type RasterOperator int ;func _cface (_bcda ,_fbae *Bitmap ,_dcbc ,_dfdb int )(*Bitmap ,error ){const _fddg ="d\u0069\u006c\u0061\u0074\u0065\u0042\u0072\u0069\u0063\u006b";
|
|
if _fbae ==nil {_ea .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 ,_e .Error (_fddg ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");
|
|
};if _dcbc < 1||_dfdb < 1{return nil ,_e .Error (_fddg ,"\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 _dcbc ==1&&_dfdb ==1{_fcaf ,_cbadg :=_fgca (_bcda ,_fbae );if _cbadg !=nil {return nil ,_e .Wrap (_cbadg ,_fddg ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u0026\u0026 \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _fcaf ,nil ;};if _dcbc ==1||_dfdb ==1{_ddfg :=SelCreateBrick (_dfdb ,_dcbc ,_dfdb /2,_dcbc /2,SelHit );_edgc ,_fcag :=_ebgfa (_bcda ,_fbae ,_ddfg );if _fcag !=nil {return nil ,_e .Wrap (_fcag ,_fddg ,"\u0068s\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _edgc ,nil ;};_edaa :=SelCreateBrick (1,_dcbc ,0,_dcbc /2,SelHit );_bcfb :=SelCreateBrick (_dfdb ,1,_dfdb /2,0,SelHit );_abfd ,_bgfdg :=_ebgfa (nil ,_fbae ,_edaa );if _bgfdg !=nil {return nil ,_e .Wrap (_bgfdg ,_fddg ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
};_bcda ,_bgfdg =_ebgfa (_bcda ,_abfd ,_bcfb );if _bgfdg !=nil {return nil ,_e .Wrap (_bgfdg ,_fddg ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};return _bcda ,nil ;};func (_fcde *Boxes )makeSizeIndicator (_dee ,_cfcf int ,_cdc LocationFilter ,_ecde SizeComparison )*_df .NumSlice {_cbc :=&_df .NumSlice {};
|
|
var _cdcd ,_dec ,_efdb int ;for _ ,_dcgf :=range *_fcde {_cdcd =0;_dec ,_efdb =_dcgf .Dx (),_dcgf .Dy ();switch _cdc {case LocSelectWidth :if (_ecde ==SizeSelectIfLT &&_dec < _dee )||(_ecde ==SizeSelectIfGT &&_dec > _dee )||(_ecde ==SizeSelectIfLTE &&_dec <=_dee )||(_ecde ==SizeSelectIfGTE &&_dec >=_dee ){_cdcd =1;
|
|
};case LocSelectHeight :if (_ecde ==SizeSelectIfLT &&_efdb < _cfcf )||(_ecde ==SizeSelectIfGT &&_efdb > _cfcf )||(_ecde ==SizeSelectIfLTE &&_efdb <=_cfcf )||(_ecde ==SizeSelectIfGTE &&_efdb >=_cfcf ){_cdcd =1;};case LocSelectIfEither :if (_ecde ==SizeSelectIfLT &&(_efdb < _cfcf ||_dec < _dee ))||(_ecde ==SizeSelectIfGT &&(_efdb > _cfcf ||_dec > _dee ))||(_ecde ==SizeSelectIfLTE &&(_efdb <=_cfcf ||_dec <=_dee ))||(_ecde ==SizeSelectIfGTE &&(_efdb >=_cfcf ||_dec >=_dee )){_cdcd =1;
|
|
};case LocSelectIfBoth :if (_ecde ==SizeSelectIfLT &&(_efdb < _cfcf &&_dec < _dee ))||(_ecde ==SizeSelectIfGT &&(_efdb > _cfcf &&_dec > _dee ))||(_ecde ==SizeSelectIfLTE &&(_efdb <=_cfcf &&_dec <=_dee ))||(_ecde ==SizeSelectIfGTE &&(_efdb >=_cfcf &&_dec >=_dee )){_cdcd =1;
|
|
};};_cbc .AddInt (_cdcd );};return _cbc ;};func (_fbfda *BitmapsArray )AddBitmaps (bm *Bitmaps ){_fbfda .Values =append (_fbfda .Values ,bm )};const (AsymmetricMorphBC BoundaryCondition =iota ;SymmetricMorphBC ;);func TstImageBitmapData ()[]byte {return _ebgg .Data };
|
|
func _gbfa (_ebde ,_eaab ,_gccdd byte )byte {return (_ebde &^(_gccdd ))|(_eaab &_gccdd )};func (_adg *Boxes )Add (box *_eb .Rectangle )error {if _adg ==nil {return _e .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");
|
|
};*_adg =append (*_adg ,box );return nil ;};func TstWSymbol (t *_ca .T ,scale ...int )*Bitmap {_febed ,_daeae :=NewWithData (5,5,[]byte {0x88,0x88,0xA8,0xD8,0x88});_b .NoError (t ,_daeae );return TstGetScaledSymbol (t ,_febed ,scale ...);};func _abfa (_abfe ,_gaca *Bitmap ,_gbed ,_fafg int )(_gdcaf error ){const _cegf ="\u0073e\u0065d\u0066\u0069\u006c\u006c\u0042i\u006e\u0061r\u0079\u004c\u006f\u0077\u0038";
|
|
var (_dbba ,_dbae ,_agcbg ,_ebaf int ;_dbee ,_aece ,_cadg ,_faea ,_baff ,_dcfb ,_gege ,_bbfge byte ;);for _dbba =0;_dbba < _gbed ;_dbba ++{_agcbg =_dbba *_abfe .RowStride ;_ebaf =_dbba *_gaca .RowStride ;for _dbae =0;_dbae < _fafg ;_dbae ++{if _dbee ,_gdcaf =_abfe .GetByte (_agcbg +_dbae );
|
|
_gdcaf !=nil {return _e .Wrap (_gdcaf ,_cegf ,"\u0067e\u0074 \u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0062\u0079\u0074\u0065");};if _aece ,_gdcaf =_gaca .GetByte (_ebaf +_dbae );_gdcaf !=nil {return _e .Wrap (_gdcaf ,_cegf ,"\u0067\u0065\u0074\u0020\u006d\u0061\u0073\u006b\u0020\u0062\u0079\u0074\u0065");
|
|
};if _dbba > 0{if _cadg ,_gdcaf =_abfe .GetByte (_agcbg -_abfe .RowStride +_dbae );_gdcaf !=nil {return _e .Wrap (_gdcaf ,_cegf ,"\u0069\u0020\u003e\u0020\u0030\u0020\u0062\u0079\u0074\u0065");};_dbee |=_cadg |(_cadg <<1)|(_cadg >>1);if _dbae > 0{if _bbfge ,_gdcaf =_abfe .GetByte (_agcbg -_abfe .RowStride +_dbae -1);
|
|
_gdcaf !=nil {return _e .Wrap (_gdcaf ,_cegf ,"\u0069\u0020\u003e\u00200 \u0026\u0026\u0020\u006a\u0020\u003e\u0020\u0030\u0020\u0062\u0079\u0074\u0065");};_dbee |=_bbfge <<7;};if _dbae < _fafg -1{if _bbfge ,_gdcaf =_abfe .GetByte (_agcbg -_abfe .RowStride +_dbae +1);
|
|
_gdcaf !=nil {return _e .Wrap (_gdcaf ,_cegf ,"\u006a\u0020<\u0020\u0077\u0070l\u0020\u002d\u0020\u0031\u0020\u0062\u0079\u0074\u0065");};_dbee |=_bbfge >>7;};};if _dbae > 0{if _faea ,_gdcaf =_abfe .GetByte (_agcbg +_dbae -1);_gdcaf !=nil {return _e .Wrap (_gdcaf ,_cegf ,"\u006a\u0020\u003e \u0030");
|
|
};_dbee |=_faea <<7;};_dbee &=_aece ;if _dbee ==0||^_dbee ==0{if _gdcaf =_abfe .SetByte (_agcbg +_dbae ,_dbee );_gdcaf !=nil {return _e .Wrap (_gdcaf ,_cegf ,"\u0073e\u0074t\u0069\u006e\u0067\u0020\u0065m\u0070\u0074y\u0020\u0062\u0079\u0074\u0065");};
|
|
};for {_gege =_dbee ;_dbee =(_dbee |(_dbee >>1)|(_dbee <<1))&_aece ;if (_dbee ^_gege )==0{if _gdcaf =_abfe .SetByte (_agcbg +_dbae ,_dbee );_gdcaf !=nil {return _e .Wrap (_gdcaf ,_cegf ,"\u0073\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u0070\u0072\u0065\u0076 \u0062\u0079\u0074\u0065");
|
|
};break ;};};};};for _dbba =_gbed -1;_dbba >=0;_dbba --{_agcbg =_dbba *_abfe .RowStride ;_ebaf =_dbba *_gaca .RowStride ;for _dbae =_fafg -1;_dbae >=0;_dbae --{if _dbee ,_gdcaf =_abfe .GetByte (_agcbg +_dbae );_gdcaf !=nil {return _e .Wrap (_gdcaf ,_cegf ,"\u0072\u0065\u0076er\u0073\u0065\u0020\u0067\u0065\u0074\u0020\u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0062\u0079\u0074\u0065");
|
|
};if _aece ,_gdcaf =_gaca .GetByte (_ebaf +_dbae );_gdcaf !=nil {return _e .Wrap (_gdcaf ,_cegf ,"r\u0065\u0076\u0065\u0072se\u0020g\u0065\u0074\u0020\u006d\u0061s\u006b\u0020\u0062\u0079\u0074\u0065");};if _dbba < _gbed -1{if _baff ,_gdcaf =_abfe .GetByte (_agcbg +_abfe .RowStride +_dbae );
|
|
_gdcaf !=nil {return _e .Wrap (_gdcaf ,_cegf ,"\u0069\u0020\u003c\u0020h\u0020\u002d\u0020\u0031\u0020\u002d\u003e\u0020\u0067\u0065t\u0020s\u006f\u0075\u0072\u0063\u0065\u0020\u0062y\u0074\u0065");};_dbee |=_baff |(_baff <<1)|_baff >>1;if _dbae > 0{if _bbfge ,_gdcaf =_abfe .GetByte (_agcbg +_abfe .RowStride +_dbae -1);
|
|
_gdcaf !=nil {return _e .Wrap (_gdcaf ,_cegf ,"\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");};_dbee |=_bbfge <<7;};if _dbae < _fafg -1{if _bbfge ,_gdcaf =_abfe .GetByte (_agcbg +_abfe .RowStride +_dbae +1);
|
|
_gdcaf !=nil {return _e .Wrap (_gdcaf ,_cegf ,"\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");
|
|
};_dbee |=_bbfge >>7;};};if _dbae < _fafg -1{if _dcfb ,_gdcaf =_abfe .GetByte (_agcbg +_dbae +1);_gdcaf !=nil {return _e .Wrap (_gdcaf ,_cegf ,"\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");
|
|
};_dbee |=_dcfb >>7;};_dbee &=_aece ;if _dbee ==0||(^_dbee )==0{if _gdcaf =_abfe .SetByte (_agcbg +_dbae ,_dbee );_gdcaf !=nil {return _e .Wrap (_gdcaf ,_cegf ,"\u0073e\u0074 \u006d\u0061\u0073\u006b\u0065\u0064\u0020\u0062\u0079\u0074\u0065");};};for {_gege =_dbee ;
|
|
_dbee =(_dbee |(_dbee >>1)|(_dbee <<1))&_aece ;if (_dbee ^_gege )==0{if _gdcaf =_abfe .SetByte (_agcbg +_dbae ,_dbee );_gdcaf !=nil {return _e .Wrap (_gdcaf ,_cegf ,"r\u0065\u0076\u0065\u0072se\u0020s\u0065\u0074\u0020\u0070\u0072e\u0076\u0020\u0062\u0079\u0074\u0065");
|
|
};break ;};};};};return nil ;};var _agf [256]uint8 ;const _aded =5000;func (_gefg *Bitmap )setFourBytes (_bfc int ,_gbdf uint32 )error {if _bfc +3> len (_gefg .Data )-1{return _e .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",_bfc );
|
|
};_gefg .Data [_bfc ]=byte ((_gbdf &0xff000000)>>24);_gefg .Data [_bfc +1]=byte ((_gbdf &0xff0000)>>16);_gefg .Data [_bfc +2]=byte ((_gbdf &0xff00)>>8);_gefg .Data [_bfc +3]=byte (_gbdf &0xff);return nil ;};type byWidth Bitmaps ;func (_eggfa *Bitmaps )String ()string {_cfbe :=_d .Builder {};
|
|
for _ ,_edaea :=range _eggfa .Values {_cfbe .WriteString (_edaea .String ());_cfbe .WriteRune ('\n');};return _cfbe .String ();};func (_gcga *Bitmap )setEightFullBytes (_fcdb int ,_egfc uint64 )error {if _fcdb +7> len (_gcga .Data )-1{return _e .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");
|
|
};_gcga .Data [_fcdb ]=byte ((_egfc &0xff00000000000000)>>56);_gcga .Data [_fcdb +1]=byte ((_egfc &0xff000000000000)>>48);_gcga .Data [_fcdb +2]=byte ((_egfc &0xff0000000000)>>40);_gcga .Data [_fcdb +3]=byte ((_egfc &0xff00000000)>>32);_gcga .Data [_fcdb +4]=byte ((_egfc &0xff000000)>>24);
|
|
_gcga .Data [_fcdb +5]=byte ((_egfc &0xff0000)>>16);_gcga .Data [_fcdb +6]=byte ((_egfc &0xff00)>>8);_gcga .Data [_fcdb +7]=byte (_egfc &0xff);return nil ;};func (_efc *Bitmap )Equivalent (s *Bitmap )bool {return _efc .equivalent (s )};func _ebfc (_cbfed *Bitmap ,_fead *_df .Stack ,_faab ,_gdcg int )(_cacd *_eb .Rectangle ,_acce error ){const _cdfb ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";
|
|
if _cbfed ==nil {return nil ,_e .Error (_cdfb ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");};if _fead ==nil {return nil ,_e .Error (_cdfb ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");
|
|
};_cddf ,_gabe :=_cbfed .Width ,_cbfed .Height ;_bfeg :=_cddf -1;_bdfbd :=_gabe -1;if _faab < 0||_faab > _bfeg ||_gdcg < 0||_gdcg > _bdfbd ||!_cbfed .GetPixel (_faab ,_gdcg ){return nil ,nil ;};_cbaa :=_eb .Rect (100000,100000,0,0);if _acce =_bdbg (_fead ,_faab ,_faab ,_gdcg ,1,_bdfbd ,&_cbaa );
|
|
_acce !=nil {return nil ,_e .Wrap (_acce ,_cdfb ,"\u0069\u006e\u0069t\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _acce =_bdbg (_fead ,_faab ,_faab ,_gdcg +1,-1,_bdfbd ,&_cbaa );_acce !=nil {return nil ,_e .Wrap (_acce ,_cdfb ,"\u0032\u006ed\u0020\u0069\u006ei\u0074\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");
|
|
};_cbaa .Min .X ,_cbaa .Max .X =_faab ,_faab ;_cbaa .Min .Y ,_cbaa .Max .Y =_gdcg ,_gdcg ;var (_aadb *fillSegment ;_gabge int ;);for _fead .Len ()> 0{if _aadb ,_acce =_gceb (_fead );_acce !=nil {return nil ,_e .Wrap (_acce ,_cdfb ,"");};_gdcg =_aadb ._cbaab ;
|
|
for _faab =_aadb ._dabcf -1;_faab >=0&&_cbfed .GetPixel (_faab ,_gdcg );_faab --{if _acce =_cbfed .SetPixel (_faab ,_gdcg ,0);_acce !=nil {return nil ,_e .Wrap (_acce ,_cdfb ,"\u0031s\u0074\u0020\u0073\u0065\u0074");};};if _faab >=_aadb ._dabcf -1{for {for _faab ++;
|
|
_faab <=_aadb ._baebc +1&&_faab <=_bfeg &&!_cbfed .GetPixel (_faab ,_gdcg );_faab ++{};_gabge =_faab ;if !(_faab <=_aadb ._baebc +1&&_faab <=_bfeg ){break ;};for ;_faab <=_bfeg &&_cbfed .GetPixel (_faab ,_gdcg );_faab ++{if _acce =_cbfed .SetPixel (_faab ,_gdcg ,0);
|
|
_acce !=nil {return nil ,_e .Wrap (_acce ,_cdfb ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _acce =_bdbg (_fead ,_gabge ,_faab -1,_aadb ._cbaab ,_aadb ._gaba ,_bdfbd ,&_cbaa );_acce !=nil {return nil ,_e .Wrap (_acce ,_cdfb ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");
|
|
};if _faab > _aadb ._baebc {if _acce =_bdbg (_fead ,_aadb ._baebc +1,_faab -1,_aadb ._cbaab ,-_aadb ._gaba ,_bdfbd ,&_cbaa );_acce !=nil {return nil ,_e .Wrap (_acce ,_cdfb ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");
|
|
};};};continue ;};_gabge =_faab +1;if _gabge < _aadb ._dabcf {if _acce =_bdbg (_fead ,_gabge ,_aadb ._dabcf -1,_aadb ._cbaab ,-_aadb ._gaba ,_bdfbd ,&_cbaa );_acce !=nil {return nil ,_e .Wrap (_acce ,_cdfb ,"\u006c\u0065\u0061\u006b\u0020\u006f\u006e\u0020\u006c\u0065\u0066\u0074 \u0073\u0069\u0064\u0065");
|
|
};};_faab =_aadb ._dabcf ;for {for ;_faab <=_bfeg &&_cbfed .GetPixel (_faab ,_gdcg );_faab ++{if _acce =_cbfed .SetPixel (_faab ,_gdcg ,0);_acce !=nil {return nil ,_e .Wrap (_acce ,_cdfb ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _acce =_bdbg (_fead ,_gabge ,_faab -1,_aadb ._cbaab ,_aadb ._gaba ,_bdfbd ,&_cbaa );
|
|
_acce !=nil {return nil ,_e .Wrap (_acce ,_cdfb ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _faab > _aadb ._baebc {if _acce =_bdbg (_fead ,_aadb ._baebc +1,_faab -1,_aadb ._cbaab ,-_aadb ._gaba ,_bdfbd ,&_cbaa );_acce !=nil {return nil ,_e .Wrap (_acce ,_cdfb ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");
|
|
};};for _faab ++;_faab <=_aadb ._baebc +1&&_faab <=_bfeg &&!_cbfed .GetPixel (_faab ,_gdcg );_faab ++{};_gabge =_faab ;if !(_faab <=_aadb ._baebc +1&&_faab <=_bfeg ){break ;};};};_cbaa .Max .X ++;_cbaa .Max .Y ++;return &_cbaa ,nil ;};func MakePixelCentroidTab8 ()[]int {return _efag ()};
|
|
func _aggb (_ede ,_dgd *Bitmap ,_ddb int ,_ccc []byte ,_acae int )(_bed error ){const _fcae ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0034";var (_bbf ,_fgaa ,_gde ,_cce ,_dfaf ,_aab ,_caadg ,_abf int ;
|
|
_bce ,_fde uint32 ;_bag ,_gcc byte ;_ebd uint16 ;);_cab :=make ([]byte ,4);_affb :=make ([]byte ,4);for _gde =0;_gde < _ede .Height -1;_gde ,_cce =_gde +2,_cce +1{_bbf =_gde *_ede .RowStride ;_fgaa =_cce *_dgd .RowStride ;for _dfaf ,_aab =0,0;_dfaf < _acae ;
|
|
_dfaf ,_aab =_dfaf +4,_aab +1{for _caadg =0;_caadg < 4;_caadg ++{_abf =_bbf +_dfaf +_caadg ;if _abf <=len (_ede .Data )-1&&_abf < _bbf +_ede .RowStride {_cab [_caadg ]=_ede .Data [_abf ];}else {_cab [_caadg ]=0x00;};_abf =_bbf +_ede .RowStride +_dfaf +_caadg ;
|
|
if _abf <=len (_ede .Data )-1&&_abf < _bbf +(2*_ede .RowStride ){_affb [_caadg ]=_ede .Data [_abf ];}else {_affb [_caadg ]=0x00;};};_bce =_egc .BigEndian .Uint32 (_cab );_fde =_egc .BigEndian .Uint32 (_affb );_fde &=_bce ;_fde &=_fde <<1;_fde &=0xaaaaaaaa;
|
|
_bce =_fde |(_fde <<7);_bag =byte (_bce >>24);_gcc =byte ((_bce >>8)&0xff);_abf =_fgaa +_aab ;if _abf +1==len (_dgd .Data )-1||_abf +1>=_fgaa +_dgd .RowStride {_dgd .Data [_abf ]=_ccc [_bag ];if _bed =_dgd .SetByte (_abf ,_ccc [_bag ]);_bed !=nil {return _e .Wrapf (_bed ,_fcae ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_abf );
|
|
};}else {_ebd =(uint16 (_ccc [_bag ])<<8)|uint16 (_ccc [_gcc ]);if _bed =_dgd .setTwoBytes (_abf ,_ebd );_bed !=nil {return _e .Wrapf (_bed ,_fcae ,"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",_abf );
|
|
};_aab ++;};};};return nil ;};func (_febff *Bitmaps )AddBox (box *_eb .Rectangle ){_febff .Boxes =append (_febff .Boxes ,box )};func (_ecdc *Bitmap )clipRectangle (_gbdd ,_fabe *_eb .Rectangle )(_eeff *Bitmap ,_cca error ){const _ggc ="\u0063\u006c\u0069\u0070\u0052\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065";
|
|
if _gbdd ==nil {return nil ,_e .Error (_ggc ,"\u0070r\u006fv\u0069\u0064\u0065\u0064\u0020n\u0069\u006c \u0027\u0062\u006f\u0078\u0027");};_ccef ,_dcb :=_ecdc .Width ,_ecdc .Height ;_gec ,_cca :=ClipBoxToRectangle (_gbdd ,_ccef ,_dcb );if _cca !=nil {_ea .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",_cca );
|
|
return nil ,nil ;};_gbdg ,_ccefg :=_gec .Min .X ,_gec .Min .Y ;_dfbg ,_dccc :=_gec .Max .X -_gec .Min .X ,_gec .Max .Y -_gec .Min .Y ;_eeff =New (_dfbg ,_dccc );_eeff .Text =_ecdc .Text ;if _cca =_eeff .RasterOperation (0,0,_dfbg ,_dccc ,PixSrc ,_ecdc ,_gbdg ,_ccefg );
|
|
_cca !=nil {return nil ,_e .Wrap (_cca ,_ggc ,"");};if _fabe !=nil {*_fabe =*_gec ;};return _eeff ,nil ;};func TstFrameBitmap ()*Bitmap {return _bbea .Copy ()};func (_agbbg *BitmapsArray )GetBox (i int )(*_eb .Rectangle ,error ){const _bafe ="\u0042\u0069\u0074\u006dap\u0073\u0041\u0072\u0072\u0061\u0079\u002e\u0047\u0065\u0074\u0042\u006f\u0078";
|
|
if _agbbg ==nil {return nil ,_e .Error (_bafe ,"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 (_agbbg .Boxes )-1{return nil ,_e .Errorf (_bafe ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
};return _agbbg .Boxes [i ],nil ;};func (_cgcd *Bitmap )setAll ()error {_fdba :=_ceabg (_cgcd ,0,0,_cgcd .Width ,_cgcd .Height ,PixSet ,nil ,0,0);if _fdba !=nil {return _e .Wrap (_fdba ,"\u0073\u0065\u0074\u0041\u006c\u006c","");};return nil ;};func (_afa *Bitmap )addPadBits ()(_cgaf error ){const _gcff ="\u0062\u0069\u0074\u006d\u0061\u0070\u002e\u0061\u0064\u0064\u0050\u0061d\u0042\u0069\u0074\u0073";
|
|
_ffg :=_afa .Width %8;if _ffg ==0{return nil ;};_deab :=_afa .Width /8;_geg :=_de .NewReader (_afa .Data );_gbbc :=make ([]byte ,_afa .Height *_afa .RowStride );_ecae :=_de .NewWriterMSB (_gbbc );_dgfa :=make ([]byte ,_deab );var (_bgbd int ;_gfe uint64 ;
|
|
);for _bgbd =0;_bgbd < _afa .Height ;_bgbd ++{if _ ,_cgaf =_geg .Read (_dgfa );_cgaf !=nil {return _e .Wrap (_cgaf ,_gcff ,"\u0066u\u006c\u006c\u0020\u0062\u0079\u0074e");};if _ ,_cgaf =_ecae .Write (_dgfa );_cgaf !=nil {return _e .Wrap (_cgaf ,_gcff ,"\u0066\u0075\u006c\u006c\u0020\u0062\u0079\u0074\u0065\u0073");
|
|
};if _gfe ,_cgaf =_geg .ReadBits (byte (_ffg ));_cgaf !=nil {return _e .Wrap (_cgaf ,_gcff ,"\u0073\u006b\u0069\u0070\u0070\u0069\u006e\u0067\u0020\u0062\u0069\u0074\u0073");};if _cgaf =_ecae .WriteByte (byte (_gfe )<<uint (8-_ffg ));_cgaf !=nil {return _e .Wrap (_cgaf ,_gcff ,"\u006ca\u0073\u0074\u0020\u0062\u0079\u0074e");
|
|
};};_afa .Data =_ecae .Data ();return nil ;};type Bitmaps struct{Values []*Bitmap ;Boxes []*_eb .Rectangle ;};func _ebgfa (_dcfe *Bitmap ,_bfge *Bitmap ,_adbf *Selection )(*Bitmap ,error ){var (_ceg *Bitmap ;_eddg error ;);_dcfe ,_eddg =_ffde (_dcfe ,_bfge ,_adbf ,&_ceg );
|
|
if _eddg !=nil {return nil ,_eddg ;};if _eddg =_dcfe .clearAll ();_eddg !=nil {return nil ,_eddg ;};var _ege SelectionValue ;for _gdgba :=0;_gdgba < _adbf .Height ;_gdgba ++{for _ffff :=0;_ffff < _adbf .Width ;_ffff ++{_ege =_adbf .Data [_gdgba ][_ffff ];
|
|
if _ege ==SelHit {if _eddg =_dcfe .RasterOperation (_ffff -_adbf .Cx ,_gdgba -_adbf .Cy ,_bfge .Width ,_bfge .Height ,PixSrcOrDst ,_ceg ,0,0);_eddg !=nil {return nil ,_eddg ;};};};};return _dcfe ,nil ;};type Component int ;func (_afc *Bitmap )inverseData (){if _dce :=_afc .RasterOperation (0,0,_afc .Width ,_afc .Height ,PixNotDst ,nil ,0,0);
|
|
_dce !=nil {_ea .Log .Debug ("\u0049n\u0076\u0065\u0072\u0073e\u0020\u0064\u0061\u0074\u0061 \u0066a\u0069l\u0065\u0064\u003a\u0020\u0027\u0025\u0076'",_dce );};if _afc .Color ==Chocolate {_afc .Color =Vanilla ;}else {_afc .Color =Chocolate ;};};func (_gfcc Points )GetGeometry (i int )(_gfbcf ,_baec float32 ,_caae error ){if i > len (_gfcc )-1{return 0,0,_e .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 );
|
|
};_bgdfc :=_gfcc [i ];return _bgdfc .X ,_bgdfc .Y ,nil ;};func (_cdecd *Bitmaps )GetBitmap (i int )(*Bitmap ,error ){const _fafb ="\u0047e\u0074\u0042\u0069\u0074\u006d\u0061p";if _cdecd ==nil {return nil ,_e .Error (_fafb ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0042\u0069\u0074ma\u0070\u0073");
|
|
};if i > len (_cdecd .Values )-1{return nil ,_e .Errorf (_fafb ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return _cdecd .Values [i ],nil ;};type Boxes []*_eb .Rectangle ;
|
|
func (_fbb *Bitmap )GetVanillaData ()[]byte {if _fbb .Color ==Chocolate {_fbb .inverseData ();};return _fbb .Data ;};func (_eegd *ClassedPoints )Len ()int {return _eegd .IntSlice .Size ()};func _egde (_egafe *Bitmap ,_gadb ,_cggg int ,_fcdd ,_ggbd int ,_dbggf RasterOperator ){var (_bfgde bool ;
|
|
_gadaa bool ;_dfga int ;_cccbc int ;_egbd int ;_dcag int ;_bacb bool ;_eaeb byte ;);_feeg :=8-(_gadb &7);_gbfe :=_bgga [_feeg ];_dgff :=_egafe .RowStride *_cggg +(_gadb >>3);if _fcdd < _feeg {_bfgde =true ;_gbfe &=_gbdb [8-_feeg +_fcdd ];};if !_bfgde {_dfga =(_fcdd -_feeg )>>3;
|
|
if _dfga !=0{_gadaa =true ;_cccbc =_dgff +1;};};_egbd =(_gadb +_fcdd )&7;if !(_bfgde ||_egbd ==0){_bacb =true ;_eaeb =_gbdb [_egbd ];_dcag =_dgff +1+_dfga ;};var _ggdf ,_ddgfg int ;switch _dbggf {case PixClr :for _ggdf =0;_ggdf < _ggbd ;_ggdf ++{_egafe .Data [_dgff ]=_gbfa (_egafe .Data [_dgff ],0x0,_gbfe );
|
|
_dgff +=_egafe .RowStride ;};if _gadaa {for _ggdf =0;_ggdf < _ggbd ;_ggdf ++{for _ddgfg =0;_ddgfg < _dfga ;_ddgfg ++{_egafe .Data [_cccbc +_ddgfg ]=0x0;};_cccbc +=_egafe .RowStride ;};};if _bacb {for _ggdf =0;_ggdf < _ggbd ;_ggdf ++{_egafe .Data [_dcag ]=_gbfa (_egafe .Data [_dcag ],0x0,_eaeb );
|
|
_dcag +=_egafe .RowStride ;};};case PixSet :for _ggdf =0;_ggdf < _ggbd ;_ggdf ++{_egafe .Data [_dgff ]=_gbfa (_egafe .Data [_dgff ],0xff,_gbfe );_dgff +=_egafe .RowStride ;};if _gadaa {for _ggdf =0;_ggdf < _ggbd ;_ggdf ++{for _ddgfg =0;_ddgfg < _dfga ;
|
|
_ddgfg ++{_egafe .Data [_cccbc +_ddgfg ]=0xff;};_cccbc +=_egafe .RowStride ;};};if _bacb {for _ggdf =0;_ggdf < _ggbd ;_ggdf ++{_egafe .Data [_dcag ]=_gbfa (_egafe .Data [_dcag ],0xff,_eaeb );_dcag +=_egafe .RowStride ;};};case PixNotDst :for _ggdf =0;_ggdf < _ggbd ;
|
|
_ggdf ++{_egafe .Data [_dgff ]=_gbfa (_egafe .Data [_dgff ],^_egafe .Data [_dgff ],_gbfe );_dgff +=_egafe .RowStride ;};if _gadaa {for _ggdf =0;_ggdf < _ggbd ;_ggdf ++{for _ddgfg =0;_ddgfg < _dfga ;_ddgfg ++{_egafe .Data [_cccbc +_ddgfg ]=^(_egafe .Data [_cccbc +_ddgfg ]);
|
|
};_cccbc +=_egafe .RowStride ;};};if _bacb {for _ggdf =0;_ggdf < _ggbd ;_ggdf ++{_egafe .Data [_dcag ]=_gbfa (_egafe .Data [_dcag ],^_egafe .Data [_dcag ],_eaeb );_dcag +=_egafe .RowStride ;};};};};func (_bede *Bitmaps )SortByWidth (){_afbaa :=(*byWidth )(_bede );
|
|
_f .Sort (_afbaa )};func TstASymbol (t *_ca .T )*Bitmap {t .Helper ();_bccf :=New (6,6);_b .NoError (t ,_bccf .SetPixel (1,0,1));_b .NoError (t ,_bccf .SetPixel (2,0,1));_b .NoError (t ,_bccf .SetPixel (3,0,1));_b .NoError (t ,_bccf .SetPixel (4,0,1));
|
|
_b .NoError (t ,_bccf .SetPixel (5,1,1));_b .NoError (t ,_bccf .SetPixel (1,2,1));_b .NoError (t ,_bccf .SetPixel (2,2,1));_b .NoError (t ,_bccf .SetPixel (3,2,1));_b .NoError (t ,_bccf .SetPixel (4,2,1));_b .NoError (t ,_bccf .SetPixel (5,2,1));_b .NoError (t ,_bccf .SetPixel (0,3,1));
|
|
_b .NoError (t ,_bccf .SetPixel (5,3,1));_b .NoError (t ,_bccf .SetPixel (0,4,1));_b .NoError (t ,_bccf .SetPixel (5,4,1));_b .NoError (t ,_bccf .SetPixel (1,5,1));_b .NoError (t ,_bccf .SetPixel (2,5,1));_b .NoError (t ,_bccf .SetPixel (3,5,1));_b .NoError (t ,_bccf .SetPixel (4,5,1));
|
|
_b .NoError (t ,_bccf .SetPixel (5,5,1));return _bccf ;};func _def (_a ,_g *Bitmap )(_fe error ){const _cf ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0032";_ce :=_g .RowStride ;_dd :=_a .RowStride ;
|
|
var (_gf byte ;_da uint16 ;_ga ,_fd ,_ee ,_af ,_dfb int ;);for _ee =0;_ee < _g .Height ;_ee ++{_ga =_ee *_ce ;_fd =2*_ee *_dd ;for _af =0;_af < _ce ;_af ++{_gf =_g .Data [_ga +_af ];_da =_cgcb [_gf ];_dfb =_fd +_af *2;if _a .RowStride !=_g .RowStride *2&&(_af +1)*2> _a .RowStride {_fe =_a .SetByte (_dfb ,byte (_da >>8));
|
|
}else {_fe =_a .setTwoBytes (_dfb ,_da );};if _fe !=nil {return _e .Wrap (_fe ,_cf ,"");};};for _af =0;_af < _dd ;_af ++{_dfb =_fd +_dd +_af ;_gf =_a .Data [_fd +_af ];if _fe =_a .SetByte (_dfb ,_gf );_fe !=nil {return _e .Wrapf (_fe ,_cf ,"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",_fd +_af ,_fd +_dd +_af );
|
|
};};};return nil ;};func TstISymbol (t *_ca .T ,scale ...int )*Bitmap {_deaa ,_edfaf :=NewWithData (1,5,[]byte {0x80,0x80,0x80,0x80,0x80});_b .NoError (t ,_edfaf );return TstGetScaledSymbol (t ,_deaa ,scale ...);};func (_agec MorphProcess )verify (_effb int ,_bcea ,_afce *int )error {const _effa ="\u004d\u006f\u0072\u0070hP\u0072\u006f\u0063\u0065\u0073\u0073\u002e\u0076\u0065\u0072\u0069\u0066\u0079";
|
|
switch _agec .Operation {case MopDilation ,MopErosion ,MopOpening ,MopClosing :if len (_agec .Arguments )!=2{return _e .Error (_effa ,"\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");
|
|
};_cbd ,_bea :=_agec .getWidthHeight ();if _cbd <=0||_bea <=0{return _e .Error (_effa ,"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 :_gab :=len (_agec .Arguments );*_bcea +=_gab ;if _gab < 1||_gab > 4{return _e .Error (_effa ,"\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 _gafd :=0;_gafd < _gab ;_gafd ++{if _agec .Arguments [_gafd ]< 1||_agec .Arguments [_gafd ]> 4{return _e .Error (_effa ,"\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 (_agec .Arguments )==0{return _e .Error (_effa ,"\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");
|
|
};_beda :=_agec .Arguments [0];if _beda !=2&&_beda !=4&&_beda !=8{return _e .Error (_effa ,"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");
|
|
};*_bcea -=_dbcf [_beda /4];case MopAddBorder :if len (_agec .Arguments )==0{return _e .Error (_effa ,"\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");
|
|
};_cede :=_agec .Arguments [0];if _effb > 0{return _e .Error (_effa ,"\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 _cede < 1{return _e .Error (_effa ,"\u0041\u0064\u0064\u0042o\u0072\u0064\u0065\u0072\u0020\u0076\u0061\u006c\u0075\u0065 \u006co\u0077\u0065\u0072\u0020\u0074\u0068\u0061n\u0020\u0030");};*_afce =_cede ;};return nil ;};func _fgca (_gffd ,_aac *Bitmap )(*Bitmap ,error ){if _aac ==nil {return nil ,_e .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 _aac ==_gffd {return _gffd ,nil ;};if _gffd ==nil {_gffd =_aac .createTemplate ();copy (_gffd .Data ,_aac .Data );return _gffd ,nil ;};_gaea :=_gffd .resizeImageData (_aac );if _gaea !=nil {return nil ,_e .Wrap (_gaea ,"\u0063\u006f\u0070\u0079\u0042\u0069\u0074\u006d\u0061\u0070","");
|
|
};_gffd .Text =_aac .Text ;copy (_gffd .Data ,_aac .Data );return _gffd ,nil ;};func Centroid (bm *Bitmap ,centTab ,sumTab []int )(Point ,error ){return bm .centroid (centTab ,sumTab )};func (_bdcg *byHeight )Less (i ,j int )bool {return _bdcg .Values [i ].Height < _bdcg .Values [j ].Height };
|
|
const (Vanilla Color =iota ;Chocolate ;);func (_gafg *Bitmaps )WidthSorter ()func (_aeaae ,_fcdf int )bool {return func (_cgadd ,_gggg int )bool {return _gafg .Values [_cgadd ].Width < _gafg .Values [_gggg ].Width };};func _fb (_ebab *Bitmap ,_cbe ...int )(_efe *Bitmap ,_cfcag error ){const _cfaf ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0043\u0061\u0073\u0063\u0061\u0064\u0065";
|
|
if _ebab ==nil {return nil ,_e .Error (_cfaf ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};if len (_cbe )==0||len (_cbe )> 4{return nil ,_e .Error (_cfaf ,"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 _cbe [0]<=0{_ea .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");_efe ,_cfcag =_fgca (nil ,_ebab );if _cfcag !=nil {return nil ,_e .Wrap (_cfcag ,_cfaf ,"l\u0065\u0076\u0065\u006c\u0031\u0020\u003c\u003d\u0020\u0030");
|
|
};return _efe ,nil ;};_ggg :=_ae ();_efe =_ebab ;for _dcf ,_eed :=range _cbe {if _eed <=0{break ;};_efe ,_cfcag =_bbaa (_efe ,_eed ,_ggg );if _cfcag !=nil {return nil ,_e .Wrapf (_cfcag ,_cfaf ,"\u006c\u0065\u0076\u0065\u006c\u0025\u0064\u0020\u0072\u0065\u0064\u0075c\u0074\u0069\u006f\u006e",_dcf );
|
|
};};return _efe ,nil ;};func HausTest (p1 ,p2 ,p3 ,p4 *Bitmap ,delX ,delY float32 ,maxDiffW ,maxDiffH int )(bool ,error ){const _bagg ="\u0048\u0061\u0075\u0073\u0054\u0065\u0073\u0074";_ebcb ,_gebf :=p1 .Width ,p1 .Height ;_dacb ,_gge :=p3 .Width ,p3 .Height ;
|
|
if _df .Abs (_ebcb -_dacb )> maxDiffW {return false ,nil ;};if _df .Abs (_gebf -_gge )> maxDiffH {return false ,nil ;};_fdaad :=int (delX +_df .Sign (delX )*0.5);_dabca :=int (delY +_df .Sign (delY )*0.5);var _eaaa error ;_dgad :=p1 .CreateTemplate ();
|
|
if _eaaa =_dgad .RasterOperation (0,0,_ebcb ,_gebf ,PixSrc ,p1 ,0,0);_eaaa !=nil {return false ,_e .Wrap (_eaaa ,_bagg ,"p\u0031\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _eaaa =_dgad .RasterOperation (_fdaad ,_dabca ,_ebcb ,_gebf ,PixNotSrcAndDst ,p4 ,0,0);
|
|
_eaaa !=nil {return false ,_e .Wrap (_eaaa ,_bagg ,"\u0021p\u0034\u0020\u0026\u0020\u0074");};if _dgad .Zero (){return false ,nil ;};if _eaaa =_dgad .RasterOperation (_fdaad ,_dabca ,_dacb ,_gge ,PixSrc ,p3 ,0,0);_eaaa !=nil {return false ,_e .Wrap (_eaaa ,_bagg ,"p\u0033\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");
|
|
};if _eaaa =_dgad .RasterOperation (0,0,_dacb ,_gge ,PixNotSrcAndDst ,p2 ,0,0);_eaaa !=nil {return false ,_e .Wrap (_eaaa ,_bagg ,"\u0021p\u0032\u0020\u0026\u0020\u0074");};return _dgad .Zero (),nil ;};func _agecg (_gccba ,_ffgf *Bitmap ,_dgdc *Selection )(*Bitmap ,error ){const _bgcca ="c\u006c\u006f\u0073\u0065\u0042\u0069\u0074\u006d\u0061\u0070";
|
|
var _ggfd error ;if _gccba ,_ggfd =_adcgd (_gccba ,_ffgf ,_dgdc );_ggfd !=nil {return nil ,_ggfd ;};_eagba ,_ggfd :=_ebgfa (nil ,_ffgf ,_dgdc );if _ggfd !=nil {return nil ,_e .Wrap (_ggfd ,_bgcca ,"");};if _ ,_ggfd =_ebgfb (_gccba ,_eagba ,_dgdc );_ggfd !=nil {return nil ,_e .Wrap (_ggfd ,_bgcca ,"");
|
|
};return _gccba ,nil ;};func (_ceef CombinationOperator )String ()string {var _eddc string ;switch _ceef {case CmbOpOr :_eddc ="\u004f\u0052";case CmbOpAnd :_eddc ="\u0041\u004e\u0044";case CmbOpXor :_eddc ="\u0058\u004f\u0052";case CmbOpXNor :_eddc ="\u0058\u004e\u004f\u0052";
|
|
case CmbOpReplace :_eddc ="\u0052E\u0050\u004c\u0041\u0043\u0045";case CmbOpNot :_eddc ="\u004e\u004f\u0054";};return _eddc ;};func (_eeegf *Bitmaps )GroupByWidth ()(*BitmapsArray ,error ){const _bffc ="\u0047\u0072\u006fu\u0070\u0042\u0079\u0057\u0069\u0064\u0074\u0068";
|
|
if len (_eeegf .Values )==0{return nil ,_e .Error (_bffc ,"\u006eo\u0020v\u0061\u006c\u0075\u0065\u0073 \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");};_abad :=&BitmapsArray {};_eeegf .SortByWidth ();_eaccg :=-1;_badf :=-1;for _gfba :=0;_gfba < len (_eeegf .Values );
|
|
_gfba ++{_aegga :=_eeegf .Values [_gfba ].Width ;if _aegga > _eaccg {_eaccg =_aegga ;_badf ++;_abad .Values =append (_abad .Values ,&Bitmaps {});};_abad .Values [_badf ].AddBitmap (_eeegf .Values [_gfba ]);};return _abad ,nil ;};func (_bdff *Bitmaps )GetBox (i int )(*_eb .Rectangle ,error ){const _adbg ="\u0047\u0065\u0074\u0042\u006f\u0078";
|
|
if _bdff ==nil {return nil ,_e .Error (_adbg ,"\u0070\u0072\u006f\u0076id\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0042\u0069\u0074\u006d\u0061\u0070s\u0027");};if i > len (_bdff .Boxes )-1{return nil ,_e .Errorf (_adbg ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
};return _bdff .Boxes [i ],nil ;};func SelCreateBrick (h ,w int ,cy ,cx int ,tp SelectionValue )*Selection {_gffb :=_aagg (h ,w ,"");_gffb .setOrigin (cy ,cx );var _babab ,_dgcg int ;for _babab =0;_babab < h ;_babab ++{for _dgcg =0;_dgcg < w ;_dgcg ++{_gffb .Data [_babab ][_dgcg ]=tp ;
|
|
};};return _gffb ;};func _gfge (_cagb ...MorphProcess )(_efac error ){const _aggg ="v\u0065r\u0069\u0066\u0079\u004d\u006f\u0072\u0070\u0068P\u0072\u006f\u0063\u0065ss\u0065\u0073";var _ebdcg ,_gbgf int ;for _bcgc ,_aadc :=range _cagb {if _efac =_aadc .verify (_bcgc ,&_ebdcg ,&_gbgf );
|
|
_efac !=nil {return _e .Wrap (_efac ,_aggg ,"");};};if _gbgf !=0&&_ebdcg !=0{return _e .Error (_aggg ,"\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 (_age *Bitmap )createTemplate ()*Bitmap {return &Bitmap {Width :_age .Width ,Height :_age .Height ,RowStride :_age .RowStride ,Color :_age .Color ,Text :_age .Text ,BitmapNumber :_age .BitmapNumber ,Special :_age .Special ,Data :make ([]byte ,len (_age .Data ))};
|
|
};func (_eag *Bitmap )GetUnpaddedData ()([]byte ,error ){_gaa :=uint (_eag .Width &0x07);if _gaa ==0{return _eag .Data ,nil ;};_fddb :=_eag .Width *_eag .Height ;if _fddb %8!=0{_fddb >>=3;_fddb ++;}else {_fddb >>=3;};_ffda :=make ([]byte ,_fddb );_dfd :=_de .NewWriterMSB (_ffda );
|
|
const _bbd ="\u0047e\u0074U\u006e\u0070\u0061\u0064\u0064\u0065\u0064\u0044\u0061\u0074\u0061";for _bged :=0;_bged < _eag .Height ;_bged ++{for _geee :=0;_geee < _eag .RowStride ;_geee ++{_cbgf :=_eag .Data [_bged *_eag .RowStride +_geee ];if _geee !=_eag .RowStride -1{_bae :=_dfd .WriteByte (_cbgf );
|
|
if _bae !=nil {return nil ,_e .Wrap (_bae ,_bbd ,"");};continue ;};for _fcc :=uint (0);_fcc < _gaa ;_fcc ++{_baa :=_dfd .WriteBit (int (_cbgf >>(7-_fcc )&0x01));if _baa !=nil {return nil ,_e .Wrap (_baa ,_bbd ,"");};};};};return _ffda ,nil ;};func _gbf (_aec ,_dfec byte ,_efef CombinationOperator )byte {switch _efef {case CmbOpOr :return _dfec |_aec ;
|
|
case CmbOpAnd :return _dfec &_aec ;case CmbOpXor :return _dfec ^_aec ;case CmbOpXNor :return ^(_dfec ^_aec );case CmbOpNot :return ^(_dfec );default:return _dfec ;};};func (_dgac *ClassedPoints )GetIntYByClass (i int )(int ,error ){const _edfe ="\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 >=_dgac .IntSlice .Size (){return 0,_e .Errorf (_edfe ,"\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 (_dgac .YAtIndex (i )),nil ;};func (_dedcg *Bitmap )thresholdPixelSum (_ace int )bool {var (_fgf int ;_gcad uint8 ;_gcee byte ;_bcd int ;);_afgd :=_dedcg .RowStride ;_fgcg :=uint (_dedcg .Width &0x07);if _fgcg !=0{_gcad =uint8 ((0xff<<(8-_fgcg ))&0xff);
|
|
_afgd --;};for _edf :=0;_edf < _dedcg .Height ;_edf ++{for _bcd =0;_bcd < _afgd ;_bcd ++{_gcee =_dedcg .Data [_edf *_dedcg .RowStride +_bcd ];_fgf +=int (_agf [_gcee ]);};if _fgcg !=0{_gcee =_dedcg .Data [_edf *_dedcg .RowStride +_bcd ]&_gcad ;_fgf +=int (_agf [_gcee ]);
|
|
};if _fgf > _ace {return true ;};};return false ;};func (_gcdg *Bitmaps )SelectByIndexes (idx []int )(*Bitmaps ,error ){const _cabd ="B\u0069\u0074\u006d\u0061\u0070\u0073.\u0053\u006f\u0072\u0074\u0049\u006e\u0064\u0065\u0078e\u0073\u0042\u0079H\u0065i\u0067\u0068\u0074";
|
|
_bffb ,_cafe :=_gcdg .selectByIndexes (idx );if _cafe !=nil {return nil ,_e .Wrap (_cafe ,_cabd ,"");};return _bffb ,nil ;};func (_ffa *Bitmap )SetByte (index int ,v byte )error {if index > len (_ffa .Data )-1||index < 0{return _e .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 );
|
|
};_ffa .Data [index ]=v ;return nil ;};func New (width ,height int )*Bitmap {_abb :=_bef (width ,height );_abb .Data =make ([]byte ,height *_abb .RowStride );return _abb ;};func (_dad *Bitmap )ToImage ()_eb .Image {_degg ,_adag :=_dff .NewImage (_dad .Width ,_dad .Height ,1,1,_dad .Data ,nil ,nil );
|
|
if _adag !=nil {_ea .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",_adag );
|
|
};return _degg ;};func _fefb (_edbe *Bitmap ,_fadf ,_dbde ,_caag ,_gdfa int ,_caebf RasterOperator ){if _fadf < 0{_caag +=_fadf ;_fadf =0;};_edea :=_fadf +_caag -_edbe .Width ;if _edea > 0{_caag -=_edea ;};if _dbde < 0{_gdfa +=_dbde ;_dbde =0;};_agbe :=_dbde +_gdfa -_edbe .Height ;
|
|
if _agbe > 0{_gdfa -=_agbe ;};if _caag <=0||_gdfa <=0{return ;};if (_fadf &7)==0{_abda (_edbe ,_fadf ,_dbde ,_caag ,_gdfa ,_caebf );}else {_egde (_edbe ,_fadf ,_dbde ,_caag ,_gdfa ,_caebf );};};func _aa (_dgf *Bitmap ,_ef int )(*Bitmap ,error ){const _ecd ="\u0065x\u0070a\u006e\u0064\u0042\u0069\u006ea\u0072\u0079P\u006f\u0077\u0065\u0072\u0032";
|
|
if _dgf ==nil {return nil ,_e .Error (_ecd ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _ef ==1{return _fgca (nil ,_dgf );};if _ef !=2&&_ef !=4&&_ef !=8{return nil ,_e .Error (_ecd ,"\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");
|
|
};_cfc :=_ef *_dgf .Width ;_gbe :=_ef *_dgf .Height ;_aaf :=New (_cfc ,_gbe );var _cfa error ;switch _ef {case 2:_cfa =_def (_aaf ,_dgf );case 4:_cfa =_ddf (_aaf ,_dgf );case 8:_cfa =_ec (_aaf ,_dgf );};if _cfa !=nil {return nil ,_e .Wrap (_cfa ,_ecd ,"");
|
|
};return _aaf ,nil ;};func (_fdgag Points )XSorter ()func (_deaea ,_gefe int )bool {return func (_gbab ,_gcgg int )bool {return _fdgag [_gbab ].X < _fdgag [_gcgg ].X };};type Points []Point ;const (SelDontCare SelectionValue =iota ;SelHit ;SelMiss ;);func (_bedce *byHeight )Swap (i ,j int ){_bedce .Values [i ],_bedce .Values [j ]=_bedce .Values [j ],_bedce .Values [i ];
|
|
if _bedce .Boxes !=nil {_bedce .Boxes [i ],_bedce .Boxes [j ]=_bedce .Boxes [j ],_bedce .Boxes [i ];};};func (_aegc *byWidth )Less (i ,j int )bool {return _aegc .Values [i ].Width < _aegc .Values [j ].Width };func (_dfgd *Bitmaps )CountPixels ()*_df .NumSlice {_cggd :=&_df .NumSlice {};
|
|
for _ ,_fdfg :=range _dfgd .Values {_cggd .AddInt (_fdfg .CountPixels ());};return _cggd ;};type Point struct{X ,Y float32 ;};func _fac (_gbee ,_gada *Bitmap ,_eede int ,_gca []byte ,_efga int )(_gda error ){const _ddc ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0032";
|
|
var (_bca ,_cga ,_dedc ,_fgg ,_bgc ,_efed ,_fag ,_fega int ;_bcc ,_bbb ,_dcfa ,_dae uint32 ;_cgfb ,_cgab byte ;_ecf uint16 ;);_ddcd :=make ([]byte ,4);_fbf :=make ([]byte ,4);for _dedc =0;_dedc < _gbee .Height -1;_dedc ,_fgg =_dedc +2,_fgg +1{_bca =_dedc *_gbee .RowStride ;
|
|
_cga =_fgg *_gada .RowStride ;for _bgc ,_efed =0,0;_bgc < _efga ;_bgc ,_efed =_bgc +4,_efed +1{for _fag =0;_fag < 4;_fag ++{_fega =_bca +_bgc +_fag ;if _fega <=len (_gbee .Data )-1&&_fega < _bca +_gbee .RowStride {_ddcd [_fag ]=_gbee .Data [_fega ];}else {_ddcd [_fag ]=0x00;
|
|
};_fega =_bca +_gbee .RowStride +_bgc +_fag ;if _fega <=len (_gbee .Data )-1&&_fega < _bca +(2*_gbee .RowStride ){_fbf [_fag ]=_gbee .Data [_fega ];}else {_fbf [_fag ]=0x00;};};_bcc =_egc .BigEndian .Uint32 (_ddcd );_bbb =_egc .BigEndian .Uint32 (_fbf );
|
|
_dcfa =_bcc &_bbb ;_dcfa |=_dcfa <<1;_dae =_bcc |_bbb ;_dae &=_dae <<1;_bbb =_dcfa |_dae ;_bbb &=0xaaaaaaaa;_bcc =_bbb |(_bbb <<7);_cgfb =byte (_bcc >>24);_cgab =byte ((_bcc >>8)&0xff);_fega =_cga +_efed ;if _fega +1==len (_gada .Data )-1||_fega +1>=_cga +_gada .RowStride {if _gda =_gada .SetByte (_fega ,_gca [_cgfb ]);
|
|
_gda !=nil {return _e .Wrapf (_gda ,_ddc ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_fega );};}else {_ecf =(uint16 (_gca [_cgfb ])<<8)|uint16 (_gca [_cgab ]);if _gda =_gada .setTwoBytes (_fega ,_ecf );_gda !=nil {return _e .Wrapf (_gda ,_ddc ,"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",_fega );
|
|
};_efed ++;};};};return nil ;};func (_eacb *ClassedPoints )XAtIndex (i int )float32 {return (*_eacb .Points )[_eacb .IntSlice [i ]].X };func (_deac *Bitmap )String ()string {var _gfb ="\u000a";for _gba :=0;_gba < _deac .Height ;_gba ++{var _bbgb string ;
|
|
for _cba :=0;_cba < _deac .Width ;_cba ++{_daae :=_deac .GetPixel (_cba ,_gba );if _daae {_bbgb +="\u0031";}else {_bbgb +="\u0030";};};_gfb +=_bbgb +"\u000a";};return _gfb ;};func _bef (_gfa ,_fgeb int )*Bitmap {return &Bitmap {Width :_gfa ,Height :_fgeb ,RowStride :(_gfa +7)>>3};
|
|
};func RankHausTest (p1 ,p2 ,p3 ,p4 *Bitmap ,delX ,delY float32 ,maxDiffW ,maxDiffH ,area1 ,area3 int ,rank float32 ,tab8 []int )(_bcdb bool ,_aedd error ){const _dcbd ="\u0052\u0061\u006ek\u0048\u0061\u0075\u0073\u0054\u0065\u0073\u0074";_gfgb ,_bdcb :=p1 .Width ,p1 .Height ;
|
|
_faad ,_dbdf :=p3 .Width ,p3 .Height ;if _df .Abs (_gfgb -_faad )> maxDiffW {return false ,nil ;};if _df .Abs (_bdcb -_dbdf )> maxDiffH {return false ,nil ;};_gfgd :=int (float32 (area1 )*(1.0-rank )+0.5);_cgfa :=int (float32 (area3 )*(1.0-rank )+0.5);
|
|
var _ddcec ,_edadg int ;if delX >=0{_ddcec =int (delX +0.5);}else {_ddcec =int (delX -0.5);};if delY >=0{_edadg =int (delY +0.5);}else {_edadg =int (delY -0.5);};_efba :=p1 .CreateTemplate ();if _aedd =_efba .RasterOperation (0,0,_gfgb ,_bdcb ,PixSrc ,p1 ,0,0);
|
|
_aedd !=nil {return false ,_e .Wrap (_aedd ,_dcbd ,"p\u0031\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _aedd =_efba .RasterOperation (_ddcec ,_edadg ,_gfgb ,_bdcb ,PixNotSrcAndDst ,p4 ,0,0);_aedd !=nil {return false ,_e .Wrap (_aedd ,_dcbd ,"\u0074 \u0026\u0020\u0021\u0070\u0034");
|
|
};_bcdb ,_aedd =_efba .ThresholdPixelSum (_gfgd ,tab8 );if _aedd !=nil {return false ,_e .Wrap (_aedd ,_dcbd ,"\u0074\u002d\u003e\u0074\u0068\u0072\u0065\u0073\u0068\u0031");};if _bcdb {return false ,nil ;};if _aedd =_efba .RasterOperation (_ddcec ,_edadg ,_faad ,_dbdf ,PixSrc ,p3 ,0,0);
|
|
_aedd !=nil {return false ,_e .Wrap (_aedd ,_dcbd ,"p\u0033\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _aedd =_efba .RasterOperation (0,0,_faad ,_dbdf ,PixNotSrcAndDst ,p2 ,0,0);_aedd !=nil {return false ,_e .Wrap (_aedd ,_dcbd ,"\u0074 \u0026\u0020\u0021\u0070\u0032");
|
|
};_bcdb ,_aedd =_efba .ThresholdPixelSum (_cgfa ,tab8 );if _aedd !=nil {return false ,_e .Wrap (_aedd ,_dcbd ,"\u0074\u002d\u003e\u0074\u0068\u0072\u0065\u0073\u0068\u0033");};return !_bcdb ,nil ;};const (PixSrc RasterOperator =0xc;PixDst RasterOperator =0xa;
|
|
PixNotSrc RasterOperator =0x3;PixNotDst RasterOperator =0x5;PixClr RasterOperator =0x0;PixSet RasterOperator =0xf;PixSrcOrDst RasterOperator =0xe;PixSrcAndDst RasterOperator =0x8;PixSrcXorDst RasterOperator =0x6;PixNotSrcOrDst RasterOperator =0xb;PixNotSrcAndDst RasterOperator =0x2;
|
|
PixSrcOrNotDst RasterOperator =0xd;PixSrcAndNotDst RasterOperator =0x4;PixNotPixSrcOrDst RasterOperator =0x1;PixNotPixSrcAndDst RasterOperator =0x7;PixNotPixSrcXorDst RasterOperator =0x9;PixPaint =PixSrcOrDst ;PixSubtract =PixNotSrcAndDst ;PixMask =PixSrcAndDst ;
|
|
);func (_gdb *Bitmap )GetPixel (x ,y int )bool {_cfgd :=_gdb .GetByteIndex (x ,y );_defd :=_gdb .GetBitOffset (x );_cfd :=uint (7-_defd );if _cfgd > len (_gdb .Data )-1{_ea .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 ,_gdb );
|
|
return false ;};if (_gdb .Data [_cfgd ]>>_cfd )&0x01>=1{return true ;};return false ;};func init (){const _beabf ="\u0062\u0069\u0074\u006dap\u0073\u002e\u0069\u006e\u0069\u0074\u0069\u0061\u006c\u0069\u007a\u0061\u0074\u0069o\u006e";_bbea =New (50,40);
|
|
var _bgef error ;_bbea ,_bgef =_bbea .AddBorder (2,1);if _bgef !=nil {panic (_e .Wrap (_bgef ,_beabf ,"f\u0072\u0061\u006d\u0065\u0042\u0069\u0074\u006d\u0061\u0070"));};_ebgg ,_bgef =NewWithData (50,22,_afaa );if _bgef !=nil {panic (_e .Wrap (_bgef ,_beabf ,"i\u006d\u0061\u0067\u0065\u0042\u0069\u0074\u006d\u0061\u0070"));
|
|
};};func (_fgac *Bitmap )AddBorder (borderSize ,val int )(*Bitmap ,error ){if borderSize ==0{return _fgac .Copy (),nil ;};_cea ,_ge :=_fgac .addBorderGeneral (borderSize ,borderSize ,borderSize ,borderSize ,val );if _ge !=nil {return nil ,_e .Wrap (_ge ,"\u0041d\u0064\u0042\u006f\u0072\u0064\u0065r","");
|
|
};return _cea ,nil ;};func _geb (_gfaf ,_bgce *Bitmap ,_bfae CombinationOperator )*Bitmap {_aee :=New (_gfaf .Width ,_gfaf .Height );for _aeee :=0;_aeee < len (_aee .Data );_aeee ++{_aee .Data [_aeee ]=_gbf (_gfaf .Data [_aeee ],_bgce .Data [_aeee ],_bfae );
|
|
};return _aee ;};func _ab ()(_cb [256]uint64 ){for _bgg :=0;_bgg < 256;_bgg ++{if _bgg &0x01!=0{_cb [_bgg ]|=0xff;};if _bgg &0x02!=0{_cb [_bgg ]|=0xff00;};if _bgg &0x04!=0{_cb [_bgg ]|=0xff0000;};if _bgg &0x08!=0{_cb [_bgg ]|=0xff000000;};if _bgg &0x10!=0{_cb [_bgg ]|=0xff00000000;
|
|
};if _bgg &0x20!=0{_cb [_bgg ]|=0xff0000000000;};if _bgg &0x40!=0{_cb [_bgg ]|=0xff000000000000;};if _bgg &0x80!=0{_cb [_bgg ]|=0xff00000000000000;};};return _cb ;};func _dbce (_fbfb *Bitmap ,_gecb *_df .Stack ,_gaef ,_eeage ,_acff int )(_efedd *_eb .Rectangle ,_bbec error ){const _cbgff ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";
|
|
if _fbfb ==nil {return nil ,_e .Error (_cbgff ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");};if _gecb ==nil {return nil ,_e .Error (_cbgff ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");
|
|
};switch _acff {case 4:if _efedd ,_bbec =_bdfd (_fbfb ,_gecb ,_gaef ,_eeage );_bbec !=nil {return nil ,_e .Wrap (_bbec ,_cbgff ,"");};return _efedd ,nil ;case 8:if _efedd ,_bbec =_ebfc (_fbfb ,_gecb ,_gaef ,_eeage );_bbec !=nil {return nil ,_e .Wrap (_bbec ,_cbgff ,"");
|
|
};return _efedd ,nil ;default:return nil ,_e .Errorf (_cbgff ,"\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",_acff );
|
|
};};func TstImageBitmap ()*Bitmap {return _ebgg .Copy ()};func TstGetScaledSymbol (t *_ca .T ,sm *Bitmap ,scale ...int )*Bitmap {if len (scale )==0{return sm ;};if scale [0]==1{return sm ;};_ddgdf ,_ebgc :=MorphSequence (sm ,MorphProcess {Operation :MopReplicativeBinaryExpansion ,Arguments :scale });
|
|
_b .NoError (t ,_ebgc );return _ddgdf ;};func (_beb *Bitmap )Equals (s *Bitmap )bool {if len (_beb .Data )!=len (s .Data )||_beb .Width !=s .Width ||_beb .Height !=s .Height {return false ;};for _bfa :=0;_bfa < _beb .Height ;_bfa ++{_efa :=_bfa *_beb .RowStride ;
|
|
for _bbba :=0;_bbba < _beb .RowStride ;_bbba ++{if _beb .Data [_efa +_bbba ]!=s .Data [_efa +_bbba ]{return false ;};};};return true ;};func (_ced *Bitmap )setPadBits (_abbae int ){_fcab :=8-_ced .Width %8;if _fcab ==8{return ;};_bdcc :=_ced .Width /8;
|
|
_ddad :=_bgga [_fcab ];if _abbae ==0{_ddad ^=_ddad ;};var _ceab int ;for _cbgg :=0;_cbgg < _ced .Height ;_cbgg ++{_ceab =_cbgg *_ced .RowStride +_bdcc ;if _abbae ==0{_ced .Data [_ceab ]&=_ddad ;}else {_ced .Data [_ceab ]|=_ddad ;};};};func _ceabg (_dcba *Bitmap ,_abfb ,_gfab ,_ddbf ,_adgg int ,_efae RasterOperator ,_cacg *Bitmap ,_gdeg ,_cffb int )error {const _fbba ="\u0072a\u0073t\u0065\u0072\u004f\u0070\u0065\u0072\u0061\u0074\u0069\u006f\u006e";
|
|
if _dcba ==nil {return _e .Error (_fbba ,"\u006e\u0069\u006c\u0020\u0027\u0064\u0065\u0073\u0074\u0027\u0020\u0042i\u0074\u006d\u0061\u0070");};if _efae ==PixDst {return nil ;};switch _efae {case PixClr ,PixSet ,PixNotDst :_fefb (_dcba ,_abfb ,_gfab ,_ddbf ,_adgg ,_efae );
|
|
return nil ;};if _cacg ==nil {_ea .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 _e .Error (_fbba ,"\u006e\u0069l\u0020\u0027\u0073r\u0063\u0027\u0020\u0062\u0069\u0074\u006d\u0061\u0070");};if _ggeg :=_agbb (_dcba ,_abfb ,_gfab ,_ddbf ,_adgg ,_efae ,_cacg ,_gdeg ,_cffb );_ggeg !=nil {return _e .Wrap (_ggeg ,_fbba ,"");};return nil ;
|
|
};func (_aafb *Points )AddPoint (x ,y float32 ){*_aafb =append (*_aafb ,Point {x ,y })};func _dcae (_cabe ,_eggf int )int {if _cabe < _eggf {return _cabe ;};return _eggf ;};func (_addg MorphProcess )getWidthHeight ()(_agfg ,_bgfb int ){return _addg .Arguments [0],_addg .Arguments [1];
|
|
};func TstVSymbol (t *_ca .T ,scale ...int )*Bitmap {_dcbf ,_cebe :=NewWithData (5,5,[]byte {0x88,0x88,0x88,0x50,0x20});_b .NoError (t ,_cebe );return TstGetScaledSymbol (t ,_dcbf ,scale ...);};func _aagg (_ecdfd ,_gabgf int ,_aeggg string )*Selection {_egbca :=&Selection {Height :_ecdfd ,Width :_gabgf ,Name :_aeggg };
|
|
_egbca .Data =make ([][]SelectionValue ,_ecdfd );for _agff :=0;_agff < _ecdfd ;_agff ++{_egbca .Data [_agff ]=make ([]SelectionValue ,_gabgf );};return _egbca ;};func (_bgdb *Bitmap )addBorderGeneral (_ecb ,_daf ,_dcc ,_bbga int ,_abbd int )(*Bitmap ,error ){const _ade ="\u0061\u0064d\u0042\u006f\u0072d\u0065\u0072\u0047\u0065\u006e\u0065\u0072\u0061\u006c";
|
|
if _ecb < 0||_daf < 0||_dcc < 0||_bbga < 0{return nil ,_e .Error (_ade ,"n\u0065\u0067\u0061\u0074iv\u0065 \u0062\u006f\u0072\u0064\u0065r\u0020\u0061\u0064\u0064\u0065\u0064");};_cbef ,_ffe :=_bgdb .Width ,_bgdb .Height ;_cgc :=_cbef +_ecb +_daf ;_gdea :=_ffe +_dcc +_bbga ;
|
|
_cgb :=New (_cgc ,_gdea );_cgb .Color =_bgdb .Color ;_bgbb :=PixClr ;if _abbd > 0{_bgbb =PixSet ;};_bdf :=_cgb .RasterOperation (0,0,_ecb ,_gdea ,_bgbb ,nil ,0,0);if _bdf !=nil {return nil ,_e .Wrap (_bdf ,_ade ,"\u006c\u0065\u0066\u0074");};_bdf =_cgb .RasterOperation (_cgc -_daf ,0,_daf ,_gdea ,_bgbb ,nil ,0,0);
|
|
if _bdf !=nil {return nil ,_e .Wrap (_bdf ,_ade ,"\u0072\u0069\u0067h\u0074");};_bdf =_cgb .RasterOperation (0,0,_cgc ,_dcc ,_bgbb ,nil ,0,0);if _bdf !=nil {return nil ,_e .Wrap (_bdf ,_ade ,"\u0074\u006f\u0070");};_bdf =_cgb .RasterOperation (0,_gdea -_bbga ,_cgc ,_bbga ,_bgbb ,nil ,0,0);
|
|
if _bdf !=nil {return nil ,_e .Wrap (_bdf ,_ade ,"\u0062\u006f\u0074\u0074\u006f\u006d");};_bdf =_cgb .RasterOperation (_ecb ,_dcc ,_cbef ,_ffe ,PixSrc ,_bgdb ,0,0);if _bdf !=nil {return nil ,_e .Wrap (_bdf ,_ade ,"\u0063\u006f\u0070\u0079");};return _cgb ,nil ;
|
|
};func _eecd (_begg *Bitmap ,_fcge ,_cdgf ,_gbeb ,_cbea int ,_bcdd RasterOperator ,_gccbf *Bitmap ,_efda ,_babb int )error {var (_cccbf bool ;_affbf bool ;_aade byte ;_baeb int ;_degd int ;_facgg int ;_fcabg int ;_cagc bool ;_dccad int ;_ebfdef int ;_agfgf int ;
|
|
_bdfg bool ;_adfeca byte ;_dbeda int ;_cbgc int ;_ecgf int ;_badea byte ;_dffa int ;_dcaee int ;_gfdbc uint ;_egdd uint ;_bbaac byte ;_bcgf shift ;_dcgfc bool ;_aefe bool ;_edfb ,_efaf int ;);if _efda &7!=0{_dcaee =8-(_efda &7);};if _fcge &7!=0{_degd =8-(_fcge &7);
|
|
};if _dcaee ==0&&_degd ==0{_bbaac =_bgga [0];}else {if _degd > _dcaee {_gfdbc =uint (_degd -_dcaee );}else {_gfdbc =uint (8-(_dcaee -_degd ));};_egdd =8-_gfdbc ;_bbaac =_bgga [_gfdbc ];};if (_fcge &7)!=0{_cccbf =true ;_baeb =8-(_fcge &7);_aade =_bgga [_baeb ];
|
|
_facgg =_begg .RowStride *_cdgf +(_fcge >>3);_fcabg =_gccbf .RowStride *_babb +(_efda >>3);_dffa =8-(_efda &7);if _baeb > _dffa {_bcgf =_ddfc ;if _gbeb >=_dcaee {_dcgfc =true ;};}else {_bcgf =_cdbg ;};};if _gbeb < _baeb {_affbf =true ;_aade &=_gbdb [8-_baeb +_gbeb ];
|
|
};if !_affbf {_dccad =(_gbeb -_baeb )>>3;if _dccad !=0{_cagc =true ;_ebfdef =_begg .RowStride *_cdgf +((_fcge +_degd )>>3);_agfgf =_gccbf .RowStride *_babb +((_efda +_degd )>>3);};};_dbeda =(_fcge +_gbeb )&7;if !(_affbf ||_dbeda ==0){_bdfg =true ;_adfeca =_gbdb [_dbeda ];
|
|
_cbgc =_begg .RowStride *_cdgf +((_fcge +_degd )>>3)+_dccad ;_ecgf =_gccbf .RowStride *_babb +((_efda +_degd )>>3)+_dccad ;if _dbeda > int (_egdd ){_aefe =true ;};};switch _bcdd {case PixSrc :if _cccbf {for _edfb =0;_edfb < _cbea ;_edfb ++{if _bcgf ==_ddfc {_badea =_gccbf .Data [_fcabg ]<<_gfdbc ;
|
|
if _dcgfc {_badea =_gbfa (_badea ,_gccbf .Data [_fcabg +1]>>_egdd ,_bbaac );};}else {_badea =_gccbf .Data [_fcabg ]>>_egdd ;};_begg .Data [_facgg ]=_gbfa (_begg .Data [_facgg ],_badea ,_aade );_facgg +=_begg .RowStride ;_fcabg +=_gccbf .RowStride ;};};
|
|
if _cagc {for _edfb =0;_edfb < _cbea ;_edfb ++{for _efaf =0;_efaf < _dccad ;_efaf ++{_badea =_gbfa (_gccbf .Data [_agfgf +_efaf ]<<_gfdbc ,_gccbf .Data [_agfgf +_efaf +1]>>_egdd ,_bbaac );_begg .Data [_ebfdef +_efaf ]=_badea ;};_ebfdef +=_begg .RowStride ;
|
|
_agfgf +=_gccbf .RowStride ;};};if _bdfg {for _edfb =0;_edfb < _cbea ;_edfb ++{_badea =_gccbf .Data [_ecgf ]<<_gfdbc ;if _aefe {_badea =_gbfa (_badea ,_gccbf .Data [_ecgf +1]>>_egdd ,_bbaac );};_begg .Data [_cbgc ]=_gbfa (_begg .Data [_cbgc ],_badea ,_adfeca );
|
|
_cbgc +=_begg .RowStride ;_ecgf +=_gccbf .RowStride ;};};case PixNotSrc :if _cccbf {for _edfb =0;_edfb < _cbea ;_edfb ++{if _bcgf ==_ddfc {_badea =_gccbf .Data [_fcabg ]<<_gfdbc ;if _dcgfc {_badea =_gbfa (_badea ,_gccbf .Data [_fcabg +1]>>_egdd ,_bbaac );
|
|
};}else {_badea =_gccbf .Data [_fcabg ]>>_egdd ;};_begg .Data [_facgg ]=_gbfa (_begg .Data [_facgg ],^_badea ,_aade );_facgg +=_begg .RowStride ;_fcabg +=_gccbf .RowStride ;};};if _cagc {for _edfb =0;_edfb < _cbea ;_edfb ++{for _efaf =0;_efaf < _dccad ;
|
|
_efaf ++{_badea =_gbfa (_gccbf .Data [_agfgf +_efaf ]<<_gfdbc ,_gccbf .Data [_agfgf +_efaf +1]>>_egdd ,_bbaac );_begg .Data [_ebfdef +_efaf ]=^_badea ;};_ebfdef +=_begg .RowStride ;_agfgf +=_gccbf .RowStride ;};};if _bdfg {for _edfb =0;_edfb < _cbea ;_edfb ++{_badea =_gccbf .Data [_ecgf ]<<_gfdbc ;
|
|
if _aefe {_badea =_gbfa (_badea ,_gccbf .Data [_ecgf +1]>>_egdd ,_bbaac );};_begg .Data [_cbgc ]=_gbfa (_begg .Data [_cbgc ],^_badea ,_adfeca );_cbgc +=_begg .RowStride ;_ecgf +=_gccbf .RowStride ;};};case PixSrcOrDst :if _cccbf {for _edfb =0;_edfb < _cbea ;
|
|
_edfb ++{if _bcgf ==_ddfc {_badea =_gccbf .Data [_fcabg ]<<_gfdbc ;if _dcgfc {_badea =_gbfa (_badea ,_gccbf .Data [_fcabg +1]>>_egdd ,_bbaac );};}else {_badea =_gccbf .Data [_fcabg ]>>_egdd ;};_begg .Data [_facgg ]=_gbfa (_begg .Data [_facgg ],_badea |_begg .Data [_facgg ],_aade );
|
|
_facgg +=_begg .RowStride ;_fcabg +=_gccbf .RowStride ;};};if _cagc {for _edfb =0;_edfb < _cbea ;_edfb ++{for _efaf =0;_efaf < _dccad ;_efaf ++{_badea =_gbfa (_gccbf .Data [_agfgf +_efaf ]<<_gfdbc ,_gccbf .Data [_agfgf +_efaf +1]>>_egdd ,_bbaac );_begg .Data [_ebfdef +_efaf ]|=_badea ;
|
|
};_ebfdef +=_begg .RowStride ;_agfgf +=_gccbf .RowStride ;};};if _bdfg {for _edfb =0;_edfb < _cbea ;_edfb ++{_badea =_gccbf .Data [_ecgf ]<<_gfdbc ;if _aefe {_badea =_gbfa (_badea ,_gccbf .Data [_ecgf +1]>>_egdd ,_bbaac );};_begg .Data [_cbgc ]=_gbfa (_begg .Data [_cbgc ],_badea |_begg .Data [_cbgc ],_adfeca );
|
|
_cbgc +=_begg .RowStride ;_ecgf +=_gccbf .RowStride ;};};case PixSrcAndDst :if _cccbf {for _edfb =0;_edfb < _cbea ;_edfb ++{if _bcgf ==_ddfc {_badea =_gccbf .Data [_fcabg ]<<_gfdbc ;if _dcgfc {_badea =_gbfa (_badea ,_gccbf .Data [_fcabg +1]>>_egdd ,_bbaac );
|
|
};}else {_badea =_gccbf .Data [_fcabg ]>>_egdd ;};_begg .Data [_facgg ]=_gbfa (_begg .Data [_facgg ],_badea &_begg .Data [_facgg ],_aade );_facgg +=_begg .RowStride ;_fcabg +=_gccbf .RowStride ;};};if _cagc {for _edfb =0;_edfb < _cbea ;_edfb ++{for _efaf =0;
|
|
_efaf < _dccad ;_efaf ++{_badea =_gbfa (_gccbf .Data [_agfgf +_efaf ]<<_gfdbc ,_gccbf .Data [_agfgf +_efaf +1]>>_egdd ,_bbaac );_begg .Data [_ebfdef +_efaf ]&=_badea ;};_ebfdef +=_begg .RowStride ;_agfgf +=_gccbf .RowStride ;};};if _bdfg {for _edfb =0;
|
|
_edfb < _cbea ;_edfb ++{_badea =_gccbf .Data [_ecgf ]<<_gfdbc ;if _aefe {_badea =_gbfa (_badea ,_gccbf .Data [_ecgf +1]>>_egdd ,_bbaac );};_begg .Data [_cbgc ]=_gbfa (_begg .Data [_cbgc ],_badea &_begg .Data [_cbgc ],_adfeca );_cbgc +=_begg .RowStride ;
|
|
_ecgf +=_gccbf .RowStride ;};};case PixSrcXorDst :if _cccbf {for _edfb =0;_edfb < _cbea ;_edfb ++{if _bcgf ==_ddfc {_badea =_gccbf .Data [_fcabg ]<<_gfdbc ;if _dcgfc {_badea =_gbfa (_badea ,_gccbf .Data [_fcabg +1]>>_egdd ,_bbaac );};}else {_badea =_gccbf .Data [_fcabg ]>>_egdd ;
|
|
};_begg .Data [_facgg ]=_gbfa (_begg .Data [_facgg ],_badea ^_begg .Data [_facgg ],_aade );_facgg +=_begg .RowStride ;_fcabg +=_gccbf .RowStride ;};};if _cagc {for _edfb =0;_edfb < _cbea ;_edfb ++{for _efaf =0;_efaf < _dccad ;_efaf ++{_badea =_gbfa (_gccbf .Data [_agfgf +_efaf ]<<_gfdbc ,_gccbf .Data [_agfgf +_efaf +1]>>_egdd ,_bbaac );
|
|
_begg .Data [_ebfdef +_efaf ]^=_badea ;};_ebfdef +=_begg .RowStride ;_agfgf +=_gccbf .RowStride ;};};if _bdfg {for _edfb =0;_edfb < _cbea ;_edfb ++{_badea =_gccbf .Data [_ecgf ]<<_gfdbc ;if _aefe {_badea =_gbfa (_badea ,_gccbf .Data [_ecgf +1]>>_egdd ,_bbaac );
|
|
};_begg .Data [_cbgc ]=_gbfa (_begg .Data [_cbgc ],_badea ^_begg .Data [_cbgc ],_adfeca );_cbgc +=_begg .RowStride ;_ecgf +=_gccbf .RowStride ;};};case PixNotSrcOrDst :if _cccbf {for _edfb =0;_edfb < _cbea ;_edfb ++{if _bcgf ==_ddfc {_badea =_gccbf .Data [_fcabg ]<<_gfdbc ;
|
|
if _dcgfc {_badea =_gbfa (_badea ,_gccbf .Data [_fcabg +1]>>_egdd ,_bbaac );};}else {_badea =_gccbf .Data [_fcabg ]>>_egdd ;};_begg .Data [_facgg ]=_gbfa (_begg .Data [_facgg ],^_badea |_begg .Data [_facgg ],_aade );_facgg +=_begg .RowStride ;_fcabg +=_gccbf .RowStride ;
|
|
};};if _cagc {for _edfb =0;_edfb < _cbea ;_edfb ++{for _efaf =0;_efaf < _dccad ;_efaf ++{_badea =_gbfa (_gccbf .Data [_agfgf +_efaf ]<<_gfdbc ,_gccbf .Data [_agfgf +_efaf +1]>>_egdd ,_bbaac );_begg .Data [_ebfdef +_efaf ]|=^_badea ;};_ebfdef +=_begg .RowStride ;
|
|
_agfgf +=_gccbf .RowStride ;};};if _bdfg {for _edfb =0;_edfb < _cbea ;_edfb ++{_badea =_gccbf .Data [_ecgf ]<<_gfdbc ;if _aefe {_badea =_gbfa (_badea ,_gccbf .Data [_ecgf +1]>>_egdd ,_bbaac );};_begg .Data [_cbgc ]=_gbfa (_begg .Data [_cbgc ],^_badea |_begg .Data [_cbgc ],_adfeca );
|
|
_cbgc +=_begg .RowStride ;_ecgf +=_gccbf .RowStride ;};};case PixNotSrcAndDst :if _cccbf {for _edfb =0;_edfb < _cbea ;_edfb ++{if _bcgf ==_ddfc {_badea =_gccbf .Data [_fcabg ]<<_gfdbc ;if _dcgfc {_badea =_gbfa (_badea ,_gccbf .Data [_fcabg +1]>>_egdd ,_bbaac );
|
|
};}else {_badea =_gccbf .Data [_fcabg ]>>_egdd ;};_begg .Data [_facgg ]=_gbfa (_begg .Data [_facgg ],^_badea &_begg .Data [_facgg ],_aade );_facgg +=_begg .RowStride ;_fcabg +=_gccbf .RowStride ;};};if _cagc {for _edfb =0;_edfb < _cbea ;_edfb ++{for _efaf =0;
|
|
_efaf < _dccad ;_efaf ++{_badea =_gbfa (_gccbf .Data [_agfgf +_efaf ]<<_gfdbc ,_gccbf .Data [_agfgf +_efaf +1]>>_egdd ,_bbaac );_begg .Data [_ebfdef +_efaf ]&=^_badea ;};_ebfdef +=_begg .RowStride ;_agfgf +=_gccbf .RowStride ;};};if _bdfg {for _edfb =0;
|
|
_edfb < _cbea ;_edfb ++{_badea =_gccbf .Data [_ecgf ]<<_gfdbc ;if _aefe {_badea =_gbfa (_badea ,_gccbf .Data [_ecgf +1]>>_egdd ,_bbaac );};_begg .Data [_cbgc ]=_gbfa (_begg .Data [_cbgc ],^_badea &_begg .Data [_cbgc ],_adfeca );_cbgc +=_begg .RowStride ;
|
|
_ecgf +=_gccbf .RowStride ;};};case PixSrcOrNotDst :if _cccbf {for _edfb =0;_edfb < _cbea ;_edfb ++{if _bcgf ==_ddfc {_badea =_gccbf .Data [_fcabg ]<<_gfdbc ;if _dcgfc {_badea =_gbfa (_badea ,_gccbf .Data [_fcabg +1]>>_egdd ,_bbaac );};}else {_badea =_gccbf .Data [_fcabg ]>>_egdd ;
|
|
};_begg .Data [_facgg ]=_gbfa (_begg .Data [_facgg ],_badea |^_begg .Data [_facgg ],_aade );_facgg +=_begg .RowStride ;_fcabg +=_gccbf .RowStride ;};};if _cagc {for _edfb =0;_edfb < _cbea ;_edfb ++{for _efaf =0;_efaf < _dccad ;_efaf ++{_badea =_gbfa (_gccbf .Data [_agfgf +_efaf ]<<_gfdbc ,_gccbf .Data [_agfgf +_efaf +1]>>_egdd ,_bbaac );
|
|
_begg .Data [_ebfdef +_efaf ]=_badea |^_begg .Data [_ebfdef +_efaf ];};_ebfdef +=_begg .RowStride ;_agfgf +=_gccbf .RowStride ;};};if _bdfg {for _edfb =0;_edfb < _cbea ;_edfb ++{_badea =_gccbf .Data [_ecgf ]<<_gfdbc ;if _aefe {_badea =_gbfa (_badea ,_gccbf .Data [_ecgf +1]>>_egdd ,_bbaac );
|
|
};_begg .Data [_cbgc ]=_gbfa (_begg .Data [_cbgc ],_badea |^_begg .Data [_cbgc ],_adfeca );_cbgc +=_begg .RowStride ;_ecgf +=_gccbf .RowStride ;};};case PixSrcAndNotDst :if _cccbf {for _edfb =0;_edfb < _cbea ;_edfb ++{if _bcgf ==_ddfc {_badea =_gccbf .Data [_fcabg ]<<_gfdbc ;
|
|
if _dcgfc {_badea =_gbfa (_badea ,_gccbf .Data [_fcabg +1]>>_egdd ,_bbaac );};}else {_badea =_gccbf .Data [_fcabg ]>>_egdd ;};_begg .Data [_facgg ]=_gbfa (_begg .Data [_facgg ],_badea &^_begg .Data [_facgg ],_aade );_facgg +=_begg .RowStride ;_fcabg +=_gccbf .RowStride ;
|
|
};};if _cagc {for _edfb =0;_edfb < _cbea ;_edfb ++{for _efaf =0;_efaf < _dccad ;_efaf ++{_badea =_gbfa (_gccbf .Data [_agfgf +_efaf ]<<_gfdbc ,_gccbf .Data [_agfgf +_efaf +1]>>_egdd ,_bbaac );_begg .Data [_ebfdef +_efaf ]=_badea &^_begg .Data [_ebfdef +_efaf ];
|
|
};_ebfdef +=_begg .RowStride ;_agfgf +=_gccbf .RowStride ;};};if _bdfg {for _edfb =0;_edfb < _cbea ;_edfb ++{_badea =_gccbf .Data [_ecgf ]<<_gfdbc ;if _aefe {_badea =_gbfa (_badea ,_gccbf .Data [_ecgf +1]>>_egdd ,_bbaac );};_begg .Data [_cbgc ]=_gbfa (_begg .Data [_cbgc ],_badea &^_begg .Data [_cbgc ],_adfeca );
|
|
_cbgc +=_begg .RowStride ;_ecgf +=_gccbf .RowStride ;};};case PixNotPixSrcOrDst :if _cccbf {for _edfb =0;_edfb < _cbea ;_edfb ++{if _bcgf ==_ddfc {_badea =_gccbf .Data [_fcabg ]<<_gfdbc ;if _dcgfc {_badea =_gbfa (_badea ,_gccbf .Data [_fcabg +1]>>_egdd ,_bbaac );
|
|
};}else {_badea =_gccbf .Data [_fcabg ]>>_egdd ;};_begg .Data [_facgg ]=_gbfa (_begg .Data [_facgg ],^(_badea |_begg .Data [_facgg ]),_aade );_facgg +=_begg .RowStride ;_fcabg +=_gccbf .RowStride ;};};if _cagc {for _edfb =0;_edfb < _cbea ;_edfb ++{for _efaf =0;
|
|
_efaf < _dccad ;_efaf ++{_badea =_gbfa (_gccbf .Data [_agfgf +_efaf ]<<_gfdbc ,_gccbf .Data [_agfgf +_efaf +1]>>_egdd ,_bbaac );_begg .Data [_ebfdef +_efaf ]=^(_badea |_begg .Data [_ebfdef +_efaf ]);};_ebfdef +=_begg .RowStride ;_agfgf +=_gccbf .RowStride ;
|
|
};};if _bdfg {for _edfb =0;_edfb < _cbea ;_edfb ++{_badea =_gccbf .Data [_ecgf ]<<_gfdbc ;if _aefe {_badea =_gbfa (_badea ,_gccbf .Data [_ecgf +1]>>_egdd ,_bbaac );};_begg .Data [_cbgc ]=_gbfa (_begg .Data [_cbgc ],^(_badea |_begg .Data [_cbgc ]),_adfeca );
|
|
_cbgc +=_begg .RowStride ;_ecgf +=_gccbf .RowStride ;};};case PixNotPixSrcAndDst :if _cccbf {for _edfb =0;_edfb < _cbea ;_edfb ++{if _bcgf ==_ddfc {_badea =_gccbf .Data [_fcabg ]<<_gfdbc ;if _dcgfc {_badea =_gbfa (_badea ,_gccbf .Data [_fcabg +1]>>_egdd ,_bbaac );
|
|
};}else {_badea =_gccbf .Data [_fcabg ]>>_egdd ;};_begg .Data [_facgg ]=_gbfa (_begg .Data [_facgg ],^(_badea &_begg .Data [_facgg ]),_aade );_facgg +=_begg .RowStride ;_fcabg +=_gccbf .RowStride ;};};if _cagc {for _edfb =0;_edfb < _cbea ;_edfb ++{for _efaf =0;
|
|
_efaf < _dccad ;_efaf ++{_badea =_gbfa (_gccbf .Data [_agfgf +_efaf ]<<_gfdbc ,_gccbf .Data [_agfgf +_efaf +1]>>_egdd ,_bbaac );_begg .Data [_ebfdef +_efaf ]=^(_badea &_begg .Data [_ebfdef +_efaf ]);};_ebfdef +=_begg .RowStride ;_agfgf +=_gccbf .RowStride ;
|
|
};};if _bdfg {for _edfb =0;_edfb < _cbea ;_edfb ++{_badea =_gccbf .Data [_ecgf ]<<_gfdbc ;if _aefe {_badea =_gbfa (_badea ,_gccbf .Data [_ecgf +1]>>_egdd ,_bbaac );};_begg .Data [_cbgc ]=_gbfa (_begg .Data [_cbgc ],^(_badea &_begg .Data [_cbgc ]),_adfeca );
|
|
_cbgc +=_begg .RowStride ;_ecgf +=_gccbf .RowStride ;};};case PixNotPixSrcXorDst :if _cccbf {for _edfb =0;_edfb < _cbea ;_edfb ++{if _bcgf ==_ddfc {_badea =_gccbf .Data [_fcabg ]<<_gfdbc ;if _dcgfc {_badea =_gbfa (_badea ,_gccbf .Data [_fcabg +1]>>_egdd ,_bbaac );
|
|
};}else {_badea =_gccbf .Data [_fcabg ]>>_egdd ;};_begg .Data [_facgg ]=_gbfa (_begg .Data [_facgg ],^(_badea ^_begg .Data [_facgg ]),_aade );_facgg +=_begg .RowStride ;_fcabg +=_gccbf .RowStride ;};};if _cagc {for _edfb =0;_edfb < _cbea ;_edfb ++{for _efaf =0;
|
|
_efaf < _dccad ;_efaf ++{_badea =_gbfa (_gccbf .Data [_agfgf +_efaf ]<<_gfdbc ,_gccbf .Data [_agfgf +_efaf +1]>>_egdd ,_bbaac );_begg .Data [_ebfdef +_efaf ]=^(_badea ^_begg .Data [_ebfdef +_efaf ]);};_ebfdef +=_begg .RowStride ;_agfgf +=_gccbf .RowStride ;
|
|
};};if _bdfg {for _edfb =0;_edfb < _cbea ;_edfb ++{_badea =_gccbf .Data [_ecgf ]<<_gfdbc ;if _aefe {_badea =_gbfa (_badea ,_gccbf .Data [_ecgf +1]>>_egdd ,_bbaac );};_begg .Data [_cbgc ]=_gbfa (_begg .Data [_cbgc ],^(_badea ^_begg .Data [_cbgc ]),_adfeca );
|
|
_cbgc +=_begg .RowStride ;_ecgf +=_gccbf .RowStride ;};};default:_ea .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",_bcdd );
|
|
return _e .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 (_cdf *Bitmap )SizesEqual (s *Bitmap )bool {if _cdf ==s {return true ;};if _cdf .Width !=s .Width ||_cdf .Height !=s .Height {return false ;};return true ;};type SelectionValue int ;func CorrelationScoreSimple (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab []int )(_gacf float64 ,_ebfdec error ){const _gbcb ="\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 _gacf ,_e .Error (_gbcb ,"n\u0069l\u0020\u0062\u0069\u0074\u006d\u0061\u0070\u0073 \u0070\u0072\u006f\u0076id\u0065\u0064");};if tab ==nil {return _gacf ,_e .Error (_gbcb ,"\u0074\u0061\u0062\u0020\u0075\u006e\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};if area1 ==0||area2 ==0{return _gacf ,_e .Error (_gbcb ,"\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064\u0020\u0061\u0072e\u0061\u0073\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065 \u003e\u0020\u0030");};_gcgf ,_gafac :=bm1 .Width ,bm1 .Height ;_fafa ,_gdgf :=bm2 .Width ,bm2 .Height ;
|
|
if _gegb (_gcgf -_fafa )> maxDiffW {return 0,nil ;};if _gegb (_gafac -_gdgf )> maxDiffH {return 0,nil ;};var _gcgd ,_gdgc int ;if delX >=0{_gcgd =int (delX +0.5);}else {_gcgd =int (delX -0.5);};if delY >=0{_gdgc =int (delY +0.5);}else {_gdgc =int (delY -0.5);
|
|
};_baba :=bm1 .createTemplate ();if _ebfdec =_baba .RasterOperation (_gcgd ,_gdgc ,_fafa ,_gdgf ,PixSrc ,bm2 ,0,0);_ebfdec !=nil {return _gacf ,_e .Wrap (_ebfdec ,_gbcb ,"\u0062m\u0032 \u0074\u006f\u0020\u0054\u0065\u006d\u0070\u006c\u0061\u0074\u0065");
|
|
};if _ebfdec =_baba .RasterOperation (0,0,_gcgf ,_gafac ,PixSrcAndDst ,bm1 ,0,0);_ebfdec !=nil {return _gacf ,_e .Wrap (_ebfdec ,_gbcb ,"b\u006d\u0031\u0020\u0061\u006e\u0064\u0020\u0062\u006d\u0054");};_baacg :=_baba .countPixels ();_gacf =float64 (_baacg )*float64 (_baacg )/(float64 (area1 )*float64 (area2 ));
|
|
return _gacf ,nil ;};type MorphProcess struct{Operation MorphOperation ;Arguments []int ;};func TstESymbol (t *_ca .T ,scale ...int )*Bitmap {_cdeaf ,_bfaaef :=NewWithData (4,5,[]byte {0xF0,0x80,0xE0,0x80,0xF0});_b .NoError (t ,_bfaaef );return TstGetScaledSymbol (t ,_cdeaf ,scale ...);
|
|
};func (_fda *Bitmap )RemoveBorderGeneral (left ,right ,top ,bot int )(*Bitmap ,error ){return _fda .removeBorderGeneral (left ,right ,top ,bot );}; |