2020-08-27 21:45:09 +00:00
|
|
|
//
|
|
|
|
// Copyright 2020 FoxyUtils ehf. All rights reserved.
|
|
|
|
//
|
|
|
|
// This is a commercial product and requires a license to operate.
|
|
|
|
// A trial license can be obtained at https://unidoc.io
|
|
|
|
//
|
|
|
|
// DO NOT EDIT: generated by unitwist Go source code obfuscator.
|
|
|
|
//
|
|
|
|
// Use of this source code is governed by the UniDoc End User License Agreement
|
|
|
|
// terms that can be accessed at https://unidoc.io/eula/
|
|
|
|
|
2021-04-17 13:46:54 +00:00
|
|
|
package bitmap ;import (_a "encoding/binary";_df "github.com/stretchr/testify/require";_dd "github.com/unidoc/unipdf/v3/common";_gcb "github.com/unidoc/unipdf/v3/internal/bitwise";_dg "github.com/unidoc/unipdf/v3/internal/imageutil";_gc "github.com/unidoc/unipdf/v3/internal/jbig2/basic";
|
|
|
|
_d "github.com/unidoc/unipdf/v3/internal/jbig2/errors";_dc "image";_de "math";_ge "sort";_f "strings";_g "testing";);func _eaef (_geedg ,_cdgdg *Bitmap ,_eagg *Selection )(*Bitmap ,error ){const _eebf ="\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u004d\u006f\u0072\u0070\u0068A\u0072\u0067\u0073\u0032";
|
|
|
|
var _edbg ,_bgfbc int ;if _cdgdg ==nil {return nil ,_d .Error (_eebf ,"s\u006fu\u0072\u0063\u0065\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");};if _eagg ==nil {return nil ,_d .Error (_eebf ,"\u0073e\u006c \u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
|
|
};_edbg =_eagg .Width ;_bgfbc =_eagg .Height ;if _edbg ==0||_bgfbc ==0{return nil ,_d .Error (_eebf ,"\u0073\u0065\u006c\u0020\u006f\u0066\u0020\u0073\u0069\u007a\u0065\u0020\u0030");};if _geedg ==nil {return _cdgdg .createTemplate (),nil ;};if _adfe :=_geedg .resizeImageData (_cdgdg );
|
|
|
|
_adfe !=nil {return nil ,_adfe ;};return _geedg ,nil ;};func (_afdd *Boxes )makeSizeIndicator (_ceec ,_fgca int ,_ccabe LocationFilter ,_bfd SizeComparison )*_gc .NumSlice {_gbfe :=&_gc .NumSlice {};var _dggg ,_dab ,_efec int ;for _ ,_cadf :=range *_afdd {_dggg =0;
|
|
|
|
_dab ,_efec =_cadf .Dx (),_cadf .Dy ();switch _ccabe {case LocSelectWidth :if (_bfd ==SizeSelectIfLT &&_dab < _ceec )||(_bfd ==SizeSelectIfGT &&_dab > _ceec )||(_bfd ==SizeSelectIfLTE &&_dab <=_ceec )||(_bfd ==SizeSelectIfGTE &&_dab >=_ceec ){_dggg =1;
|
|
|
|
};case LocSelectHeight :if (_bfd ==SizeSelectIfLT &&_efec < _fgca )||(_bfd ==SizeSelectIfGT &&_efec > _fgca )||(_bfd ==SizeSelectIfLTE &&_efec <=_fgca )||(_bfd ==SizeSelectIfGTE &&_efec >=_fgca ){_dggg =1;};case LocSelectIfEither :if (_bfd ==SizeSelectIfLT &&(_efec < _fgca ||_dab < _ceec ))||(_bfd ==SizeSelectIfGT &&(_efec > _fgca ||_dab > _ceec ))||(_bfd ==SizeSelectIfLTE &&(_efec <=_fgca ||_dab <=_ceec ))||(_bfd ==SizeSelectIfGTE &&(_efec >=_fgca ||_dab >=_ceec )){_dggg =1;
|
|
|
|
};case LocSelectIfBoth :if (_bfd ==SizeSelectIfLT &&(_efec < _fgca &&_dab < _ceec ))||(_bfd ==SizeSelectIfGT &&(_efec > _fgca &&_dab > _ceec ))||(_bfd ==SizeSelectIfLTE &&(_efec <=_fgca &&_dab <=_ceec ))||(_bfd ==SizeSelectIfGTE &&(_efec >=_fgca &&_dab >=_ceec )){_dggg =1;
|
|
|
|
};};_gbfe .AddInt (_dggg );};return _gbfe ;};func _ebb (_cced *Bitmap ,_dddd ,_bcbgf ,_fdeg ,_dbdg int ,_dca RasterOperator ,_aegb *Bitmap ,_dfdc ,_acfc int )error {var (_bcgda byte ;_aage int ;_bebc int ;_eaddf ,_gaca int ;_agaa ,_feecg int ;);_gaac :=_fdeg >>3;
|
|
|
|
_babb :=_fdeg &7;if _babb > 0{_bcgda =_gbcf [_babb ];};_aage =_aegb .RowStride *_acfc +(_dfdc >>3);_bebc =_cced .RowStride *_bcbgf +(_dddd >>3);switch _dca {case PixSrc :for _agaa =0;_agaa < _dbdg ;_agaa ++{_eaddf =_aage +_agaa *_aegb .RowStride ;_gaca =_bebc +_agaa *_cced .RowStride ;
|
|
|
|
for _feecg =0;_feecg < _gaac ;_feecg ++{_cced .Data [_gaca ]=_aegb .Data [_eaddf ];_gaca ++;_eaddf ++;};if _babb > 0{_cced .Data [_gaca ]=_ggad (_cced .Data [_gaca ],_aegb .Data [_eaddf ],_bcgda );};};case PixNotSrc :for _agaa =0;_agaa < _dbdg ;_agaa ++{_eaddf =_aage +_agaa *_aegb .RowStride ;
|
|
|
|
_gaca =_bebc +_agaa *_cced .RowStride ;for _feecg =0;_feecg < _gaac ;_feecg ++{_cced .Data [_gaca ]=^(_aegb .Data [_eaddf ]);_gaca ++;_eaddf ++;};if _babb > 0{_cced .Data [_gaca ]=_ggad (_cced .Data [_gaca ],^_aegb .Data [_eaddf ],_bcgda );};};case PixSrcOrDst :for _agaa =0;
|
|
|
|
_agaa < _dbdg ;_agaa ++{_eaddf =_aage +_agaa *_aegb .RowStride ;_gaca =_bebc +_agaa *_cced .RowStride ;for _feecg =0;_feecg < _gaac ;_feecg ++{_cced .Data [_gaca ]|=_aegb .Data [_eaddf ];_gaca ++;_eaddf ++;};if _babb > 0{_cced .Data [_gaca ]=_ggad (_cced .Data [_gaca ],_aegb .Data [_eaddf ]|_cced .Data [_gaca ],_bcgda );
|
|
|
|
};};case PixSrcAndDst :for _agaa =0;_agaa < _dbdg ;_agaa ++{_eaddf =_aage +_agaa *_aegb .RowStride ;_gaca =_bebc +_agaa *_cced .RowStride ;for _feecg =0;_feecg < _gaac ;_feecg ++{_cced .Data [_gaca ]&=_aegb .Data [_eaddf ];_gaca ++;_eaddf ++;};if _babb > 0{_cced .Data [_gaca ]=_ggad (_cced .Data [_gaca ],_aegb .Data [_eaddf ]&_cced .Data [_gaca ],_bcgda );
|
|
|
|
};};case PixSrcXorDst :for _agaa =0;_agaa < _dbdg ;_agaa ++{_eaddf =_aage +_agaa *_aegb .RowStride ;_gaca =_bebc +_agaa *_cced .RowStride ;for _feecg =0;_feecg < _gaac ;_feecg ++{_cced .Data [_gaca ]^=_aegb .Data [_eaddf ];_gaca ++;_eaddf ++;};if _babb > 0{_cced .Data [_gaca ]=_ggad (_cced .Data [_gaca ],_aegb .Data [_eaddf ]^_cced .Data [_gaca ],_bcgda );
|
|
|
|
};};case PixNotSrcOrDst :for _agaa =0;_agaa < _dbdg ;_agaa ++{_eaddf =_aage +_agaa *_aegb .RowStride ;_gaca =_bebc +_agaa *_cced .RowStride ;for _feecg =0;_feecg < _gaac ;_feecg ++{_cced .Data [_gaca ]|=^(_aegb .Data [_eaddf ]);_gaca ++;_eaddf ++;};if _babb > 0{_cced .Data [_gaca ]=_ggad (_cced .Data [_gaca ],^(_aegb .Data [_eaddf ])|_cced .Data [_gaca ],_bcgda );
|
|
|
|
};};case PixNotSrcAndDst :for _agaa =0;_agaa < _dbdg ;_agaa ++{_eaddf =_aage +_agaa *_aegb .RowStride ;_gaca =_bebc +_agaa *_cced .RowStride ;for _feecg =0;_feecg < _gaac ;_feecg ++{_cced .Data [_gaca ]&=^(_aegb .Data [_eaddf ]);_gaca ++;_eaddf ++;};if _babb > 0{_cced .Data [_gaca ]=_ggad (_cced .Data [_gaca ],^(_aegb .Data [_eaddf ])&_cced .Data [_gaca ],_bcgda );
|
|
|
|
};};case PixSrcOrNotDst :for _agaa =0;_agaa < _dbdg ;_agaa ++{_eaddf =_aage +_agaa *_aegb .RowStride ;_gaca =_bebc +_agaa *_cced .RowStride ;for _feecg =0;_feecg < _gaac ;_feecg ++{_cced .Data [_gaca ]=_aegb .Data [_eaddf ]|^(_cced .Data [_gaca ]);_gaca ++;
|
|
|
|
_eaddf ++;};if _babb > 0{_cced .Data [_gaca ]=_ggad (_cced .Data [_gaca ],_aegb .Data [_eaddf ]|^(_cced .Data [_gaca ]),_bcgda );};};case PixSrcAndNotDst :for _agaa =0;_agaa < _dbdg ;_agaa ++{_eaddf =_aage +_agaa *_aegb .RowStride ;_gaca =_bebc +_agaa *_cced .RowStride ;
|
|
|
|
for _feecg =0;_feecg < _gaac ;_feecg ++{_cced .Data [_gaca ]=_aegb .Data [_eaddf ]&^(_cced .Data [_gaca ]);_gaca ++;_eaddf ++;};if _babb > 0{_cced .Data [_gaca ]=_ggad (_cced .Data [_gaca ],_aegb .Data [_eaddf ]&^(_cced .Data [_gaca ]),_bcgda );};};case PixNotPixSrcOrDst :for _agaa =0;
|
|
|
|
_agaa < _dbdg ;_agaa ++{_eaddf =_aage +_agaa *_aegb .RowStride ;_gaca =_bebc +_agaa *_cced .RowStride ;for _feecg =0;_feecg < _gaac ;_feecg ++{_cced .Data [_gaca ]=^(_aegb .Data [_eaddf ]|_cced .Data [_gaca ]);_gaca ++;_eaddf ++;};if _babb > 0{_cced .Data [_gaca ]=_ggad (_cced .Data [_gaca ],^(_aegb .Data [_eaddf ]|_cced .Data [_gaca ]),_bcgda );
|
|
|
|
};};case PixNotPixSrcAndDst :for _agaa =0;_agaa < _dbdg ;_agaa ++{_eaddf =_aage +_agaa *_aegb .RowStride ;_gaca =_bebc +_agaa *_cced .RowStride ;for _feecg =0;_feecg < _gaac ;_feecg ++{_cced .Data [_gaca ]=^(_aegb .Data [_eaddf ]&_cced .Data [_gaca ]);
|
|
|
|
_gaca ++;_eaddf ++;};if _babb > 0{_cced .Data [_gaca ]=_ggad (_cced .Data [_gaca ],^(_aegb .Data [_eaddf ]&_cced .Data [_gaca ]),_bcgda );};};case PixNotPixSrcXorDst :for _agaa =0;_agaa < _dbdg ;_agaa ++{_eaddf =_aage +_agaa *_aegb .RowStride ;_gaca =_bebc +_agaa *_cced .RowStride ;
|
|
|
|
for _feecg =0;_feecg < _gaac ;_feecg ++{_cced .Data [_gaca ]=^(_aegb .Data [_eaddf ]^_cced .Data [_gaca ]);_gaca ++;_eaddf ++;};if _babb > 0{_cced .Data [_gaca ]=_ggad (_cced .Data [_gaca ],^(_aegb .Data [_eaddf ]^_cced .Data [_gaca ]),_bcgda );};};default:_dd .Log .Debug ("\u0050\u0072ov\u0069\u0064\u0065d\u0020\u0069\u006e\u0076ali\u0064 r\u0061\u0073\u0074\u0065\u0072\u0020\u006fpe\u0072\u0061\u0074\u006f\u0072\u003a\u0020%\u0076",_dca );
|
|
|
|
return _d .Error ("\u0072\u0061\u0073\u0074er\u004f\u0070\u0042\u0079\u0074\u0065\u0041\u006c\u0069\u0067\u006e\u0065\u0064\u004co\u0077","\u0069\u006e\u0076al\u0069\u0064\u0020\u0072\u0061\u0073\u0074\u0065\u0072\u0020\u006f\u0070\u0065\u0072\u0061\u0074\u006f\u0072");
|
|
|
|
};return nil ;};func _fgddc ()[]int {_baca :=make ([]int ,256);_baca [0]=0;_baca [1]=7;var _bcae int ;for _bcae =2;_bcae < 4;_bcae ++{_baca [_bcae ]=_baca [_bcae -2]+6;};for _bcae =4;_bcae < 8;_bcae ++{_baca [_bcae ]=_baca [_bcae -4]+5;};for _bcae =8;_bcae < 16;
|
|
|
|
_bcae ++{_baca [_bcae ]=_baca [_bcae -8]+4;};for _bcae =16;_bcae < 32;_bcae ++{_baca [_bcae ]=_baca [_bcae -16]+3;};for _bcae =32;_bcae < 64;_bcae ++{_baca [_bcae ]=_baca [_bcae -32]+2;};for _bcae =64;_bcae < 128;_bcae ++{_baca [_bcae ]=_baca [_bcae -64]+1;
|
|
|
|
};for _bcae =128;_bcae < 256;_bcae ++{_baca [_bcae ]=_baca [_bcae -128];};return _baca ;};func (_cffd *Bitmap )equivalent (_deegf *Bitmap )bool {if _cffd ==_deegf {return true ;};if !_cffd .SizesEqual (_deegf ){return false ;};_ddaf :=_ffg (_cffd ,_deegf ,CmbOpXor );
|
|
|
|
_geba :=_cffd .countPixels ();_bfaa :=int (0.25*float32 (_geba ));if _ddaf .thresholdPixelSum (_bfaa ){return false ;};var (_dba [9][9]int ;_bfec [18][9]int ;_cgc [9][18]int ;_ecca int ;_gbag int ;);_afg :=9;_cad :=_cffd .Height /_afg ;_cdfb :=_cffd .Width /_afg ;
|
|
|
|
_ddd ,_fff :=_cad /2,_cdfb /2;if _cad < _cdfb {_ddd =_cdfb /2;_fff =_cad /2;};_gdcg :=float64 (_ddd )*float64 (_fff )*_de .Pi ;_aae :=int (float64 (_cad *_cdfb /2)*0.9);_ddcb :=int (float64 (_cdfb *_cad /2)*0.9);for _gafc :=0;_gafc < _afg ;_gafc ++{_efb :=_cdfb *_gafc +_ecca ;
|
|
|
|
var _gcfc int ;if _gafc ==_afg -1{_ecca =0;_gcfc =_cffd .Width ;}else {_gcfc =_efb +_cdfb ;if ((_cffd .Width -_ecca )%_afg )> 0{_ecca ++;_gcfc ++;};};for _gafe :=0;_gafe < _afg ;_gafe ++{_cdec :=_cad *_gafe +_gbag ;var _fcgc int ;if _gafe ==_afg -1{_gbag =0;
|
|
|
|
_fcgc =_cffd .Height ;}else {_fcgc =_cdec +_cad ;if (_cffd .Height -_gbag )%_afg > 0{_gbag ++;_fcgc ++;};};var _fadf ,_gge ,_dggc ,_dcg int ;_gea :=(_efb +_gcfc )/2;_fcgg :=(_cdec +_fcgc )/2;for _abd :=_efb ;_abd < _gcfc ;_abd ++{for _fdd :=_cdec ;_fdd < _fcgc ;
|
|
|
|
_fdd ++{if _ddaf .GetPixel (_abd ,_fdd ){if _abd < _gea {_fadf ++;}else {_gge ++;};if _fdd < _fcgg {_dcg ++;}else {_dggc ++;};};};};_dba [_gafc ][_gafe ]=_fadf +_gge ;_bfec [_gafc *2][_gafe ]=_fadf ;_bfec [_gafc *2+1][_gafe ]=_gge ;_cgc [_gafc ][_gafe *2]=_dcg ;
|
|
|
|
_cgc [_gafc ][_gafe *2+1]=_dggc ;};};for _gfe :=0;_gfe < _afg *2-1;_gfe ++{for _bbaf :=0;_bbaf < (_afg -1);_bbaf ++{var _eace int ;for _fgfa :=0;_fgfa < 2;_fgfa ++{for _gebe :=0;_gebe < 2;_gebe ++{_eace +=_bfec [_gfe +_fgfa ][_bbaf +_gebe ];};};if _eace > _ddcb {return false ;
|
|
|
|
};};};for _bcd :=0;_bcd < (_afg -1);_bcd ++{for _dbf :=0;_dbf < ((_afg *2)-1);_dbf ++{var _cge int ;for _ede :=0;_ede < 2;_ede ++{for _bgeb :=0;_bgeb < 2;_bgeb ++{_cge +=_cgc [_bcd +_ede ][_dbf +_bgeb ];};};if _cge > _aae {return false ;};};};for _cdb :=0;
|
|
|
|
_cdb < (_afg -2);_cdb ++{for _aegec :=0;_aegec < (_afg -2);_aegec ++{var _bafd ,_bgbb int ;for _cagb :=0;_cagb < 3;_cagb ++{for _bffc :=0;_bffc < 3;_bffc ++{if _cagb ==_bffc {_bafd +=_dba [_cdb +_cagb ][_aegec +_bffc ];};if (2-_cagb )==_bffc {_bgbb +=_dba [_cdb +_cagb ][_aegec +_bffc ];
|
|
|
|
};};};if _bafd > _ddcb ||_bgbb > _ddcb {return false ;};};};for _aba :=0;_aba < (_afg -1);_aba ++{for _eef :=0;_eef < (_afg -1);_eef ++{var _dcf int ;for _gafcc :=0;_gafcc < 2;_gafcc ++{for _eed :=0;_eed < 2;_eed ++{_dcf +=_dba [_aba +_gafcc ][_eef +_eed ];
|
|
|
|
};};if float64 (_dcf )> _gdcg {return false ;};};};return true ;};func (_gedge *Bitmap )String ()string {var _ddag ="\u000a";for _cfec :=0;_cfec < _gedge .Height ;_cfec ++{var _fbde string ;for _fgge :=0;_fgge < _gedge .Width ;_fgge ++{_ega :=_gedge .GetPixel (_fgge ,_cfec );
|
|
|
|
if _ega {_fbde +="\u0031";}else {_fbde +="\u0030";};};_ddag +=_fbde +"\u000a";};return _ddag ;};func (_bdcf *Bitmap )setEightPartlyBytes (_ebea ,_ggf int ,_cgeg uint64 )(_dafg error ){var (_cade byte ;_bbgd int ;);const _dge ="\u0073\u0065\u0074\u0045ig\u0068\u0074\u0050\u0061\u0072\u0074\u006c\u0079\u0042\u0079\u0074\u0065\u0073";
|
|
|
|
for _bfbe :=1;_bfbe <=_ggf ;_bfbe ++{_bbgd =64-_bfbe *8;_cade =byte (_cgeg >>uint (_bbgd )&0xff);_dd .Log .Trace ("\u0074\u0065\u006d\u0070\u003a\u0020\u0025\u0030\u0038\u0062\u002c\u0020\u0069\u006e\u0064\u0065\u0078\u003a %\u0064,\u0020\u0069\u0064\u0078\u003a\u0020\u0025\u0064\u002c\u0020\u0066\u0075l\u006c\u0042\u0079\u0074\u0065\u0073\u004e\u0075\u006d\u0062\u0065\u0072\u003a\u0020\u0025\u0064\u002c \u0073\u0068\u0069\u0066\u0074\u003a\u0020\u0025\u0064",_cade ,_ebea ,_ebea +_bfbe -1,_ggf ,_bbgd );
|
|
|
|
if _dafg =_bdcf .SetByte (_ebea +_bfbe -1,_cade );_dafg !=nil {return _d .Wrap (_dafg ,_dge ,"\u0066\u0075\u006c\u006c\u0042\u0079\u0074\u0065");};};_aag :=_bdcf .RowStride *8-_bdcf .Width ;if _aag ==0{return nil ;};_bbgd -=8;_cade =byte (_cgeg >>uint (_bbgd )&0xff)<<uint (_aag );
|
|
|
|
if _dafg =_bdcf .SetByte (_ebea +_ggf ,_cade );_dafg !=nil {return _d .Wrap (_dafg ,_dge ,"\u0070\u0061\u0064\u0064\u0065\u0064");};return nil ;};func (_bcdc *Bitmap )centroid (_cafaf ,_eaaac []int )(Point ,error ){_eabed :=Point {};_bcdc .setPadBits (0);
|
|
|
|
if len (_cafaf )==0{_cafaf =_fgddc ();};if len (_eaaac )==0{_eaaac =_fgef ();};var _adfa ,_gfad ,_ffc ,_cceg ,_agae ,_cdgb int ;var _bfcd byte ;for _agae =0;_agae < _bcdc .Height ;_agae ++{_bcaa :=_bcdc .RowStride *_agae ;_cceg =0;for _cdgb =0;_cdgb < _bcdc .RowStride ;
|
|
|
|
_cdgb ++{_bfcd =_bcdc .Data [_bcaa +_cdgb ];if _bfcd !=0{_cceg +=_eaaac [_bfcd ];_adfa +=_cafaf [_bfcd ]+_cdgb *8*_eaaac [_bfcd ];};};_ffc +=_cceg ;_gfad +=_cceg *_agae ;};if _ffc !=0{_eabed .X =float32 (_adfa )/float32 (_ffc );_eabed .Y =float32 (_gfad )/float32 (_ffc );
|
|
|
|
};return _eabed ,nil ;};func _gdfbf (_adcef *Bitmap ,_cdfg *_gc .Stack ,_aedcb ,_bcecf int )(_cfece *_dc .Rectangle ,_gdeg error ){const _dbbc ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";if _adcef ==nil {return nil ,_d .Error (_dbbc ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");
|
|
|
|
};if _cdfg ==nil {return nil ,_d .Error (_dbbc ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");};_bagaa ,_bffff :=_adcef .Width ,_adcef .Height ;_dacfg :=_bagaa -1;_afbc :=_bffff -1;if _aedcb < 0||_aedcb > _dacfg ||_bcecf < 0||_bcecf > _afbc ||!_adcef .GetPixel (_aedcb ,_bcecf ){return nil ,nil ;
|
|
|
|
};var _cebe *_dc .Rectangle ;_cebe ,_gdeg =Rect (100000,100000,0,0);if _gdeg !=nil {return nil ,_d .Wrap (_gdeg ,_dbbc ,"");};if _gdeg =_edgd (_cdfg ,_aedcb ,_aedcb ,_bcecf ,1,_afbc ,_cebe );_gdeg !=nil {return nil ,_d .Wrap (_gdeg ,_dbbc ,"\u0069\u006e\u0069t\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");
|
|
|
|
};if _gdeg =_edgd (_cdfg ,_aedcb ,_aedcb ,_bcecf +1,-1,_afbc ,_cebe );_gdeg !=nil {return nil ,_d .Wrap (_gdeg ,_dbbc ,"\u0032\u006ed\u0020\u0069\u006ei\u0074\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};_cebe .Min .X ,_cebe .Max .X =_aedcb ,_aedcb ;
|
|
|
|
_cebe .Min .Y ,_cebe .Max .Y =_bcecf ,_bcecf ;var (_gfadb *fillSegment ;_gccac int ;);for _cdfg .Len ()> 0{if _gfadb ,_gdeg =_bggaf (_cdfg );_gdeg !=nil {return nil ,_d .Wrap (_gdeg ,_dbbc ,"");};_bcecf =_gfadb ._bcea ;for _aedcb =_gfadb ._fbdg ;_aedcb >=0&&_adcef .GetPixel (_aedcb ,_bcecf );
|
|
|
|
_aedcb --{if _gdeg =_adcef .SetPixel (_aedcb ,_bcecf ,0);_gdeg !=nil {return nil ,_d .Wrap (_gdeg ,_dbbc ,"");};};if _aedcb >=_gfadb ._fbdg {for _aedcb ++;_aedcb <=_gfadb ._egdfd &&_aedcb <=_dacfg &&!_adcef .GetPixel (_aedcb ,_bcecf );_aedcb ++{};_gccac =_aedcb ;
|
|
|
|
if !(_aedcb <=_gfadb ._egdfd &&_aedcb <=_dacfg ){continue ;};}else {_gccac =_aedcb +1;if _gccac < _gfadb ._fbdg -1{if _gdeg =_edgd (_cdfg ,_gccac ,_gfadb ._fbdg -1,_gfadb ._bcea ,-_gfadb ._dbgc ,_afbc ,_cebe );_gdeg !=nil {return nil ,_d .Wrap (_gdeg ,_dbbc ,"\u006c\u0065\u0061\u006b\u0020\u006f\u006e\u0020\u006c\u0065\u0066\u0074 \u0073\u0069\u0064\u0065");
|
|
|
|
};};_aedcb =_gfadb ._fbdg +1;};for {for ;_aedcb <=_dacfg &&_adcef .GetPixel (_aedcb ,_bcecf );_aedcb ++{if _gdeg =_adcef .SetPixel (_aedcb ,_bcecf ,0);_gdeg !=nil {return nil ,_d .Wrap (_gdeg ,_dbbc ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _gdeg =_edgd (_cdfg ,_gccac ,_aedcb -1,_gfadb ._bcea ,_gfadb ._dbgc ,_afbc ,_cebe );
|
|
|
|
_gdeg !=nil {return nil ,_d .Wrap (_gdeg ,_dbbc ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _aedcb > _gfadb ._egdfd +1{if _gdeg =_edgd (_cdfg ,_gfadb ._egdfd +1,_aedcb -1,_gfadb ._bcea ,-_gfadb ._dbgc ,_afbc ,_cebe );_gdeg !=nil {return nil ,_d .Wrap (_gdeg ,_dbbc ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");
|
|
|
|
};};for _aedcb ++;_aedcb <=_gfadb ._egdfd &&_aedcb <=_dacfg &&!_adcef .GetPixel (_aedcb ,_bcecf );_aedcb ++{};_gccac =_aedcb ;if !(_aedcb <=_gfadb ._egdfd &&_aedcb <=_dacfg ){break ;};};};_cebe .Max .X ++;_cebe .Max .Y ++;return _cebe ,nil ;};type BoundaryCondition int ;
|
|
|
|
func (_adfba Points )Size ()int {return len (_adfba )};func (_gaccc *Bitmaps )SelectBySize (width ,height int ,tp LocationFilter ,relation SizeComparison )(_decf *Bitmaps ,_cbbb error ){const _aaef ="B\u0069t\u006d\u0061\u0070\u0073\u002e\u0053\u0065\u006ce\u0063\u0074\u0042\u0079Si\u007a\u0065";
|
|
|
|
if _gaccc ==nil {return nil ,_d .Error (_aaef ,"\u0027\u0062\u0027 B\u0069\u0074\u006d\u0061\u0070\u0073\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};switch tp {case LocSelectWidth ,LocSelectHeight ,LocSelectIfEither ,LocSelectIfBoth :default:return nil ,_d .Errorf (_aaef ,"\u0070\u0072\u006f\u0076\u0069d\u0065\u0064\u0020\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u006c\u006fc\u0061\u0074\u0069\u006f\u006e\u0020\u0066\u0069\u006c\u0074\u0065\u0072\u0020\u0074\u0079\u0070\u0065\u003a\u0020\u0025\u0064",tp );
|
|
|
|
};switch relation {case SizeSelectIfLT ,SizeSelectIfGT ,SizeSelectIfLTE ,SizeSelectIfGTE ,SizeSelectIfEQ :default:return nil ,_d .Errorf (_aaef ,"\u0069\u006e\u0076\u0061li\u0064\u0020\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0027\u0025d\u0027",relation );
|
|
|
|
};_ebdg ,_cbbb :=_gaccc .makeSizeIndicator (width ,height ,tp ,relation );if _cbbb !=nil {return nil ,_d .Wrap (_cbbb ,_aaef ,"");};_decf ,_cbbb =_gaccc .selectByIndicator (_ebdg );if _cbbb !=nil {return nil ,_d .Wrap (_cbbb ,_aaef ,"");};return _decf ,nil ;
|
|
|
|
};func TstCSymbol (t *_g .T )*Bitmap {t .Helper ();_ecgcd :=New (6,6);_df .NoError (t ,_ecgcd .SetPixel (1,0,1));_df .NoError (t ,_ecgcd .SetPixel (2,0,1));_df .NoError (t ,_ecgcd .SetPixel (3,0,1));_df .NoError (t ,_ecgcd .SetPixel (4,0,1));_df .NoError (t ,_ecgcd .SetPixel (0,1,1));
|
|
|
|
_df .NoError (t ,_ecgcd .SetPixel (5,1,1));_df .NoError (t ,_ecgcd .SetPixel (0,2,1));_df .NoError (t ,_ecgcd .SetPixel (0,3,1));_df .NoError (t ,_ecgcd .SetPixel (0,4,1));_df .NoError (t ,_ecgcd .SetPixel (5,4,1));_df .NoError (t ,_ecgcd .SetPixel (1,5,1));
|
|
|
|
_df .NoError (t ,_ecgcd .SetPixel (2,5,1));_df .NoError (t ,_ecgcd .SetPixel (3,5,1));_df .NoError (t ,_ecgcd .SetPixel (4,5,1));return _ecgcd ;};func _abdb (_fed ,_dbdb int ,_bbcc string )*Selection {_bfbeb :=&Selection {Height :_fed ,Width :_dbdb ,Name :_bbcc };
|
|
|
|
_bfbeb .Data =make ([][]SelectionValue ,_fed );for _geea :=0;_geea < _fed ;_geea ++{_bfbeb .Data [_geea ]=make ([]SelectionValue ,_dbdb );};return _bfbeb ;};func (_gabd *Bitmap )connComponentsBitmapsBB (_daaf *Bitmaps ,_gegb int )(_ecddd *Boxes ,_ddcf error ){const _ggae ="\u0063\u006f\u006enC\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074\u0073\u0042\u0069\u0074\u006d\u0061\u0070\u0073\u0042\u0042";
|
|
|
|
if _gegb !=4&&_gegb !=8{return nil ,_d .Error (_ggae ,"\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 _daaf ==nil {return nil ,_d .Error (_ggae ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0042\u0069\u0074ma\u0070\u0073");
|
|
|
|
};if len (_daaf .Values )> 0{return nil ,_d .Error (_ggae ,"\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 _gabd .Zero (){return &Boxes {},nil ;};
|
|
|
|
var (_cabc ,_fbe ,_bfdb ,_adbga *Bitmap ;);_gabd .setPadBits (0);if _cabc ,_ddcf =_faec (nil ,_gabd );_ddcf !=nil {return nil ,_d .Wrap (_ddcf ,_ggae ,"\u0062\u006d\u0031");};if _fbe ,_ddcf =_faec (nil ,_gabd );_ddcf !=nil {return nil ,_d .Wrap (_ddcf ,_ggae ,"\u0062\u006d\u0032");
|
|
|
|
};_bgbg :=&_gc .Stack {};_bgbg .Aux =&_gc .Stack {};_ecddd =&Boxes {};var (_affcf ,_dcc int ;_eea _dc .Point ;_cgb bool ;_eaec *_dc .Rectangle ;);for {if _eea ,_cgb ,_ddcf =_cabc .nextOnPixel (_affcf ,_dcc );_ddcf !=nil {return nil ,_d .Wrap (_ddcf ,_ggae ,"");
|
|
|
|
};if !_cgb {break ;};if _eaec ,_ddcf =_ffgb (_cabc ,_bgbg ,_eea .X ,_eea .Y ,_gegb );_ddcf !=nil {return nil ,_d .Wrap (_ddcf ,_ggae ,"");};if _ddcf =_ecddd .Add (_eaec );_ddcf !=nil {return nil ,_d .Wrap (_ddcf ,_ggae ,"");};if _bfdb ,_ddcf =_cabc .clipRectangle (_eaec ,nil );
|
|
|
|
_ddcf !=nil {return nil ,_d .Wrap (_ddcf ,_ggae ,"\u0062\u006d\u0033");};if _adbga ,_ddcf =_fbe .clipRectangle (_eaec ,nil );_ddcf !=nil {return nil ,_d .Wrap (_ddcf ,_ggae ,"\u0062\u006d\u0034");};if _ ,_ddcf =_ffdg (_bfdb ,_bfdb ,_adbga );_ddcf !=nil {return nil ,_d .Wrap (_ddcf ,_ggae ,"\u0062m\u0033\u0020\u005e\u0020\u0062\u006d4");
|
|
|
|
};if _ddcf =_fbe .RasterOperation (_eaec .Min .X ,_eaec .Min .Y ,_eaec .Dx (),_eaec .Dy (),PixSrcXorDst ,_bfdb ,0,0);_ddcf !=nil {return nil ,_d .Wrap (_ddcf ,_ggae ,"\u0062\u006d\u0032\u0020\u002d\u0058\u004f\u0052\u002d>\u0020\u0062\u006d\u0033");};_daaf .AddBitmap (_bfdb );
|
|
|
|
_affcf =_eea .X ;_dcc =_eea .Y ;};_daaf .Boxes =*_ecddd ;return _ecddd ,nil ;};func Extract (roi _dc .Rectangle ,src *Bitmap )(*Bitmap ,error ){_faadc :=New (roi .Dx (),roi .Dy ());_geggc :=roi .Min .X &0x07;_cbdd :=8-_geggc ;_faea :=uint (8-_faadc .Width &0x07);
|
|
|
|
_effg :=src .GetByteIndex (roi .Min .X ,roi .Min .Y );_eaaa :=src .GetByteIndex (roi .Max .X -1,roi .Min .Y );_babc :=_faadc .RowStride ==_eaaa +1-_effg ;var _cfecb int ;for _deaf :=roi .Min .Y ;_deaf < roi .Max .Y ;_deaf ++{_bdg :=_effg ;_cabee :=_cfecb ;
|
|
|
|
switch {case _effg ==_eaaa :_fbg ,_edgc :=src .GetByte (_bdg );if _edgc !=nil {return nil ,_edgc ;};_fbg <<=uint (_geggc );_edgc =_faadc .SetByte (_cabee ,_efea (_faea ,_fbg ));if _edgc !=nil {return nil ,_edgc ;};case _geggc ==0:for _fabc :=_effg ;_fabc <=_eaaa ;
|
|
|
|
_fabc ++{_ddbb ,_bbef :=src .GetByte (_bdg );if _bbef !=nil {return nil ,_bbef ;};_bdg ++;if _fabc ==_eaaa &&_babc {_ddbb =_efea (_faea ,_ddbb );};_bbef =_faadc .SetByte (_cabee ,_ddbb );if _bbef !=nil {return nil ,_bbef ;};_cabee ++;};default:_fabaa :=_ggcf (src ,_faadc ,uint (_geggc ),uint (_cbdd ),_faea ,_effg ,_eaaa ,_babc ,_bdg ,_cabee );
|
|
|
|
if _fabaa !=nil {return nil ,_fabaa ;};};_effg +=src .RowStride ;_eaaa +=src .RowStride ;_cfecb +=_faadc .RowStride ;};return _faadc ,nil ;};func _cgfe (_daee ,_cdbf *Bitmap ,_agaef *Selection )(*Bitmap ,error ){const _fge ="\u0065\u0072\u006fd\u0065";
|
|
|
|
var (_cfdgg error ;_adfc *Bitmap ;);_daee ,_cfdgg =_ggdfb (_daee ,_cdbf ,_agaef ,&_adfc );if _cfdgg !=nil {return nil ,_d .Wrap (_cfdgg ,_fge ,"");};if _cfdgg =_daee .setAll ();_cfdgg !=nil {return nil ,_d .Wrap (_cfdgg ,_fge ,"");};var _cccb SelectionValue ;
|
|
|
|
for _dadc :=0;_dadc < _agaef .Height ;_dadc ++{for _badb :=0;_badb < _agaef .Width ;_badb ++{_cccb =_agaef .Data [_dadc ][_badb ];if _cccb ==SelHit {_cfdgg =_eebc (_daee ,_agaef .Cx -_badb ,_agaef .Cy -_dadc ,_cdbf .Width ,_cdbf .Height ,PixSrcAndDst ,_adfc ,0,0);
|
|
|
|
if _cfdgg !=nil {return nil ,_d .Wrap (_cfdgg ,_fge ,"");};};};};if MorphBC ==SymmetricMorphBC {return _daee ,nil ;};_dfceb ,_ddfdg ,_daged ,_feea :=_agaef .findMaxTranslations ();if _dfceb > 0{if _cfdgg =_daee .RasterOperation (0,0,_dfceb ,_cdbf .Height ,PixClr ,nil ,0,0);
|
|
|
|
_cfdgg !=nil {return nil ,_d .Wrap (_cfdgg ,_fge ,"\u0078\u0070\u0020\u003e\u0020\u0030");};};if _daged > 0{if _cfdgg =_daee .RasterOperation (_cdbf .Width -_daged ,0,_daged ,_cdbf .Height ,PixClr ,nil ,0,0);_cfdgg !=nil {return nil ,_d .Wrap (_cfdgg ,_fge ,"\u0078\u006e\u0020\u003e\u0020\u0030");
|
|
|
|
};};if _ddfdg > 0{if _cfdgg =_daee .RasterOperation (0,0,_cdbf .Width ,_ddfdg ,PixClr ,nil ,0,0);_cfdgg !=nil {return nil ,_d .Wrap (_cfdgg ,_fge ,"\u0079\u0070\u0020\u003e\u0020\u0030");};};if _feea > 0{if _cfdgg =_daee .RasterOperation (0,_cdbf .Height -_feea ,_cdbf .Width ,_feea ,PixClr ,nil ,0,0);
|
|
|
|
_cfdgg !=nil {return nil ,_d .Wrap (_cfdgg ,_fge ,"\u0079\u006e\u0020\u003e\u0020\u0030");};};return _daee ,nil ;};func init (){for _gada :=0;_gada < 256;_gada ++{_efg [_gada ]=uint8 (_gada &0x1)+(uint8 (_gada >>1)&0x1)+(uint8 (_gada >>2)&0x1)+(uint8 (_gada >>3)&0x1)+(uint8 (_gada >>4)&0x1)+(uint8 (_gada >>5)&0x1)+(uint8 (_gada >>6)&0x1)+(uint8 (_gada >>7)&0x1);
|
|
|
|
};};type CombinationOperator int ;func (_adb *Bitmap )Copy ()*Bitmap {_edg :=make ([]byte ,len (_adb .Data ));copy (_edg ,_adb .Data );return &Bitmap {Width :_adb .Width ,Height :_adb .Height ,RowStride :_adb .RowStride ,Data :_edg ,Color :_adb .Color ,Text :_adb .Text ,BitmapNumber :_adb .BitmapNumber ,Special :_adb .Special };
|
|
|
|
};type Bitmap struct{Width ,Height int ;BitmapNumber int ;RowStride int ;Data []byte ;Color Color ;Special int ;Text string ;XResolution ,YResolution int ;};func TstTSymbol (t *_g .T ,scale ...int )*Bitmap {_fecc ,_ffcg :=NewWithData (5,5,[]byte {0xF8,0x20,0x20,0x20,0x20});
|
|
|
|
_df .NoError (t ,_ffcg );return TstGetScaledSymbol (t ,_fecc ,scale ...);};func _ecae (_cbce *Bitmap ,_fbdag ...MorphProcess )(_bdgf *Bitmap ,_agcg error ){const _acde ="\u006d\u006f\u0072\u0070\u0068\u0053\u0065\u0071\u0075\u0065\u006e\u0063\u0065";if _cbce ==nil {return nil ,_d .Error (_acde ,"\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 (_fbdag )==0{return nil ,_d .Error (_acde ,"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 _agcg =_cfgcb (_fbdag ...);
|
|
|
|
_agcg !=nil {return nil ,_d .Wrap (_agcg ,_acde ,"");};var _cegd ,_eeddf ,_geffa int ;_bdgf =_cbce .Copy ();for _ ,_adfb :=range _fbdag {switch _adfb .Operation {case MopDilation :_cegd ,_eeddf =_adfb .getWidthHeight ();_bdgf ,_agcg =DilateBrick (nil ,_bdgf ,_cegd ,_eeddf );
|
|
|
|
if _agcg !=nil {return nil ,_d .Wrap (_agcg ,_acde ,"");};case MopErosion :_cegd ,_eeddf =_adfb .getWidthHeight ();_bdgf ,_agcg =_cffdd (nil ,_bdgf ,_cegd ,_eeddf );if _agcg !=nil {return nil ,_d .Wrap (_agcg ,_acde ,"");};case MopOpening :_cegd ,_eeddf =_adfb .getWidthHeight ();
|
|
|
|
_bdgf ,_agcg =_abea (nil ,_bdgf ,_cegd ,_eeddf );if _agcg !=nil {return nil ,_d .Wrap (_agcg ,_acde ,"");};case MopClosing :_cegd ,_eeddf =_adfb .getWidthHeight ();_bdgf ,_agcg =_abe (nil ,_bdgf ,_cegd ,_eeddf );if _agcg !=nil {return nil ,_d .Wrap (_agcg ,_acde ,"");
|
|
|
|
};case MopRankBinaryReduction :_bdgf ,_agcg =_bdf (_bdgf ,_adfb .Arguments ...);if _agcg !=nil {return nil ,_d .Wrap (_agcg ,_acde ,"");};case MopReplicativeBinaryExpansion :_bdgf ,_agcg =_ebcda (_bdgf ,_adfb .Arguments [0]);if _agcg !=nil {return nil ,_d .Wrap (_agcg ,_acde ,"");
|
|
|
|
};case MopAddBorder :_geffa =_adfb .Arguments [0];_bdgf ,_agcg =_bdgf .AddBorder (_geffa ,0);if _agcg !=nil {return nil ,_d .Wrap (_agcg ,_acde ,"");};default:return nil ,_d .Error (_acde ,"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 _geffa > 0{_bdgf ,_agcg =_bdgf .RemoveBorder (_geffa );if _agcg !=nil {return nil ,_d .Wrap (_agcg ,_acde ,"\u0062\u006f\u0072\u0064\u0065\u0072\u0020\u003e\u0020\u0030");};};return _bdgf ,nil ;};func _bebf (_afc ,_egfd int )int {if _afc < _egfd {return _afc ;
|
|
|
|
};return _egfd ;};func _bdf (_fcb *Bitmap ,_ddf ...int )(_eb *Bitmap ,_gae error ){const _daf ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0043\u0061\u0073\u0063\u0061\u0064\u0065";if _fcb ==nil {return nil ,_d .Error (_daf ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");
|
|
|
|
};if len (_ddf )==0||len (_ddf )> 4{return nil ,_d .Error (_daf ,"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 _ddf [0]<=0{_dd .Log .Debug ("\u006c\u0065\u0076\u0065\u006c\u0031\u0020\u003c\u003d\u0020\u0030 \u002d\u0020\u006e\u006f\u0020\u0072\u0065\u0064\u0075\u0063t\u0069\u006f\u006e");_eb ,_gae =_faec (nil ,_fcb );if _gae !=nil {return nil ,_d .Wrap (_gae ,_daf ,"l\u0065\u0076\u0065\u006c\u0031\u0020\u003c\u003d\u0020\u0030");
|
|
|
|
};return _eb ,nil ;};_ae :=_bgf ();_eb =_fcb ;for _ccd ,_bec :=range _ddf {if _bec <=0{break ;};_eb ,_gae =_bge (_eb ,_bec ,_ae );if _gae !=nil {return nil ,_d .Wrapf (_gae ,_daf ,"\u006c\u0065\u0076\u0065\u006c\u0025\u0064\u0020\u0072\u0065\u0064\u0075c\u0074\u0069\u006f\u006e",_ccd );
|
|
|
|
};};return _eb ,nil ;};func (_ecf *Bitmap )SizesEqual (s *Bitmap )bool {if _ecf ==s {return true ;};if _ecf .Width !=s .Width ||_ecf .Height !=s .Height {return false ;};return true ;};func (_ggde *ClassedPoints )validateIntSlice ()error {const _fffdg ="\u0076\u0061l\u0069\u0064\u0061t\u0065\u0049\u006e\u0074\u0053\u006c\u0069\u0063\u0065";
|
|
|
|
for _ ,_gdge :=range _ggde .IntSlice {if _gdge >=(_ggde .Points .Size ()){return _d .Errorf (_fffdg ,"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",_gdge ,_ggde .Points .Size ());
|
|
|
|
};};return nil ;};func CombineBytes (oldByte ,newByte byte ,op CombinationOperator )byte {return _dbae (oldByte ,newByte ,op );};func (_fcgb *BitmapsArray )AddBox (box *_dc .Rectangle ){_fcgb .Boxes =append (_fcgb .Boxes ,box )};func _gb (_bc ,_ad *Bitmap )(_bgg error ){const _cd ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0034";
|
|
|
|
_aga :=_ad .RowStride ;_dfg :=_bc .RowStride ;_ea :=_ad .RowStride *4-_bc .RowStride ;var (_afa ,_ec byte ;_bf uint32 ;_fe ,_aa ,_be ,_ddg ,_cf ,_aaf ,_gd int ;);for _be =0;_be < _ad .Height ;_be ++{_fe =_be *_aga ;_aa =4*_be *_dfg ;for _ddg =0;_ddg < _aga ;
|
|
|
|
_ddg ++{_afa =_ad .Data [_fe +_ddg ];_bf =_gedgea [_afa ];_aaf =_aa +_ddg *4;if _ea !=0&&(_ddg +1)*4> _bc .RowStride {for _cf =_ea ;_cf > 0;_cf --{_ec =byte ((_bf >>uint (_cf *8))&0xff);_gd =_aaf +(_ea -_cf );if _bgg =_bc .SetByte (_gd ,_ec );_bgg !=nil {return _d .Wrapf (_bgg ,_cd ,"D\u0069\u0066\u0066\u0065\u0072\u0065n\u0074\u0020\u0072\u006f\u0077\u0073\u0074\u0072\u0069d\u0065\u0073\u002e \u004b:\u0020\u0025\u0064",_cf );
|
|
|
|
};};}else if _bgg =_bc .setFourBytes (_aaf ,_bf );_bgg !=nil {return _d .Wrap (_bgg ,_cd ,"");};if _bgg =_bc .setFourBytes (_aa +_ddg *4,_gedgea [_ad .Data [_fe +_ddg ]]);_bgg !=nil {return _d .Wrap (_bgg ,_cd ,"");};};for _cf =1;_cf < 4;_cf ++{for _ddg =0;
|
|
|
|
_ddg < _dfg ;_ddg ++{if _bgg =_bc .SetByte (_aa +_cf *_dfg +_ddg ,_bc .Data [_aa +_ddg ]);_bgg !=nil {return _d .Wrapf (_bgg ,_cd ,"\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",_cf ,_ddg );
|
|
|
|
};};};};return nil ;};type SizeSelection int ;func (_gbaf *Boxes )Get (i int )(*_dc .Rectangle ,error ){const _efead ="\u0042o\u0078\u0065\u0073\u002e\u0047\u0065t";if _gbaf ==nil {return nil ,_d .Error (_efead ,"\u0027\u0042\u006f\u0078es\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
|
|
};if i > len (*_gbaf )-1{return nil ,_d .Errorf (_efead ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return (*_gbaf )[i ],nil ;};func (_badc CombinationOperator )String ()string {var _ecde string ;
|
|
|
|
switch _badc {case CmbOpOr :_ecde ="\u004f\u0052";case CmbOpAnd :_ecde ="\u0041\u004e\u0044";case CmbOpXor :_ecde ="\u0058\u004f\u0052";case CmbOpXNor :_ecde ="\u0058\u004e\u004f\u0052";case CmbOpReplace :_ecde ="\u0052E\u0050\u004c\u0041\u0043\u0045";
|
|
|
|
case CmbOpNot :_ecde ="\u004e\u004f\u0054";};return _ecde ;};func TstFrameBitmap ()*Bitmap {return _fbgc .Copy ()};func _ggdfb (_dbcb *Bitmap ,_dgcb *Bitmap ,_cbae *Selection ,_dbcga **Bitmap )(*Bitmap ,error ){const _ggdc ="\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u004d\u006f\u0072\u0070\u0068A\u0072\u0067\u0073\u0031";
|
|
|
|
if _dgcb ==nil {return nil ,_d .Error (_ggdc ,"\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 _cbae ==nil {return nil ,_d .Error (_ggdc ,"\u004d\u006f\u0072\u0068p\u0041\u0072\u0067\u0073\u0031\u0020\u0027\u0073\u0065\u006c'\u0020n\u006f\u0074\u0020\u0064\u0065\u0066\u0069n\u0065\u0064");
|
|
|
|
};_edf ,_gead :=_cbae .Height ,_cbae .Width ;if _edf ==0||_gead ==0{return nil ,_d .Error (_ggdc ,"\u0073\u0065\u006c\u0065ct\u0069\u006f\u006e\u0020\u006f\u0066\u0020\u0073\u0069\u007a\u0065\u0020\u0030");};if _dbcb ==nil {_dbcb =_dgcb .createTemplate ();
|
|
|
|
*_dbcga =_dgcb ;return _dbcb ,nil ;};_dbcb .Width =_dgcb .Width ;_dbcb .Height =_dgcb .Height ;_dbcb .RowStride =_dgcb .RowStride ;_dbcb .Color =_dgcb .Color ;_dbcb .Data =make ([]byte ,_dgcb .RowStride *_dgcb .Height );if _dbcb ==_dgcb {*_dbcga =_dgcb .Copy ();
|
|
|
|
}else {*_dbcga =_dgcb ;};return _dbcb ,nil ;};func (_abcb *Bitmap )inverseData (){if _fegf :=_abcb .RasterOperation (0,0,_abcb .Width ,_abcb .Height ,PixNotDst ,nil ,0,0);_fegf !=nil {_dd .Log .Debug ("\u0049n\u0076\u0065\u0072\u0073e\u0020\u0064\u0061\u0074\u0061 \u0066a\u0069l\u0065\u0064\u003a\u0020\u0027\u0025\u0076'",_fegf );
|
|
|
|
};if _abcb .Color ==Chocolate {_abcb .Color =Vanilla ;}else {_abcb .Color =Chocolate ;};};func TstWriteSymbols (t *_g .T ,bms *Bitmaps ,src *Bitmap ){for _dccge :=0;_dccge < bms .Size ();_dccge ++{_abded :=bms .Values [_dccge ];_geedb :=bms .Boxes [_dccge ];
|
|
|
|
_aefe :=src .RasterOperation (_geedb .Min .X ,_geedb .Min .Y ,_abded .Width ,_abded .Height ,PixSrc ,_abded ,0,0);_df .NoError (t ,_aefe );};};func _ffdg (_cdad ,_gagb ,_bede *Bitmap )(*Bitmap ,error ){const _edge ="\u0062\u0069\u0074\u006d\u0061\u0070\u002e\u0078\u006f\u0072";
|
|
|
|
if _gagb ==nil {return nil ,_d .Error (_edge ,"'\u0062\u0031\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _bede ==nil {return nil ,_d .Error (_edge ,"'\u0062\u0032\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _cdad ==_bede {return nil ,_d .Error (_edge ,"'\u0064\u0027\u0020\u003d\u003d\u0020\u0027\u0062\u0032\u0027");
|
|
|
|
};if !_gagb .SizesEqual (_bede ){_dd .Log .Debug ("\u0025s\u0020\u002d \u0042\u0069\u0074\u006da\u0070\u0020\u0027b\u0031\u0027\u0020\u0069\u0073\u0020\u006e\u006f\u0074 e\u0071\u0075\u0061l\u0020\u0073i\u007a\u0065\u0020\u0077\u0069\u0074h\u0020\u0027b\u0032\u0027",_edge );
|
|
|
|
};var _cefc error ;if _cdad ,_cefc =_faec (_cdad ,_gagb );_cefc !=nil {return nil ,_d .Wrap (_cefc ,_edge ,"\u0063\u0061n\u0027\u0074\u0020c\u0072\u0065\u0061\u0074\u0065\u0020\u0027\u0064\u0027");};if _cefc =_cdad .RasterOperation (0,0,_cdad .Width ,_cdad .Height ,PixSrcXorDst ,_bede ,0,0);
|
|
|
|
_cefc !=nil {return nil ,_d .Wrap (_cefc ,_edge ,"");};return _cdad ,nil ;};func (_fcbg Points )GetGeometry (i int )(_cdebc ,_baac float32 ,_add error ){if i > len (_fcbg )-1{return 0,0,_d .Errorf ("\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0065\u0074","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
|
|
};_bcfab :=_fcbg [i ];return _bcfab .X ,_bcfab .Y ,nil ;};func (_eeaa *ClassedPoints )Less (i ,j int )bool {return _eeaa ._fffdc (i ,j )};func _dbae (_ccda ,_gged byte ,_faecb CombinationOperator )byte {switch _faecb {case CmbOpOr :return _gged |_ccda ;
|
|
|
|
case CmbOpAnd :return _gged &_ccda ;case CmbOpXor :return _gged ^_ccda ;case CmbOpXNor :return ^(_gged ^_ccda );case CmbOpNot :return ^(_gged );default:return _gged ;};};func (_gfeb *ClassedPoints )XAtIndex (i int )float32 {return (*_gfeb .Points )[_gfeb .IntSlice [i ]].X };
|
|
|
|
const (ComponentConn Component =iota ;ComponentCharacters ;ComponentWords ;);func TstFrameBitmapData ()[]byte {return _fbgc .Data };func (_acc *Bitmap )GetUnpaddedData ()([]byte ,error ){_eda :=uint (_acc .Width &0x07);if _eda ==0{return _acc .Data ,nil ;
|
|
|
|
};_eabe :=_acc .Width *_acc .Height ;if _eabe %8!=0{_eabe >>=3;_eabe ++;}else {_eabe >>=3;};_cff :=make ([]byte ,_eabe );_fbb :=_gcb .NewWriterMSB (_cff );const _fbfd ="\u0047e\u0074U\u006e\u0070\u0061\u0064\u0064\u0065\u0064\u0044\u0061\u0074\u0061";for _ggb :=0;
|
|
|
|
_ggb < _acc .Height ;_ggb ++{for _geed :=0;_geed < _acc .RowStride ;_geed ++{_dada :=_acc .Data [_ggb *_acc .RowStride +_geed ];if _geed !=_acc .RowStride -1{_cdc :=_fbb .WriteByte (_dada );if _cdc !=nil {return nil ,_d .Wrap (_cdc ,_fbfd ,"");};continue ;
|
|
|
|
};for _bfe :=uint (0);_bfe < _eda ;_bfe ++{_ddcd :=_fbb .WriteBit (int (_dada >>(7-_bfe )&0x01));if _ddcd !=nil {return nil ,_d .Wrap (_ddcd ,_fbfd ,"");};};};};return _cff ,nil ;};func (_baaf *Bitmap )Equals (s *Bitmap )bool {if len (_baaf .Data )!=len (s .Data )||_baaf .Width !=s .Width ||_baaf .Height !=s .Height {return false ;
|
|
|
|
};for _acbb :=0;_acbb < _baaf .Height ;_acbb ++{_gdb :=_acbb *_baaf .RowStride ;for _cddb :=0;_cddb < _baaf .RowStride ;_cddb ++{if _baaf .Data [_gdb +_cddb ]!=s .Data [_gdb +_cddb ]{return false ;};};};return true ;};func (_aegf *Bitmap )RemoveBorderGeneral (left ,right ,top ,bot int )(*Bitmap ,error ){return _aegf .removeBorderGeneral (left ,right ,top ,bot );
|
|
|
|
};const (_ SizeComparison =iota ;SizeSelectIfLT ;SizeSelectIfGT ;SizeSelectIfLTE ;SizeSelectIfGTE ;SizeSelectIfEQ ;);func _efea (_acbf uint ,_bbde byte )byte {return _bbde >>_acbf <<_acbf };func (_baf *Bitmap )GetPixel (x ,y int )bool {_ecc :=_baf .GetByteIndex (x ,y );
|
|
|
|
_dade :=_baf .GetBitOffset (x );_bbd :=uint (7-_dade );if _ecc > len (_baf .Data )-1{_dd .Log .Debug ("\u0054\u0072\u0079\u0069\u006e\u0067\u0020\u0074\u006f\u0020\u0067\u0065\u0074\u0020\u0070\u0069\u0078\u0065\u006c\u0020o\u0075\u0074\u0020\u006f\u0066\u0020\u0074\u0068\u0065\u0020\u0064\u0061\u0074\u0061\u0020\u0072\u0061\u006e\u0067\u0065\u002e \u0078\u003a\u0020\u0027\u0025\u0064\u0027\u002c\u0020\u0079\u003a\u0027\u0025\u0064'\u002c\u0020\u0062m\u003a\u0020\u0027\u0025\u0073\u0027",x ,y ,_baf );
|
|
|
|
return false ;};if (_baf .Data [_ecc ]>>_bbd )&0x01>=1{return true ;};return false ;};const (SelDontCare SelectionValue =iota ;SelHit ;SelMiss ;);type Point struct{X ,Y float32 ;};func (_bdbac *Bitmaps )SelectByIndexes (idx []int )(*Bitmaps ,error ){const _acec ="B\u0069\u0074\u006d\u0061\u0070\u0073.\u0053\u006f\u0072\u0074\u0049\u006e\u0064\u0065\u0078e\u0073\u0042\u0079H\u0065i\u0067\u0068\u0074";
|
|
|
|
_eebcf ,_gfab :=_bdbac .selectByIndexes (idx );if _gfab !=nil {return nil ,_d .Wrap (_gfab ,_acec ,"");};return _eebcf ,nil ;};type LocationFilter int ;func (_dfgbd *Bitmap )ConnComponents (bms *Bitmaps ,connectivity int )(_beca *Boxes ,_dddc error ){const _gcbga ="B\u0069\u0074\u006d\u0061p.\u0043o\u006e\u006e\u0043\u006f\u006dp\u006f\u006e\u0065\u006e\u0074\u0073";
|
|
|
|
if _dfgbd ==nil {return nil ,_d .Error (_gcbga ,"\u0070r\u006f\u0076\u0069\u0064e\u0064\u0020\u0065\u006d\u0070t\u0079 \u0027b\u0027\u0020\u0062\u0069\u0074\u006d\u0061p");};if connectivity !=4&&connectivity !=8{return nil ,_d .Error (_gcbga ,"\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 _beca ,_dddc =_dfgbd .connComponentsBB (connectivity );_dddc !=nil {return nil ,_d .Wrap (_dddc ,_gcbga ,"");};}else {if _beca ,_dddc =_dfgbd .connComponentsBitmapsBB (bms ,connectivity );_dddc !=nil {return nil ,_d .Wrap (_dddc ,_gcbga ,"");
|
|
|
|
};};return _beca ,nil ;};const (_acbc shift =iota ;_dcfc ;);type SelectionValue int ;func _ac (_dgf ,_c *Bitmap )(_ag error ){const _fa ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0032";_af :=_c .RowStride ;
|
|
|
|
_bg :=_dgf .RowStride ;var (_e byte ;_dee uint16 ;_fc ,_db ,_ca ,_dce ,_gec int ;);for _ca =0;_ca < _c .Height ;_ca ++{_fc =_ca *_af ;_db =2*_ca *_bg ;for _dce =0;_dce < _af ;_dce ++{_e =_c .Data [_fc +_dce ];_dee =_agc [_e ];_gec =_db +_dce *2;if _dgf .RowStride !=_c .RowStride *2&&(_dce +1)*2> _dgf .RowStride {_ag =_dgf .SetByte (_gec ,byte (_dee >>8));
|
|
|
|
}else {_ag =_dgf .setTwoBytes (_gec ,_dee );};if _ag !=nil {return _d .Wrap (_ag ,_fa ,"");};};for _dce =0;_dce < _bg ;_dce ++{_gec =_db +_bg +_dce ;_e =_dgf .Data [_db +_dce ];if _ag =_dgf .SetByte (_gec ,_e );_ag !=nil {return _d .Wrapf (_ag ,_fa ,"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",_db +_dce ,_db +_bg +_dce );
|
|
|
|
};};};return nil ;};func _fef (_gdba int )int {if _gdba < 0{return -_gdba ;};return _gdba ;};func (_agbd *Bitmap )addPadBits ()(_eff error ){const _babe ="\u0062\u0069\u0074\u006d\u0061\u0070\u002e\u0061\u0064\u0064\u0050\u0061d\u0042\u0069\u0074\u0073";
|
|
|
|
_gba :=_agbd .Width %8;if _gba ==0{return nil ;};_efd :=_agbd .Width /8;_deeg :=_gcb .NewReader (_agbd .Data );_aec :=make ([]byte ,_agbd .Height *_agbd .RowStride );_efce :=_gcb .NewWriterMSB (_aec );_bbfg :=make ([]byte ,_efd );var (_affe int ;_acgc uint64 ;
|
|
|
|
);for _affe =0;_affe < _agbd .Height ;_affe ++{if _ ,_eff =_deeg .Read (_bbfg );_eff !=nil {return _d .Wrap (_eff ,_babe ,"\u0066u\u006c\u006c\u0020\u0062\u0079\u0074e");};if _ ,_eff =_efce .Write (_bbfg );_eff !=nil {return _d .Wrap (_eff ,_babe ,"\u0066\u0075\u006c\u006c\u0020\u0062\u0079\u0074\u0065\u0073");
|
|
|
|
};if _acgc ,_eff =_deeg .ReadBits (byte (_gba ));_eff !=nil {return _d .Wrap (_eff ,_babe ,"\u0073\u006b\u0069\u0070\u0070\u0069\u006e\u0067\u0020\u0062\u0069\u0074\u0073");};if _eff =_efce .WriteByte (byte (_acgc )<<uint (8-_gba ));_eff !=nil {return _d .Wrap (_eff ,_babe ,"\u006ca\u0073\u0074\u0020\u0062\u0079\u0074e");
|
|
|
|
};};_agbd .Data =_efce .Data ();return nil ;};func _gbfb (_bcfca *Bitmap ,_bfg ,_caeg int ,_eccc ,_badca int ,_eccae RasterOperator ,_gdea *Bitmap ,_egc ,_gdgc int )error {var _dffc ,_cdaf ,_bfff ,_cefg int ;if _bfg < 0{_egc -=_bfg ;_eccc +=_bfg ;_bfg =0;
|
|
|
|
};if _egc < 0{_bfg -=_egc ;_eccc +=_egc ;_egc =0;};_dffc =_bfg +_eccc -_bcfca .Width ;if _dffc > 0{_eccc -=_dffc ;};_cdaf =_egc +_eccc -_gdea .Width ;if _cdaf > 0{_eccc -=_cdaf ;};if _caeg < 0{_gdgc -=_caeg ;_badca +=_caeg ;_caeg =0;};if _gdgc < 0{_caeg -=_gdgc ;
|
|
|
|
_badca +=_gdgc ;_gdgc =0;};_bfff =_caeg +_badca -_bcfca .Height ;if _bfff > 0{_badca -=_bfff ;};_cefg =_gdgc +_badca -_gdea .Height ;if _cefg > 0{_badca -=_cefg ;};if _eccc <=0||_badca <=0{return nil ;};var _cbcg error ;switch {case _bfg &7==0&&_egc &7==0:_cbcg =_ebb (_bcfca ,_bfg ,_caeg ,_eccc ,_badca ,_eccae ,_gdea ,_egc ,_gdgc );
|
|
|
|
case _bfg &7==_egc &7:_cbcg =_ffdd (_bcfca ,_bfg ,_caeg ,_eccc ,_badca ,_eccae ,_gdea ,_egc ,_gdgc );default:_cbcg =_daafa (_bcfca ,_bfg ,_caeg ,_eccc ,_badca ,_eccae ,_gdea ,_egc ,_gdgc );};if _cbcg !=nil {return _d .Wrap (_cbcg ,"r\u0061\u0073\u0074\u0065\u0072\u004f\u0070\u004c\u006f\u0077","");
|
|
|
|
};return nil ;};func _edgd (_ffgf *_gc .Stack ,_bdba ,_cbbe ,_bacb ,_gefb ,_age int ,_adbe *_dc .Rectangle )(_gbgb error ){const _abec ="\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 _ffgf ==nil {return _d .Error (_abec ,"\u006ei\u006c \u0073\u0074\u0061\u0063\u006b \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");};if _adbe ==nil {return _d .Error (_abec ,"\u0070\u0072\u006f\u0076i\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0069\u006da\u0067e\u002e\u0052\u0065\u0063\u0074\u0061\u006eg\u006c\u0065");
|
|
|
|
};_adbe .Min .X =_gc .Min (_adbe .Min .X ,_bdba );_adbe .Max .X =_gc .Max (_adbe .Max .X ,_cbbe );_adbe .Min .Y =_gc .Min (_adbe .Min .Y ,_bacb );_adbe .Max .Y =_gc .Max (_adbe .Max .Y ,_bacb );if !(_bacb +_gefb >=0&&_bacb +_gefb <=_age ){return nil ;};
|
|
|
|
if _ffgf .Aux ==nil {return _d .Error (_abec ,"a\u0075x\u0053\u0074\u0061\u0063\u006b\u0020\u006e\u006ft\u0020\u0064\u0065\u0066in\u0065\u0064");};var _ggef *fillSegment ;_afbe ,_gcef :=_ffgf .Aux .Pop ();if _gcef {if _ggef ,_gcef =_afbe .(*fillSegment );
|
|
|
|
!_gcef {return _d .Error (_abec ,"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 {_ggef =&fillSegment {};
|
|
|
|
};_ggef ._fbdg =_bdba ;_ggef ._egdfd =_cbbe ;_ggef ._bcea =_bacb ;_ggef ._dbgc =_gefb ;_ffgf .Push (_ggef );return nil ;};func _ecfa (_faca ,_bgdfg *Bitmap ,_cage *Selection )(*Bitmap ,error ){const _gaaa ="\u006f\u0070\u0065\u006e";var _cgcg error ;_faca ,_cgcg =_eaef (_faca ,_bgdfg ,_cage );
|
|
|
|
if _cgcg !=nil {return nil ,_d .Wrap (_cgcg ,_gaaa ,"");};_dfef ,_cgcg :=_cgfe (nil ,_bgdfg ,_cage );if _cgcg !=nil {return nil ,_d .Wrap (_cgcg ,_gaaa ,"");};_ ,_cgcg =_gfed (_faca ,_dfef ,_cage );if _cgcg !=nil {return nil ,_d .Wrap (_cgcg ,_gaaa ,"");
|
|
|
|
};return _faca ,nil ;};func (_addf *Bitmaps )AddBitmap (bm *Bitmap ){_addf .Values =append (_addf .Values ,bm )};const (_ LocationFilter =iota ;LocSelectWidth ;LocSelectHeight ;LocSelectXVal ;LocSelectYVal ;LocSelectIfEither ;LocSelectIfBoth ;);func Centroids (bms []*Bitmap )(*Points ,error ){_eafg :=make ([]Point ,len (bms ));
|
|
|
|
_fcef :=_fgddc ();_bcfa :=_fgef ();var _egfa error ;for _abfa ,_ddde :=range bms {_eafg [_abfa ],_egfa =_ddde .centroid (_fcef ,_bcfa );if _egfa !=nil {return nil ,_egfa ;};};_ggbd :=Points (_eafg );return &_ggbd ,nil ;};func (_befgc Points )GetIntX (i int )(int ,error ){if i >=len (_befgc ){return 0,_d .Errorf ("\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0065t\u0049\u006e\u0074\u0058","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
|
|
};return int (_befgc [i ].X ),nil ;};func DilateBrick (d ,s *Bitmap ,hSize ,vSize int )(*Bitmap ,error ){return _bebab (d ,s ,hSize ,vSize )};func NewWithData (width ,height int ,data []byte )(*Bitmap ,error ){const _feg ="N\u0065\u0077\u0057\u0069\u0074\u0068\u0044\u0061\u0074\u0061";
|
|
|
|
_cdd :=_ccb (width ,height );_cdd .Data =data ;if len (data )< height *_cdd .RowStride {return nil ,_d .Errorf (_feg ,"\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 *_cdd .RowStride );
|
|
|
|
};return _cdd ,nil ;};func _gdc (_fcd ,_ab *Bitmap ,_bdd int ,_fb []byte ,_eac int )(_ff error ){const _eg ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0031";var (_bgb ,_fgf ,_aafa ,_bged ,_dfd ,_cfd ,_cde ,_aaff int ;
|
|
|
|
_fd ,_eab uint32 ;_fgb ,_bdc byte ;_cgg uint16 ;);_adce :=make ([]byte ,4);_bea :=make ([]byte ,4);for _aafa =0;_aafa < _fcd .Height -1;_aafa ,_bged =_aafa +2,_bged +1{_bgb =_aafa *_fcd .RowStride ;_fgf =_bged *_ab .RowStride ;for _dfd ,_cfd =0,0;_dfd < _eac ;
|
|
|
|
_dfd ,_cfd =_dfd +4,_cfd +1{for _cde =0;_cde < 4;_cde ++{_aaff =_bgb +_dfd +_cde ;if _aaff <=len (_fcd .Data )-1&&_aaff < _bgb +_fcd .RowStride {_adce [_cde ]=_fcd .Data [_aaff ];}else {_adce [_cde ]=0x00;};_aaff =_bgb +_fcd .RowStride +_dfd +_cde ;if _aaff <=len (_fcd .Data )-1&&_aaff < _bgb +(2*_fcd .RowStride ){_bea [_cde ]=_fcd .Data [_aaff ];
|
|
|
|
}else {_bea [_cde ]=0x00;};};_fd =_a .BigEndian .Uint32 (_adce );_eab =_a .BigEndian .Uint32 (_bea );_eab |=_fd ;_eab |=_eab <<1;_eab &=0xaaaaaaaa;_fd =_eab |(_eab <<7);_fgb =byte (_fd >>24);_bdc =byte ((_fd >>8)&0xff);_aaff =_fgf +_cfd ;if _aaff +1==len (_ab .Data )-1||_aaff +1>=_fgf +_ab .RowStride {_ab .Data [_aaff ]=_fb [_fgb ];
|
|
|
|
}else {_cgg =(uint16 (_fb [_fgb ])<<8)|uint16 (_fb [_bdc ]);if _ff =_ab .setTwoBytes (_aaff ,_cgg );_ff !=nil {return _d .Wrapf (_ff ,_eg ,"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",_aaff );
|
|
|
|
};_cfd ++;};};};return nil ;};func (_bfa *Bitmap )clearAll ()error {return _bfa .RasterOperation (0,0,_bfa .Width ,_bfa .Height ,PixClr ,nil ,0,0);};func (_feec *ClassedPoints )Len ()int {return _feec .IntSlice .Size ()};func _abea (_cdgg ,_cddg *Bitmap ,_bgc ,_fcfc int )(*Bitmap ,error ){const _ebfdg ="\u006fp\u0065\u006e\u0042\u0072\u0069\u0063k";
|
|
|
|
if _cddg ==nil {return nil ,_d .Error (_ebfdg ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};if _bgc < 1&&_fcfc < 1{return nil ,_d .Error (_ebfdg ,"\u0068\u0053\u0069\u007ae \u003c\u0020\u0031\u0020\u0026\u0026\u0020\u0076\u0053\u0069\u007a\u0065\u0020\u003c \u0031");
|
|
|
|
};if _bgc ==1&&_fcfc ==1{return _cddg .Copy (),nil ;};if _bgc ==1||_fcfc ==1{var _gaea error ;_fbbf :=SelCreateBrick (_fcfc ,_bgc ,_fcfc /2,_bgc /2,SelHit );_cdgg ,_gaea =_ecfa (_cdgg ,_cddg ,_fbbf );if _gaea !=nil {return nil ,_d .Wrap (_gaea ,_ebfdg ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
|
|
};return _cdgg ,nil ;};_cedc :=SelCreateBrick (1,_bgc ,0,_bgc /2,SelHit );_cgeb :=SelCreateBrick (_fcfc ,1,_fcfc /2,0,SelHit );_deed ,_bded :=_cgfe (nil ,_cddg ,_cedc );if _bded !=nil {return nil ,_d .Wrap (_bded ,_ebfdg ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");
|
|
|
|
};_cdgg ,_bded =_cgfe (_cdgg ,_deed ,_cgeb );if _bded !=nil {return nil ,_d .Wrap (_bded ,_ebfdg ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};_ ,_bded =_gfed (_deed ,_cdgg ,_cedc );if _bded !=nil {return nil ,_d .Wrap (_bded ,_ebfdg ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
|
|
};_ ,_bded =_gfed (_cdgg ,_deed ,_cgeb );if _bded !=nil {return nil ,_d .Wrap (_bded ,_ebfdg ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};return _cdgg ,nil ;};func _ggad (_bbgde ,_dbbf ,_fgcaf byte )byte {return (_bbgde &^(_fgcaf ))|(_dbbf &_fgcaf )};
|
|
|
|
func _dfaf (_bced *Bitmap ,_gdbca ,_cdabg ,_ebca ,_dadf int ,_aebc RasterOperator ){if _gdbca < 0{_ebca +=_gdbca ;_gdbca =0;};_fbdb :=_gdbca +_ebca -_bced .Width ;if _fbdb > 0{_ebca -=_fbdb ;};if _cdabg < 0{_dadf +=_cdabg ;_cdabg =0;};_faeg :=_cdabg +_dadf -_bced .Height ;
|
|
|
|
if _faeg > 0{_dadf -=_faeg ;};if _ebca <=0||_dadf <=0{return ;};if (_gdbca &7)==0{_cbad (_bced ,_gdbca ,_cdabg ,_ebca ,_dadf ,_aebc );}else {_bggb (_bced ,_gdbca ,_cdabg ,_ebca ,_dadf ,_aebc );};};func (_cafg Points )Get (i int )(Point ,error ){if i > len (_cafg )-1{return Point {},_d .Errorf ("\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0065\u0074","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
|
|
};return _cafg [i ],nil ;};func (_cag *Bitmap )addBorderGeneral (_abc ,_aff ,_abfg ,_bcbg int ,_fbda int )(*Bitmap ,error ){const _efc ="\u0061\u0064d\u0042\u006f\u0072d\u0065\u0072\u0047\u0065\u006e\u0065\u0072\u0061\u006c";if _abc < 0||_aff < 0||_abfg < 0||_bcbg < 0{return nil ,_d .Error (_efc ,"n\u0065\u0067\u0061\u0074iv\u0065 \u0062\u006f\u0072\u0064\u0065r\u0020\u0061\u0064\u0064\u0065\u0064");
|
|
|
|
};_fgcf ,_ecdd :=_cag .Width ,_cag .Height ;_cbe :=_fgcf +_abc +_aff ;_fgdd :=_ecdd +_abfg +_bcbg ;_bgbd :=New (_cbe ,_fgdd );_bgbd .Color =_cag .Color ;_dfdf :=PixClr ;if _fbda > 0{_dfdf =PixSet ;};_aad :=_bgbd .RasterOperation (0,0,_abc ,_fgdd ,_dfdf ,nil ,0,0);
|
|
|
|
if _aad !=nil {return nil ,_d .Wrap (_aad ,_efc ,"\u006c\u0065\u0066\u0074");};_aad =_bgbd .RasterOperation (_cbe -_aff ,0,_aff ,_fgdd ,_dfdf ,nil ,0,0);if _aad !=nil {return nil ,_d .Wrap (_aad ,_efc ,"\u0072\u0069\u0067h\u0074");};_aad =_bgbd .RasterOperation (0,0,_cbe ,_abfg ,_dfdf ,nil ,0,0);
|
|
|
|
if _aad !=nil {return nil ,_d .Wrap (_aad ,_efc ,"\u0074\u006f\u0070");};_aad =_bgbd .RasterOperation (0,_fgdd -_bcbg ,_cbe ,_bcbg ,_dfdf ,nil ,0,0);if _aad !=nil {return nil ,_d .Wrap (_aad ,_efc ,"\u0062\u006f\u0074\u0074\u006f\u006d");};_aad =_bgbd .RasterOperation (_abc ,_abfg ,_fgcf ,_ecdd ,PixSrc ,_cag ,0,0);
|
|
|
|
if _aad !=nil {return nil ,_d .Wrap (_aad ,_efc ,"\u0063\u006f\u0070\u0079");};return _bgbd ,nil ;};func SelCreateBrick (h ,w int ,cy ,cx int ,tp SelectionValue )*Selection {_cgbf :=_abdb (h ,w ,"");_cgbf .setOrigin (cy ,cx );var _ddbc ,_faef int ;for _ddbc =0;
|
|
|
|
_ddbc < h ;_ddbc ++{for _faef =0;_faef < w ;_faef ++{_cgbf .Data [_ddbc ][_faef ]=tp ;};};return _cgbf ;};const (Vanilla Color =iota ;Chocolate ;);func (_bgfe *Bitmap )GetComponents (components Component ,maxWidth ,maxHeight int )(_deg *Bitmaps ,_afbg *Boxes ,_bcec error ){const _gfg ="B\u0069t\u006d\u0061\u0070\u002e\u0047\u0065\u0074\u0043o\u006d\u0070\u006f\u006een\u0074\u0073";
|
|
|
|
if _bgfe ==nil {return nil ,nil ,_d .Error (_gfg ,"\u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0042\u0069\u0074\u006da\u0070\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069n\u0065\u0064\u002e");};switch components {case ComponentConn ,ComponentCharacters ,ComponentWords :default:return nil ,nil ,_d .Error (_gfg ,"\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 _bgfe .Zero (){_afbg =&Boxes {};_deg =&Bitmaps {};return _deg ,_afbg ,nil ;};switch components {case ComponentConn :_deg =&Bitmaps {};if _afbg ,_bcec =_bgfe .ConnComponents (_deg ,8);_bcec !=nil {return nil ,nil ,_d .Wrap (_bcec ,_gfg ,"\u006e\u006f \u0070\u0072\u0065p\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");
|
|
|
|
};case ComponentCharacters :_fcga ,_ddfg :=MorphSequence (_bgfe ,MorphProcess {Operation :MopClosing ,Arguments :[]int {1,6}});if _ddfg !=nil {return nil ,nil ,_d .Wrap (_ddfg ,_gfg ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");
|
|
|
|
};if _dd .Log .IsLogLevel (_dd .LogLevelTrace ){_dd .Log .Trace ("\u0043o\u006d\u0070o\u006e\u0065\u006e\u0074C\u0068\u0061\u0072a\u0063\u0074\u0065\u0072\u0073\u0020\u0062\u0069\u0074ma\u0070\u0020\u0061f\u0074\u0065r\u0020\u0063\u006c\u006f\u0073\u0069n\u0067\u003a \u0025\u0073",_fcga .String ());
|
|
|
|
};_fegfb :=&Bitmaps {};_afbg ,_ddfg =_fcga .ConnComponents (_fegfb ,8);if _ddfg !=nil {return nil ,nil ,_d .Wrap (_ddfg ,_gfg ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");
|
|
|
|
};if _dd .Log .IsLogLevel (_dd .LogLevelTrace ){_dd .Log .Trace ("\u0043\u006f\u006d\u0070\u006f\u006ee\u006e\u0074\u0043\u0068\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0062\u0069\u0074\u006d\u0061\u0070\u0020a\u0066\u0074\u0065\u0072\u0020\u0063\u006f\u006e\u006e\u0065\u0063\u0074\u0069\u0076i\u0074y\u003a\u0020\u0025\u0073",_fegfb .String ());
|
|
|
|
};if _deg ,_ddfg =_fegfb .ClipToBitmap (_bgfe );_ddfg !=nil {return nil ,nil ,_d .Wrap (_ddfg ,_gfg ,"\u0063h\u0061\u0072\u0061\u0063\u0074\u0065\u0072\u0073\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0069\u006e\u0067");};case ComponentWords :_aedc :=1;
|
|
|
|
var _fdfc *Bitmap ;switch {case _bgfe .XResolution <=200:_fdfc =_bgfe ;case _bgfe .XResolution <=400:_aedc =2;_fdfc ,_bcec =_bdf (_bgfe ,1,0,0,0);if _bcec !=nil {return nil ,nil ,_d .Wrap (_bcec ,_gfg ,"w\u006f\u0072\u0064\u0020\u0070\u0072e\u0070\u0072\u006f\u0063\u0065\u0073\u0073\u0020\u002d \u0078\u0072\u0065s\u003c=\u0034\u0030\u0030");
|
|
|
|
};default:_aedc =4;_fdfc ,_bcec =_bdf (_bgfe ,1,1,0,0);if _bcec !=nil {return nil ,nil ,_d .Wrap (_bcec ,_gfg ,"\u0077\u006f\u0072\u0064 \u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073 \u002d \u0078\u0072\u0065\u0073\u0020\u003e\u00204\u0030\u0030");
|
|
|
|
};};_defb ,_ ,_egafg :=_febe (_fdfc );if _egafg !=nil {return nil ,nil ,_d .Wrap (_egafg ,_gfg ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");};_dadb ,_egafg :=_ebcda (_defb ,_aedc );if _egafg !=nil {return nil ,nil ,_d .Wrap (_egafg ,_gfg ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");
|
|
|
|
};_cfcd :=&Bitmaps {};if _afbg ,_egafg =_dadb .ConnComponents (_cfcd ,4);_egafg !=nil {return nil ,nil ,_d .Wrap (_egafg ,_gfg ,"\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 _deg ,_egafg =_cfcd .ClipToBitmap (_bgfe );_egafg !=nil {return nil ,nil ,_d .Wrap (_egafg ,_gfg ,"\u0077o\u0072d\u0020\u0070\u0072\u0065\u0070\u0072\u006f\u0063\u0065\u0073\u0073");};};_deg ,_bcec =_deg .SelectBySize (maxWidth ,maxHeight ,LocSelectIfBoth ,SizeSelectIfLTE );
|
|
|
|
if _bcec !=nil {return nil ,nil ,_d .Wrap (_bcec ,_gfg ,"");};_afbg ,_bcec =_afbg .SelectBySize (maxWidth ,maxHeight ,LocSelectIfBoth ,SizeSelectIfLTE );if _bcec !=nil {return nil ,nil ,_d .Wrap (_bcec ,_gfg ,"");};return _deg ,_afbg ,nil ;};func (_bdec *Bitmaps )GetBitmap (i int )(*Bitmap ,error ){const _ggab ="\u0047e\u0074\u0042\u0069\u0074\u006d\u0061p";
|
|
|
|
if _bdec ==nil {return nil ,_d .Error (_ggab ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0042\u0069\u0074ma\u0070\u0073");};if i > len (_bdec .Values )-1{return nil ,_d .Errorf (_ggab ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
|
|
};return _bdec .Values [i ],nil ;};type SizeComparison int ;func NewWithUnpaddedData (width ,height int ,data []byte )(*Bitmap ,error ){const _dda ="\u004e\u0065\u0077\u0057it\u0068\u0055\u006e\u0070\u0061\u0064\u0064\u0065\u0064\u0044\u0061\u0074\u0061";
|
|
|
|
_ddgda :=_ccb (width ,height );_ddgda .Data =data ;if _bcg :=((width *height )+7)>>3;len (data )< _bcg {return nil ,_d .Errorf (_dda ,"\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 ),_bcg );
|
|
|
|
};if _dfcc :=_ddgda .addPadBits ();_dfcc !=nil {return nil ,_d .Wrap (_dfcc ,_dda ,"");};return _ddgda ,nil ;};func CorrelationScoreThresholded (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab ,downcount []int ,scoreThreshold float32 )(bool ,error ){const _dbd ="C\u006f\u0072\u0072\u0065\u006c\u0061t\u0069\u006f\u006e\u0053\u0063\u006f\u0072\u0065\u0054h\u0072\u0065\u0073h\u006fl\u0064\u0065\u0064";
|
|
|
|
if bm1 ==nil {return false ,_d .Error (_dbd ,"\u0063\u006f\u0072\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u0053\u0063\u006f\u0072\u0065\u0054\u0068\u0072\u0065\u0073\u0068\u006f\u006cd\u0065\u0064\u0020\u0062\u006d1\u0020\u0069s\u0020\u006e\u0069\u006c");
|
|
|
|
};if bm2 ==nil {return false ,_d .Error (_dbd ,"\u0063\u006f\u0072\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u0053\u0063\u006f\u0072\u0065\u0054\u0068\u0072\u0065\u0073\u0068\u006f\u006cd\u0065\u0064\u0020\u0062\u006d2\u0020\u0069s\u0020\u006e\u0069\u006c");
|
|
|
|
};if area1 <=0||area2 <=0{return false ,_d .Error (_dbd ,"c\u006f\u0072\u0072\u0065\u006c\u0061\u0074\u0069\u006fn\u0053\u0063\u006f\u0072\u0065\u0054\u0068re\u0073\u0068\u006f\u006cd\u0065\u0064\u0020\u002d\u0020\u0061\u0072\u0065\u0061s \u006d\u0075s\u0074\u0020\u0062\u0065\u0020\u003e\u0020\u0030");
|
|
|
|
};if downcount ==nil {return false ,_d .Error (_dbd ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u006f\u0020\u0027\u0064\u006f\u0077\u006e\u0063\u006f\u0075\u006e\u0074\u0027");};if tab ==nil {return false ,_d .Error (_dbd ,"p\u0072\u006f\u0076\u0069de\u0064 \u006e\u0069\u006c\u0020\u0027s\u0075\u006d\u0074\u0061\u0062\u0027");
|
|
|
|
};_ecda ,_cdeb :=bm1 .Width ,bm1 .Height ;_ccfb ,_ecdaf :=bm2 .Width ,bm2 .Height ;if _gc .Abs (_ecda -_ccfb )> maxDiffW {return false ,nil ;};if _gc .Abs (_cdeb -_ecdaf )> maxDiffH {return false ,nil ;};_ggedf :=int (delX +_gc .Sign (delX )*0.5);_cbag :=int (delY +_gc .Sign (delY )*0.5);
|
|
|
|
_gdee :=int (_de .Ceil (_de .Sqrt (float64 (scoreThreshold )*float64 (area1 )*float64 (area2 ))));_fbgb :=bm2 .RowStride ;_dbed :=_acgd (_cbag ,0);_dgca :=_bebf (_ecdaf +_cbag ,_cdeb );_egdg :=bm1 .RowStride *_dbed ;_edae :=bm2 .RowStride *(_dbed -_cbag );
|
|
|
|
var _gcaa int ;if _dgca <=_cdeb {_gcaa =downcount [_dgca -1];};_degc :=_acgd (_ggedf ,0);_bcce :=_bebf (_ccfb +_ggedf ,_ecda );var _ggca ,_gfcc int ;if _ggedf >=8{_ggca =_ggedf >>3;_egdg +=_ggca ;_degc -=_ggca <<3;_bcce -=_ggca <<3;_ggedf &=7;}else if _ggedf <=-8{_gfcc =-((_ggedf +7)>>3);
|
|
|
|
_edae +=_gfcc ;_fbgb -=_gfcc ;_ggedf +=_gfcc <<3;};var (_fgfg ,_gbcd ,_adbgg int ;_acefe ,_cefb ,_adcg byte ;);if _degc >=_bcce ||_dbed >=_dgca {return false ,nil ;};_gbba :=(_bcce +7)>>3;switch {case _ggedf ==0:for _gbcd =_dbed ;_gbcd < _dgca ;_gbcd ,_egdg ,_edae =_gbcd +1,_egdg +bm1 .RowStride ,_edae +bm2 .RowStride {for _adbgg =0;
|
|
|
|
_adbgg < _gbba ;_adbgg ++{_acefe =bm1 .Data [_egdg +_adbgg ]&bm2 .Data [_edae +_adbgg ];_fgfg +=tab [_acefe ];};if _fgfg >=_gdee {return true ,nil ;};if _deaa :=_fgfg +downcount [_gbcd ]-_gcaa ;_deaa < _gdee {return false ,nil ;};};case _ggedf > 0&&_fbgb < _gbba :for _gbcd =_dbed ;
|
|
|
|
_gbcd < _dgca ;_gbcd ,_egdg ,_edae =_gbcd +1,_egdg +bm1 .RowStride ,_edae +bm2 .RowStride {_cefb =bm1 .Data [_egdg ];_adcg =bm2 .Data [_edae ]>>uint (_ggedf );_acefe =_cefb &_adcg ;_fgfg +=tab [_acefe ];for _adbgg =1;_adbgg < _fbgb ;_adbgg ++{_cefb =bm1 .Data [_egdg +_adbgg ];
|
|
|
|
_adcg =bm2 .Data [_edae +_adbgg ]>>uint (_ggedf )|bm2 .Data [_edae +_adbgg -1]<<uint (8-_ggedf );_acefe =_cefb &_adcg ;_fgfg +=tab [_acefe ];};_cefb =bm1 .Data [_egdg +_adbgg ];_adcg =bm2 .Data [_edae +_adbgg -1]<<uint (8-_ggedf );_acefe =_cefb &_adcg ;
|
|
|
|
_fgfg +=tab [_acefe ];if _fgfg >=_gdee {return true ,nil ;}else if _fgfg +downcount [_gbcd ]-_gcaa < _gdee {return false ,nil ;};};case _ggedf > 0&&_fbgb >=_gbba :for _gbcd =_dbed ;_gbcd < _dgca ;_gbcd ,_egdg ,_edae =_gbcd +1,_egdg +bm1 .RowStride ,_edae +bm2 .RowStride {_cefb =bm1 .Data [_egdg ];
|
|
|
|
_adcg =bm2 .Data [_edae ]>>uint (_ggedf );_acefe =_cefb &_adcg ;_fgfg +=tab [_acefe ];for _adbgg =1;_adbgg < _gbba ;_adbgg ++{_cefb =bm1 .Data [_egdg +_adbgg ];_adcg =bm2 .Data [_edae +_adbgg ]>>uint (_ggedf );_adcg |=bm2 .Data [_edae +_adbgg -1]<<uint (8-_ggedf );
|
|
|
|
_acefe =_cefb &_adcg ;_fgfg +=tab [_acefe ];};if _fgfg >=_gdee {return true ,nil ;}else if _fgfg +downcount [_gbcd ]-_gcaa < _gdee {return false ,nil ;};};case _gbba < _fbgb :for _gbcd =_dbed ;_gbcd < _dgca ;_gbcd ,_egdg ,_edae =_gbcd +1,_egdg +bm1 .RowStride ,_edae +bm2 .RowStride {for _adbgg =0;
|
|
|
|
_adbgg < _gbba ;_adbgg ++{_cefb =bm1 .Data [_egdg +_adbgg ];_adcg =bm2 .Data [_edae +_adbgg ]<<uint (-_ggedf );_adcg |=bm2 .Data [_edae +_adbgg +1]>>uint (8+_ggedf );_acefe =_cefb &_adcg ;_fgfg +=tab [_acefe ];};if _fgfg >=_gdee {return true ,nil ;}else if _geff :=_fgfg +downcount [_gbcd ]-_gcaa ;
|
|
|
|
_geff < _gdee {return false ,nil ;};};case _fbgb >=_gbba :for _gbcd =_dbed ;_gbcd < _dgca ;_gbcd ,_egdg ,_edae =_gbcd +1,_egdg +bm1 .RowStride ,_edae +bm2 .RowStride {for _adbgg =0;_adbgg < _gbba ;_adbgg ++{_cefb =bm1 .Data [_egdg +_adbgg ];_adcg =bm2 .Data [_edae +_adbgg ]<<uint (-_ggedf );
|
|
|
|
_adcg |=bm2 .Data [_edae +_adbgg +1]>>uint (8+_ggedf );_acefe =_cefb &_adcg ;_fgfg +=tab [_acefe ];};_cefb =bm1 .Data [_egdg +_adbgg ];_adcg =bm2 .Data [_edae +_adbgg ]<<uint (-_ggedf );_acefe =_cefb &_adcg ;_fgfg +=tab [_acefe ];if _fgfg >=_gdee {return true ,nil ;
|
|
|
|
}else if _fgfg +downcount [_gbcd ]-_gcaa < _gdee {return false ,nil ;};};};_fecga :=float32 (_fgfg )*float32 (_fgfg )/(float32 (area1 )*float32 (area2 ));if _fecga >=scoreThreshold {_dd .Log .Trace ("\u0063\u006f\u0075\u006e\u0074\u003a\u0020\u0025\u0064\u0020\u003c\u0020\u0074\u0068\u0072\u0065\u0073\u0068\u006f\u006cd\u0020\u0025\u0064\u0020\u0062\u0075\u0074\u0020\u0073c\u006f\u0072\u0065\u0020\u0025\u0066\u0020\u003e\u003d\u0020\u0073\u0063\u006fr\u0065\u0054\u0068\u0072\u0065\u0073h\u006f\u006c\u0064 \u0025\u0066",_fgfg ,_gdee ,_fecga ,scoreThreshold );
|
|
|
|
};return false ,nil ;};func (_fgcg *byHeight )Swap (i ,j int ){_fgcg .Values [i ],_fgcg .Values [j ]=_fgcg .Values [j ],_fgcg .Values [i ];if _fgcg .Boxes !=nil {_fgcg .Boxes [i ],_fgcg .Boxes [j ]=_fgcg .Boxes [j ],_fgcg .Boxes [i ];};};const (AsymmetricMorphBC BoundaryCondition =iota ;
|
|
|
|
SymmetricMorphBC ;);var (_fbgc *Bitmap ;_cafd *Bitmap ;);func (_egd *Bitmap )nextOnPixelLow (_deec ,_bead ,_dag ,_ebc ,_gcbg int )(_gegg _dc .Point ,_aab bool ,_dfcb error ){const _gaga ="B\u0069\u0074\u006d\u0061p.\u006ee\u0078\u0074\u004f\u006e\u0050i\u0078\u0065\u006c\u004c\u006f\u0077";
|
|
|
|
var (_fabf int ;_bdde byte ;);_fee :=_gcbg *_dag ;_dgc :=_fee +(_ebc /8);if _bdde ,_dfcb =_egd .GetByte (_dgc );_dfcb !=nil {return _gegg ,false ,_d .Wrap (_dfcb ,_gaga ,"\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 _bdde !=0{_ccab :=_ebc -(_ebc %8)+7;for _fabf =_ebc ;_fabf <=_ccab &&_fabf < _deec ;_fabf ++{if _egd .GetPixel (_fabf ,_gcbg ){_gegg .X =_fabf ;_gegg .Y =_gcbg ;return _gegg ,true ,nil ;};};};_cggb :=(_ebc /8)+1;_fabf =8*_cggb ;var _cfcg int ;for _dgc =_fee +_cggb ;
|
|
|
|
_fabf < _deec ;_dgc ,_fabf =_dgc +1,_fabf +8{if _bdde ,_dfcb =_egd .GetByte (_dgc );_dfcb !=nil {return _gegg ,false ,_d .Wrap (_dfcb ,_gaga ,"r\u0065\u0073\u0074\u0020of\u0020t\u0068\u0065\u0020\u006c\u0069n\u0065\u0020\u0062\u0079\u0074\u0065");};if _bdde ==0{continue ;
|
|
|
|
};for _cfcg =0;_cfcg < 8&&_fabf < _deec ;_cfcg ,_fabf =_cfcg +1,_fabf +1{if _egd .GetPixel (_fabf ,_gcbg ){_gegg .X =_fabf ;_gegg .Y =_gcbg ;return _gegg ,true ,nil ;};};};for _beeg :=_gcbg +1;_beeg < _bead ;_beeg ++{_fee =_beeg *_dag ;for _dgc ,_fabf =_fee ,0;
|
|
|
|
_fabf < _deec ;_dgc ,_fabf =_dgc +1,_fabf +8{if _bdde ,_dfcb =_egd .GetByte (_dgc );_dfcb !=nil {return _gegg ,false ,_d .Wrap (_dfcb ,_gaga ,"\u0066o\u006cl\u006f\u0077\u0069\u006e\u0067\u0020\u006c\u0069\u006e\u0065\u0073");};if _bdde ==0{continue ;};
|
|
|
|
for _cfcg =0;_cfcg < 8&&_fabf < _deec ;_cfcg ,_fabf =_cfcg +1,_fabf +1{if _egd .GetPixel (_fabf ,_beeg ){_gegg .X =_fabf ;_gegg .Y =_beeg ;return _gegg ,true ,nil ;};};};};return _gegg ,false ,nil ;};func _ebcda (_bgff *Bitmap ,_fbac int )(*Bitmap ,error ){const _aafdc ="\u0065x\u0070a\u006e\u0064\u0052\u0065\u0070\u006c\u0069\u0063\u0061\u0074\u0065";
|
|
|
|
if _bgff ==nil {return nil ,_d .Error (_aafdc ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _fbac <=0{return nil ,_d .Error (_aafdc ,"i\u006e\u0076\u0061\u006cid\u0020f\u0061\u0063\u0074\u006f\u0072 \u002d\u0020\u003c\u003d\u0020\u0030");
|
|
|
|
};if _fbac ==1{_cafc ,_ebcc :=_faec (nil ,_bgff );if _ebcc !=nil {return nil ,_d .Wrap (_ebcc ,_aafdc ,"\u0066\u0061\u0063\u0074\u006f\u0072\u0020\u003d\u0020\u0031");};return _cafc ,nil ;};_bagdf ,_ccba :=_cab (_bgff ,_fbac ,_fbac );if _ccba !=nil {return nil ,_d .Wrap (_ccba ,_aafdc ,"");
|
|
|
|
};return _bagdf ,nil ;};func _ffdd (_bbbdc *Bitmap ,_bccg ,_fdfba ,_cdafa ,_acee int ,_ddbd RasterOperator ,_eaddc *Bitmap ,_fcfd ,_dabf int )error {var (_bga bool ;_cdda bool ;_addg int ;_aece int ;_cagba int ;_cbcd bool ;_aadb byte ;_eec int ;_fdag int ;
|
|
|
|
_affga int ;_fdbg ,_gfcg int ;);_fcab :=8-(_bccg &7);_degd :=_afcg [_fcab ];_gfca :=_bbbdc .RowStride *_fdfba +(_bccg >>3);_ecdf :=_eaddc .RowStride *_dabf +(_fcfd >>3);if _cdafa < _fcab {_bga =true ;_degd &=_gbcf [8-_fcab +_cdafa ];};if !_bga {_addg =(_cdafa -_fcab )>>3;
|
|
|
|
if _addg > 0{_cdda =true ;_aece =_gfca +1;_cagba =_ecdf +1;};};_eec =(_bccg +_cdafa )&7;if !(_bga ||_eec ==0){_cbcd =true ;_aadb =_gbcf [_eec ];_fdag =_gfca +1+_addg ;_affga =_ecdf +1+_addg ;};switch _ddbd {case PixSrc :for _fdbg =0;_fdbg < _acee ;_fdbg ++{_bbbdc .Data [_gfca ]=_ggad (_bbbdc .Data [_gfca ],_eaddc .Data [_ecdf ],_degd );
|
|
|
|
_gfca +=_bbbdc .RowStride ;_ecdf +=_eaddc .RowStride ;};if _cdda {for _fdbg =0;_fdbg < _acee ;_fdbg ++{for _gfcg =0;_gfcg < _addg ;_gfcg ++{_bbbdc .Data [_aece +_gfcg ]=_eaddc .Data [_cagba +_gfcg ];};_aece +=_bbbdc .RowStride ;_cagba +=_eaddc .RowStride ;
|
|
|
|
};};if _cbcd {for _fdbg =0;_fdbg < _acee ;_fdbg ++{_bbbdc .Data [_fdag ]=_ggad (_bbbdc .Data [_fdag ],_eaddc .Data [_affga ],_aadb );_fdag +=_bbbdc .RowStride ;_affga +=_eaddc .RowStride ;};};case PixNotSrc :for _fdbg =0;_fdbg < _acee ;_fdbg ++{_bbbdc .Data [_gfca ]=_ggad (_bbbdc .Data [_gfca ],^_eaddc .Data [_ecdf ],_degd );
|
|
|
|
_gfca +=_bbbdc .RowStride ;_ecdf +=_eaddc .RowStride ;};if _cdda {for _fdbg =0;_fdbg < _acee ;_fdbg ++{for _gfcg =0;_gfcg < _addg ;_gfcg ++{_bbbdc .Data [_aece +_gfcg ]=^_eaddc .Data [_cagba +_gfcg ];};_aece +=_bbbdc .RowStride ;_cagba +=_eaddc .RowStride ;
|
|
|
|
};};if _cbcd {for _fdbg =0;_fdbg < _acee ;_fdbg ++{_bbbdc .Data [_fdag ]=_ggad (_bbbdc .Data [_fdag ],^_eaddc .Data [_affga ],_aadb );_fdag +=_bbbdc .RowStride ;_affga +=_eaddc .RowStride ;};};case PixSrcOrDst :for _fdbg =0;_fdbg < _acee ;_fdbg ++{_bbbdc .Data [_gfca ]=_ggad (_bbbdc .Data [_gfca ],_eaddc .Data [_ecdf ]|_bbbdc .Data [_gfca ],_degd );
|
|
|
|
_gfca +=_bbbdc .RowStride ;_ecdf +=_eaddc .RowStride ;};if _cdda {for _fdbg =0;_fdbg < _acee ;_fdbg ++{for _gfcg =0;_gfcg < _addg ;_gfcg ++{_bbbdc .Data [_aece +_gfcg ]|=_eaddc .Data [_cagba +_gfcg ];};_aece +=_bbbdc .RowStride ;_cagba +=_eaddc .RowStride ;
|
|
|
|
};};if _cbcd {for _fdbg =0;_fdbg < _acee ;_fdbg ++{_bbbdc .Data [_fdag ]=_ggad (_bbbdc .Data [_fdag ],_eaddc .Data [_affga ]|_bbbdc .Data [_fdag ],_aadb );_fdag +=_bbbdc .RowStride ;_affga +=_eaddc .RowStride ;};};case PixSrcAndDst :for _fdbg =0;_fdbg < _acee ;
|
|
|
|
_fdbg ++{_bbbdc .Data [_gfca ]=_ggad (_bbbdc .Data [_gfca ],_eaddc .Data [_ecdf ]&_bbbdc .Data [_gfca ],_degd );_gfca +=_bbbdc .RowStride ;_ecdf +=_eaddc .RowStride ;};if _cdda {for _fdbg =0;_fdbg < _acee ;_fdbg ++{for _gfcg =0;_gfcg < _addg ;_gfcg ++{_bbbdc .Data [_aece +_gfcg ]&=_eaddc .Data [_cagba +_gfcg ];
|
|
|
|
};_aece +=_bbbdc .RowStride ;_cagba +=_eaddc .RowStride ;};};if _cbcd {for _fdbg =0;_fdbg < _acee ;_fdbg ++{_bbbdc .Data [_fdag ]=_ggad (_bbbdc .Data [_fdag ],_eaddc .Data [_affga ]&_bbbdc .Data [_fdag ],_aadb );_fdag +=_bbbdc .RowStride ;_affga +=_eaddc .RowStride ;
|
|
|
|
};};case PixSrcXorDst :for _fdbg =0;_fdbg < _acee ;_fdbg ++{_bbbdc .Data [_gfca ]=_ggad (_bbbdc .Data [_gfca ],_eaddc .Data [_ecdf ]^_bbbdc .Data [_gfca ],_degd );_gfca +=_bbbdc .RowStride ;_ecdf +=_eaddc .RowStride ;};if _cdda {for _fdbg =0;_fdbg < _acee ;
|
|
|
|
_fdbg ++{for _gfcg =0;_gfcg < _addg ;_gfcg ++{_bbbdc .Data [_aece +_gfcg ]^=_eaddc .Data [_cagba +_gfcg ];};_aece +=_bbbdc .RowStride ;_cagba +=_eaddc .RowStride ;};};if _cbcd {for _fdbg =0;_fdbg < _acee ;_fdbg ++{_bbbdc .Data [_fdag ]=_ggad (_bbbdc .Data [_fdag ],_eaddc .Data [_affga ]^_bbbdc .Data [_fdag ],_aadb );
|
|
|
|
_fdag +=_bbbdc .RowStride ;_affga +=_eaddc .RowStride ;};};case PixNotSrcOrDst :for _fdbg =0;_fdbg < _acee ;_fdbg ++{_bbbdc .Data [_gfca ]=_ggad (_bbbdc .Data [_gfca ],^(_eaddc .Data [_ecdf ])|_bbbdc .Data [_gfca ],_degd );_gfca +=_bbbdc .RowStride ;_ecdf +=_eaddc .RowStride ;
|
|
|
|
};if _cdda {for _fdbg =0;_fdbg < _acee ;_fdbg ++{for _gfcg =0;_gfcg < _addg ;_gfcg ++{_bbbdc .Data [_aece +_gfcg ]|=^(_eaddc .Data [_cagba +_gfcg ]);};_aece +=_bbbdc .RowStride ;_cagba +=_eaddc .RowStride ;};};if _cbcd {for _fdbg =0;_fdbg < _acee ;_fdbg ++{_bbbdc .Data [_fdag ]=_ggad (_bbbdc .Data [_fdag ],^(_eaddc .Data [_affga ])|_bbbdc .Data [_fdag ],_aadb );
|
|
|
|
_fdag +=_bbbdc .RowStride ;_affga +=_eaddc .RowStride ;};};case PixNotSrcAndDst :for _fdbg =0;_fdbg < _acee ;_fdbg ++{_bbbdc .Data [_gfca ]=_ggad (_bbbdc .Data [_gfca ],^(_eaddc .Data [_ecdf ])&_bbbdc .Data [_gfca ],_degd );_gfca +=_bbbdc .RowStride ;_ecdf +=_eaddc .RowStride ;
|
|
|
|
};if _cdda {for _fdbg =0;_fdbg < _acee ;_fdbg ++{for _gfcg =0;_gfcg < _addg ;_gfcg ++{_bbbdc .Data [_aece +_gfcg ]&=^_eaddc .Data [_cagba +_gfcg ];};_aece +=_bbbdc .RowStride ;_cagba +=_eaddc .RowStride ;};};if _cbcd {for _fdbg =0;_fdbg < _acee ;_fdbg ++{_bbbdc .Data [_fdag ]=_ggad (_bbbdc .Data [_fdag ],^(_eaddc .Data [_affga ])&_bbbdc .Data [_fdag ],_aadb );
|
|
|
|
_fdag +=_bbbdc .RowStride ;_affga +=_eaddc .RowStride ;};};case PixSrcOrNotDst :for _fdbg =0;_fdbg < _acee ;_fdbg ++{_bbbdc .Data [_gfca ]=_ggad (_bbbdc .Data [_gfca ],_eaddc .Data [_ecdf ]|^(_bbbdc .Data [_gfca ]),_degd );_gfca +=_bbbdc .RowStride ;_ecdf +=_eaddc .RowStride ;
|
|
|
|
};if _cdda {for _fdbg =0;_fdbg < _acee ;_fdbg ++{for _gfcg =0;_gfcg < _addg ;_gfcg ++{_bbbdc .Data [_aece +_gfcg ]=_eaddc .Data [_cagba +_gfcg ]|^(_bbbdc .Data [_aece +_gfcg ]);};_aece +=_bbbdc .RowStride ;_cagba +=_eaddc .RowStride ;};};if _cbcd {for _fdbg =0;
|
|
|
|
_fdbg < _acee ;_fdbg ++{_bbbdc .Data [_fdag ]=_ggad (_bbbdc .Data [_fdag ],_eaddc .Data [_affga ]|^(_bbbdc .Data [_fdag ]),_aadb );_fdag +=_bbbdc .RowStride ;_affga +=_eaddc .RowStride ;};};case PixSrcAndNotDst :for _fdbg =0;_fdbg < _acee ;_fdbg ++{_bbbdc .Data [_gfca ]=_ggad (_bbbdc .Data [_gfca ],_eaddc .Data [_ecdf ]&^(_bbbdc .Data [_gfca ]),_degd );
|
|
|
|
_gfca +=_bbbdc .RowStride ;_ecdf +=_eaddc .RowStride ;};if _cdda {for _fdbg =0;_fdbg < _acee ;_fdbg ++{for _gfcg =0;_gfcg < _addg ;_gfcg ++{_bbbdc .Data [_aece +_gfcg ]=_eaddc .Data [_cagba +_gfcg ]&^(_bbbdc .Data [_aece +_gfcg ]);};_aece +=_bbbdc .RowStride ;
|
|
|
|
_cagba +=_eaddc .RowStride ;};};if _cbcd {for _fdbg =0;_fdbg < _acee ;_fdbg ++{_bbbdc .Data [_fdag ]=_ggad (_bbbdc .Data [_fdag ],_eaddc .Data [_affga ]&^(_bbbdc .Data [_fdag ]),_aadb );_fdag +=_bbbdc .RowStride ;_affga +=_eaddc .RowStride ;};};case PixNotPixSrcOrDst :for _fdbg =0;
|
|
|
|
_fdbg < _acee ;_fdbg ++{_bbbdc .Data [_gfca ]=_ggad (_bbbdc .Data [_gfca ],^(_eaddc .Data [_ecdf ]|_bbbdc .Data [_gfca ]),_degd );_gfca +=_bbbdc .RowStride ;_ecdf +=_eaddc .RowStride ;};if _cdda {for _fdbg =0;_fdbg < _acee ;_fdbg ++{for _gfcg =0;_gfcg < _addg ;
|
|
|
|
_gfcg ++{_bbbdc .Data [_aece +_gfcg ]=^(_eaddc .Data [_cagba +_gfcg ]|_bbbdc .Data [_aece +_gfcg ]);};_aece +=_bbbdc .RowStride ;_cagba +=_eaddc .RowStride ;};};if _cbcd {for _fdbg =0;_fdbg < _acee ;_fdbg ++{_bbbdc .Data [_fdag ]=_ggad (_bbbdc .Data [_fdag ],^(_eaddc .Data [_affga ]|_bbbdc .Data [_fdag ]),_aadb );
|
|
|
|
_fdag +=_bbbdc .RowStride ;_affga +=_eaddc .RowStride ;};};case PixNotPixSrcAndDst :for _fdbg =0;_fdbg < _acee ;_fdbg ++{_bbbdc .Data [_gfca ]=_ggad (_bbbdc .Data [_gfca ],^(_eaddc .Data [_ecdf ]&_bbbdc .Data [_gfca ]),_degd );_gfca +=_bbbdc .RowStride ;
|
|
|
|
_ecdf +=_eaddc .RowStride ;};if _cdda {for _fdbg =0;_fdbg < _acee ;_fdbg ++{for _gfcg =0;_gfcg < _addg ;_gfcg ++{_bbbdc .Data [_aece +_gfcg ]=^(_eaddc .Data [_cagba +_gfcg ]&_bbbdc .Data [_aece +_gfcg ]);};_aece +=_bbbdc .RowStride ;_cagba +=_eaddc .RowStride ;
|
|
|
|
};};if _cbcd {for _fdbg =0;_fdbg < _acee ;_fdbg ++{_bbbdc .Data [_fdag ]=_ggad (_bbbdc .Data [_fdag ],^(_eaddc .Data [_affga ]&_bbbdc .Data [_fdag ]),_aadb );_fdag +=_bbbdc .RowStride ;_affga +=_eaddc .RowStride ;};};case PixNotPixSrcXorDst :for _fdbg =0;
|
|
|
|
_fdbg < _acee ;_fdbg ++{_bbbdc .Data [_gfca ]=_ggad (_bbbdc .Data [_gfca ],^(_eaddc .Data [_ecdf ]^_bbbdc .Data [_gfca ]),_degd );_gfca +=_bbbdc .RowStride ;_ecdf +=_eaddc .RowStride ;};if _cdda {for _fdbg =0;_fdbg < _acee ;_fdbg ++{for _gfcg =0;_gfcg < _addg ;
|
|
|
|
_gfcg ++{_bbbdc .Data [_aece +_gfcg ]=^(_eaddc .Data [_cagba +_gfcg ]^_bbbdc .Data [_aece +_gfcg ]);};_aece +=_bbbdc .RowStride ;_cagba +=_eaddc .RowStride ;};};if _cbcd {for _fdbg =0;_fdbg < _acee ;_fdbg ++{_bbbdc .Data [_fdag ]=_ggad (_bbbdc .Data [_fdag ],^(_eaddc .Data [_affga ]^_bbbdc .Data [_fdag ]),_aadb );
|
|
|
|
_fdag +=_bbbdc .RowStride ;_affga +=_eaddc .RowStride ;};};default:_dd .Log .Debug ("I\u006e\u0076\u0061\u006c\u0069\u0064 \u0072\u0061\u0073\u0074\u0065\u0072\u0020\u006f\u0070e\u0072\u0061\u0074o\u0072:\u0020\u0025\u0064",_ddbd );return _d .Error ("\u0072\u0061\u0073\u0074er\u004f\u0070\u0056\u0041\u006c\u0069\u0067\u006e\u0065\u0064\u004c\u006f\u0077","\u0069\u006e\u0076al\u0069\u0064\u0020\u0072\u0061\u0073\u0074\u0065\u0072\u0020\u006f\u0070\u0065\u0072\u0061\u0074\u006f\u0072");
|
|
|
|
};return nil ;};func _acgd (_cfa ,_cee int )int {if _cfa > _cee {return _cfa ;};return _cee ;};func _agg (_dbc ,_dfgd *Bitmap )(_faa error ){const _bd ="\u0065\u0078\u0070\u0061nd\u0042\u0069\u006e\u0061\u0072\u0079\u0046\u0061\u0063\u0074\u006f\u0072\u0038";
|
|
|
|
_ga :=_dfgd .RowStride ;_agf :=_dbc .RowStride ;var _fg ,_bee ,_eca ,_cg ,_fac int ;for _eca =0;_eca < _dfgd .Height ;_eca ++{_fg =_eca *_ga ;_bee =8*_eca *_agf ;for _cg =0;_cg < _ga ;_cg ++{if _faa =_dbc .setEightBytes (_bee +_cg *8,_cgbd [_dfgd .Data [_fg +_cg ]]);
|
|
|
|
_faa !=nil {return _d .Wrap (_faa ,_bd ,"");};};for _fac =1;_fac < 8;_fac ++{for _cg =0;_cg < _agf ;_cg ++{if _faa =_dbc .SetByte (_bee +_fac *_agf +_cg ,_dbc .Data [_bee +_cg ]);_faa !=nil {return _d .Wrap (_faa ,_bd ,"");};};};};return nil ;};type Component int ;
|
|
|
|
func (_fccga *Bitmap )CountPixels ()int {return _fccga .countPixels ()};func (_fdf *Bitmap )removeBorderGeneral (_dea ,_dfea ,_faga ,_fgfc int )(*Bitmap ,error ){const _ggbc ="\u0072\u0065\u006d\u006fve\u0042\u006f\u0072\u0064\u0065\u0072\u0047\u0065\u006e\u0065\u0072\u0061\u006c";
|
|
|
|
if _dea < 0||_dfea < 0||_faga < 0||_fgfc < 0{return nil ,_d .Error (_ggbc ,"\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");};_fca ,_dfec :=_fdf .Width ,_fdf .Height ;
|
|
|
|
_beec :=_fca -_dea -_dfea ;_aac :=_dfec -_faga -_fgfc ;if _beec <=0{return nil ,_d .Errorf (_ggbc ,"w\u0069\u0064\u0074\u0068: \u0025d\u0020\u006d\u0075\u0073\u0074 \u0062\u0065\u0020\u003e\u0020\u0030",_beec );};if _aac <=0{return nil ,_d .Errorf (_ggbc ,"\u0068\u0065\u0069\u0067ht\u003a\u0020\u0025\u0064\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065\u0020\u003e \u0030",_aac );
|
|
|
|
};_ebd :=New (_beec ,_aac );_ebd .Color =_fdf .Color ;_befg :=_ebd .RasterOperation (0,0,_beec ,_aac ,PixSrc ,_fdf ,_dea ,_faga );if _befg !=nil {return nil ,_d .Wrap (_befg ,_ggbc ,"");};return _ebd ,nil ;};func Rect (x ,y ,w ,h int )(*_dc .Rectangle ,error ){const _ada ="b\u0069\u0074\u006d\u0061\u0070\u002e\u0052\u0065\u0063\u0074";
|
|
|
|
if x < 0{w +=x ;x =0;if w <=0{return nil ,_d .Errorf (_ada ,"x\u003a\u0027\u0025\u0064\u0027\u0020<\u0020\u0030\u0020\u0061\u006e\u0064\u0020\u0077\u003a \u0027\u0025\u0064'\u0020<\u003d\u0020\u0030",x ,w );};};if y < 0{h +=y ;y =0;if h <=0{return nil ,_d .Error (_ada ,"\u0079\u0020\u003c 0\u0020\u0061\u006e\u0064\u0020\u0062\u006f\u0078\u0020\u006f\u0066\u0066\u0020\u002b\u0071\u0075\u0061\u0064");
|
|
|
|
};};_dcb :=_dc .Rect (x ,y ,x +w ,y +h );return &_dcb ,nil ;};func (_ccadb *Bitmaps )SortByHeight (){_fceg :=(*byHeight )(_ccadb );_ge .Sort (_fceg )};func (_afba Points )YSorter ()func (_dagf ,_cfaga int )bool {return func (_cffdg ,_fccf int )bool {return _afba [_cffdg ].Y < _afba [_fccf ].Y };
|
|
|
|
};const _ecce =5000;func (_bdcff MorphProcess )verify (_dabc int ,_cdgd ,_aafdb *int )error {const _dacb ="\u004d\u006f\u0072\u0070hP\u0072\u006f\u0063\u0065\u0073\u0073\u002e\u0076\u0065\u0072\u0069\u0066\u0079";switch _bdcff .Operation {case MopDilation ,MopErosion ,MopOpening ,MopClosing :if len (_bdcff .Arguments )!=2{return _d .Error (_dacb ,"\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");
|
|
|
|
};_gfgb ,_gadac :=_bdcff .getWidthHeight ();if _gfgb <=0||_gadac <=0{return _d .Error (_dacb ,"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 :_dcgd :=len (_bdcff .Arguments );*_cdgd +=_dcgd ;if _dcgd < 1||_dcgd > 4{return _d .Error (_dacb ,"\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 _ebfd :=0;_ebfd < _dcgd ;_ebfd ++{if _bdcff .Arguments [_ebfd ]< 1||_bdcff .Arguments [_ebfd ]> 4{return _d .Error (_dacb ,"\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 (_bdcff .Arguments )==0{return _d .Error (_dacb ,"\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");
|
|
|
|
};_deba :=_bdcff .Arguments [0];if _deba !=2&&_deba !=4&&_deba !=8{return _d .Error (_dacb ,"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");
|
|
|
|
};*_cdgd -=_abad [_deba /4];case MopAddBorder :if len (_bdcff .Arguments )==0{return _d .Error (_dacb ,"\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");
|
|
|
|
};_gdbb :=_bdcff .Arguments [0];if _dabc > 0{return _d .Error (_dacb ,"\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 _gdbb < 1{return _d .Error (_dacb ,"\u0041\u0064\u0064\u0042o\u0072\u0064\u0065\u0072\u0020\u0076\u0061\u006c\u0075\u0065 \u006co\u0077\u0065\u0072\u0020\u0074\u0068\u0061n\u0020\u0030");};*_aafdb =_gdbb ;};return nil ;};func (_dced *Bitmap )countPixels ()int {var (_adbg int ;
|
|
|
|
_acd uint8 ;_gef byte ;_acf int ;);_dfad :=_dced .RowStride ;_ccdc :=uint (_dced .Width &0x07);if _ccdc !=0{_acd =uint8 ((0xff<<(8-_ccdc ))&0xff);_dfad --;};for _aecf :=0;_aecf < _dced .Height ;_aecf ++{for _acf =0;_acf < _dfad ;_acf ++{_gef =_dced .Data [_aecf *_dced .RowStride +_acf ];
|
|
|
|
_adbg +=int (_efg [_gef ]);};if _ccdc !=0{_adbg +=int (_efg [_dced .Data [_aecf *_dced .RowStride +_acf ]&_acd ]);};};return _adbg ;};func (_accb *Bitmap )SetPixel (x ,y int ,pixel byte )error {_bag :=_accb .GetByteIndex (x ,y );if _bag > len (_accb .Data )-1{return _d .Errorf ("\u0053\u0065\u0074\u0050\u0069\u0078\u0065\u006c","\u0069\u006e\u0064\u0065x \u006f\u0075\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u003a\u0020%\u0064",_bag );
|
|
|
|
};_gdfc :=_accb .GetBitOffset (x );_deebe :=uint (7-_gdfc );_acaf :=_accb .Data [_bag ];var _dggb byte ;if pixel ==1{_dggb =_acaf |(pixel &0x01<<_deebe );}else {_dggb =_acaf &^(1<<_deebe );};_accb .Data [_bag ]=_dggb ;return nil ;};var _ _ge .Interface =&ClassedPoints {};
|
|
|
|
func (_cdbc *Bitmaps )makeSizeIndicator (_gacg ,_bagf int ,_abcd LocationFilter ,_befe SizeComparison )(_fbeg *_gc .NumSlice ,_ffff error ){const _bcece ="\u0042i\u0074\u006d\u0061\u0070s\u002e\u006d\u0061\u006b\u0065S\u0069z\u0065I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";
|
|
|
|
if _cdbc ==nil {return nil ,_d .Error (_bcece ,"\u0062\u0069\u0074ma\u0070\u0073\u0020\u0027\u0062\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};switch _abcd {case LocSelectWidth ,LocSelectHeight ,LocSelectIfEither ,LocSelectIfBoth :default:return nil ,_d .Errorf (_bcece ,"\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",_abcd );
|
|
|
|
};switch _befe {case SizeSelectIfLT ,SizeSelectIfGT ,SizeSelectIfLTE ,SizeSelectIfGTE ,SizeSelectIfEQ :default:return nil ,_d .Errorf (_bcece ,"\u0069\u006e\u0076\u0061li\u0064\u0020\u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0027\u0025d\u0027",_befe );
|
|
|
|
};_fbeg =&_gc .NumSlice {};var (_cgef ,_bbccf ,_bbbb int ;_bcgb *Bitmap ;);for _ ,_bcgb =range _cdbc .Values {_cgef =0;_bbccf ,_bbbb =_bcgb .Width ,_bcgb .Height ;switch _abcd {case LocSelectWidth :if (_befe ==SizeSelectIfLT &&_bbccf < _gacg )||(_befe ==SizeSelectIfGT &&_bbccf > _gacg )||(_befe ==SizeSelectIfLTE &&_bbccf <=_gacg )||(_befe ==SizeSelectIfGTE &&_bbccf >=_gacg )||(_befe ==SizeSelectIfEQ &&_bbccf ==_gacg ){_cgef =1;
|
|
|
|
};case LocSelectHeight :if (_befe ==SizeSelectIfLT &&_bbbb < _bagf )||(_befe ==SizeSelectIfGT &&_bbbb > _bagf )||(_befe ==SizeSelectIfLTE &&_bbbb <=_bagf )||(_befe ==SizeSelectIfGTE &&_bbbb >=_bagf )||(_befe ==SizeSelectIfEQ &&_bbbb ==_bagf ){_cgef =1;
|
|
|
|
};case LocSelectIfEither :if (_befe ==SizeSelectIfLT &&(_bbccf < _gacg ||_bbbb < _bagf ))||(_befe ==SizeSelectIfGT &&(_bbccf > _gacg ||_bbbb > _bagf ))||(_befe ==SizeSelectIfLTE &&(_bbccf <=_gacg ||_bbbb <=_bagf ))||(_befe ==SizeSelectIfGTE &&(_bbccf >=_gacg ||_bbbb >=_bagf ))||(_befe ==SizeSelectIfEQ &&(_bbccf ==_gacg ||_bbbb ==_bagf )){_cgef =1;
|
|
|
|
};case LocSelectIfBoth :if (_befe ==SizeSelectIfLT &&(_bbccf < _gacg &&_bbbb < _bagf ))||(_befe ==SizeSelectIfGT &&(_bbccf > _gacg &&_bbbb > _bagf ))||(_befe ==SizeSelectIfLTE &&(_bbccf <=_gacg &&_bbbb <=_bagf ))||(_befe ==SizeSelectIfGTE &&(_bbccf >=_gacg &&_bbbb >=_bagf ))||(_befe ==SizeSelectIfEQ &&(_bbccf ==_gacg &&_bbbb ==_bagf )){_cgef =1;
|
|
|
|
};};_fbeg .AddInt (_cgef );};return _fbeg ,nil ;};var _abad =[5]int {1,2,3,0,4};func (_bacca *Bitmaps )selectByIndicator (_caedg *_gc .NumSlice )(_eaaf *Bitmaps ,_acea error ){const _ccca ="\u0042i\u0074\u006d\u0061\u0070s\u002e\u0073\u0065\u006c\u0065c\u0074B\u0079I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";
|
|
|
|
if _bacca ==nil {return nil ,_d .Error (_ccca ,"\u0027\u0062\u0027 b\u0069\u0074\u006d\u0061\u0070\u0073\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};if _caedg ==nil {return nil ,_d .Error (_ccca ,"'\u006e\u0061\u0027\u0020\u0069\u006ed\u0069\u0063\u0061\u0074\u006f\u0072\u0073\u0020\u006eo\u0074\u0020\u0064e\u0066i\u006e\u0065\u0064");
|
|
|
|
};if len (_bacca .Values )==0{return _bacca ,nil ;};if len (*_caedg )!=len (_bacca .Values ){return nil ,_d .Errorf (_ccca ,"\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 (*_caedg ),len (_bacca .Values ));
|
|
|
|
};var _debe ,_face ,_egec int ;for _face =0;_face < len (*_caedg );_face ++{if _debe ,_acea =_caedg .GetInt (_face );_acea !=nil {return nil ,_d .Wrap (_acea ,_ccca ,"f\u0069\u0072\u0073\u0074\u0020\u0063\u0068\u0065\u0063\u006b");};if _debe ==1{_egec ++;
|
|
|
|
};};if _egec ==len (_bacca .Values ){return _bacca ,nil ;};_eaaf =&Bitmaps {};_bebd :=len (_bacca .Values )==len (_bacca .Boxes );for _face =0;_face < len (*_caedg );_face ++{if _debe =int ((*_caedg )[_face ]);_debe ==0{continue ;};_eaaf .Values =append (_eaaf .Values ,_bacca .Values [_face ]);
|
|
|
|
if _bebd {_eaaf .Boxes =append (_eaaf .Boxes ,_bacca .Boxes [_face ]);};};return _eaaf ,nil ;};const (CmbOpOr CombinationOperator =iota ;CmbOpAnd ;CmbOpXor ;CmbOpXNor ;CmbOpReplace ;CmbOpNot ;);type ClassedPoints struct{*Points ;_gc .IntSlice ;_fffdc func (_gbfec ,_cdbg int )bool ;
|
|
|
|
};type Boxes []*_dc .Rectangle ;func (_ffgg *Bitmaps )SortByWidth (){_aegca :=(*byWidth )(_ffgg );_ge .Sort (_aegca )};func (_eaaace *ClassedPoints )GetIntYByClass (i int )(int ,error ){const _cccea ="\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 >=_eaaace .IntSlice .Size (){return 0,_d .Errorf (_cccea ,"\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 (_eaaace .YAtIndex (i )),nil ;};func (_bfcf *ClassedPoints )SortByX (){_bfcf ._fffdc =_bfcf .xSortFunction ();_ge .Sort (_bfcf )};func _fad (_aca ,_bcef *Bitmap ,_gde int ,_cfe []byte ,_gdce int )(_bef error ){const _agab ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0032";
|
|
|
|
var (_gedg ,_agb ,_ffa ,_bab ,_abg ,_bad ,_gee ,_ee int ;_edd ,_ggc ,_dgg ,_cb uint32 ;_aeg ,_edc byte ;_ecgc uint16 ;);_dfc :=make ([]byte ,4);_adf :=make ([]byte ,4);for _ffa =0;_ffa < _aca .Height -1;_ffa ,_bab =_ffa +2,_bab +1{_gedg =_ffa *_aca .RowStride ;
|
|
|
|
_agb =_bab *_bcef .RowStride ;for _abg ,_bad =0,0;_abg < _gdce ;_abg ,_bad =_abg +4,_bad +1{for _gee =0;_gee < 4;_gee ++{_ee =_gedg +_abg +_gee ;if _ee <=len (_aca .Data )-1&&_ee < _gedg +_aca .RowStride {_dfc [_gee ]=_aca .Data [_ee ];}else {_dfc [_gee ]=0x00;
|
|
|
|
};_ee =_gedg +_aca .RowStride +_abg +_gee ;if _ee <=len (_aca .Data )-1&&_ee < _gedg +(2*_aca .RowStride ){_adf [_gee ]=_aca .Data [_ee ];}else {_adf [_gee ]=0x00;};};_edd =_a .BigEndian .Uint32 (_dfc );_ggc =_a .BigEndian .Uint32 (_adf );_dgg =_edd &_ggc ;
|
|
|
|
_dgg |=_dgg <<1;_cb =_edd |_ggc ;_cb &=_cb <<1;_ggc =_dgg |_cb ;_ggc &=0xaaaaaaaa;_edd =_ggc |(_ggc <<7);_aeg =byte (_edd >>24);_edc =byte ((_edd >>8)&0xff);_ee =_agb +_bad ;if _ee +1==len (_bcef .Data )-1||_ee +1>=_agb +_bcef .RowStride {if _bef =_bcef .SetByte (_ee ,_cfe [_aeg ]);
|
|
|
|
_bef !=nil {return _d .Wrapf (_bef ,_agab ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_ee );};}else {_ecgc =(uint16 (_cfe [_aeg ])<<8)|uint16 (_cfe [_edc ]);if _bef =_bcef .setTwoBytes (_ee ,_ecgc );_bef !=nil {return _d .Wrapf (_bef ,_agab ,"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",_ee );
|
|
|
|
};_bad ++;};};};return nil ;};func (_bfef *Bitmap )RemoveBorder (borderSize int )(*Bitmap ,error ){if borderSize ==0{return _bfef .Copy (),nil ;};_bafc ,_bff :=_bfef .removeBorderGeneral (borderSize ,borderSize ,borderSize ,borderSize );if _bff !=nil {return nil ,_d .Wrap (_bff ,"\u0052\u0065\u006do\u0076\u0065\u0042\u006f\u0072\u0064\u0065\u0072","");
|
|
|
|
};return _bafc ,nil ;};func _ccb (_ece ,_ccbb int )*Bitmap {return &Bitmap {Width :_ece ,Height :_ccbb ,RowStride :(_ece +7)>>3};};func (_fab *Bitmap )AddBorder (borderSize ,val int )(*Bitmap ,error ){if borderSize ==0{return _fab .Copy (),nil ;};_cbde ,_bbbd :=_fab .addBorderGeneral (borderSize ,borderSize ,borderSize ,borderSize ,val );
|
|
|
|
if _bbbd !=nil {return nil ,_d .Wrap (_bbbd ,"\u0041d\u0064\u0042\u006f\u0072\u0064\u0065r","");};return _cbde ,nil ;};func _acb ()(_fag [256]uint32 ){for _gfa :=0;_gfa < 256;_gfa ++{if _gfa &0x01!=0{_fag [_gfa ]|=0xf;};if _gfa &0x02!=0{_fag [_gfa ]|=0xf0;
|
|
|
|
};if _gfa &0x04!=0{_fag [_gfa ]|=0xf00;};if _gfa &0x08!=0{_fag [_gfa ]|=0xf000;};if _gfa &0x10!=0{_fag [_gfa ]|=0xf0000;};if _gfa &0x20!=0{_fag [_gfa ]|=0xf00000;};if _gfa &0x40!=0{_fag [_gfa ]|=0xf000000;};if _gfa &0x80!=0{_fag [_gfa ]|=0xf0000000;};};
|
|
|
|
return _fag ;};func ClipBoxToRectangle (box *_dc .Rectangle ,wi ,hi int )(_abca *_dc .Rectangle ,_bfcc error ){const _dbaf ="\u0043l\u0069p\u0042\u006f\u0078\u0054\u006fR\u0065\u0063t\u0061\u006e\u0067\u006c\u0065";if box ==nil {return nil ,_d .Error (_dbaf ,"\u0027\u0062\u006f\u0078\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065f\u0069\u006e\u0065\u0064");
|
|
|
|
};if box .Min .X >=wi ||box .Min .Y >=hi ||box .Max .X <=0||box .Max .Y <=0{return nil ,_d .Error (_dbaf ,"\u0027\u0062\u006fx'\u0020\u006f\u0075\u0074\u0073\u0069\u0064\u0065\u0020\u0072\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065");};_eeec :=*box ;
|
|
|
|
_abca =&_eeec ;if _abca .Min .X < 0{_abca .Max .X +=_abca .Min .X ;_abca .Min .X =0;};if _abca .Min .Y < 0{_abca .Max .Y +=_abca .Min .Y ;_abca .Min .Y =0;};if _abca .Max .X > wi {_abca .Max .X =wi ;};if _abca .Max .Y > hi {_abca .Max .Y =hi ;};return _abca ,nil ;
|
|
|
|
};func (_cba *Bitmap )AddBorderGeneral (left ,right ,top ,bot int ,val int )(*Bitmap ,error ){return _cba .addBorderGeneral (left ,right ,top ,bot ,val );};func (_eaag *Bitmap )createTemplate ()*Bitmap {return &Bitmap {Width :_eaag .Width ,Height :_eaag .Height ,RowStride :_eaag .RowStride ,Color :_eaag .Color ,Text :_eaag .Text ,BitmapNumber :_eaag .BitmapNumber ,Special :_eaag .Special ,Data :make ([]byte ,len (_eaag .Data ))};
|
|
|
|
};func (_gaeg *ClassedPoints )YAtIndex (i int )float32 {return (*_gaeg .Points )[_gaeg .IntSlice [i ]].Y };func _faba (_faab ,_aegg ,_egb *Bitmap )(*Bitmap ,error ){const _gca ="\u0073\u0075\u0062\u0074\u0072\u0061\u0063\u0074";if _aegg ==nil {return nil ,_d .Error (_gca ,"'\u0073\u0031\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");
|
|
|
|
};if _egb ==nil {return nil ,_d .Error (_gca ,"'\u0073\u0032\u0027\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};var _bccd error ;switch {case _faab ==_aegg :if _bccd =_faab .RasterOperation (0,0,_aegg .Width ,_aegg .Height ,PixNotSrcAndDst ,_egb ,0,0);
|
|
|
|
_bccd !=nil {return nil ,_d .Wrap (_bccd ,_gca ,"\u0064 \u003d\u003d\u0020\u0073\u0031");};case _faab ==_egb :if _bccd =_faab .RasterOperation (0,0,_aegg .Width ,_aegg .Height ,PixNotSrcAndDst ,_aegg ,0,0);_bccd !=nil {return nil ,_d .Wrap (_bccd ,_gca ,"\u0064 \u003d\u003d\u0020\u0073\u0032");
|
|
|
|
};default:_faab ,_bccd =_faec (_faab ,_aegg );if _bccd !=nil {return nil ,_d .Wrap (_bccd ,_gca ,"");};if _bccd =_faab .RasterOperation (0,0,_aegg .Width ,_aegg .Height ,PixNotSrcAndDst ,_egb ,0,0);_bccd !=nil {return nil ,_d .Wrap (_bccd ,_gca ,"\u0064e\u0066\u0061\u0075\u006c\u0074");
|
|
|
|
};};return _faab ,nil ;};func (_fecg *Bitmap )resizeImageData (_aaa *Bitmap )error {if _aaa ==nil {return _d .Error ("\u0072e\u0073i\u007a\u0065\u0049\u006d\u0061\u0067\u0065\u0044\u0061\u0074\u0061","\u0073r\u0063 \u0069\u0073\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
|
|
};if _fecg .SizesEqual (_aaa ){return nil ;};_fecg .Data =make ([]byte ,len (_aaa .Data ));_fecg .Width =_aaa .Width ;_fecg .Height =_aaa .Height ;_fecg .RowStride =_aaa .RowStride ;return nil ;};func _febe (_fdc *Bitmap )(_cdfc *Bitmap ,_eceb int ,_fbba error ){const _dac ="\u0042i\u0074\u006d\u0061\u0070.\u0077\u006f\u0072\u0064\u004da\u0073k\u0042y\u0044\u0069\u006c\u0061\u0074\u0069\u006fn";
|
|
|
|
if _fdc ==nil {return nil ,0,_d .Errorf (_dac ,"\u0027\u0073\u0027\u0020bi\u0074\u006d\u0061\u0070\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006ee\u0064");};var _gefd ,_gbec *Bitmap ;if _gefd ,_fbba =_faec (nil ,_fdc );_fbba !=nil {return nil ,0,_d .Wrap (_fbba ,_dac ,"\u0063\u006f\u0070\u0079\u0020\u0027\u0073\u0027");
|
|
|
|
};var (_caed [13]int ;_agdf ,_aegd int ;);_bcca :=12;_dcd :=_gc .NewNumSlice (_bcca +1);_ffgc :=_gc .NewNumSlice (_bcca +1);var _agabb *Boxes ;for _babf :=0;_babf <=_bcca ;_babf ++{if _babf ==0{if _gbec ,_fbba =_faec (nil ,_gefd );_fbba !=nil {return nil ,0,_d .Wrap (_fbba ,_dac ,"\u0066i\u0072\u0073\u0074\u0020\u0062\u006d2");
|
|
|
|
};}else {if _gbec ,_fbba =_ecae (_gefd ,MorphProcess {Operation :MopDilation ,Arguments :[]int {2,1}});_fbba !=nil {return nil ,0,_d .Wrap (_fbba ,_dac ,"\u0064\u0069\u006ca\u0074\u0069\u006f\u006e\u0020\u0062\u006d\u0032");};};if _agabb ,_fbba =_gbec .connComponentsBB (4);
|
|
|
|
_fbba !=nil {return nil ,0,_d .Wrap (_fbba ,_dac ,"");};_caed [_babf ]=len (*_agabb );_dcd .AddInt (_caed [_babf ]);switch _babf {case 0:_agdf =_caed [0];default:_aegd =_caed [_babf -1]-_caed [_babf ];_ffgc .AddInt (_aegd );};_gefd =_gbec ;};_geda :=true ;
|
|
|
|
_fcda :=2;var _edcd ,_eggcd int ;for _aegfb :=1;_aegfb < len (*_ffgc );_aegfb ++{if _edcd ,_fbba =_dcd .GetInt (_aegfb );_fbba !=nil {return nil ,0,_d .Wrap (_fbba ,_dac ,"\u0043\u0068\u0065\u0063ki\u006e\u0067\u0020\u0062\u0065\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0069o\u006e");
|
|
|
|
};if _geda &&_edcd < int (0.3*float32 (_agdf )){_fcda =_aegfb +1;_geda =false ;};if _aegd ,_fbba =_ffgc .GetInt (_aegfb );_fbba !=nil {return nil ,0,_d .Wrap (_fbba ,_dac ,"\u0067\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u006ea\u0044\u0069\u0066\u0066");
|
|
|
|
};if _aegd > _eggcd {_eggcd =_aegd ;};};_egae :=_fdc .XResolution ;if _egae ==0{_egae =150;};if _egae > 110{_fcda ++;};if _fcda < 2{_dd .Log .Trace ("J\u0042\u0049\u0047\u0032\u0020\u0073\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u0069\u0042\u0065\u0073\u0074 \u0074\u006f\u0020\u006d\u0069\u006e\u0069\u006d\u0075\u006d a\u006c\u006c\u006fw\u0061b\u006c\u0065");
|
|
|
|
_fcda =2;};_eceb =_fcda +1;if _cdfc ,_fbba =_ccdfa (nil ,_fdc ,_fcda +1,1);_fbba !=nil {return nil ,0,_d .Wrap (_fbba ,_dac ,"\u0067\u0065\u0074\u0074in\u0067\u0020\u006d\u0061\u0073\u006b\u0020\u0066\u0061\u0069\u006c\u0065\u0064");};return _cdfc ,_eceb ,nil ;
|
|
|
|
};func _bbf (_gdg ,_gbb *Bitmap ,_acg int ,_ace []byte ,_gfc int )(_eaa error ){const _cda ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0034";var (_fbd ,_faad ,_gcf ,_bcb ,_gag ,_faed ,_cbb ,_gdd int ;
|
|
|
|
_bgd ,_cbd uint32 ;_ecb ,_fgc byte ;_egf uint16 ;);_fec :=make ([]byte ,4);_ade :=make ([]byte ,4);for _gcf =0;_gcf < _gdg .Height -1;_gcf ,_bcb =_gcf +2,_bcb +1{_fbd =_gcf *_gdg .RowStride ;_faad =_bcb *_gbb .RowStride ;for _gag ,_faed =0,0;_gag < _gfc ;
|
|
|
|
_gag ,_faed =_gag +4,_faed +1{for _cbb =0;_cbb < 4;_cbb ++{_gdd =_fbd +_gag +_cbb ;if _gdd <=len (_gdg .Data )-1&&_gdd < _fbd +_gdg .RowStride {_fec [_cbb ]=_gdg .Data [_gdd ];}else {_fec [_cbb ]=0x00;};_gdd =_fbd +_gdg .RowStride +_gag +_cbb ;if _gdd <=len (_gdg .Data )-1&&_gdd < _fbd +(2*_gdg .RowStride ){_ade [_cbb ]=_gdg .Data [_gdd ];
|
|
|
|
}else {_ade [_cbb ]=0x00;};};_bgd =_a .BigEndian .Uint32 (_fec );_cbd =_a .BigEndian .Uint32 (_ade );_cbd &=_bgd ;_cbd &=_cbd <<1;_cbd &=0xaaaaaaaa;_bgd =_cbd |(_cbd <<7);_ecb =byte (_bgd >>24);_fgc =byte ((_bgd >>8)&0xff);_gdd =_faad +_faed ;if _gdd +1==len (_gbb .Data )-1||_gdd +1>=_faad +_gbb .RowStride {_gbb .Data [_gdd ]=_ace [_ecb ];
|
|
|
|
if _eaa =_gbb .SetByte (_gdd ,_ace [_ecb ]);_eaa !=nil {return _d .Wrapf (_eaa ,_cda ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_gdd );};}else {_egf =(uint16 (_ace [_ecb ])<<8)|uint16 (_ace [_fgc ]);if _eaa =_gbb .setTwoBytes (_gdd ,_egf );_eaa !=nil {return _d .Wrapf (_eaa ,_cda ,"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",_gdd );
|
|
|
|
};_faed ++;};};};return nil ;};func (_dfac *Bitmap )Zero ()bool {_fggd :=_dfac .Width /8;_cfc :=_dfac .Width &7;var _ecdb byte ;if _cfc !=0{_ecdb =byte (0xff<<uint (8-_cfc ));};var _baee ,_gcfb ,_baaa int ;for _gcfb =0;_gcfb < _dfac .Height ;_gcfb ++{_baee =_dfac .RowStride *_gcfb ;
|
|
|
|
for _baaa =0;_baaa < _fggd ;_baaa ,_baee =_baaa +1,_baee +1{if _dfac .Data [_baee ]!=0{return false ;};};if _cfc > 0{if _dfac .Data [_baee ]&_ecdb !=0{return false ;};};};return true ;};func (_eba *Bitmap )clipRectangle (_ced ,_eeg *_dc .Rectangle )(_ffe *Bitmap ,_cbfc error ){const _gbbb ="\u0063\u006c\u0069\u0070\u0052\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065";
|
|
|
|
if _ced ==nil {return nil ,_d .Error (_gbbb ,"\u0070r\u006fv\u0069\u0064\u0065\u0064\u0020n\u0069\u006c \u0027\u0062\u006f\u0078\u0027");};_eggb ,_bcbf :=_eba .Width ,_eba .Height ;_bcc ,_cbfc :=ClipBoxToRectangle (_ced ,_eggb ,_bcbf );if _cbfc !=nil {_dd .Log .Warning ("\u0027\u0062ox\u0027\u0020\u0064o\u0065\u0073\u006e\u0027t o\u0076er\u006c\u0061\u0070\u0020\u0062\u0069\u0074ma\u0070\u0020\u0027\u0062\u0027\u003a\u0020%\u0076",_cbfc );
|
|
|
|
return nil ,nil ;};_affb ,_cef :=_bcc .Min .X ,_bcc .Min .Y ;_fcbb ,_geg :=_bcc .Max .X -_bcc .Min .X ,_bcc .Max .Y -_bcc .Min .Y ;_ffe =New (_fcbb ,_geg );_ffe .Text =_eba .Text ;if _cbfc =_ffe .RasterOperation (0,0,_fcbb ,_geg ,PixSrc ,_eba ,_affb ,_cef );
|
|
|
|
_cbfc !=nil {return nil ,_d .Wrap (_cbfc ,_gbbb ,"");};if _eeg !=nil {*_eeg =*_bcc ;};return _ffe ,nil ;};func _bggaf (_dfgdc *_gc .Stack )(_dgbc *fillSegment ,_bcgdf error ){const _ceeg ="\u0070\u006f\u0070\u0046\u0069\u006c\u006c\u0053\u0065g\u006d\u0065\u006e\u0074";
|
|
|
|
if _dfgdc ==nil {return nil ,_d .Error (_ceeg ,"\u006ei\u006c \u0073\u0074\u0061\u0063\u006b \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");};if _dfgdc .Aux ==nil {return nil ,_d .Error (_ceeg ,"a\u0075x\u0053\u0074\u0061\u0063\u006b\u0020\u006e\u006ft\u0020\u0064\u0065\u0066in\u0065\u0064");
|
|
|
|
};_acgcg ,_gffg :=_dfgdc .Pop ();if !_gffg {return nil ,nil ;};_geegf ,_gffg :=_acgcg .(*fillSegment );if !_gffg {return nil ,_d .Error (_ceeg ,"\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");
|
|
|
|
};_dgbc =&fillSegment {_geegf ._fbdg ,_geegf ._egdfd ,_geegf ._bcea +_geegf ._dbgc ,_geegf ._dbgc };_dfgdc .Aux .Push (_geegf );return _dgbc ,nil ;};type fillSegment struct{_fbdg int ;_egdfd int ;_bcea int ;_dbgc int ;};func _egdf (_dabb ,_abbg ,_dfde *Bitmap ,_eabb int )(*Bitmap ,error ){const _acad ="\u0073\u0065\u0065\u0064\u0046\u0069\u006c\u006c\u0042i\u006e\u0061\u0072\u0079";
|
|
|
|
if _abbg ==nil {return nil ,_d .Error (_acad ,"s\u006fu\u0072\u0063\u0065\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");};if _dfde ==nil {return nil ,_d .Error (_acad ,"'\u006da\u0073\u006b\u0027\u0020\u0062\u0069\u0074\u006da\u0070\u0020\u0069\u0073 n\u0069\u006c");
|
|
|
|
};if _eabb !=4&&_eabb !=8{return nil ,_d .Error (_acad ,"\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 _bdcfg error ;_dabb ,_bdcfg =_faec (_dabb ,_abbg );
|
|
|
|
if _bdcfg !=nil {return nil ,_d .Wrap (_bdcfg ,_acad ,"\u0063o\u0070y\u0020\u0073\u006f\u0075\u0072c\u0065\u0020t\u006f\u0020\u0027\u0064\u0027");};_bbae :=_abbg .createTemplate ();_dfde .setPadBits (0);for _ebad :=0;_ebad < _ecce ;_ebad ++{_bbae ,_bdcfg =_faec (_bbae ,_dabb );
|
|
|
|
if _bdcfg !=nil {return nil ,_d .Wrapf (_bdcfg ,_acad ,"\u0069\u0074\u0065\u0072\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0064",_ebad );};if _bdcfg =_bgbdf (_dabb ,_dfde ,_eabb );_bdcfg !=nil {return nil ,_d .Wrapf (_bdcfg ,_acad ,"\u0069\u0074\u0065\u0072\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0025\u0064",_ebad );
|
|
|
|
};if _bbae .Equals (_dabb ){break ;};};return _dabb ,nil ;};func Blit (src *Bitmap ,dst *Bitmap ,x ,y int ,op CombinationOperator )error {var _ffb ,_afaed int ;_gaa :=src .RowStride -1;if x < 0{_afaed =-x ;x =0;}else if x +src .Width > dst .Width {_gaa -=src .Width +x -dst .Width ;
|
|
|
|
};if y < 0{_ffb =-y ;y =0;_afaed +=src .RowStride ;_gaa +=src .RowStride ;}else if y +src .Height > dst .Height {_ffb =src .Height +y -dst .Height ;};var (_eagc int ;_ecfg error ;);_egdb :=x &0x07;_cecf :=8-_egdb ;_acef :=src .Width &0x07;_bdac :=_cecf -_acef ;
|
|
|
|
_gfd :=_cecf &0x07!=0;_dae :=src .Width <=((_gaa -_afaed )<<3)+_cecf ;_gcd :=dst .GetByteIndex (x ,y );_ebde :=_ffb +dst .Height ;if src .Height > _ebde {_eagc =_ebde ;}else {_eagc =src .Height ;};switch {case !_gfd :_ecfg =_eabcd (src ,dst ,_ffb ,_eagc ,_gcd ,_afaed ,_gaa ,op );
|
|
|
|
case _dae :_ecfg =_dbfg (src ,dst ,_ffb ,_eagc ,_gcd ,_afaed ,_gaa ,_bdac ,_egdb ,_cecf ,op );default:_ecfg =_ccce (src ,dst ,_ffb ,_eagc ,_gcd ,_afaed ,_gaa ,_bdac ,_egdb ,_cecf ,op ,_acef );};return _ecfg ;};func TstImageBitmapData ()[]byte {return _cafd .Data };
|
|
|
|
func TstGetScaledSymbol (t *_g .T ,sm *Bitmap ,scale ...int )*Bitmap {if len (scale )==0{return sm ;};if scale [0]==1{return sm ;};_eafgc ,_gece :=MorphSequence (sm ,MorphProcess {Operation :MopReplicativeBinaryExpansion ,Arguments :scale });_df .NoError (t ,_gece );
|
|
|
|
return _eafgc ;};func HausTest (p1 ,p2 ,p3 ,p4 *Bitmap ,delX ,delY float32 ,maxDiffW ,maxDiffH int )(bool ,error ){const _gaab ="\u0048\u0061\u0075\u0073\u0054\u0065\u0073\u0074";_edbe ,_fbgg :=p1 .Width ,p1 .Height ;_gebd ,_fcbc :=p3 .Width ,p3 .Height ;
|
|
|
|
if _gc .Abs (_edbe -_gebd )> maxDiffW {return false ,nil ;};if _gc .Abs (_fbgg -_fcbc )> maxDiffH {return false ,nil ;};_bccea :=int (delX +_gc .Sign (delX )*0.5);_agbe :=int (delY +_gc .Sign (delY )*0.5);var _eade error ;_gdac :=p1 .CreateTemplate ();
|
|
|
|
if _eade =_gdac .RasterOperation (0,0,_edbe ,_fbgg ,PixSrc ,p1 ,0,0);_eade !=nil {return false ,_d .Wrap (_eade ,_gaab ,"p\u0031\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _eade =_gdac .RasterOperation (_bccea ,_agbe ,_edbe ,_fbgg ,PixNotSrcAndDst ,p4 ,0,0);
|
|
|
|
_eade !=nil {return false ,_d .Wrap (_eade ,_gaab ,"\u0021p\u0034\u0020\u0026\u0020\u0074");};if _gdac .Zero (){return false ,nil ;};if _eade =_gdac .RasterOperation (_bccea ,_agbe ,_gebd ,_fcbc ,PixSrc ,p3 ,0,0);_eade !=nil {return false ,_d .Wrap (_eade ,_gaab ,"p\u0033\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");
|
|
|
|
};if _eade =_gdac .RasterOperation (0,0,_gebd ,_fcbc ,PixNotSrcAndDst ,p2 ,0,0);_eade !=nil {return false ,_d .Wrap (_eade ,_gaab ,"\u0021p\u0032\u0020\u0026\u0020\u0074");};return _gdac .Zero (),nil ;};func _fdge (_ddbbd ,_gfeg *Bitmap ,_dcgdd ,_gcde int )(_bdfe error ){const _dbac ="\u0073e\u0065d\u0066\u0069\u006c\u006c\u0042i\u006e\u0061r\u0079\u004c\u006f\u0077\u0038";
|
|
|
|
var (_dfbg ,_cgbe ,_facg ,_aaedd int ;_beada ,_fdbb ,_fdfbc ,_dgd ,_dagcf ,_fbbc ,_dacg ,_gdfb byte ;);for _dfbg =0;_dfbg < _dcgdd ;_dfbg ++{_facg =_dfbg *_ddbbd .RowStride ;_aaedd =_dfbg *_gfeg .RowStride ;for _cgbe =0;_cgbe < _gcde ;_cgbe ++{if _beada ,_bdfe =_ddbbd .GetByte (_facg +_cgbe );
|
|
|
|
_bdfe !=nil {return _d .Wrap (_bdfe ,_dbac ,"\u0067e\u0074 \u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0062\u0079\u0074\u0065");};if _fdbb ,_bdfe =_gfeg .GetByte (_aaedd +_cgbe );_bdfe !=nil {return _d .Wrap (_bdfe ,_dbac ,"\u0067\u0065\u0074\u0020\u006d\u0061\u0073\u006b\u0020\u0062\u0079\u0074\u0065");
|
|
|
|
};if _dfbg > 0{if _fdfbc ,_bdfe =_ddbbd .GetByte (_facg -_ddbbd .RowStride +_cgbe );_bdfe !=nil {return _d .Wrap (_bdfe ,_dbac ,"\u0069\u0020\u003e\u0020\u0030\u0020\u0062\u0079\u0074\u0065");};_beada |=_fdfbc |(_fdfbc <<1)|(_fdfbc >>1);if _cgbe > 0{if _gdfb ,_bdfe =_ddbbd .GetByte (_facg -_ddbbd .RowStride +_cgbe -1);
|
|
|
|
_bdfe !=nil {return _d .Wrap (_bdfe ,_dbac ,"\u0069\u0020\u003e\u00200 \u0026\u0026\u0020\u006a\u0020\u003e\u0020\u0030\u0020\u0062\u0079\u0074\u0065");};_beada |=_gdfb <<7;};if _cgbe < _gcde -1{if _gdfb ,_bdfe =_ddbbd .GetByte (_facg -_ddbbd .RowStride +_cgbe +1);
|
|
|
|
_bdfe !=nil {return _d .Wrap (_bdfe ,_dbac ,"\u006a\u0020<\u0020\u0077\u0070l\u0020\u002d\u0020\u0031\u0020\u0062\u0079\u0074\u0065");};_beada |=_gdfb >>7;};};if _cgbe > 0{if _dgd ,_bdfe =_ddbbd .GetByte (_facg +_cgbe -1);_bdfe !=nil {return _d .Wrap (_bdfe ,_dbac ,"\u006a\u0020\u003e \u0030");
|
|
|
|
};_beada |=_dgd <<7;};_beada &=_fdbb ;if _beada ==0||^_beada ==0{if _bdfe =_ddbbd .SetByte (_facg +_cgbe ,_beada );_bdfe !=nil {return _d .Wrap (_bdfe ,_dbac ,"\u0073e\u0074t\u0069\u006e\u0067\u0020\u0065m\u0070\u0074y\u0020\u0062\u0079\u0074\u0065");};
|
|
|
|
};for {_dacg =_beada ;_beada =(_beada |(_beada >>1)|(_beada <<1))&_fdbb ;if (_beada ^_dacg )==0{if _bdfe =_ddbbd .SetByte (_facg +_cgbe ,_beada );_bdfe !=nil {return _d .Wrap (_bdfe ,_dbac ,"\u0073\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u0070\u0072\u0065\u0076 \u0062\u0079\u0074\u0065");
|
|
|
|
};break ;};};};};for _dfbg =_dcgdd -1;_dfbg >=0;_dfbg --{_facg =_dfbg *_ddbbd .RowStride ;_aaedd =_dfbg *_gfeg .RowStride ;for _cgbe =_gcde -1;_cgbe >=0;_cgbe --{if _beada ,_bdfe =_ddbbd .GetByte (_facg +_cgbe );_bdfe !=nil {return _d .Wrap (_bdfe ,_dbac ,"\u0072\u0065\u0076er\u0073\u0065\u0020\u0067\u0065\u0074\u0020\u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0062\u0079\u0074\u0065");
|
|
|
|
};if _fdbb ,_bdfe =_gfeg .GetByte (_aaedd +_cgbe );_bdfe !=nil {return _d .Wrap (_bdfe ,_dbac ,"r\u0065\u0076\u0065\u0072se\u0020g\u0065\u0074\u0020\u006d\u0061s\u006b\u0020\u0062\u0079\u0074\u0065");};if _dfbg < _dcgdd -1{if _dagcf ,_bdfe =_ddbbd .GetByte (_facg +_ddbbd .RowStride +_cgbe );
|
|
|
|
_bdfe !=nil {return _d .Wrap (_bdfe ,_dbac ,"\u0069\u0020\u003c\u0020h\u0020\u002d\u0020\u0031\u0020\u002d\u003e\u0020\u0067\u0065t\u0020s\u006f\u0075\u0072\u0063\u0065\u0020\u0062y\u0074\u0065");};_beada |=_dagcf |(_dagcf <<1)|_dagcf >>1;if _cgbe > 0{if _gdfb ,_bdfe =_ddbbd .GetByte (_facg +_ddbbd .RowStride +_cgbe -1);
|
|
|
|
_bdfe !=nil {return _d .Wrap (_bdfe ,_dbac ,"\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");};_beada |=_gdfb <<7;};if _cgbe < _gcde -1{if _gdfb ,_bdfe =_ddbbd .GetByte (_facg +_ddbbd .RowStride +_cgbe +1);
|
|
|
|
_bdfe !=nil {return _d .Wrap (_bdfe ,_dbac ,"\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");
|
|
|
|
};_beada |=_gdfb >>7;};};if _cgbe < _gcde -1{if _fbbc ,_bdfe =_ddbbd .GetByte (_facg +_cgbe +1);_bdfe !=nil {return _d .Wrap (_bdfe ,_dbac ,"\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");
|
|
|
|
};_beada |=_fbbc >>7;};_beada &=_fdbb ;if _beada ==0||(^_beada )==0{if _bdfe =_ddbbd .SetByte (_facg +_cgbe ,_beada );_bdfe !=nil {return _d .Wrap (_bdfe ,_dbac ,"\u0073e\u0074 \u006d\u0061\u0073\u006b\u0065\u0064\u0020\u0062\u0079\u0074\u0065");};};for {_dacg =_beada ;
|
|
|
|
_beada =(_beada |(_beada >>1)|(_beada <<1))&_fdbb ;if (_beada ^_dacg )==0{if _bdfe =_ddbbd .SetByte (_facg +_cgbe ,_beada );_bdfe !=nil {return _d .Wrap (_bdfe ,_dbac ,"r\u0065\u0076\u0065\u0072se\u0020s\u0065\u0074\u0020\u0070\u0072e\u0076\u0020\u0062\u0079\u0074\u0065");
|
|
|
|
};break ;};};};};return nil ;};func (_fggc *Bitmap )GetVanillaData ()[]byte {if _fggc .Color ==Chocolate {_fggc .inverseData ();};return _fggc .Data ;};func (_adcd *Bitmap )setTwoBytes (_dcfg int ,_beae uint16 )error {if _dcfg +1> len (_adcd .Data )-1{return _d .Errorf ("s\u0065\u0074\u0054\u0077\u006f\u0042\u0079\u0074\u0065\u0073","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",_dcfg );
|
|
|
|
};_adcd .Data [_dcfg ]=byte ((_beae &0xff00)>>8);_adcd .Data [_dcfg +1]=byte (_beae &0xff);return nil ;};func (_bbe *Bitmap )SetDefaultPixel (){for _bgfa :=range _bbe .Data {_bbe .Data [_bgfa ]=byte (0xff);};};func TstAddSymbol (t *_g .T ,bms *Bitmaps ,sym *Bitmap ,x *int ,y int ,space int ){bms .AddBitmap (sym );
|
|
|
|
_fdgeg :=_dc .Rect (*x ,y ,*x +sym .Width ,y +sym .Height );bms .AddBox (&_fdgeg );*x +=sym .Width +space ;};var (_agc =_ceb ();_gedgea =_acb ();_cgbd =_agd (););func _ceb ()(_cdg [256]uint16 ){for _adc :=0;_adc < 256;_adc ++{if _adc &0x01!=0{_cdg [_adc ]|=0x3;
|
|
|
|
};if _adc &0x02!=0{_cdg [_adc ]|=0xc;};if _adc &0x04!=0{_cdg [_adc ]|=0x30;};if _adc &0x08!=0{_cdg [_adc ]|=0xc0;};if _adc &0x10!=0{_cdg [_adc ]|=0x300;};if _adc &0x20!=0{_cdg [_adc ]|=0xc00;};if _adc &0x40!=0{_cdg [_adc ]|=0x3000;};if _adc &0x80!=0{_cdg [_adc ]|=0xc000;
|
|
|
|
};};return _cdg ;};func (_cagc Points )XSorter ()func (_ebfdd ,_gbgca int )bool {return func (_gbad ,_eebgf int )bool {return _cagc [_gbad ].X < _cagc [_eebgf ].X };};func (_cgbg *Bitmaps )Size ()int {return len (_cgbg .Values )};func CorrelationScoreSimple (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab []int )(_gfge float64 ,_aeb error ){const _bgbbe ="\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 _gfge ,_d .Error (_bgbbe ,"n\u0069l\u0020\u0062\u0069\u0074\u006d\u0061\u0070\u0073 \u0070\u0072\u006f\u0076id\u0065\u0064");};if tab ==nil {return _gfge ,_d .Error (_bgbbe ,"\u0074\u0061\u0062\u0020\u0075\u006e\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
|
|
};if area1 ==0||area2 ==0{return _gfge ,_d .Error (_bgbbe ,"\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064\u0020\u0061\u0072e\u0061\u0073\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065 \u003e\u0020\u0030");};_dcea ,_eagcg :=bm1 .Width ,bm1 .Height ;
|
|
|
|
_bgebb ,_cbddg :=bm2 .Width ,bm2 .Height ;if _fef (_dcea -_bgebb )> maxDiffW {return 0,nil ;};if _fef (_eagcg -_cbddg )> maxDiffH {return 0,nil ;};var _ccee ,_abfge int ;if delX >=0{_ccee =int (delX +0.5);}else {_ccee =int (delX -0.5);};if delY >=0{_abfge =int (delY +0.5);
|
|
|
|
}else {_abfge =int (delY -0.5);};_gcad :=bm1 .createTemplate ();if _aeb =_gcad .RasterOperation (_ccee ,_abfge ,_bgebb ,_cbddg ,PixSrc ,bm2 ,0,0);_aeb !=nil {return _gfge ,_d .Wrap (_aeb ,_bgbbe ,"\u0062m\u0032 \u0074\u006f\u0020\u0054\u0065\u006d\u0070\u006c\u0061\u0074\u0065");
|
|
|
|
};if _aeb =_gcad .RasterOperation (0,0,_dcea ,_eagcg ,PixSrcAndDst ,bm1 ,0,0);_aeb !=nil {return _gfge ,_d .Wrap (_aeb ,_bgbbe ,"b\u006d\u0031\u0020\u0061\u006e\u0064\u0020\u0062\u006d\u0054");};_dage :=_gcad .countPixels ();_gfge =float64 (_dage )*float64 (_dage )/(float64 (area1 )*float64 (area2 ));
|
|
|
|
return _gfge ,nil ;};func MakePixelCentroidTab8 ()[]int {return _fgddc ()};func (_efgfc *Points )AddPoint (x ,y float32 ){*_efgfc =append (*_efgfc ,Point {x ,y })};func TstPSymbol (t *_g .T )*Bitmap {t .Helper ();_ecfd :=New (5,8);_df .NoError (t ,_ecfd .SetPixel (0,0,1));
|
|
|
|
_df .NoError (t ,_ecfd .SetPixel (1,0,1));_df .NoError (t ,_ecfd .SetPixel (2,0,1));_df .NoError (t ,_ecfd .SetPixel (3,0,1));_df .NoError (t ,_ecfd .SetPixel (4,1,1));_df .NoError (t ,_ecfd .SetPixel (0,1,1));_df .NoError (t ,_ecfd .SetPixel (4,2,1));
|
|
|
|
_df .NoError (t ,_ecfd .SetPixel (0,2,1));_df .NoError (t ,_ecfd .SetPixel (4,3,1));_df .NoError (t ,_ecfd .SetPixel (0,3,1));_df .NoError (t ,_ecfd .SetPixel (0,4,1));_df .NoError (t ,_ecfd .SetPixel (1,4,1));_df .NoError (t ,_ecfd .SetPixel (2,4,1));
|
|
|
|
_df .NoError (t ,_ecfd .SetPixel (3,4,1));_df .NoError (t ,_ecfd .SetPixel (0,5,1));_df .NoError (t ,_ecfd .SetPixel (0,6,1));_df .NoError (t ,_ecfd .SetPixel (0,7,1));return _ecfd ;};func (_becf *Selection )findMaxTranslations ()(_gdfe ,_ecdfg ,_effdf ,_cfdc int ){for _aecg :=0;
|
|
|
|
_aecg < _becf .Height ;_aecg ++{for _gabb :=0;_gabb < _becf .Width ;_gabb ++{if _becf .Data [_aecg ][_gabb ]==SelHit {_gdfe =_acgd (_gdfe ,_becf .Cx -_gabb );_ecdfg =_acgd (_ecdfg ,_becf .Cy -_aecg );_effdf =_acgd (_effdf ,_gabb -_becf .Cx );_cfdc =_acgd (_cfdc ,_aecg -_becf .Cy );
|
|
|
|
};};};return _gdfe ,_ecdfg ,_effdf ,_cfdc ;};func (_debd *ClassedPoints )GetIntXByClass (i int )(int ,error ){const _cdae ="\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 >=_debd .IntSlice .Size (){return 0,_d .Errorf (_cdae ,"\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 (_debd .XAtIndex (i )),nil ;};func (_bcdf *Bitmaps )String ()string {_fadc :=_f .Builder {};for _ ,_cbfd :=range _bcdf .Values {_fadc .WriteString (_cbfd .String ());_fadc .WriteRune ('\n');};return _fadc .String ();};var MorphBC BoundaryCondition ;
|
|
|
|
type byWidth Bitmaps ;func (_dfgb *Bitmap )setEightFullBytes (_aed int ,_affc uint64 )error {if _aed +7> len (_dfgb .Data )-1{return _d .Error ("\u0073\u0065\u0074\u0045\u0069\u0067\u0068\u0074\u0042\u0079\u0074\u0065\u0073","\u0069n\u0064e\u0078\u0020\u006f\u0075\u0074 \u006f\u0066 \u0072\u0061\u006e\u0067\u0065");
|
|
|
|
};_dfgb .Data [_aed ]=byte ((_affc &0xff00000000000000)>>56);_dfgb .Data [_aed +1]=byte ((_affc &0xff000000000000)>>48);_dfgb .Data [_aed +2]=byte ((_affc &0xff0000000000)>>40);_dfgb .Data [_aed +3]=byte ((_affc &0xff00000000)>>32);_dfgb .Data [_aed +4]=byte ((_affc &0xff000000)>>24);
|
|
|
|
_dfgb .Data [_aed +5]=byte ((_affc &0xff0000)>>16);_dfgb .Data [_aed +6]=byte ((_affc &0xff00)>>8);_dfgb .Data [_aed +7]=byte (_affc &0xff);return nil ;};func (_dbge *ClassedPoints )ySortFunction ()func (_afbf int ,_debdd int )bool {return func (_debfa ,_bdfcb int )bool {return _dbge .YAtIndex (_debfa )< _dbge .YAtIndex (_bdfcb )};
|
|
|
|
};func _cbac (_cea ,_fccde *Bitmap ,_ecfe ,_agfc int )(_gcgc error ){const _fcebe ="\u0073e\u0065d\u0066\u0069\u006c\u006c\u0042i\u006e\u0061r\u0079\u004c\u006f\u0077\u0034";var (_bcde ,_bgcg ,_bbeg ,_aadbc int ;_bbdea ,_dcda ,_ebg ,_adba ,_fccfb ,_dagc ,_fbdfe byte ;
|
|
|
|
);for _bcde =0;_bcde < _ecfe ;_bcde ++{_bbeg =_bcde *_cea .RowStride ;_aadbc =_bcde *_fccde .RowStride ;for _bgcg =0;_bgcg < _agfc ;_bgcg ++{_bbdea ,_gcgc =_cea .GetByte (_bbeg +_bgcg );if _gcgc !=nil {return _d .Wrap (_gcgc ,_fcebe ,"\u0066i\u0072\u0073\u0074\u0020\u0067\u0065t");
|
|
|
|
};_dcda ,_gcgc =_fccde .GetByte (_aadbc +_bgcg );if _gcgc !=nil {return _d .Wrap (_gcgc ,_fcebe ,"\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0067\u0065\u0074");};if _bcde > 0{_ebg ,_gcgc =_cea .GetByte (_bbeg -_cea .RowStride +_bgcg );if _gcgc !=nil {return _d .Wrap (_gcgc ,_fcebe ,"\u0069\u0020\u003e \u0030");
|
|
|
|
};_bbdea |=_ebg ;};if _bgcg > 0{_adba ,_gcgc =_cea .GetByte (_bbeg +_bgcg -1);if _gcgc !=nil {return _d .Wrap (_gcgc ,_fcebe ,"\u006a\u0020\u003e \u0030");};_bbdea |=_adba <<7;};_bbdea &=_dcda ;if _bbdea ==0||(^_bbdea )==0{if _gcgc =_cea .SetByte (_bbeg +_bgcg ,_bbdea );
|
|
|
|
_gcgc !=nil {return _d .Wrap (_gcgc ,_fcebe ,"b\u0074\u0020\u003d\u003d 0\u0020|\u007c\u0020\u0028\u005e\u0062t\u0029\u0020\u003d\u003d\u0020\u0030");};continue ;};for {_fbdfe =_bbdea ;_bbdea =(_bbdea |(_bbdea >>1)|(_bbdea <<1))&_dcda ;if (_bbdea ^_fbdfe )==0{if _gcgc =_cea .SetByte (_bbeg +_bgcg ,_bbdea );
|
|
|
|
_gcgc !=nil {return _d .Wrap (_gcgc ,_fcebe ,"\u0073\u0065\u0074\u0074\u0069\u006e\u0067\u0020\u0070\u0072\u0065\u0076 \u0062\u0079\u0074\u0065");};break ;};};};};for _bcde =_ecfe -1;_bcde >=0;_bcde --{_bbeg =_bcde *_cea .RowStride ;_aadbc =_bcde *_fccde .RowStride ;
|
|
|
|
for _bgcg =_agfc -1;_bgcg >=0;_bgcg --{if _bbdea ,_gcgc =_cea .GetByte (_bbeg +_bgcg );_gcgc !=nil {return _d .Wrap (_gcgc ,_fcebe ,"\u0072\u0065\u0076\u0065\u0072\u0073\u0065\u0020\u0066\u0069\u0072\u0073t\u0020\u0067\u0065\u0074");};if _dcda ,_gcgc =_fccde .GetByte (_aadbc +_bgcg );
|
|
|
|
_gcgc !=nil {return _d .Wrap (_gcgc ,_fcebe ,"r\u0065\u0076\u0065\u0072se\u0020g\u0065\u0074\u0020\u006d\u0061s\u006b\u0020\u0062\u0079\u0074\u0065");};if _bcde < _ecfe -1{if _fccfb ,_gcgc =_cea .GetByte (_bbeg +_cea .RowStride +_bgcg );_gcgc !=nil {return _d .Wrap (_gcgc ,_fcebe ,"\u0072\u0065v\u0065\u0072\u0073e\u0020\u0069\u0020\u003c\u0020\u0068\u0020\u002d\u0031");
|
|
|
|
};_bbdea |=_fccfb ;};if _bgcg < _agfc -1{if _dagc ,_gcgc =_cea .GetByte (_bbeg +_bgcg +1);_gcgc !=nil {return _d .Wrap (_gcgc ,_fcebe ,"\u0072\u0065\u0076\u0065rs\u0065\u0020\u006a\u0020\u003c\u0020\u0077\u0070\u006c\u0020\u002d\u0020\u0031");};_bbdea |=_dagc >>7;
|
|
|
|
};_bbdea &=_dcda ;if _bbdea ==0||(^_bbdea )==0{if _gcgc =_cea .SetByte (_bbeg +_bgcg ,_bbdea );_gcgc !=nil {return _d .Wrap (_gcgc ,_fcebe ,"\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 {_fbdfe =_bbdea ;_bbdea =(_bbdea |(_bbdea >>1)|(_bbdea <<1))&_dcda ;if (_bbdea ^_fbdfe )==0{if _gcgc =_cea .SetByte (_bbeg +_bgcg ,_bbdea );_gcgc !=nil {return _d .Wrap (_gcgc ,_fcebe ,"\u0072e\u0076\u0065\u0072\u0073e\u0020\u0073\u0065\u0074\u0074i\u006eg\u0020p\u0072\u0065\u0076\u0020\u0062\u0079\u0074e");
|
|
|
|
};break ;};};};};return nil ;};func _bggb (_bcga *Bitmap ,_aacb ,_dccg int ,_fcce ,_ccad int ,_gdbcb RasterOperator ){var (_fbdf bool ;_fdg bool ;_cede int ;_babg int ;_dfafb int ;_fdbga int ;_fbaa bool ;_dcde byte ;);_adfee :=8-(_aacb &7);_dgbf :=_afcg [_adfee ];
|
|
|
|
_ebdbg :=_bcga .RowStride *_dccg +(_aacb >>3);if _fcce < _adfee {_fbdf =true ;_dgbf &=_gbcf [8-_adfee +_fcce ];};if !_fbdf {_cede =(_fcce -_adfee )>>3;if _cede !=0{_fdg =true ;_babg =_ebdbg +1;};};_dfafb =(_aacb +_fcce )&7;if !(_fbdf ||_dfafb ==0){_fbaa =true ;
|
|
|
|
_dcde =_gbcf [_dfafb ];_fdbga =_ebdbg +1+_cede ;};var _abbe ,_edgaf int ;switch _gdbcb {case PixClr :for _abbe =0;_abbe < _ccad ;_abbe ++{_bcga .Data [_ebdbg ]=_ggad (_bcga .Data [_ebdbg ],0x0,_dgbf );_ebdbg +=_bcga .RowStride ;};if _fdg {for _abbe =0;
|
|
|
|
_abbe < _ccad ;_abbe ++{for _edgaf =0;_edgaf < _cede ;_edgaf ++{_bcga .Data [_babg +_edgaf ]=0x0;};_babg +=_bcga .RowStride ;};};if _fbaa {for _abbe =0;_abbe < _ccad ;_abbe ++{_bcga .Data [_fdbga ]=_ggad (_bcga .Data [_fdbga ],0x0,_dcde );_fdbga +=_bcga .RowStride ;
|
|
|
|
};};case PixSet :for _abbe =0;_abbe < _ccad ;_abbe ++{_bcga .Data [_ebdbg ]=_ggad (_bcga .Data [_ebdbg ],0xff,_dgbf );_ebdbg +=_bcga .RowStride ;};if _fdg {for _abbe =0;_abbe < _ccad ;_abbe ++{for _edgaf =0;_edgaf < _cede ;_edgaf ++{_bcga .Data [_babg +_edgaf ]=0xff;
|
|
|
|
};_babg +=_bcga .RowStride ;};};if _fbaa {for _abbe =0;_abbe < _ccad ;_abbe ++{_bcga .Data [_fdbga ]=_ggad (_bcga .Data [_fdbga ],0xff,_dcde );_fdbga +=_bcga .RowStride ;};};case PixNotDst :for _abbe =0;_abbe < _ccad ;_abbe ++{_bcga .Data [_ebdbg ]=_ggad (_bcga .Data [_ebdbg ],^_bcga .Data [_ebdbg ],_dgbf );
|
|
|
|
_ebdbg +=_bcga .RowStride ;};if _fdg {for _abbe =0;_abbe < _ccad ;_abbe ++{for _edgaf =0;_edgaf < _cede ;_edgaf ++{_bcga .Data [_babg +_edgaf ]=^(_bcga .Data [_babg +_edgaf ]);};_babg +=_bcga .RowStride ;};};if _fbaa {for _abbe =0;_abbe < _ccad ;_abbe ++{_bcga .Data [_fdbga ]=_ggad (_bcga .Data [_fdbga ],^_bcga .Data [_fdbga ],_dcde );
|
|
|
|
_fdbga +=_bcga .RowStride ;};};};};func (_cddbg *Bitmap )setFourBytes (_bgge int ,_gegd uint32 )error {if _bgge +3> len (_cddbg .Data )-1{return _d .Errorf ("\u0073\u0065\u0074F\u006f\u0075\u0072\u0042\u0079\u0074\u0065\u0073","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",_bgge );
|
|
|
|
};_cddbg .Data [_bgge ]=byte ((_gegd &0xff000000)>>24);_cddbg .Data [_bgge +1]=byte ((_gegd &0xff0000)>>16);_cddbg .Data [_bgge +2]=byte ((_gegd &0xff00)>>8);_cddbg .Data [_bgge +3]=byte (_gegd &0xff);return nil ;};func (_abb *Bitmap )GetByteIndex (x ,y int )int {return y *_abb .RowStride +(x >>3)};
|
|
|
|
func (_feb *Bitmap )setPadBits (_ddac int ){_fdfg :=8-_feb .Width %8;if _fdfg ==8{return ;};_fbfc :=_feb .Width /8;_gfb :=_afcg [_fdfg ];if _ddac ==0{_gfb ^=_gfb ;};var _daab int ;for _ffae :=0;_ffae < _feb .Height ;_ffae ++{_daab =_ffae *_feb .RowStride +_fbfc ;
|
|
|
|
if _ddac ==0{_feb .Data [_daab ]&=_gfb ;}else {_feb .Data [_daab ]|=_gfb ;};};};func (_effe *Bitmaps )ClipToBitmap (s *Bitmap )(*Bitmaps ,error ){const _dgbg ="B\u0069t\u006d\u0061\u0070\u0073\u002e\u0043\u006c\u0069p\u0054\u006f\u0042\u0069tm\u0061\u0070";
|
|
|
|
if _effe ==nil {return nil ,_d .Error (_dgbg ,"\u0042\u0069\u0074\u006dap\u0073\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");};if s ==nil {return nil ,_d .Error (_dgbg ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");
|
|
|
|
};_ggebb :=len (_effe .Values );_aeegc :=&Bitmaps {Values :make ([]*Bitmap ,_ggebb ),Boxes :make ([]*_dc .Rectangle ,_ggebb )};var (_bgeba ,_fgeg *Bitmap ;_gebg *_dc .Rectangle ;_babce error ;);for _gbeb :=0;_gbeb < _ggebb ;_gbeb ++{if _bgeba ,_babce =_effe .GetBitmap (_gbeb );
|
|
|
|
_babce !=nil {return nil ,_d .Wrap (_babce ,_dgbg ,"");};if _gebg ,_babce =_effe .GetBox (_gbeb );_babce !=nil {return nil ,_d .Wrap (_babce ,_dgbg ,"");};if _fgeg ,_babce =s .clipRectangle (_gebg ,nil );_babce !=nil {return nil ,_d .Wrap (_babce ,_dgbg ,"");
|
|
|
|
};if _fgeg ,_babce =_fgeg .And (_bgeba );_babce !=nil {return nil ,_d .Wrap (_babce ,_dgbg ,"");};_aeegc .Values [_gbeb ]=_fgeg ;_aeegc .Boxes [_gbeb ]=_gebg ;};return _aeegc ,nil ;};func (_afcf *Boxes )selectWithIndicator (_gacce *_gc .NumSlice )(_cbc *Boxes ,_abcba error ){const _efgf ="\u0042o\u0078\u0065\u0073\u002es\u0065\u006c\u0065\u0063\u0074W\u0069t\u0068I\u006e\u0064\u0069\u0063\u0061\u0074\u006fr";
|
|
|
|
if _afcf ==nil {return nil ,_d .Error (_efgf ,"b\u006f\u0078\u0065\u0073 '\u0062'\u0020\u006e\u006f\u0074\u0020d\u0065\u0066\u0069\u006e\u0065\u0064");};if _gacce ==nil {return nil ,_d .Error (_efgf ,"\u0027\u006ea\u0027\u0020\u006eo\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
|
|
};if len (*_gacce )!=len (*_afcf ){return nil ,_d .Error (_efgf ,"\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 _eadd ,_fce int ;for _abge :=0;_abge < len (*_gacce );_abge ++{if _eadd ,_abcba =_gacce .GetInt (_abge );_abcba !=nil {return nil ,_d .Wrap (_abcba ,_efgf ,"\u0063\u0068\u0065\u0063\u006b\u0069\u006e\u0067\u0020c\u006f\u0075\u006e\u0074");};if _eadd ==1{_fce ++;
|
|
|
|
};};if _fce ==len (*_afcf ){return _afcf ,nil ;};_gga :=Boxes {};for _gdgb :=0;_gdgb < len (*_gacce );_gdgb ++{_eadd =int ((*_gacce )[_gdgb ]);if _eadd ==0{continue ;};_gga =append (_gga ,(*_afcf )[_gdgb ]);};_cbc =&_gga ;return _cbc ,nil ;};func (_fdbdb *ClassedPoints )Swap (i ,j int ){_fdbdb .IntSlice [i ],_fdbdb .IntSlice [j ]=_fdbdb .IntSlice [j ],_fdbdb .IntSlice [i ];
|
|
|
|
};func (_ggcg *Bitmap )SetPadBits (value int ){_ggcg .setPadBits (value )};func (_adef *BitmapsArray )GetBitmaps (i int )(*Bitmaps ,error ){const _ggada ="\u0042\u0069\u0074ma\u0070\u0073\u0041\u0072\u0072\u0061\u0079\u002e\u0047\u0065\u0074\u0042\u0069\u0074\u006d\u0061\u0070\u0073";
|
|
|
|
if _adef ==nil {return nil ,_d .Error (_ggada ,"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 (_adef .Values )-1{return nil ,_d .Errorf (_ggada ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
|
|
};return _adef .Values [i ],nil ;};func (_ege *Bitmaps )WidthSorter ()func (_gbab ,_ecfeg int )bool {return func (_cgfb ,_dggcd int )bool {return _ege .Values [_cgfb ].Width < _ege .Values [_dggcd ].Width };};func _cfgcb (_eaad ...MorphProcess )(_aagd error ){const _abdeb ="v\u0065r\u0069\u0066\u0079\u004d\u006f\u0072\u0070\u0068P\u0072\u006f\u0063\u0065ss\u0065\u0073";
|
|
|
|
var _aaaa ,_dcfb int ;for _feeb ,_ceefb :=range _eaad {if _aagd =_ceefb .verify (_feeb ,&_aaaa ,&_dcfb );_aagd !=nil {return _d .Wrap (_aagd ,_abdeb ,"");};};if _dcfb !=0&&_aaaa !=0{return _d .Error (_abdeb ,"\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 CorrelationScore (bm1 ,bm2 *Bitmap ,area1 ,area2 int ,delX ,delY float32 ,maxDiffW ,maxDiffH int ,tab []int )(_egafd float64 ,_effd error ){const _gbgc ="\u0063\u006fr\u0072\u0065\u006ca\u0074\u0069\u006f\u006e\u0053\u0063\u006f\u0072\u0065";
|
|
|
|
if bm1 ==nil ||bm2 ==nil {return 0,_d .Error (_gbgc ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0062\u0069\u0074ma\u0070\u0073");};if tab ==nil {return 0,_d .Error (_gbgc ,"\u0027\u0074\u0061\u0062\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065f\u0069\u006e\u0065\u0064");
|
|
|
|
};if area1 <=0||area2 <=0{return 0,_d .Error (_gbgc ,"\u0061\u0072\u0065\u0061s\u0020\u006d\u0075\u0073\u0074\u0020\u0062\u0065\u0020\u0067r\u0065a\u0074\u0065\u0072\u0020\u0074\u0068\u0061n\u0020\u0030");};_cedd ,_ddad :=bm1 .Width ,bm1 .Height ;_ggfe ,_cabeb :=bm2 .Width ,bm2 .Height ;
|
|
|
|
_cdgf :=_fef (_cedd -_ggfe );if _cdgf > maxDiffW {return 0,nil ;};_aegc :=_fef (_ddad -_cabeb );if _aegc > maxDiffH {return 0,nil ;};var _dacf ,_cdeee int ;if delX >=0{_dacf =int (delX +0.5);}else {_dacf =int (delX -0.5);};if delY >=0{_cdeee =int (delY +0.5);
|
|
|
|
}else {_cdeee =int (delY -0.5);};_eaecf :=_acgd (_cdeee ,0);_bbgdf :=_bebf (_cabeb +_cdeee ,_ddad );_cbfb :=bm1 .RowStride *_eaecf ;_ccbd :=bm2 .RowStride *(_eaecf -_cdeee );_dbe :=_acgd (_dacf ,0);_fgce :=_bebf (_ggfe +_dacf ,_cedd );_ceef :=bm2 .RowStride ;
|
|
|
|
var _cfbb ,_cce int ;if _dacf >=8{_cfbb =_dacf >>3;_cbfb +=_cfbb ;_dbe -=_cfbb <<3;_fgce -=_cfbb <<3;_dacf &=7;}else if _dacf <=-8{_cce =-((_dacf +7)>>3);_ccbd +=_cce ;_ceef -=_cce ;_dacf +=_cce <<3;};if _dbe >=_fgce ||_eaecf >=_bbgdf {return 0,nil ;};
|
|
|
|
_acdb :=(_fgce +7)>>3;var (_ccf ,_gda ,_cafa byte ;_gceb ,_fdab ,_adga int ;);switch {case _dacf ==0:for _adga =_eaecf ;_adga < _bbgdf ;_adga ,_cbfb ,_ccbd =_adga +1,_cbfb +bm1 .RowStride ,_ccbd +bm2 .RowStride {for _fdab =0;_fdab < _acdb ;_fdab ++{_cafa =bm1 .Data [_cbfb +_fdab ]&bm2 .Data [_ccbd +_fdab ];
|
|
|
|
_gceb +=tab [_cafa ];};};case _dacf > 0:if _ceef < _acdb {for _adga =_eaecf ;_adga < _bbgdf ;_adga ,_cbfb ,_ccbd =_adga +1,_cbfb +bm1 .RowStride ,_ccbd +bm2 .RowStride {_ccf ,_gda =bm1 .Data [_cbfb ],bm2 .Data [_ccbd ]>>uint (_dacf );_cafa =_ccf &_gda ;
|
|
|
|
_gceb +=tab [_cafa ];for _fdab =1;_fdab < _ceef ;_fdab ++{_ccf ,_gda =bm1 .Data [_cbfb +_fdab ],(bm2 .Data [_ccbd +_fdab ]>>uint (_dacf ))|(bm2 .Data [_ccbd +_fdab -1]<<uint (8-_dacf ));_cafa =_ccf &_gda ;_gceb +=tab [_cafa ];};_ccf =bm1 .Data [_cbfb +_fdab ];
|
|
|
|
_gda =bm2 .Data [_ccbd +_fdab -1]<<uint (8-_dacf );_cafa =_ccf &_gda ;_gceb +=tab [_cafa ];};}else {for _adga =_eaecf ;_adga < _bbgdf ;_adga ,_cbfb ,_ccbd =_adga +1,_cbfb +bm1 .RowStride ,_ccbd +bm2 .RowStride {_ccf ,_gda =bm1 .Data [_cbfb ],bm2 .Data [_ccbd ]>>uint (_dacf );
|
|
|
|
_cafa =_ccf &_gda ;_gceb +=tab [_cafa ];for _fdab =1;_fdab < _acdb ;_fdab ++{_ccf =bm1 .Data [_cbfb +_fdab ];_gda =(bm2 .Data [_ccbd +_fdab ]>>uint (_dacf ))|(bm2 .Data [_ccbd +_fdab -1]<<uint (8-_dacf ));_cafa =_ccf &_gda ;_gceb +=tab [_cafa ];};};};default:if _acdb < _ceef {for _adga =_eaecf ;
|
|
|
|
_adga < _bbgdf ;_adga ,_cbfb ,_ccbd =_adga +1,_cbfb +bm1 .RowStride ,_ccbd +bm2 .RowStride {for _fdab =0;_fdab < _acdb ;_fdab ++{_ccf =bm1 .Data [_cbfb +_fdab ];_gda =bm2 .Data [_ccbd +_fdab ]<<uint (-_dacf );_gda |=bm2 .Data [_ccbd +_fdab +1]>>uint (8+_dacf );
|
|
|
|
_cafa =_ccf &_gda ;_gceb +=tab [_cafa ];};};}else {for _adga =_eaecf ;_adga < _bbgdf ;_adga ,_cbfb ,_ccbd =_adga +1,_cbfb +bm1 .RowStride ,_ccbd +bm2 .RowStride {for _fdab =0;_fdab < _acdb -1;_fdab ++{_ccf =bm1 .Data [_cbfb +_fdab ];_gda =bm2 .Data [_ccbd +_fdab ]<<uint (-_dacf );
|
|
|
|
_gda |=bm2 .Data [_ccbd +_fdab +1]>>uint (8+_dacf );_cafa =_ccf &_gda ;_gceb +=tab [_cafa ];};_ccf =bm1 .Data [_cbfb +_fdab ];_gda =bm2 .Data [_ccbd +_fdab ]<<uint (-_dacf );_cafa =_ccf &_gda ;_gceb +=tab [_cafa ];};};};_egafd =float64 (_gceb )*float64 (_gceb )/(float64 (area1 )*float64 (area2 ));
|
|
|
|
return _egafd ,nil ;};func _bgbdf (_gbagb *Bitmap ,_dcdd *Bitmap ,_febdb int )(_dfdcf error ){const _gcae ="\u0073\u0065\u0065\u0064\u0066\u0069\u006c\u006c\u0042\u0069\u006e\u0061r\u0079\u004c\u006f\u0077";_fcebb :=_bebf (_gbagb .Height ,_dcdd .Height );
|
|
|
|
_ggac :=_bebf (_gbagb .RowStride ,_dcdd .RowStride );switch _febdb {case 4:_dfdcf =_cbac (_gbagb ,_dcdd ,_fcebb ,_ggac );case 8:_dfdcf =_fdge (_gbagb ,_dcdd ,_fcebb ,_ggac );default:return _d .Errorf (_gcae ,"\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",_febdb );
|
|
|
|
};if _dfdcf !=nil {return _d .Wrap (_dfdcf ,_gcae ,"");};return nil ;};func (_fgdf *Bitmap )setAll ()error {_fafd :=_eebc (_fgdf ,0,0,_fgdf .Width ,_fgdf .Height ,PixSet ,nil ,0,0);if _fafd !=nil {return _d .Wrap (_fafd ,"\u0073\u0065\u0074\u0041\u006c\u006c","");
|
|
|
|
};return nil ;};func (_agag *byWidth )Len ()int {return len (_agag .Values )};type Selection struct{Height ,Width int ;Cx ,Cy int ;Name string ;Data [][]SelectionValue ;};func _ffgb (_geeb *Bitmap ,_eeef *_gc .Stack ,_egce ,_abbed ,_afge int )(_deede *_dc .Rectangle ,_bbafc error ){const _bdae ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";
|
|
|
|
if _geeb ==nil {return nil ,_d .Error (_bdae ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");};if _eeef ==nil {return nil ,_d .Error (_bdae ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");
|
|
|
|
};switch _afge {case 4:if _deede ,_bbafc =_gdfbf (_geeb ,_eeef ,_egce ,_abbed );_bbafc !=nil {return nil ,_d .Wrap (_bbafc ,_bdae ,"");};return _deede ,nil ;case 8:if _deede ,_bbafc =_cfbd (_geeb ,_eeef ,_egce ,_abbed );_bbafc !=nil {return nil ,_d .Wrap (_bbafc ,_bdae ,"");
|
|
|
|
};return _deede ,nil ;default:return nil ,_d .Errorf (_bdae ,"\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",_afge );
|
|
|
|
};};func (_agff *Bitmap )SetByte (index int ,v byte )error {if index > len (_agff .Data )-1||index < 0{return _d .Errorf ("\u0053e\u0074\u0042\u0079\u0074\u0065","\u0069\u006e\u0064\u0065x \u006f\u0075\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065\u003a\u0020%\u0064",index );
|
|
|
|
};_agff .Data [index ]=v ;return nil ;};func (_cbcgg *Bitmaps )selectByIndexes (_bdgg []int )(*Bitmaps ,error ){_ccadc :=&Bitmaps {};for _ ,_acag :=range _bdgg {_egdc ,_eafc :=_cbcgg .GetBitmap (_acag );if _eafc !=nil {return nil ,_d .Wrap (_eafc ,"\u0073e\u006ce\u0063\u0074\u0042\u0079\u0049\u006e\u0064\u0065\u0078\u0065\u0073","");
|
|
|
|
};_ccadc .AddBitmap (_egdc );};return _ccadc ,nil ;};func (_gab *Bitmap )CreateTemplate ()*Bitmap {return _gab .createTemplate ()};func TstImageBitmap ()*Bitmap {return _cafd .Copy ()};func (_gbf *Bitmap )GetByte (index int )(byte ,error ){if index > len (_gbf .Data )-1||index < 0{return 0,_d .Errorf ("\u0047e\u0074\u0042\u0079\u0074\u0065","\u0069\u006e\u0064\u0065x:\u0020\u0025\u0064\u0020\u006f\u0075\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006eg\u0065",index );
|
|
|
|
};return _gbf .Data [index ],nil ;};func TstISymbol (t *_g .T ,scale ...int )*Bitmap {_adab ,_ccegg :=NewWithData (1,5,[]byte {0x80,0x80,0x80,0x80,0x80});_df .NoError (t ,_ccegg );return TstGetScaledSymbol (t ,_adab ,scale ...);};type RasterOperator int ;
|
|
|
|
func (_ceg *Bitmap )setBit (_gaee int ){_ceg .Data [(_gaee >>3)]|=0x80>>uint (_gaee &7)};func _ccdfa (_dbdd ,_dbca *Bitmap ,_bagd ,_dged int )(*Bitmap ,error ){const _fba ="\u0063\u006c\u006f\u0073\u0065\u0042\u0072\u0069\u0063\u006b";if _dbca ==nil {return nil ,_d .Error (_fba ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
|
|
};if _bagd < 1||_dged < 1{return nil ,_d .Error (_fba ,"\u0068S\u0069\u007a\u0065\u0020\u0061\u006e\u0064\u0020\u0076\u0053\u0069z\u0065\u0020\u006e\u006f\u0074\u0020\u003e\u003d\u0020\u0031");};if _bagd ==1&&_dged ==1{return _dbca .Copy (),nil ;};if _bagd ==1||_dged ==1{_aebd :=SelCreateBrick (_dged ,_bagd ,_dged /2,_bagd /2,SelHit );
|
|
|
|
var _fced error ;_dbdd ,_fced =_adfd (_dbdd ,_dbca ,_aebd );if _fced !=nil {return nil ,_d .Wrap (_fced ,_fba ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");};return _dbdd ,nil ;
|
|
|
|
};_deef :=SelCreateBrick (1,_bagd ,0,_bagd /2,SelHit );_afde :=SelCreateBrick (_dged ,1,_dged /2,0,SelHit );_fdbd ,_cgegd :=_gfed (nil ,_dbca ,_deef );if _cgegd !=nil {return nil ,_d .Wrap (_cgegd ,_fba ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
|
|
};if _dbdd ,_cgegd =_gfed (_dbdd ,_fdbd ,_afde );_cgegd !=nil {return nil ,_d .Wrap (_cgegd ,_fba ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};if _ ,_cgegd =_cgfe (_fdbd ,_dbdd ,_deef );_cgegd !=nil {return nil ,_d .Wrap (_cgegd ,_fba ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");
|
|
|
|
};if _ ,_cgegd =_cgfe (_dbdd ,_fdbd ,_afde );_cgegd !=nil {return nil ,_d .Wrap (_cgegd ,_fba ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};return _dbdd ,nil ;};func _agd ()(_edb [256]uint64 ){for _beb :=0;_beb < 256;_beb ++{if _beb &0x01!=0{_edb [_beb ]|=0xff;
|
|
|
|
};if _beb &0x02!=0{_edb [_beb ]|=0xff00;};if _beb &0x04!=0{_edb [_beb ]|=0xff0000;};if _beb &0x08!=0{_edb [_beb ]|=0xff000000;};if _beb &0x10!=0{_edb [_beb ]|=0xff00000000;};if _beb &0x20!=0{_edb [_beb ]|=0xff0000000000;};if _beb &0x40!=0{_edb [_beb ]|=0xff000000000000;
|
|
|
|
};if _beb &0x80!=0{_edb [_beb ]|=0xff00000000000000;};};return _edb ;};func (_dafd *Bitmap )Equivalent (s *Bitmap )bool {return _dafd .equivalent (s )};func TstNSymbol (t *_g .T ,scale ...int )*Bitmap {_dcgf ,_aggd :=NewWithData (4,5,[]byte {0x90,0xD0,0xB0,0x90,0x90});
|
|
|
|
_df .NoError (t ,_aggd );return TstGetScaledSymbol (t ,_dcgf ,scale ...);};func (_gbae *Selection )setOrigin (_cbada ,_affeg int ){_gbae .Cy ,_gbae .Cx =_cbada ,_affeg };type Color int ;func TstVSymbol (t *_g .T ,scale ...int )*Bitmap {_ccgd ,_cefe :=NewWithData (5,5,[]byte {0x88,0x88,0x88,0x50,0x20});
|
|
|
|
_df .NoError (t ,_cefe );return TstGetScaledSymbol (t ,_ccgd ,scale ...);};func _ggcf (_ggdf ,_beaa *Bitmap ,_fdfgb ,_cdaa ,_dgfa uint ,_dgbb ,_aegef int ,_cdab bool ,_dafe ,_gbca int )error {for _adcdg :=_dgbb ;_adcdg < _aegef ;_adcdg ++{if _dafe +1< len (_ggdf .Data ){_efgba :=_adcdg +1==_aegef ;
|
|
|
|
_eebe ,_facb :=_ggdf .GetByte (_dafe );if _facb !=nil {return _facb ;};_dafe ++;_eebe <<=_fdfgb ;_cfbe ,_facb :=_ggdf .GetByte (_dafe );if _facb !=nil {return _facb ;};_cfbe >>=_cdaa ;_cedf :=_eebe |_cfbe ;if _efgba &&!_cdab {_cedf =_efea (_dgfa ,_cedf );
|
|
|
|
};_facb =_beaa .SetByte (_gbca ,_cedf );if _facb !=nil {return _facb ;};_gbca ++;if _efgba &&_cdab {_bgga ,_cdee :=_ggdf .GetByte (_dafe );if _cdee !=nil {return _cdee ;};_bgga <<=_fdfgb ;_cedf =_efea (_dgfa ,_bgga );if _cdee =_beaa .SetByte (_gbca ,_cedf );
|
|
|
|
_cdee !=nil {return _cdee ;};};continue ;};_ggg ,_cece :=_ggdf .GetByte (_dafe );if _cece !=nil {_dd .Log .Debug ("G\u0065\u0074\u0074\u0069\u006e\u0067 \u0074\u0068\u0065\u0020\u0076\u0061l\u0075\u0065\u0020\u0061\u0074\u003a\u0020%\u0064\u0020\u0066\u0061\u0069\u006c\u0065\u0064\u003a\u0020%\u0073",_dafe ,_cece );
|
|
|
|
return _cece ;};_ggg <<=_fdfgb ;_dafe ++;_cece =_beaa .SetByte (_gbca ,_ggg );if _cece !=nil {return _cece ;};_gbca ++;};return nil ;};func _abe (_ebdea ,_cdfe *Bitmap ,_ecbf ,_aaad int )(*Bitmap ,error ){const _fde ="\u0063\u006c\u006f\u0073\u0065\u0053\u0061\u0066\u0065B\u0072\u0069\u0063\u006b";
|
|
|
|
if _cdfe ==nil {return nil ,_d .Error (_fde ,"\u0073\u006f\u0075\u0072\u0063\u0065\u0020\u0069\u0073\u0020\u006e\u0069\u006c");};if _ecbf < 1||_aaad < 1{return nil ,_d .Error (_fde ,"\u0068s\u0069\u007a\u0065\u0020\u0061\u006e\u0064\u0020\u0076\u0073\u0069z\u0065\u0020\u006e\u006f\u0074\u0020\u003e\u003d\u0020\u0031");
|
|
|
|
};if _ecbf ==1&&_aaad ==1{return _faec (_ebdea ,_cdfe );};if MorphBC ==SymmetricMorphBC {_fadb ,_acdg :=_ccdfa (_ebdea ,_cdfe ,_ecbf ,_aaad );if _acdg !=nil {return nil ,_d .Wrap (_acdg ,_fde ,"\u0053\u0079m\u006d\u0065\u0074r\u0069\u0063\u004d\u006f\u0072\u0070\u0068\u0042\u0043");
|
|
|
|
};return _fadb ,nil ;};_gfef :=_acgd (_ecbf /2,_aaad /2);_bcgd :=8*((_gfef +7)/8);_affca ,_eedd :=_cdfe .AddBorder (_bcgd ,0);if _eedd !=nil {return nil ,_d .Wrapf (_eedd ,_fde ,"\u0042\u006f\u0072\u0064\u0065\u0072\u0053\u0069\u007ae\u003a\u0020\u0025\u0064",_bcgd );
|
|
|
|
};var _eacb ,_cdfcd *Bitmap ;if _ecbf ==1||_aaad ==1{_adea :=SelCreateBrick (_aaad ,_ecbf ,_aaad /2,_ecbf /2,SelHit );_eacb ,_eedd =_adfd (nil ,_affca ,_adea );if _eedd !=nil {return nil ,_d .Wrap (_eedd ,_fde ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
|
|
};}else {_aeda :=SelCreateBrick (1,_ecbf ,0,_ecbf /2,SelHit );_baga ,_adfg :=_gfed (nil ,_affca ,_aeda );if _adfg !=nil {return nil ,_d .Wrap (_adfg ,_fde ,"\u0072\u0065\u0067\u0075la\u0072\u0020\u002d\u0020\u0066\u0069\u0072\u0073\u0074\u0020\u0064\u0069\u006c\u0061t\u0065");
|
|
|
|
};_dfce :=SelCreateBrick (_aaad ,1,_aaad /2,0,SelHit );_eacb ,_adfg =_gfed (nil ,_baga ,_dfce );if _adfg !=nil {return nil ,_d .Wrap (_adfg ,_fde ,"\u0072\u0065\u0067ul\u0061\u0072\u0020\u002d\u0020\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
|
|
};if _ ,_adfg =_cgfe (_baga ,_eacb ,_aeda );_adfg !=nil {return nil ,_d .Wrap (_adfg ,_fde ,"r\u0065\u0067\u0075\u006car\u0020-\u0020\u0066\u0069\u0072\u0073t\u0020\u0065\u0072\u006f\u0064\u0065");};if _ ,_adfg =_cgfe (_eacb ,_baga ,_dfce );_adfg !=nil {return nil ,_d .Wrap (_adfg ,_fde ,"\u0072\u0065\u0067\u0075la\u0072\u0020\u002d\u0020\u0073\u0065\u0063\u006f\u006e\u0064\u0020\u0065\u0072\u006fd\u0065");
|
|
|
|
};};if _cdfcd ,_eedd =_eacb .RemoveBorder (_bcgd );_eedd !=nil {return nil ,_d .Wrap (_eedd ,_fde ,"\u0072e\u0067\u0075\u006c\u0061\u0072");};if _ebdea ==nil {return _cdfcd ,nil ;};if _ ,_eedd =_faec (_ebdea ,_cdfcd );_eedd !=nil {return nil ,_eedd ;};
|
|
|
|
return _ebdea ,nil ;};func (_bgaa *byWidth )Swap (i ,j int ){_bgaa .Values [i ],_bgaa .Values [j ]=_bgaa .Values [j ],_bgaa .Values [i ];if _bgaa .Boxes !=nil {_bgaa .Boxes [i ],_bgaa .Boxes [j ]=_bgaa .Boxes [j ],_bgaa .Boxes [i ];};};var _efg [256]uint8 ;
|
|
|
|
type shift int ;func _eabcd (_cdde ,_caf *Bitmap ,_egbf ,_dbfa ,_cffe ,_aeea ,_gedf int ,_efgb CombinationOperator )error {var _dfbcg int ;_ggcgc :=func (){_dfbcg ++;_cffe +=_caf .RowStride ;_aeea +=_cdde .RowStride ;_gedf +=_cdde .RowStride };for _dfbcg =_egbf ;
|
|
|
|
_dfbcg < _dbfa ;_ggcgc (){_dgb :=_cffe ;for _efe :=_aeea ;_efe <=_gedf ;_efe ++{_baeg ,_agfe :=_caf .GetByte (_dgb );if _agfe !=nil {return _agfe ;};_egaf ,_agfe :=_cdde .GetByte (_efe );if _agfe !=nil {return _agfe ;};if _agfe =_caf .SetByte (_dgb ,_dbae (_baeg ,_egaf ,_efgb ));
|
|
|
|
_agfe !=nil {return _agfe ;};_dgb ++;};};return nil ;};func MorphSequence (src *Bitmap ,sequence ...MorphProcess )(*Bitmap ,error ){return _ecae (src ,sequence ...);};func (_ceee *Points )Add (pt *Points )error {const _egde ="\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0041\u0064\u0064";
|
|
|
|
if _ceee ==nil {return _d .Error (_egde ,"\u0070o\u0069n\u0074\u0073\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if pt ==nil {return _d .Error (_egde ,"a\u0072\u0067\u0075\u006d\u0065\u006et\u0020\u0070\u006f\u0069\u006e\u0074\u0073\u0020\u006eo\u0074\u0020\u0064e\u0066i\u006e\u0065\u0064");
|
|
|
|
};*_ceee =append (*_ceee ,*pt ...);return nil ;};func Centroid (bm *Bitmap ,centTab ,sumTab []int )(Point ,error ){return bm .centroid (centTab ,sumTab )};func _ccce (_bebe ,_fda *Bitmap ,_gcg ,_edbd ,_bde ,_afab ,_gacc ,_dfgg ,_gefe ,_ggd int ,_geeg CombinationOperator ,_affed int )error {var _deea int ;
|
|
|
|
_bcge :=func (){_deea ++;_bde +=_fda .RowStride ;_afab +=_bebe .RowStride ;_gacc +=_bebe .RowStride };for _deea =_gcg ;_deea < _edbd ;_bcge (){var _efeg uint16 ;_fbc :=_bde ;for _cccf :=_afab ;_cccf <=_gacc ;_cccf ++{_cfdg ,_eaac :=_fda .GetByte (_fbc );
|
|
|
|
if _eaac !=nil {return _eaac ;};_bgde ,_eaac :=_bebe .GetByte (_cccf );if _eaac !=nil {return _eaac ;};_efeg =(_efeg |(uint16 (_bgde )&0xff))<<uint (_ggd );_bgde =byte (_efeg >>8);if _eaac =_fda .SetByte (_fbc ,_dbae (_cfdg ,_bgde ,_geeg ));_eaac !=nil {return _eaac ;
|
|
|
|
};_fbc ++;_efeg <<=uint (_gefe );if _cccf ==_gacc {_bgde =byte (_efeg >>(8-uint8 (_ggd )));if _affed !=0{_bgde =_efea (uint (8+_dfgg ),_bgde );};_cfdg ,_eaac =_fda .GetByte (_fbc );if _eaac !=nil {return _eaac ;};if _eaac =_fda .SetByte (_fbc ,_dbae (_cfdg ,_bgde ,_geeg ));
|
|
|
|
_eaac !=nil {return _eaac ;};};};};return nil ;};func (_edcg *Bitmaps )GroupByWidth ()(*BitmapsArray ,error ){const _bafe ="\u0047\u0072\u006fu\u0070\u0042\u0079\u0057\u0069\u0064\u0074\u0068";if len (_edcg .Values )==0{return nil ,_d .Error (_bafe ,"\u006eo\u0020v\u0061\u006c\u0075\u0065\u0073 \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");
|
|
|
|
};_bbab :=&BitmapsArray {};_edcg .SortByWidth ();_gbfd :=-1;_fgea :=-1;for _aaaaf :=0;_aaaaf < len (_edcg .Values );_aaaaf ++{_bcaee :=_edcg .Values [_aaaaf ].Width ;if _bcaee > _gbfd {_gbfd =_bcaee ;_fgea ++;_bbab .Values =append (_bbab .Values ,&Bitmaps {});
|
|
|
|
};_bbab .Values [_fgea ].AddBitmap (_edcg .Values [_aaaaf ]);};return _bbab ,nil ;};func _faec (_bcda ,_eggc *Bitmap )(*Bitmap ,error ){if _eggc ==nil {return nil ,_d .Error ("\u0063\u006f\u0070\u0079\u0042\u0069\u0074\u006d\u0061\u0070","\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
|
|
};if _eggc ==_bcda {return _bcda ,nil ;};if _bcda ==nil {_bcda =_eggc .createTemplate ();copy (_bcda .Data ,_eggc .Data );return _bcda ,nil ;};_eebga :=_bcda .resizeImageData (_eggc );if _eebga !=nil {return nil ,_d .Wrap (_eebga ,"\u0063\u006f\u0070\u0079\u0042\u0069\u0074\u006d\u0061\u0070","");
|
|
|
|
};_bcda .Text =_eggc .Text ;copy (_bcda .Data ,_eggc .Data );return _bcda ,nil ;};func (_cagcc *ClassedPoints )xSortFunction ()func (_fdcg int ,_cggf int )bool {return func (_gcadc ,_gddc int )bool {return _cagcc .XAtIndex (_gcadc )< _cagcc .XAtIndex (_gddc )};
|
|
|
|
};func (_cfg *Bitmap )thresholdPixelSum (_cgd int )bool {var (_bdb int ;_cfgc uint8 ;_afb byte ;_bafcd int ;);_ffea :=_cfg .RowStride ;_bfc :=uint (_cfg .Width &0x07);if _bfc !=0{_cfgc =uint8 ((0xff<<(8-_bfc ))&0xff);_ffea --;};for _eag :=0;_eag < _cfg .Height ;
|
|
|
|
_eag ++{for _bafcd =0;_bafcd < _ffea ;_bafcd ++{_afb =_cfg .Data [_eag *_cfg .RowStride +_bafcd ];_bdb +=int (_efg [_afb ]);};if _bfc !=0{_afb =_cfg .Data [_eag *_cfg .RowStride +_bafcd ]&_cfgc ;_bdb +=int (_efg [_afb ]);};if _bdb > _cgd {return true ;
|
|
|
|
};};return false ;};func _gbg (_debf *Bitmap ,_bb *Bitmap ,_fgg int )(_ba error ){const _bbb ="e\u0078\u0070\u0061\u006edB\u0069n\u0061\u0072\u0079\u0050\u006fw\u0065\u0072\u0032\u004c\u006f\u0077";switch _fgg {case 2:_ba =_ac (_debf ,_bb );case 4:_ba =_gb (_debf ,_bb );
|
|
|
|
case 8:_ba =_agg (_debf ,_bb );default:return _d .Error (_bbb ,"\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 _ba !=nil {_ba =_d .Wrap (_ba ,_bbb ,"");};return _ba ;};func (_bfee *Boxes )SelectBySize (width ,height int ,tp LocationFilter ,relation SizeComparison )(_eega *Boxes ,_egdd error ){const _aaaf ="\u0042o\u0078e\u0073\u002e\u0053\u0065\u006ce\u0063\u0074B\u0079\u0053\u0069\u007a\u0065";
|
|
|
|
if _bfee ==nil {return nil ,_d .Error (_aaaf ,"b\u006f\u0078\u0065\u0073 '\u0062'\u0020\u006e\u006f\u0074\u0020d\u0065\u0066\u0069\u006e\u0065\u0064");};if len (*_bfee )==0{return _bfee ,nil ;};switch tp {case LocSelectWidth ,LocSelectHeight ,LocSelectIfEither ,LocSelectIfBoth :default:return nil ,_d .Errorf (_aaaf ,"\u0069\u006e\u0076al\u0069\u0064\u0020\u0066\u0069\u006c\u0074\u0065\u0072\u0020\u0074\u0079\u0070\u0065\u003a\u0020\u0025\u0064",tp );
|
|
|
|
};switch relation {case SizeSelectIfLT ,SizeSelectIfGT ,SizeSelectIfLTE ,SizeSelectIfGTE :default:return nil ,_d .Errorf (_aaaf ,"i\u006e\u0076\u0061\u006c\u0069\u0064 \u0072\u0065\u006c\u0061\u0074\u0069\u006f\u006e\u0020t\u0079\u0070\u0065:\u0020'\u0025\u0064\u0027",tp );
|
|
|
|
};_cabdb :=_bfee .makeSizeIndicator (width ,height ,tp ,relation );_ded ,_egdd :=_bfee .selectWithIndicator (_cabdb );if _egdd !=nil {return nil ,_d .Wrap (_egdd ,_aaaf ,"");};return _ded ,nil ;};func (_gffe MorphProcess )getWidthHeight ()(_ecef ,_dcgc int ){return _gffe .Arguments [0],_gffe .Arguments [1];
|
|
|
|
};func _bebab (_dfcf ,_bdge *Bitmap ,_cfae ,_aacc int )(*Bitmap ,error ){const _cfag ="d\u0069\u006c\u0061\u0074\u0065\u0042\u0072\u0069\u0063\u006b";if _bdge ==nil {_dd .Log .Debug ("\u0064\u0069\u006c\u0061\u0074\u0065\u0042\u0072\u0069\u0063k\u0020\u0073\u006f\u0075\u0072\u0063\u0065 \u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
|
|
return nil ,_d .Error (_cfag ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");};if _cfae < 1||_aacc < 1{return nil ,_d .Error (_cfag ,"\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 _cfae ==1&&_aacc ==1{_bgbgd ,_adgae :=_faec (_dfcf ,_bdge );if _adgae !=nil {return nil ,_d .Wrap (_adgae ,_cfag ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u0026\u0026 \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
|
|
};return _bgbgd ,nil ;};if _cfae ==1||_aacc ==1{_bcee :=SelCreateBrick (_aacc ,_cfae ,_aacc /2,_cfae /2,SelHit );_adcb ,_geab :=_gfed (_dfcf ,_bdge ,_bcee );if _geab !=nil {return nil ,_d .Wrap (_geab ,_cfag ,"\u0068s\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
|
|
};return _adcb ,nil ;};_gdgf :=SelCreateBrick (1,_cfae ,0,_cfae /2,SelHit );_fbgf :=SelCreateBrick (_aacc ,1,_aacc /2,0,SelHit );_cgbc ,_afgc :=_gfed (nil ,_bdge ,_gdgf );if _afgc !=nil {return nil ,_d .Wrap (_afgc ,_cfag ,"\u0031\u0073\u0074\u0020\u0064\u0069\u006c\u0061\u0074\u0065");
|
|
|
|
};_dfcf ,_afgc =_gfed (_dfcf ,_cgbc ,_fbgf );if _afgc !=nil {return nil ,_d .Wrap (_afgc ,_cfag ,"\u0032\u006e\u0064\u0020\u0064\u0069\u006c\u0061\u0074\u0065");};return _dfcf ,nil ;};func TstWSymbol (t *_g .T ,scale ...int )*Bitmap {_cacg ,_egafe :=NewWithData (5,5,[]byte {0x88,0x88,0xA8,0xD8,0x88});
|
|
|
|
_df .NoError (t ,_egafe );return TstGetScaledSymbol (t ,_cacg ,scale ...);};func New (width ,height int )*Bitmap {_aafd :=_ccb (width ,height );_aafd .Data =make ([]byte ,height *_aafd .RowStride );return _aafd ;};func TstWordBitmapWithSpaces (t *_g .T ,scale ...int )*Bitmap {_cbbef :=1;
|
|
|
|
if len (scale )> 0{_cbbef =scale [0];};_gcfd :=3;_dbce :=9+7+15+2*_gcfd +2*_gcfd ;_cggc :=5+_gcfd +5+2*_gcfd ;_dedg :=New (_dbce *_cbbef ,_cggc *_cbbef );_dfaa :=&Bitmaps {};var _febc *int ;_gcfd *=_cbbef ;_afcd :=_gcfd ;_febc =&_afcd ;_ggfg :=_gcfd ;_bage :=TstDSymbol (t ,scale ...);
|
|
|
|
TstAddSymbol (t ,_dfaa ,_bage ,_febc ,_ggfg ,1*_cbbef );_bage =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_dfaa ,_bage ,_febc ,_ggfg ,_gcfd );_bage =TstISymbol (t ,scale ...);TstAddSymbol (t ,_dfaa ,_bage ,_febc ,_ggfg ,1*_cbbef );_bage =TstTSymbol (t ,scale ...);
|
|
|
|
TstAddSymbol (t ,_dfaa ,_bage ,_febc ,_ggfg ,_gcfd );_bage =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_dfaa ,_bage ,_febc ,_ggfg ,1*_cbbef );_bage =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_dfaa ,_bage ,_febc ,_ggfg ,1*_cbbef );_bage =TstWSymbol (t ,scale ...);
|
|
|
|
TstAddSymbol (t ,_dfaa ,_bage ,_febc ,_ggfg ,0);*_febc =_gcfd ;_ggfg =5*_cbbef +_gcfd ;_bage =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_dfaa ,_bage ,_febc ,_ggfg ,1*_cbbef );_bage =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_dfaa ,_bage ,_febc ,_ggfg ,_gcfd );
|
|
|
|
_bage =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_dfaa ,_bage ,_febc ,_ggfg ,1*_cbbef );_bage =TstESymbol (t ,scale ...);TstAddSymbol (t ,_dfaa ,_bage ,_febc ,_ggfg ,1*_cbbef );_bage =TstVSymbol (t ,scale ...);TstAddSymbol (t ,_dfaa ,_bage ,_febc ,_ggfg ,1*_cbbef );
|
|
|
|
_bage =TstESymbol (t ,scale ...);TstAddSymbol (t ,_dfaa ,_bage ,_febc ,_ggfg ,1*_cbbef );_bage =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_dfaa ,_bage ,_febc ,_ggfg ,0);TstWriteSymbols (t ,_dfaa ,_dedg );return _dedg ;};func _cfbd (_agad *Bitmap ,_dabe *_gc .Stack ,_aadf ,_baafa int )(_fbgdd *_dc .Rectangle ,_dacd error ){const _cdea ="\u0073e\u0065d\u0046\u0069\u006c\u006c\u0053\u0074\u0061\u0063\u006b\u0042\u0042";
|
|
|
|
if _agad ==nil {return nil ,_d .Error (_cdea ,"\u0070\u0072\u006fvi\u0064\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0073\u0027\u0020\u0042\u0069\u0074\u006d\u0061\u0070");};if _dabe ==nil {return nil ,_d .Error (_cdea ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0027\u0073\u0074ac\u006b\u0027");
|
|
|
|
};_fbeb ,_fbabb :=_agad .Width ,_agad .Height ;_abcbe :=_fbeb -1;_agcd :=_fbabb -1;if _aadf < 0||_aadf > _abcbe ||_baafa < 0||_baafa > _agcd ||!_agad .GetPixel (_aadf ,_baafa ){return nil ,nil ;};_gebef :=_dc .Rect (100000,100000,0,0);if _dacd =_edgd (_dabe ,_aadf ,_aadf ,_baafa ,1,_agcd ,&_gebef );
|
|
|
|
_dacd !=nil {return nil ,_d .Wrap (_dacd ,_cdea ,"\u0069\u006e\u0069t\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _dacd =_edgd (_dabe ,_aadf ,_aadf ,_baafa +1,-1,_agcd ,&_gebef );_dacd !=nil {return nil ,_d .Wrap (_dacd ,_cdea ,"\u0032\u006ed\u0020\u0069\u006ei\u0074\u0069\u0061\u006c\u0020\u0070\u0075\u0073\u0068");
|
|
|
|
};_gebef .Min .X ,_gebef .Max .X =_aadf ,_aadf ;_gebef .Min .Y ,_gebef .Max .Y =_baafa ,_baafa ;var (_cbcgb *fillSegment ;_ggda int ;);for _dabe .Len ()> 0{if _cbcgb ,_dacd =_bggaf (_dabe );_dacd !=nil {return nil ,_d .Wrap (_dacd ,_cdea ,"");};_baafa =_cbcgb ._bcea ;
|
|
|
|
for _aadf =_cbcgb ._fbdg -1;_aadf >=0&&_agad .GetPixel (_aadf ,_baafa );_aadf --{if _dacd =_agad .SetPixel (_aadf ,_baafa ,0);_dacd !=nil {return nil ,_d .Wrap (_dacd ,_cdea ,"\u0031s\u0074\u0020\u0073\u0065\u0074");};};if _aadf >=_cbcgb ._fbdg -1{for {for _aadf ++;
|
|
|
|
_aadf <=_cbcgb ._egdfd +1&&_aadf <=_abcbe &&!_agad .GetPixel (_aadf ,_baafa );_aadf ++{};_ggda =_aadf ;if !(_aadf <=_cbcgb ._egdfd +1&&_aadf <=_abcbe ){break ;};for ;_aadf <=_abcbe &&_agad .GetPixel (_aadf ,_baafa );_aadf ++{if _dacd =_agad .SetPixel (_aadf ,_baafa ,0);
|
|
|
|
_dacd !=nil {return nil ,_d .Wrap (_dacd ,_cdea ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _dacd =_edgd (_dabe ,_ggda ,_aadf -1,_cbcgb ._bcea ,_cbcgb ._dbgc ,_agcd ,&_gebef );_dacd !=nil {return nil ,_d .Wrap (_dacd ,_cdea ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");
|
|
|
|
};if _aadf > _cbcgb ._egdfd {if _dacd =_edgd (_dabe ,_cbcgb ._egdfd +1,_aadf -1,_cbcgb ._bcea ,-_cbcgb ._dbgc ,_agcd ,&_gebef );_dacd !=nil {return nil ,_d .Wrap (_dacd ,_cdea ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");
|
|
|
|
};};};continue ;};_ggda =_aadf +1;if _ggda < _cbcgb ._fbdg {if _dacd =_edgd (_dabe ,_ggda ,_cbcgb ._fbdg -1,_cbcgb ._bcea ,-_cbcgb ._dbgc ,_agcd ,&_gebef );_dacd !=nil {return nil ,_d .Wrap (_dacd ,_cdea ,"\u006c\u0065\u0061\u006b\u0020\u006f\u006e\u0020\u006c\u0065\u0066\u0074 \u0073\u0069\u0064\u0065");
|
|
|
|
};};_aadf =_cbcgb ._fbdg ;for {for ;_aadf <=_abcbe &&_agad .GetPixel (_aadf ,_baafa );_aadf ++{if _dacd =_agad .SetPixel (_aadf ,_baafa ,0);_dacd !=nil {return nil ,_d .Wrap (_dacd ,_cdea ,"\u0032n\u0064\u0020\u0073\u0065\u0074");};};if _dacd =_edgd (_dabe ,_ggda ,_aadf -1,_cbcgb ._bcea ,_cbcgb ._dbgc ,_agcd ,&_gebef );
|
|
|
|
_dacd !=nil {return nil ,_d .Wrap (_dacd ,_cdea ,"n\u006f\u0072\u006d\u0061\u006c\u0020\u0070\u0075\u0073\u0068");};if _aadf > _cbcgb ._egdfd {if _dacd =_edgd (_dabe ,_cbcgb ._egdfd +1,_aadf -1,_cbcgb ._bcea ,-_cbcgb ._dbgc ,_agcd ,&_gebef );_dacd !=nil {return nil ,_d .Wrap (_dacd ,_cdea ,"\u006ce\u0061k\u0020\u006f\u006e\u0020\u0072i\u0067\u0068t\u0020\u0073\u0069\u0064\u0065");
|
|
|
|
};};for _aadf ++;_aadf <=_cbcgb ._egdfd +1&&_aadf <=_abcbe &&!_agad .GetPixel (_aadf ,_baafa );_aadf ++{};_ggda =_aadf ;if !(_aadf <=_cbcgb ._egdfd +1&&_aadf <=_abcbe ){break ;};};};_gebef .Max .X ++;_gebef .Max .Y ++;return &_gebef ,nil ;};func (_gff *Bitmap )ThresholdPixelSum (thresh int ,tab8 []int )(_afd bool ,_cdf error ){const _egg ="\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 =_fgef ();};_aee :=_gff .Width >>3;_ffd :=_gff .Width &7;_cffc :=byte (0xff<<uint (8-_ffd ));var (_cbf ,_bebg ,_bbba ,_cfdf int ;_bcfd byte ;);for _cbf =0;_cbf < _gff .Height ;_cbf ++{_bbba =_gff .RowStride *_cbf ;for _bebg =0;_bebg < _aee ;
|
|
|
|
_bebg ++{_bcfd ,_cdf =_gff .GetByte (_bbba +_bebg );if _cdf !=nil {return false ,_d .Wrap (_cdf ,_egg ,"\u0066\u0075\u006c\u006c\u0042\u0079\u0074\u0065");};_cfdf +=tab8 [_bcfd ];};if _ffd !=0{_bcfd ,_cdf =_gff .GetByte (_bbba +_bebg );if _cdf !=nil {return false ,_d .Wrap (_cdf ,_egg ,"p\u0061\u0072\u0074\u0069\u0061\u006c\u0042\u0079\u0074\u0065");
|
|
|
|
};_bcfd &=_cffc ;_cfdf +=tab8 [_bcfd ];};if _cfdf > thresh {return true ,nil ;};};return _afd ,nil ;};func (_bccb *Bitmaps )CountPixels ()*_gc .NumSlice {_dcdac :=&_gc .NumSlice {};for _ ,_eecf :=range _bccb .Values {_dcdac .AddInt (_eecf .CountPixels ());
|
|
|
|
};return _dcdac ;};func (_cca *Bitmap )And (s *Bitmap )(_afaa *Bitmap ,_eee error ){const _gbe ="\u0042\u0069\u0074\u006d\u0061\u0070\u002e\u0041\u006e\u0064";if _cca ==nil {return nil ,_d .Error (_gbe ,"\u0027b\u0069t\u006d\u0061\u0070\u0020\u0027b\u0027\u0020i\u0073\u0020\u006e\u0069\u006c");
|
|
|
|
};if s ==nil {return nil ,_d .Error (_gbe ,"\u0062\u0069\u0074\u006d\u0061\u0070\u0020\u0027\u0073\u0027\u0020\u0069s\u0020\u006e\u0069\u006c");};if !_cca .SizesEqual (s ){_dd .Log .Debug ("\u0025\u0073\u0020-\u0020\u0042\u0069\u0074\u006d\u0061\u0070\u0020\u0027\u0073\u0027\u0020\u0069\u0073\u0020\u006e\u006f\u0074\u0020\u0065\u0071\u0075\u0061\u006c\u0020\u0073\u0069\u007a\u0065 \u0077\u0069\u0074\u0068\u0020\u0027\u0062\u0027",_gbe );
|
|
|
|
};if _afaa ,_eee =_faec (_afaa ,_cca );_eee !=nil {return nil ,_d .Wrap (_eee ,_gbe ,"\u0063\u0061\u006e't\u0020\u0063\u0072\u0065\u0061\u0074\u0065\u0020\u0027\u0064\u0027\u0020\u0062\u0069\u0074\u006d\u0061\u0070");};if _eee =_afaa .RasterOperation (0,0,_afaa .Width ,_afaa .Height ,PixSrcAndDst ,s ,0,0);
|
|
|
|
_eee !=nil {return nil ,_d .Wrap (_eee ,_gbe ,"");};return _afaa ,nil ;};func _dbfg (_fgfe ,_bece *Bitmap ,_eaf ,_bgdea ,_bdcb ,_eced ,_ggeb ,_ead ,_ebdb ,_dcec int ,_gegf CombinationOperator )error {var _afaab int ;_baag :=func (){_afaab ++;_bdcb +=_bece .RowStride ;
|
|
|
|
_eced +=_fgfe .RowStride ;_ggeb +=_fgfe .RowStride };for _afaab =_eaf ;_afaab < _bgdea ;_baag (){var _aaeg uint16 ;_eae :=_bdcb ;for _ccdf :=_eced ;_ccdf <=_ggeb ;_ccdf ++{_cgegb ,_fffd :=_bece .GetByte (_eae );if _fffd !=nil {return _fffd ;};_bcfc ,_fffd :=_fgfe .GetByte (_ccdf );
|
|
|
|
if _fffd !=nil {return _fffd ;};_aaeg =(_aaeg |uint16 (_bcfc ))<<uint (_dcec );_bcfc =byte (_aaeg >>8);if _ccdf ==_ggeb {_bcfc =_efea (uint (_ead ),_bcfc );};if _fffd =_bece .SetByte (_eae ,_dbae (_cgegb ,_bcfc ,_gegf ));_fffd !=nil {return _fffd ;};_eae ++;
|
|
|
|
_aaeg <<=uint (_ebdb );};};return nil ;};func (_gfbg *Bitmaps )GroupByHeight ()(*BitmapsArray ,error ){const _ecgf ="\u0047\u0072\u006f\u0075\u0070\u0042\u0079\u0048\u0065\u0069\u0067\u0068\u0074";if len (_gfbg .Values )==0{return nil ,_d .Error (_ecgf ,"\u006eo\u0020v\u0061\u006c\u0075\u0065\u0073 \u0070\u0072o\u0076\u0069\u0064\u0065\u0064");
|
|
|
|
};_fgga :=&BitmapsArray {};_gfbg .SortByHeight ();_beegb :=-1;_geca :=-1;for _befbb :=0;_befbb < len (_gfbg .Values );_befbb ++{_cgfeb :=_gfbg .Values [_befbb ].Height ;if _cgfeb > _beegb {_beegb =_cgfeb ;_geca ++;_fgga .Values =append (_fgga .Values ,&Bitmaps {});
|
|
|
|
};_fgga .Values [_geca ].AddBitmap (_gfbg .Values [_befbb ]);};return _fgga ,nil ;};func (_gdbab *Boxes )Add (box *_dc .Rectangle )error {if _gdbab ==nil {return _d .Error ("\u0042o\u0078\u0065\u0073\u002e\u0041\u0064d","\u0027\u0042\u006f\u0078es\u0027\u0020\u006e\u006f\u0074\u0020\u0064\u0065\u0066\u0069\u006e\u0065\u0064");
|
|
|
|
};*_gdbab =append (*_gdbab ,box );return nil ;};func Copy (d ,s *Bitmap )(*Bitmap ,error ){return _faec (d ,s )};func (_gdf *Bitmap )GetChocolateData ()[]byte {if _gdf .Color ==Vanilla {_gdf .inverseData ();};return _gdf .Data ;};func TstImageBitmapInverseData ()[]byte {_dbgca :=_cafd .Copy ();
|
|
|
|
_dbgca .InverseData ();return _dbgca .Data ;};type BitmapsArray struct{Values []*Bitmaps ;Boxes []*_dc .Rectangle ;};func (_def *Bitmap )GetBitOffset (x int )int {return x &0x07};func (_gac *Bitmap )setEightBytes (_cec int ,_dfbc uint64 )error {_edga :=_gac .RowStride -(_cec %_gac .RowStride );
|
|
|
|
if _gac .RowStride !=_gac .Width >>3{_edga --;};if _edga >=8{return _gac .setEightFullBytes (_cec ,_dfbc );};return _gac .setEightPartlyBytes (_cec ,_edga ,_dfbc );};func _ffg (_fabg ,_eedb *Bitmap ,_cefcd CombinationOperator )*Bitmap {_cae :=New (_fabg .Width ,_fabg .Height );
|
|
|
|
for _gbc :=0;_gbc < len (_cae .Data );_gbc ++{_cae .Data [_gbc ]=_dbae (_fabg .Data [_gbc ],_eedb .Data [_gbc ],_cefcd );};return _cae ;};func _cab (_bce *Bitmap ,_adg ,_bac int )(*Bitmap ,error ){const _daa ="e\u0078\u0070\u0061\u006edB\u0069n\u0061\u0072\u0079\u0052\u0065p\u006c\u0069\u0063\u0061\u0074\u0065";
|
|
|
|
if _bce ==nil {return nil ,_d .Error (_daa ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _adg <=0||_bac <=0{return nil ,_d .Error (_daa ,"\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 _adg ==_bac {if _adg ==1{_ed ,_fae :=_faec (nil ,_bce );if _fae !=nil {return nil ,_d .Wrap (_fae ,_daa ,"\u0078\u0046\u0061\u0063\u0074\u0020\u003d\u003d\u0020y\u0046\u0061\u0063\u0074");};return _ed ,nil ;};if _adg ==2||_adg ==4||_adg ==8{_gg ,_deeb :=_afae (_bce ,_adg );
|
|
|
|
if _deeb !=nil {return nil ,_d .Wrap (_deeb ,_daa ,"\u0078\u0046a\u0063\u0074\u0020i\u006e\u0020\u007b\u0032\u002c\u0034\u002c\u0038\u007d");};return _gg ,nil ;};};_gaf :=_adg *_bce .Width ;_bba :=_bac *_bce .Height ;_ged :=New (_gaf ,_bba );_gecd :=_ged .RowStride ;
|
|
|
|
var (_cgf ,_fcc ,_fgd ,_ddgd ,_bfb int ;_gf byte ;_fga error ;);for _fcc =0;_fcc < _bce .Height ;_fcc ++{_cgf =_bac *_fcc *_gecd ;for _fgd =0;_fgd < _bce .Width ;_fgd ++{if _ccc :=_bce .GetPixel (_fgd ,_fcc );_ccc {_bfb =_adg *_fgd ;for _ddgd =0;_ddgd < _adg ;
|
|
|
|
_ddgd ++{_ged .setBit (_cgf *8+_bfb +_ddgd );};};};for _ddgd =1;_ddgd < _bac ;_ddgd ++{_baa :=_cgf +_ddgd *_gecd ;for _faf :=0;_faf < _gecd ;_faf ++{if _gf ,_fga =_ged .GetByte (_cgf +_faf );_fga !=nil {return nil ,_d .Wrapf (_fga ,_daa ,"\u0072\u0065\u0070\u006cic\u0061\u0074\u0069\u006e\u0067\u0020\u006c\u0069\u006e\u0065\u003a\u0020\u0027\u0025d\u0027",_ddgd );
|
|
|
|
};if _fga =_ged .SetByte (_baa +_faf ,_gf );_fga !=nil {return nil ,_d .Wrap (_fga ,_daa ,"\u0053\u0065\u0074\u0074in\u0067\u0020\u0062\u0079\u0074\u0065\u0020\u0066\u0061\u0069\u006c\u0065\u0064");};};};};return _ged ,nil ;};func _afae (_ce *Bitmap ,_dfa int )(*Bitmap ,error ){const _gcc ="\u0065x\u0070a\u006e\u0064\u0042\u0069\u006ea\u0072\u0079P\u006f\u0077\u0065\u0072\u0032";
|
|
|
|
if _ce ==nil {return nil ,_d .Error (_gcc ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};if _dfa ==1{return _faec (nil ,_ce );};if _dfa !=2&&_dfa !=4&&_dfa !=8{return nil ,_d .Error (_gcc ,"\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");
|
|
|
|
};_deb :=_dfa *_ce .Width ;_da :=_dfa *_ce .Height ;_gad :=New (_deb ,_da );var _cc error ;switch _dfa {case 2:_cc =_ac (_gad ,_ce );case 4:_cc =_gb (_gad ,_ce );case 8:_cc =_agg (_gad ,_ce );};if _cc !=nil {return nil ,_d .Wrap (_cc ,_gcc ,"");};return _gad ,nil ;
|
|
|
|
};func (_aege *Bitmap )ToImage ()_dc .Image {_bae ,_bfeb :=_dg .NewImage (_aege .Width ,_aege .Height ,1,1,_aege .Data ,nil ,nil );if _bfeb !=nil {_dd .Log .Error ("\u0043\u006f\u006e\u0076\u0065\u0072\u0074\u0069\u006e\u0067\u0020j\u0062\u0069\u0067\u0032\u002e\u0042\u0069\u0074m\u0061p\u0020\u0074\u006f\u0020\u0069\u006d\u0061\u0067\u0065\u0075\u0074\u0069\u006c\u002e\u0049\u006d\u0061\u0067e\u0020\u0066\u0061\u0069\u006c\u0065\u0064\u003a\u0020\u0025\u0076",_bfeb );
|
|
|
|
};return _bae ;};const (MopDilation MorphOperation =iota ;MopErosion ;MopOpening ;MopClosing ;MopRankBinaryReduction ;MopReplicativeBinaryExpansion ;MopAddBorder ;);func (_beed *ClassedPoints )SortByY (){_beed ._fffdc =_beed .ySortFunction ();_ge .Sort (_beed )};
|
|
|
|
func (_bffdg Points )GetIntY (i int )(int ,error ){if i >=len (_bffdg ){return 0,_d .Errorf ("\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0065t\u0049\u006e\u0074\u0059","\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
|
|
};return int (_bffdg [i ].Y ),nil ;};func (_cdef *Bitmap )InverseData (){_cdef .inverseData ()};type Points []Point ;func TstOSymbol (t *_g .T ,scale ...int )*Bitmap {_eacbe ,_gegde :=NewWithData (4,5,[]byte {0xF0,0x90,0x90,0x90,0xF0});_df .NoError (t ,_gegde );
|
|
|
|
return TstGetScaledSymbol (t ,_eacbe ,scale ...);};func MakePixelSumTab8 ()[]int {return _fgef ()};func (_dbcad *BitmapsArray )AddBitmaps (bm *Bitmaps ){_dbcad .Values =append (_dbcad .Values ,bm )};func (_baaad *BitmapsArray )GetBox (i int )(*_dc .Rectangle ,error ){const _eabec ="\u0042\u0069\u0074\u006dap\u0073\u0041\u0072\u0072\u0061\u0079\u002e\u0047\u0065\u0074\u0042\u006f\u0078";
|
|
|
|
if _baaad ==nil {return nil ,_d .Error (_eabec ,"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 (_baaad .Boxes )-1{return nil ,_d .Errorf (_eabec ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );
|
|
|
|
};return _baaad .Boxes [i ],nil ;};func TstRSymbol (t *_g .T ,scale ...int )*Bitmap {_gafcd ,_bfde :=NewWithData (4,5,[]byte {0xF0,0x90,0xF0,0xA0,0x90});_df .NoError (t ,_bfde );return TstGetScaledSymbol (t ,_gafcd ,scale ...);};func (_begb *Bitmap )nextOnPixel (_fgcd ,_cbeg int )(_bfab _dc .Point ,_cabd bool ,_ccag error ){const _ebfg ="n\u0065\u0078\u0074\u004f\u006e\u0050\u0069\u0078\u0065\u006c";
|
|
|
|
_bfab ,_cabd ,_ccag =_begb .nextOnPixelLow (_begb .Width ,_begb .Height ,_begb .RowStride ,_fgcd ,_cbeg );if _ccag !=nil {return _bfab ,false ,_d .Wrap (_ccag ,_ebfg ,"");};return _bfab ,_cabd ,nil ;};func _eebc (_cfbee *Bitmap ,_egaa ,_gcgd ,_feebb ,_cfecbc int ,_cbg RasterOperator ,_fabgb *Bitmap ,_cfefb ,_adcf int )error {const _aeeb ="\u0072a\u0073t\u0065\u0072\u004f\u0070\u0065\u0072\u0061\u0074\u0069\u006f\u006e";
|
|
|
|
if _cfbee ==nil {return _d .Error (_aeeb ,"\u006e\u0069\u006c\u0020\u0027\u0064\u0065\u0073\u0074\u0027\u0020\u0042i\u0074\u006d\u0061\u0070");};if _cbg ==PixDst {return nil ;};switch _cbg {case PixClr ,PixSet ,PixNotDst :_dfaf (_cfbee ,_egaa ,_gcgd ,_feebb ,_cfecbc ,_cbg );
|
|
|
|
return nil ;};if _fabgb ==nil {_dd .Log .Debug ("\u0052a\u0073\u0074e\u0072\u004f\u0070\u0065r\u0061\u0074\u0069o\u006e\u0020\u0073\u006f\u0075\u0072\u0063\u0065\u0020bi\u0074\u006d\u0061p\u0020\u0069s\u0020\u006e\u006f\u0074\u0020\u0064e\u0066\u0069n\u0065\u0064");
|
|
|
|
return _d .Error (_aeeb ,"\u006e\u0069l\u0020\u0027\u0073r\u0063\u0027\u0020\u0062\u0069\u0074\u006d\u0061\u0070");};if _gcca :=_gbfb (_cfbee ,_egaa ,_gcgd ,_feebb ,_cfecbc ,_cbg ,_fabgb ,_cfefb ,_adcf );_gcca !=nil {return _d .Wrap (_gcca ,_aeeb ,"");
|
|
|
|
};return nil ;};type Getter interface{GetBitmap ()*Bitmap ;};func (_edaef *byWidth )Less (i ,j int )bool {return _edaef .Values [i ].Width < _edaef .Values [j ].Width };const (_ SizeSelection =iota ;SizeSelectByWidth ;SizeSelectByHeight ;SizeSelectByMaxDimension ;
|
|
|
|
SizeSelectByArea ;SizeSelectByPerimeter ;);func (_bfdf *Bitmaps )HeightSorter ()func (_cceed ,_fccc int )bool {return func (_aebg ,_aacf int )bool {_babef :=_bfdf .Values [_aebg ].Height < _bfdf .Values [_aacf ].Height ;_dd .Log .Debug ("H\u0065i\u0067\u0068\u0074\u003a\u0020\u0025\u0076\u0020<\u0020\u0025\u0076\u0020= \u0025\u0076",_bfdf .Values [_aebg ].Height ,_bfdf .Values [_aacf ].Height ,_babef );
|
|
|
|
return _babef ;};};func _daafa (_ddcff *Bitmap ,_efa ,_ceda ,_geaa ,_eegf int ,_gadc RasterOperator ,_fbab *Bitmap ,_fagf ,_aaed int )error {var (_cdgfe bool ;_gfgd bool ;_effa byte ;_afad int ;_fcdb int ;_ggfd int ;_ccfg int ;_fecd bool ;_eaba int ;_fgaa int ;
|
|
|
|
_dbaef int ;_bbc bool ;_gfbd byte ;_acdbd int ;_bcff int ;_cgde int ;_dggf byte ;_bfaf int ;_ecebb int ;_cdba uint ;_fgdfc uint ;_ecea byte ;_gaacc shift ;_dgfd bool ;_egdea bool ;_cebb ,_gdbc int ;);if _fagf &7!=0{_ecebb =8-(_fagf &7);};if _efa &7!=0{_fcdb =8-(_efa &7);
|
|
|
|
};if _ecebb ==0&&_fcdb ==0{_ecea =_afcg [0];}else {if _fcdb > _ecebb {_cdba =uint (_fcdb -_ecebb );}else {_cdba =uint (8-(_ecebb -_fcdb ));};_fgdfc =8-_cdba ;_ecea =_afcg [_cdba ];};if (_efa &7)!=0{_cdgfe =true ;_afad =8-(_efa &7);_effa =_afcg [_afad ];
|
|
|
|
_ggfd =_ddcff .RowStride *_ceda +(_efa >>3);_ccfg =_fbab .RowStride *_aaed +(_fagf >>3);_bfaf =8-(_fagf &7);if _afad > _bfaf {_gaacc =_acbc ;if _geaa >=_ecebb {_dgfd =true ;};}else {_gaacc =_dcfc ;};};if _geaa < _afad {_gfgd =true ;_effa &=_gbcf [8-_afad +_geaa ];
|
|
|
|
};if !_gfgd {_eaba =(_geaa -_afad )>>3;if _eaba !=0{_fecd =true ;_fgaa =_ddcff .RowStride *_ceda +((_efa +_fcdb )>>3);_dbaef =_fbab .RowStride *_aaed +((_fagf +_fcdb )>>3);};};_acdbd =(_efa +_geaa )&7;if !(_gfgd ||_acdbd ==0){_bbc =true ;_gfbd =_gbcf [_acdbd ];
|
|
|
|
_bcff =_ddcff .RowStride *_ceda +((_efa +_fcdb )>>3)+_eaba ;_cgde =_fbab .RowStride *_aaed +((_fagf +_fcdb )>>3)+_eaba ;if _acdbd > int (_fgdfc ){_egdea =true ;};};switch _gadc {case PixSrc :if _cdgfe {for _cebb =0;_cebb < _eegf ;_cebb ++{if _gaacc ==_acbc {_dggf =_fbab .Data [_ccfg ]<<_cdba ;
|
|
|
|
if _dgfd {_dggf =_ggad (_dggf ,_fbab .Data [_ccfg +1]>>_fgdfc ,_ecea );};}else {_dggf =_fbab .Data [_ccfg ]>>_fgdfc ;};_ddcff .Data [_ggfd ]=_ggad (_ddcff .Data [_ggfd ],_dggf ,_effa );_ggfd +=_ddcff .RowStride ;_ccfg +=_fbab .RowStride ;};};if _fecd {for _cebb =0;
|
|
|
|
_cebb < _eegf ;_cebb ++{for _gdbc =0;_gdbc < _eaba ;_gdbc ++{_dggf =_ggad (_fbab .Data [_dbaef +_gdbc ]<<_cdba ,_fbab .Data [_dbaef +_gdbc +1]>>_fgdfc ,_ecea );_ddcff .Data [_fgaa +_gdbc ]=_dggf ;};_fgaa +=_ddcff .RowStride ;_dbaef +=_fbab .RowStride ;
|
|
|
|
};};if _bbc {for _cebb =0;_cebb < _eegf ;_cebb ++{_dggf =_fbab .Data [_cgde ]<<_cdba ;if _egdea {_dggf =_ggad (_dggf ,_fbab .Data [_cgde +1]>>_fgdfc ,_ecea );};_ddcff .Data [_bcff ]=_ggad (_ddcff .Data [_bcff ],_dggf ,_gfbd );_bcff +=_ddcff .RowStride ;
|
|
|
|
_cgde +=_fbab .RowStride ;};};case PixNotSrc :if _cdgfe {for _cebb =0;_cebb < _eegf ;_cebb ++{if _gaacc ==_acbc {_dggf =_fbab .Data [_ccfg ]<<_cdba ;if _dgfd {_dggf =_ggad (_dggf ,_fbab .Data [_ccfg +1]>>_fgdfc ,_ecea );};}else {_dggf =_fbab .Data [_ccfg ]>>_fgdfc ;
|
|
|
|
};_ddcff .Data [_ggfd ]=_ggad (_ddcff .Data [_ggfd ],^_dggf ,_effa );_ggfd +=_ddcff .RowStride ;_ccfg +=_fbab .RowStride ;};};if _fecd {for _cebb =0;_cebb < _eegf ;_cebb ++{for _gdbc =0;_gdbc < _eaba ;_gdbc ++{_dggf =_ggad (_fbab .Data [_dbaef +_gdbc ]<<_cdba ,_fbab .Data [_dbaef +_gdbc +1]>>_fgdfc ,_ecea );
|
|
|
|
_ddcff .Data [_fgaa +_gdbc ]=^_dggf ;};_fgaa +=_ddcff .RowStride ;_dbaef +=_fbab .RowStride ;};};if _bbc {for _cebb =0;_cebb < _eegf ;_cebb ++{_dggf =_fbab .Data [_cgde ]<<_cdba ;if _egdea {_dggf =_ggad (_dggf ,_fbab .Data [_cgde +1]>>_fgdfc ,_ecea );};
|
|
|
|
_ddcff .Data [_bcff ]=_ggad (_ddcff .Data [_bcff ],^_dggf ,_gfbd );_bcff +=_ddcff .RowStride ;_cgde +=_fbab .RowStride ;};};case PixSrcOrDst :if _cdgfe {for _cebb =0;_cebb < _eegf ;_cebb ++{if _gaacc ==_acbc {_dggf =_fbab .Data [_ccfg ]<<_cdba ;if _dgfd {_dggf =_ggad (_dggf ,_fbab .Data [_ccfg +1]>>_fgdfc ,_ecea );
|
|
|
|
};}else {_dggf =_fbab .Data [_ccfg ]>>_fgdfc ;};_ddcff .Data [_ggfd ]=_ggad (_ddcff .Data [_ggfd ],_dggf |_ddcff .Data [_ggfd ],_effa );_ggfd +=_ddcff .RowStride ;_ccfg +=_fbab .RowStride ;};};if _fecd {for _cebb =0;_cebb < _eegf ;_cebb ++{for _gdbc =0;
|
|
|
|
_gdbc < _eaba ;_gdbc ++{_dggf =_ggad (_fbab .Data [_dbaef +_gdbc ]<<_cdba ,_fbab .Data [_dbaef +_gdbc +1]>>_fgdfc ,_ecea );_ddcff .Data [_fgaa +_gdbc ]|=_dggf ;};_fgaa +=_ddcff .RowStride ;_dbaef +=_fbab .RowStride ;};};if _bbc {for _cebb =0;_cebb < _eegf ;
|
|
|
|
_cebb ++{_dggf =_fbab .Data [_cgde ]<<_cdba ;if _egdea {_dggf =_ggad (_dggf ,_fbab .Data [_cgde +1]>>_fgdfc ,_ecea );};_ddcff .Data [_bcff ]=_ggad (_ddcff .Data [_bcff ],_dggf |_ddcff .Data [_bcff ],_gfbd );_bcff +=_ddcff .RowStride ;_cgde +=_fbab .RowStride ;
|
|
|
|
};};case PixSrcAndDst :if _cdgfe {for _cebb =0;_cebb < _eegf ;_cebb ++{if _gaacc ==_acbc {_dggf =_fbab .Data [_ccfg ]<<_cdba ;if _dgfd {_dggf =_ggad (_dggf ,_fbab .Data [_ccfg +1]>>_fgdfc ,_ecea );};}else {_dggf =_fbab .Data [_ccfg ]>>_fgdfc ;};_ddcff .Data [_ggfd ]=_ggad (_ddcff .Data [_ggfd ],_dggf &_ddcff .Data [_ggfd ],_effa );
|
|
|
|
_ggfd +=_ddcff .RowStride ;_ccfg +=_fbab .RowStride ;};};if _fecd {for _cebb =0;_cebb < _eegf ;_cebb ++{for _gdbc =0;_gdbc < _eaba ;_gdbc ++{_dggf =_ggad (_fbab .Data [_dbaef +_gdbc ]<<_cdba ,_fbab .Data [_dbaef +_gdbc +1]>>_fgdfc ,_ecea );_ddcff .Data [_fgaa +_gdbc ]&=_dggf ;
|
|
|
|
};_fgaa +=_ddcff .RowStride ;_dbaef +=_fbab .RowStride ;};};if _bbc {for _cebb =0;_cebb < _eegf ;_cebb ++{_dggf =_fbab .Data [_cgde ]<<_cdba ;if _egdea {_dggf =_ggad (_dggf ,_fbab .Data [_cgde +1]>>_fgdfc ,_ecea );};_ddcff .Data [_bcff ]=_ggad (_ddcff .Data [_bcff ],_dggf &_ddcff .Data [_bcff ],_gfbd );
|
|
|
|
_bcff +=_ddcff .RowStride ;_cgde +=_fbab .RowStride ;};};case PixSrcXorDst :if _cdgfe {for _cebb =0;_cebb < _eegf ;_cebb ++{if _gaacc ==_acbc {_dggf =_fbab .Data [_ccfg ]<<_cdba ;if _dgfd {_dggf =_ggad (_dggf ,_fbab .Data [_ccfg +1]>>_fgdfc ,_ecea );};
|
|
|
|
}else {_dggf =_fbab .Data [_ccfg ]>>_fgdfc ;};_ddcff .Data [_ggfd ]=_ggad (_ddcff .Data [_ggfd ],_dggf ^_ddcff .Data [_ggfd ],_effa );_ggfd +=_ddcff .RowStride ;_ccfg +=_fbab .RowStride ;};};if _fecd {for _cebb =0;_cebb < _eegf ;_cebb ++{for _gdbc =0;_gdbc < _eaba ;
|
|
|
|
_gdbc ++{_dggf =_ggad (_fbab .Data [_dbaef +_gdbc ]<<_cdba ,_fbab .Data [_dbaef +_gdbc +1]>>_fgdfc ,_ecea );_ddcff .Data [_fgaa +_gdbc ]^=_dggf ;};_fgaa +=_ddcff .RowStride ;_dbaef +=_fbab .RowStride ;};};if _bbc {for _cebb =0;_cebb < _eegf ;_cebb ++{_dggf =_fbab .Data [_cgde ]<<_cdba ;
|
|
|
|
if _egdea {_dggf =_ggad (_dggf ,_fbab .Data [_cgde +1]>>_fgdfc ,_ecea );};_ddcff .Data [_bcff ]=_ggad (_ddcff .Data [_bcff ],_dggf ^_ddcff .Data [_bcff ],_gfbd );_bcff +=_ddcff .RowStride ;_cgde +=_fbab .RowStride ;};};case PixNotSrcOrDst :if _cdgfe {for _cebb =0;
|
|
|
|
_cebb < _eegf ;_cebb ++{if _gaacc ==_acbc {_dggf =_fbab .Data [_ccfg ]<<_cdba ;if _dgfd {_dggf =_ggad (_dggf ,_fbab .Data [_ccfg +1]>>_fgdfc ,_ecea );};}else {_dggf =_fbab .Data [_ccfg ]>>_fgdfc ;};_ddcff .Data [_ggfd ]=_ggad (_ddcff .Data [_ggfd ],^_dggf |_ddcff .Data [_ggfd ],_effa );
|
|
|
|
_ggfd +=_ddcff .RowStride ;_ccfg +=_fbab .RowStride ;};};if _fecd {for _cebb =0;_cebb < _eegf ;_cebb ++{for _gdbc =0;_gdbc < _eaba ;_gdbc ++{_dggf =_ggad (_fbab .Data [_dbaef +_gdbc ]<<_cdba ,_fbab .Data [_dbaef +_gdbc +1]>>_fgdfc ,_ecea );_ddcff .Data [_fgaa +_gdbc ]|=^_dggf ;
|
|
|
|
};_fgaa +=_ddcff .RowStride ;_dbaef +=_fbab .RowStride ;};};if _bbc {for _cebb =0;_cebb < _eegf ;_cebb ++{_dggf =_fbab .Data [_cgde ]<<_cdba ;if _egdea {_dggf =_ggad (_dggf ,_fbab .Data [_cgde +1]>>_fgdfc ,_ecea );};_ddcff .Data [_bcff ]=_ggad (_ddcff .Data [_bcff ],^_dggf |_ddcff .Data [_bcff ],_gfbd );
|
|
|
|
_bcff +=_ddcff .RowStride ;_cgde +=_fbab .RowStride ;};};case PixNotSrcAndDst :if _cdgfe {for _cebb =0;_cebb < _eegf ;_cebb ++{if _gaacc ==_acbc {_dggf =_fbab .Data [_ccfg ]<<_cdba ;if _dgfd {_dggf =_ggad (_dggf ,_fbab .Data [_ccfg +1]>>_fgdfc ,_ecea );
|
|
|
|
};}else {_dggf =_fbab .Data [_ccfg ]>>_fgdfc ;};_ddcff .Data [_ggfd ]=_ggad (_ddcff .Data [_ggfd ],^_dggf &_ddcff .Data [_ggfd ],_effa );_ggfd +=_ddcff .RowStride ;_ccfg +=_fbab .RowStride ;};};if _fecd {for _cebb =0;_cebb < _eegf ;_cebb ++{for _gdbc =0;
|
|
|
|
_gdbc < _eaba ;_gdbc ++{_dggf =_ggad (_fbab .Data [_dbaef +_gdbc ]<<_cdba ,_fbab .Data [_dbaef +_gdbc +1]>>_fgdfc ,_ecea );_ddcff .Data [_fgaa +_gdbc ]&=^_dggf ;};_fgaa +=_ddcff .RowStride ;_dbaef +=_fbab .RowStride ;};};if _bbc {for _cebb =0;_cebb < _eegf ;
|
|
|
|
_cebb ++{_dggf =_fbab .Data [_cgde ]<<_cdba ;if _egdea {_dggf =_ggad (_dggf ,_fbab .Data [_cgde +1]>>_fgdfc ,_ecea );};_ddcff .Data [_bcff ]=_ggad (_ddcff .Data [_bcff ],^_dggf &_ddcff .Data [_bcff ],_gfbd );_bcff +=_ddcff .RowStride ;_cgde +=_fbab .RowStride ;
|
|
|
|
};};case PixSrcOrNotDst :if _cdgfe {for _cebb =0;_cebb < _eegf ;_cebb ++{if _gaacc ==_acbc {_dggf =_fbab .Data [_ccfg ]<<_cdba ;if _dgfd {_dggf =_ggad (_dggf ,_fbab .Data [_ccfg +1]>>_fgdfc ,_ecea );};}else {_dggf =_fbab .Data [_ccfg ]>>_fgdfc ;};_ddcff .Data [_ggfd ]=_ggad (_ddcff .Data [_ggfd ],_dggf |^_ddcff .Data [_ggfd ],_effa );
|
|
|
|
_ggfd +=_ddcff .RowStride ;_ccfg +=_fbab .RowStride ;};};if _fecd {for _cebb =0;_cebb < _eegf ;_cebb ++{for _gdbc =0;_gdbc < _eaba ;_gdbc ++{_dggf =_ggad (_fbab .Data [_dbaef +_gdbc ]<<_cdba ,_fbab .Data [_dbaef +_gdbc +1]>>_fgdfc ,_ecea );_ddcff .Data [_fgaa +_gdbc ]=_dggf |^_ddcff .Data [_fgaa +_gdbc ];
|
|
|
|
};_fgaa +=_ddcff .RowStride ;_dbaef +=_fbab .RowStride ;};};if _bbc {for _cebb =0;_cebb < _eegf ;_cebb ++{_dggf =_fbab .Data [_cgde ]<<_cdba ;if _egdea {_dggf =_ggad (_dggf ,_fbab .Data [_cgde +1]>>_fgdfc ,_ecea );};_ddcff .Data [_bcff ]=_ggad (_ddcff .Data [_bcff ],_dggf |^_ddcff .Data [_bcff ],_gfbd );
|
|
|
|
_bcff +=_ddcff .RowStride ;_cgde +=_fbab .RowStride ;};};case PixSrcAndNotDst :if _cdgfe {for _cebb =0;_cebb < _eegf ;_cebb ++{if _gaacc ==_acbc {_dggf =_fbab .Data [_ccfg ]<<_cdba ;if _dgfd {_dggf =_ggad (_dggf ,_fbab .Data [_ccfg +1]>>_fgdfc ,_ecea );
|
|
|
|
};}else {_dggf =_fbab .Data [_ccfg ]>>_fgdfc ;};_ddcff .Data [_ggfd ]=_ggad (_ddcff .Data [_ggfd ],_dggf &^_ddcff .Data [_ggfd ],_effa );_ggfd +=_ddcff .RowStride ;_ccfg +=_fbab .RowStride ;};};if _fecd {for _cebb =0;_cebb < _eegf ;_cebb ++{for _gdbc =0;
|
|
|
|
_gdbc < _eaba ;_gdbc ++{_dggf =_ggad (_fbab .Data [_dbaef +_gdbc ]<<_cdba ,_fbab .Data [_dbaef +_gdbc +1]>>_fgdfc ,_ecea );_ddcff .Data [_fgaa +_gdbc ]=_dggf &^_ddcff .Data [_fgaa +_gdbc ];};_fgaa +=_ddcff .RowStride ;_dbaef +=_fbab .RowStride ;};};if _bbc {for _cebb =0;
|
|
|
|
_cebb < _eegf ;_cebb ++{_dggf =_fbab .Data [_cgde ]<<_cdba ;if _egdea {_dggf =_ggad (_dggf ,_fbab .Data [_cgde +1]>>_fgdfc ,_ecea );};_ddcff .Data [_bcff ]=_ggad (_ddcff .Data [_bcff ],_dggf &^_ddcff .Data [_bcff ],_gfbd );_bcff +=_ddcff .RowStride ;_cgde +=_fbab .RowStride ;
|
|
|
|
};};case PixNotPixSrcOrDst :if _cdgfe {for _cebb =0;_cebb < _eegf ;_cebb ++{if _gaacc ==_acbc {_dggf =_fbab .Data [_ccfg ]<<_cdba ;if _dgfd {_dggf =_ggad (_dggf ,_fbab .Data [_ccfg +1]>>_fgdfc ,_ecea );};}else {_dggf =_fbab .Data [_ccfg ]>>_fgdfc ;};_ddcff .Data [_ggfd ]=_ggad (_ddcff .Data [_ggfd ],^(_dggf |_ddcff .Data [_ggfd ]),_effa );
|
|
|
|
_ggfd +=_ddcff .RowStride ;_ccfg +=_fbab .RowStride ;};};if _fecd {for _cebb =0;_cebb < _eegf ;_cebb ++{for _gdbc =0;_gdbc < _eaba ;_gdbc ++{_dggf =_ggad (_fbab .Data [_dbaef +_gdbc ]<<_cdba ,_fbab .Data [_dbaef +_gdbc +1]>>_fgdfc ,_ecea );_ddcff .Data [_fgaa +_gdbc ]=^(_dggf |_ddcff .Data [_fgaa +_gdbc ]);
|
|
|
|
};_fgaa +=_ddcff .RowStride ;_dbaef +=_fbab .RowStride ;};};if _bbc {for _cebb =0;_cebb < _eegf ;_cebb ++{_dggf =_fbab .Data [_cgde ]<<_cdba ;if _egdea {_dggf =_ggad (_dggf ,_fbab .Data [_cgde +1]>>_fgdfc ,_ecea );};_ddcff .Data [_bcff ]=_ggad (_ddcff .Data [_bcff ],^(_dggf |_ddcff .Data [_bcff ]),_gfbd );
|
|
|
|
_bcff +=_ddcff .RowStride ;_cgde +=_fbab .RowStride ;};};case PixNotPixSrcAndDst :if _cdgfe {for _cebb =0;_cebb < _eegf ;_cebb ++{if _gaacc ==_acbc {_dggf =_fbab .Data [_ccfg ]<<_cdba ;if _dgfd {_dggf =_ggad (_dggf ,_fbab .Data [_ccfg +1]>>_fgdfc ,_ecea );
|
|
|
|
};}else {_dggf =_fbab .Data [_ccfg ]>>_fgdfc ;};_ddcff .Data [_ggfd ]=_ggad (_ddcff .Data [_ggfd ],^(_dggf &_ddcff .Data [_ggfd ]),_effa );_ggfd +=_ddcff .RowStride ;_ccfg +=_fbab .RowStride ;};};if _fecd {for _cebb =0;_cebb < _eegf ;_cebb ++{for _gdbc =0;
|
|
|
|
_gdbc < _eaba ;_gdbc ++{_dggf =_ggad (_fbab .Data [_dbaef +_gdbc ]<<_cdba ,_fbab .Data [_dbaef +_gdbc +1]>>_fgdfc ,_ecea );_ddcff .Data [_fgaa +_gdbc ]=^(_dggf &_ddcff .Data [_fgaa +_gdbc ]);};_fgaa +=_ddcff .RowStride ;_dbaef +=_fbab .RowStride ;};};if _bbc {for _cebb =0;
|
|
|
|
_cebb < _eegf ;_cebb ++{_dggf =_fbab .Data [_cgde ]<<_cdba ;if _egdea {_dggf =_ggad (_dggf ,_fbab .Data [_cgde +1]>>_fgdfc ,_ecea );};_ddcff .Data [_bcff ]=_ggad (_ddcff .Data [_bcff ],^(_dggf &_ddcff .Data [_bcff ]),_gfbd );_bcff +=_ddcff .RowStride ;
|
|
|
|
_cgde +=_fbab .RowStride ;};};case PixNotPixSrcXorDst :if _cdgfe {for _cebb =0;_cebb < _eegf ;_cebb ++{if _gaacc ==_acbc {_dggf =_fbab .Data [_ccfg ]<<_cdba ;if _dgfd {_dggf =_ggad (_dggf ,_fbab .Data [_ccfg +1]>>_fgdfc ,_ecea );};}else {_dggf =_fbab .Data [_ccfg ]>>_fgdfc ;
|
|
|
|
};_ddcff .Data [_ggfd ]=_ggad (_ddcff .Data [_ggfd ],^(_dggf ^_ddcff .Data [_ggfd ]),_effa );_ggfd +=_ddcff .RowStride ;_ccfg +=_fbab .RowStride ;};};if _fecd {for _cebb =0;_cebb < _eegf ;_cebb ++{for _gdbc =0;_gdbc < _eaba ;_gdbc ++{_dggf =_ggad (_fbab .Data [_dbaef +_gdbc ]<<_cdba ,_fbab .Data [_dbaef +_gdbc +1]>>_fgdfc ,_ecea );
|
|
|
|
_ddcff .Data [_fgaa +_gdbc ]=^(_dggf ^_ddcff .Data [_fgaa +_gdbc ]);};_fgaa +=_ddcff .RowStride ;_dbaef +=_fbab .RowStride ;};};if _bbc {for _cebb =0;_cebb < _eegf ;_cebb ++{_dggf =_fbab .Data [_cgde ]<<_cdba ;if _egdea {_dggf =_ggad (_dggf ,_fbab .Data [_cgde +1]>>_fgdfc ,_ecea );
|
|
|
|
};_ddcff .Data [_bcff ]=_ggad (_ddcff .Data [_bcff ],^(_dggf ^_ddcff .Data [_bcff ]),_gfbd );_bcff +=_ddcff .RowStride ;_cgde +=_fbab .RowStride ;};};default:_dd .Log .Debug ("\u004f\u0070e\u0072\u0061\u0074\u0069\u006f\u006e\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006e\u006f\u0074\u0020\u0070\u0065\u0072\u006d\u0069tt\u0065\u0064",_gadc );
|
|
|
|
return _d .Error ("\u0072a\u0073t\u0065\u0072\u004f\u0070\u0047e\u006e\u0065r\u0061\u006c\u004c\u006f\u0077","\u0072\u0061\u0073\u0074\u0065\u0072\u0020\u006f\u0070\u0065r\u0061\u0074\u0069\u006f\u006e\u0020\u006eo\u0074\u0020\u0070\u0065\u0072\u006d\u0069\u0074\u0074\u0065\u0064");
|
|
|
|
};return nil ;};func _adfd (_afec ,_fbggf *Bitmap ,_bffd *Selection )(*Bitmap ,error ){const _abde ="c\u006c\u006f\u0073\u0065\u0042\u0069\u0074\u006d\u0061\u0070";var _ffcb error ;if _afec ,_ffcb =_eaef (_afec ,_fbggf ,_bffd );_ffcb !=nil {return nil ,_ffcb ;
|
|
|
|
};_cfef ,_ffcb :=_gfed (nil ,_fbggf ,_bffd );if _ffcb !=nil {return nil ,_d .Wrap (_ffcb ,_abde ,"");};if _ ,_ffcb =_cgfe (_afec ,_cfef ,_bffd );_ffcb !=nil {return nil ,_d .Wrap (_ffcb ,_abde ,"");};return _afec ,nil ;};func TstESymbol (t *_g .T ,scale ...int )*Bitmap {_ebdc ,_bbfd :=NewWithData (4,5,[]byte {0xF0,0x80,0xE0,0x80,0xF0});
|
|
|
|
_df .NoError (t ,_bbfd );return TstGetScaledSymbol (t ,_ebdc ,scale ...);};func _cbad (_bagag *Bitmap ,_fddf ,_aaedc int ,_bdad ,_gebb int ,_bdbc RasterOperator ){var (_cgca int ;_dagea byte ;_dafgd ,_adgf int ;_eecd int ;);_efge :=_bdad >>3;_dbda :=_bdad &7;
|
|
|
|
if _dbda > 0{_dagea =_gbcf [_dbda ];};_cgca =_bagag .RowStride *_aaedc +(_fddf >>3);switch _bdbc {case PixClr :for _dafgd =0;_dafgd < _gebb ;_dafgd ++{_eecd =_cgca +_dafgd *_bagag .RowStride ;for _adgf =0;_adgf < _efge ;_adgf ++{_bagag .Data [_eecd ]=0x0;
|
|
|
|
_eecd ++;};if _dbda > 0{_bagag .Data [_eecd ]=_ggad (_bagag .Data [_eecd ],0x0,_dagea );};};case PixSet :for _dafgd =0;_dafgd < _gebb ;_dafgd ++{_eecd =_cgca +_dafgd *_bagag .RowStride ;for _adgf =0;_adgf < _efge ;_adgf ++{_bagag .Data [_eecd ]=0xff;_eecd ++;
|
|
|
|
};if _dbda > 0{_bagag .Data [_eecd ]=_ggad (_bagag .Data [_eecd ],0xff,_dagea );};};case PixNotDst :for _dafgd =0;_dafgd < _gebb ;_dafgd ++{_eecd =_cgca +_dafgd *_bagag .RowStride ;for _adgf =0;_adgf < _efge ;_adgf ++{_bagag .Data [_eecd ]=^_bagag .Data [_eecd ];
|
|
|
|
_eecd ++;};if _dbda > 0{_bagag .Data [_eecd ]=_ggad (_bagag .Data [_eecd ],^_bagag .Data [_eecd ],_dagea );};};};};func TstDSymbol (t *_g .T ,scale ...int )*Bitmap {_fabcf ,_cdga :=NewWithData (4,5,[]byte {0xf0,0x90,0x90,0x90,0xE0});_df .NoError (t ,_cdga );
|
|
|
|
return TstGetScaledSymbol (t ,_fabcf ,scale ...);};var (_gbcf =[]byte {0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF};_afcg =[]byte {0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};);func NewClassedPoints (points *Points ,classes _gc .IntSlice )(*ClassedPoints ,error ){const _agcb ="\u004e\u0065w\u0043\u006c\u0061s\u0073\u0065\u0064\u0050\u006f\u0069\u006e\u0074\u0073";
|
|
|
|
if points ==nil {return nil ,_d .Error (_agcb ,"\u0070\u0072\u006f\u0076id\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0070\u006f\u0069\u006e\u0074\u0073");};if classes ==nil {return nil ,_d .Error (_agcb ,"p\u0072o\u0076\u0069\u0064\u0065\u0064\u0020\u006e\u0069l\u0020\u0063\u006c\u0061ss\u0065\u0073");
|
|
|
|
};_fcbce :=&ClassedPoints {Points :points ,IntSlice :classes };if _abdd :=_fcbce .validateIntSlice ();_abdd !=nil {return nil ,_d .Wrap (_abdd ,_agcb ,"");};return _fcbce ,nil ;};type byHeight Bitmaps ;func _bgf ()(_dff []byte ){_dff =make ([]byte ,256);
|
|
|
|
for _bcf :=0;_bcf < 256;_bcf ++{_dbg :=byte (_bcf );_dff [_dbg ]=(_dbg &0x01)|((_dbg &0x04)>>1)|((_dbg &0x10)>>2)|((_dbg &0x40)>>3)|((_dbg &0x02)<<3)|((_dbg &0x08)<<2)|((_dbg &0x20)<<1)|(_dbg &0x80);};return _dff ;};type Bitmaps struct{Values []*Bitmap ;
|
|
|
|
Boxes []*_dc .Rectangle ;};func init (){const _fbbe ="\u0062\u0069\u0074\u006dap\u0073\u002e\u0069\u006e\u0069\u0074\u0069\u0061\u006c\u0069\u007a\u0061\u0074\u0069o\u006e";_fbgc =New (50,40);var _bdbad error ;_fbgc ,_bdbad =_fbgc .AddBorder (2,1);if _bdbad !=nil {panic (_d .Wrap (_bdbad ,_fbbe ,"f\u0072\u0061\u006d\u0065\u0042\u0069\u0074\u006d\u0061\u0070"));
|
|
|
|
};_cafd ,_bdbad =NewWithData (50,22,_fcgbg );if _bdbad !=nil {panic (_d .Wrap (_bdbad ,_fbbe ,"i\u006d\u0061\u0067\u0065\u0042\u0069\u0074\u006d\u0061\u0070"));};};func (_abbd *Bitmaps )AddBox (box *_dc .Rectangle ){_abbd .Boxes =append (_abbd .Boxes ,box )};
|
|
|
|
func (_cbcb *byHeight )Len ()int {return len (_cbcb .Values )};func (_fccd *Bitmap )ClipRectangle (box *_dc .Rectangle )(_bed *Bitmap ,_dec *_dc .Rectangle ,_baad error ){const _dfccg ="\u0043\u006c\u0069\u0070\u0052\u0065\u0063\u0074\u0061\u006e\u0067\u006c\u0065";
|
|
|
|
if box ==nil {return nil ,nil ,_d .Error (_dfccg ,"\u0062o\u0078 \u0069\u0073\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");};_bgfb ,_bca :=_fccd .Width ,_fccd .Height ;_fegb :=_dc .Rect (0,0,_bgfb ,_bca );if !box .Overlaps (_fegb ){return nil ,nil ,_d .Error (_dfccg ,"b\u006f\u0078\u0020\u0064oe\u0073n\u0027\u0074\u0020\u006f\u0076e\u0072\u006c\u0061\u0070\u0020\u0062");
|
|
|
|
};_fccg :=box .Intersect (_fegb );_afaf ,_ddca :=_fccg .Min .X ,_fccg .Min .Y ;_bacc ,_ddb :=_fccg .Dx (),_fccg .Dy ();_bed =New (_bacc ,_ddb );_bed .Text =_fccd .Text ;if _baad =_bed .RasterOperation (0,0,_bacc ,_ddb ,PixSrc ,_fccd ,_afaf ,_ddca );_baad !=nil {return nil ,nil ,_d .Wrap (_baad ,_dfccg ,"\u0050\u0069\u0078\u0053\u0072\u0063\u0020\u0074\u006f\u0020\u0063\u006ci\u0070\u0070\u0065\u0064");
|
|
|
|
};_dec =&_fccg ;return _bed ,_dec ,nil ;};func _bge (_bda *Bitmap ,_dfe int ,_aef []byte )(_ebf *Bitmap ,_caa error ){const _ecg ="\u0072\u0065\u0064\u0075\u0063\u0065\u0052\u0061\u006e\u006b\u0042\u0069n\u0061\u0072\u0079\u0032";if _bda ==nil {return nil ,_d .Error (_ecg ,"\u0073o\u0075\u0072\u0063\u0065 \u0062\u0069\u0074\u006d\u0061p\u0020n\u006ft\u0020\u0064\u0065\u0066\u0069\u006e\u0065d");
|
|
|
|
};if _dfe < 1||_dfe > 4{return nil ,_d .Error (_ecg ,"\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 _bda .Height <=1{return nil ,_d .Errorf (_ecg ,"\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",_bda .Height );
|
|
|
|
};_ebf =New (_bda .Width /2,_bda .Height /2);if _aef ==nil {_aef =_bgf ();};_afe :=_bebf (_bda .RowStride ,2*_ebf .RowStride );switch _dfe {case 1:_caa =_gdc (_bda ,_ebf ,_dfe ,_aef ,_afe );case 2:_caa =_fad (_bda ,_ebf ,_dfe ,_aef ,_afe );case 3:_caa =_cabe (_bda ,_ebf ,_dfe ,_aef ,_afe );
|
|
|
|
case 4:_caa =_bbf (_bda ,_ebf ,_dfe ,_aef ,_afe );};if _caa !=nil {return nil ,_caa ;};return _ebf ,nil ;};func (_gedgb *Bitmaps )GetBox (i int )(*_dc .Rectangle ,error ){const _ggce ="\u0047\u0065\u0074\u0042\u006f\u0078";if _gedgb ==nil {return nil ,_d .Error (_ggce ,"\u0070\u0072\u006f\u0076id\u0065\u0064\u0020\u006e\u0069\u006c\u0020\u0027\u0042\u0069\u0074\u006d\u0061\u0070s\u0027");
|
|
|
|
};if i > len (_gedgb .Boxes )-1{return nil ,_d .Errorf (_ggce ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0027\u0025\u0064\u0027\u0020\u006fu\u0074\u0020\u006f\u0066\u0020\u0072\u0061\u006e\u0067\u0065",i );};return _gedgb .Boxes [i ],nil ;};type MorphProcess struct{Operation MorphOperation ;
|
|
|
|
Arguments []int ;};var _fcgbg =[]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 (_cac *Bitmap )RasterOperation (dx ,dy ,dw ,dh int ,op RasterOperator ,src *Bitmap ,sx ,sy int )error {return _eebc (_cac ,dx ,dy ,dw ,dh ,op ,src ,sx ,sy );};func Dilate (d *Bitmap ,s *Bitmap ,sel *Selection )(*Bitmap ,error ){return _gfed (d ,s ,sel )};
|
|
|
|
func (_defe *ClassedPoints )GroupByY ()([]*ClassedPoints ,error ){const _fdba ="\u0043\u006c\u0061\u0073se\u0064\u0050\u006f\u0069\u006e\u0074\u0073\u002e\u0047\u0072\u006f\u0075\u0070\u0042y\u0059";if _ddage :=_defe .validateIntSlice ();_ddage !=nil {return nil ,_d .Wrap (_ddage ,_fdba ,"");
|
|
|
|
};if _defe .IntSlice .Size ()==0{return nil ,_d .Error (_fdba ,"\u004e\u006f\u0020\u0063la\u0073\u0073\u0065\u0073\u0020\u0070\u0072\u006f\u0076\u0069\u0064\u0065\u0064");};_defe .SortByY ();var (_gbaa []*ClassedPoints ;_gdfg int ;);_eeddff :=-1;var _gefa *ClassedPoints ;
|
|
|
|
for _gfcf :=0;_gfcf < len (_defe .IntSlice );_gfcf ++{_gdfg =int (_defe .YAtIndex (_gfcf ));if _gdfg !=_eeddff {_gefa =&ClassedPoints {Points :_defe .Points };_eeddff =_gdfg ;_gbaa =append (_gbaa ,_gefa );};_gefa .IntSlice =append (_gefa .IntSlice ,_defe .IntSlice [_gfcf ]);
|
|
|
|
};for _ ,_acdaa :=range _gbaa {_acdaa .SortByX ();};return _gbaa ,nil ;};func _cffdd (_bdcd ,_afag *Bitmap ,_cegb ,_beacb int )(*Bitmap ,error ){const _cege ="\u0065\u0072\u006f\u0064\u0065\u0042\u0072\u0069\u0063\u006b";if _afag ==nil {return nil ,_d .Error (_cege ,"\u0073o\u0075r\u0063\u0065\u0020\u006e\u006ft\u0020\u0064e\u0066\u0069\u006e\u0065\u0064");
|
|
|
|
};if _cegb < 1||_beacb < 1{return nil ,_d .Error (_cege ,"\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 _cegb ==1&&_beacb ==1{_abcc ,_ddadc :=_faec (_bdcd ,_afag );if _ddadc !=nil {return nil ,_d .Wrap (_ddadc ,_cege ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u0026\u0026 \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
|
|
};return _abcc ,nil ;};if _cegb ==1||_beacb ==1{_eage :=SelCreateBrick (_beacb ,_cegb ,_beacb /2,_cegb /2,SelHit );_efega ,_caad :=_cgfe (_bdcd ,_afag ,_eage );if _caad !=nil {return nil ,_d .Wrap (_caad ,_cege ,"\u0068S\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031\u0020\u007c\u007c \u0076\u0053\u0069\u007a\u0065\u0020\u003d\u003d\u0020\u0031");
|
|
|
|
};return _efega ,nil ;};_acgga :=SelCreateBrick (1,_cegb ,0,_cegb /2,SelHit );_dbee :=SelCreateBrick (_beacb ,1,_beacb /2,0,SelHit );_gebeb ,_ebcd :=_cgfe (nil ,_afag ,_acgga );if _ebcd !=nil {return nil ,_d .Wrap (_ebcd ,_cege ,"\u0031s\u0074\u0020\u0065\u0072\u006f\u0064e");
|
|
|
|
};_bdcd ,_ebcd =_cgfe (_bdcd ,_gebeb ,_dbee );if _ebcd !=nil {return nil ,_d .Wrap (_ebcd ,_cege ,"\u0032n\u0064\u0020\u0065\u0072\u006f\u0064e");};return _bdcd ,nil ;};func TstWordBitmap (t *_g .T ,scale ...int )*Bitmap {_feee :=1;if len (scale )> 0{_feee =scale [0];
|
|
|
|
};_cccaf :=3;_dbad :=9+7+15+2*_cccaf ;_daca :=5+_cccaf +5;_ggbg :=New (_dbad *_feee ,_daca *_feee );_defa :=&Bitmaps {};var _geag *int ;_cccaf *=_feee ;_faegb :=0;_geag =&_faegb ;_edac :=0;_gabdg :=TstDSymbol (t ,scale ...);TstAddSymbol (t ,_defa ,_gabdg ,_geag ,_edac ,1*_feee );
|
|
|
|
_gabdg =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_defa ,_gabdg ,_geag ,_edac ,_cccaf );_gabdg =TstISymbol (t ,scale ...);TstAddSymbol (t ,_defa ,_gabdg ,_geag ,_edac ,1*_feee );_gabdg =TstTSymbol (t ,scale ...);TstAddSymbol (t ,_defa ,_gabdg ,_geag ,_edac ,_cccaf );
|
|
|
|
_gabdg =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_defa ,_gabdg ,_geag ,_edac ,1*_feee );_gabdg =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_defa ,_gabdg ,_geag ,_edac ,1*_feee );_gabdg =TstWSymbol (t ,scale ...);TstAddSymbol (t ,_defa ,_gabdg ,_geag ,_edac ,0);
|
|
|
|
*_geag =0;_edac =5*_feee +_cccaf ;_gabdg =TstOSymbol (t ,scale ...);TstAddSymbol (t ,_defa ,_gabdg ,_geag ,_edac ,1*_feee );_gabdg =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_defa ,_gabdg ,_geag ,_edac ,_cccaf );_gabdg =TstNSymbol (t ,scale ...);TstAddSymbol (t ,_defa ,_gabdg ,_geag ,_edac ,1*_feee );
|
|
|
|
_gabdg =TstESymbol (t ,scale ...);TstAddSymbol (t ,_defa ,_gabdg ,_geag ,_edac ,1*_feee );_gabdg =TstVSymbol (t ,scale ...);TstAddSymbol (t ,_defa ,_gabdg ,_geag ,_edac ,1*_feee );_gabdg =TstESymbol (t ,scale ...);TstAddSymbol (t ,_defa ,_gabdg ,_geag ,_edac ,1*_feee );
|
|
|
|
_gabdg =TstRSymbol (t ,scale ...);TstAddSymbol (t ,_defa ,_gabdg ,_geag ,_edac ,0);TstWriteSymbols (t ,_defa ,_ggbg );return _ggbg ;};func TstASymbol (t *_g .T )*Bitmap {t .Helper ();_bdgd :=New (6,6);_df .NoError (t ,_bdgd .SetPixel (1,0,1));_df .NoError (t ,_bdgd .SetPixel (2,0,1));
|
|
|
|
_df .NoError (t ,_bdgd .SetPixel (3,0,1));_df .NoError (t ,_bdgd .SetPixel (4,0,1));_df .NoError (t ,_bdgd .SetPixel (5,1,1));_df .NoError (t ,_bdgd .SetPixel (1,2,1));_df .NoError (t ,_bdgd .SetPixel (2,2,1));_df .NoError (t ,_bdgd .SetPixel (3,2,1));
|
|
|
|
_df .NoError (t ,_bdgd .SetPixel (4,2,1));_df .NoError (t ,_bdgd .SetPixel (5,2,1));_df .NoError (t ,_bdgd .SetPixel (0,3,1));_df .NoError (t ,_bdgd .SetPixel (5,3,1));_df .NoError (t ,_bdgd .SetPixel (0,4,1));_df .NoError (t ,_bdgd .SetPixel (5,4,1));
|
|
|
|
_df .NoError (t ,_bdgd .SetPixel (1,5,1));_df .NoError (t ,_bdgd .SetPixel (2,5,1));_df .NoError (t ,_bdgd .SetPixel (3,5,1));_df .NoError (t ,_bdgd .SetPixel (4,5,1));_df .NoError (t ,_bdgd .SetPixel (5,5,1));return _bdgd ;};func _gfed (_cga *Bitmap ,_affg *Bitmap ,_aeeg *Selection )(*Bitmap ,error ){var (_fbca *Bitmap ;
|
|
|
|
_afcb error ;);_cga ,_afcb =_ggdfb (_cga ,_affg ,_aeeg ,&_fbca );if _afcb !=nil {return nil ,_afcb ;};if _afcb =_cga .clearAll ();_afcb !=nil {return nil ,_afcb ;};var _efcf SelectionValue ;for _bgbe :=0;_bgbe < _aeeg .Height ;_bgbe ++{for _acgg :=0;_acgg < _aeeg .Width ;
|
|
|
|
_acgg ++{_efcf =_aeeg .Data [_bgbe ][_acgg ];if _efcf ==SelHit {if _afcb =_cga .RasterOperation (_acgg -_aeeg .Cx ,_bgbe -_aeeg .Cy ,_affg .Width ,_affg .Height ,PixSrcOrDst ,_fbca ,0,0);_afcb !=nil {return nil ,_afcb ;};};};};return _cga ,nil ;};func (_cddd *byHeight )Less (i ,j int )bool {return _cddd .Values [i ].Height < _cddd .Values [j ].Height };
|
|
|
|
func RasterOperation (dest *Bitmap ,dx ,dy ,dw ,dh int ,op RasterOperator ,src *Bitmap ,sx ,sy int )error {return _eebc (dest ,dx ,dy ,dw ,dh ,op ,src ,sx ,sy );};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 ;
|
|
|
|
);type MorphOperation int ;func (_decd *Bitmap )connComponentsBB (_dbcg int )(_bdcc *Boxes ,_fgfeb error ){const _gaeec ="\u0042\u0069\u0074ma\u0070\u002e\u0063\u006f\u006e\u006e\u0043\u006f\u006d\u0070\u006f\u006e\u0065\u006e\u0074\u0073\u0042\u0042";
|
|
|
|
if _dbcg !=4&&_dbcg !=8{return nil ,_d .Error (_gaeec ,"\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 _decd .Zero (){return &Boxes {},nil ;
|
|
|
|
};_decd .setPadBits (0);_cbfa ,_fgfeb :=_faec (nil ,_decd );if _fgfeb !=nil {return nil ,_d .Wrap (_fgfeb ,_gaeec ,"\u0062\u006d\u0031");};_gce :=&_gc .Stack {};_gce .Aux =&_gc .Stack {};_bdcc =&Boxes {};var (_gcgg ,_ddfd int ;_fagg _dc .Point ;_cefa bool ;
|
|
|
|
_cbbd *_dc .Rectangle ;);for {if _fagg ,_cefa ,_fgfeb =_cbfa .nextOnPixel (_ddfd ,_gcgg );_fgfeb !=nil {return nil ,_d .Wrap (_fgfeb ,_gaeec ,"");};if !_cefa {break ;};if _cbbd ,_fgfeb =_ffgb (_cbfa ,_gce ,_fagg .X ,_fagg .Y ,_dbcg );_fgfeb !=nil {return nil ,_d .Wrap (_fgfeb ,_gaeec ,"");
|
|
|
|
};if _fgfeb =_bdcc .Add (_cbbd );_fgfeb !=nil {return nil ,_d .Wrap (_fgfeb ,_gaeec ,"");};_ddfd =_fagg .X ;_gcgg =_fagg .Y ;};return _bdcc ,nil ;};func _cabe (_ef ,_cfb *Bitmap ,_fbf int ,_eeb []byte ,_fcf int )(_cgfg error ){const _dad ="\u0072\u0065\u0064uc\u0065\u0052\u0061\u006e\u006b\u0042\u0069\u006e\u0061\u0072\u0079\u0032\u004c\u0065\u0076\u0065\u006c\u0033";
|
|
|
|
var (_fgbc ,_eebb ,_abf ,_eabc ,_ddc ,_beg ,_dbb ,_geb int ;_bggg ,_dfb ,_beac ,_fcg uint32 ;_bdca ,_ddcg byte ;_cccg uint16 ;);_bbg :=make ([]byte ,4);_ecd :=make ([]byte ,4);for _abf =0;_abf < _ef .Height -1;_abf ,_eabc =_abf +2,_eabc +1{_fgbc =_abf *_ef .RowStride ;
|
|
|
|
_eebb =_eabc *_cfb .RowStride ;for _ddc ,_beg =0,0;_ddc < _fcf ;_ddc ,_beg =_ddc +4,_beg +1{for _dbb =0;_dbb < 4;_dbb ++{_geb =_fgbc +_ddc +_dbb ;if _geb <=len (_ef .Data )-1&&_geb < _fgbc +_ef .RowStride {_bbg [_dbb ]=_ef .Data [_geb ];}else {_bbg [_dbb ]=0x00;
|
|
|
|
};_geb =_fgbc +_ef .RowStride +_ddc +_dbb ;if _geb <=len (_ef .Data )-1&&_geb < _fgbc +(2*_ef .RowStride ){_ecd [_dbb ]=_ef .Data [_geb ];}else {_ecd [_dbb ]=0x00;};};_bggg =_a .BigEndian .Uint32 (_bbg );_dfb =_a .BigEndian .Uint32 (_ecd );_beac =_bggg &_dfb ;
|
|
|
|
_beac |=_beac <<1;_fcg =_bggg |_dfb ;_fcg &=_fcg <<1;_dfb =_beac &_fcg ;_dfb &=0xaaaaaaaa;_bggg =_dfb |(_dfb <<7);_bdca =byte (_bggg >>24);_ddcg =byte ((_bggg >>8)&0xff);_geb =_eebb +_beg ;if _geb +1==len (_cfb .Data )-1||_geb +1>=_eebb +_cfb .RowStride {if _cgfg =_cfb .SetByte (_geb ,_eeb [_bdca ]);
|
|
|
|
_cgfg !=nil {return _d .Wrapf (_cgfg ,_dad ,"\u0069n\u0064\u0065\u0078\u003a\u0020\u0025d",_geb );};}else {_cccg =(uint16 (_eeb [_bdca ])<<8)|uint16 (_eeb [_ddcg ]);if _cgfg =_cfb .setTwoBytes (_geb ,_cccg );_cgfg !=nil {return _d .Wrapf (_cgfg ,_dad ,"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",_geb );
|
|
|
|
};_beg ++;};};};return nil ;};func _fgef ()[]int {_fdbc :=make ([]int ,256);for _gdgfb :=0;_gdgfb <=0xff;_gdgfb ++{_fgde :=byte (_gdgfb );_fdbc [_fgde ]=int (_fgde &0x1)+(int (_fgde >>1)&0x1)+(int (_fgde >>2)&0x1)+(int (_fgde >>3)&0x1)+(int (_fgde >>4)&0x1)+(int (_fgde >>5)&0x1)+(int (_fgde >>6)&0x1)+(int (_fgde >>7)&0x1);
|
|
|
|
};return _fdbc ;};func RankHausTest (p1 ,p2 ,p3 ,p4 *Bitmap ,delX ,delY float32 ,maxDiffW ,maxDiffH ,area1 ,area3 int ,rank float32 ,tab8 []int )(_bdfc bool ,_befb error ){const _ecbd ="\u0052\u0061\u006ek\u0048\u0061\u0075\u0073\u0054\u0065\u0073\u0074";
|
|
|
|
_gcce ,_fdfb :=p1 .Width ,p1 .Height ;_beba ,_gdcec :=p3 .Width ,p3 .Height ;if _gc .Abs (_gcce -_beba )> maxDiffW {return false ,nil ;};if _gc .Abs (_fdfb -_gdcec )> maxDiffH {return false ,nil ;};_bgdf :=int (float32 (area1 )*(1.0-rank )+0.5);_bcfb :=int (float32 (area3 )*(1.0-rank )+0.5);
|
|
|
|
var _aacg ,_fbgd int ;if delX >=0{_aacg =int (delX +0.5);}else {_aacg =int (delX -0.5);};if delY >=0{_fbgd =int (delY +0.5);}else {_fbgd =int (delY -0.5);};_fceb :=p1 .CreateTemplate ();if _befb =_fceb .RasterOperation (0,0,_gcce ,_fdfb ,PixSrc ,p1 ,0,0);
|
|
|
|
_befb !=nil {return false ,_d .Wrap (_befb ,_ecbd ,"p\u0031\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _befb =_fceb .RasterOperation (_aacg ,_fbgd ,_gcce ,_fdfb ,PixNotSrcAndDst ,p4 ,0,0);_befb !=nil {return false ,_d .Wrap (_befb ,_ecbd ,"\u0074 \u0026\u0020\u0021\u0070\u0034");
|
|
|
|
};_bdfc ,_befb =_fceb .ThresholdPixelSum (_bgdf ,tab8 );if _befb !=nil {return false ,_d .Wrap (_befb ,_ecbd ,"\u0074\u002d\u003e\u0074\u0068\u0072\u0065\u0073\u0068\u0031");};if _bdfc {return false ,nil ;};if _befb =_fceb .RasterOperation (_aacg ,_fbgd ,_beba ,_gdcec ,PixSrc ,p3 ,0,0);
|
|
|
|
_befb !=nil {return false ,_d .Wrap (_befb ,_ecbd ,"p\u0033\u0020\u002d\u0053\u0052\u0043\u002d\u003e\u0020\u0074");};if _befb =_fceb .RasterOperation (0,0,_beba ,_gdcec ,PixNotSrcAndDst ,p2 ,0,0);_befb !=nil {return false ,_d .Wrap (_befb ,_ecbd ,"\u0074 \u0026\u0020\u0021\u0070\u0032");
|
|
|
|
};_bdfc ,_befb =_fceb .ThresholdPixelSum (_bcfb ,tab8 );if _befb !=nil {return false ,_d .Wrap (_befb ,_ecbd ,"\u0074\u002d\u003e\u0074\u0068\u0072\u0065\u0073\u0068\u0033");};return !_bdfc ,nil ;};
|