mirror of
https://github.com/unidoc/unipdf.git
synced 2025-05-02 22:17:06 +08:00
666 lines
196 KiB
Go
666 lines
196 KiB
Go
//
|
|
// Copyright 2020 FoxyUtils ehf. All rights reserved.
|
|
//
|
|
// This is a commercial product and requires a license to operate.
|
|
// A trial license can be obtained at https://unidoc.io
|
|
//
|
|
// DO NOT EDIT: generated by unitwist Go source code obfuscator.
|
|
//
|
|
// Use of this source code is governed by the UniDoc End User License Agreement
|
|
// terms that can be accessed at https://unidoc.io/eula/
|
|
|
|
package bitmap ;import (_cf "encoding/binary";_ca "github.com/stretchr/testify/require";_cee "github.com/unidoc/unipdf/v3/common";_g "github.com/unidoc/unipdf/v3/internal/bitwise";_b "github.com/unidoc/unipdf/v3/internal/imageutil";_ce "github.com/unidoc/unipdf/v3/internal/jbig2/basic";
|
|
_a "github.com/unidoc/unipdf/v3/internal/jbig2/errors";_de "image";_bb "math";_ag "sort";_d "strings";_f "testing";);type Boxes []*_de .Rectangle ;func (_cefcb *ClassedPoints )GetIntYByClass (i int )(int ,error ){const _fffc ="\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 >=_cefcb .IntSlice .Size (){return 0,_a .Errorf (_fffc ,"\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 (_cefcb .YAtIndex (i )),nil ;};type CombinationOperator int ;func (_edddf *BitmapsArray )AddBitmaps (bm *Bitmaps ){_edddf .Values =append (_edddf .Values ,bm )};func (_bgg *Bitmap )countPixels ()int {var (_ecb int ;_eae uint8 ;_fff byte ;_dbea int ;
|
|
);_dfbf :=_bgg .RowStride ;_aad :=uint (_bgg .Width &0x07);if _aad !=0{_eae =uint8 ((0xff<<(8-_aad ))&0xff);_dfbf --;};for _bbed :=0;_bbed < _bgg .Height ;_bbed ++{for _dbea =0;_dbea < _dfbf ;_dbea ++{_fff =_bgg .Data [_bbed *_bgg .RowStride +_dbea ];_ecb +=int (_aae [_fff ]);
|
|
};if _aad !=0{_ecb +=int (_aae [_bgg .Data [_bbed *_bgg .RowStride +_dbea ]&_eae ]);};};return _ecb ;};func (_bbac *ClassedPoints )GetIntXByClass (i int )(int ,error ){const _efbe ="\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 >=_bbac .IntSlice .Size (){return 0,_a .Errorf (_efbe ,"\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 (_bbac .XAtIndex (i )),nil ;};func Centroid (bm *Bitmap ,centTab ,sumTab []int )(Point ,error ){return bm .centroid (centTab ,sumTab )};var _aae [256]uint8 ;func (_dcge *ClassedPoints )GroupByY ()([]*ClassedPoints ,error ){const _dfadg ="\u0043\u006c\u0061\u0073se\u0064\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0072\u006f\u0075\u0070\u0042y\u0059";
|
|
if _fafbf :=_dcge .validateIntSlice ();_fafbf !=nil {return nil ,_a .Wrap (_fafbf ,_dfadg ,"");};if _dcge .IntSlice .Size ()==0{return nil ,_a .Error (_dfadg ,"\u004e\u006f\u0020\u0063la\u0073\u0073\u0065\u0073\u0020\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064");
|
|
};_dcge .SortByY ();var (_dacce []*ClassedPoints ;_abbd int ;);_gcfa :=-1;var _fde *ClassedPoints ;for _ecbf :=0;_ecbf < len (_dcge .IntSlice );_ecbf ++{_abbd =int (_dcge .YAtIndex (_ecbf ));if _abbd !=_gcfa {_fde =&ClassedPoints {Points :_dcge .Points };
|
|
_gcfa =_abbd ;_dacce =append (_dacce ,_fde );};_fde .IntSlice =append (_fde .IntSlice ,_dcge .IntSlice [_ecbf ]);};for _ ,_fgfcc :=range _dacce {_fgfcc .SortByX ();};return _dacce ,nil ;};func (_eda *Bitmap )setBit (_faca int ){_eda .Data [(_faca >>3)]|=0x80>>uint (_faca &7)};
|
|
func TstASymbol (t *_f .T )*Bitmap {t .Helper ();_ece :=New (6,6);_ca .NoError (t ,_ece .SetPixel (1,0,1));_ca .NoError (t ,_ece .SetPixel (2,0,1));_ca .NoError (t ,_ece .SetPixel (3,0,1));_ca .NoError (t ,_ece .SetPixel (4,0,1));_ca .NoError (t ,_ece .SetPixel (5,1,1));
|
|
_ca .NoError (t ,_ece .SetPixel (1,2,1));_ca .NoError (t ,_ece .SetPixel (2,2,1));_ca .NoError (t ,_ece .SetPixel (3,2,1));_ca .NoError (t ,_ece .SetPixel (4,2,1));_ca .NoError (t ,_ece .SetPixel (5,2,1));_ca .NoError (t ,_ece .SetPixel (0,3,1));_ca .NoError (t ,_ece .SetPixel (5,3,1));
|
|
_ca .NoError (t ,_ece .SetPixel (0,4,1));_ca .NoError (t ,_ece .SetPixel (5,4,1));_ca .NoError (t ,_ece .SetPixel (1,5,1));_ca .NoError (t ,_ece .SetPixel (2,5,1));_ca .NoError (t ,_ece .SetPixel (3,5,1));_ca .NoError (t ,_ece .SetPixel (4,5,1));_ca .NoError (t ,_ece .SetPixel (5,5,1));
|
|
return _ece ;};type Selection struct{Height ,Width int ;Cx ,Cy int ;Name string ;Data [][]SelectionValue ;};func (_efad *Bitmap )thresholdPixelSum (_ecd int )bool {var (_dbgc int ;_egda uint8 ;_gea byte ;_dfbc int ;);_afd :=_efad .RowStride ;_fdbf :=uint (_efad .Width &0x07);
|
|
if _fdbf !=0{_egda =uint8 ((0xff<<(8-_fdbf ))&0xff);_afd --;};for _dcae :=0;_dcae < _efad .Height ;_dcae ++{for _dfbc =0;_dfbc < _afd ;_dfbc ++{_gea =_efad .Data [_dcae *_efad .RowStride +_dfbc ];_dbgc +=int (_aae [_gea ]);};if _fdbf !=0{_gea =_efad .Data [_dcae *_efad .RowStride +_dfbc ]&_egda ;
|
|
_dbgc +=int (_aae [_gea ]);};if _dbgc > _ecd {return true ;};};return false ;};var (_bagc =_ffd ();_ggfa =_fee ();_aebd =_bda (););func (_cbgga Points )XSorter ()func (_eeg ,_gdca int )bool {return func (_dada ,_bebdd int )bool {return _cbgga [_dada ].X < _cbgga [_bebdd ].X };
|
|
};func (_efgf *Bitmap )inverseData (){if _geeg :=_efgf .RasterOperation (0,0,_efgf .Width ,_efgf .Height ,PixNotDst ,nil ,0,0);_geeg !=nil {_cee .Log .Debug ("\u0049n\u0076\u0065\u0072\u0073e\u0020\u0064\u0061\u0074\u0061 \u0066a\u0069l\u0065\u0064\u003a\u0020\u0027\u0025\u0076'",_geeg );
|
|
};if _efgf .Color ==Chocolate {_efgf .Color =Vanilla ;}else {_efgf .Color =Chocolate ;};};func TstGetScaledSymbol (t *_f .T ,sm *Bitmap ,scale ...int )*Bitmap {if len (scale )==0{return sm ;};if scale [0]==1{return sm ;};_fceg ,_cdbf :=MorphSequence (sm ,MorphProcess {Operation :MopReplicativeBinaryExpansion ,Arguments :scale });
|
|
_ca .NoError (t ,_cdbf );return _fceg ;};func init (){for _dag :=0;_dag < 256;_dag ++{_aae [_dag ]=uint8 (_dag &0x1)+(uint8 (_dag >>1)&0x1)+(uint8 (_dag >>2)&0x1)+(uint8 (_dag >>3)&0x1)+(uint8 (_dag >>4)&0x1)+(uint8 (_dag >>5)&0x1)+(uint8 (_dag >>6)&0x1)+(uint8 (_dag >>7)&0x1);
|
|
};};type Color int ;func _dcd (_cagd ,_dcf ,_dced *Bitmap )(*Bitmap ,error ){const _ffbd ="\u0073\u0075\u0062\u0074\u0072\u0061\u0063\u0074";if _dcf ==nil {return nil ,_a .Error (_ffbd ,"'\u0073\u0031\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};
|
|
if _dced ==nil {return nil ,_a .Error (_ffbd ,"'\u0073\u0032\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};var _eebf error ;switch {case _cagd ==_dcf :if _eebf =_cagd .RasterOperation (0,0,_dcf .Width ,_dcf .Height ,PixNotSrcAndDst ,_dced ,0,0);_eebf !=nil {return nil ,_a .Wrap (_eebf ,_ffbd ,"\u0064 \u003d\u003d\u0020\u0073\u0031");
|
|
};case _cagd ==_dced :if _eebf =_cagd .RasterOperation (0,0,_dcf .Width ,_dcf .Height ,PixNotSrcAndDst ,_dcf ,0,0);_eebf !=nil {return nil ,_a .Wrap (_eebf ,_ffbd ,"\u0064 \u003d\u003d\u0020\u0073\u0032");};default:_cagd ,_eebf =_abdb (_cagd ,_dcf );if _eebf !=nil {return nil ,_a .Wrap (_eebf ,_ffbd ,"");
|
|
};if _eebf =_cagd .RasterOperation (0,0,_dcf .Width ,_dcf .Height ,PixNotSrcAndDst ,_dced ,0,0);_eebf !=nil {return nil ,_a .Wrap (_eebf ,_ffbd ,"\u0064e\u0066\u0061\u0075\u006c\u0074");};};return _cagd ,nil ;};func (_adcc *Bitmap )GetPixel (x ,y int )bool {_caaf :=_adcc .GetByteIndex (x ,y );
|
|
_dbef :=_adcc .GetBitOffset (x );_fgc :=uint (7-_dbef );if _caaf > len (_adcc .Data )-1{_cee .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 ,_adcc );
|
|
return false ;};if (_adcc .Data [_caaf ]>>_fgc )&0x01>=1{return true ;};return false ;};func (_ccdg *Boxes )makeSizeIndicator (_ffde ,_cbgd int ,_fbdd LocationFilter ,_gaff SizeComparison )*_ce .NumSlice {_ecbd :=&_ce .NumSlice {};var _agbd ,_ggede ,_cccd int ;
|
|
for _ ,_eadc :=range *_ccdg {_agbd =0;_ggede ,_cccd =_eadc .Dx (),_eadc .Dy ();switch _fbdd {case LocSelectWidth :if (_gaff ==SizeSelectIfLT &&_ggede < _ffde )||(_gaff ==SizeSelectIfGT &&_ggede > _ffde )||(_gaff ==SizeSelectIfLTE &&_ggede <=_ffde )||(_gaff ==SizeSelectIfGTE &&_ggede >=_ffde ){_agbd =1;
|
|
};case LocSelectHeight :if (_gaff ==SizeSelectIfLT &&_cccd < _cbgd )||(_gaff ==SizeSelectIfGT &&_cccd > _cbgd )||(_gaff ==SizeSelectIfLTE &&_cccd <=_cbgd )||(_gaff ==SizeSelectIfGTE &&_cccd >=_cbgd ){_agbd =1;};case LocSelectIfEither :if (_gaff ==SizeSelectIfLT &&(_cccd < _cbgd ||_ggede < _ffde ))||(_gaff ==SizeSelectIfGT &&(_cccd > _cbgd ||_ggede > _ffde ))||(_gaff ==SizeSelectIfLTE &&(_cccd <=_cbgd ||_ggede <=_ffde ))||(_gaff ==SizeSelectIfGTE &&(_cccd >=_cbgd ||_ggede >=_ffde )){_agbd =1;
|
|
};case LocSelectIfBoth :if (_gaff ==SizeSelectIfLT &&(_cccd < _cbgd &&_ggede < _ffde ))||(_gaff ==SizeSelectIfGT &&(_cccd > _cbgd &&_ggede > _ffde ))||(_gaff ==SizeSelectIfLTE &&(_cccd <=_cbgd &&_ggede <=_ffde ))||(_gaff ==SizeSelectIfGTE &&(_cccd >=_cbgd &&_ggede >=_ffde )){_agbd =1;
|
|
};};_ecbd .AddInt (_agbd );};return _ecbd ;};func (_cebfd *ClassedPoints )ySortFunction ()func (_egcb int ,_gcce int )bool {return func (_bgae ,_deee int )bool {return _cebfd .YAtIndex (_bgae )< _cebfd .YAtIndex (_deee )};};func (_aadb Points )Size ()int {return len (_aadb )};
|
|
func NewClassedPoints (points *Points ,classes _ce .IntSlice )(*ClassedPoints ,error ){const _aabc ="\u004e\u0065w\u0043\u006c\u0061s\u0073\u0065\u0064\u0050\u006f\u0069\u006e\u0074\u0073";if points ==nil {return nil ,_a .Error (_aabc ,"\u0070\u0072\u006f\u0076id\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0070\u006f\u0069\u006e\u0074\u0073");
|
|
};if classes ==nil {return nil ,_a .Error (_aabc ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0063\u006c\u0061ss\u0065\u0073");};_beeb :=&ClassedPoints {Points :points ,IntSlice :classes };if _dcfg :=_beeb .validateIntSlice ();_dcfg !=nil {return nil ,_a .Wrap (_dcfg ,_aabc ,"");
|
|
};return _beeb ,nil ;};func (_adc *Bitmap )GetByte (index int )(byte ,error ){if index > len (_adc .Data )-1||index < 0{return 0,_a .Errorf ("\u0047e\u0074\u0042\u0079\u0074\u0065","\u0069\u006e\u0064\u0065x:\u0020\u0025\u0064\u0020\u006f\u0075\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006eg\u0065",index );
|
|
};return _adc .Data [index ],nil ;};func _gcfd (_eafd *Bitmap ,_fdea ,_cebe ,_gfce ,_dfgd int ,_ggdd RasterOperator ,_ccgdb *Bitmap ,_beggc ,_egba int )error {var (_aeaad byte ;_ddfef int ;_acbfb int ;_gggfe ,_adgb int ;_aade ,_efdd int ;);_ecgf :=_gfce >>3;
|
|
_cbeg :=_gfce &7;if _cbeg > 0{_aeaad =_aagcg [_cbeg ];};_ddfef =_ccgdb .RowStride *_egba +(_beggc >>3);_acbfb =_eafd .RowStride *_cebe +(_fdea >>3);switch _ggdd {case PixSrc :for _aade =0;_aade < _dfgd ;_aade ++{_gggfe =_ddfef +_aade *_ccgdb .RowStride ;
|
|
_adgb =_acbfb +_aade *_eafd .RowStride ;for _efdd =0;_efdd < _ecgf ;_efdd ++{_eafd .Data [_adgb ]=_ccgdb .Data [_gggfe ];_adgb ++;_gggfe ++;};if _cbeg > 0{_eafd .Data [_adgb ]=_cgadc (_eafd .Data [_adgb ],_ccgdb .Data [_gggfe ],_aeaad );};};case PixNotSrc :for _aade =0;
|
|
_aade < _dfgd ;_aade ++{_gggfe =_ddfef +_aade *_ccgdb .RowStride ;_adgb =_acbfb +_aade *_eafd .RowStride ;for _efdd =0;_efdd < _ecgf ;_efdd ++{_eafd .Data [_adgb ]=^(_ccgdb .Data [_gggfe ]);_adgb ++;_gggfe ++;};if _cbeg > 0{_eafd .Data [_adgb ]=_cgadc (_eafd .Data [_adgb ],^_ccgdb .Data [_gggfe ],_aeaad );
|
|
};};case PixSrcOrDst :for _aade =0;_aade < _dfgd ;_aade ++{_gggfe =_ddfef +_aade *_ccgdb .RowStride ;_adgb =_acbfb +_aade *_eafd .RowStride ;for _efdd =0;_efdd < _ecgf ;_efdd ++{_eafd .Data [_adgb ]|=_ccgdb .Data [_gggfe ];_adgb ++;_gggfe ++;};if _cbeg > 0{_eafd .Data [_adgb ]=_cgadc (_eafd .Data [_adgb ],_ccgdb .Data [_gggfe ]|_eafd .Data [_adgb ],_aeaad );
|
|
};};case PixSrcAndDst :for _aade =0;_aade < _dfgd ;_aade ++{_gggfe =_ddfef +_aade *_ccgdb .RowStride ;_adgb =_acbfb +_aade *_eafd .RowStride ;for _efdd =0;_efdd < _ecgf ;_efdd ++{_eafd .Data [_adgb ]&=_ccgdb .Data [_gggfe ];_adgb ++;_gggfe ++;};if _cbeg > 0{_eafd .Data [_adgb ]=_cgadc (_eafd .Data [_adgb ],_ccgdb .Data [_gggfe ]&_eafd .Data [_adgb ],_aeaad );
|
|
};};case PixSrcXorDst :for _aade =0;_aade < _dfgd ;_aade ++{_gggfe =_ddfef +_aade *_ccgdb .RowStride ;_adgb =_acbfb +_aade *_eafd .RowStride ;for _efdd =0;_efdd < _ecgf ;_efdd ++{_eafd .Data [_adgb ]^=_ccgdb .Data [_gggfe ];_adgb ++;_gggfe ++;};if _cbeg > 0{_eafd .Data [_adgb ]=_cgadc (_eafd .Data [_adgb ],_ccgdb .Data [_gggfe ]^_eafd .Data [_adgb ],_aeaad );
|
|
};};case PixNotSrcOrDst :for _aade =0;_aade < _dfgd ;_aade ++{_gggfe =_ddfef +_aade *_ccgdb .RowStride ;_adgb =_acbfb +_aade *_eafd .RowStride ;for _efdd =0;_efdd < _ecgf ;_efdd ++{_eafd .Data [_adgb ]|=^(_ccgdb .Data [_gggfe ]);_adgb ++;_gggfe ++;};if _cbeg > 0{_eafd .Data [_adgb ]=_cgadc (_eafd .Data [_adgb ],^(_ccgdb .Data [_gggfe ])|_eafd .Data [_adgb ],_aeaad );
|
|
};};case PixNotSrcAndDst :for _aade =0;_aade < _dfgd ;_aade ++{_gggfe =_ddfef +_aade *_ccgdb .RowStride ;_adgb =_acbfb +_aade *_eafd .RowStride ;for _efdd =0;_efdd < _ecgf ;_efdd ++{_eafd .Data [_adgb ]&=^(_ccgdb .Data [_gggfe ]);_adgb ++;_gggfe ++;};if _cbeg > 0{_eafd .Data [_adgb ]=_cgadc (_eafd .Data [_adgb ],^(_ccgdb .Data [_gggfe ])&_eafd .Data [_adgb ],_aeaad );
|
|
};};case PixSrcOrNotDst :for _aade =0;_aade < _dfgd ;_aade ++{_gggfe =_ddfef +_aade *_ccgdb .RowStride ;_adgb =_acbfb +_aade *_eafd .RowStride ;for _efdd =0;_efdd < _ecgf ;_efdd ++{_eafd .Data [_adgb ]=_ccgdb .Data [_gggfe ]|^(_eafd .Data [_adgb ]);_adgb ++;
|
|
_gggfe ++;};if _cbeg > 0{_eafd .Data [_adgb ]=_cgadc (_eafd .Data [_adgb ],_ccgdb .Data [_gggfe ]|^(_eafd .Data [_adgb ]),_aeaad );};};case PixSrcAndNotDst :for _aade =0;_aade < _dfgd ;_aade ++{_gggfe =_ddfef +_aade *_ccgdb .RowStride ;_adgb =_acbfb +_aade *_eafd .RowStride ;
|
|
for _efdd =0;_efdd < _ecgf ;_efdd ++{_eafd .Data [_adgb ]=_ccgdb .Data [_gggfe ]&^(_eafd .Data [_adgb ]);_adgb ++;_gggfe ++;};if _cbeg > 0{_eafd .Data [_adgb ]=_cgadc (_eafd .Data [_adgb ],_ccgdb .Data [_gggfe ]&^(_eafd .Data [_adgb ]),_aeaad );};};case PixNotPixSrcOrDst :for _aade =0;
|
|
_aade < _dfgd ;_aade ++{_gggfe =_ddfef +_aade *_ccgdb .RowStride ;_adgb =_acbfb +_aade *_eafd .RowStride ;for _efdd =0;_efdd < _ecgf ;_efdd ++{_eafd .Data [_adgb ]=^(_ccgdb .Data [_gggfe ]|_eafd .Data [_adgb ]);_adgb ++;_gggfe ++;};if _cbeg > 0{_eafd .Data [_adgb ]=_cgadc (_eafd .Data [_adgb ],^(_ccgdb .Data [_gggfe ]|_eafd .Data [_adgb ]),_aeaad );
|
|
};};case PixNotPixSrcAndDst :for _aade =0;_aade < _dfgd ;_aade ++{_gggfe =_ddfef +_aade *_ccgdb .RowStride ;_adgb =_acbfb +_aade *_eafd .RowStride ;for _efdd =0;_efdd < _ecgf ;_efdd ++{_eafd .Data [_adgb ]=^(_ccgdb .Data [_gggfe ]&_eafd .Data [_adgb ]);
|
|
_adgb ++;_gggfe ++;};if _cbeg > 0{_eafd .Data [_adgb ]=_cgadc (_eafd .Data [_adgb ],^(_ccgdb .Data [_gggfe ]&_eafd .Data [_adgb ]),_aeaad );};};case PixNotPixSrcXorDst :for _aade =0;_aade < _dfgd ;_aade ++{_gggfe =_ddfef +_aade *_ccgdb .RowStride ;_adgb =_acbfb +_aade *_eafd .RowStride ;
|
|
for _efdd =0;_efdd < _ecgf ;_efdd ++{_eafd .Data [_adgb ]=^(_ccgdb .Data [_gggfe ]^_eafd .Data [_adgb ]);_adgb ++;_gggfe ++;};if _cbeg > 0{_eafd .Data [_adgb ]=_cgadc (_eafd .Data [_adgb ],^(_ccgdb .Data [_gggfe ]^_eafd .Data [_adgb ]),_aeaad );};};default:_cee .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",_ggdd );
|
|
return _a .Error ("\u0072\u0061\u0073\u0074er\u004f\u0070\u0042\u0079\u0074\u0065\u0041\u006c\u0069\u0067\u006e\u0065\u0064\u004co\u0077","\u0069\u006e\u0076al\u0069\u0064\u0020\u0072\u0061\u0073\u0074\u0065\u0072\u0020\u006f\u0070\u0065\u0072\u0061\u0074\u006f\u0072");
|
|
};return nil ;};func (_ebcd *Bitmaps )GetBitmap (i int )(*Bitmap ,error ){const _afbc ="\u0047e\u0074\u0042\u0069\u0074\u006d\u0061p";if _ebcd ==nil {return nil ,_a .Error (_afbc ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0042\u0069\u0074ma\u0070\u0073");
|
|
};if i > len (_ebcd .Values )-1{return nil ,_a .Errorf (_afbc ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return _ebcd .Values [i ],nil ;};const (Vanilla Color =iota ;
|
|
Chocolate ;);func (_ebf *Bitmap )GetBitOffset (x int )int {return x &0x07};func TstImageBitmap ()*Bitmap {return _aceca .Copy ()};func _cgag (_cda ,_aed *Bitmap ,_aee int ,_cefb []byte ,_gaa int )(_gag error ){const _gaf ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0032";
|
|
var (_bff ,_bfe ,_cfab ,_beb ,_gee ,_ccf ,_baee ,_gbf int ;_feb ,_eag ,_ggd ,_efg uint32 ;_afg ,_aef byte ;_aaa uint16 ;);_eab :=make ([]byte ,4);_cde :=make ([]byte ,4);for _cfab =0;_cfab < _cda .Height -1;_cfab ,_beb =_cfab +2,_beb +1{_bff =_cfab *_cda .RowStride ;
|
|
_bfe =_beb *_aed .RowStride ;for _gee ,_ccf =0,0;_gee < _gaa ;_gee ,_ccf =_gee +4,_ccf +1{for _baee =0;_baee < 4;_baee ++{_gbf =_bff +_gee +_baee ;if _gbf <=len (_cda .Data )-1&&_gbf < _bff +_cda .RowStride {_eab [_baee ]=_cda .Data [_gbf ];}else {_eab [_baee ]=0x00;
|
|
};_gbf =_bff +_cda .RowStride +_gee +_baee ;if _gbf <=len (_cda .Data )-1&&_gbf < _bff +(2*_cda .RowStride ){_cde [_baee ]=_cda .Data [_gbf ];}else {_cde [_baee ]=0x00;};};_feb =_cf .BigEndian .Uint32 (_eab );_eag =_cf .BigEndian .Uint32 (_cde );_ggd =_feb &_eag ;
|
|
_ggd |=_ggd <<1;_efg =_feb |_eag ;_efg &=_efg <<1;_eag =_ggd |_efg ;_eag &=0xaaaaaaaa;_feb =_eag |(_eag <<7);_afg =byte (_feb >>24);_aef =byte ((_feb >>8)&0xff);_gbf =_bfe +_ccf ;if _gbf +1==len (_aed .Data )-1||_gbf +1>=_bfe +_aed .RowStride {if _gag =_aed .SetByte (_gbf ,_cefb [_afg ]);
|
|
_gag !=nil {return _a .Wrapf (_gag ,_gaf ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_gbf );};}else {_aaa =(uint16 (_cefb [_afg ])<<8)|uint16 (_cefb [_aef ]);if _gag =_aed .setTwoBytes (_gbf ,_aaa );_gag !=nil {return _a .Wrapf (_gag ,_gaf ,"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",_gbf );
|
|
};_ccf ++;};};};return nil ;};func _bbcc (_bgaf ,_adb *Bitmap ,_fbf ,_daag int )(*Bitmap ,error ){const _fgagg ="\u0063\u006c\u006f\u0073\u0065\u0042\u0072\u0069\u0063\u006b";if _adb ==nil {return nil ,_a .Error (_fgagg ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if _fbf < 1||_daag < 1{return nil ,_a .Error (_fgagg ,"\u0068S\u0069\u007a\u0065\u0020\u0061\u006e\u0064\u0020\u0076\u0053\u0069z\u0065\u0020\u006e\u006f\u0074\u0020\u003e\u003d\u0020\u0031");};if _fbf ==1&&_daag ==1{return _adb .Copy (),nil ;};if _fbf ==1||_daag ==1{_adba :=SelCreateBrick (_daag ,_fbf ,_daag /2,_fbf /2,SelHit );
|
|
var _gafg error ;_bgaf ,_gafg =_dbga (_bgaf ,_adb ,_adba );if _gafg !=nil {return nil ,_a .Wrap (_gafg ,_fgagg ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");};
|
|
return _bgaf ,nil ;};_gcc :=SelCreateBrick (1,_fbf ,0,_fbf /2,SelHit );_bfdeb :=SelCreateBrick (_daag ,1,_daag /2,0,SelHit );_badf ,_gfb :=_bacca (nil ,_adb ,_gcc );if _gfb !=nil {return nil ,_a .Wrap (_gfb ,_fgagg ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
};if _bgaf ,_gfb =_bacca (_bgaf ,_badf ,_bfdeb );_gfb !=nil {return nil ,_a .Wrap (_gfb ,_fgagg ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};if _ ,_gfb =_cedcad (_badf ,_bgaf ,_gcc );_gfb !=nil {return nil ,_a .Wrap (_gfb ,_fgagg ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");
|
|
};if _ ,_gfb =_cedcad (_bgaf ,_badf ,_bfdeb );_gfb !=nil {return nil ,_a .Wrap (_gfb ,_fgagg ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};return _bgaf ,nil ;};func (_gefa *Bitmap )addBorderGeneral (_aegc ,_cdc ,_gab ,_fda int ,_add int )(*Bitmap ,error ){const _bdee ="\u0061\u0064d\u0042\u006f\u0072d\u0065\u0072\u0047\u0065\u006e\u0065\u0072\u0061\u006c";
|
|
if _aegc < 0||_cdc < 0||_gab < 0||_fda < 0{return nil ,_a .Error (_bdee ,"n\u0065\u0067\u0061\u0074iv\u0065 \u0062\u006f\u0072\u0064\u0065r\u0020\u0061\u0064\u0064\u0065\u0064");};_cfgc ,_eaf :=_gefa .Width ,_gefa .Height ;_ceg :=_cfgc +_aegc +_cdc ;_gddd :=_eaf +_gab +_fda ;
|
|
_afe :=New (_ceg ,_gddd );_afe .Color =_gefa .Color ;_bcb :=PixClr ;if _add > 0{_bcb =PixSet ;};_ggcff :=_afe .RasterOperation (0,0,_aegc ,_gddd ,_bcb ,nil ,0,0);if _ggcff !=nil {return nil ,_a .Wrap (_ggcff ,_bdee ,"\u006c\u0065\u0066\u0074");};_ggcff =_afe .RasterOperation (_ceg -_cdc ,0,_cdc ,_gddd ,_bcb ,nil ,0,0);
|
|
if _ggcff !=nil {return nil ,_a .Wrap (_ggcff ,_bdee ,"\u0072\u0069\u0067h\u0074");};_ggcff =_afe .RasterOperation (0,0,_ceg ,_gab ,_bcb ,nil ,0,0);if _ggcff !=nil {return nil ,_a .Wrap (_ggcff ,_bdee ,"\u0074\u006f\u0070");};_ggcff =_afe .RasterOperation (0,_gddd -_fda ,_ceg ,_fda ,_bcb ,nil ,0,0);
|
|
if _ggcff !=nil {return nil ,_a .Wrap (_ggcff ,_bdee ,"\u0062\u006f\u0074\u0074\u006f\u006d");};_ggcff =_afe .RasterOperation (_aegc ,_gab ,_cfgc ,_eaf ,PixSrc ,_gefa ,0,0);if _ggcff !=nil {return nil ,_a .Wrap (_ggcff ,_bdee ,"\u0063\u006f\u0070\u0079");
|
|
};return _afe ,nil ;};func New (width ,height int )*Bitmap {_egc :=_daaa (width ,height );_egc .Data =make ([]byte ,height *_egc .RowStride );return _egc ;};func _agcb (_baeg ,_dggb int ,_ccfg string )*Selection {_addb :=&Selection {Height :_baeg ,Width :_dggb ,Name :_ccfg };
|
|
_addb .Data =make ([][]SelectionValue ,_baeg );for _aded :=0;_aded < _baeg ;_aded ++{_addb .Data [_aded ]=make ([]SelectionValue ,_dggb );};return _addb ;};func (_gggf *Bitmap )Zero ()bool {_dbbf :=_gggf .Width /8;_ggde :=_gggf .Width &7;var _ffbg byte ;
|
|
if _ggde !=0{_ffbg =byte (0xff<<uint (8-_ggde ));};var _ffa ,_gfg ,_gcdaf int ;for _gfg =0;_gfg < _gggf .Height ;_gfg ++{_ffa =_gggf .RowStride *_gfg ;for _gcdaf =0;_gcdaf < _dbbf ;_gcdaf ,_ffa =_gcdaf +1,_ffa +1{if _gggf .Data [_ffa ]!=0{return false ;
|
|
};};if _ggde > 0{if _gggf .Data [_ffa ]&_ffbg !=0{return false ;};};};return true ;};func (_dcab *Bitmap )removeBorderGeneral (_ebc ,_ebbb ,_ccgb ,_bbf int )(*Bitmap ,error ){const _fafb ="\u0072\u0065\u006d\u006fve\u0042\u006f\u0072\u0064\u0065\u0072\u0047\u0065\u006e\u0065\u0072\u0061\u006c";
|
|
if _ebc < 0||_ebbb < 0||_ccgb < 0||_bbf < 0{return nil ,_a .Error (_fafb ,"\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");};_bbgd ,_bceg :=_dcab .Width ,_dcab .Height ;
|
|
_cbg :=_bbgd -_ebc -_ebbb ;_gbcf :=_bceg -_ccgb -_bbf ;if _cbg <=0{return nil ,_a .Errorf (_fafb ,"w\u0069\u0064\u0074\u0068: \u0025d\u0020\u006d\u0075\u0073\u0074 \u0062\u0065\u0020\u003e\u0020\u0030",_cbg );};if _gbcf <=0{return nil ,_a .Errorf (_fafb ,"\u0068\u0065\u0069\u0067ht\u003a\u0020\u0025\u0064\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065\u0020\u003e \u0030",_gbcf );
|
|
};_eafg :=New (_cbg ,_gbcf );_eafg .Color =_dcab .Color ;_bcc :=_eafg .RasterOperation (0,0,_cbg ,_gbcf ,PixSrc ,_dcab ,_ebc ,_ccgb );if _bcc !=nil {return nil ,_a .Wrap (_bcc ,_fafb ,"");};return _eafg ,nil ;};func (_daaaa *Bitmap )SizesEqual (s *Bitmap )bool {if _daaaa ==s {return true ;
|
|
};if _daaaa .Width !=s .Width ||_daaaa .Height !=s .Height {return false ;};return true ;};func Copy (d ,s *Bitmap )(*Bitmap ,error ){return _abdb (d ,s )};func _cef (_fga *Bitmap ,_fd int ,_efa []byte )(_dcg *Bitmap ,_ggab error ){const _abf ="\u0072\u0065\u0064\u0075\u0063\u0065\u0052\u0061\u006e\u006b\u0042\u0069n\u0061\u0072\u0079\u0032";
|
|
if _fga ==nil {return nil ,_a .Error (_abf ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};if _fd < 1||_fd > 4{return nil ,_a .Error (_abf ,"\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 _fga .Height <=1{return nil ,_a .Errorf (_abf ,"\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",_fga .Height );
|
|
};_dcg =New (_fga .Width /2,_fga .Height /2);if _efa ==nil {_efa =_fbg ();};_baef :=_gce (_fga .RowStride ,2*_dcg .RowStride );switch _fd {case 1:_ggab =_ga (_fga ,_dcg ,_fd ,_efa ,_baef );case 2:_ggab =_cgag (_fga ,_dcg ,_fd ,_efa ,_baef );case 3:_ggab =_becf (_fga ,_dcg ,_fd ,_efa ,_baef );
|
|
case 4:_ggab =_fed (_fga ,_dcg ,_fd ,_efa ,_baef );};if _ggab !=nil {return nil ,_ggab ;};return _dcg ,nil ;};func _dega (_bgcc *Bitmap ,_cgee ,_aeged ,_egcbf ,_edbf int ,_dcggd RasterOperator ){if _cgee < 0{_egcbf +=_cgee ;_cgee =0;};_fadfe :=_cgee +_egcbf -_bgcc .Width ;
|
|
if _fadfe > 0{_egcbf -=_fadfe ;};if _aeged < 0{_edbf +=_aeged ;_aeged =0;};_cgcf :=_aeged +_edbf -_bgcc .Height ;if _cgcf > 0{_edbf -=_cgcf ;};if _egcbf <=0||_edbf <=0{return ;};if (_cgee &7)==0{_bgeg (_bgcc ,_cgee ,_aeged ,_egcbf ,_edbf ,_dcggd );}else {_adcgb (_bgcc ,_cgee ,_aeged ,_egcbf ,_edbf ,_dcggd );
|
|
};};func _daaa (_egb ,_aeec int )*Bitmap {return &Bitmap {Width :_egb ,Height :_aeec ,RowStride :(_egb +7)>>3};};func (_aeef *byWidth )Swap (i ,j int ){_aeef .Values [i ],_aeef .Values [j ]=_aeef .Values [j ],_aeef .Values [i ];if _aeef .Boxes !=nil {_aeef .Boxes [i ],_aeef .Boxes [j ]=_aeef .Boxes [j ],_aeef .Boxes [i ];
|
|
};};func _faf (_dfe *Bitmap ,_dca *Bitmap ,_ggf int )(_bae error ){const _decc ="e\u0078\u0070\u0061\u006edB\u0069n\u0061\u0072\u0079\u0050\u006fw\u0065\u0072\u0032\u004c\u006f\u0077";switch _ggf {case 2:_bae =_dc (_dfe ,_dca );case 4:_bae =_bc (_dfe ,_dca );
|
|
case 8:_bae =_daa (_dfe ,_dca );default:return _a .Error (_decc ,"\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 _bae !=nil {_bae =_a .Wrap (_bae ,_decc ,"");};return _bae ;};func (_baag *Bitmap )centroid (_cdfc ,_bdggb []int )(Point ,error ){_ddca :=Point {};_baag .setPadBits (0);if len (_cdfc )==0{_cdfc =_beaf ();};if len (_bdggb )==0{_bdggb =_adbac ();};var _aecd ,_fffb ,_gebd ,_fagd ,_gafa ,_gcbg int ;
|
|
var _fgef byte ;for _gafa =0;_gafa < _baag .Height ;_gafa ++{_aafe :=_baag .RowStride *_gafa ;_fagd =0;for _gcbg =0;_gcbg < _baag .RowStride ;_gcbg ++{_fgef =_baag .Data [_aafe +_gcbg ];if _fgef !=0{_fagd +=_bdggb [_fgef ];_aecd +=_cdfc [_fgef ]+_gcbg *8*_bdggb [_fgef ];
|
|
};};_gebd +=_fagd ;_fffb +=_fagd *_gafa ;};if _gebd !=0{_ddca .X =float32 (_aecd )/float32 (_gebd );_ddca .Y =float32 (_fffb )/float32 (_gebd );};return _ddca ,nil ;};func Extract (roi _de .Rectangle ,src *Bitmap )(*Bitmap ,error ){_gagd :=New (roi .Dx (),roi .Dy ());
|
|
_dede :=roi .Min .X &0x07;_edfa :=8-_dede ;_bgbf :=uint (8-_gagd .Width &0x07);_bcbf :=src .GetByteIndex (roi .Min .X ,roi .Min .Y );_bbag :=src .GetByteIndex (roi .Max .X -1,roi .Min .Y );_ffac :=_gagd .RowStride ==_bbag +1-_bcbf ;var _fegc int ;for _ecc :=roi .Min .Y ;
|
|
_ecc < roi .Max .Y ;_ecc ++{_cffc :=_bcbf ;_edcg :=_fegc ;switch {case _bcbf ==_bbag :_ddbcd ,_dcc :=src .GetByte (_cffc );if _dcc !=nil {return nil ,_dcc ;};_ddbcd <<=uint (_dede );_dcc =_gagd .SetByte (_edcg ,_cdeb (_bgbf ,_ddbcd ));if _dcc !=nil {return nil ,_dcc ;
|
|
};case _dede ==0:for _gded :=_bcbf ;_gded <=_bbag ;_gded ++{_acd ,_ade :=src .GetByte (_cffc );if _ade !=nil {return nil ,_ade ;};_cffc ++;if _gded ==_bbag &&_ffac {_acd =_cdeb (_bgbf ,_acd );};_ade =_gagd .SetByte (_edcg ,_acd );if _ade !=nil {return nil ,_ade ;
|
|
};_edcg ++;};default:_ebee :=_fead (src ,_gagd ,uint (_dede ),uint (_edfa ),_bgbf ,_bcbf ,_bbag ,_ffac ,_cffc ,_edcg );if _ebee !=nil {return nil ,_ebee ;};};_bcbf +=src .RowStride ;_bbag +=src .RowStride ;_fegc +=_gagd .RowStride ;};return _gagd ,nil ;
|
|
};const _dcdff =5000;func (_ffbbf *Bitmaps )String ()string {_addbf :=_d .Builder {};for _ ,_acggf :=range _ffbbf .Values {_addbf .WriteString (_acggf .String ());_addbf .WriteRune ('\n');};return _addbf .String ();};func RasterOperation (dest *Bitmap ,dx ,dy ,dw ,dh int ,op RasterOperator ,src *Bitmap ,sx ,sy int )error {return _efbg (dest ,dx ,dy ,dw ,dh ,op ,src ,sx ,sy );
|
|
};func _cecdc (_cgecf ,_fgbf *Bitmap ,_fgfe ,_egbc ,_aead ,_cgad ,_afcf ,_ebed ,_ggee ,_efeg int ,_dgf CombinationOperator )error {var _fdbg int ;_acbc :=func (){_fdbg ++;_aead +=_fgbf .RowStride ;_cgad +=_cgecf .RowStride ;_afcf +=_cgecf .RowStride };
|
|
for _fdbg =_fgfe ;_fdbg < _egbc ;_acbc (){var _fcce uint16 ;_bcfa :=_aead ;for _gbcg :=_cgad ;_gbcg <=_afcf ;_gbcg ++{_acc ,_dcag :=_fgbf .GetByte (_bcfa );if _dcag !=nil {return _dcag ;};_fgdc ,_dcag :=_cgecf .GetByte (_gbcg );if _dcag !=nil {return _dcag ;
|
|
};_fcce =(_fcce |uint16 (_fgdc ))<<uint (_efeg );_fgdc =byte (_fcce >>8);if _gbcg ==_afcf {_fgdc =_cdeb (uint (_ebed ),_fgdc );};if _dcag =_fgbf .SetByte (_bcfa ,_dagf (_acc ,_fgdc ,_dgf ));_dcag !=nil {return _dcag ;};_bcfa ++;_fcce <<=uint (_ggee );};
|
|
};return nil ;};type byWidth Bitmaps ;func ClipBoxToRectangle (box *_de .Rectangle ,wi ,hi int )(_ffge *_de .Rectangle ,_ebfe error ){const _afce ="\u0043l\u0069p\u0042\u006f\u0078\u0054\u006fR\u0065\u0063t\u0061\u006e\u0067\u006c\u0065";if box ==nil {return nil ,_a .Error (_afce ,"\u0027\u0062\u006f\u0078\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065f\u0069\u006e\u0065\u0064");
|
|
};if box .Min .X >=wi ||box .Min .Y >=hi ||box .Max .X <=0||box .Max .Y <=0{return nil ,_a .Error (_afce ,"\u0027\u0062\u006fx'\u0020\u006f\u0075\u0074\u0073\u0069\u0064\u0065\u0020\u0072\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065");};_fbcg :=*box ;
|
|
_ffge =&_fbcg ;if _ffge .Min .X < 0{_ffge .Max .X +=_ffge .Min .X ;_ffge .Min .X =0;};if _ffge .Min .Y < 0{_ffge .Max .Y +=_ffge .Min .Y ;_ffge .Min .Y =0;};if _ffge .Max .X > wi {_ffge .Max .X =wi ;};if _ffge .Max .Y > hi {_ffge .Max .Y =hi ;};return _ffge ,nil ;
|
|
};func _fafa (_ddbd *_ce .Stack ,_aagbe ,_ccbgf ,_fgee ,_eeaa ,_aedg int ,_ddeb *_de .Rectangle )(_cgbc error ){const _feea ="\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 _ddbd ==nil {return _a .Error (_feea ,"\u006ei\u006c \u0073\u0074\u0061\u0063\u006b \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");};if _ddeb ==nil {return _a .Error (_feea ,"\u0070\u0072\u006f\u0076i\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0069\u006da\u0067e\u002e\u0052\u0065\u0063\u0074\u0061\u006eg\u006c\u0065");
|
|
};_ddeb .Min .X =_ce .Min (_ddeb .Min .X ,_aagbe );_ddeb .Max .X =_ce .Max (_ddeb .Max .X ,_ccbgf );_ddeb .Min .Y =_ce .Min (_ddeb .Min .Y ,_fgee );_ddeb .Max .Y =_ce .Max (_ddeb .Max .Y ,_fgee );if !(_fgee +_eeaa >=0&&_fgee +_eeaa <=_aedg ){return nil ;
|
|
};if _ddbd .Aux ==nil {return _a .Error (_feea ,"a\u0075x\u0053\u0074\u0061\u0063\u006b\u0020\u006e\u006ft\u0020\u0064\u0065\u0066in\u0065\u0064");};var _acce *fillSegment ;_cdde ,_efcg :=_ddbd .Aux .Pop ();if _efcg {if _acce ,_efcg =_cdde .(*fillSegment );
|
|
!_efcg {return _a .Error (_feea ,"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 {_acce =&fillSegment {};
|
|
};_acce ._bbcdb =_aagbe ;_acce ._gadd =_ccbgf ;_acce ._fgdg =_fgee ;_acce ._bbgdc =_eeaa ;_ddbd .Push (_acce );return nil ;};func _aeaae (_acgg ,_fagf *Bitmap ,_cbdg ,_ggeb int )(*Bitmap ,error ){const _cfdg ="d\u0069\u006c\u0061\u0074\u0065\u0042\u0072\u0069\u0063\u006b";
|
|
if _fagf ==nil {_cee .Log .Debug ("\u0064\u0069\u006c\u0061\u0074\u0065\u0042\u0072\u0069\u0063k\u0020\u0073\u006f\u0075\u0072\u0063\u0065 \u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");return nil ,_a .Error (_cfdg ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");
|
|
};if _cbdg < 1||_ggeb < 1{return nil ,_a .Error (_cfdg ,"\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 _cbdg ==1&&_ggeb ==1{_ggcbf ,_ffc :=_abdb (_acgg ,_fagf );if _ffc !=nil {return nil ,_a .Wrap (_ffc ,_cfdg ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u0026\u0026 \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");};
|
|
return _ggcbf ,nil ;};if _cbdg ==1||_ggeb ==1{_feca :=SelCreateBrick (_ggeb ,_cbdg ,_ggeb /2,_cbdg /2,SelHit );_acfc ,_bdfd :=_bacca (_acgg ,_fagf ,_feca );if _bdfd !=nil {return nil ,_a .Wrap (_bdfd ,_cfdg ,"\u0068s\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _acfc ,nil ;};_bfga :=SelCreateBrick (1,_cbdg ,0,_cbdg /2,SelHit );_deac :=SelCreateBrick (_ggeb ,1,_ggeb /2,0,SelHit );_cecdb ,_fcga :=_bacca (nil ,_fagf ,_bfga );if _fcga !=nil {return nil ,_a .Wrap (_fcga ,_cfdg ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
};_acgg ,_fcga =_bacca (_acgg ,_cecdb ,_deac );if _fcga !=nil {return nil ,_a .Wrap (_fcga ,_cfdg ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};return _acgg ,nil ;};func (_cgc *Bitmap )Copy ()*Bitmap {_bdd :=make ([]byte ,len (_cgc .Data ));
|
|
copy (_bdd ,_cgc .Data );return &Bitmap {Width :_cgc .Width ,Height :_cgc .Height ,RowStride :_cgc .RowStride ,Data :_bdd ,Color :_cgc .Color ,Text :_cgc .Text ,BitmapNumber :_cgc .BitmapNumber ,Special :_cgc .Special };};func (_dcbd CombinationOperator )String ()string {var _fgeb string ;
|
|
switch _dcbd {case CmbOpOr :_fgeb ="\u004f\u0052";case CmbOpAnd :_fgeb ="\u0041\u004e\u0044";case CmbOpXor :_fgeb ="\u0058\u004f\u0052";case CmbOpXNor :_fgeb ="\u0058\u004e\u004f\u0052";case CmbOpReplace :_fgeb ="\u0052E\u0050\u004c\u0041\u0043\u0045";
|
|
case CmbOpNot :_fgeb ="\u004e\u004f\u0054";};return _fgeb ;};type SizeSelection int ;func (_dgb *Selection )findMaxTranslations ()(_baaa ,_bfgb ,_geece ,_eaef int ){for _dcfa :=0;_dcfa < _dgb .Height ;_dcfa ++{for _gabg :=0;_gabg < _dgb .Width ;_gabg ++{if _dgb .Data [_dcfa ][_gabg ]==SelHit {_baaa =_bbbg (_baaa ,_dgb .Cx -_gabg );
|
|
_bfgb =_bbbg (_bfgb ,_dgb .Cy -_dcfa );_geece =_bbbg (_geece ,_gabg -_dgb .Cx );_eaef =_bbbg (_eaef ,_dcfa -_dgb .Cy );};};};return _baaa ,_bfgb ,_geece ,_eaef ;};func TstFrameBitmapData ()[]byte {return _gadb .Data };func TstRSymbol (t *_f .T ,scale ...int )*Bitmap {_cagc ,_cddg :=NewWithData (4,5,[]byte {0xF0,0x90,0xF0,0xA0,0x90});
|
|
_ca .NoError (t ,_cddg );return TstGetScaledSymbol (t ,_cagc ,scale ...);};type SelectionValue int ;const (PixSrc RasterOperator =0xc;PixDst RasterOperator =0xa;PixNotSrc RasterOperator =0x3;PixNotDst RasterOperator =0x5;PixClr RasterOperator =0x0;PixSet RasterOperator =0xf;
|
|
PixSrcOrDst RasterOperator =0xe;PixSrcAndDst RasterOperator =0x8;PixSrcXorDst RasterOperator =0x6;PixNotSrcOrDst RasterOperator =0xb;PixNotSrcAndDst RasterOperator =0x2;PixSrcOrNotDst RasterOperator =0xd;PixSrcAndNotDst RasterOperator =0x4;PixNotPixSrcOrDst RasterOperator =0x1;
|
|
PixNotPixSrcAndDst RasterOperator =0x7;PixNotPixSrcXorDst RasterOperator =0x9;PixPaint =PixSrcOrDst ;PixSubtract =PixNotSrcAndDst ;PixMask =PixSrcAndDst ;);func _cfgcc (_dbgad *Bitmap ,_dfed *Bitmap ,_beag int )(_eefb error ){const _fdbfc ="\u0073\u0065\u0065\u0064\u0066\u0069\u006c\u006c\u0042\u0069\u006e\u0061r\u0079\u004c\u006f\u0077";
|
|
_cabaf :=_gce (_dbgad .Height ,_dfed .Height );_fecec :=_gce (_dbgad .RowStride ,_dfed .RowStride );switch _beag {case 4:_eefb =_edgc (_dbgad ,_dfed ,_cabaf ,_fecec );case 8:_eefb =_fdbb (_dbgad ,_dfed ,_cabaf ,_fecec );default:return _a .Errorf (_fdbfc ,"\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",_beag );
|
|
};if _eefb !=nil {return _a .Wrap (_eefb ,_fdbfc ,"");};return nil ;};func (_gdgd Points )Get (i int )(Point ,error ){if i > len (_gdgd )-1{return Point {},_a .Errorf ("\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0065\u0074","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
};return _gdgd [i ],nil ;};func (_cefc *Bitmap )AddBorder (borderSize ,val int )(*Bitmap ,error ){if borderSize ==0{return _cefc .Copy (),nil ;};_agg ,_aag :=_cefc .addBorderGeneral (borderSize ,borderSize ,borderSize ,borderSize ,val );if _aag !=nil {return nil ,_a .Wrap (_aag ,"\u0041d\u0064\u0042\u006f\u0072\u0064\u0065r","");
|
|
};return _agg ,nil ;};func _ffd ()(_ed [256]uint16 ){for _dee :=0;_dee < 256;_dee ++{if _dee &0x01!=0{_ed [_dee ]|=0x3;};if _dee &0x02!=0{_ed [_dee ]|=0xc;};if _dee &0x04!=0{_ed [_dee ]|=0x30;};if _dee &0x08!=0{_ed [_dee ]|=0xc0;};if _dee &0x10!=0{_ed [_dee ]|=0x300;
|
|
};if _dee &0x20!=0{_ed [_dee ]|=0xc00;};if _dee &0x40!=0{_ed [_dee ]|=0x3000;};if _dee &0x80!=0{_ed [_dee ]|=0xc000;};};return _ed ;};func DilateBrick (d ,s *Bitmap ,hSize ,vSize int )(*Bitmap ,error ){return _aeaae (d ,s ,hSize ,vSize )};func (_gaab *byHeight )Swap (i ,j int ){_gaab .Values [i ],_gaab .Values [j ]=_gaab .Values [j ],_gaab .Values [i ];
|
|
if _gaab .Boxes !=nil {_gaab .Boxes [i ],_gaab .Boxes [j ]=_gaab .Boxes [j ],_gaab .Boxes [i ];};};type ClassedPoints struct{*Points ;_ce .IntSlice ;_gacc func (_dfad ,_ddefe int )bool ;};func (_cbcaa *Bitmaps )HeightSorter ()func (_eaea ,_bace int )bool {return func (_bbef ,_dcde int )bool {_daaaab :=_cbcaa .Values [_bbef ].Height < _cbcaa .Values [_dcde ].Height ;
|
|
_cee .Log .Debug ("H\u0065i\u0067\u0068\u0074\u003a\u0020\u0025\u0076\u0020<\u0020\u0025\u0076\u0020= \u0025\u0076",_cbcaa .Values [_bbef ].Height ,_cbcaa .Values [_dcde ].Height ,_daaaab );return _daaaab ;};};func (_afbe *Bitmap )RasterOperation (dx ,dy ,dw ,dh int ,op RasterOperator ,src *Bitmap ,sx ,sy int )error {return _efbg (_afbe ,dx ,dy ,dw ,dh ,op ,src ,sx ,sy );
|
|
};func TstNSymbol (t *_f .T ,scale ...int )*Bitmap {_bdeb ,_gdcd :=NewWithData (4,5,[]byte {0x90,0xD0,0xB0,0x90,0x90});_ca .NoError (t ,_gdcd );return TstGetScaledSymbol (t ,_bdeb ,scale ...);};const (_ LocationFilter =iota ;LocSelectWidth ;LocSelectHeight ;
|
|
LocSelectXVal ;LocSelectYVal ;LocSelectIfEither ;LocSelectIfBoth ;);func _daa (_cdg ,_gge *Bitmap )(_cgg error ){const _gga ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0038";_fe :=_gge .RowStride ;
|
|
_gcb :=_cdg .RowStride ;var _daf ,_aa ,_ac ,_ggc ,_beg int ;for _ac =0;_ac < _gge .Height ;_ac ++{_daf =_ac *_fe ;_aa =8*_ac *_gcb ;for _ggc =0;_ggc < _fe ;_ggc ++{if _cgg =_cdg .setEightBytes (_aa +_ggc *8,_aebd [_gge .Data [_daf +_ggc ]]);_cgg !=nil {return _a .Wrap (_cgg ,_gga ,"");
|
|
};};for _beg =1;_beg < 8;_beg ++{for _ggc =0;_ggc < _gcb ;_ggc ++{if _cgg =_cdg .SetByte (_aa +_beg *_gcb +_ggc ,_cdg .Data [_aa +_ggc ]);_cgg !=nil {return _a .Wrap (_cgg ,_gga ,"");};};};};return nil ;};func _becf (_eed ,_aaab *Bitmap ,_edb int ,_ad []byte ,_beec int )(_ccc error ){const _fb ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0033";
|
|
var (_ede ,_ccg ,_cdd ,_egdg ,_aab ,_fab ,_cbd ,_cca int ;_gf ,_fcb ,_cce ,_faa uint32 ;_beee ,_fdd byte ;_db uint16 ;);_fbd :=make ([]byte ,4);_fcf :=make ([]byte ,4);for _cdd =0;_cdd < _eed .Height -1;_cdd ,_egdg =_cdd +2,_egdg +1{_ede =_cdd *_eed .RowStride ;
|
|
_ccg =_egdg *_aaab .RowStride ;for _aab ,_fab =0,0;_aab < _beec ;_aab ,_fab =_aab +4,_fab +1{for _cbd =0;_cbd < 4;_cbd ++{_cca =_ede +_aab +_cbd ;if _cca <=len (_eed .Data )-1&&_cca < _ede +_eed .RowStride {_fbd [_cbd ]=_eed .Data [_cca ];}else {_fbd [_cbd ]=0x00;
|
|
};_cca =_ede +_eed .RowStride +_aab +_cbd ;if _cca <=len (_eed .Data )-1&&_cca < _ede +(2*_eed .RowStride ){_fcf [_cbd ]=_eed .Data [_cca ];}else {_fcf [_cbd ]=0x00;};};_gf =_cf .BigEndian .Uint32 (_fbd );_fcb =_cf .BigEndian .Uint32 (_fcf );_cce =_gf &_fcb ;
|
|
_cce |=_cce <<1;_faa =_gf |_fcb ;_faa &=_faa <<1;_fcb =_cce &_faa ;_fcb &=0xaaaaaaaa;_gf =_fcb |(_fcb <<7);_beee =byte (_gf >>24);_fdd =byte ((_gf >>8)&0xff);_cca =_ccg +_fab ;if _cca +1==len (_aaab .Data )-1||_cca +1>=_ccg +_aaab .RowStride {if _ccc =_aaab .SetByte (_cca ,_ad [_beee ]);
|
|
_ccc !=nil {return _a .Wrapf (_ccc ,_fb ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_cca );};}else {_db =(uint16 (_ad [_beee ])<<8)|uint16 (_ad [_fdd ]);if _ccc =_aaab .setTwoBytes (_cca ,_db );_ccc !=nil {return _a .Wrapf (_ccc ,_fb ,"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",_cca );
|
|
};_fab ++;};};};return nil ;};func _efbg (_adgc *Bitmap ,_bdab ,_fcfb ,_bcec ,_bced int ,_efbgb RasterOperator ,_fgaf *Bitmap ,_agfdc ,_dbec int )error {const _dade ="\u0072a\u0073t\u0065\u0072\u004f\u0070\u0065\u0072\u0061\u0074\u0069\u006f\u006e";if _adgc ==nil {return _a .Error (_dade ,"\u006e\u0069\u006c\u0020\u0027\u0064\u0065\u0073\u0074\u0027\u0020\u0042i\u0074\u006d\u0061\u0070");
|
|
};if _efbgb ==PixDst {return nil ;};switch _efbgb {case PixClr ,PixSet ,PixNotDst :_dega (_adgc ,_bdab ,_fcfb ,_bcec ,_bced ,_efbgb );return nil ;};if _fgaf ==nil {_cee .Log .Debug ("\u0052a\u0073\u0074e\u0072\u004f\u0070\u0065r\u0061\u0074\u0069o\u006e\u0020\u0073\u006f\u0075\u0072\u0063\u0065\u0020bi\u0074\u006d\u0061p\u0020\u0069s\u0020\u006e\u006f\u0074\u0020\u0064e\u0066\u0069n\u0065\u0064");
|
|
return _a .Error (_dade ,"\u006e\u0069l\u0020\u0027\u0073r\u0063\u0027\u0020\u0062\u0069\u0074\u006d\u0061\u0070");};if _afae :=_facd (_adgc ,_bdab ,_fcfb ,_bcec ,_bced ,_efbgb ,_fgaf ,_agfdc ,_dbec );_afae !=nil {return _a .Wrap (_afae ,_dade ,"");};return nil ;
|
|
};func _abdb (_gacg ,_ddbf *Bitmap )(*Bitmap ,error ){if _ddbf ==nil {return nil ,_a .Error ("\u0063\u006f\u0070\u0079\u0042\u0069\u0074\u006d\u0061\u0070","\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _ddbf ==_gacg {return _gacg ,nil ;
|
|
};if _gacg ==nil {_gacg =_ddbf .createTemplate ();copy (_gacg .Data ,_ddbf .Data );return _gacg ,nil ;};_gcgb :=_gacg .resizeImageData (_ddbf );if _gcgb !=nil {return nil ,_a .Wrap (_gcgb ,"\u0063\u006f\u0070\u0079\u0042\u0069\u0074\u006d\u0061\u0070","");
|
|
};_gacg .Text =_ddbf .Text ;copy (_gacg .Data ,_ddbf .Data );return _gacg ,nil ;};func _cgeg (_cfged *Bitmap ,_faec ,_agca ,_cbcg ,_dfbd int ,_gfbe RasterOperator ,_cbfd *Bitmap ,_ffff ,_ccca int )error {var (_ebdd bool ;_gagdc bool ;_geef int ;_dgac int ;
|
|
_ddcag int ;_daeac bool ;_agbee byte ;_agba int ;_cfabd int ;_cdff int ;_abbfb ,_beea int ;);_ggbf :=8-(_faec &7);_fbcdd :=_aggd [_ggbf ];_faea :=_cfged .RowStride *_agca +(_faec >>3);_cagg :=_cbfd .RowStride *_ccca +(_ffff >>3);if _cbcg < _ggbf {_ebdd =true ;
|
|
_fbcdd &=_aagcg [8-_ggbf +_cbcg ];};if !_ebdd {_geef =(_cbcg -_ggbf )>>3;if _geef > 0{_gagdc =true ;_dgac =_faea +1;_ddcag =_cagg +1;};};_agba =(_faec +_cbcg )&7;if !(_ebdd ||_agba ==0){_daeac =true ;_agbee =_aagcg [_agba ];_cfabd =_faea +1+_geef ;_cdff =_cagg +1+_geef ;
|
|
};switch _gfbe {case PixSrc :for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{_cfged .Data [_faea ]=_cgadc (_cfged .Data [_faea ],_cbfd .Data [_cagg ],_fbcdd );_faea +=_cfged .RowStride ;_cagg +=_cbfd .RowStride ;};if _gagdc {for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{for _beea =0;
|
|
_beea < _geef ;_beea ++{_cfged .Data [_dgac +_beea ]=_cbfd .Data [_ddcag +_beea ];};_dgac +=_cfged .RowStride ;_ddcag +=_cbfd .RowStride ;};};if _daeac {for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{_cfged .Data [_cfabd ]=_cgadc (_cfged .Data [_cfabd ],_cbfd .Data [_cdff ],_agbee );
|
|
_cfabd +=_cfged .RowStride ;_cdff +=_cbfd .RowStride ;};};case PixNotSrc :for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{_cfged .Data [_faea ]=_cgadc (_cfged .Data [_faea ],^_cbfd .Data [_cagg ],_fbcdd );_faea +=_cfged .RowStride ;_cagg +=_cbfd .RowStride ;};
|
|
if _gagdc {for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{for _beea =0;_beea < _geef ;_beea ++{_cfged .Data [_dgac +_beea ]=^_cbfd .Data [_ddcag +_beea ];};_dgac +=_cfged .RowStride ;_ddcag +=_cbfd .RowStride ;};};if _daeac {for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{_cfged .Data [_cfabd ]=_cgadc (_cfged .Data [_cfabd ],^_cbfd .Data [_cdff ],_agbee );
|
|
_cfabd +=_cfged .RowStride ;_cdff +=_cbfd .RowStride ;};};case PixSrcOrDst :for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{_cfged .Data [_faea ]=_cgadc (_cfged .Data [_faea ],_cbfd .Data [_cagg ]|_cfged .Data [_faea ],_fbcdd );_faea +=_cfged .RowStride ;_cagg +=_cbfd .RowStride ;
|
|
};if _gagdc {for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{for _beea =0;_beea < _geef ;_beea ++{_cfged .Data [_dgac +_beea ]|=_cbfd .Data [_ddcag +_beea ];};_dgac +=_cfged .RowStride ;_ddcag +=_cbfd .RowStride ;};};if _daeac {for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{_cfged .Data [_cfabd ]=_cgadc (_cfged .Data [_cfabd ],_cbfd .Data [_cdff ]|_cfged .Data [_cfabd ],_agbee );
|
|
_cfabd +=_cfged .RowStride ;_cdff +=_cbfd .RowStride ;};};case PixSrcAndDst :for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{_cfged .Data [_faea ]=_cgadc (_cfged .Data [_faea ],_cbfd .Data [_cagg ]&_cfged .Data [_faea ],_fbcdd );_faea +=_cfged .RowStride ;_cagg +=_cbfd .RowStride ;
|
|
};if _gagdc {for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{for _beea =0;_beea < _geef ;_beea ++{_cfged .Data [_dgac +_beea ]&=_cbfd .Data [_ddcag +_beea ];};_dgac +=_cfged .RowStride ;_ddcag +=_cbfd .RowStride ;};};if _daeac {for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{_cfged .Data [_cfabd ]=_cgadc (_cfged .Data [_cfabd ],_cbfd .Data [_cdff ]&_cfged .Data [_cfabd ],_agbee );
|
|
_cfabd +=_cfged .RowStride ;_cdff +=_cbfd .RowStride ;};};case PixSrcXorDst :for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{_cfged .Data [_faea ]=_cgadc (_cfged .Data [_faea ],_cbfd .Data [_cagg ]^_cfged .Data [_faea ],_fbcdd );_faea +=_cfged .RowStride ;_cagg +=_cbfd .RowStride ;
|
|
};if _gagdc {for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{for _beea =0;_beea < _geef ;_beea ++{_cfged .Data [_dgac +_beea ]^=_cbfd .Data [_ddcag +_beea ];};_dgac +=_cfged .RowStride ;_ddcag +=_cbfd .RowStride ;};};if _daeac {for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{_cfged .Data [_cfabd ]=_cgadc (_cfged .Data [_cfabd ],_cbfd .Data [_cdff ]^_cfged .Data [_cfabd ],_agbee );
|
|
_cfabd +=_cfged .RowStride ;_cdff +=_cbfd .RowStride ;};};case PixNotSrcOrDst :for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{_cfged .Data [_faea ]=_cgadc (_cfged .Data [_faea ],^(_cbfd .Data [_cagg ])|_cfged .Data [_faea ],_fbcdd );_faea +=_cfged .RowStride ;
|
|
_cagg +=_cbfd .RowStride ;};if _gagdc {for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{for _beea =0;_beea < _geef ;_beea ++{_cfged .Data [_dgac +_beea ]|=^(_cbfd .Data [_ddcag +_beea ]);};_dgac +=_cfged .RowStride ;_ddcag +=_cbfd .RowStride ;};};if _daeac {for _abbfb =0;
|
|
_abbfb < _dfbd ;_abbfb ++{_cfged .Data [_cfabd ]=_cgadc (_cfged .Data [_cfabd ],^(_cbfd .Data [_cdff ])|_cfged .Data [_cfabd ],_agbee );_cfabd +=_cfged .RowStride ;_cdff +=_cbfd .RowStride ;};};case PixNotSrcAndDst :for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{_cfged .Data [_faea ]=_cgadc (_cfged .Data [_faea ],^(_cbfd .Data [_cagg ])&_cfged .Data [_faea ],_fbcdd );
|
|
_faea +=_cfged .RowStride ;_cagg +=_cbfd .RowStride ;};if _gagdc {for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{for _beea =0;_beea < _geef ;_beea ++{_cfged .Data [_dgac +_beea ]&=^_cbfd .Data [_ddcag +_beea ];};_dgac +=_cfged .RowStride ;_ddcag +=_cbfd .RowStride ;
|
|
};};if _daeac {for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{_cfged .Data [_cfabd ]=_cgadc (_cfged .Data [_cfabd ],^(_cbfd .Data [_cdff ])&_cfged .Data [_cfabd ],_agbee );_cfabd +=_cfged .RowStride ;_cdff +=_cbfd .RowStride ;};};case PixSrcOrNotDst :for _abbfb =0;
|
|
_abbfb < _dfbd ;_abbfb ++{_cfged .Data [_faea ]=_cgadc (_cfged .Data [_faea ],_cbfd .Data [_cagg ]|^(_cfged .Data [_faea ]),_fbcdd );_faea +=_cfged .RowStride ;_cagg +=_cbfd .RowStride ;};if _gagdc {for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{for _beea =0;
|
|
_beea < _geef ;_beea ++{_cfged .Data [_dgac +_beea ]=_cbfd .Data [_ddcag +_beea ]|^(_cfged .Data [_dgac +_beea ]);};_dgac +=_cfged .RowStride ;_ddcag +=_cbfd .RowStride ;};};if _daeac {for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{_cfged .Data [_cfabd ]=_cgadc (_cfged .Data [_cfabd ],_cbfd .Data [_cdff ]|^(_cfged .Data [_cfabd ]),_agbee );
|
|
_cfabd +=_cfged .RowStride ;_cdff +=_cbfd .RowStride ;};};case PixSrcAndNotDst :for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{_cfged .Data [_faea ]=_cgadc (_cfged .Data [_faea ],_cbfd .Data [_cagg ]&^(_cfged .Data [_faea ]),_fbcdd );_faea +=_cfged .RowStride ;
|
|
_cagg +=_cbfd .RowStride ;};if _gagdc {for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{for _beea =0;_beea < _geef ;_beea ++{_cfged .Data [_dgac +_beea ]=_cbfd .Data [_ddcag +_beea ]&^(_cfged .Data [_dgac +_beea ]);};_dgac +=_cfged .RowStride ;_ddcag +=_cbfd .RowStride ;
|
|
};};if _daeac {for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{_cfged .Data [_cfabd ]=_cgadc (_cfged .Data [_cfabd ],_cbfd .Data [_cdff ]&^(_cfged .Data [_cfabd ]),_agbee );_cfabd +=_cfged .RowStride ;_cdff +=_cbfd .RowStride ;};};case PixNotPixSrcOrDst :for _abbfb =0;
|
|
_abbfb < _dfbd ;_abbfb ++{_cfged .Data [_faea ]=_cgadc (_cfged .Data [_faea ],^(_cbfd .Data [_cagg ]|_cfged .Data [_faea ]),_fbcdd );_faea +=_cfged .RowStride ;_cagg +=_cbfd .RowStride ;};if _gagdc {for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{for _beea =0;
|
|
_beea < _geef ;_beea ++{_cfged .Data [_dgac +_beea ]=^(_cbfd .Data [_ddcag +_beea ]|_cfged .Data [_dgac +_beea ]);};_dgac +=_cfged .RowStride ;_ddcag +=_cbfd .RowStride ;};};if _daeac {for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{_cfged .Data [_cfabd ]=_cgadc (_cfged .Data [_cfabd ],^(_cbfd .Data [_cdff ]|_cfged .Data [_cfabd ]),_agbee );
|
|
_cfabd +=_cfged .RowStride ;_cdff +=_cbfd .RowStride ;};};case PixNotPixSrcAndDst :for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{_cfged .Data [_faea ]=_cgadc (_cfged .Data [_faea ],^(_cbfd .Data [_cagg ]&_cfged .Data [_faea ]),_fbcdd );_faea +=_cfged .RowStride ;
|
|
_cagg +=_cbfd .RowStride ;};if _gagdc {for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{for _beea =0;_beea < _geef ;_beea ++{_cfged .Data [_dgac +_beea ]=^(_cbfd .Data [_ddcag +_beea ]&_cfged .Data [_dgac +_beea ]);};_dgac +=_cfged .RowStride ;_ddcag +=_cbfd .RowStride ;
|
|
};};if _daeac {for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{_cfged .Data [_cfabd ]=_cgadc (_cfged .Data [_cfabd ],^(_cbfd .Data [_cdff ]&_cfged .Data [_cfabd ]),_agbee );_cfabd +=_cfged .RowStride ;_cdff +=_cbfd .RowStride ;};};case PixNotPixSrcXorDst :for _abbfb =0;
|
|
_abbfb < _dfbd ;_abbfb ++{_cfged .Data [_faea ]=_cgadc (_cfged .Data [_faea ],^(_cbfd .Data [_cagg ]^_cfged .Data [_faea ]),_fbcdd );_faea +=_cfged .RowStride ;_cagg +=_cbfd .RowStride ;};if _gagdc {for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{for _beea =0;
|
|
_beea < _geef ;_beea ++{_cfged .Data [_dgac +_beea ]=^(_cbfd .Data [_ddcag +_beea ]^_cfged .Data [_dgac +_beea ]);};_dgac +=_cfged .RowStride ;_ddcag +=_cbfd .RowStride ;};};if _daeac {for _abbfb =0;_abbfb < _dfbd ;_abbfb ++{_cfged .Data [_cfabd ]=_cgadc (_cfged .Data [_cfabd ],^(_cbfd .Data [_cdff ]^_cfged .Data [_cfabd ]),_agbee );
|
|
_cfabd +=_cfged .RowStride ;_cdff +=_cbfd .RowStride ;};};default:_cee .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",_gfbe );return _a .Error ("\u0072\u0061\u0073\u0074er\u004f\u0070\u0056\u0041\u006c\u0069\u0067\u006e\u0065\u0064\u004c\u006f\u0077","\u0069\u006e\u0076al\u0069\u0064\u0020\u0072\u0061\u0073\u0074\u0065\u0072\u0020\u006f\u0070\u0065\u0072\u0061\u0074\u006f\u0072");
|
|
};return nil ;};const (MopDilation MorphOperation =iota ;MopErosion ;MopOpening ;MopClosing ;MopRankBinaryReduction ;MopReplicativeBinaryExpansion ;MopAddBorder ;);type fillSegment struct{_bbcdb int ;_gadd int ;_fgdg int ;_bbgdc int ;};func (_fae *Bitmap )connComponentsBitmapsBB (_fbgc *Bitmaps ,_fgbe int )(_edeg *Boxes ,_gfd error ){const _gbed ="\u0063\u006f\u006enC\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074\u0073\u0042\u0069\u0074\u006d\u0061\u0070\u0073\u0042\u0042";
|
|
if _fgbe !=4&&_fgbe !=8{return nil ,_a .Error (_gbed ,"\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 _fbgc ==nil {return nil ,_a .Error (_gbed ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0042\u0069\u0074ma\u0070\u0073");
|
|
};if len (_fbgc .Values )> 0{return nil ,_a .Error (_gbed ,"\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 _fae .Zero (){return &Boxes {},nil ;};
|
|
var (_gagf ,_cbb ,_abaa ,_aagc *Bitmap ;);_fae .setPadBits (0);if _gagf ,_gfd =_abdb (nil ,_fae );_gfd !=nil {return nil ,_a .Wrap (_gfd ,_gbed ,"\u0062\u006d\u0031");};if _cbb ,_gfd =_abdb (nil ,_fae );_gfd !=nil {return nil ,_a .Wrap (_gfd ,_gbed ,"\u0062\u006d\u0032");
|
|
};_agbb :=&_ce .Stack {};_agbb .Aux =&_ce .Stack {};_edeg =&Boxes {};var (_gbfb ,_fagc int ;_cbde _de .Point ;_aaf bool ;_dad *_de .Rectangle ;);for {if _cbde ,_aaf ,_gfd =_gagf .nextOnPixel (_gbfb ,_fagc );_gfd !=nil {return nil ,_a .Wrap (_gfd ,_gbed ,"");
|
|
};if !_aaf {break ;};if _dad ,_gfd =_ceca (_gagf ,_agbb ,_cbde .X ,_cbde .Y ,_fgbe );_gfd !=nil {return nil ,_a .Wrap (_gfd ,_gbed ,"");};if _gfd =_edeg .Add (_dad );_gfd !=nil {return nil ,_a .Wrap (_gfd ,_gbed ,"");};if _abaa ,_gfd =_gagf .clipRectangle (_dad ,nil );
|
|
_gfd !=nil {return nil ,_a .Wrap (_gfd ,_gbed ,"\u0062\u006d\u0033");};if _aagc ,_gfd =_cbb .clipRectangle (_dad ,nil );_gfd !=nil {return nil ,_a .Wrap (_gfd ,_gbed ,"\u0062\u006d\u0034");};if _ ,_gfd =_bfec (_abaa ,_abaa ,_aagc );_gfd !=nil {return nil ,_a .Wrap (_gfd ,_gbed ,"\u0062m\u0033\u0020\u005e\u0020\u0062\u006d4");
|
|
};if _gfd =_cbb .RasterOperation (_dad .Min .X ,_dad .Min .Y ,_dad .Dx (),_dad .Dy (),PixSrcXorDst ,_abaa ,0,0);_gfd !=nil {return nil ,_a .Wrap (_gfd ,_gbed ,"\u0062\u006d\u0032\u0020\u002d\u0058\u004f\u0052\u002d>\u0020\u0062\u006d\u0033");};_fbgc .AddBitmap (_abaa );
|
|
_gbfb =_cbde .X ;_fagc =_cbde .Y ;};_fbgc .Boxes =*_edeg ;return _edeg ,nil ;};func (_egcag *ClassedPoints )Swap (i ,j int ){_egcag .IntSlice [i ],_egcag .IntSlice [j ]=_egcag .IntSlice [j ],_egcag .IntSlice [i ];};func (_bbab *byHeight )Less (i ,j int )bool {return _bbab .Values [i ].Height < _bbab .Values [j ].Height };
|
|
func (_bde *Bitmap )CountPixels ()int {return _bde .countPixels ()};func (_dfb *Bitmap )SetPadBits (value int ){_dfb .setPadBits (value )};func (_gbbbf *Points )Add (pt *Points )error {const _bbcd ="\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0041\u0064\u0064";
|
|
if _gbbbf ==nil {return _a .Error (_bbcd ,"\u0070o\u0069n\u0074\u0073\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if pt ==nil {return _a .Error (_bbcd ,"a\u0072\u0067\u0075\u006d\u0065\u006et\u0020\u0070\u006f\u0069\u006e\u0074\u0073\u0020\u006eo\u0074\u0020\u0064e\u0066i\u006e\u0065\u0064");
|
|
};*_gbbbf =append (*_gbbbf ,*pt ...);return nil ;};func _gagff (_ggaf ,_ffdeb *Bitmap ,_fdgb ,_ffacb int )(*Bitmap ,error ){const _facc ="\u0063\u006c\u006f\u0073\u0065\u0053\u0061\u0066\u0065B\u0072\u0069\u0063\u006b";if _ffdeb ==nil {return nil ,_a .Error (_facc ,"\u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0069\u0073\u0020\u006e\u0069\u006c");
|
|
};if _fdgb < 1||_ffacb < 1{return nil ,_a .Error (_facc ,"\u0068s\u0069\u007a\u0065\u0020\u0061\u006e\u0064\u0020\u0076\u0073\u0069z\u0065\u0020\u006e\u006f\u0074\u0020\u003e\u003d\u0020\u0031");};if _fdgb ==1&&_ffacb ==1{return _abdb (_ggaf ,_ffdeb );
|
|
};if MorphBC ==SymmetricMorphBC {_fbbf ,_fgfc :=_bbcc (_ggaf ,_ffdeb ,_fdgb ,_ffacb );if _fgfc !=nil {return nil ,_a .Wrap (_fgfc ,_facc ,"\u0053\u0079m\u006d\u0065\u0074r\u0069\u0063\u004d\u006f\u0072\u0070\u0068\u0042\u0043");};return _fbbf ,nil ;};_aceg :=_bbbg (_fdgb /2,_ffacb /2);
|
|
_acdc :=8*((_aceg +7)/8);_eaba ,_aagb :=_ffdeb .AddBorder (_acdc ,0);if _aagb !=nil {return nil ,_a .Wrapf (_aagb ,_facc ,"\u0042\u006f\u0072\u0064\u0065\u0072\u0053\u0069\u007ae\u003a\u0020\u0025\u0064",_acdc );};var _agbea ,_ceac *Bitmap ;if _fdgb ==1||_ffacb ==1{_bcbg :=SelCreateBrick (_ffacb ,_fdgb ,_ffacb /2,_fdgb /2,SelHit );
|
|
_agbea ,_aagb =_dbga (nil ,_eaba ,_bcbg );if _aagb !=nil {return nil ,_a .Wrap (_aagb ,_facc ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");};}else {_decf :=SelCreateBrick (1,_fdgb ,0,_fdgb /2,SelHit );
|
|
_feac ,_afgd :=_bacca (nil ,_eaba ,_decf );if _afgd !=nil {return nil ,_a .Wrap (_afgd ,_facc ,"\u0072\u0065\u0067\u0075la\u0072\u0020\u002d\u0020\u0066\u0069\u0072\u0073\u0074\u0020\u0064\u0069\u006c\u0061t\u0065");};_bcgd :=SelCreateBrick (_ffacb ,1,_ffacb /2,0,SelHit );
|
|
_agbea ,_afgd =_bacca (nil ,_feac ,_bcgd );if _afgd !=nil {return nil ,_a .Wrap (_afgd ,_facc ,"\u0072\u0065\u0067ul\u0061\u0072\u0020\u002d\u0020\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};if _ ,_afgd =_cedcad (_feac ,_agbea ,_decf );
|
|
_afgd !=nil {return nil ,_a .Wrap (_afgd ,_facc ,"r\u0065\u0067\u0075\u006car\u0020-\u0020\u0066\u0069\u0072\u0073t\u0020\u0065\u0072\u006f\u0064\u0065");};if _ ,_afgd =_cedcad (_agbea ,_feac ,_bcgd );_afgd !=nil {return nil ,_a .Wrap (_afgd ,_facc ,"\u0072\u0065\u0067\u0075la\u0072\u0020\u002d\u0020\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0065\u0072\u006fd\u0065");
|
|
};};if _ceac ,_aagb =_agbea .RemoveBorder (_acdc );_aagb !=nil {return nil ,_a .Wrap (_aagb ,_facc ,"\u0072e\u0067\u0075\u006c\u0061\u0072");};if _ggaf ==nil {return _ceac ,nil ;};if _ ,_aagb =_abdb (_ggaf ,_ceac );_aagb !=nil {return nil ,_aagb ;};return _ggaf ,nil ;
|
|
};func (_fce *Bitmap )resizeImageData (_ged *Bitmap )error {if _ged ==nil {return _a .Error ("\u0072e\u0073i\u007a\u0065\u0049\u006d\u0061\u0067\u0065\u0044\u0061\u0074\u0061","\u0073r\u0063 \u0069\u0073\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if _fce .SizesEqual (_ged ){return nil ;};_fce .Data =make ([]byte ,len (_ged .Data ));_fce .Width =_ged .Width ;_fce .Height =_ged .Height ;_fce .RowStride =_ged .RowStride ;return nil ;};func (_fbgfg *Bitmaps )Size ()int {return len (_fbgfg .Values )};
|
|
func _bbbg (_ffgc ,_edf int )int {if _ffgc > _edf {return _ffgc ;};return _edf ;};func (_dda *Bitmap )Equivalent (s *Bitmap )bool {return _dda .equivalent (s )};func (_fffac *Selection )setOrigin (_eabae ,_affd int ){_fffac .Cy ,_fffac .Cx =_eabae ,_affd };
|
|
type byHeight Bitmaps ;func MorphSequence (src *Bitmap ,sequence ...MorphProcess )(*Bitmap ,error ){return _dadc (src ,sequence ...);};type Bitmaps struct{Values []*Bitmap ;Boxes []*_de .Rectangle ;};func TstPSymbol (t *_f .T )*Bitmap {t .Helper ();_age :=New (5,8);
|
|
_ca .NoError (t ,_age .SetPixel (0,0,1));_ca .NoError (t ,_age .SetPixel (1,0,1));_ca .NoError (t ,_age .SetPixel (2,0,1));_ca .NoError (t ,_age .SetPixel (3,0,1));_ca .NoError (t ,_age .SetPixel (4,1,1));_ca .NoError (t ,_age .SetPixel (0,1,1));_ca .NoError (t ,_age .SetPixel (4,2,1));
|
|
_ca .NoError (t ,_age .SetPixel (0,2,1));_ca .NoError (t ,_age .SetPixel (4,3,1));_ca .NoError (t ,_age .SetPixel (0,3,1));_ca .NoError (t ,_age .SetPixel (0,4,1));_ca .NoError (t ,_age .SetPixel (1,4,1));_ca .NoError (t ,_age .SetPixel (2,4,1));_ca .NoError (t ,_age .SetPixel (3,4,1));
|
|
_ca .NoError (t ,_age .SetPixel (0,5,1));_ca .NoError (t ,_age .SetPixel (0,6,1));_ca .NoError (t ,_age .SetPixel (0,7,1));return _age ;};func TstCSymbol (t *_f .T )*Bitmap {t .Helper ();_geca :=New (6,6);_ca .NoError (t ,_geca .SetPixel (1,0,1));_ca .NoError (t ,_geca .SetPixel (2,0,1));
|
|
_ca .NoError (t ,_geca .SetPixel (3,0,1));_ca .NoError (t ,_geca .SetPixel (4,0,1));_ca .NoError (t ,_geca .SetPixel (0,1,1));_ca .NoError (t ,_geca .SetPixel (5,1,1));_ca .NoError (t ,_geca .SetPixel (0,2,1));_ca .NoError (t ,_geca .SetPixel (0,3,1));
|
|
_ca .NoError (t ,_geca .SetPixel (0,4,1));_ca .NoError (t ,_geca .SetPixel (5,4,1));_ca .NoError (t ,_geca .SetPixel (1,5,1));_ca .NoError (t ,_geca .SetPixel (2,5,1));_ca .NoError (t ,_geca .SetPixel (3,5,1));_ca .NoError (t ,_geca .SetPixel (4,5,1));
|
|
return _geca ;};func (_agga *Bitmap )ConnComponents (bms *Bitmaps ,connectivity int )(_gead *Boxes ,_abcc error ){const _geg ="B\u0069\u0074\u006d\u0061p.\u0043o\u006e\u006e\u0043\u006f\u006dp\u006f\u006e\u0065\u006e\u0074\u0073";if _agga ==nil {return nil ,_a .Error (_geg ,"\u0070r\u006f\u0076\u0069\u0064e\u0064\u0020\u0065\u006d\u0070t\u0079 \u0027b\u0027\u0020\u0062\u0069\u0074\u006d\u0061p");
|
|
};if connectivity !=4&&connectivity !=8{return nil ,_a .Error (_geg ,"\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 _gead ,_abcc =_agga .connComponentsBB (connectivity );
|
|
_abcc !=nil {return nil ,_a .Wrap (_abcc ,_geg ,"");};}else {if _gead ,_abcc =_agga .connComponentsBitmapsBB (bms ,connectivity );_abcc !=nil {return nil ,_a .Wrap (_abcc ,_geg ,"");};};return _gead ,nil ;};func _beaf ()[]int {_agge :=make ([]int ,256);
|
|
_agge [0]=0;_agge [1]=7;var _abdg int ;for _abdg =2;_abdg < 4;_abdg ++{_agge [_abdg ]=_agge [_abdg -2]+6;};for _abdg =4;_abdg < 8;_abdg ++{_agge [_abdg ]=_agge [_abdg -4]+5;};for _abdg =8;_abdg < 16;_abdg ++{_agge [_abdg ]=_agge [_abdg -8]+4;};for _abdg =16;
|
|
_abdg < 32;_abdg ++{_agge [_abdg ]=_agge [_abdg -16]+3;};for _abdg =32;_abdg < 64;_abdg ++{_agge [_abdg ]=_agge [_abdg -32]+2;};for _abdg =64;_abdg < 128;_abdg ++{_agge [_abdg ]=_agge [_abdg -64]+1;};for _abdg =128;_abdg < 256;_abdg ++{_agge [_abdg ]=_agge [_abdg -128];
|
|
};return _agge ;};type MorphOperation int ;type LocationFilter int ;func _ceca (_eeda *Bitmap ,_afbf *_ce .Stack ,_adbd ,_dcbg ,_eaaa int )(_gbgb *_de .Rectangle ,_debae error ){const _feefb ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";
|
|
if _eeda ==nil {return nil ,_a .Error (_feefb ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");};if _afbf ==nil {return nil ,_a .Error (_feefb ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");
|
|
};switch _eaaa {case 4:if _gbgb ,_debae =_gfde (_eeda ,_afbf ,_adbd ,_dcbg );_debae !=nil {return nil ,_a .Wrap (_debae ,_feefb ,"");};return _gbgb ,nil ;case 8:if _gbgb ,_debae =_cedb (_eeda ,_afbf ,_adbd ,_dcbg );_debae !=nil {return nil ,_a .Wrap (_debae ,_feefb ,"");
|
|
};return _gbgb ,nil ;default:return nil ,_a .Errorf (_feefb ,"\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",_eaaa );
|
|
};};func (_ecbe *ClassedPoints )SortByX (){_ecbe ._gacc =_ecbe .xSortFunction ();_ag .Sort (_ecbe )};func (_fgbfe *Bitmaps )GroupByHeight ()(*BitmapsArray ,error ){const _aabeb ="\u0047\u0072\u006f\u0075\u0070\u0042\u0079\u0048\u0065\u0069\u0067\u0068\u0074";
|
|
if len (_fgbfe .Values )==0{return nil ,_a .Error (_aabeb ,"\u006eo\u0020v\u0061\u006c\u0075\u0065\u0073 \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");};_ebec :=&BitmapsArray {};_fgbfe .SortByHeight ();_faed :=-1;_ffcg :=-1;for _gbac :=0;_gbac < len (_fgbfe .Values );
|
|
_gbac ++{_dcgc :=_fgbfe .Values [_gbac ].Height ;if _dcgc > _faed {_faed =_dcgc ;_ffcg ++;_ebec .Values =append (_ebec .Values ,&Bitmaps {});};_ebec .Values [_ffcg ].AddBitmap (_fgbfe .Values [_gbac ]);};return _ebec ,nil ;};func (_cgafg *Bitmaps )SortByWidth (){_agac :=(*byWidth )(_cgafg );
|
|
_ag .Sort (_agac )};func (_ddcd Points )GetGeometry (i int )(_ecfe ,_cdaf float32 ,_cfaa error ){if i > len (_ddcd )-1{return 0,0,_a .Errorf ("\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0065\u0074","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
};_aff :=_ddcd [i ];return _aff .X ,_aff .Y ,nil ;};func _cedb (_befad *Bitmap ,_dfeed *_ce .Stack ,_bfcb ,_fgad int )(_ddad *_de .Rectangle ,_gdddb error ){const _abae ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";
|
|
if _befad ==nil {return nil ,_a .Error (_abae ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");};if _dfeed ==nil {return nil ,_a .Error (_abae ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");
|
|
};_aadba ,_fadg :=_befad .Width ,_befad .Height ;_bccf :=_aadba -1;_gdba :=_fadg -1;if _bfcb < 0||_bfcb > _bccf ||_fgad < 0||_fgad > _gdba ||!_befad .GetPixel (_bfcb ,_fgad ){return nil ,nil ;};_eabbd :=_de .Rect (100000,100000,0,0);if _gdddb =_fafa (_dfeed ,_bfcb ,_bfcb ,_fgad ,1,_gdba ,&_eabbd );
|
|
_gdddb !=nil {return nil ,_a .Wrap (_gdddb ,_abae ,"\u0069\u006e\u0069t\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _gdddb =_fafa (_dfeed ,_bfcb ,_bfcb ,_fgad +1,-1,_gdba ,&_eabbd );_gdddb !=nil {return nil ,_a .Wrap (_gdddb ,_abae ,"\u0032\u006ed\u0020\u0069\u006ei\u0074\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");
|
|
};_eabbd .Min .X ,_eabbd .Max .X =_bfcb ,_bfcb ;_eabbd .Min .Y ,_eabbd .Max .Y =_fgad ,_fgad ;var (_abcf *fillSegment ;_ccga int ;);for _dfeed .Len ()> 0{if _abcf ,_gdddb =_fbeb (_dfeed );_gdddb !=nil {return nil ,_a .Wrap (_gdddb ,_abae ,"");};_fgad =_abcf ._fgdg ;
|
|
for _bfcb =_abcf ._bbcdb -1;_bfcb >=0&&_befad .GetPixel (_bfcb ,_fgad );_bfcb --{if _gdddb =_befad .SetPixel (_bfcb ,_fgad ,0);_gdddb !=nil {return nil ,_a .Wrap (_gdddb ,_abae ,"\u0031s\u0074\u0020\u0073\u0065\u0074");};};if _bfcb >=_abcf ._bbcdb -1{for {for _bfcb ++;
|
|
_bfcb <=_abcf ._gadd +1&&_bfcb <=_bccf &&!_befad .GetPixel (_bfcb ,_fgad );_bfcb ++{};_ccga =_bfcb ;if !(_bfcb <=_abcf ._gadd +1&&_bfcb <=_bccf ){break ;};for ;_bfcb <=_bccf &&_befad .GetPixel (_bfcb ,_fgad );_bfcb ++{if _gdddb =_befad .SetPixel (_bfcb ,_fgad ,0);
|
|
_gdddb !=nil {return nil ,_a .Wrap (_gdddb ,_abae ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _gdddb =_fafa (_dfeed ,_ccga ,_bfcb -1,_abcf ._fgdg ,_abcf ._bbgdc ,_gdba ,&_eabbd );_gdddb !=nil {return nil ,_a .Wrap (_gdddb ,_abae ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");
|
|
};if _bfcb > _abcf ._gadd {if _gdddb =_fafa (_dfeed ,_abcf ._gadd +1,_bfcb -1,_abcf ._fgdg ,-_abcf ._bbgdc ,_gdba ,&_eabbd );_gdddb !=nil {return nil ,_a .Wrap (_gdddb ,_abae ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");
|
|
};};};continue ;};_ccga =_bfcb +1;if _ccga < _abcf ._bbcdb {if _gdddb =_fafa (_dfeed ,_ccga ,_abcf ._bbcdb -1,_abcf ._fgdg ,-_abcf ._bbgdc ,_gdba ,&_eabbd );_gdddb !=nil {return nil ,_a .Wrap (_gdddb ,_abae ,"\u006c\u0065\u0061\u006b\u0020\u006f\u006e\u0020\u006c\u0065\u0066\u0074 \u0073\u0069\u0064\u0065");
|
|
};};_bfcb =_abcf ._bbcdb ;for {for ;_bfcb <=_bccf &&_befad .GetPixel (_bfcb ,_fgad );_bfcb ++{if _gdddb =_befad .SetPixel (_bfcb ,_fgad ,0);_gdddb !=nil {return nil ,_a .Wrap (_gdddb ,_abae ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _gdddb =_fafa (_dfeed ,_ccga ,_bfcb -1,_abcf ._fgdg ,_abcf ._bbgdc ,_gdba ,&_eabbd );
|
|
_gdddb !=nil {return nil ,_a .Wrap (_gdddb ,_abae ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _bfcb > _abcf ._gadd {if _gdddb =_fafa (_dfeed ,_abcf ._gadd +1,_bfcb -1,_abcf ._fgdg ,-_abcf ._bbgdc ,_gdba ,&_eabbd );_gdddb !=nil {return nil ,_a .Wrap (_gdddb ,_abae ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");
|
|
};};for _bfcb ++;_bfcb <=_abcf ._gadd +1&&_bfcb <=_bccf &&!_befad .GetPixel (_bfcb ,_fgad );_bfcb ++{};_ccga =_bfcb ;if !(_bfcb <=_abcf ._gadd +1&&_bfcb <=_bccf ){break ;};};};_eabbd .Max .X ++;_eabbd .Max .Y ++;return &_eabbd ,nil ;};func TstDSymbol (t *_f .T ,scale ...int )*Bitmap {_bfba ,_fegcc :=NewWithData (4,5,[]byte {0xf0,0x90,0x90,0x90,0xE0});
|
|
_ca .NoError (t ,_fegcc );return TstGetScaledSymbol (t ,_bfba ,scale ...);};func _bacca (_abgf *Bitmap ,_gfff *Bitmap ,_cbda *Selection )(*Bitmap ,error ){var (_edad *Bitmap ;_fcbc error ;);_abgf ,_fcbc =_bbfdd (_abgf ,_gfff ,_cbda ,&_edad );if _fcbc !=nil {return nil ,_fcbc ;
|
|
};if _fcbc =_abgf .clearAll ();_fcbc !=nil {return nil ,_fcbc ;};var _daab SelectionValue ;for _adcg :=0;_adcg < _cbda .Height ;_adcg ++{for _debe :=0;_debe < _cbda .Width ;_debe ++{_daab =_cbda .Data [_adcg ][_debe ];if _daab ==SelHit {if _fcbc =_abgf .RasterOperation (_debe -_cbda .Cx ,_adcg -_cbda .Cy ,_gfff .Width ,_gfff .Height ,PixSrcOrDst ,_edad ,0,0);
|
|
_fcbc !=nil {return nil ,_fcbc ;};};};};return _abgf ,nil ;};func (_afcg *Bitmap )setEightPartlyBytes (_ebcf ,_feg int ,_aedd uint64 )(_dcgg error ){var (_bgfa byte ;_cadg int ;);const _bfef ="\u0073\u0065\u0074\u0045ig\u0068\u0074\u0050\u0061\u0072\u0074\u006c\u0079\u0042\u0079\u0074\u0065\u0073";
|
|
for _bad :=1;_bad <=_feg ;_bad ++{_cadg =64-_bad *8;_bgfa =byte (_aedd >>uint (_cadg )&0xff);_cee .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",_bgfa ,_ebcf ,_ebcf +_bad -1,_feg ,_cadg );
|
|
if _dcgg =_afcg .SetByte (_ebcf +_bad -1,_bgfa );_dcgg !=nil {return _a .Wrap (_dcgg ,_bfef ,"\u0066\u0075\u006c\u006c\u0042\u0079\u0074\u0065");};};_dged :=_afcg .RowStride *8-_afcg .Width ;if _dged ==0{return nil ;};_cadg -=8;_bgfa =byte (_aedd >>uint (_cadg )&0xff)<<uint (_dged );
|
|
if _dcgg =_afcg .SetByte (_ebcf +_feg ,_bgfa );_dcgg !=nil {return _a .Wrap (_dcgg ,_bfef ,"\u0070\u0061\u0064\u0064\u0065\u0064");};return nil ;};func MakePixelSumTab8 ()[]int {return _adbac ()};func (_gffcc *ClassedPoints )Len ()int {return _gffcc .IntSlice .Size ()};
|
|
func (_bgd *Bitmap )RemoveBorderGeneral (left ,right ,top ,bot int )(*Bitmap ,error ){return _bgd .removeBorderGeneral (left ,right ,top ,bot );};func _efcc (_fcbe *Bitmap ,_eeeag ,_ddgb ,_dddbd ,_ffdce int ,_ege RasterOperator ,_baebg *Bitmap ,_cffe ,_eafgc int )error {var (_fcff bool ;
|
|
_dbcad bool ;_bcfac byte ;_baab int ;_ffca int ;_badfb int ;_bfbd int ;_ggea bool ;_dbfgc int ;_efgge int ;_bggf int ;_abgb bool ;_ffed byte ;_cafd int ;_adeg int ;_bgfce int ;_bedaf byte ;_bddbd int ;_fffa int ;_cccga uint ;_aace uint ;_bbbf byte ;_faba shift ;
|
|
_fba bool ;_bfdd bool ;_acegd ,_geea int ;);if _cffe &7!=0{_fffa =8-(_cffe &7);};if _eeeag &7!=0{_ffca =8-(_eeeag &7);};if _fffa ==0&&_ffca ==0{_bbbf =_aggd [0];}else {if _ffca > _fffa {_cccga =uint (_ffca -_fffa );}else {_cccga =uint (8-(_fffa -_ffca ));
|
|
};_aace =8-_cccga ;_bbbf =_aggd [_cccga ];};if (_eeeag &7)!=0{_fcff =true ;_baab =8-(_eeeag &7);_bcfac =_aggd [_baab ];_badfb =_fcbe .RowStride *_ddgb +(_eeeag >>3);_bfbd =_baebg .RowStride *_eafgc +(_cffe >>3);_bddbd =8-(_cffe &7);if _baab > _bddbd {_faba =_gbff ;
|
|
if _dddbd >=_fffa {_fba =true ;};}else {_faba =_dgeba ;};};if _dddbd < _baab {_dbcad =true ;_bcfac &=_aagcg [8-_baab +_dddbd ];};if !_dbcad {_dbfgc =(_dddbd -_baab )>>3;if _dbfgc !=0{_ggea =true ;_efgge =_fcbe .RowStride *_ddgb +((_eeeag +_ffca )>>3);_bggf =_baebg .RowStride *_eafgc +((_cffe +_ffca )>>3);
|
|
};};_cafd =(_eeeag +_dddbd )&7;if !(_dbcad ||_cafd ==0){_abgb =true ;_ffed =_aagcg [_cafd ];_adeg =_fcbe .RowStride *_ddgb +((_eeeag +_ffca )>>3)+_dbfgc ;_bgfce =_baebg .RowStride *_eafgc +((_cffe +_ffca )>>3)+_dbfgc ;if _cafd > int (_aace ){_bfdd =true ;
|
|
};};switch _ege {case PixSrc :if _fcff {for _acegd =0;_acegd < _ffdce ;_acegd ++{if _faba ==_gbff {_bedaf =_baebg .Data [_bfbd ]<<_cccga ;if _fba {_bedaf =_cgadc (_bedaf ,_baebg .Data [_bfbd +1]>>_aace ,_bbbf );};}else {_bedaf =_baebg .Data [_bfbd ]>>_aace ;
|
|
};_fcbe .Data [_badfb ]=_cgadc (_fcbe .Data [_badfb ],_bedaf ,_bcfac );_badfb +=_fcbe .RowStride ;_bfbd +=_baebg .RowStride ;};};if _ggea {for _acegd =0;_acegd < _ffdce ;_acegd ++{for _geea =0;_geea < _dbfgc ;_geea ++{_bedaf =_cgadc (_baebg .Data [_bggf +_geea ]<<_cccga ,_baebg .Data [_bggf +_geea +1]>>_aace ,_bbbf );
|
|
_fcbe .Data [_efgge +_geea ]=_bedaf ;};_efgge +=_fcbe .RowStride ;_bggf +=_baebg .RowStride ;};};if _abgb {for _acegd =0;_acegd < _ffdce ;_acegd ++{_bedaf =_baebg .Data [_bgfce ]<<_cccga ;if _bfdd {_bedaf =_cgadc (_bedaf ,_baebg .Data [_bgfce +1]>>_aace ,_bbbf );
|
|
};_fcbe .Data [_adeg ]=_cgadc (_fcbe .Data [_adeg ],_bedaf ,_ffed );_adeg +=_fcbe .RowStride ;_bgfce +=_baebg .RowStride ;};};case PixNotSrc :if _fcff {for _acegd =0;_acegd < _ffdce ;_acegd ++{if _faba ==_gbff {_bedaf =_baebg .Data [_bfbd ]<<_cccga ;if _fba {_bedaf =_cgadc (_bedaf ,_baebg .Data [_bfbd +1]>>_aace ,_bbbf );
|
|
};}else {_bedaf =_baebg .Data [_bfbd ]>>_aace ;};_fcbe .Data [_badfb ]=_cgadc (_fcbe .Data [_badfb ],^_bedaf ,_bcfac );_badfb +=_fcbe .RowStride ;_bfbd +=_baebg .RowStride ;};};if _ggea {for _acegd =0;_acegd < _ffdce ;_acegd ++{for _geea =0;_geea < _dbfgc ;
|
|
_geea ++{_bedaf =_cgadc (_baebg .Data [_bggf +_geea ]<<_cccga ,_baebg .Data [_bggf +_geea +1]>>_aace ,_bbbf );_fcbe .Data [_efgge +_geea ]=^_bedaf ;};_efgge +=_fcbe .RowStride ;_bggf +=_baebg .RowStride ;};};if _abgb {for _acegd =0;_acegd < _ffdce ;_acegd ++{_bedaf =_baebg .Data [_bgfce ]<<_cccga ;
|
|
if _bfdd {_bedaf =_cgadc (_bedaf ,_baebg .Data [_bgfce +1]>>_aace ,_bbbf );};_fcbe .Data [_adeg ]=_cgadc (_fcbe .Data [_adeg ],^_bedaf ,_ffed );_adeg +=_fcbe .RowStride ;_bgfce +=_baebg .RowStride ;};};case PixSrcOrDst :if _fcff {for _acegd =0;_acegd < _ffdce ;
|
|
_acegd ++{if _faba ==_gbff {_bedaf =_baebg .Data [_bfbd ]<<_cccga ;if _fba {_bedaf =_cgadc (_bedaf ,_baebg .Data [_bfbd +1]>>_aace ,_bbbf );};}else {_bedaf =_baebg .Data [_bfbd ]>>_aace ;};_fcbe .Data [_badfb ]=_cgadc (_fcbe .Data [_badfb ],_bedaf |_fcbe .Data [_badfb ],_bcfac );
|
|
_badfb +=_fcbe .RowStride ;_bfbd +=_baebg .RowStride ;};};if _ggea {for _acegd =0;_acegd < _ffdce ;_acegd ++{for _geea =0;_geea < _dbfgc ;_geea ++{_bedaf =_cgadc (_baebg .Data [_bggf +_geea ]<<_cccga ,_baebg .Data [_bggf +_geea +1]>>_aace ,_bbbf );_fcbe .Data [_efgge +_geea ]|=_bedaf ;
|
|
};_efgge +=_fcbe .RowStride ;_bggf +=_baebg .RowStride ;};};if _abgb {for _acegd =0;_acegd < _ffdce ;_acegd ++{_bedaf =_baebg .Data [_bgfce ]<<_cccga ;if _bfdd {_bedaf =_cgadc (_bedaf ,_baebg .Data [_bgfce +1]>>_aace ,_bbbf );};_fcbe .Data [_adeg ]=_cgadc (_fcbe .Data [_adeg ],_bedaf |_fcbe .Data [_adeg ],_ffed );
|
|
_adeg +=_fcbe .RowStride ;_bgfce +=_baebg .RowStride ;};};case PixSrcAndDst :if _fcff {for _acegd =0;_acegd < _ffdce ;_acegd ++{if _faba ==_gbff {_bedaf =_baebg .Data [_bfbd ]<<_cccga ;if _fba {_bedaf =_cgadc (_bedaf ,_baebg .Data [_bfbd +1]>>_aace ,_bbbf );
|
|
};}else {_bedaf =_baebg .Data [_bfbd ]>>_aace ;};_fcbe .Data [_badfb ]=_cgadc (_fcbe .Data [_badfb ],_bedaf &_fcbe .Data [_badfb ],_bcfac );_badfb +=_fcbe .RowStride ;_bfbd +=_baebg .RowStride ;};};if _ggea {for _acegd =0;_acegd < _ffdce ;_acegd ++{for _geea =0;
|
|
_geea < _dbfgc ;_geea ++{_bedaf =_cgadc (_baebg .Data [_bggf +_geea ]<<_cccga ,_baebg .Data [_bggf +_geea +1]>>_aace ,_bbbf );_fcbe .Data [_efgge +_geea ]&=_bedaf ;};_efgge +=_fcbe .RowStride ;_bggf +=_baebg .RowStride ;};};if _abgb {for _acegd =0;_acegd < _ffdce ;
|
|
_acegd ++{_bedaf =_baebg .Data [_bgfce ]<<_cccga ;if _bfdd {_bedaf =_cgadc (_bedaf ,_baebg .Data [_bgfce +1]>>_aace ,_bbbf );};_fcbe .Data [_adeg ]=_cgadc (_fcbe .Data [_adeg ],_bedaf &_fcbe .Data [_adeg ],_ffed );_adeg +=_fcbe .RowStride ;_bgfce +=_baebg .RowStride ;
|
|
};};case PixSrcXorDst :if _fcff {for _acegd =0;_acegd < _ffdce ;_acegd ++{if _faba ==_gbff {_bedaf =_baebg .Data [_bfbd ]<<_cccga ;if _fba {_bedaf =_cgadc (_bedaf ,_baebg .Data [_bfbd +1]>>_aace ,_bbbf );};}else {_bedaf =_baebg .Data [_bfbd ]>>_aace ;};
|
|
_fcbe .Data [_badfb ]=_cgadc (_fcbe .Data [_badfb ],_bedaf ^_fcbe .Data [_badfb ],_bcfac );_badfb +=_fcbe .RowStride ;_bfbd +=_baebg .RowStride ;};};if _ggea {for _acegd =0;_acegd < _ffdce ;_acegd ++{for _geea =0;_geea < _dbfgc ;_geea ++{_bedaf =_cgadc (_baebg .Data [_bggf +_geea ]<<_cccga ,_baebg .Data [_bggf +_geea +1]>>_aace ,_bbbf );
|
|
_fcbe .Data [_efgge +_geea ]^=_bedaf ;};_efgge +=_fcbe .RowStride ;_bggf +=_baebg .RowStride ;};};if _abgb {for _acegd =0;_acegd < _ffdce ;_acegd ++{_bedaf =_baebg .Data [_bgfce ]<<_cccga ;if _bfdd {_bedaf =_cgadc (_bedaf ,_baebg .Data [_bgfce +1]>>_aace ,_bbbf );
|
|
};_fcbe .Data [_adeg ]=_cgadc (_fcbe .Data [_adeg ],_bedaf ^_fcbe .Data [_adeg ],_ffed );_adeg +=_fcbe .RowStride ;_bgfce +=_baebg .RowStride ;};};case PixNotSrcOrDst :if _fcff {for _acegd =0;_acegd < _ffdce ;_acegd ++{if _faba ==_gbff {_bedaf =_baebg .Data [_bfbd ]<<_cccga ;
|
|
if _fba {_bedaf =_cgadc (_bedaf ,_baebg .Data [_bfbd +1]>>_aace ,_bbbf );};}else {_bedaf =_baebg .Data [_bfbd ]>>_aace ;};_fcbe .Data [_badfb ]=_cgadc (_fcbe .Data [_badfb ],^_bedaf |_fcbe .Data [_badfb ],_bcfac );_badfb +=_fcbe .RowStride ;_bfbd +=_baebg .RowStride ;
|
|
};};if _ggea {for _acegd =0;_acegd < _ffdce ;_acegd ++{for _geea =0;_geea < _dbfgc ;_geea ++{_bedaf =_cgadc (_baebg .Data [_bggf +_geea ]<<_cccga ,_baebg .Data [_bggf +_geea +1]>>_aace ,_bbbf );_fcbe .Data [_efgge +_geea ]|=^_bedaf ;};_efgge +=_fcbe .RowStride ;
|
|
_bggf +=_baebg .RowStride ;};};if _abgb {for _acegd =0;_acegd < _ffdce ;_acegd ++{_bedaf =_baebg .Data [_bgfce ]<<_cccga ;if _bfdd {_bedaf =_cgadc (_bedaf ,_baebg .Data [_bgfce +1]>>_aace ,_bbbf );};_fcbe .Data [_adeg ]=_cgadc (_fcbe .Data [_adeg ],^_bedaf |_fcbe .Data [_adeg ],_ffed );
|
|
_adeg +=_fcbe .RowStride ;_bgfce +=_baebg .RowStride ;};};case PixNotSrcAndDst :if _fcff {for _acegd =0;_acegd < _ffdce ;_acegd ++{if _faba ==_gbff {_bedaf =_baebg .Data [_bfbd ]<<_cccga ;if _fba {_bedaf =_cgadc (_bedaf ,_baebg .Data [_bfbd +1]>>_aace ,_bbbf );
|
|
};}else {_bedaf =_baebg .Data [_bfbd ]>>_aace ;};_fcbe .Data [_badfb ]=_cgadc (_fcbe .Data [_badfb ],^_bedaf &_fcbe .Data [_badfb ],_bcfac );_badfb +=_fcbe .RowStride ;_bfbd +=_baebg .RowStride ;};};if _ggea {for _acegd =0;_acegd < _ffdce ;_acegd ++{for _geea =0;
|
|
_geea < _dbfgc ;_geea ++{_bedaf =_cgadc (_baebg .Data [_bggf +_geea ]<<_cccga ,_baebg .Data [_bggf +_geea +1]>>_aace ,_bbbf );_fcbe .Data [_efgge +_geea ]&=^_bedaf ;};_efgge +=_fcbe .RowStride ;_bggf +=_baebg .RowStride ;};};if _abgb {for _acegd =0;_acegd < _ffdce ;
|
|
_acegd ++{_bedaf =_baebg .Data [_bgfce ]<<_cccga ;if _bfdd {_bedaf =_cgadc (_bedaf ,_baebg .Data [_bgfce +1]>>_aace ,_bbbf );};_fcbe .Data [_adeg ]=_cgadc (_fcbe .Data [_adeg ],^_bedaf &_fcbe .Data [_adeg ],_ffed );_adeg +=_fcbe .RowStride ;_bgfce +=_baebg .RowStride ;
|
|
};};case PixSrcOrNotDst :if _fcff {for _acegd =0;_acegd < _ffdce ;_acegd ++{if _faba ==_gbff {_bedaf =_baebg .Data [_bfbd ]<<_cccga ;if _fba {_bedaf =_cgadc (_bedaf ,_baebg .Data [_bfbd +1]>>_aace ,_bbbf );};}else {_bedaf =_baebg .Data [_bfbd ]>>_aace ;
|
|
};_fcbe .Data [_badfb ]=_cgadc (_fcbe .Data [_badfb ],_bedaf |^_fcbe .Data [_badfb ],_bcfac );_badfb +=_fcbe .RowStride ;_bfbd +=_baebg .RowStride ;};};if _ggea {for _acegd =0;_acegd < _ffdce ;_acegd ++{for _geea =0;_geea < _dbfgc ;_geea ++{_bedaf =_cgadc (_baebg .Data [_bggf +_geea ]<<_cccga ,_baebg .Data [_bggf +_geea +1]>>_aace ,_bbbf );
|
|
_fcbe .Data [_efgge +_geea ]=_bedaf |^_fcbe .Data [_efgge +_geea ];};_efgge +=_fcbe .RowStride ;_bggf +=_baebg .RowStride ;};};if _abgb {for _acegd =0;_acegd < _ffdce ;_acegd ++{_bedaf =_baebg .Data [_bgfce ]<<_cccga ;if _bfdd {_bedaf =_cgadc (_bedaf ,_baebg .Data [_bgfce +1]>>_aace ,_bbbf );
|
|
};_fcbe .Data [_adeg ]=_cgadc (_fcbe .Data [_adeg ],_bedaf |^_fcbe .Data [_adeg ],_ffed );_adeg +=_fcbe .RowStride ;_bgfce +=_baebg .RowStride ;};};case PixSrcAndNotDst :if _fcff {for _acegd =0;_acegd < _ffdce ;_acegd ++{if _faba ==_gbff {_bedaf =_baebg .Data [_bfbd ]<<_cccga ;
|
|
if _fba {_bedaf =_cgadc (_bedaf ,_baebg .Data [_bfbd +1]>>_aace ,_bbbf );};}else {_bedaf =_baebg .Data [_bfbd ]>>_aace ;};_fcbe .Data [_badfb ]=_cgadc (_fcbe .Data [_badfb ],_bedaf &^_fcbe .Data [_badfb ],_bcfac );_badfb +=_fcbe .RowStride ;_bfbd +=_baebg .RowStride ;
|
|
};};if _ggea {for _acegd =0;_acegd < _ffdce ;_acegd ++{for _geea =0;_geea < _dbfgc ;_geea ++{_bedaf =_cgadc (_baebg .Data [_bggf +_geea ]<<_cccga ,_baebg .Data [_bggf +_geea +1]>>_aace ,_bbbf );_fcbe .Data [_efgge +_geea ]=_bedaf &^_fcbe .Data [_efgge +_geea ];
|
|
};_efgge +=_fcbe .RowStride ;_bggf +=_baebg .RowStride ;};};if _abgb {for _acegd =0;_acegd < _ffdce ;_acegd ++{_bedaf =_baebg .Data [_bgfce ]<<_cccga ;if _bfdd {_bedaf =_cgadc (_bedaf ,_baebg .Data [_bgfce +1]>>_aace ,_bbbf );};_fcbe .Data [_adeg ]=_cgadc (_fcbe .Data [_adeg ],_bedaf &^_fcbe .Data [_adeg ],_ffed );
|
|
_adeg +=_fcbe .RowStride ;_bgfce +=_baebg .RowStride ;};};case PixNotPixSrcOrDst :if _fcff {for _acegd =0;_acegd < _ffdce ;_acegd ++{if _faba ==_gbff {_bedaf =_baebg .Data [_bfbd ]<<_cccga ;if _fba {_bedaf =_cgadc (_bedaf ,_baebg .Data [_bfbd +1]>>_aace ,_bbbf );
|
|
};}else {_bedaf =_baebg .Data [_bfbd ]>>_aace ;};_fcbe .Data [_badfb ]=_cgadc (_fcbe .Data [_badfb ],^(_bedaf |_fcbe .Data [_badfb ]),_bcfac );_badfb +=_fcbe .RowStride ;_bfbd +=_baebg .RowStride ;};};if _ggea {for _acegd =0;_acegd < _ffdce ;_acegd ++{for _geea =0;
|
|
_geea < _dbfgc ;_geea ++{_bedaf =_cgadc (_baebg .Data [_bggf +_geea ]<<_cccga ,_baebg .Data [_bggf +_geea +1]>>_aace ,_bbbf );_fcbe .Data [_efgge +_geea ]=^(_bedaf |_fcbe .Data [_efgge +_geea ]);};_efgge +=_fcbe .RowStride ;_bggf +=_baebg .RowStride ;};
|
|
};if _abgb {for _acegd =0;_acegd < _ffdce ;_acegd ++{_bedaf =_baebg .Data [_bgfce ]<<_cccga ;if _bfdd {_bedaf =_cgadc (_bedaf ,_baebg .Data [_bgfce +1]>>_aace ,_bbbf );};_fcbe .Data [_adeg ]=_cgadc (_fcbe .Data [_adeg ],^(_bedaf |_fcbe .Data [_adeg ]),_ffed );
|
|
_adeg +=_fcbe .RowStride ;_bgfce +=_baebg .RowStride ;};};case PixNotPixSrcAndDst :if _fcff {for _acegd =0;_acegd < _ffdce ;_acegd ++{if _faba ==_gbff {_bedaf =_baebg .Data [_bfbd ]<<_cccga ;if _fba {_bedaf =_cgadc (_bedaf ,_baebg .Data [_bfbd +1]>>_aace ,_bbbf );
|
|
};}else {_bedaf =_baebg .Data [_bfbd ]>>_aace ;};_fcbe .Data [_badfb ]=_cgadc (_fcbe .Data [_badfb ],^(_bedaf &_fcbe .Data [_badfb ]),_bcfac );_badfb +=_fcbe .RowStride ;_bfbd +=_baebg .RowStride ;};};if _ggea {for _acegd =0;_acegd < _ffdce ;_acegd ++{for _geea =0;
|
|
_geea < _dbfgc ;_geea ++{_bedaf =_cgadc (_baebg .Data [_bggf +_geea ]<<_cccga ,_baebg .Data [_bggf +_geea +1]>>_aace ,_bbbf );_fcbe .Data [_efgge +_geea ]=^(_bedaf &_fcbe .Data [_efgge +_geea ]);};_efgge +=_fcbe .RowStride ;_bggf +=_baebg .RowStride ;};
|
|
};if _abgb {for _acegd =0;_acegd < _ffdce ;_acegd ++{_bedaf =_baebg .Data [_bgfce ]<<_cccga ;if _bfdd {_bedaf =_cgadc (_bedaf ,_baebg .Data [_bgfce +1]>>_aace ,_bbbf );};_fcbe .Data [_adeg ]=_cgadc (_fcbe .Data [_adeg ],^(_bedaf &_fcbe .Data [_adeg ]),_ffed );
|
|
_adeg +=_fcbe .RowStride ;_bgfce +=_baebg .RowStride ;};};case PixNotPixSrcXorDst :if _fcff {for _acegd =0;_acegd < _ffdce ;_acegd ++{if _faba ==_gbff {_bedaf =_baebg .Data [_bfbd ]<<_cccga ;if _fba {_bedaf =_cgadc (_bedaf ,_baebg .Data [_bfbd +1]>>_aace ,_bbbf );
|
|
};}else {_bedaf =_baebg .Data [_bfbd ]>>_aace ;};_fcbe .Data [_badfb ]=_cgadc (_fcbe .Data [_badfb ],^(_bedaf ^_fcbe .Data [_badfb ]),_bcfac );_badfb +=_fcbe .RowStride ;_bfbd +=_baebg .RowStride ;};};if _ggea {for _acegd =0;_acegd < _ffdce ;_acegd ++{for _geea =0;
|
|
_geea < _dbfgc ;_geea ++{_bedaf =_cgadc (_baebg .Data [_bggf +_geea ]<<_cccga ,_baebg .Data [_bggf +_geea +1]>>_aace ,_bbbf );_fcbe .Data [_efgge +_geea ]=^(_bedaf ^_fcbe .Data [_efgge +_geea ]);};_efgge +=_fcbe .RowStride ;_bggf +=_baebg .RowStride ;};
|
|
};if _abgb {for _acegd =0;_acegd < _ffdce ;_acegd ++{_bedaf =_baebg .Data [_bgfce ]<<_cccga ;if _bfdd {_bedaf =_cgadc (_bedaf ,_baebg .Data [_bgfce +1]>>_aace ,_bbbf );};_fcbe .Data [_adeg ]=_cgadc (_fcbe .Data [_adeg ],^(_bedaf ^_fcbe .Data [_adeg ]),_ffed );
|
|
_adeg +=_fcbe .RowStride ;_bgfce +=_baebg .RowStride ;};};default:_cee .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",_ege );
|
|
return _a .Error ("\u0072a\u0073t\u0065\u0072\u004f\u0070\u0047e\u006e\u0065r\u0061\u006c\u004c\u006f\u0077","\u0072\u0061\u0073\u0074\u0065\u0072\u0020\u006f\u0070\u0065r\u0061\u0074\u0069\u006f\u006e\u0020\u006eo\u0074\u0020\u0070\u0065\u0072\u006d\u0069\u0074\u0074\u0065\u0064");
|
|
};return nil ;};func _faae (_dfac ,_afef ,_eadab *Bitmap ,_fgfca int )(*Bitmap ,error ){const _fbgdf ="\u0073\u0065\u0065\u0064\u0046\u0069\u006c\u006c\u0042i\u006e\u0061\u0072\u0079";if _afef ==nil {return nil ,_a .Error (_fbgdf ,"s\u006fu\u0072\u0063\u0065\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");
|
|
};if _eadab ==nil {return nil ,_a .Error (_fbgdf ,"'\u006da\u0073\u006b\u0027\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");};if _fgfca !=4&&_fgfca !=8{return nil ,_a .Error (_fbgdf ,"\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 _eadg error ;_dfac ,_eadg =_abdb (_dfac ,_afef );if _eadg !=nil {return nil ,_a .Wrap (_eadg ,_fbgdf ,"\u0063o\u0070y\u0020\u0073\u006f\u0075\u0072c\u0065\u0020t\u006f\u0020\u0027\u0064\u0027");};_ggbb :=_afef .createTemplate ();_eadab .setPadBits (0);
|
|
for _eddb :=0;_eddb < _dcdff ;_eddb ++{_ggbb ,_eadg =_abdb (_ggbb ,_dfac );if _eadg !=nil {return nil ,_a .Wrapf (_eadg ,_fbgdf ,"\u0069\u0074\u0065\u0072\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0064",_eddb );};if _eadg =_cfgcc (_dfac ,_eadab ,_fgfca );
|
|
_eadg !=nil {return nil ,_a .Wrapf (_eadg ,_fbgdf ,"\u0069\u0074\u0065\u0072\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0064",_eddb );};if _ggbb .Equals (_dfac ){break ;};};return _dfac ,nil ;};func TstVSymbol (t *_f .T ,scale ...int )*Bitmap {_fbgb ,_aeca :=NewWithData (5,5,[]byte {0x88,0x88,0x88,0x50,0x20});
|
|
_ca .NoError (t ,_aeca );return TstGetScaledSymbol (t ,_fbgb ,scale ...);};type Point struct{X ,Y float32 ;};func (_ebaa *Bitmap )equivalent (_cge *Bitmap )bool {if _ebaa ==_cge {return true ;};if !_ebaa .SizesEqual (_cge ){return false ;};_cegd :=_dffg (_ebaa ,_cge ,CmbOpXor );
|
|
_bebd :=_ebaa .countPixels ();_dfa :=int (0.25*float32 (_bebd ));if _cegd .thresholdPixelSum (_dfa ){return false ;};var (_dcbc [9][9]int ;_ced [18][9]int ;_baga [9][18]int ;_dfg int ;_eagc int ;);_dbc :=9;_gdg :=_ebaa .Height /_dbc ;_agb :=_ebaa .Width /_dbc ;
|
|
_agf ,_cedc :=_gdg /2,_agb /2;if _gdg < _agb {_agf =_agb /2;_cedc =_gdg /2;};_fage :=float64 (_agf )*float64 (_cedc )*_bb .Pi ;_ebfc :=int (float64 (_gdg *_agb /2)*0.9);_ggfg :=int (float64 (_agb *_gdg /2)*0.9);for _baf :=0;_baf < _dbc ;_baf ++{_ebd :=_agb *_baf +_dfg ;
|
|
var _cdfd int ;if _baf ==_dbc -1{_dfg =0;_cdfd =_ebaa .Width ;}else {_cdfd =_ebd +_agb ;if ((_ebaa .Width -_dfg )%_dbc )> 0{_dfg ++;_cdfd ++;};};for _bbcb :=0;_bbcb < _dbc ;_bbcb ++{_gdf :=_gdg *_bbcb +_eagc ;var _gfa int ;if _bbcb ==_dbc -1{_eagc =0;_gfa =_ebaa .Height ;
|
|
}else {_gfa =_gdf +_gdg ;if (_ebaa .Height -_eagc )%_dbc > 0{_eagc ++;_gfa ++;};};var _gecd ,_fdba ,_fagea ,_dggg int ;_gae :=(_ebd +_cdfd )/2;_gda :=(_gdf +_gfa )/2;for _acgb :=_ebd ;_acgb < _cdfd ;_acgb ++{for _gac :=_gdf ;_gac < _gfa ;_gac ++{if _cegd .GetPixel (_acgb ,_gac ){if _acgb < _gae {_gecd ++;
|
|
}else {_fdba ++;};if _gac < _gda {_dggg ++;}else {_fagea ++;};};};};_dcbc [_baf ][_bbcb ]=_gecd +_fdba ;_ced [_baf *2][_bbcb ]=_gecd ;_ced [_baf *2+1][_bbcb ]=_fdba ;_baga [_baf ][_bbcb *2]=_dggg ;_baga [_baf ][_bbcb *2+1]=_fagea ;};};for _daea :=0;_daea < _dbc *2-1;
|
|
_daea ++{for _efda :=0;_efda < (_dbc -1);_efda ++{var _fefg int ;for _cgb :=0;_cgb < 2;_cgb ++{for _agc :=0;_agc < 2;_agc ++{_fefg +=_ced [_daea +_cgb ][_efda +_agc ];};};if _fefg > _ggfg {return false ;};};};for _ccdc :=0;_ccdc < (_dbc -1);_ccdc ++{for _ada :=0;
|
|
_ada < ((_dbc *2)-1);_ada ++{var _ccaa int ;for _aec :=0;_aec < 2;_aec ++{for _cecd :=0;_cecd < 2;_cecd ++{_ccaa +=_baga [_ccdc +_aec ][_ada +_cecd ];};};if _ccaa > _ebfc {return false ;};};};for _gdb :=0;_gdb < (_dbc -2);_gdb ++{for _aaaa :=0;_aaaa < (_dbc -2);
|
|
_aaaa ++{var _daed ,_bdf int ;for _eafc :=0;_eafc < 3;_eafc ++{for _gcdf :=0;_gcdf < 3;_gcdf ++{if _eafc ==_gcdf {_daed +=_dcbc [_gdb +_eafc ][_aaaa +_gcdf ];};if (2-_eafc )==_gcdf {_bdf +=_dcbc [_gdb +_eafc ][_aaaa +_gcdf ];};};};if _daed > _ggfg ||_bdf > _ggfg {return false ;
|
|
};};};for _afca :=0;_afca < (_dbc -1);_afca ++{for _gffg :=0;_gffg < (_dbc -1);_gffg ++{var _gaeg int ;for _eec :=0;_eec < 2;_eec ++{for _fdf :=0;_fdf < 2;_fdf ++{_gaeg +=_dcbc [_afca +_eec ][_gffg +_fdf ];};};if float64 (_gaeg )> _fage {return false ;
|
|
};};};return true ;};const (SelDontCare SelectionValue =iota ;SelHit ;SelMiss ;);func (_gacb *ClassedPoints )Less (i ,j int )bool {return _gacb ._gacc (i ,j )};func _fefe (_dfce ,_ebcfa *Bitmap ,_ddea ,_bded int )(*Bitmap ,error ){const _cbdf ="\u0065\u0072\u006f\u0064\u0065\u0042\u0072\u0069\u0063\u006b";
|
|
if _ebcfa ==nil {return nil ,_a .Error (_cbdf ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _ddea < 1||_bded < 1{return nil ,_a .Error (_cbdf ,"\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 _ddea ==1&&_bded ==1{_dceae ,_ggeba :=_abdb (_dfce ,_ebcfa );if _ggeba !=nil {return nil ,_a .Wrap (_ggeba ,_cbdf ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u0026\u0026 \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _dceae ,nil ;};if _ddea ==1||_bded ==1{_gdbb :=SelCreateBrick (_bded ,_ddea ,_bded /2,_ddea /2,SelHit );_ddef ,_afcfd :=_cedcad (_dfce ,_ebcfa ,_gdbb );if _afcfd !=nil {return nil ,_a .Wrap (_afcfd ,_cbdf ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _ddef ,nil ;};_aac :=SelCreateBrick (1,_ddea ,0,_ddea /2,SelHit );_bece :=SelCreateBrick (_bded ,1,_bded /2,0,SelHit );_bcee ,_dfdb :=_cedcad (nil ,_ebcfa ,_aac );if _dfdb !=nil {return nil ,_a .Wrap (_dfdb ,_cbdf ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");
|
|
};_dfce ,_dfdb =_cedcad (_dfce ,_bcee ,_bece );if _dfdb !=nil {return nil ,_a .Wrap (_dfdb ,_cbdf ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};return _dfce ,nil ;};func (_fbdc *Bitmap )And (s *Bitmap )(_edg *Bitmap ,_feba error ){const _aeee ="\u0042\u0069\u0074\u006d\u0061\u0070\u002e\u0041\u006e\u0064";
|
|
if _fbdc ==nil {return nil ,_a .Error (_aeee ,"\u0027b\u0069t\u006d\u0061\u0070\u0020\u0027b\u0027\u0020i\u0073\u0020\u006e\u0069\u006c");};if s ==nil {return nil ,_a .Error (_aeee ,"\u0062\u0069\u0074\u006d\u0061\u0070\u0020\u0027\u0073\u0027\u0020\u0069s\u0020\u006e\u0069\u006c");
|
|
};if !_fbdc .SizesEqual (s ){_cee .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",_aeee );
|
|
};if _edg ,_feba =_abdb (_edg ,_fbdc );_feba !=nil {return nil ,_a .Wrap (_feba ,_aeee ,"\u0063\u0061\u006e't\u0020\u0063\u0072\u0065\u0061\u0074\u0065\u0020\u0027\u0064\u0027\u0020\u0062\u0069\u0074\u006d\u0061\u0070");};if _feba =_edg .RasterOperation (0,0,_edg .Width ,_edg .Height ,PixSrcAndDst ,s ,0,0);
|
|
_feba !=nil {return nil ,_a .Wrap (_feba ,_aeee ,"");};return _edg ,nil ;};func Rect (x ,y ,w ,h int )(*_de .Rectangle ,error ){const _ffab ="b\u0069\u0074\u006d\u0061\u0070\u002e\u0052\u0065\u0063\u0074";if x < 0{w +=x ;x =0;if w <=0{return nil ,_a .Errorf (_ffab ,"x\u003a\u0027\u0025\u0064\u0027\u0020<\u0020\u0030\u0020\u0061\u006e\u0064\u0020\u0077\u003a \u0027\u0025\u0064'\u0020<\u003d\u0020\u0030",x ,w );
|
|
};};if y < 0{h +=y ;y =0;if h <=0{return nil ,_a .Error (_ffab ,"\u0079\u0020\u003c 0\u0020\u0061\u006e\u0064\u0020\u0062\u006f\u0078\u0020\u006f\u0066\u0066\u0020\u002b\u0071\u0075\u0061\u0064");};};_bgga :=_de .Rect (x ,y ,x +w ,y +h );return &_bgga ,nil ;
|
|
};func _dfca (_fdge *Bitmap )(_bffg *Bitmap ,_ccage int ,_dbgbd error ){const _gdeda ="\u0042i\u0074\u006d\u0061\u0070.\u0077\u006f\u0072\u0064\u004da\u0073k\u0042y\u0044\u0069\u006c\u0061\u0074\u0069\u006fn";if _fdge ==nil {return nil ,0,_a .Errorf (_gdeda ,"\u0027\u0073\u0027\u0020bi\u0074\u006d\u0061\u0070\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006ee\u0064");
|
|
};var _dacd ,_bbgc *Bitmap ;if _dacd ,_dbgbd =_abdb (nil ,_fdge );_dbgbd !=nil {return nil ,0,_a .Wrap (_dbgbd ,_gdeda ,"\u0063\u006f\u0070\u0079\u0020\u0027\u0073\u0027");};var (_efae [13]int ;_acgf ,_feeff int ;);_bcgb :=12;_ddfe :=_ce .NewNumSlice (_bcgb +1);
|
|
_cdca :=_ce .NewNumSlice (_bcgb +1);var _dcbb *Boxes ;for _efde :=0;_efde <=_bcgb ;_efde ++{if _efde ==0{if _bbgc ,_dbgbd =_abdb (nil ,_dacd );_dbgbd !=nil {return nil ,0,_a .Wrap (_dbgbd ,_gdeda ,"\u0066i\u0072\u0073\u0074\u0020\u0062\u006d2");};}else {if _bbgc ,_dbgbd =_dadc (_dacd ,MorphProcess {Operation :MopDilation ,Arguments :[]int {2,1}});
|
|
_dbgbd !=nil {return nil ,0,_a .Wrap (_dbgbd ,_gdeda ,"\u0064\u0069\u006ca\u0074\u0069\u006f\u006e\u0020\u0062\u006d\u0032");};};if _dcbb ,_dbgbd =_bbgc .connComponentsBB (4);_dbgbd !=nil {return nil ,0,_a .Wrap (_dbgbd ,_gdeda ,"");};_efae [_efde ]=len (*_dcbb );
|
|
_ddfe .AddInt (_efae [_efde ]);switch _efde {case 0:_acgf =_efae [0];default:_feeff =_efae [_efde -1]-_efae [_efde ];_cdca .AddInt (_feeff );};_dacd =_bbgc ;};_fcgb :=true ;_aefd :=2;var _fdfg ,_acbf int ;for _cgba :=1;_cgba < len (*_cdca );_cgba ++{if _fdfg ,_dbgbd =_ddfe .GetInt (_cgba );
|
|
_dbgbd !=nil {return nil ,0,_a .Wrap (_dbgbd ,_gdeda ,"\u0043\u0068\u0065\u0063ki\u006e\u0067\u0020\u0062\u0065\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0069o\u006e");};if _fcgb &&_fdfg < int (0.3*float32 (_acgf )){_aefd =_cgba +1;_fcgb =false ;
|
|
};if _feeff ,_dbgbd =_cdca .GetInt (_cgba );_dbgbd !=nil {return nil ,0,_a .Wrap (_dbgbd ,_gdeda ,"\u0067\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u006ea\u0044\u0069\u0066\u0066");};if _feeff > _acbf {_acbf =_feeff ;};};_bgef :=_fdge .XResolution ;if _bgef ==0{_bgef =150;
|
|
};if _bgef > 110{_aefd ++;};if _aefd < 2{_cee .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");
|
|
_aefd =2;};_ccage =_aefd +1;if _bffg ,_dbgbd =_bbcc (nil ,_fdge ,_aefd +1,1);_dbgbd !=nil {return nil ,0,_a .Wrap (_dbgbd ,_gdeda ,"\u0067\u0065\u0074\u0074in\u0067\u0020\u006d\u0061\u0073\u006b\u0020\u0066\u0061\u0069\u006c\u0065\u0064");};return _bffg ,_ccage ,nil ;
|
|
};func SelCreateBrick (h ,w int ,cy ,cx int ,tp SelectionValue )*Selection {_bgbd :=_agcb (h ,w ,"");_bgbd .setOrigin (cy ,cx );var _edgf ,_dceaa int ;for _edgf =0;_edgf < h ;_edgf ++{for _dceaa =0;_dceaa < w ;_dceaa ++{_bgbd .Data [_edgf ][_dceaa ]=tp ;
|
|
};};return _bgbd ;};func _adbac ()[]int {_fbfa :=make ([]int ,256);for _cadc :=0;_cadc <=0xff;_cadc ++{_cgea :=byte (_cadc );_fbfa [_cgea ]=int (_cgea &0x1)+(int (_cgea >>1)&0x1)+(int (_cgea >>2)&0x1)+(int (_cgea >>3)&0x1)+(int (_cgea >>4)&0x1)+(int (_cgea >>5)&0x1)+(int (_cgea >>6)&0x1)+(int (_cgea >>7)&0x1);
|
|
};return _fbfa ;};func _bbfdd (_bbga *Bitmap ,_cfe *Bitmap ,_dacc *Selection ,_fgcf **Bitmap )(*Bitmap ,error ){const _agbf ="\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u004d\u006f\u0072\u0070\u0068A\u0072\u0067\u0073\u0031";if _cfe ==nil {return nil ,_a .Error (_agbf ,"\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 _dacc ==nil {return nil ,_a .Error (_agbf ,"\u004d\u006f\u0072\u0068p\u0041\u0072\u0067\u0073\u0031\u0020\u0027\u0073\u0065\u006c'\u0020n\u006f\u0074\u0020\u0064\u0065\u0066\u0069n\u0065\u0064");};_caac ,_bcad :=_dacc .Height ,_dacc .Width ;if _caac ==0||_bcad ==0{return nil ,_a .Error (_agbf ,"\u0073\u0065\u006c\u0065ct\u0069\u006f\u006e\u0020\u006f\u0066\u0020\u0073\u0069\u007a\u0065\u0020\u0030");
|
|
};if _bbga ==nil {_bbga =_cfe .createTemplate ();*_fgcf =_cfe ;return _bbga ,nil ;};_bbga .Width =_cfe .Width ;_bbga .Height =_cfe .Height ;_bbga .RowStride =_cfe .RowStride ;_bbga .Color =_cfe .Color ;_bbga .Data =make ([]byte ,_cfe .RowStride *_cfe .Height );
|
|
if _bbga ==_cfe {*_fgcf =_cfe .Copy ();}else {*_fgcf =_cfe ;};return _bbga ,nil ;};func _cedcad (_dccd ,_gfed *Bitmap ,_cacc *Selection )(*Bitmap ,error ){const _daeaa ="\u0065\u0072\u006fd\u0065";var (_efga error ;_aege *Bitmap ;);_dccd ,_efga =_bbfdd (_dccd ,_gfed ,_cacc ,&_aege );
|
|
if _efga !=nil {return nil ,_a .Wrap (_efga ,_daeaa ,"");};if _efga =_dccd .setAll ();_efga !=nil {return nil ,_a .Wrap (_efga ,_daeaa ,"");};var _afba SelectionValue ;for _bdgc :=0;_bdgc < _cacc .Height ;_bdgc ++{for _bgff :=0;_bgff < _cacc .Width ;_bgff ++{_afba =_cacc .Data [_bdgc ][_bgff ];
|
|
if _afba ==SelHit {_efga =_efbg (_dccd ,_cacc .Cx -_bgff ,_cacc .Cy -_bdgc ,_gfed .Width ,_gfed .Height ,PixSrcAndDst ,_aege ,0,0);if _efga !=nil {return nil ,_a .Wrap (_efga ,_daeaa ,"");};};};};if MorphBC ==SymmetricMorphBC {return _dccd ,nil ;};_ffbgb ,_dcdc ,_ecf ,_gba :=_cacc .findMaxTranslations ();
|
|
if _ffbgb > 0{if _efga =_dccd .RasterOperation (0,0,_ffbgb ,_gfed .Height ,PixClr ,nil ,0,0);_efga !=nil {return nil ,_a .Wrap (_efga ,_daeaa ,"\u0078\u0070\u0020\u003e\u0020\u0030");};};if _ecf > 0{if _efga =_dccd .RasterOperation (_gfed .Width -_ecf ,0,_ecf ,_gfed .Height ,PixClr ,nil ,0,0);
|
|
_efga !=nil {return nil ,_a .Wrap (_efga ,_daeaa ,"\u0078\u006e\u0020\u003e\u0020\u0030");};};if _dcdc > 0{if _efga =_dccd .RasterOperation (0,0,_gfed .Width ,_dcdc ,PixClr ,nil ,0,0);_efga !=nil {return nil ,_a .Wrap (_efga ,_daeaa ,"\u0079\u0070\u0020\u003e\u0020\u0030");
|
|
};};if _gba > 0{if _efga =_dccd .RasterOperation (0,_gfed .Height -_gba ,_gfed .Width ,_gba ,PixClr ,nil ,0,0);_efga !=nil {return nil ,_a .Wrap (_efga ,_daeaa ,"\u0079\u006e\u0020\u003e\u0020\u0030");};};return _dccd ,nil ;};func _fdbb (_egfe ,_fadff *Bitmap ,_edgb ,_gdeg int )(_dbdb error ){const _dcgda ="\u0073e\u0065d\u0066\u0069\u006c\u006c\u0042i\u006e\u0061r\u0079\u004c\u006f\u0077\u0038";
|
|
var (_cccdf ,_cdffb ,_cgdd ,_ffcc int ;_bagg ,_daaf ,_dcbe ,_fdcc ,_agce ,_deeg ,_fadeb ,_bcbef byte ;);for _cccdf =0;_cccdf < _edgb ;_cccdf ++{_cgdd =_cccdf *_egfe .RowStride ;_ffcc =_cccdf *_fadff .RowStride ;for _cdffb =0;_cdffb < _gdeg ;_cdffb ++{if _bagg ,_dbdb =_egfe .GetByte (_cgdd +_cdffb );
|
|
_dbdb !=nil {return _a .Wrap (_dbdb ,_dcgda ,"\u0067e\u0074 \u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0062\u0079\u0074\u0065");};if _daaf ,_dbdb =_fadff .GetByte (_ffcc +_cdffb );_dbdb !=nil {return _a .Wrap (_dbdb ,_dcgda ,"\u0067\u0065\u0074\u0020\u006d\u0061\u0073\u006b\u0020\u0062\u0079\u0074\u0065");
|
|
};if _cccdf > 0{if _dcbe ,_dbdb =_egfe .GetByte (_cgdd -_egfe .RowStride +_cdffb );_dbdb !=nil {return _a .Wrap (_dbdb ,_dcgda ,"\u0069\u0020\u003e\u0020\u0030\u0020\u0062\u0079\u0074\u0065");};_bagg |=_dcbe |(_dcbe <<1)|(_dcbe >>1);if _cdffb > 0{if _bcbef ,_dbdb =_egfe .GetByte (_cgdd -_egfe .RowStride +_cdffb -1);
|
|
_dbdb !=nil {return _a .Wrap (_dbdb ,_dcgda ,"\u0069\u0020\u003e\u00200 \u0026\u0026\u0020\u006a\u0020\u003e\u0020\u0030\u0020\u0062\u0079\u0074\u0065");};_bagg |=_bcbef <<7;};if _cdffb < _gdeg -1{if _bcbef ,_dbdb =_egfe .GetByte (_cgdd -_egfe .RowStride +_cdffb +1);
|
|
_dbdb !=nil {return _a .Wrap (_dbdb ,_dcgda ,"\u006a\u0020<\u0020\u0077\u0070l\u0020\u002d\u0020\u0031\u0020\u0062\u0079\u0074\u0065");};_bagg |=_bcbef >>7;};};if _cdffb > 0{if _fdcc ,_dbdb =_egfe .GetByte (_cgdd +_cdffb -1);_dbdb !=nil {return _a .Wrap (_dbdb ,_dcgda ,"\u006a\u0020\u003e \u0030");
|
|
};_bagg |=_fdcc <<7;};_bagg &=_daaf ;if _bagg ==0||^_bagg ==0{if _dbdb =_egfe .SetByte (_cgdd +_cdffb ,_bagg );_dbdb !=nil {return _a .Wrap (_dbdb ,_dcgda ,"\u0073e\u0074t\u0069\u006e\u0067\u0020\u0065m\u0070\u0074y\u0020\u0062\u0079\u0074\u0065");};};
|
|
for {_fadeb =_bagg ;_bagg =(_bagg |(_bagg >>1)|(_bagg <<1))&_daaf ;if (_bagg ^_fadeb )==0{if _dbdb =_egfe .SetByte (_cgdd +_cdffb ,_bagg );_dbdb !=nil {return _a .Wrap (_dbdb ,_dcgda ,"\u0073\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u0070\u0072\u0065\u0076 \u0062\u0079\u0074\u0065");
|
|
};break ;};};};};for _cccdf =_edgb -1;_cccdf >=0;_cccdf --{_cgdd =_cccdf *_egfe .RowStride ;_ffcc =_cccdf *_fadff .RowStride ;for _cdffb =_gdeg -1;_cdffb >=0;_cdffb --{if _bagg ,_dbdb =_egfe .GetByte (_cgdd +_cdffb );_dbdb !=nil {return _a .Wrap (_dbdb ,_dcgda ,"\u0072\u0065\u0076er\u0073\u0065\u0020\u0067\u0065\u0074\u0020\u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0062\u0079\u0074\u0065");
|
|
};if _daaf ,_dbdb =_fadff .GetByte (_ffcc +_cdffb );_dbdb !=nil {return _a .Wrap (_dbdb ,_dcgda ,"r\u0065\u0076\u0065\u0072se\u0020g\u0065\u0074\u0020\u006d\u0061s\u006b\u0020\u0062\u0079\u0074\u0065");};if _cccdf < _edgb -1{if _agce ,_dbdb =_egfe .GetByte (_cgdd +_egfe .RowStride +_cdffb );
|
|
_dbdb !=nil {return _a .Wrap (_dbdb ,_dcgda ,"\u0069\u0020\u003c\u0020h\u0020\u002d\u0020\u0031\u0020\u002d\u003e\u0020\u0067\u0065t\u0020s\u006f\u0075\u0072\u0063\u0065\u0020\u0062y\u0074\u0065");};_bagg |=_agce |(_agce <<1)|_agce >>1;if _cdffb > 0{if _bcbef ,_dbdb =_egfe .GetByte (_cgdd +_egfe .RowStride +_cdffb -1);
|
|
_dbdb !=nil {return _a .Wrap (_dbdb ,_dcgda ,"\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");};_bagg |=_bcbef <<7;};if _cdffb < _gdeg -1{if _bcbef ,_dbdb =_egfe .GetByte (_cgdd +_egfe .RowStride +_cdffb +1);
|
|
_dbdb !=nil {return _a .Wrap (_dbdb ,_dcgda ,"\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");
|
|
};_bagg |=_bcbef >>7;};};if _cdffb < _gdeg -1{if _deeg ,_dbdb =_egfe .GetByte (_cgdd +_cdffb +1);_dbdb !=nil {return _a .Wrap (_dbdb ,_dcgda ,"\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");
|
|
};_bagg |=_deeg >>7;};_bagg &=_daaf ;if _bagg ==0||(^_bagg )==0{if _dbdb =_egfe .SetByte (_cgdd +_cdffb ,_bagg );_dbdb !=nil {return _a .Wrap (_dbdb ,_dcgda ,"\u0073e\u0074 \u006d\u0061\u0073\u006b\u0065\u0064\u0020\u0062\u0079\u0074\u0065");};};for {_fadeb =_bagg ;
|
|
_bagg =(_bagg |(_bagg >>1)|(_bagg <<1))&_daaf ;if (_bagg ^_fadeb )==0{if _dbdb =_egfe .SetByte (_cgdd +_cdffb ,_bagg );_dbdb !=nil {return _a .Wrap (_dbdb ,_dcgda ,"r\u0065\u0076\u0065\u0072se\u0020s\u0065\u0074\u0020\u0070\u0072e\u0076\u0020\u0062\u0079\u0074\u0065");
|
|
};break ;};};};};return nil ;};func (_fdcgc *Bitmaps )selectByIndexes (_cdcad []int )(*Bitmaps ,error ){_feee :=&Bitmaps {};for _ ,_bdde :=range _cdcad {_fbca ,_acfce :=_fdcgc .GetBitmap (_bdde );if _acfce !=nil {return nil ,_a .Wrap (_acfce ,"\u0073e\u006ce\u0063\u0074\u0042\u0079\u0049\u006e\u0064\u0065\u0078\u0065\u0073","");
|
|
};_feee .AddBitmap (_fbca );};return _feee ,nil ;};func (_abdf *byWidth )Less (i ,j int )bool {return _abdf .Values [i ].Width < _abdf .Values [j ].Width };func (_gde *Bitmap )ToImage ()_de .Image {_fgf ,_fbb :=_b .NewImage (_gde .Width ,_gde .Height ,1,1,_gde .Data ,nil ,nil );
|
|
if _fbb !=nil {_cee .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",_fbb );
|
|
};return _fgf ;};func _ga (_caa ,_bcf *Bitmap ,_ebg int ,_bcagg []byte ,_ee int )(_efd error ){const _cad ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0031";var (_cga ,_bce ,_gdc ,_fdb ,_ec ,_cadf ,_gdd ,_ceff int ;
|
|
_cece ,_eeb uint32 ;_ggfc ,_acb byte ;_ddb uint16 ;);_edd :=make ([]byte ,4);_eff :=make ([]byte ,4);for _gdc =0;_gdc < _caa .Height -1;_gdc ,_fdb =_gdc +2,_fdb +1{_cga =_gdc *_caa .RowStride ;_bce =_fdb *_bcf .RowStride ;for _ec ,_cadf =0,0;_ec < _ee ;
|
|
_ec ,_cadf =_ec +4,_cadf +1{for _gdd =0;_gdd < 4;_gdd ++{_ceff =_cga +_ec +_gdd ;if _ceff <=len (_caa .Data )-1&&_ceff < _cga +_caa .RowStride {_edd [_gdd ]=_caa .Data [_ceff ];}else {_edd [_gdd ]=0x00;};_ceff =_cga +_caa .RowStride +_ec +_gdd ;if _ceff <=len (_caa .Data )-1&&_ceff < _cga +(2*_caa .RowStride ){_eff [_gdd ]=_caa .Data [_ceff ];
|
|
}else {_eff [_gdd ]=0x00;};};_cece =_cf .BigEndian .Uint32 (_edd );_eeb =_cf .BigEndian .Uint32 (_eff );_eeb |=_cece ;_eeb |=_eeb <<1;_eeb &=0xaaaaaaaa;_cece =_eeb |(_eeb <<7);_ggfc =byte (_cece >>24);_acb =byte ((_cece >>8)&0xff);_ceff =_bce +_cadf ;if _ceff +1==len (_bcf .Data )-1||_ceff +1>=_bce +_bcf .RowStride {_bcf .Data [_ceff ]=_bcagg [_ggfc ];
|
|
}else {_ddb =(uint16 (_bcagg [_ggfc ])<<8)|uint16 (_bcagg [_acb ]);if _efd =_bcf .setTwoBytes (_ceff ,_ddb );_efd !=nil {return _a .Wrapf (_efd ,_cad ,"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",_ceff );
|
|
};_cadf ++;};};};return nil ;};func Centroids (bms []*Bitmap )(*Points ,error ){_ebbf :=make ([]Point ,len (bms ));_cgecg :=_beaf ();_cgcc :=_adbac ();var _dcec error ;for _eecf ,_edegg :=range bms {_ebbf [_eecf ],_dcec =_edegg .centroid (_cgecg ,_cgcc );
|
|
if _dcec !=nil {return nil ,_dcec ;};};_gabe :=Points (_ebbf );return &_gabe ,nil ;};func (_deec *ClassedPoints )SortByY (){_deec ._gacc =_deec .ySortFunction ();_ag .Sort (_deec )};func _dg (_bac *Bitmap ,_bee int )(*Bitmap ,error ){const _dae ="\u0065x\u0070a\u006e\u0064\u0042\u0069\u006ea\u0072\u0079P\u006f\u0077\u0065\u0072\u0032";
|
|
if _bac ==nil {return nil ,_a .Error (_dae ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _bee ==1{return _abdb (nil ,_bac );};if _bee !=2&&_bee !=4&&_bee !=8{return nil ,_a .Error (_dae ,"\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");
|
|
};_begf :=_bee *_bac .Width ;_af :=_bee *_bac .Height ;_acg :=New (_begf ,_af );var _bcag error ;switch _bee {case 2:_bcag =_dc (_acg ,_bac );case 4:_bcag =_bc (_acg ,_bac );case 8:_bcag =_daa (_acg ,_bac );};if _bcag !=nil {return nil ,_a .Wrap (_bcag ,_dae ,"");
|
|
};return _acg ,nil ;};func (_efdf *Bitmap )String ()string {var _ccb ="\u000a";for _bddg :=0;_bddg < _efdf .Height ;_bddg ++{var _bbc string ;for _fcd :=0;_fcd < _efdf .Width ;_fcd ++{_aeda :=_efdf .GetPixel (_fcd ,_bddg );if _aeda {_bbc +="\u0031";}else {_bbc +="\u0030";
|
|
};};_ccb +=_bbc +"\u000a";};return _ccb ;};func _bda ()(_dgdf [256]uint64 ){for _bef :=0;_bef < 256;_bef ++{if _bef &0x01!=0{_dgdf [_bef ]|=0xff;};if _bef &0x02!=0{_dgdf [_bef ]|=0xff00;};if _bef &0x04!=0{_dgdf [_bef ]|=0xff0000;};if _bef &0x08!=0{_dgdf [_bef ]|=0xff000000;
|
|
};if _bef &0x10!=0{_dgdf [_bef ]|=0xff00000000;};if _bef &0x20!=0{_dgdf [_bef ]|=0xff0000000000;};if _bef &0x40!=0{_dgdf [_bef ]|=0xff000000000000;};if _bef &0x80!=0{_dgdf [_bef ]|=0xff00000000000000;};};return _dgdf ;};type Getter interface{GetBitmap ()*Bitmap ;
|
|
};func TstWriteSymbols (t *_f .T ,bms *Bitmaps ,src *Bitmap ){for _aage :=0;_aage < bms .Size ();_aage ++{_bedab :=bms .Values [_aage ];_accd :=bms .Boxes [_aage ];_geabf :=src .RasterOperation (_accd .Min .X ,_accd .Min .Y ,_bedab .Width ,_bedab .Height ,PixSrc ,_bedab ,0,0);
|
|
_ca .NoError (t ,_geabf );};};var (_aagcg =[]byte {0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF};_aggd =[]byte {0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};);func TstWordBitmapWithSpaces (t *_f .T ,scale ...int )*Bitmap {_gagg :=1;if len (scale )> 0{_gagg =scale [0];
|
|
};_gega :=3;_addc :=9+7+15+2*_gega +2*_gega ;_cgfg :=5+_gega +5+2*_gega ;_fcag :=New (_addc *_gagg ,_cgfg *_gagg );_bdba :=&Bitmaps {};var _cccf *int ;_gega *=_gagg ;_ebbc :=_gega ;_cccf =&_ebbc ;_deda :=_gega ;_gaggd :=TstDSymbol (t ,scale ...);TstAddSymbol (t ,_bdba ,_gaggd ,_cccf ,_deda ,1*_gagg );
|
|
_gaggd =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_bdba ,_gaggd ,_cccf ,_deda ,_gega );_gaggd =TstISymbol (t ,scale ...);TstAddSymbol (t ,_bdba ,_gaggd ,_cccf ,_deda ,1*_gagg );_gaggd =TstTSymbol (t ,scale ...);TstAddSymbol (t ,_bdba ,_gaggd ,_cccf ,_deda ,_gega );
|
|
_gaggd =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_bdba ,_gaggd ,_cccf ,_deda ,1*_gagg );_gaggd =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_bdba ,_gaggd ,_cccf ,_deda ,1*_gagg );_gaggd =TstWSymbol (t ,scale ...);TstAddSymbol (t ,_bdba ,_gaggd ,_cccf ,_deda ,0);
|
|
*_cccf =_gega ;_deda =5*_gagg +_gega ;_gaggd =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_bdba ,_gaggd ,_cccf ,_deda ,1*_gagg );_gaggd =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_bdba ,_gaggd ,_cccf ,_deda ,_gega );_gaggd =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_bdba ,_gaggd ,_cccf ,_deda ,1*_gagg );
|
|
_gaggd =TstESymbol (t ,scale ...);TstAddSymbol (t ,_bdba ,_gaggd ,_cccf ,_deda ,1*_gagg );_gaggd =TstVSymbol (t ,scale ...);TstAddSymbol (t ,_bdba ,_gaggd ,_cccf ,_deda ,1*_gagg );_gaggd =TstESymbol (t ,scale ...);TstAddSymbol (t ,_bdba ,_gaggd ,_cccf ,_deda ,1*_gagg );
|
|
_gaggd =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_bdba ,_gaggd ,_cccf ,_deda ,0);TstWriteSymbols (t ,_bdba ,_fcag );return _fcag ;};func (_dcb *Bitmap )addPadBits ()(_bgc error ){const _cadb ="\u0062\u0069\u0074\u006d\u0061\u0070\u002e\u0061\u0064\u0064\u0050\u0061d\u0042\u0069\u0074\u0073";
|
|
_aaad :=_dcb .Width %8;if _aaad ==0{return nil ;};_bgdc :=_dcb .Width /8;_ebfd :=_g .NewReader (_dcb .Data );_bcafb :=make ([]byte ,_dcb .Height *_dcb .RowStride );_cab :=_g .NewWriterMSB (_bcafb );_cegf :=make ([]byte ,_bgdc );var (_bga int ;_ccce uint64 ;
|
|
);for _bga =0;_bga < _dcb .Height ;_bga ++{if _ ,_bgc =_ebfd .Read (_cegf );_bgc !=nil {return _a .Wrap (_bgc ,_cadb ,"\u0066u\u006c\u006c\u0020\u0062\u0079\u0074e");};if _ ,_bgc =_cab .Write (_cegf );_bgc !=nil {return _a .Wrap (_bgc ,_cadb ,"\u0066\u0075\u006c\u006c\u0020\u0062\u0079\u0074\u0065\u0073");
|
|
};if _ccce ,_bgc =_ebfd .ReadBits (byte (_aaad ));_bgc !=nil {return _a .Wrap (_bgc ,_cadb ,"\u0073\u006b\u0069\u0070\u0070\u0069\u006e\u0067\u0020\u0062\u0069\u0074\u0073");};if _bgc =_cab .WriteByte (byte (_ccce )<<uint (8-_aaad ));_bgc !=nil {return _a .Wrap (_bgc ,_cadb ,"\u006ca\u0073\u0074\u0020\u0062\u0079\u0074e");
|
|
};};_dcb .Data =_cab .Data ();return nil ;};func _bc (_caf ,_ea *Bitmap )(_dd error ){const _cc ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0034";_eg :=_ea .RowStride ;_dec :=_caf .RowStride ;_bbd :=_ea .RowStride *4-_caf .RowStride ;
|
|
var (_egd ,_be byte ;_cgf uint32 ;_bca ,_gbb ,_bg ,_ef ,_cfa ,_df ,_fa int ;);for _bg =0;_bg < _ea .Height ;_bg ++{_bca =_bg *_eg ;_gbb =4*_bg *_dec ;for _ef =0;_ef < _eg ;_ef ++{_egd =_ea .Data [_bca +_ef ];_cgf =_ggfa [_egd ];_df =_gbb +_ef *4;if _bbd !=0&&(_ef +1)*4> _caf .RowStride {for _cfa =_bbd ;
|
|
_cfa > 0;_cfa --{_be =byte ((_cgf >>uint (_cfa *8))&0xff);_fa =_df +(_bbd -_cfa );if _dd =_caf .SetByte (_fa ,_be );_dd !=nil {return _a .Wrapf (_dd ,_cc ,"D\u0069\u0066\u0066\u0065\u0072\u0065n\u0074\u0020\u0072\u006f\u0077\u0073\u0074\u0072\u0069d\u0065\u0073\u002e \u004b:\u0020\u0025\u0064",_cfa );
|
|
};};}else if _dd =_caf .setFourBytes (_df ,_cgf );_dd !=nil {return _a .Wrap (_dd ,_cc ,"");};if _dd =_caf .setFourBytes (_gbb +_ef *4,_ggfa [_ea .Data [_bca +_ef ]]);_dd !=nil {return _a .Wrap (_dd ,_cc ,"");};};for _cfa =1;_cfa < 4;_cfa ++{for _ef =0;
|
|
_ef < _dec ;_ef ++{if _dd =_caf .SetByte (_gbb +_cfa *_dec +_ef ,_caf .Data [_gbb +_ef ]);_dd !=nil {return _a .Wrapf (_dd ,_cc ,"\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",_cfa ,_ef );
|
|
};};};};return nil ;};func TstTSymbol (t *_f .T ,scale ...int )*Bitmap {_acdgd ,_adefb :=NewWithData (5,5,[]byte {0xF8,0x20,0x20,0x20,0x20});_ca .NoError (t ,_adefb );return TstGetScaledSymbol (t ,_acdgd ,scale ...);};func (_acbg MorphProcess )verify (_deedd int ,_fdbfd ,_ggca *int )error {const _agbe ="\u004d\u006f\u0072\u0070hP\u0072\u006f\u0063\u0065\u0073\u0073\u002e\u0076\u0065\u0072\u0069\u0066\u0079";
|
|
switch _acbg .Operation {case MopDilation ,MopErosion ,MopOpening ,MopClosing :if len (_acbg .Arguments )!=2{return _a .Error (_agbe ,"\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");
|
|
};_egdc ,_fge :=_acbg .getWidthHeight ();if _egdc <=0||_fge <=0{return _a .Error (_agbe ,"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 :_fcea :=len (_acbg .Arguments );*_fdbfd +=_fcea ;if _fcea < 1||_fcea > 4{return _a .Error (_agbe ,"\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 _baccd :=0;_baccd < _fcea ;_baccd ++{if _acbg .Arguments [_baccd ]< 1||_acbg .Arguments [_baccd ]> 4{return _a .Error (_agbe ,"\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 (_acbg .Arguments )==0{return _a .Error (_agbe ,"\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");
|
|
};_fece :=_acbg .Arguments [0];if _fece !=2&&_fece !=4&&_fece !=8{return _a .Error (_agbe ,"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");
|
|
};*_fdbfd -=_abdbd [_fece /4];case MopAddBorder :if len (_acbg .Arguments )==0{return _a .Error (_agbe ,"\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");
|
|
};_fecc :=_acbg .Arguments [0];if _deedd > 0{return _a .Error (_agbe ,"\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 _fecc < 1{return _a .Error (_agbe ,"\u0041\u0064\u0064\u0042o\u0072\u0064\u0065\u0072\u0020\u0076\u0061\u006c\u0075\u0065 \u006co\u0077\u0065\u0072\u0020\u0074\u0068\u0061n\u0020\u0030");};*_ggca =_fecc ;};return nil ;};func (_eabd *Bitmap )InverseData (){_eabd .inverseData ()};
|
|
const (_gbff shift =iota ;_dgeba ;);type Component int ;func (_eef *Bitmap )GetChocolateData ()[]byte {if _eef .Color ==Vanilla {_eef .inverseData ();};return _eef .Data ;};func (_fdg *Bitmap )AddBorderGeneral (left ,right ,top ,bot int ,val int )(*Bitmap ,error ){return _fdg .addBorderGeneral (left ,right ,top ,bot ,val );
|
|
};func (_dddb *Bitmap )connComponentsBB (_acfb int )(_agfd *Boxes ,_eadd error ){const _geaf ="\u0042\u0069\u0074ma\u0070\u002e\u0063\u006f\u006e\u006e\u0043\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074\u0073\u0042\u0042";if _acfb !=4&&_acfb !=8{return nil ,_a .Error (_geaf ,"\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 _dddb .Zero (){return &Boxes {},nil ;};_dddb .setPadBits (0);_fcg ,_eadd :=_abdb (nil ,_dddb );if _eadd !=nil {return nil ,_a .Wrap (_eadd ,_geaf ,"\u0062\u006d\u0031");};_bcea :=&_ce .Stack {};_bcea .Aux =&_ce .Stack {};_agfd =&Boxes {};var (_fabc ,_cgdf int ;
|
|
_ebedg _de .Point ;_deea bool ;_gebc *_de .Rectangle ;);for {if _ebedg ,_deea ,_eadd =_fcg .nextOnPixel (_cgdf ,_fabc );_eadd !=nil {return nil ,_a .Wrap (_eadd ,_geaf ,"");};if !_deea {break ;};if _gebc ,_eadd =_ceca (_fcg ,_bcea ,_ebedg .X ,_ebedg .Y ,_acfb );
|
|
_eadd !=nil {return nil ,_a .Wrap (_eadd ,_geaf ,"");};if _eadd =_agfd .Add (_gebc );_eadd !=nil {return nil ,_a .Wrap (_eadd ,_geaf ,"");};_cgdf =_ebedg .X ;_fabc =_ebedg .Y ;};return _agfd ,nil ;};func (_fabe *Points )AddPoint (x ,y float32 ){*_fabe =append (*_fabe ,Point {x ,y })};
|
|
func (_facca *ClassedPoints )validateIntSlice ()error {const _gdcb ="\u0076\u0061l\u0069\u0064\u0061t\u0065\u0049\u006e\u0074\u0053\u006c\u0069\u0063\u0065";for _ ,_bbgda :=range _facca .IntSlice {if _bbgda >=(_facca .Points .Size ()){return _a .Errorf (_gdcb ,"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",_bbgda ,_facca .Points .Size ());
|
|
};};return nil ;};func (_debb *ClassedPoints )XAtIndex (i int )float32 {return (*_debb .Points )[_debb .IntSlice [i ]].X };var MorphBC BoundaryCondition ;func (_aeb *Bitmap )clearAll ()error {return _aeb .RasterOperation (0,0,_aeb .Width ,_aeb .Height ,PixClr ,nil ,0,0);
|
|
};func _facd (_abfd *Bitmap ,_aeadb ,_dbgbb int ,_ggdb ,_gddf int ,_cddbd RasterOperator ,_eefd *Bitmap ,_gbbf ,_efgg int )error {var _fbe ,_dbeb ,_fbee ,_bcgdc int ;if _aeadb < 0{_gbbf -=_aeadb ;_ggdb +=_aeadb ;_aeadb =0;};if _gbbf < 0{_aeadb -=_gbbf ;
|
|
_ggdb +=_gbbf ;_gbbf =0;};_fbe =_aeadb +_ggdb -_abfd .Width ;if _fbe > 0{_ggdb -=_fbe ;};_dbeb =_gbbf +_ggdb -_eefd .Width ;if _dbeb > 0{_ggdb -=_dbeb ;};if _dbgbb < 0{_efgg -=_dbgbb ;_gddf +=_dbgbb ;_dbgbb =0;};if _efgg < 0{_dbgbb -=_efgg ;_gddf +=_efgg ;
|
|
_efgg =0;};_fbee =_dbgbb +_gddf -_abfd .Height ;if _fbee > 0{_gddf -=_fbee ;};_bcgdc =_efgg +_gddf -_eefd .Height ;if _bcgdc > 0{_gddf -=_bcgdc ;};if _ggdb <=0||_gddf <=0{return nil ;};var _deba error ;switch {case _aeadb &7==0&&_gbbf &7==0:_deba =_gcfd (_abfd ,_aeadb ,_dbgbb ,_ggdb ,_gddf ,_cddbd ,_eefd ,_gbbf ,_efgg );
|
|
case _aeadb &7==_gbbf &7:_deba =_cgeg (_abfd ,_aeadb ,_dbgbb ,_ggdb ,_gddf ,_cddbd ,_eefd ,_gbbf ,_efgg );default:_deba =_efcc (_abfd ,_aeadb ,_dbgbb ,_ggdb ,_gddf ,_cddbd ,_eefd ,_gbbf ,_efgg );};if _deba !=nil {return _a .Wrap (_deba ,"r\u0061\u0073\u0074\u0065\u0072\u004f\u0070\u004c\u006f\u0077","");
|
|
};return nil ;};func (_bedbe Points )GetIntX (i int )(int ,error ){if i >=len (_bedbe ){return 0,_a .Errorf ("\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0065t\u0049\u006e\u0074\u0058","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
};return int (_bedbe [i ].X ),nil ;};func (_acec *Bitmaps )GroupByWidth ()(*BitmapsArray ,error ){const _bdabc ="\u0047\u0072\u006fu\u0070\u0042\u0079\u0057\u0069\u0064\u0074\u0068";if len (_acec .Values )==0{return nil ,_a .Error (_bdabc ,"\u006eo\u0020v\u0061\u006c\u0075\u0065\u0073 \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");
|
|
};_edbc :=&BitmapsArray {};_acec .SortByWidth ();_ffgge :=-1;_ceacg :=-1;for _ceaa :=0;_ceaa < len (_acec .Values );_ceaa ++{_aedgf :=_acec .Values [_ceaa ].Width ;if _aedgf > _ffgge {_ffgge =_aedgf ;_ceacg ++;_edbc .Values =append (_edbc .Values ,&Bitmaps {});
|
|
};_edbc .Values [_ceacg ].AddBitmap (_acec .Values [_ceaa ]);};return _edbc ,nil ;};var _abdbd =[5]int {1,2,3,0,4};func (_caebc *Bitmaps )ClipToBitmap (s *Bitmap )(*Bitmaps ,error ){const _effda ="B\u0069t\u006d\u0061\u0070\u0073\u002e\u0043\u006c\u0069p\u0054\u006f\u0042\u0069tm\u0061\u0070";
|
|
if _caebc ==nil {return nil ,_a .Error (_effda ,"\u0042\u0069\u0074\u006dap\u0073\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};if s ==nil {return nil ,_a .Error (_effda ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");
|
|
};_cba :=len (_caebc .Values );_gdfg :=&Bitmaps {Values :make ([]*Bitmap ,_cba ),Boxes :make ([]*_de .Rectangle ,_cba )};var (_fdcg ,_fcfc *Bitmap ;_dacda *_de .Rectangle ;_dcgb error ;);for _fedb :=0;_fedb < _cba ;_fedb ++{if _fdcg ,_dcgb =_caebc .GetBitmap (_fedb );
|
|
_dcgb !=nil {return nil ,_a .Wrap (_dcgb ,_effda ,"");};if _dacda ,_dcgb =_caebc .GetBox (_fedb );_dcgb !=nil {return nil ,_a .Wrap (_dcgb ,_effda ,"");};if _fcfc ,_dcgb =s .clipRectangle (_dacda ,nil );_dcgb !=nil {return nil ,_a .Wrap (_dcgb ,_effda ,"");
|
|
};if _fcfc ,_dcgb =_fcfc .And (_fdcg );_dcgb !=nil {return nil ,_a .Wrap (_dcgb ,_effda ,"");};_gdfg .Values [_fedb ]=_fcfc ;_gdfg .Boxes [_fedb ]=_dacda ;};return _gdfg ,nil ;};func TstISymbol (t *_f .T ,scale ...int )*Bitmap {_cegdg ,_cdaae :=NewWithData (1,5,[]byte {0x80,0x80,0x80,0x80,0x80});
|
|
_ca .NoError (t ,_cdaae );return TstGetScaledSymbol (t ,_cegdg ,scale ...);};func (_caec *Boxes )Get (i int )(*_de .Rectangle ,error ){const _aeac ="\u0042o\u0078\u0065\u0073\u002e\u0047\u0065t";if _caec ==nil {return nil ,_a .Error (_aeac ,"\u0027\u0042\u006f\u0078es\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};if i > len (*_caec )-1{return nil ,_a .Errorf (_aeac ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return (*_caec )[i ],nil ;};func (_ebfb *BitmapsArray )GetBox (i int )(*_de .Rectangle ,error ){const _bacd ="\u0042\u0069\u0074\u006dap\u0073\u0041\u0072\u0072\u0061\u0079\u002e\u0047\u0065\u0074\u0042\u006f\u0078";
|
|
if _ebfb ==nil {return nil ,_a .Error (_bacd ,"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 (_ebfb .Boxes )-1{return nil ,_a .Errorf (_bacd ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
};return _ebfb .Boxes [i ],nil ;};var _ _ag .Interface =&ClassedPoints {};type Points []Point ;func _caba (_bdgg ,_dbgb *Bitmap ,_dagb ,_gggb ,_fbbe ,_fcc ,_gfef ,_ccag ,_gbbd ,_ggdea int ,_ebe CombinationOperator ,_bdce int )error {var _edc int ;_dab :=func (){_edc ++;
|
|
_fbbe +=_dbgb .RowStride ;_fcc +=_bdgg .RowStride ;_gfef +=_bdgg .RowStride };for _edc =_dagb ;_edc < _gggb ;_dab (){var _cdcc uint16 ;_cggg :=_fbbe ;for _febf :=_fcc ;_febf <=_gfef ;_febf ++{_cgggb ,_eeee :=_dbgb .GetByte (_cggg );if _eeee !=nil {return _eeee ;
|
|
};_cea ,_eeee :=_bdgg .GetByte (_febf );if _eeee !=nil {return _eeee ;};_cdcc =(_cdcc |(uint16 (_cea )&0xff))<<uint (_ggdea );_cea =byte (_cdcc >>8);if _eeee =_dbgb .SetByte (_cggg ,_dagf (_cgggb ,_cea ,_ebe ));_eeee !=nil {return _eeee ;};_cggg ++;_cdcc <<=uint (_gbbd );
|
|
if _febf ==_gfef {_cea =byte (_cdcc >>(8-uint8 (_ggdea )));if _bdce !=0{_cea =_cdeb (uint (8+_ccag ),_cea );};_cgggb ,_eeee =_dbgb .GetByte (_cggg );if _eeee !=nil {return _eeee ;};if _eeee =_dbgb .SetByte (_cggg ,_dagf (_cgggb ,_cea ,_ebe ));_eeee !=nil {return _eeee ;
|
|
};};};};return nil ;};func NewWithUnpaddedData (width ,height int ,data []byte )(*Bitmap ,error ){const _aede ="\u004e\u0065\u0077\u0057it\u0068\u0055\u006e\u0070\u0061\u0064\u0064\u0065\u0064\u0044\u0061\u0074\u0061";_gcg :=_daaa (width ,height );_gcg .Data =data ;
|
|
if _bbb :=((width *height )+7)>>3;len (data )< _bbb {return nil ,_a .Errorf (_aede ,"\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 ),_bbb );
|
|
};if _fddc :=_gcg .addPadBits ();_fddc !=nil {return nil ,_a .Wrap (_fddc ,_aede ,"");};return _gcg ,nil ;};func (_ccda *Boxes )SelectBySize (width ,height int ,tp LocationFilter ,relation SizeComparison )(_afb *Boxes ,_daeab error ){const _efdfg ="\u0042o\u0078e\u0073\u002e\u0053\u0065\u006ce\u0063\u0074B\u0079\u0053\u0069\u007a\u0065";
|
|
if _ccda ==nil {return nil ,_a .Error (_efdfg ,"b\u006f\u0078\u0065\u0073 '\u0062'\u0020\u006e\u006f\u0074\u0020d\u0065\u0066\u0069\u006e\u0065\u0064");};if len (*_ccda )==0{return _ccda ,nil ;};switch tp {case LocSelectWidth ,LocSelectHeight ,LocSelectIfEither ,LocSelectIfBoth :default:return nil ,_a .Errorf (_efdfg ,"\u0069\u006e\u0076al\u0069\u0064\u0020\u0066\u0069\u006c\u0074\u0065\u0072\u0020\u0074\u0079\u0070\u0065\u003a\u0020\u0025\u0064",tp );
|
|
};switch relation {case SizeSelectIfLT ,SizeSelectIfGT ,SizeSelectIfLTE ,SizeSelectIfGTE :default:return nil ,_a .Errorf (_efdfg ,"i\u006e\u0076\u0061\u006c\u0069\u0064 \u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u0020t\u0079\u0070\u0065:\u0020'\u0025\u0064\u0027",tp );
|
|
};_eedg :=_ccda .makeSizeIndicator (width ,height ,tp ,relation );_befc ,_daeab :=_ccda .selectWithIndicator (_eedg );if _daeab !=nil {return nil ,_a .Wrap (_daeab ,_efdfg ,"");};return _befc ,nil ;};func _dffg (_efc ,_fdbad *Bitmap ,_dgdc CombinationOperator )*Bitmap {_fegb :=New (_efc .Width ,_efc .Height );
|
|
for _dfaa :=0;_dfaa < len (_fegb .Data );_dfaa ++{_fegb .Data [_dfaa ]=_dagf (_efc .Data [_dfaa ],_fdbad .Data [_dfaa ],_dgdc );};return _fegb ;};func (_feaa *Bitmap )setEightFullBytes (_cfba int ,_gdaba uint64 )error {if _cfba +7> len (_feaa .Data )-1{return _a .Error ("\u0073\u0065\u0074\u0045\u0069\u0067\u0068\u0074\u0042\u0079\u0074\u0065\u0073","\u0069n\u0064e\u0078\u0020\u006f\u0075\u0074 \u006f\u0066 \u0072\u0061\u006e\u0067\u0065");
|
|
};_feaa .Data [_cfba ]=byte ((_gdaba &0xff00000000000000)>>56);_feaa .Data [_cfba +1]=byte ((_gdaba &0xff000000000000)>>48);_feaa .Data [_cfba +2]=byte ((_gdaba &0xff0000000000)>>40);_feaa .Data [_cfba +3]=byte ((_gdaba &0xff00000000)>>32);_feaa .Data [_cfba +4]=byte ((_gdaba &0xff000000)>>24);
|
|
_feaa .Data [_cfba +5]=byte ((_gdaba &0xff0000)>>16);_feaa .Data [_cfba +6]=byte ((_gdaba &0xff00)>>8);_feaa .Data [_cfba +7]=byte (_gdaba &0xff);return nil ;};func (_aebg *Bitmap )clipRectangle (_dfc ,_cfbg *_de .Rectangle )(_cdf *Bitmap ,_afcd error ){const _fad ="\u0063\u006c\u0069\u0070\u0052\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065";
|
|
if _dfc ==nil {return nil ,_a .Error (_fad ,"\u0070r\u006fv\u0069\u0064\u0065\u0064\u0020n\u0069\u006c \u0027\u0062\u006f\u0078\u0027");};_bdeg ,_gffc :=_aebg .Width ,_aebg .Height ;_cdef ,_afcd :=ClipBoxToRectangle (_dfc ,_bdeg ,_gffc );if _afcd !=nil {_cee .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",_afcd );
|
|
return nil ,nil ;};_geec ,_gbfa :=_cdef .Min .X ,_cdef .Min .Y ;_egca ,_cace :=_cdef .Max .X -_cdef .Min .X ,_cdef .Max .Y -_cdef .Min .Y ;_cdf =New (_egca ,_cace );_cdf .Text =_aebg .Text ;if _afcd =_cdf .RasterOperation (0,0,_egca ,_cace ,PixSrc ,_aebg ,_geec ,_gbfa );
|
|
_afcd !=nil {return nil ,_a .Wrap (_afcd ,_fad ,"");};if _cfbg !=nil {*_cfbg =*_cdef ;};return _cdf ,nil ;};func (_fbc *Bitmap )ThresholdPixelSum (thresh int ,tab8 []int )(_abbf bool ,_cfcb error ){const _ead ="\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 =_adbac ();};_ccd :=_fbc .Width >>3;_baa :=_fbc .Width &7;_aaec :=byte (0xff<<uint (8-_baa ));var (_abfa ,_ddbc ,_aeg ,_bbg int ;_cefg byte ;);for _abfa =0;_abfa < _fbc .Height ;_abfa ++{_aeg =_fbc .RowStride *_abfa ;for _ddbc =0;_ddbc < _ccd ;
|
|
_ddbc ++{_cefg ,_cfcb =_fbc .GetByte (_aeg +_ddbc );if _cfcb !=nil {return false ,_a .Wrap (_cfcb ,_ead ,"\u0066\u0075\u006c\u006c\u0042\u0079\u0074\u0065");};_bbg +=tab8 [_cefg ];};if _baa !=0{_cefg ,_cfcb =_fbc .GetByte (_aeg +_ddbc );if _cfcb !=nil {return false ,_a .Wrap (_cfcb ,_ead ,"p\u0061\u0072\u0074\u0069\u0061\u006c\u0042\u0079\u0074\u0065");
|
|
};_cefg &=_aaec ;_bbg +=tab8 [_cefg ];};if _bbg > thresh {return true ,nil ;};};return _abbf ,nil ;};func (_ffg *Bitmap )ClipRectangle (box *_de .Rectangle )(_gged *Bitmap ,_bfc *_de .Rectangle ,_ffb error ){const _eabb ="\u0043\u006c\u0069\u0070\u0052\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065";
|
|
if box ==nil {return nil ,nil ,_a .Error (_eabb ,"\u0062o\u0078 \u0069\u0073\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};_bbe ,_effd :=_ffg .Width ,_ffg .Height ;_fafd :=_de .Rect (0,0,_bbe ,_effd );if !box .Overlaps (_fafd ){return nil ,nil ,_a .Error (_eabb ,"b\u006f\u0078\u0020\u0064oe\u0073n\u0027\u0074\u0020\u006f\u0076e\u0072\u006c\u0061\u0070\u0020\u0062");
|
|
};_gcda :=box .Intersect (_fafd );_gcdc ,_gaaa :=_gcda .Min .X ,_gcda .Min .Y ;_fgb ,_dbe :=_gcda .Dx (),_gcda .Dy ();_gged =New (_fgb ,_dbe );_gged .Text =_ffg .Text ;if _ffb =_gged .RasterOperation (0,0,_fgb ,_dbe ,PixSrc ,_ffg ,_gcdc ,_gaaa );_ffb !=nil {return nil ,nil ,_a .Wrap (_ffb ,_eabb ,"\u0050\u0069\u0078\u0053\u0072\u0063\u0020\u0074\u006f\u0020\u0063\u006ci\u0070\u0070\u0065\u0064");
|
|
};_bfc =&_gcda ;return _gged ,_bfc ,nil ;};func TstWordBitmap (t *_f .T ,scale ...int )*Bitmap {_aebgd :=1;if len (scale )> 0{_aebgd =scale [0];};_afefa :=3;_gfda :=9+7+15+2*_afefa ;_efdb :=5+_afefa +5;_fbddd :=New (_gfda *_aebgd ,_efdb *_aebgd );_ccdb :=&Bitmaps {};
|
|
var _abfb *int ;_afefa *=_aebgd ;_efeb :=0;_abfb =&_efeb ;_edcgd :=0;_deacf :=TstDSymbol (t ,scale ...);TstAddSymbol (t ,_ccdb ,_deacf ,_abfb ,_edcgd ,1*_aebgd );_deacf =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_ccdb ,_deacf ,_abfb ,_edcgd ,_afefa );
|
|
_deacf =TstISymbol (t ,scale ...);TstAddSymbol (t ,_ccdb ,_deacf ,_abfb ,_edcgd ,1*_aebgd );_deacf =TstTSymbol (t ,scale ...);TstAddSymbol (t ,_ccdb ,_deacf ,_abfb ,_edcgd ,_afefa );_deacf =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_ccdb ,_deacf ,_abfb ,_edcgd ,1*_aebgd );
|
|
_deacf =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_ccdb ,_deacf ,_abfb ,_edcgd ,1*_aebgd );_deacf =TstWSymbol (t ,scale ...);TstAddSymbol (t ,_ccdb ,_deacf ,_abfb ,_edcgd ,0);*_abfb =0;_edcgd =5*_aebgd +_afefa ;_deacf =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_ccdb ,_deacf ,_abfb ,_edcgd ,1*_aebgd );
|
|
_deacf =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_ccdb ,_deacf ,_abfb ,_edcgd ,_afefa );_deacf =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_ccdb ,_deacf ,_abfb ,_edcgd ,1*_aebgd );_deacf =TstESymbol (t ,scale ...);TstAddSymbol (t ,_ccdb ,_deacf ,_abfb ,_edcgd ,1*_aebgd );
|
|
_deacf =TstVSymbol (t ,scale ...);TstAddSymbol (t ,_ccdb ,_deacf ,_abfb ,_edcgd ,1*_aebgd );_deacf =TstESymbol (t ,scale ...);TstAddSymbol (t ,_ccdb ,_deacf ,_abfb ,_edcgd ,1*_aebgd );_deacf =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_ccdb ,_deacf ,_abfb ,_edcgd ,0);
|
|
TstWriteSymbols (t ,_ccdb ,_fbddd );return _fbddd ;};func _fed (_gbcc ,_abd *Bitmap ,_cff int ,_ddf []byte ,_bcae int )(_cefd error ){const _cfg ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0034";
|
|
var (_dbb ,_cdbc ,_cae ,_gcf ,_eea ,_def ,_daac ,_gcd int ;_ceb ,_dece uint32 ;_abb ,_fag byte ;_bcg uint16 ;);_cdaa :=make ([]byte ,4);_begg :=make ([]byte ,4);for _cae =0;_cae < _gbcc .Height -1;_cae ,_gcf =_cae +2,_gcf +1{_dbb =_cae *_gbcc .RowStride ;
|
|
_cdbc =_gcf *_abd .RowStride ;for _eea ,_def =0,0;_eea < _bcae ;_eea ,_def =_eea +4,_def +1{for _daac =0;_daac < 4;_daac ++{_gcd =_dbb +_eea +_daac ;if _gcd <=len (_gbcc .Data )-1&&_gcd < _dbb +_gbcc .RowStride {_cdaa [_daac ]=_gbcc .Data [_gcd ];}else {_cdaa [_daac ]=0x00;
|
|
};_gcd =_dbb +_gbcc .RowStride +_eea +_daac ;if _gcd <=len (_gbcc .Data )-1&&_gcd < _dbb +(2*_gbcc .RowStride ){_begg [_daac ]=_gbcc .Data [_gcd ];}else {_begg [_daac ]=0x00;};};_ceb =_cf .BigEndian .Uint32 (_cdaa );_dece =_cf .BigEndian .Uint32 (_begg );
|
|
_dece &=_ceb ;_dece &=_dece <<1;_dece &=0xaaaaaaaa;_ceb =_dece |(_dece <<7);_abb =byte (_ceb >>24);_fag =byte ((_ceb >>8)&0xff);_gcd =_cdbc +_def ;if _gcd +1==len (_abd .Data )-1||_gcd +1>=_cdbc +_abd .RowStride {_abd .Data [_gcd ]=_ddf [_abb ];if _cefd =_abd .SetByte (_gcd ,_ddf [_abb ]);
|
|
_cefd !=nil {return _a .Wrapf (_cefd ,_cfg ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_gcd );};}else {_bcg =(uint16 (_ddf [_abb ])<<8)|uint16 (_ddf [_fag ]);if _cefd =_abd .setTwoBytes (_gcd ,_bcg );_cefd !=nil {return _a .Wrapf (_cefd ,_cfg ,"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",_gcd );
|
|
};_def ++;};};};return nil ;};func (_aea *Bitmap )setTwoBytes (_aaea int ,_fea uint16 )error {if _aaea +1> len (_aea .Data )-1{return _a .Errorf ("s\u0065\u0074\u0054\u0077\u006f\u0042\u0079\u0074\u0065\u0073","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",_aaea );
|
|
};_aea .Data [_aaea ]=byte ((_fea &0xff00)>>8);_aea .Data [_aaea +1]=byte (_fea &0xff);return nil ;};func TstImageBitmapData ()[]byte {return _aceca .Data };func (_ggcf *Bitmap )Equals (s *Bitmap )bool {if len (_ggcf .Data )!=len (s .Data )||_ggcf .Width !=s .Width ||_ggcf .Height !=s .Height {return false ;
|
|
};for _deab :=0;_deab < _ggcf .Height ;_deab ++{_gff :=_deab *_ggcf .RowStride ;for _afa :=0;_afa < _ggcf .RowStride ;_afa ++{if _ggcf .Data [_gff +_afa ]!=s .Data [_gff +_afa ]{return false ;};};};return true ;};func _cgadc (_gcbb ,_ebaf ,_efgfb byte )byte {return (_gcbb &^(_efgfb ))|(_ebaf &_efgfb )};
|
|
func (_gef *Bitmap )CreateTemplate ()*Bitmap {return _gef .createTemplate ()};func (_abbfbf *byWidth )Len ()int {return len (_abbfbf .Values )};func (_dddg *Bitmaps )selectByIndicator (_edbg *_ce .NumSlice )(_aggcd *Bitmaps ,_agbc error ){const _eaeb ="\u0042i\u0074\u006d\u0061\u0070s\u002e\u0073\u0065\u006c\u0065c\u0074B\u0079I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";
|
|
if _dddg ==nil {return nil ,_a .Error (_eaeb ,"\u0027\u0062\u0027 b\u0069\u0074\u006d\u0061\u0070\u0073\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};if _edbg ==nil {return nil ,_a .Error (_eaeb ,"'\u006e\u0061\u0027\u0020\u0069\u006ed\u0069\u0063\u0061\u0074\u006f\u0072\u0073\u0020\u006eo\u0074\u0020\u0064e\u0066i\u006e\u0065\u0064");
|
|
};if len (_dddg .Values )==0{return _dddg ,nil ;};if len (*_edbg )!=len (_dddg .Values ){return nil ,_a .Errorf (_eaeb ,"\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 (*_edbg ),len (_dddg .Values ));
|
|
};var _aeff ,_acdd ,_adccf int ;for _acdd =0;_acdd < len (*_edbg );_acdd ++{if _aeff ,_agbc =_edbg .GetInt (_acdd );_agbc !=nil {return nil ,_a .Wrap (_agbc ,_eaeb ,"f\u0069\u0072\u0073\u0074\u0020\u0063\u0068\u0065\u0063\u006b");};if _aeff ==1{_adccf ++;
|
|
};};if _adccf ==len (_dddg .Values ){return _dddg ,nil ;};_aggcd =&Bitmaps {};_abgeg :=len (_dddg .Values )==len (_dddg .Boxes );for _acdd =0;_acdd < len (*_edbg );_acdd ++{if _aeff =int ((*_edbg )[_acdd ]);_aeff ==0{continue ;};_aggcd .Values =append (_aggcd .Values ,_dddg .Values [_acdd ]);
|
|
if _abgeg {_aggcd .Boxes =append (_aggcd .Boxes ,_dddg .Boxes [_acdd ]);};};return _aggcd ,nil ;};func (_gcac *Bitmaps )SelectByIndexes (idx []int )(*Bitmaps ,error ){const _gbae ="B\u0069\u0074\u006d\u0061\u0070\u0073.\u0053\u006f\u0072\u0074\u0049\u006e\u0064\u0065\u0078e\u0073\u0042\u0079H\u0065i\u0067\u0068\u0074";
|
|
_ddac ,_afeb :=_gcac .selectByIndexes (idx );if _afeb !=nil {return nil ,_a .Wrap (_afeb ,_gbae ,"");};return _ddac ,nil ;};func (_aaaf *Bitmap )nextOnPixel (_gbg ,_gdcf int )(_deg _de .Point ,_fgcc bool ,_cded error ){const _fgag ="n\u0065\u0078\u0074\u004f\u006e\u0050\u0069\u0078\u0065\u006c";
|
|
_deg ,_fgcc ,_cded =_aaaf .nextOnPixelLow (_aaaf .Width ,_aaaf .Height ,_aaaf .RowStride ,_gbg ,_gdcf );if _cded !=nil {return _deg ,false ,_a .Wrap (_cded ,_fgag ,"");};return _deg ,_fgcc ,nil ;};func _fee ()(_acga [256]uint32 ){for _ffda :=0;_ffda < 256;
|
|
_ffda ++{if _ffda &0x01!=0{_acga [_ffda ]|=0xf;};if _ffda &0x02!=0{_acga [_ffda ]|=0xf0;};if _ffda &0x04!=0{_acga [_ffda ]|=0xf00;};if _ffda &0x08!=0{_acga [_ffda ]|=0xf000;};if _ffda &0x10!=0{_acga [_ffda ]|=0xf0000;};if _ffda &0x20!=0{_acga [_ffda ]|=0xf00000;
|
|
};if _ffda &0x40!=0{_acga [_ffda ]|=0xf000000;};if _ffda &0x80!=0{_acga [_ffda ]|=0xf0000000;};};return _acga ;};func Blit (src *Bitmap ,dst *Bitmap ,x ,y int ,op CombinationOperator )error {var _ecga ,_adg int ;_cgec :=src .RowStride -1;if x < 0{_adg =-x ;
|
|
x =0;}else if x +src .Width > dst .Width {_cgec -=src .Width +x -dst .Width ;};if y < 0{_ecga =-y ;y =0;_adg +=src .RowStride ;_cgec +=src .RowStride ;}else if y +src .Height > dst .Height {_ecga =src .Height +y -dst .Height ;};var (_bdb int ;_adcd error ;
|
|
);_cgbg :=x &0x07;_bddb :=8-_cgbg ;_bacb :=src .Width &0x07;_gbe :=_bddb -_bacb ;_baea :=_bddb &0x07!=0;_gcbe :=src .Width <=((_cgec -_adg )<<3)+_bddb ;_fabd :=dst .GetByteIndex (x ,y );_fdc :=_ecga +dst .Height ;if src .Height > _fdc {_bdb =_fdc ;}else {_bdb =src .Height ;
|
|
};switch {case !_baea :_adcd =_ebae (src ,dst ,_ecga ,_bdb ,_fabd ,_adg ,_cgec ,op );case _gcbe :_adcd =_cecdc (src ,dst ,_ecga ,_bdb ,_fabd ,_adg ,_cgec ,_gbe ,_cgbg ,_bddb ,op );default:_adcd =_caba (src ,dst ,_ecga ,_bdb ,_fabd ,_adg ,_cgec ,_gbe ,_cgbg ,_bddb ,op ,_bacb );
|
|
};return _adcd ;};func (_eeba *Bitmap )GetVanillaData ()[]byte {if _eeba .Color ==Chocolate {_eeba .inverseData ();};return _eeba .Data ;};func (_fef *Bitmap )SetPixel (x ,y int ,pixel byte )error {_dfd :=_fef .GetByteIndex (x ,y );if _dfd > len (_fef .Data )-1{return _a .Errorf ("\u0053\u0065\u0074\u0050\u0069\u0078\u0065\u006c","\u0069\u006e\u0064\u0065x \u006f\u0075\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u003a\u0020%\u0064",_dfd );
|
|
};_bed :=_fef .GetBitOffset (x );_cac :=uint (7-_bed );_ebge :=_fef .Data [_dfd ];var _deb byte ;if pixel ==1{_deb =_ebge |(pixel &0x01<<_cac );}else {_deb =_ebge &^(1<<_cac );};_fef .Data [_dfd ]=_deb ;return nil ;};type shift int ;func _dagf (_cggd ,_edec byte ,_fbgf CombinationOperator )byte {switch _fbgf {case CmbOpOr :return _edec |_cggd ;
|
|
case CmbOpAnd :return _edec &_cggd ;case CmbOpXor :return _edec ^_cggd ;case CmbOpXNor :return ^(_edec ^_cggd );case CmbOpNot :return ^(_edec );default:return _edec ;};};func (_dddd *Bitmaps )AddBitmap (bm *Bitmap ){_dddd .Values =append (_dddd .Values ,bm )};
|
|
func CorrelationScore (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab []int )(_ddab float64 ,_geab error ){const _abce ="\u0063\u006fr\u0072\u0065\u006ca\u0074\u0069\u006f\u006e\u0053\u0063\u006f\u0072\u0065";if bm1 ==nil ||bm2 ==nil {return 0,_a .Error (_abce ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0062\u0069\u0074ma\u0070\u0073");
|
|
};if tab ==nil {return 0,_a .Error (_abce ,"\u0027\u0074\u0061\u0062\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065f\u0069\u006e\u0065\u0064");};if area1 <=0||area2 <=0{return 0,_a .Error (_abce ,"\u0061\u0072\u0065\u0061s\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065\u0020\u0067r\u0065a\u0074\u0065\u0072\u0020\u0074\u0068\u0061n\u0020\u0030");
|
|
};_fade ,_dde :=bm1 .Width ,bm1 .Height ;_gada ,_fefd :=bm2 .Width ,bm2 .Height ;_gbea :=_cfbae (_fade -_gada );if _gbea > maxDiffW {return 0,nil ;};_abdba :=_cfbae (_dde -_fefd );if _abdba > maxDiffH {return 0,nil ;};var _fefa ,_cbgg int ;if delX >=0{_fefa =int (delX +0.5);
|
|
}else {_fefa =int (delX -0.5);};if delY >=0{_cbgg =int (delY +0.5);}else {_cbgg =int (delY -0.5);};_dfee :=_bbbg (_cbgg ,0);_bbea :=_gce (_fefd +_cbgg ,_dde );_cfgg :=bm1 .RowStride *_dfee ;_cdee :=bm2 .RowStride *(_dfee -_cbgg );_dbgbg :=_bbbg (_fefa ,0);
|
|
_agd :=_gce (_gada +_fefa ,_fade );_aefda :=bm2 .RowStride ;var _eded ,_aeaf int ;if _fefa >=8{_eded =_fefa >>3;_cfgg +=_eded ;_dbgbg -=_eded <<3;_agd -=_eded <<3;_fefa &=7;}else if _fefa <=-8{_aeaf =-((_fefa +7)>>3);_cdee +=_aeaf ;_aefda -=_aeaf ;_fefa +=_aeaf <<3;
|
|
};if _dbgbg >=_agd ||_dfee >=_bbea {return 0,nil ;};_gdef :=(_agd +7)>>3;var (_eecb ,_bdcea ,_beda byte ;_ebba ,_gbcb ,_gabf int ;);switch {case _fefa ==0:for _gabf =_dfee ;_gabf < _bbea ;_gabf ,_cfgg ,_cdee =_gabf +1,_cfgg +bm1 .RowStride ,_cdee +bm2 .RowStride {for _gbcb =0;
|
|
_gbcb < _gdef ;_gbcb ++{_beda =bm1 .Data [_cfgg +_gbcb ]&bm2 .Data [_cdee +_gbcb ];_ebba +=tab [_beda ];};};case _fefa > 0:if _aefda < _gdef {for _gabf =_dfee ;_gabf < _bbea ;_gabf ,_cfgg ,_cdee =_gabf +1,_cfgg +bm1 .RowStride ,_cdee +bm2 .RowStride {_eecb ,_bdcea =bm1 .Data [_cfgg ],bm2 .Data [_cdee ]>>uint (_fefa );
|
|
_beda =_eecb &_bdcea ;_ebba +=tab [_beda ];for _gbcb =1;_gbcb < _aefda ;_gbcb ++{_eecb ,_bdcea =bm1 .Data [_cfgg +_gbcb ],(bm2 .Data [_cdee +_gbcb ]>>uint (_fefa ))|(bm2 .Data [_cdee +_gbcb -1]<<uint (8-_fefa ));_beda =_eecb &_bdcea ;_ebba +=tab [_beda ];
|
|
};_eecb =bm1 .Data [_cfgg +_gbcb ];_bdcea =bm2 .Data [_cdee +_gbcb -1]<<uint (8-_fefa );_beda =_eecb &_bdcea ;_ebba +=tab [_beda ];};}else {for _gabf =_dfee ;_gabf < _bbea ;_gabf ,_cfgg ,_cdee =_gabf +1,_cfgg +bm1 .RowStride ,_cdee +bm2 .RowStride {_eecb ,_bdcea =bm1 .Data [_cfgg ],bm2 .Data [_cdee ]>>uint (_fefa );
|
|
_beda =_eecb &_bdcea ;_ebba +=tab [_beda ];for _gbcb =1;_gbcb < _gdef ;_gbcb ++{_eecb =bm1 .Data [_cfgg +_gbcb ];_bdcea =(bm2 .Data [_cdee +_gbcb ]>>uint (_fefa ))|(bm2 .Data [_cdee +_gbcb -1]<<uint (8-_fefa ));_beda =_eecb &_bdcea ;_ebba +=tab [_beda ];
|
|
};};};default:if _gdef < _aefda {for _gabf =_dfee ;_gabf < _bbea ;_gabf ,_cfgg ,_cdee =_gabf +1,_cfgg +bm1 .RowStride ,_cdee +bm2 .RowStride {for _gbcb =0;_gbcb < _gdef ;_gbcb ++{_eecb =bm1 .Data [_cfgg +_gbcb ];_bdcea =bm2 .Data [_cdee +_gbcb ]<<uint (-_fefa );
|
|
_bdcea |=bm2 .Data [_cdee +_gbcb +1]>>uint (8+_fefa );_beda =_eecb &_bdcea ;_ebba +=tab [_beda ];};};}else {for _gabf =_dfee ;_gabf < _bbea ;_gabf ,_cfgg ,_cdee =_gabf +1,_cfgg +bm1 .RowStride ,_cdee +bm2 .RowStride {for _gbcb =0;_gbcb < _gdef -1;_gbcb ++{_eecb =bm1 .Data [_cfgg +_gbcb ];
|
|
_bdcea =bm2 .Data [_cdee +_gbcb ]<<uint (-_fefa );_bdcea |=bm2 .Data [_cdee +_gbcb +1]>>uint (8+_fefa );_beda =_eecb &_bdcea ;_ebba +=tab [_beda ];};_eecb =bm1 .Data [_cfgg +_gbcb ];_bdcea =bm2 .Data [_cdee +_gbcb ]<<uint (-_fefa );_beda =_eecb &_bdcea ;
|
|
_ebba +=tab [_beda ];};};};_ddab =float64 (_ebba )*float64 (_ebba )/(float64 (area1 )*float64 (area2 ));return _ddab ,nil ;};func _efge (_ffgd *Bitmap ,_ccef int )(*Bitmap ,error ){const _cfge ="\u0065x\u0070a\u006e\u0064\u0052\u0065\u0070\u006c\u0069\u0063\u0061\u0074\u0065";
|
|
if _ffgd ==nil {return nil ,_a .Error (_cfge ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _ccef <=0{return nil ,_a .Error (_cfge ,"i\u006e\u0076\u0061\u006cid\u0020f\u0061\u0063\u0074\u006f\u0072 \u002d\u0020\u003c\u003d\u0020\u0030");
|
|
};if _ccef ==1{_egf ,_gafad :=_abdb (nil ,_ffgd );if _gafad !=nil {return nil ,_a .Wrap (_gafad ,_cfge ,"\u0066\u0061\u0063\u0074\u006f\u0072\u0020\u003d\u0020\u0031");};return _egf ,nil ;};_abge ,_fcef :=_ggg (_ffgd ,_ccef ,_ccef );if _fcef !=nil {return nil ,_a .Wrap (_fcef ,_cfge ,"");
|
|
};return _abge ,nil ;};func (_dbeag *Bitmaps )GetBox (i int )(*_de .Rectangle ,error ){const _feag ="\u0047\u0065\u0074\u0042\u006f\u0078";if _dbeag ==nil {return nil ,_a .Error (_feag ,"\u0070\u0072\u006f\u0076id\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0042\u0069\u0074\u006d\u0061\u0070s\u0027");
|
|
};if i > len (_dbeag .Boxes )-1{return nil ,_a .Errorf (_feag ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return _dbeag .Boxes [i ],nil ;};func (_adea MorphProcess )getWidthHeight ()(_gdfb ,_ggcb int ){return _adea .Arguments [0],_adea .Arguments [1];
|
|
};func TstAddSymbol (t *_f .T ,bms *Bitmaps ,sym *Bitmap ,x *int ,y int ,space int ){bms .AddBitmap (sym );_daead :=_de .Rect (*x ,y ,*x +sym .Width ,y +sym .Height );bms .AddBox (&_daead );*x +=sym .Width +space ;};func _adcgb (_gceg *Bitmap ,_faeab ,_adae int ,_afcda ,_ffcd int ,_ffbb RasterOperator ){var (_gfdgc bool ;
|
|
_dcecc bool ;_efab int ;_agbbbf int ;_gbbe int ;_gefab int ;_gfffe bool ;_cdba byte ;);_dabe :=8-(_faeab &7);_ggebf :=_aggd [_dabe ];_dcdf :=_gceg .RowStride *_adae +(_faeab >>3);if _afcda < _dabe {_gfdgc =true ;_ggebf &=_aagcg [8-_dabe +_afcda ];};if !_gfdgc {_efab =(_afcda -_dabe )>>3;
|
|
if _efab !=0{_dcecc =true ;_agbbbf =_dcdf +1;};};_gbbe =(_faeab +_afcda )&7;if !(_gfdgc ||_gbbe ==0){_gfffe =true ;_cdba =_aagcg [_gbbe ];_gefab =_dcdf +1+_efab ;};var _gcca ,_caae int ;switch _ffbb {case PixClr :for _gcca =0;_gcca < _ffcd ;_gcca ++{_gceg .Data [_dcdf ]=_cgadc (_gceg .Data [_dcdf ],0x0,_ggebf );
|
|
_dcdf +=_gceg .RowStride ;};if _dcecc {for _gcca =0;_gcca < _ffcd ;_gcca ++{for _caae =0;_caae < _efab ;_caae ++{_gceg .Data [_agbbbf +_caae ]=0x0;};_agbbbf +=_gceg .RowStride ;};};if _gfffe {for _gcca =0;_gcca < _ffcd ;_gcca ++{_gceg .Data [_gefab ]=_cgadc (_gceg .Data [_gefab ],0x0,_cdba );
|
|
_gefab +=_gceg .RowStride ;};};case PixSet :for _gcca =0;_gcca < _ffcd ;_gcca ++{_gceg .Data [_dcdf ]=_cgadc (_gceg .Data [_dcdf ],0xff,_ggebf );_dcdf +=_gceg .RowStride ;};if _dcecc {for _gcca =0;_gcca < _ffcd ;_gcca ++{for _caae =0;_caae < _efab ;_caae ++{_gceg .Data [_agbbbf +_caae ]=0xff;
|
|
};_agbbbf +=_gceg .RowStride ;};};if _gfffe {for _gcca =0;_gcca < _ffcd ;_gcca ++{_gceg .Data [_gefab ]=_cgadc (_gceg .Data [_gefab ],0xff,_cdba );_gefab +=_gceg .RowStride ;};};case PixNotDst :for _gcca =0;_gcca < _ffcd ;_gcca ++{_gceg .Data [_dcdf ]=_cgadc (_gceg .Data [_dcdf ],^_gceg .Data [_dcdf ],_ggebf );
|
|
_dcdf +=_gceg .RowStride ;};if _dcecc {for _gcca =0;_gcca < _ffcd ;_gcca ++{for _caae =0;_caae < _efab ;_caae ++{_gceg .Data [_agbbbf +_caae ]=^(_gceg .Data [_agbbbf +_caae ]);};_agbbbf +=_gceg .RowStride ;};};if _gfffe {for _gcca =0;_gcca < _ffcd ;_gcca ++{_gceg .Data [_gefab ]=_cgadc (_gceg .Data [_gefab ],^_gceg .Data [_gefab ],_cdba );
|
|
_gefab +=_gceg .RowStride ;};};};};func TstImageBitmapInverseData ()[]byte {_gdcad :=_aceca .Copy ();_gdcad .InverseData ();return _gdcad .Data ;};func NewWithData (width ,height int ,data []byte )(*Bitmap ,error ){const _dea ="N\u0065\u0077\u0057\u0069\u0074\u0068\u0044\u0061\u0074\u0061";
|
|
_ddg :=_daaa (width ,height );_ddg .Data =data ;if len (data )< height *_ddg .RowStride {return nil ,_a .Errorf (_dea ,"\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 *_ddg .RowStride );
|
|
};return _ddg ,nil ;};func (_caafd *Bitmaps )SelectBySize (width ,height int ,tp LocationFilter ,relation SizeComparison )(_eedb *Bitmaps ,_efec error ){const _gaddg ="B\u0069t\u006d\u0061\u0070\u0073\u002e\u0053\u0065\u006ce\u0063\u0074\u0042\u0079Si\u007a\u0065";
|
|
if _caafd ==nil {return nil ,_a .Error (_gaddg ,"\u0027\u0062\u0027 B\u0069\u0074\u006d\u0061\u0070\u0073\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};switch tp {case LocSelectWidth ,LocSelectHeight ,LocSelectIfEither ,LocSelectIfBoth :default:return nil ,_a .Errorf (_gaddg ,"\u0070\u0072\u006f\u0076\u0069d\u0065\u0064\u0020\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u006c\u006fc\u0061\u0074\u0069\u006f\u006e\u0020\u0066\u0069\u006c\u0074\u0065\u0072\u0020\u0074\u0079\u0070\u0065\u003a\u0020\u0025\u0064",tp );
|
|
};switch relation {case SizeSelectIfLT ,SizeSelectIfGT ,SizeSelectIfLTE ,SizeSelectIfGTE ,SizeSelectIfEQ :default:return nil ,_a .Errorf (_gaddg ,"\u0069\u006e\u0076\u0061li\u0064\u0020\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0027\u0025d\u0027",relation );
|
|
};_dffgd ,_efec :=_caafd .makeSizeIndicator (width ,height ,tp ,relation );if _efec !=nil {return nil ,_a .Wrap (_efec ,_gaddg ,"");};_eedb ,_efec =_caafd .selectByIndicator (_dffgd );if _efec !=nil {return nil ,_a .Wrap (_efec ,_gaddg ,"");};return _eedb ,nil ;
|
|
};func (_gdac *Bitmaps )WidthSorter ()func (_acfg ,_fdad int )bool {return func (_ecfa ,_gbgbe int )bool {return _gdac .Values [_ecfa ].Width < _gdac .Values [_gbgbe ].Width };};type SizeComparison int ;const (CmbOpOr CombinationOperator =iota ;CmbOpAnd ;
|
|
CmbOpXor ;CmbOpXNor ;CmbOpReplace ;CmbOpNot ;);func (_faff *Bitmap )setPadBits (_bbdd int ){_eeff :=8-_faff .Width %8;if _eeff ==8{return ;};_faag :=_faff .Width /8;_gad :=_aggd [_eeff ];if _bbdd ==0{_gad ^=_gad ;};var _bgb int ;for _dbg :=0;_dbg < _faff .Height ;
|
|
_dbg ++{_bgb =_dbg *_faff .RowStride +_faag ;if _bbdd ==0{_faff .Data [_bgb ]&=_gad ;}else {_faff .Data [_bgb ]|=_gad ;};};};func _cdeb (_bfece uint ,_abg byte )byte {return _abg >>_bfece <<_bfece };const (AsymmetricMorphBC BoundaryCondition =iota ;SymmetricMorphBC ;
|
|
);func (_acca *Bitmap )GetComponents (components Component ,maxWidth ,maxHeight int )(_ccgd *Bitmaps ,_aba *Boxes ,_gfae error ){const _cgaf ="B\u0069t\u006d\u0061\u0070\u002e\u0047\u0065\u0074\u0043o\u006d\u0070\u006f\u006een\u0074\u0073";if _acca ==nil {return nil ,nil ,_a .Error (_cgaf ,"\u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0042\u0069\u0074\u006da\u0070\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069n\u0065\u0064\u002e");
|
|
};switch components {case ComponentConn ,ComponentCharacters ,ComponentWords :default:return nil ,nil ,_a .Error (_cgaf ,"\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 _acca .Zero (){_aba =&Boxes {};_ccgd =&Bitmaps {};return _ccgd ,_aba ,nil ;};switch components {case ComponentConn :_ccgd =&Bitmaps {};if _aba ,_gfae =_acca .ConnComponents (_ccgd ,8);_gfae !=nil {return nil ,nil ,_a .Wrap (_gfae ,_cgaf ,"\u006e\u006f \u0070\u0072\u0065p\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");
|
|
};case ComponentCharacters :_ffe ,_dcgd :=MorphSequence (_acca ,MorphProcess {Operation :MopClosing ,Arguments :[]int {1,6}});if _dcgd !=nil {return nil ,nil ,_a .Wrap (_dcgd ,_cgaf ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");
|
|
};if _cee .Log .IsLogLevel (_cee .LogLevelTrace ){_cee .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",_ffe .String ());
|
|
};_dbd :=&Bitmaps {};_aba ,_dcgd =_ffe .ConnComponents (_dbd ,8);if _dcgd !=nil {return nil ,nil ,_a .Wrap (_dcgd ,_cgaf ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");
|
|
};if _cee .Log .IsLogLevel (_cee .LogLevelTrace ){_cee .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",_dbd .String ());
|
|
};if _ccgd ,_dcgd =_dbd .ClipToBitmap (_acca );_dcgd !=nil {return nil ,nil ,_a .Wrap (_dcgd ,_cgaf ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");};case ComponentWords :_ffdc :=1;
|
|
var _ace *Bitmap ;switch {case _acca .XResolution <=200:_ace =_acca ;case _acca .XResolution <=400:_ffdc =2;_ace ,_gfae =_fgd (_acca ,1,0,0,0);if _gfae !=nil {return nil ,nil ,_a .Wrap (_gfae ,_cgaf ,"w\u006f\u0072\u0064\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0020\u002d \u0078\u0072\u0065s\u003c=\u0034\u0030\u0030");
|
|
};default:_ffdc =4;_ace ,_gfae =_fgd (_acca ,1,1,0,0);if _gfae !=nil {return nil ,nil ,_a .Wrap (_gfae ,_cgaf ,"\u0077\u006f\u0072\u0064 \u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073 \u002d \u0078\u0072\u0065\u0073\u0020\u003e\u00204\u0030\u0030");
|
|
};};_ega ,_ ,_ddfc :=_dfca (_ace );if _ddfc !=nil {return nil ,nil ,_a .Wrap (_ddfc ,_cgaf ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");};_aggc ,_ddfc :=_efge (_ega ,_ffdc );if _ddfc !=nil {return nil ,nil ,_a .Wrap (_ddfc ,_cgaf ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");
|
|
};_dbdd :=&Bitmaps {};if _aba ,_ddfc =_aggc .ConnComponents (_dbdd ,4);_ddfc !=nil {return nil ,nil ,_a .Wrap (_ddfc ,_cgaf ,"\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 _ccgd ,_ddfc =_dbdd .ClipToBitmap (_acca );_ddfc !=nil {return nil ,nil ,_a .Wrap (_ddfc ,_cgaf ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");};};_ccgd ,_gfae =_ccgd .SelectBySize (maxWidth ,maxHeight ,LocSelectIfBoth ,SizeSelectIfLTE );
|
|
if _gfae !=nil {return nil ,nil ,_a .Wrap (_gfae ,_cgaf ,"");};_aba ,_gfae =_aba .SelectBySize (maxWidth ,maxHeight ,LocSelectIfBoth ,SizeSelectIfLTE );if _gfae !=nil {return nil ,nil ,_a .Wrap (_gfae ,_cgaf ,"");};return _ccgd ,_aba ,nil ;};func (_fac *Bitmap )nextOnPixelLow (_eee ,_dbf ,_bcd ,_eefge ,_dgc int )(_cefcf _de .Point ,_bgce bool ,_adca error ){const _fadf ="B\u0069\u0074\u006d\u0061p.\u006ee\u0078\u0074\u004f\u006e\u0050i\u0078\u0065\u006c\u004c\u006f\u0077";
|
|
var (_dfeb int ;_ggdef byte ;);_egdgc :=_dgc *_bcd ;_acbd :=_egdgc +(_eefge /8);if _ggdef ,_adca =_fac .GetByte (_acbd );_adca !=nil {return _cefcf ,false ,_a .Wrap (_adca ,_fadf ,"\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 _ggdef !=0{_ccdf :=_eefge -(_eefge %8)+7;for _dfeb =_eefge ;_dfeb <=_ccdf &&_dfeb < _eee ;_dfeb ++{if _fac .GetPixel (_dfeb ,_dgc ){_cefcf .X =_dfeb ;_cefcf .Y =_dgc ;return _cefcf ,true ,nil ;};};};_dce :=(_eefge /8)+1;_dfeb =8*_dce ;var _fec int ;
|
|
for _acbd =_egdgc +_dce ;_dfeb < _eee ;_acbd ,_dfeb =_acbd +1,_dfeb +8{if _ggdef ,_adca =_fac .GetByte (_acbd );_adca !=nil {return _cefcf ,false ,_a .Wrap (_adca ,_fadf ,"r\u0065\u0073\u0074\u0020of\u0020t\u0068\u0065\u0020\u006c\u0069n\u0065\u0020\u0062\u0079\u0074\u0065");
|
|
};if _ggdef ==0{continue ;};for _fec =0;_fec < 8&&_dfeb < _eee ;_fec ,_dfeb =_fec +1,_dfeb +1{if _fac .GetPixel (_dfeb ,_dgc ){_cefcf .X =_dfeb ;_cefcf .Y =_dgc ;return _cefcf ,true ,nil ;};};};for _dgeb :=_dgc +1;_dgeb < _dbf ;_dgeb ++{_egdgc =_dgeb *_bcd ;
|
|
for _acbd ,_dfeb =_egdgc ,0;_dfeb < _eee ;_acbd ,_dfeb =_acbd +1,_dfeb +8{if _ggdef ,_adca =_fac .GetByte (_acbd );_adca !=nil {return _cefcf ,false ,_a .Wrap (_adca ,_fadf ,"\u0066o\u006cl\u006f\u0077\u0069\u006e\u0067\u0020\u006c\u0069\u006e\u0065\u0073");
|
|
};if _ggdef ==0{continue ;};for _fec =0;_fec < 8&&_dfeb < _eee ;_fec ,_dfeb =_fec +1,_dfeb +1{if _fac .GetPixel (_dfeb ,_dgeb ){_cefcf .X =_dfeb ;_cefcf .Y =_dgeb ;return _cefcf ,true ,nil ;};};};};return _cefcf ,false ,nil ;};func _bgeg (_ggda *Bitmap ,_faad ,_acdg int ,_bcbb ,_ebga int ,_eddd RasterOperator ){var (_ddbe int ;
|
|
_aafef byte ;_gfdf ,_aacb int ;_fabef int ;);_fedd :=_bcbb >>3;_dcabg :=_bcbb &7;if _dcabg > 0{_aafef =_aagcg [_dcabg ];};_ddbe =_ggda .RowStride *_acdg +(_faad >>3);switch _eddd {case PixClr :for _gfdf =0;_gfdf < _ebga ;_gfdf ++{_fabef =_ddbe +_gfdf *_ggda .RowStride ;
|
|
for _aacb =0;_aacb < _fedd ;_aacb ++{_ggda .Data [_fabef ]=0x0;_fabef ++;};if _dcabg > 0{_ggda .Data [_fabef ]=_cgadc (_ggda .Data [_fabef ],0x0,_aafef );};};case PixSet :for _gfdf =0;_gfdf < _ebga ;_gfdf ++{_fabef =_ddbe +_gfdf *_ggda .RowStride ;for _aacb =0;
|
|
_aacb < _fedd ;_aacb ++{_ggda .Data [_fabef ]=0xff;_fabef ++;};if _dcabg > 0{_ggda .Data [_fabef ]=_cgadc (_ggda .Data [_fabef ],0xff,_aafef );};};case PixNotDst :for _gfdf =0;_gfdf < _ebga ;_gfdf ++{_fabef =_ddbe +_gfdf *_ggda .RowStride ;for _aacb =0;
|
|
_aacb < _fedd ;_aacb ++{_ggda .Data [_fabef ]=^_ggda .Data [_fabef ];_fabef ++;};if _dcabg > 0{_ggda .Data [_fabef ]=_cgadc (_ggda .Data [_fabef ],^_ggda .Data [_fabef ],_aafef );};};};};func (_fbcd *Bitmap )setEightBytes (_gdab int ,_fgbd uint64 )error {_gdgf :=_fbcd .RowStride -(_gdab %_fbcd .RowStride );
|
|
if _fbcd .RowStride !=_fbcd .Width >>3{_gdgf --;};if _gdgf >=8{return _fbcd .setEightFullBytes (_gdab ,_fgbd );};return _fbcd .setEightPartlyBytes (_gdab ,_gdgf ,_fgbd );};func (_fbfad *Bitmaps )makeSizeIndicator (_febaf ,_fded int ,_gffgb LocationFilter ,_ffbe SizeComparison )(_cgafd *_ce .NumSlice ,_eaad error ){const _cefdbg ="\u0042i\u0074\u006d\u0061\u0070s\u002e\u006d\u0061\u006b\u0065S\u0069z\u0065I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";
|
|
if _fbfad ==nil {return nil ,_a .Error (_cefdbg ,"\u0062\u0069\u0074ma\u0070\u0073\u0020\u0027\u0062\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};switch _gffgb {case LocSelectWidth ,LocSelectHeight ,LocSelectIfEither ,LocSelectIfBoth :default:return nil ,_a .Errorf (_cefdbg ,"\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",_gffgb );
|
|
};switch _ffbe {case SizeSelectIfLT ,SizeSelectIfGT ,SizeSelectIfLTE ,SizeSelectIfGTE ,SizeSelectIfEQ :default:return nil ,_a .Errorf (_cefdbg ,"\u0069\u006e\u0076\u0061li\u0064\u0020\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0027\u0025d\u0027",_ffbe );
|
|
};_cgafd =&_ce .NumSlice {};var (_debc ,_dbebd ,_bafa int ;_bbgdd *Bitmap ;);for _ ,_bbgdd =range _fbfad .Values {_debc =0;_dbebd ,_bafa =_bbgdd .Width ,_bbgdd .Height ;switch _gffgb {case LocSelectWidth :if (_ffbe ==SizeSelectIfLT &&_dbebd < _febaf )||(_ffbe ==SizeSelectIfGT &&_dbebd > _febaf )||(_ffbe ==SizeSelectIfLTE &&_dbebd <=_febaf )||(_ffbe ==SizeSelectIfGTE &&_dbebd >=_febaf )||(_ffbe ==SizeSelectIfEQ &&_dbebd ==_febaf ){_debc =1;
|
|
};case LocSelectHeight :if (_ffbe ==SizeSelectIfLT &&_bafa < _fded )||(_ffbe ==SizeSelectIfGT &&_bafa > _fded )||(_ffbe ==SizeSelectIfLTE &&_bafa <=_fded )||(_ffbe ==SizeSelectIfGTE &&_bafa >=_fded )||(_ffbe ==SizeSelectIfEQ &&_bafa ==_fded ){_debc =1;
|
|
};case LocSelectIfEither :if (_ffbe ==SizeSelectIfLT &&(_dbebd < _febaf ||_bafa < _fded ))||(_ffbe ==SizeSelectIfGT &&(_dbebd > _febaf ||_bafa > _fded ))||(_ffbe ==SizeSelectIfLTE &&(_dbebd <=_febaf ||_bafa <=_fded ))||(_ffbe ==SizeSelectIfGTE &&(_dbebd >=_febaf ||_bafa >=_fded ))||(_ffbe ==SizeSelectIfEQ &&(_dbebd ==_febaf ||_bafa ==_fded )){_debc =1;
|
|
};case LocSelectIfBoth :if (_ffbe ==SizeSelectIfLT &&(_dbebd < _febaf &&_bafa < _fded ))||(_ffbe ==SizeSelectIfGT &&(_dbebd > _febaf &&_bafa > _fded ))||(_ffbe ==SizeSelectIfLTE &&(_dbebd <=_febaf &&_bafa <=_fded ))||(_ffbe ==SizeSelectIfGTE &&(_dbebd >=_febaf &&_bafa >=_fded ))||(_ffbe ==SizeSelectIfEQ &&(_dbebd ==_febaf &&_bafa ==_fded )){_debc =1;
|
|
};};_cgafd .AddInt (_debc );};return _cgafd ,nil ;};func TstWSymbol (t *_f .T ,scale ...int )*Bitmap {_faedc ,_fdbgc :=NewWithData (5,5,[]byte {0x88,0x88,0xA8,0xD8,0x88});_ca .NoError (t ,_fdbgc );return TstGetScaledSymbol (t ,_faedc ,scale ...);};func (_acda Points )GetIntY (i int )(int ,error ){if i >=len (_acda ){return 0,_a .Errorf ("\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0065t\u0049\u006e\u0074\u0059","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
};return int (_acda [i ].Y ),nil ;};func (_dgca *Bitmaps )CountPixels ()*_ce .NumSlice {_gcgc :=&_ce .NumSlice {};for _ ,_gfdc :=range _dgca .Values {_gcgc .AddInt (_gfdc .CountPixels ());};return _gcgc ;};func (_geb *Bitmap )setAll ()error {_aga :=_efbg (_geb ,0,0,_geb .Width ,_geb .Height ,PixSet ,nil ,0,0);
|
|
if _aga !=nil {return _a .Wrap (_aga ,"\u0073\u0065\u0074\u0041\u006c\u006c","");};return nil ;};func _cfbae (_ebdg int )int {if _ebdg < 0{return -_ebdg ;};return _ebdg ;};var (_gadb *Bitmap ;_aceca *Bitmap ;);func _fbg ()(_bea []byte ){_bea =make ([]byte ,256);
|
|
for _gfe :=0;_gfe < 256;_gfe ++{_eba :=byte (_gfe );_bea [_eba ]=(_eba &0x01)|((_eba &0x04)>>1)|((_eba &0x10)>>2)|((_eba &0x40)>>3)|((_eba &0x02)<<3)|((_eba &0x08)<<2)|((_eba &0x20)<<1)|(_eba &0x80);};return _bea ;};func TstFrameBitmap ()*Bitmap {return _gadb .Copy ()};
|
|
func RankHausTest (p1 ,p2 ,p3 ,p4 *Bitmap ,delX ,delY float32 ,maxDiffW ,maxDiffH ,area1 ,area3 int ,rank float32 ,tab8 []int )(_dgee bool ,_caeb error ){const _dcea ="\u0052\u0061\u006ek\u0048\u0061\u0075\u0073\u0054\u0065\u0073\u0074";_agfc ,_befa :=p1 .Width ,p1 .Height ;
|
|
_cfbd ,_cdefg :=p3 .Width ,p3 .Height ;if _ce .Abs (_agfc -_cfbd )> maxDiffW {return false ,nil ;};if _ce .Abs (_befa -_cdefg )> maxDiffH {return false ,nil ;};_cggf :=int (float32 (area1 )*(1.0-rank )+0.5);_fefb :=int (float32 (area3 )*(1.0-rank )+0.5);
|
|
var _agda ,_facb int ;if delX >=0{_agda =int (delX +0.5);}else {_agda =int (delX -0.5);};if delY >=0{_facb =int (delY +0.5);}else {_facb =int (delY -0.5);};_fgbg :=p1 .CreateTemplate ();if _caeb =_fgbg .RasterOperation (0,0,_agfc ,_befa ,PixSrc ,p1 ,0,0);
|
|
_caeb !=nil {return false ,_a .Wrap (_caeb ,_dcea ,"p\u0031\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _caeb =_fgbg .RasterOperation (_agda ,_facb ,_agfc ,_befa ,PixNotSrcAndDst ,p4 ,0,0);_caeb !=nil {return false ,_a .Wrap (_caeb ,_dcea ,"\u0074 \u0026\u0020\u0021\u0070\u0034");
|
|
};_dgee ,_caeb =_fgbg .ThresholdPixelSum (_cggf ,tab8 );if _caeb !=nil {return false ,_a .Wrap (_caeb ,_dcea ,"\u0074\u002d\u003e\u0074\u0068\u0072\u0065\u0073\u0068\u0031");};if _dgee {return false ,nil ;};if _caeb =_fgbg .RasterOperation (_agda ,_facb ,_cfbd ,_cdefg ,PixSrc ,p3 ,0,0);
|
|
_caeb !=nil {return false ,_a .Wrap (_caeb ,_dcea ,"p\u0033\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _caeb =_fgbg .RasterOperation (0,0,_cfbd ,_cdefg ,PixNotSrcAndDst ,p2 ,0,0);_caeb !=nil {return false ,_a .Wrap (_caeb ,_dcea ,"\u0074 \u0026\u0020\u0021\u0070\u0032");
|
|
};_dgee ,_caeb =_fgbg .ThresholdPixelSum (_fefb ,tab8 );if _caeb !=nil {return false ,_a .Wrap (_caeb ,_dcea ,"\u0074\u002d\u003e\u0074\u0068\u0072\u0065\u0073\u0068\u0033");};return !_dgee ,nil ;};func TstESymbol (t *_f .T ,scale ...int )*Bitmap {_fgff ,_adce :=NewWithData (4,5,[]byte {0xF0,0x80,0xE0,0x80,0xF0});
|
|
_ca .NoError (t ,_adce );return TstGetScaledSymbol (t ,_fgff ,scale ...);};type MorphProcess struct{Operation MorphOperation ;Arguments []int ;};func CorrelationScoreThresholded (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab ,downcount []int ,scoreThreshold float32 )(bool ,error ){const _aggad ="C\u006f\u0072\u0072\u0065\u006c\u0061t\u0069\u006f\u006e\u0053\u0063\u006f\u0072\u0065\u0054h\u0072\u0065\u0073h\u006fl\u0064\u0065\u0064";
|
|
if bm1 ==nil {return false ,_a .Error (_aggad ,"\u0063\u006f\u0072\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u0053\u0063\u006f\u0072\u0065\u0054\u0068\u0072\u0065\u0073\u0068\u006f\u006cd\u0065\u0064\u0020\u0062\u006d1\u0020\u0069s\u0020\u006e\u0069\u006c");
|
|
};if bm2 ==nil {return false ,_a .Error (_aggad ,"\u0063\u006f\u0072\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u0053\u0063\u006f\u0072\u0065\u0054\u0068\u0072\u0065\u0073\u0068\u006f\u006cd\u0065\u0064\u0020\u0062\u006d2\u0020\u0069s\u0020\u006e\u0069\u006c");
|
|
};if area1 <=0||area2 <=0{return false ,_a .Error (_aggad ,"c\u006f\u0072\u0072\u0065\u006c\u0061\u0074\u0069\u006fn\u0053\u0063\u006f\u0072\u0065\u0054\u0068re\u0073\u0068\u006f\u006cd\u0065\u0064\u0020\u002d\u0020\u0061\u0072\u0065\u0061s \u006d\u0075s\u0074\u0020\u0062\u0065\u0020\u003e\u0020\u0030");
|
|
};if downcount ==nil {return false ,_a .Error (_aggad ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u006f\u0020\u0027\u0064\u006f\u0077\u006e\u0063\u006f\u0075\u006e\u0074\u0027");};if tab ==nil {return false ,_a .Error (_aggad ,"p\u0072\u006f\u0076\u0069de\u0064 \u006e\u0069\u006c\u0020\u0027s\u0075\u006d\u0074\u0061\u0062\u0027");
|
|
};_ecgc ,_ccfb :=bm1 .Width ,bm1 .Height ;_aecc ,_cead :=bm2 .Width ,bm2 .Height ;if _ce .Abs (_ecgc -_aecc )> maxDiffW {return false ,nil ;};if _ce .Abs (_ccfb -_cead )> maxDiffH {return false ,nil ;};_cbe :=int (delX +_ce .Sign (delX )*0.5);_agfb :=int (delY +_ce .Sign (delY )*0.5);
|
|
_bfeb :=int (_bb .Ceil (_bb .Sqrt (float64 (scoreThreshold )*float64 (area1 )*float64 (area2 ))));_cafb :=bm2 .RowStride ;_agdc :=_bbbg (_agfb ,0);_dfcc :=_gce (_cead +_agfb ,_ccfb );_ggad :=bm1 .RowStride *_agdc ;_bdbb :=bm2 .RowStride *(_agdc -_agfb );
|
|
var _cfae int ;if _dfcc <=_ccfb {_cfae =downcount [_dfcc -1];};_bafd :=_bbbg (_cbe ,0);_decb :=_gce (_aecc +_cbe ,_ecgc );var _bfde ,_eagb int ;if _cbe >=8{_bfde =_cbe >>3;_ggad +=_bfde ;_bafd -=_bfde <<3;_decb -=_bfde <<3;_cbe &=7;}else if _cbe <=-8{_eagb =-((_cbe +7)>>3);
|
|
_bdbb +=_eagb ;_cafb -=_eagb ;_cbe +=_eagb <<3;};var (_cefdb ,_eggb ,_eada int ;_bdfe ,_edae ,_abe byte ;);if _bafd >=_decb ||_agdc >=_dfcc {return false ,nil ;};_ffeb :=(_decb +7)>>3;switch {case _cbe ==0:for _eggb =_agdc ;_eggb < _dfcc ;_eggb ,_ggad ,_bdbb =_eggb +1,_ggad +bm1 .RowStride ,_bdbb +bm2 .RowStride {for _eada =0;
|
|
_eada < _ffeb ;_eada ++{_bdfe =bm1 .Data [_ggad +_eada ]&bm2 .Data [_bdbb +_eada ];_cefdb +=tab [_bdfe ];};if _cefdb >=_bfeb {return true ,nil ;};if _bbfa :=_cefdb +downcount [_eggb ]-_cfae ;_bbfa < _bfeb {return false ,nil ;};};case _cbe > 0&&_cafb < _ffeb :for _eggb =_agdc ;
|
|
_eggb < _dfcc ;_eggb ,_ggad ,_bdbb =_eggb +1,_ggad +bm1 .RowStride ,_bdbb +bm2 .RowStride {_edae =bm1 .Data [_ggad ];_abe =bm2 .Data [_bdbb ]>>uint (_cbe );_bdfe =_edae &_abe ;_cefdb +=tab [_bdfe ];for _eada =1;_eada < _cafb ;_eada ++{_edae =bm1 .Data [_ggad +_eada ];
|
|
_abe =bm2 .Data [_bdbb +_eada ]>>uint (_cbe )|bm2 .Data [_bdbb +_eada -1]<<uint (8-_cbe );_bdfe =_edae &_abe ;_cefdb +=tab [_bdfe ];};_edae =bm1 .Data [_ggad +_eada ];_abe =bm2 .Data [_bdbb +_eada -1]<<uint (8-_cbe );_bdfe =_edae &_abe ;_cefdb +=tab [_bdfe ];
|
|
if _cefdb >=_bfeb {return true ,nil ;}else if _cefdb +downcount [_eggb ]-_cfae < _bfeb {return false ,nil ;};};case _cbe > 0&&_cafb >=_ffeb :for _eggb =_agdc ;_eggb < _dfcc ;_eggb ,_ggad ,_bdbb =_eggb +1,_ggad +bm1 .RowStride ,_bdbb +bm2 .RowStride {_edae =bm1 .Data [_ggad ];
|
|
_abe =bm2 .Data [_bdbb ]>>uint (_cbe );_bdfe =_edae &_abe ;_cefdb +=tab [_bdfe ];for _eada =1;_eada < _ffeb ;_eada ++{_edae =bm1 .Data [_ggad +_eada ];_abe =bm2 .Data [_bdbb +_eada ]>>uint (_cbe );_abe |=bm2 .Data [_bdbb +_eada -1]<<uint (8-_cbe );_bdfe =_edae &_abe ;
|
|
_cefdb +=tab [_bdfe ];};if _cefdb >=_bfeb {return true ,nil ;}else if _cefdb +downcount [_eggb ]-_cfae < _bfeb {return false ,nil ;};};case _ffeb < _cafb :for _eggb =_agdc ;_eggb < _dfcc ;_eggb ,_ggad ,_bdbb =_eggb +1,_ggad +bm1 .RowStride ,_bdbb +bm2 .RowStride {for _eada =0;
|
|
_eada < _ffeb ;_eada ++{_edae =bm1 .Data [_ggad +_eada ];_abe =bm2 .Data [_bdbb +_eada ]<<uint (-_cbe );_abe |=bm2 .Data [_bdbb +_eada +1]>>uint (8+_cbe );_bdfe =_edae &_abe ;_cefdb +=tab [_bdfe ];};if _cefdb >=_bfeb {return true ,nil ;}else if _fcde :=_cefdb +downcount [_eggb ]-_cfae ;
|
|
_fcde < _bfeb {return false ,nil ;};};case _cafb >=_ffeb :for _eggb =_agdc ;_eggb < _dfcc ;_eggb ,_ggad ,_bdbb =_eggb +1,_ggad +bm1 .RowStride ,_bdbb +bm2 .RowStride {for _eada =0;_eada < _ffeb ;_eada ++{_edae =bm1 .Data [_ggad +_eada ];_abe =bm2 .Data [_bdbb +_eada ]<<uint (-_cbe );
|
|
_abe |=bm2 .Data [_bdbb +_eada +1]>>uint (8+_cbe );_bdfe =_edae &_abe ;_cefdb +=tab [_bdfe ];};_edae =bm1 .Data [_ggad +_eada ];_abe =bm2 .Data [_bdbb +_eada ]<<uint (-_cbe );_bdfe =_edae &_abe ;_cefdb +=tab [_bdfe ];if _cefdb >=_bfeb {return true ,nil ;
|
|
}else if _cefdb +downcount [_eggb ]-_cfae < _bfeb {return false ,nil ;};};};_beeeb :=float32 (_cefdb )*float32 (_cefdb )/(float32 (area1 )*float32 (area2 ));if _beeeb >=scoreThreshold {_cee .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",_cefdb ,_bfeb ,_beeeb ,scoreThreshold );
|
|
};return false ,nil ;};func (_dcbcc *Boxes )Add (box *_de .Rectangle )error {if _dcbcc ==nil {return _a .Error ("\u0042o\u0078\u0065\u0073\u002e\u0041\u0064d","\u0027\u0042\u006f\u0078es\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};*_dcbcc =append (*_dcbcc ,box );return nil ;};func CombineBytes (oldByte ,newByte byte ,op CombinationOperator )byte {return _dagf (oldByte ,newByte ,op );};func _ceec (_cdgc ,_eggc *Bitmap ,_gecf ,_eeea int )(*Bitmap ,error ){const _gcff ="\u006fp\u0065\u006e\u0042\u0072\u0069\u0063k";
|
|
if _eggc ==nil {return nil ,_a .Error (_gcff ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};if _gecf < 1&&_eeea < 1{return nil ,_a .Error (_gcff ,"\u0068\u0053\u0069\u007ae \u003c\u0020\u0031\u0020\u0026\u0026\u0020\u0076\u0053\u0069\u007a\u0065\u0020\u003c \u0031");
|
|
};if _gecf ==1&&_eeea ==1{return _eggc .Copy (),nil ;};if _gecf ==1||_eeea ==1{var _fbgd error ;_gbbb :=SelCreateBrick (_eeea ,_gecf ,_eeea /2,_gecf /2,SelHit );_cdgc ,_fbgd =_ffae (_cdgc ,_eggc ,_gbbb );if _fbgd !=nil {return nil ,_a .Wrap (_fbgd ,_gcff ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
};return _cdgc ,nil ;};_defb :=SelCreateBrick (1,_gecf ,0,_gecf /2,SelHit );_ffef :=SelCreateBrick (_eeea ,1,_eeea /2,0,SelHit );_gfdg ,_adcf :=_cedcad (nil ,_eggc ,_defb );if _adcf !=nil {return nil ,_a .Wrap (_adcf ,_gcff ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");
|
|
};_cdgc ,_adcf =_cedcad (_cdgc ,_gfdg ,_ffef );if _adcf !=nil {return nil ,_a .Wrap (_adcf ,_gcff ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};_ ,_adcf =_bacca (_gfdg ,_cdgc ,_defb );if _adcf !=nil {return nil ,_a .Wrap (_adcf ,_gcff ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
};_ ,_adcf =_bacca (_cdgc ,_gfdg ,_ffef );if _adcf !=nil {return nil ,_a .Wrap (_adcf ,_gcff ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};return _cdgc ,nil ;};func CorrelationScoreSimple (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab []int )(_gaeb float64 ,_egg error ){const _gbbdd ="\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 _gaeb ,_a .Error (_gbbdd ,"n\u0069l\u0020\u0062\u0069\u0074\u006d\u0061\u0070\u0073 \u0070\u0072\u006f\u0076id\u0065\u0064");};if tab ==nil {return _gaeb ,_a .Error (_gbbdd ,"\u0074\u0061\u0062\u0020\u0075\u006e\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};if area1 ==0||area2 ==0{return _gaeb ,_a .Error (_gbbdd ,"\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064\u0020\u0061\u0072e\u0061\u0073\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065 \u003e\u0020\u0030");};_aeaa ,_ddc :=bm1 .Width ,bm1 .Height ;_bdaf ,_fbcda :=bm2 .Width ,bm2 .Height ;
|
|
if _cfbae (_aeaa -_bdaf )> maxDiffW {return 0,nil ;};if _cfbae (_ddc -_fbcda )> maxDiffH {return 0,nil ;};var _ddaf ,_ggga int ;if delX >=0{_ddaf =int (delX +0.5);}else {_ddaf =int (delX -0.5);};if delY >=0{_ggga =int (delY +0.5);}else {_ggga =int (delY -0.5);
|
|
};_bbce :=bm1 .createTemplate ();if _egg =_bbce .RasterOperation (_ddaf ,_ggga ,_bdaf ,_fbcda ,PixSrc ,bm2 ,0,0);_egg !=nil {return _gaeb ,_a .Wrap (_egg ,_gbbdd ,"\u0062m\u0032 \u0074\u006f\u0020\u0054\u0065\u006d\u0070\u006c\u0061\u0074\u0065");};if _egg =_bbce .RasterOperation (0,0,_aeaa ,_ddc ,PixSrcAndDst ,bm1 ,0,0);
|
|
_egg !=nil {return _gaeb ,_a .Wrap (_egg ,_gbbdd ,"b\u006d\u0031\u0020\u0061\u006e\u0064\u0020\u0062\u006d\u0054");};_ceda :=_bbce .countPixels ();_gaeb =float64 (_ceda )*float64 (_ceda )/(float64 (area1 )*float64 (area2 ));return _gaeb ,nil ;};func _gce (_cccc ,_fgae int )int {if _cccc < _fgae {return _cccc ;
|
|
};return _fgae ;};type BitmapsArray struct{Values []*Bitmaps ;Boxes []*_de .Rectangle ;};func _gfde (_feae *Bitmap ,_ecbg *_ce .Stack ,_cdbg ,_gdea int )(_aafc *_de .Rectangle ,_gbd error ){const _agcg ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";
|
|
if _feae ==nil {return nil ,_a .Error (_agcg ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");};if _ecbg ==nil {return nil ,_a .Error (_agcg ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");
|
|
};_afbed ,_gebf :=_feae .Width ,_feae .Height ;_aefb :=_afbed -1;_fbba :=_gebf -1;if _cdbg < 0||_cdbg > _aefb ||_gdea < 0||_gdea > _fbba ||!_feae .GetPixel (_cdbg ,_gdea ){return nil ,nil ;};var _adf *_de .Rectangle ;_adf ,_gbd =Rect (100000,100000,0,0);
|
|
if _gbd !=nil {return nil ,_a .Wrap (_gbd ,_agcg ,"");};if _gbd =_fafa (_ecbg ,_cdbg ,_cdbg ,_gdea ,1,_fbba ,_adf );_gbd !=nil {return nil ,_a .Wrap (_gbd ,_agcg ,"\u0069\u006e\u0069t\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _gbd =_fafa (_ecbg ,_cdbg ,_cdbg ,_gdea +1,-1,_fbba ,_adf );
|
|
_gbd !=nil {return nil ,_a .Wrap (_gbd ,_agcg ,"\u0032\u006ed\u0020\u0069\u006ei\u0074\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};_adf .Min .X ,_adf .Max .X =_cdbg ,_cdbg ;_adf .Min .Y ,_adf .Max .Y =_gdea ,_gdea ;var (_fcbd *fillSegment ;_faac int ;
|
|
);for _ecbg .Len ()> 0{if _fcbd ,_gbd =_fbeb (_ecbg );_gbd !=nil {return nil ,_a .Wrap (_gbd ,_agcg ,"");};_gdea =_fcbd ._fgdg ;for _cdbg =_fcbd ._bbcdb ;_cdbg >=0&&_feae .GetPixel (_cdbg ,_gdea );_cdbg --{if _gbd =_feae .SetPixel (_cdbg ,_gdea ,0);_gbd !=nil {return nil ,_a .Wrap (_gbd ,_agcg ,"");
|
|
};};if _cdbg >=_fcbd ._bbcdb {for _cdbg ++;_cdbg <=_fcbd ._gadd &&_cdbg <=_aefb &&!_feae .GetPixel (_cdbg ,_gdea );_cdbg ++{};_faac =_cdbg ;if !(_cdbg <=_fcbd ._gadd &&_cdbg <=_aefb ){continue ;};}else {_faac =_cdbg +1;if _faac < _fcbd ._bbcdb -1{if _gbd =_fafa (_ecbg ,_faac ,_fcbd ._bbcdb -1,_fcbd ._fgdg ,-_fcbd ._bbgdc ,_fbba ,_adf );
|
|
_gbd !=nil {return nil ,_a .Wrap (_gbd ,_agcg ,"\u006c\u0065\u0061\u006b\u0020\u006f\u006e\u0020\u006c\u0065\u0066\u0074 \u0073\u0069\u0064\u0065");};};_cdbg =_fcbd ._bbcdb +1;};for {for ;_cdbg <=_aefb &&_feae .GetPixel (_cdbg ,_gdea );_cdbg ++{if _gbd =_feae .SetPixel (_cdbg ,_gdea ,0);
|
|
_gbd !=nil {return nil ,_a .Wrap (_gbd ,_agcg ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _gbd =_fafa (_ecbg ,_faac ,_cdbg -1,_fcbd ._fgdg ,_fcbd ._bbgdc ,_fbba ,_adf );_gbd !=nil {return nil ,_a .Wrap (_gbd ,_agcg ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");
|
|
};if _cdbg > _fcbd ._gadd +1{if _gbd =_fafa (_ecbg ,_fcbd ._gadd +1,_cdbg -1,_fcbd ._fgdg ,-_fcbd ._bbgdc ,_fbba ,_adf );_gbd !=nil {return nil ,_a .Wrap (_gbd ,_agcg ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");
|
|
};};for _cdbg ++;_cdbg <=_fcbd ._gadd &&_cdbg <=_aefb &&!_feae .GetPixel (_cdbg ,_gdea );_cdbg ++{};_faac =_cdbg ;if !(_cdbg <=_fcbd ._gadd &&_cdbg <=_aefb ){break ;};};};_adf .Max .X ++;_adf .Max .Y ++;return _adf ,nil ;};func Dilate (d *Bitmap ,s *Bitmap ,sel *Selection )(*Bitmap ,error ){return _bacca (d ,s ,sel )};
|
|
func (_dafd *Bitmap )SetByte (index int ,v byte )error {if index > len (_dafd .Data )-1||index < 0{return _a .Errorf ("\u0053e\u0074\u0042\u0079\u0074\u0065","\u0069\u006e\u0064\u0065x \u006f\u0075\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u003a\u0020%\u0064",index );
|
|
};_dafd .Data [index ]=v ;return nil ;};var _dfde =[]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 HausTest (p1 ,p2 ,p3 ,p4 *Bitmap ,delX ,delY float32 ,maxDiffW ,maxDiffH int )(bool ,error ){const _fcbb ="\u0048\u0061\u0075\u0073\u0054\u0065\u0073\u0074";_bfge ,_ggb :=p1 .Width ,p1 .Height ;_daacf ,_edeb :=p3 .Width ,p3 .Height ;if _ce .Abs (_bfge -_daacf )> maxDiffW {return false ,nil ;
|
|
};if _ce .Abs (_ggb -_edeb )> maxDiffH {return false ,nil ;};_cadbf :=int (delX +_ce .Sign (delX )*0.5);_gaec :=int (delY +_ce .Sign (delY )*0.5);var _bdfeg error ;_cdfa :=p1 .CreateTemplate ();if _bdfeg =_cdfa .RasterOperation (0,0,_bfge ,_ggb ,PixSrc ,p1 ,0,0);
|
|
_bdfeg !=nil {return false ,_a .Wrap (_bdfeg ,_fcbb ,"p\u0031\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _bdfeg =_cdfa .RasterOperation (_cadbf ,_gaec ,_bfge ,_ggb ,PixNotSrcAndDst ,p4 ,0,0);_bdfeg !=nil {return false ,_a .Wrap (_bdfeg ,_fcbb ,"\u0021p\u0034\u0020\u0026\u0020\u0074");
|
|
};if _cdfa .Zero (){return false ,nil ;};if _bdfeg =_cdfa .RasterOperation (_cadbf ,_gaec ,_daacf ,_edeb ,PixSrc ,p3 ,0,0);_bdfeg !=nil {return false ,_a .Wrap (_bdfeg ,_fcbb ,"p\u0033\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _bdfeg =_cdfa .RasterOperation (0,0,_daacf ,_edeb ,PixNotSrcAndDst ,p2 ,0,0);
|
|
_bdfeg !=nil {return false ,_a .Wrap (_bdfeg ,_fcbb ,"\u0021p\u0032\u0020\u0026\u0020\u0074");};return _cdfa .Zero (),nil ;};func (_bcbd *Boxes )selectWithIndicator (_dbfg *_ce .NumSlice )(_bfa *Boxes ,_befg error ){const _cccdb ="\u0042o\u0078\u0065\u0073\u002es\u0065\u006c\u0065\u0063\u0074W\u0069t\u0068I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";
|
|
if _bcbd ==nil {return nil ,_a .Error (_cccdb ,"b\u006f\u0078\u0065\u0073 '\u0062'\u0020\u006e\u006f\u0074\u0020d\u0065\u0066\u0069\u006e\u0065\u0064");};if _dbfg ==nil {return nil ,_a .Error (_cccdb ,"\u0027\u006ea\u0027\u0020\u006eo\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};if len (*_dbfg )!=len (*_bcbd ){return nil ,_a .Error (_cccdb ,"\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 _bfg ,_ffdf int ;for _cfgd :=0;_cfgd < len (*_dbfg );_cfgd ++{if _bfg ,_befg =_dbfg .GetInt (_cfgd );_befg !=nil {return nil ,_a .Wrap (_befg ,_cccdb ,"\u0063\u0068\u0065\u0063\u006b\u0069\u006e\u0067\u0020c\u006f\u0075\u006e\u0074");};if _bfg ==1{_ffdf ++;
|
|
};};if _ffdf ==len (*_bcbd ){return _bcbd ,nil ;};_eacf :=Boxes {};for _bgfcc :=0;_bgfcc < len (*_dbfg );_bgfcc ++{_bfg =int ((*_dbfg )[_bgfcc ]);if _bfg ==0{continue ;};_eacf =append (_eacf ,(*_bcbd )[_bgfcc ]);};_bfa =&_eacf ;return _bfa ,nil ;};func (_badb *Bitmaps )SortByHeight (){_feafc :=(*byHeight )(_badb );
|
|
_ag .Sort (_feafc )};const (_ SizeSelection =iota ;SizeSelectByWidth ;SizeSelectByHeight ;SizeSelectByMaxDimension ;SizeSelectByArea ;SizeSelectByPerimeter ;);type Bitmap struct{Width ,Height int ;BitmapNumber int ;RowStride int ;Data []byte ;Color Color ;
|
|
Special int ;Text string ;XResolution ,YResolution int ;};func _edgc (_fbdg ,_ggeae *Bitmap ,_cdae ,_geeaf int )(_eaca error ){const _dcee ="\u0073e\u0065d\u0066\u0069\u006c\u006c\u0042i\u006e\u0061r\u0079\u004c\u006f\u0077\u0034";var (_cbga ,_cgggc ,_dcgdg ,_abeaa int ;
|
|
_cfac ,_aadc ,_fgaga ,_bfgab ,_fdda ,_beef ,_feaf byte ;);for _cbga =0;_cbga < _cdae ;_cbga ++{_dcgdg =_cbga *_fbdg .RowStride ;_abeaa =_cbga *_ggeae .RowStride ;for _cgggc =0;_cgggc < _geeaf ;_cgggc ++{_cfac ,_eaca =_fbdg .GetByte (_dcgdg +_cgggc );if _eaca !=nil {return _a .Wrap (_eaca ,_dcee ,"\u0066i\u0072\u0073\u0074\u0020\u0067\u0065t");
|
|
};_aadc ,_eaca =_ggeae .GetByte (_abeaa +_cgggc );if _eaca !=nil {return _a .Wrap (_eaca ,_dcee ,"\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0067\u0065\u0074");};if _cbga > 0{_fgaga ,_eaca =_fbdg .GetByte (_dcgdg -_fbdg .RowStride +_cgggc );if _eaca !=nil {return _a .Wrap (_eaca ,_dcee ,"\u0069\u0020\u003e \u0030");
|
|
};_cfac |=_fgaga ;};if _cgggc > 0{_bfgab ,_eaca =_fbdg .GetByte (_dcgdg +_cgggc -1);if _eaca !=nil {return _a .Wrap (_eaca ,_dcee ,"\u006a\u0020\u003e \u0030");};_cfac |=_bfgab <<7;};_cfac &=_aadc ;if _cfac ==0||(^_cfac )==0{if _eaca =_fbdg .SetByte (_dcgdg +_cgggc ,_cfac );
|
|
_eaca !=nil {return _a .Wrap (_eaca ,_dcee ,"b\u0074\u0020\u003d\u003d 0\u0020|\u007c\u0020\u0028\u005e\u0062t\u0029\u0020\u003d\u003d\u0020\u0030");};continue ;};for {_feaf =_cfac ;_cfac =(_cfac |(_cfac >>1)|(_cfac <<1))&_aadc ;if (_cfac ^_feaf )==0{if _eaca =_fbdg .SetByte (_dcgdg +_cgggc ,_cfac );
|
|
_eaca !=nil {return _a .Wrap (_eaca ,_dcee ,"\u0073\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u0070\u0072\u0065\u0076 \u0062\u0079\u0074\u0065");};break ;};};};};for _cbga =_cdae -1;_cbga >=0;_cbga --{_dcgdg =_cbga *_fbdg .RowStride ;_abeaa =_cbga *_ggeae .RowStride ;
|
|
for _cgggc =_geeaf -1;_cgggc >=0;_cgggc --{if _cfac ,_eaca =_fbdg .GetByte (_dcgdg +_cgggc );_eaca !=nil {return _a .Wrap (_eaca ,_dcee ,"\u0072\u0065\u0076\u0065\u0072\u0073\u0065\u0020\u0066\u0069\u0072\u0073t\u0020\u0067\u0065\u0074");};if _aadc ,_eaca =_ggeae .GetByte (_abeaa +_cgggc );
|
|
_eaca !=nil {return _a .Wrap (_eaca ,_dcee ,"r\u0065\u0076\u0065\u0072se\u0020g\u0065\u0074\u0020\u006d\u0061s\u006b\u0020\u0062\u0079\u0074\u0065");};if _cbga < _cdae -1{if _fdda ,_eaca =_fbdg .GetByte (_dcgdg +_fbdg .RowStride +_cgggc );_eaca !=nil {return _a .Wrap (_eaca ,_dcee ,"\u0072\u0065v\u0065\u0072\u0073e\u0020\u0069\u0020\u003c\u0020\u0068\u0020\u002d\u0031");
|
|
};_cfac |=_fdda ;};if _cgggc < _geeaf -1{if _beef ,_eaca =_fbdg .GetByte (_dcgdg +_cgggc +1);_eaca !=nil {return _a .Wrap (_eaca ,_dcee ,"\u0072\u0065\u0076\u0065rs\u0065\u0020\u006a\u0020\u003c\u0020\u0077\u0070\u006c\u0020\u002d\u0020\u0031");};_cfac |=_beef >>7;
|
|
};_cfac &=_aadc ;if _cfac ==0||(^_cfac )==0{if _eaca =_fbdg .SetByte (_dcgdg +_cgggc ,_cfac );_eaca !=nil {return _a .Wrap (_eaca ,_dcee ,"\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 {_feaf =_cfac ;_cfac =(_cfac |(_cfac >>1)|(_cfac <<1))&_aadc ;if (_cfac ^_feaf )==0{if _eaca =_fbdg .SetByte (_dcgdg +_cgggc ,_cfac );_eaca !=nil {return _a .Wrap (_eaca ,_dcee ,"\u0072e\u0076\u0065\u0072\u0073e\u0020\u0073\u0065\u0074\u0074i\u006eg\u0020p\u0072\u0065\u0076\u0020\u0062\u0079\u0074e");
|
|
};break ;};};};};return nil ;};func _dbga (_bbgb ,_cggc *Bitmap ,_fdca *Selection )(*Bitmap ,error ){const _fefdg ="c\u006c\u006f\u0073\u0065\u0042\u0069\u0074\u006d\u0061\u0070";var _beae error ;if _bbgb ,_beae =_fca (_bbgb ,_cggc ,_fdca );_beae !=nil {return nil ,_beae ;
|
|
};_bffd ,_beae :=_bacca (nil ,_cggc ,_fdca );if _beae !=nil {return nil ,_a .Wrap (_beae ,_fefdg ,"");};if _ ,_beae =_cedcad (_bbgb ,_bffd ,_fdca );_beae !=nil {return nil ,_a .Wrap (_beae ,_fefdg ,"");};return _bbgb ,nil ;};func (_gec *Bitmap )GetUnpaddedData ()([]byte ,error ){_cceb :=uint (_gec .Width &0x07);
|
|
if _cceb ==0{return _gec .Data ,nil ;};_gdda :=_gec .Width *_gec .Height ;if _gdda %8!=0{_gdda >>=3;_gdda ++;}else {_gdda >>=3;};_gcfe :=make ([]byte ,_gdda );_bfda :=_g .NewWriterMSB (_gcfe );const _eaa ="\u0047e\u0074U\u006e\u0070\u0061\u0064\u0064\u0065\u0064\u0044\u0061\u0074\u0061";
|
|
for _ddgf :=0;_ddgf < _gec .Height ;_ddgf ++{for _bba :=0;_bba < _gec .RowStride ;_bba ++{_bdg :=_gec .Data [_ddgf *_gec .RowStride +_bba ];if _bba !=_gec .RowStride -1{_bacc :=_bfda .WriteByte (_bdg );if _bacc !=nil {return nil ,_a .Wrap (_bacc ,_eaa ,"");
|
|
};continue ;};for _geed :=uint (0);_geed < _cceb ;_geed ++{_ffga :=_bfda .WriteBit (int (_bdg >>(7-_geed )&0x01));if _ffga !=nil {return nil ,_a .Wrap (_ffga ,_eaa ,"");};};};};return _gcfe ,nil ;};func TstOSymbol (t *_f .T ,scale ...int )*Bitmap {_ffebc ,_ddfca :=NewWithData (4,5,[]byte {0xF0,0x90,0x90,0x90,0xF0});
|
|
_ca .NoError (t ,_ddfca );return TstGetScaledSymbol (t ,_ffebc ,scale ...);};func (_bdcc *Bitmap )RemoveBorder (borderSize int )(*Bitmap ,error ){if borderSize ==0{return _bdcc .Copy (),nil ;};_beecb ,_abc :=_bdcc .removeBorderGeneral (borderSize ,borderSize ,borderSize ,borderSize );
|
|
if _abc !=nil {return nil ,_a .Wrap (_abc ,"\u0052\u0065\u006do\u0076\u0065\u0042\u006f\u0072\u0064\u0065\u0072","");};return _beecb ,nil ;};func (_efag *Bitmap )GetByteIndex (x ,y int )int {return y *_efag .RowStride +(x >>3)};func MakePixelCentroidTab8 ()[]int {return _beaf ()};
|
|
func _fbeb (_aabce *_ce .Stack )(_cgadb *fillSegment ,_bab error ){const _gfbf ="\u0070\u006f\u0070\u0046\u0069\u006c\u006c\u0053\u0065g\u006d\u0065\u006e\u0074";if _aabce ==nil {return nil ,_a .Error (_gfbf ,"\u006ei\u006c \u0073\u0074\u0061\u0063\u006b \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");
|
|
};if _aabce .Aux ==nil {return nil ,_a .Error (_gfbf ,"a\u0075x\u0053\u0074\u0061\u0063\u006b\u0020\u006e\u006ft\u0020\u0064\u0065\u0066in\u0065\u0064");};_fcdc ,_dgcd :=_aabce .Pop ();if !_dgcd {return nil ,nil ;};_eca ,_dgcd :=_fcdc .(*fillSegment );
|
|
if !_dgcd {return nil ,_a .Error (_gfbf ,"\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");};_cgadb =&fillSegment {_eca ._bbcdb ,_eca ._gadd ,_eca ._fgdg +_eca ._bbgdc ,_eca ._bbgdc };
|
|
_aabce .Aux .Push (_eca );return _cgadb ,nil ;};func (_cafe *BitmapsArray )GetBitmaps (i int )(*Bitmaps ,error ){const _acbff ="\u0042\u0069\u0074ma\u0070\u0073\u0041\u0072\u0072\u0061\u0079\u002e\u0047\u0065\u0074\u0042\u0069\u0074\u006d\u0061\u0070\u0073";
|
|
if _cafe ==nil {return nil ,_a .Error (_acbff ,"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 (_cafe .Values )-1{return nil ,_a .Errorf (_acbff ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
};return _cafe .Values [i ],nil ;};func _bfec (_eddg ,_gcag ,_ddbg *Bitmap )(*Bitmap ,error ){const _fceb ="\u0062\u0069\u0074\u006d\u0061\u0070\u002e\u0078\u006f\u0072";if _gcag ==nil {return nil ,_a .Error (_fceb ,"'\u0062\u0031\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");
|
|
};if _ddbg ==nil {return nil ,_a .Error (_fceb ,"'\u0062\u0032\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _eddg ==_ddbg {return nil ,_a .Error (_fceb ,"'\u0064\u0027\u0020\u003d\u003d\u0020\u0027\u0062\u0032\u0027");};if !_gcag .SizesEqual (_ddbg ){_cee .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",_fceb );
|
|
};var _bbge error ;if _eddg ,_bbge =_abdb (_eddg ,_gcag );_bbge !=nil {return nil ,_a .Wrap (_bbge ,_fceb ,"\u0063\u0061n\u0027\u0074\u0020c\u0072\u0065\u0061\u0074\u0065\u0020\u0027\u0064\u0027");};if _bbge =_eddg .RasterOperation (0,0,_eddg .Width ,_eddg .Height ,PixSrcXorDst ,_ddbg ,0,0);
|
|
_bbge !=nil {return nil ,_a .Wrap (_bbge ,_fceb ,"");};return _eddg ,nil ;};func init (){const _ccbf ="\u0062\u0069\u0074\u006dap\u0073\u002e\u0069\u006e\u0069\u0074\u0069\u0061\u006c\u0069\u007a\u0061\u0074\u0069o\u006e";_gadb =New (50,40);var _gcaca error ;
|
|
_gadb ,_gcaca =_gadb .AddBorder (2,1);if _gcaca !=nil {panic (_a .Wrap (_gcaca ,_ccbf ,"f\u0072\u0061\u006d\u0065\u0042\u0069\u0074\u006d\u0061\u0070"));};_aceca ,_gcaca =NewWithData (50,22,_dfde );if _gcaca !=nil {panic (_a .Wrap (_gcaca ,_ccbf ,"i\u006d\u0061\u0067\u0065\u0042\u0069\u0074\u006d\u0061\u0070"));
|
|
};};const (_ SizeComparison =iota ;SizeSelectIfLT ;SizeSelectIfGT ;SizeSelectIfLTE ;SizeSelectIfGTE ;SizeSelectIfEQ ;);type RasterOperator int ;func _fgd (_afc *Bitmap ,_feef ...int )(_cfc *Bitmap ,_gca error ){const _ab ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0043\u0061\u0073\u0063\u0061\u0064\u0065";
|
|
if _afc ==nil {return nil ,_a .Error (_ab ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};if len (_feef )==0||len (_feef )> 4{return nil ,_a .Error (_ab ,"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 _feef [0]<=0{_cee .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");_cfc ,_gca =_abdb (nil ,_afc );if _gca !=nil {return nil ,_a .Wrap (_gca ,_ab ,"l\u0065\u0076\u0065\u006c\u0031\u0020\u003c\u003d\u0020\u0030");
|
|
};return _cfc ,nil ;};_bcaf :=_fbg ();_cfc =_afc ;for _bgf ,_bdc :=range _feef {if _bdc <=0{break ;};_cfc ,_gca =_cef (_cfc ,_bdc ,_bcaf );if _gca !=nil {return nil ,_a .Wrapf (_gca ,_ab ,"\u006c\u0065\u0076\u0065\u006c\u0025\u0064\u0020\u0072\u0065\u0064\u0075c\u0074\u0069\u006f\u006e",_bgf );
|
|
};};return _cfc ,nil ;};func _ffae (_bdbg ,_gbcbb *Bitmap ,_bfgf *Selection )(*Bitmap ,error ){const _bfecc ="\u006f\u0070\u0065\u006e";var _cffd error ;_bdbg ,_cffd =_fca (_bdbg ,_gbcbb ,_bfgf );if _cffd !=nil {return nil ,_a .Wrap (_cffd ,_bfecc ,"");
|
|
};_bfeccb ,_cffd :=_cedcad (nil ,_gbcbb ,_bfgf );if _cffd !=nil {return nil ,_a .Wrap (_cffd ,_bfecc ,"");};_ ,_cffd =_bacca (_bdbg ,_bfeccb ,_bfgf );if _cffd !=nil {return nil ,_a .Wrap (_cffd ,_bfecc ,"");};return _bdbg ,nil ;};func (_bgfc *Bitmap )createTemplate ()*Bitmap {return &Bitmap {Width :_bgfc .Width ,Height :_bgfc .Height ,RowStride :_bgfc .RowStride ,Color :_bgfc .Color ,Text :_bgfc .Text ,BitmapNumber :_bgfc .BitmapNumber ,Special :_bgfc .Special ,Data :make ([]byte ,len (_bgfc .Data ))};
|
|
};type BoundaryCondition int ;const (ComponentConn Component =iota ;ComponentCharacters ;ComponentWords ;);func _bbee (_bfb ...MorphProcess )(_ebda error ){const _agbbb ="v\u0065r\u0069\u0066\u0079\u004d\u006f\u0072\u0070\u0068P\u0072\u006f\u0063\u0065ss\u0065\u0073";
|
|
var _cfcd ,_ddfb int ;for _efb ,_fcba :=range _bfb {if _ebda =_fcba .verify (_efb ,&_cfcd ,&_ddfb );_ebda !=nil {return _a .Wrap (_ebda ,_agbbb ,"");};};if _ddfb !=0&&_cfcd !=0{return _a .Error (_agbbb ,"\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 _fead (_bdccb ,_cdgg *Bitmap ,_bfab ,_becb ,_cdbd uint ,_dfgc ,_aabe int ,_gcagd bool ,_acgaa ,_bcbe int )error {for _fbcc :=_dfgc ;_fbcc < _aabe ;_fbcc ++{if _acgaa +1< len (_bdccb .Data ){_aaae :=_fbcc +1==_aabe ;_cbc ,_cedca :=_bdccb .GetByte (_acgaa );
|
|
if _cedca !=nil {return _cedca ;};_acgaa ++;_cbc <<=_bfab ;_dbca ,_cedca :=_bdccb .GetByte (_acgaa );if _cedca !=nil {return _cedca ;};_dbca >>=_becb ;_cfd :=_cbc |_dbca ;if _aaae &&!_gcagd {_cfd =_cdeb (_cdbd ,_cfd );};_cedca =_cdgg .SetByte (_bcbe ,_cfd );
|
|
if _cedca !=nil {return _cedca ;};_bcbe ++;if _aaae &&_gcagd {_cfcc ,_abga :=_bdccb .GetByte (_acgaa );if _abga !=nil {return _abga ;};_cfcc <<=_bfab ;_cfd =_cdeb (_cdbd ,_cfcc );if _abga =_cdgg .SetByte (_bcbe ,_cfd );_abga !=nil {return _abga ;};};continue ;
|
|
};_edga ,_baeb :=_bdccb .GetByte (_acgaa );if _baeb !=nil {_cee .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",_acgaa ,_baeb );
|
|
return _baeb ;};_edga <<=_bfab ;_acgaa ++;_baeb =_cdgg .SetByte (_bcbe ,_edga );if _baeb !=nil {return _baeb ;};_bcbe ++;};return nil ;};func _dc (_ae ,_ge *Bitmap )(_ba error ){const _gc ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0032";
|
|
_gg :=_ge .RowStride ;_cg :=_ae .RowStride ;var (_cd byte ;_e uint16 ;_cb ,_fg ,_gb ,_da ,_ff int ;);for _gb =0;_gb < _ge .Height ;_gb ++{_cb =_gb *_gg ;_fg =2*_gb *_cg ;for _da =0;_da < _gg ;_da ++{_cd =_ge .Data [_cb +_da ];_e =_bagc [_cd ];_ff =_fg +_da *2;
|
|
if _ae .RowStride !=_ge .RowStride *2&&(_da +1)*2> _ae .RowStride {_ba =_ae .SetByte (_ff ,byte (_e >>8));}else {_ba =_ae .setTwoBytes (_ff ,_e );};if _ba !=nil {return _a .Wrap (_ba ,_gc ,"");};};for _da =0;_da < _cg ;_da ++{_ff =_fg +_cg +_da ;_cd =_ae .Data [_fg +_da ];
|
|
if _ba =_ae .SetByte (_ff ,_cd );_ba !=nil {return _a .Wrapf (_ba ,_gc ,"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",_fg +_da ,_fg +_cg +_da );
|
|
};};};return nil ;};func (_cbca *Bitmaps )AddBox (box *_de .Rectangle ){_cbca .Boxes =append (_cbca .Boxes ,box )};func (_gfbd *byHeight )Len ()int {return len (_gfbd .Values )};func (_ebbe *Bitmap )SetDefaultPixel (){for _ccge :=range _ebbe .Data {_ebbe .Data [_ccge ]=byte (0xff);
|
|
};};func _ebae (_gfaa ,_cgd *Bitmap ,_ggfe ,_bbfd ,_bcfg ,_cccg ,_ggdg int ,_dff CombinationOperator )error {var _efdfa int ;_cbf :=func (){_efdfa ++;_bcfg +=_cgd .RowStride ;_cccg +=_gfaa .RowStride ;_ggdg +=_gfaa .RowStride };for _efdfa =_ggfe ;_efdfa < _bbfd ;
|
|
_cbf (){_bfdb :=_bcfg ;for _efe :=_cccg ;_efe <=_ggdg ;_efe ++{_cdda ,_fddd :=_cgd .GetByte (_bfdb );if _fddd !=nil {return _fddd ;};_ddd ,_fddd :=_gfaa .GetByte (_efe );if _fddd !=nil {return _fddd ;};if _fddd =_cgd .SetByte (_bfdb ,_dagf (_cdda ,_ddd ,_dff ));
|
|
_fddd !=nil {return _fddd ;};_bfdb ++;};};return nil ;};func (_dgdff *BitmapsArray )AddBox (box *_de .Rectangle ){_dgdff .Boxes =append (_dgdff .Boxes ,box )};func _dadc (_adgg *Bitmap ,_aaega ...MorphProcess )(_bacg *Bitmap ,_dffb error ){const _cfbe ="\u006d\u006f\u0072\u0070\u0068\u0053\u0065\u0071\u0075\u0065\u006e\u0063\u0065";
|
|
if _adgg ==nil {return nil ,_a .Error (_cfbe ,"\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 (_aaega )==0{return nil ,_a .Error (_cfbe ,"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 _dffb =_bbee (_aaega ...);
|
|
_dffb !=nil {return nil ,_a .Wrap (_dffb ,_cfbe ,"");};var _aaegf ,_ffaf ,_bbec int ;_bacg =_adgg .Copy ();for _ ,_ccfc :=range _aaega {switch _ccfc .Operation {case MopDilation :_aaegf ,_ffaf =_ccfc .getWidthHeight ();_bacg ,_dffb =DilateBrick (nil ,_bacg ,_aaegf ,_ffaf );
|
|
if _dffb !=nil {return nil ,_a .Wrap (_dffb ,_cfbe ,"");};case MopErosion :_aaegf ,_ffaf =_ccfc .getWidthHeight ();_bacg ,_dffb =_fefe (nil ,_bacg ,_aaegf ,_ffaf );if _dffb !=nil {return nil ,_a .Wrap (_dffb ,_cfbe ,"");};case MopOpening :_aaegf ,_ffaf =_ccfc .getWidthHeight ();
|
|
_bacg ,_dffb =_ceec (nil ,_bacg ,_aaegf ,_ffaf );if _dffb !=nil {return nil ,_a .Wrap (_dffb ,_cfbe ,"");};case MopClosing :_aaegf ,_ffaf =_ccfc .getWidthHeight ();_bacg ,_dffb =_gagff (nil ,_bacg ,_aaegf ,_ffaf );if _dffb !=nil {return nil ,_a .Wrap (_dffb ,_cfbe ,"");
|
|
};case MopRankBinaryReduction :_bacg ,_dffb =_fgd (_bacg ,_ccfc .Arguments ...);if _dffb !=nil {return nil ,_a .Wrap (_dffb ,_cfbe ,"");};case MopReplicativeBinaryExpansion :_bacg ,_dffb =_efge (_bacg ,_ccfc .Arguments [0]);if _dffb !=nil {return nil ,_a .Wrap (_dffb ,_cfbe ,"");
|
|
};case MopAddBorder :_bbec =_ccfc .Arguments [0];_bacg ,_dffb =_bacg .AddBorder (_bbec ,0);if _dffb !=nil {return nil ,_a .Wrap (_dffb ,_cfbe ,"");};default:return nil ,_a .Error (_cfbe ,"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 _bbec > 0{_bacg ,_dffb =_bacg .RemoveBorder (_bbec );if _dffb !=nil {return nil ,_a .Wrap (_dffb ,_cfbe ,"\u0062\u006f\u0072\u0064\u0065\u0072\u0020\u003e\u0020\u0030");};};return _bacg ,nil ;};func _fca (_cacb ,_abea *Bitmap ,_gbag *Selection )(*Bitmap ,error ){const _dba ="\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u004d\u006f\u0072\u0070\u0068A\u0072\u0067\u0073\u0032";
|
|
var _bedb ,_aegg int ;if _abea ==nil {return nil ,_a .Error (_dba ,"s\u006fu\u0072\u0063\u0065\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");};if _gbag ==nil {return nil ,_a .Error (_dba ,"\u0073e\u006c \u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
};_bedb =_gbag .Width ;_aegg =_gbag .Height ;if _bedb ==0||_aegg ==0{return nil ,_a .Error (_dba ,"\u0073\u0065\u006c\u0020\u006f\u0066\u0020\u0073\u0069\u007a\u0065\u0020\u0030");};if _cacb ==nil {return _abea .createTemplate (),nil ;};if _bfecg :=_cacb .resizeImageData (_abea );
|
|
_bfecg !=nil {return nil ,_bfecg ;};return _cacb ,nil ;};func (_fcbf *ClassedPoints )xSortFunction ()func (_eecc int ,_fdff int )bool {return func (_ccbg ,_fbfc int )bool {return _fcbf .XAtIndex (_ccbg )< _fcbf .XAtIndex (_fbfc )};};func (_gdfc *ClassedPoints )YAtIndex (i int )float32 {return (*_gdfc .Points )[_gdfc .IntSlice [i ]].Y };
|
|
func _ggg (_fc *Bitmap ,_bge ,_cfb int )(*Bitmap ,error ){const _gd ="e\u0078\u0070\u0061\u006edB\u0069n\u0061\u0072\u0079\u0052\u0065p\u006c\u0069\u0063\u0061\u0074\u0065";if _fc ==nil {return nil ,_a .Error (_gd ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
};if _bge <=0||_cfb <=0{return nil ,_a .Error (_gd ,"\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 _bge ==_cfb {if _bge ==1{_dgg ,_eb :=_abdb (nil ,_fc );
|
|
if _eb !=nil {return nil ,_a .Wrap (_eb ,_gd ,"\u0078\u0046\u0061\u0063\u0074\u0020\u003d\u003d\u0020y\u0046\u0061\u0063\u0074");};return _dgg ,nil ;};if _bge ==2||_bge ==4||_bge ==8{_bacf ,_bec :=_dg (_fc ,_bge );if _bec !=nil {return nil ,_a .Wrap (_bec ,_gd ,"\u0078\u0046a\u0063\u0074\u0020i\u006e\u0020\u007b\u0032\u002c\u0034\u002c\u0038\u007d");
|
|
};return _bacf ,nil ;};};_gbc :=_bge *_fc .Width ;_cag :=_cfb *_fc .Height ;_cdb :=New (_gbc ,_cag );_ebb :=_cdb .RowStride ;var (_dge ,_acf ,_dgd ,_bf ,_bfd int ;_cec byte ;_bd error ;);for _acf =0;_acf < _fc .Height ;_acf ++{_dge =_cfb *_acf *_ebb ;for _dgd =0;
|
|
_dgd < _fc .Width ;_dgd ++{if _eac :=_fc .GetPixel (_dgd ,_acf );_eac {_bfd =_bge *_dgd ;for _bf =0;_bf < _bge ;_bf ++{_cdb .setBit (_dge *8+_bfd +_bf );};};};for _bf =1;_bf < _cfb ;_bf ++{_dga :=_dge +_bf *_ebb ;for _bag :=0;_bag < _ebb ;_bag ++{if _cec ,_bd =_cdb .GetByte (_dge +_bag );
|
|
_bd !=nil {return nil ,_a .Wrapf (_bd ,_gd ,"\u0072\u0065\u0070\u006cic\u0061\u0074\u0069\u006e\u0067\u0020\u006c\u0069\u006e\u0065\u003a\u0020\u0027\u0025d\u0027",_bf );};if _bd =_cdb .SetByte (_dga +_bag ,_cec );_bd !=nil {return nil ,_a .Wrap (_bd ,_gd ,"\u0053\u0065\u0074\u0074in\u0067\u0020\u0062\u0079\u0074\u0065\u0020\u0066\u0061\u0069\u006c\u0065\u0064");
|
|
};};};};return _cdb ,nil ;};func (_ccff Points )YSorter ()func (_fbfd ,_abdc int )bool {return func (_cddb ,_bebf int )bool {return _ccff [_cddb ].Y < _ccff [_bebf ].Y };};func (_gbce *Bitmap )setFourBytes (_ecg int ,_gcdb uint32 )error {if _ecg +3> len (_gbce .Data )-1{return _a .Errorf ("\u0073\u0065\u0074F\u006f\u0075\u0072\u0042\u0079\u0074\u0065\u0073","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",_ecg );
|
|
};_gbce .Data [_ecg ]=byte ((_gcdb &0xff000000)>>24);_gbce .Data [_ecg +1]=byte ((_gcdb &0xff0000)>>16);_gbce .Data [_ecg +2]=byte ((_gcdb &0xff00)>>8);_gbce .Data [_ecg +3]=byte (_gcdb &0xff);return nil ;}; |